项目管理数据访问服务器

为Worksection项目管理平台提供的多租户MCP服务器,支持AI助手生成报告、分析项目数据和处理图像附件。

  • by pbv7
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 pbv7/worksection-mcp

使用说明

MCP服务器工作区

⚠️ 非官方项目。 不隶属于、不得到或不支持 工作区。“工作区”仅用于识别第三方API 该项目与。看 免责声明 了解详情。

多租户MCP(模型上下文协议)服务器 工作区 项目管理平台, 建造于 快速多通道处理.

提供 全面的只读工具 对于数据访问, 使像Claude这样的人工智能助手能够生成报告、分析项目数据, 并处理图像附件。

特性

  • 多用户 -可配置为任何工作区帐户
  • OAuth2身份验证 -自动保护授权码流 令牌刷新
  • 全面的只读工具 -项目、任务、评论、时间跟踪、, 用户,以及更多
  • 图像分析 -Claude vision用于分析屏幕截图的MCP资源 和附件
  • 速率限制 -每个工作区API的内置1 req/sec节流限制
  • 文件高速缓存 -下载附件的本地缓存
  • 大响应卸载 -超大的工具响应被卸载到磁盘;客户端通过辅助工具以有界块的形式读回它们
  • 生产就绪 -具有多阶段构建的Docker容器化
  • 可扩展 -用于添加自定义工具的干净架构

快速开始

先决条件

  • Python 3.14+
  • 紫外线 包管理器
  • 具有OAuth2应用程序凭据的工作分区帐户

安装

# Clone the repository
git clone https://github.com/pbv7/worksection-mcp.git
cd worksection-mcp

# Install dependencies with uv (always use --frozen to respect lockfile)
uv sync --frozen --extra dev

# Copy environment template
cp .env.example .env

# Edit .env with your credentials
# Then validate your configuration
uv run python scripts/validate_config.py

# Restrict permissions on the data directory (tokens, keys, certs)
mkdir -p data && chmod 700 data

配置

编辑 .env 使用您的工作区OAuth2凭据:

# Required
WORKSECTION_CLIENT_ID=your_client_id
WORKSECTION_CLIENT_SECRET=your_client_secret
WORKSECTION_ACCOUNT_URL=https://yourcompany.worksection.com

# Optional (defaults shown)
WORKSECTION_REDIRECT_URI=https://localhost:8080/oauth/callback
MCP_SERVER_HOST=127.0.0.1
MCP_SERVER_PORT=8000
MCP_TRANSPORT=streamable-http
LOG_LEVEL=INFO
LOG_USE_COLORS=true
REQUEST_LOG_MODE=INFO
FASTMCP_SHOW_SERVER_BANNER=false

运行服务器

# Development
uv run python -m worksection_mcp

# Or using the entry point
uv run worksection-mcp

首次运行时,服务器将:

  1. 打开浏览器进行OAuth2授权
  2. 授权后,它将保存加密令牌
  3. 在端口8000上启动MCP服务器

Docker 部署

# Build the image
docker build -t worksection-mcp .

# Run with environment file
docker run -d \
  --name worksection-mcp \
  -p 8000:8000 \
  -e MCP_SERVER_HOST=0.0.0.0 \
  --env-file .env \
  -v $(pwd)/data:/app/data \
  worksection-mcp

# Or use docker-compose
docker compose up -d

OAuth2设置

创建工作区OAuth2应用程序

  1. 转到您的工作分区帐户设置
  2. 导航到API/集成
  3. 创建新的OAuth2应用程序
  4. 将重定向URI设置为 https://localhost:8080/oauth/callback (需要HTTPS)
  5. 注意你的 client_id 和 client_secret
  6. 启用所需的读取范围:项目、任务、成本、标签、, 评论、文件、人员、联系人

OAuth回调的HTTPS

工作节要求OAuth2重定向URI使用HTTPS。此服务器会自动 首次运行时生成自签名SSL证书。

期待什么:

  • 证书自动生成并存储在 ./data/certs/
  • 您的浏览器将显示“您的连接不是私有的”警告
  • 点击“高级”→ “转到localhost(不安全)”继续
  • 这是本地开发中自签名证书的预期

使用自定义证书:

# Set paths to your certificates in .env
OAUTH_SSL_CERT_PATH=/path/to/your/cert.crt
OAUTH_SSL_KEY_PATH=/path/to/your/key.key

禁用SSL(不推荐):

