状态:正在进行中(WIP)。在工具表面和集成故事稳定的同时,欢迎做出贡献。
OpenProject MCP服务器
一种模型上下文协议(MCP)服务器,为AI助手提供高保真访问 打开项目 API v3。该服务器公开了用于项目发现、工作包协作、时间跟踪、附件、维基内容和用户解析的精选工具,所有这些都是通过针对LLM工作流优化的快速异步Python堆栈实现的。
目录
概述
- 专为MCP设计: 船与a
FastMCP可以放入Claude Desktop、Cursor、modelcontextclient或任何其他MCP主机中的实现。 - 异步和弹性: 用途
httpx具有请求重试、指数回退、超时调优和经过净化的错误处理。 - 丰富的刀具表面: LLM可以对工作包进行评论、跨内容搜索、管理附件、解析用户、记录时间和查询wiki页面。
- 类型合同: Pydantic模型验证每个工具输入,以保护OpenProject API免受错误提示的影响。
- Pyproject专用工具:
uv驱动依赖关系管理,确保可重复的环境和快速的安装时间。
建筑一瞥
| 层 | 目的 |
|---|---|
openproject_mcp.main | 配置日志记录、加载设置和在stdio上启动MCP服务器的入口点。 |
openproject_mcp.server | 创建 FastMCP 实例,注册 system_ping,并加载所有特定于域的工具模块。 |
openproject_mcp.config.Settings | Pydantic设置模型由 .env/环境变量(URL、令牌、超时、分页默认值)。 |
openproject_mcp.client.OpenProjectClient | 异步HTTP客户端,具有重试/回退逻辑、统一标头和到域异常的错误映射。 |
openproject_mcp.tools.* | 按OpenProject域(工作包、附件、查询、时间条目、用户、wiki、项目)分组的工具实现。 |
tests/ | 广泛的异步pytest套件,涵盖正向流、权限失败、验证错误和stdio烟雾测试。 |
工具目录
每个工具都通过MCP协议公开——LLM完全按照这里的定义调用它们。
系统
system_ping:快速准备检查(退货{"ok": true})让MCP客户端验证连接。
工作包(src/openproject_mcp/tools/work_packages.py)
add_comment:发布带有可选观察者通知的Markdown评论。search_content:搜索工作包和/或项目,可选择捕获附件匹配项。append_work_package_description:在处理乐观锁定时,将Markdown附加到现有描述中。get_work_package_statuses:列出经过身份验证的用户可用的所有状态。get_work_package_types:列出全局或项目范围内的每种类型。resolve_status:将人员身份名称转换为ID/消歧有效载荷。resolve_type:解析项目中的类型名称,包括当类型存在但在那里被禁用时的回退。
附件(src/openproject_mcp/tools/attachments.py)
attach_file_to_wp:通过multipart/form数据将本地文件上传到工作包。list_attachments:枚举工作包上的附件。download_attachment:下载带有base64响应的二进制内容(可选地持久化到磁盘)以供内存使用。get_attachment_content:使用HTTP范围请求获取元数据和预览切片以节省带宽。
项目(src/openproject_mcp/tools/projects.py)
get_project_memberships:使用分页和多页跟踪模式获取项目成员/角色映射。resolve_project:使用消歧提示解析名称/标识符,以便LLM可以选择正确的项目。
查询(src/openproject_mcp/tools/queries.py)
list_queries:列出已保存的查询(全局或项目范围)。run_query:执行已保存的查询并支持提示时间过滤器覆盖。
时间条目(src/openproject_mcp/tools/time_entries.py)
list_time_entries:使用本机OpenProject运算符按项目、工作包、用户和日期跨度进行筛选。log_time:将十进制小时转换为ISO-8601持续时间,并创建时间条目(包括可选的用户、活动和时间戳)。
用户(src/openproject_mcp/tools/users.py)
resolve_user:按名称搜索活动主体。get_user_by_id:检索具有完整元数据的单个用户。
Wiki(src/openproject_mcp/tools/wiki.py)
get_wiki_page:检索wiki元数据、版本和交叉链接。attach_file_to_wiki:将文件上传到wiki页面。list_wiki_page_attachments:在wiki页面上列出附件。
仓库的规划
├── src/openproject_mcp
│ ├── main.py # CLI entry point (stdio server)
│ ├── server.py # FastMCP factory + tool registration
│ ├── config.py # Pydantic settings (env-driven)
│ ├── client.py # Resilient httpx/OpenProject client
│ ├── errors.py # Domain-specific exceptions and sanitisation
│ ├── utils/logging.py # Log configuration helper
│ └── tools/ # Tool families grouped by domain
├── tests/ # Async pytest suite and smoke tests
├── pyproject.toml # uv/PEP 621 metadata + tooling config
├── uv.lock # Locked dependency graph
├── requirements.txt # Convenience export (mirrors pyproject deps)
└── env_example.txt # Template for `.env`快速入门
- 安装必备组件
- Python 3.10+ - uv 用于快速安装(curl -LsSf https://astral.sh/uv/install.sh | sh) - 访问OpenProject实例和个人API令牌
- 克隆存储库
git clone https://github.com/your-org/openproject-mcp-ai-integration.git
cd openproject-mcp-ai-integration- 安装依赖项
uv sync # creates .venv and installs runtime + dev deps- 配置环境
cp env_example.txt .env
# edit .env with your OpenProject URL + API token- 运行烟雾测试
uv run python -m openproject_mcp.main # prints nothing and blocks while serving stdio停止 Ctrl+C 一旦您确认服务器启动时没有配置错误。
配置
openproject_mcp.config.Settings 使用以下环境变量(由于Pydantic,不区分大小写)。将它们分配到 .env 或通过您的MCP客户端配置。
| 变量 | 必填 | 描述 | 默认值 |
|---|---|---|---|
OPENPROJECT_URL / OPENPROJECT_BASE_URL | 是 | OpenProject实例的基本URL(否 /api/v3). | — |
OPENPROJECT_API_KEY / OPENPROJECT_API_TOKEN | 是 | 具有API v3访问权限的个人API令牌。 | — |
LOG_LEVEL | 可选 | Python日志级别(DEBUG, INFO, …). | INFO |
CONNECT_TIMEOUT | 可选 | 允许建立TCP/TLS连接的秒数。 | 10.0 |
READ_TIMEOUT | 可选 | 允许响应的秒数。 | 10.0 |
MAX_RETRIES | 可选 | 重试可重试的状态代码/超时。 | 3 |
PAGE_SIZE_DEFAULT | 可选 | 辅助逻辑的默认分页大小。 | 25 |
PAGE_SIZE_MAX | 可选 | 页面大小的硬上限。 | 200 |
其他按键 env_example.txt (OPENPROJECT_PROXY, TEST_CONNECTION_ON_STARTUP)是未来增强的占位符,目前被忽略。
运行服务器
该项目公开了一个名为的控制台脚本 openproj-mcp (配置于 pyproject.toml).运行它 uv 以确保通过项目虚拟环境解决依赖关系:
uv run openproj-mcp- 该过程根据MCP规范通过stdio进行阻塞和通信。
- 使用
LOG_LEVEL=DEBUG在调试期间显示HTTP请求/响应。 - 健康检查通过
system_ping在调用其他工具之前,请先从MCP客户端调用。
与MCP客户合作
克劳德桌面(macOS和Windows)
向添加条目 claude_desktop_config.json:
{
"mcpServers": {
"openproject": {
"command": "uv",
"args": ["run", "openproj-mcp"],
"env": {
"OPENPROJECT_URL": "https://your-instance.openproject.com",
"OPENPROJECT_API_KEY": "sk_...",
"LOG_LEVEL": "INFO"
}
}
}
}重新启动Claude Desktop并确认服务器出现在MCP工具列表中。其他MCP主机(游标、继续等)遵循相同的模式:指向 uv run openproj-mcp 并通过其配置UI提供环境。
测试与质量
该仓库包括异步优先测试和静态分析挂钩。
| 任务 | 命令 |
|---|---|
| 运行整个测试套件 | uv run pytest |
| 专注于特定的测试 | uv run pytest tests/test_work_packages.py -k add_comment |
| 类型检查 | uv run mypy src |
| Linting | uv run ruff check |
| 格式化(检查/修复) | uv run black --check src tests / uv run black src tests |
| 覆盖范围报告 | uv run pytest --cov=src/openproject_mcp --cov-report=term-missing |
有用的医生住在 tests/TESTING_CHECKLIST.md (例如,以下清单 add_comment).
故障排除
| 症状 | 可能原因 | 建议解决方法 |
|---|---|---|
AuthError: Authentication failed | API令牌无效或已吊销。 | 重新生成下的令牌 *我的账户→ 访问令牌* 并更新 .env/客户端配置。 |
PermissionError: Permission denied | 令牌缺少项目/工作包权限。 | 授予用户所需的OpenProject角色,或在用户可以访问的项目中运行操作。 |
404 Resource not found | 错误的项目/工作包ID或用户无法查看它。 | 通过UI或 resolve_project/search_content. |
| 命令停滞 | 公司代理或SSL拦截。 | 运行 curl 手动确认连接;代理支持尚未连接,因此目前需要直接连接。 |
| 响应速度慢 | 查询量大或附件下载量大。 | 使用过滤器(pageSize, limit,日期范围)或 get_attachment_content 在下载整个文件之前进行预览。 |
集 LOG_LEVEL=DEBUG 以跟踪HTTP调用。服务器静音嘈杂 httpx 在更高的日志级别运行时记录日志。
已知限制和路线图
- 代理配置和启动连接测试被打断
.env_example但未实施。 - 时间输入活动必须通过ID引用(例如,勾选OpenProject→ *行政→ 时间跟踪*).计划使用专用查找工具。
- 目前还没有高层权限检查;如果您收到403个错误,请使用OpenProject的UI确认权限。
- 今天只提供stdio运输。套接字或HTTP传输需要额外的粘合
FastMCP. - 工具表面侧重于在中测试的读/写操作
tests/.如果您需要新的API覆盖范围(例如版本、关系),欢迎PR。
贡献
- 分叉并克隆仓库。
- 创建要素分支:
git checkout -b feature/. - 跑
uv run ruff check,uv run black,uv run mypy,以及uv run pytest在承诺之前。 - 提交一份PR,描述动机、进行的测试和任何OpenProject先决条件。
请避免泄露秘密--.env 被忽视,以及 errors.py 从异常文本中清除敏感标记。
学分和起源
这个代码库最初是从 openproject-mcp-server 项目by 一切 (麻省理工学院许可)。在奥列克桑德·波梅顿的领导下 自那以后,它被大量重构为一个独特的实现 具有不同的架构、工具设置和功能范围,旨在 生产就绪的MCP服务器和产品组合参考。
许可证
该项目根据MIT许可证获得许可。请参阅 许可证 文件以获取详细信息。
致谢
- 灵感来自 模型上下文协议 社区工作。
- 与集成 OpenProject API v3.
