MCP服务器工作区
 
多租户MCP(模型上下文协议)服务器 工作区 项目管理平台, 建于 FastMCP.
提供 全面的只读工具 对于数据访问, 使像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首次运行时,服务器将:
- 打开浏览器进行OAuth2授权
- 授权后,它将保存加密令牌
- 在端口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 -dOAuth2设置
创建工作区OAuth2应用程序
- 转到您的工作分区帐户设置
- 导航到API/集成
- 创建新的OAuth2应用程序
- 将重定向URI设置为
https://localhost:8080/oauth/callback
(需要HTTPS)
- 注意你的
client_id和client_secret - 启用所需的读取范围:项目、任务、成本、标签、,
评论、文件、人员、联系人
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 -dKubernetes
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
修复:
- 验证您的URL
.env与您的实际工作分区帐户匹配 - 测试DNS解析:
nslookup yourcompany.worksection.com - 检查互联网连接
- 尝试其他DNS服务器(8.8.8.8、1.1.1.1)
注: 通过新的验证,此错误在启动时被捕获,并显示一条明确的消息,而不是在运行时被捕获。
启动时出现“验证错误”
服务器现在使用Pydantic在启动时验证所有配置。如果您看到验证错误:
- 检查错误消息-它告诉你到底出了什么问题
- 参见
.env.example正确的格式 - 常见问题:
- 客户端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请求。