# Only if you have an alternative HTTPS solution (e.g., ngrok)
OAUTH_CALLBACK_USE_SSL=false

认证流程

First Run (no tokens):
1. Server starts callback listener on port 8080
2. Opens browser → Worksection authorization page
3. User grants permissions
4. Callback receives authorization code
5. Server exchanges code for access + refresh tokens
6. Tokens encrypted and saved locally
7. MCP server starts

Subsequent Runs:
1. Load encrypted tokens from storage
2. If access token expired → auto-refresh
3. If refresh token expired → re-authenticate via browser
4. MCP server starts

可用工具

项目

工具 说明
get_projects 列出所有具有可选筛选的项目
get_project 获取单个项目详细信息
get_project_groups 获取项目文件夹/组
get_project_team 将团队成员分配到项目中

任务

工具 说明
get_all_tasks 跨项目获取所有任务
get_tasks 获取特定项目的任务
get_task 获取单任务详细信息
search_tasks 按查询或筛选表达式搜索任务
get_task_subtasks 获取任务的子任务
get_task_relations 获取相关/依赖任务
get_task_subscribers 获取任务观察者

评论

工具 说明
get_comments 获取任务的评论
get_task_discussion 获取包含评论和文件的完整讨论线程

文件

工具 说明
get_task_files 获取附加到任务的文件
get_all_task_attachments 从任务和评论中获取所有附件
get_project_files 列出项目或任务中的所有文件
download_file 下载并缓存文件
get_file_as_base64 将文件下载为base64编码字符串
get_file_content 从文件中提取文本内容
list_image_attachments 列出任务或项目的图像文件

成本和时间

工具 说明
get_costs 获取时间/成本记录
get_costs_total 获取总成本
get_user_workload 获取用户的时间条目
get_project_time_report 获取项目时间报告
get_timers 获取当前正在运行的所有计时器
get_my_timer 获取当前用户的运行计时器

用户和团队

工具 说明
get_users 获取所有帐户用户
get_user 获取单用户详细信息
get_current_user 获取当前经过身份验证的用户
get_user_groups 组建团队/部门
get_contacts 获取联系人数据库
get_contact_groups 列出联系人文件夹
get_user_assignments 获取分配给用户的任务

标签

工具 说明
get_task_tags 获取可用的任务标签(标签/状态)
get_task_tag_groups 获取任务标记组
get_project_tags 获取可用的项目标签
get_project_tag_groups 获取项目标记组
get_task_with_tags 获取带有指定标签的任务
search_tasks_by_tag 查找带有特定标签的任务

分析

工具 说明
get_project_stats 获取项目统计信息
get_overdue_tasks 获取过期任务
get_tasks_by_status 按状态筛选任务
get_tasks_by_priority 按优先级筛选任务
get_team_workload_summary 获取团队工作负载概览

活动

工具 说明
get_activity_log 通过自动大小截断和事件类型细分获取活动/事件日志
get_user_activity 通过自动大小截断获取用户的活动

活动工具默认在MCP的1MB响应下返回尽可能多的事件 限制(具有~150KB的安全裕度,没有固定的默认上限)。集 max_results 明确地控制截断。 截断元数据(total_count, returned_count, truncated, truncation_reason) 总是包括在内。

系统

工具 说明
health_check 检查服务器运行状况和API状态
get_webhooks 列出已配置的Webhook(需要 administrative 范围)

大型响应助手

当工具响应超过 LARGE_RESPONSE_OFFLOAD_THRESHOLD_BYTES,它被卸载到磁盘上 取而代之的是一个紧凑的信封。使用这些工具检查和读取卸载的内容:

工具 说明
get_offloaded_response_info 检查卸载响应的元数据(大小、SHA-256、MIME类型)
read_offloaded_response_text 读取有界UTF-8安全块中的卸载文本/JSON内容(offset + max_bytes)

MCP资源

资源允许Claude直接访问和分析文件:

资源URI 描述
worksection://file/{file_id} 用于视觉分析的访问文件
worksection://task/{task_id}/context 获取包含附件的完整任务上下文
worksection://cache/stats 获取文件缓存统计信息
worksection://offload/{response_id} 预览卸载的大型工具响应

利用资源进行图像分析

# In your MCP client or skill:
# 1. Get task discussion with files
discussion = await get_task_discussion(task_id="12345")

# 2. For each image file, access via resource
for file in discussion.get("images", []):
    # Claude can read this resource and analyze the image
    image_content = await read_resource(file["resource_uri"])

配置参考

变量 描述 默认值
WORKSECTION_CLIENT_ID OAuth2客户端ID 必填
WORKSECTION_CLIENT_SECRET OAuth2客户端机密 必填
WORKSECTION_ACCOUNT_URL 您的工作区URL 必填
WORKSECTION_REDIRECT_URI OAuth回调URL https://localhost:8080/oauth/callback
WORKSECTION_SCOPES OAuth2示波器 projects_read,tasks_read,...
OAUTH_CALLBACK_HOST 回拨服务器主机 localhost
OAUTH_CALLBACK_PORT 回调服务器端口 8080
OAUTH_AUTO_OPEN_BROWSER 自动打开浏览器 true
OAUTH_CALLBACK_USE_SSL 使用HTTPS进行回调 true
OAUTH_SSL_CERT_PATH SSL证书路径 ./data/certs/callback.crt
OAUTH_SSL_KEY_PATH SSL私钥路径 ./data/certs/callback.key
OAUTH_SSL_CERT_DAYS 证书有效期(天) 365
TOKEN_STORAGE_PATH 令牌存储目录 ./data/tokens
TOKEN_ENCRYPTION_KEY 加密密钥(自动生成)
FILE_CACHE_PATH 文件缓存目录 ./data/files
FILE_CACHE_RETENTION_HOURS 缓存保留 24
MAX_FILE_SIZE_MB 最大缓存文件大小 10
LARGE_RESPONSE_OFFLOAD_ENABLED 卸载超大MCP工具响应 true
LARGE_RESPONSE_OFFLOAD_PATH 卸载响应目录 ./data/offload
LARGE_RESPONSE_OFFLOAD_THRESHOLD_BYTES 序列化响应大小,超过此大小将卸载响应(0 禁用) 50000
LARGE_RESPONSE_OFFLOAD_RETENTION_HOURS 卸载响应保留 24
LARGE_RESPONSE_OFFLOAD_MAX_FILES 要保留的最大卸载响应文件数 100
LARGE_RESPONSE_OFFLOAD_INCLUDE_FILE_PATH 在卸载元数据中包含本地文件路径 false
LARGE_RESPONSE_MAX_READ_BYTES 卸载读取辅助工具请求的最大原始字节数(最小 4) 50000
MCP_SERVER_NAME 服务器名称 worksection
MCP_SERVER_HOST HTTP绑定主机(127.0.0.1 仅限于本地, 0.0.0.0 局域网) 127.0.0.1
MCP_SERVER_PORT 服务器端口 8000
MCP_TRANSPORT 运输类型(streamable-http/stdio) streamable-http
LOG_LEVEL 应用程序/服务器组件的全局日志记录级别 INFO
LOG_USE_COLORS 当输出为TTY时,将日志级别着色 true
REQUEST_LOG_MODE 请求/访问日志冗长(INFO/DEBUG/OFF)for uvicorn.access 和 httpx INFO
FASTMCP_SHOW_SERVER_BANNER 在日志中显示FastMCP启动横幅 true
ENVIRONMENT 环境名称 development

测试

自动化测试(推荐)

自动测试所有MCP工具:

# Use first available project
uv run python tests/test_all_mcp_tools.py

# Specify project name
uv run python tests/test_all_mcp_tools.py --project "My Project"

这个全面的测试脚本:

  • ✅ 测试所有注册的MCP工具
  • ✅ 可配置的项目选择(通过CLI参数或环境变量)
  • ✅ 自动从项目数据中提取测试ID
  • ✅ 提供详细的通过/失败结果
  • ✅ 自动处理速率限制

看 测试.md 获取完整的文档和配置选项。

要验证针对真实Workssection帐户的大响应卸载,请执行以下操作:

uv run python tests/live_large_response_offload_roundtrip.py -v

使用MCP检查员进行手动测试

对于交互式测试:

# Start your MCP server
uv run worksection-mcp

# In another terminal, start the MCP Inspector
npx @modelcontextprotocol/inspector http://localhost:8000/mcp

发展

设置开发环境

# Install with dev dependencies (use --frozen, never uv pip install)
uv sync --frozen --extra dev

# Run tests
make test-fast

# Run with coverage
make test

# Plain `uv run pytest` uses the same no-coverage mode as `make test-fast`.
# Use `make test` or `make check` when you need coverage output.

# Lint code
make lint

# Lint all Markdown from repo root
make lint-docs

# Auto-fix all Markdown from repo root
npx markdownlint-cli2 --fix

# Type check
make typecheck

# Run the full CI-like check
make check

项目结构

worksection-mcp/
├── src/
│   └── worksection_mcp/
│       ├── __init__.py          # Package init
│       ├── __main__.py          # Entry point
│       ├── server.py            # FastMCP server
│       ├── config/              # Configuration
│       ├── auth/                # OAuth2 authentication
│       ├── client/              # API client
│       ├── tools/               # MCP tools
│       ├── resources/           # MCP resources
│       ├── cache/               # File and session caching
│       ├── large_response.py    # Large tool response offloading
│       └── utils/               # Date formatting, response helpers
├── tests/                       # Test suite
├── data/                        # Runtime data (gitignored)
├── Dockerfile                   # Container build
├── docker-compose.yml           # Local development
└── docker-compose.prod.yml      # Production deployment

部署

Docker生产

# Build production image
docker build -t worksection-mcp:latest .

# Run with production compose
docker compose -f docker-compose.prod.yml up -d

Kubernetes

apiVersion: apps/v1
kind: Deployment
metadata:
  name: worksection-mcp
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: worksection-mcp
        image: worksection-mcp:latest
        ports:
        - containerPort: 8000
        env:
        - name: WORKSECTION_CLIENT_ID
          valueFrom:
            secretKeyRef:
              name: worksection-secrets
              key: client_id
        - name: WORKSECTION_CLIENT_SECRET
          valueFrom:
            secretKeyRef:
              name: worksection-secrets
              key: client_secret
        volumeMounts:
        - name: data
          mountPath: /app/data
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: worksection-mcp-data

容器的预认证

由于OAuth2需要浏览器交互,请先在本地进行身份验证:

# 1. Run locally to authenticate
uv run python -m worksection_mcp

# 2. After authentication, tokens are saved to ./data/tokens/

# 3. Mount this directory in your container
docker run -v ./data:/app/data worksection-mcp

故障排除

配置验证

在排除故障之前,请验证您的完整配置:

uv run python scripts/validate_config.py

验证器分3个步骤进行全面检查:

第一步:媒染剂验证 (加载.env时自动)

  • OAuth2凭据格式和长度
  • URL格式和结构
  • 重定向URI HTTPS要求
  • 有效的OAuth2作用域名称
  • 端口号范围(1-65535)
  • 文件大小和保留期为正值
  • SSL配置一致性

步骤2:配置摘要

  • 显示所有加载的设置
  • 显示派生值(API URL)
  • 包括日志控制(LOG_LEVEL, LOG_USE_COLORS, REQUEST_LOG_MODE)
  • 帮助验证环境变量是否设置正确

步骤3:外部资源检查

  • 帐户URL的DNS解析
  • 目录写入权限(令牌、缓存、证书)
  • 文件系统可访问性

如果验证通过,则配置完成,服务器将成功启动。

OAuth2问题

“重定向URI无效”

  • 确保您在工作区中注册的重定向URI完全匹配
  • 违约: https://localhost:8080/oauth/callback
  • 工作分区需要HTTPS-不要使用 http://

“您的连接不是私有的”浏览器警告

  • 这是自签名证书所期望的
  • 点击“高级”→ “转到localhost(不安全)”继续
  • 警告仅在OAuth授权期间出现

“刷新令牌已过期”

  • 删除 ./data/tokens/tokens.enc 并重新验证

SSL证书问题

  • 删除 ./data/certs/ 用于重新生成证书的目录
  • 确保您对数据目录具有写入权限

配置和连接问题

“无法解析主机名”或“未提供节点名或服务名,或未知”

此DNS解析错误表示无法解析工作分区帐户URL:

检查您的配置:

# Run validation to diagnose
uv run python scripts/validate_config.py

常见原因:

  • Typo in WORKSECTION_ACCOUNT_URL 在你的 .env 文件
  • 域名缺失或不正确(应 https://yourcompany.worksection.com)
  • 没有互联网连接
  • 企业防火墙阻止DNS

修复:

  1. 验证您的URL .env 与您的实际工作分区帐户匹配
  2. 测试DNS解析: nslookup yourcompany.worksection.com
  3. 检查互联网连接
  4. 尝试其他DNS服务器(8.8.8.8、1.1.1.1)

注: 通过新的验证,此错误在启动时被捕获,并显示一条明确的消息,而不是在运行时被捕获。

启动时出现“验证错误”

服务器现在使用Pydantic在启动时验证所有配置。如果您看到验证错误:

  1. 检查错误消息-它告诉你到底出了什么问题
  2. 参见 .env.example 正确的格式
  3. 常见问题:
    • 客户端ID/密码太短(至少8/16个字符)
    • 重定向URI无效(必须是HTTPS,本地主机除外)
    • 无效范围(请参阅中的列表 .env.example)
    • 端口号超出范围(1-65535)

速率限制

429请求太多

  • 服务器会自动回退并重试
  • API工作区限制:1个请求/秒

文件缓存

“文件太大”

  • 增加 MAX_FILE_SIZE_MB 环境变量
  • 默认限制:10MB

API约束和限制

API设计工作部分

无分页支持

大多数工作区API终结点返回完整的数据集而不分页:

  • get_users -在一次呼叫中返回所有用户
  • get_events -返回指定时间段内的所有事件
  • get_projects -返回所有项目
  • get_all_tasks -返回所有项目中的所有任务
  • get_tasks -返回项目的所有任务
  • get_project_groups -返回所有项目文件夹

影响:对于大型数据集,响应可能超过MCP的1MB限制。

解决方案:服务器使用两个响应大小控件:

  • 中央大型响应卸载存储超大工具结果 LARGE_RESPONSE_OFFLOAD_PATH 并返回一个紧凑的元数据信封,其中包含 卸载ID。
  • get_offloaded_response_info 和 read_offloaded_response_text 让客户 检查并读取有界块中的卸载响应。
  • 本地 file_path 默认情况下,值是隐藏的;使用 resource_uri 和助手 除非MCP客户端使用受信任的本地文件系统访问运行。
  • 默认的50KB卸载阈值和50KB读取限制为JSON留出了空间 MCP客户端中具有严格内联响应的封装和逃逸开销 限制。
  • 当JSON转义时,块读取返回的原始字节可能比请求的少 否则会使序列化的辅助工具响应太大。
  • 卸载的文件在启动时和未来卸载到期之前会被清理,使用 LARGE_RESPONSE_OFFLOAD_RETENTION_HOURS 和 LARGE_RESPONSE_OFFLOAD_MAX_FILES.
  • MCP客户端接受较大内联响应的部署可能会引发 LARGE_RESPONSE_OFFLOAD_THRESHOLD_BYTES 或 LARGE_RESPONSE_MAX_READ_BYTES, 交易更少的卸载/读取调用,以获得更高的上下文和客户限额风险。
  • 选定的高容量工具仍然应用特定于端点的截断: get_activity_log, get_user_activity, search_tasks,以及 get_comments.

截断的响应包括元数据: total_count, returned_count, truncated, truncation_reason.

有关API限制和解决方法的综合列表,请参阅 docs/API-限制.md.

面向客户的实际覆盖范围、限制和预期摘要 PASS/PARTIAL 语义,请参见 docs/CLIENT-CAPABILITIES.md.

范围要求提高

某些端点需要 administrative 范围:

  • get_webhooks -Webhook管理
  • 其他行政业务

添加 administrative 到 WORKSECTION_SCOPES 在 .env 以启用这些工具。

MCP协议约束

响应大小限制:1MB

错误: "Tool result is too large. Maximum size is 1MB."

模型上下文协议强制最大响应大小为1MB。此服务器处理 通过自动文件卸载和使用产生超大通用工具 针对所选列表/搜索工具的工具特定截断。

网络与安全

默认绑定:127.0.0.1

默认情况下,MCP服务器绑定到 127.0.0.1 (仅限本地主机)以确保安全。

Docker 部署:设置 MCP_SERVER_HOST=0.0.0.0 在docker中编写 服务器可从网络访问。

看 .env.example 有关配置详细信息

许可证

MIT许可证-请参阅 许可证 了解详情。

贡献

欢迎投稿!请阅读我们的投稿指南并提交pull请求。

支持

免责声明

这是一个 独立、社区构建的整合 API工作部分。 它是 不隶属于、不得到或不支持 工段或其 母公司。

  • 作者不是工作部门的员工。
  • “工作区”和任何相关徽标是其各自的商标 所有者;该项目仅使用该名称来标识它的第三方API 与名义合理使用相结合。
  • 对于此MCP服务器的问题,请在 GitHub — 不 随着 工作区支持。
  • 有关工作区产品或API本身的问题,请联系 工作区 直接。