节奏mcp
MCP(模型上下文协议)服务器 Tempo时间表 和 Tempo容量规划器 (Atlassian Cloud)。
允许Claude Desktop以自然语言与Tempo交互:
*“今天在YEL-241上输入2小时,账户510119”* *“向我展示我团队本周的工作日志”* *“在6月为Alice创建一个5天的Infra计划”*
______________________________________________________________________
建筑
Claude Desktop
│ stdio
▼
mcp-remote (npx) ← gère OAuth + stockage local des tokens (~/.mcp-auth/)
│ Streamable HTTP + Bearer token
▼
tempo-mcp (src/server.ts) ← ce projet — stateless, aucun stockage de tokens
│ Bearer token
▼
api.tempo.io/4- 无状态 :服务器不存储任何令牌。MCP远程管理客户端OAuth生命周期
- 受保护的秘密 :
TEMPO_CLIENT_SECRET永远不要离开服务器 - 多用户 :每个MCP会话在内存中隔离(映射)
sessionId → token) - 安全 :速率限制、头盔、cookie HttpOnly、重定向URI验证
______________________________________________________________________
项目结构
mcp-tempo/
├── src/
│ ├── server.ts ← Serveur Express (OAuth proxy + MCP endpoint)
│ ├── config.ts ← Validation et accès aux variables d'environnement
│ ├── context.ts ← AsyncLocalStorage — token par session MCP
│ ├── tempo-client.ts ← Client HTTP Tempo API v4
│ └── tools/
│ ├── timesheets.ts ← Outils Timesheets (worklogs, approbations, comptes)
│ └── capacity-planner.ts ← Outils Capacity Planner (plans, équipes)
├── dist/ ← Compilé TypeScript (npm run build)
├── Dockerfile ← Build multi-stage pour Railway / Docker
├── .env.example ← Modèle de configuration
├── INSTALLATION.md ← Guide d'installation entreprise
├── package.json
└── tsconfig.json______________________________________________________________________
先决条件
| 工具 | 最低版本 |
|---|---|
| Node.js | 18+ |
| npm | 9+ |
| Claude Desktop | 所有最新版本 |
| Tempo帐户 | 管理员或OAuth权限 |
______________________________________________________________________
本地安装(开发)
git clone mcp-tempo
cd mcp-tempo
npm install
cp .env.example .env
# Éditer .env avec vos valeurs
npm run build
npm start______________________________________________________________________
环境变量
| 变量 | 债务人 | 描述 |
|---|---|---|
TEMPO_CLIENT_ID | ✅ | OAuth Tempo应用程序的客户端ID |
TEMPO_CLIENT_SECRET | ✅ | OAuth Tempo应用程序的秘密客户端 |
OAUTH_REDIRECT_URI | ✅ | Tempo中记录的回调URI(必须完全匹配) |
PUBLIC_URL | ✅ | 服务器的公共URL-必须以 https:// 或 http:// |
JIRA_URL | ✅ | Jira云实例的URL(例如: https://votre-org.atlassian.net) |
PORT | ❌ | 监听端口(默认: 3000 -铁路自动注入) |
TEMPO_TOKEN_URL | ❌ | 端点节奏令牌的URL(默认值: https://api.tempo.io/oauth/token) |
如果缺少强制变量,服务器拒绝启动,或者 PUBLIC_URL 不是有效的URL。 无令牌存储变量-服务器完全无状态。______________________________________________________________________
铁路部署
# 1. Pusher le code sur GitHub
# 2. Créer un projet Railway → Deploy from GitHub
# 3. Railway détecte le Dockerfile automatiquement
# 4. Renseigner les variables dans Railway → Variables
# 5. Récupérer l'URL publique Railway et mettre à jour PUBLIC_URL et OAUTH_REDIRECT_URI无需卷-服务器不保留任何数据。
______________________________________________________________________
端点HTTP
| 方法 | 路线 | 描述 |
|---|---|---|
GET | /health | 健康检查 |
GET | /.well-known/oauth-authorization-server OAuth发现(RFC 8414) | |
POST | /oauth/register 客户动态注册(RFC 7591) | |
GET | /oauth/authorize | 重定向到节奏(注入) client_id + jira_url) |
GET | /oauth/callback | 将授权代码中继到MCP远程 |
POST | /oauth/token | 代币到节奏交换/刷新代理 |
ALL | /mcp | 端点MCP流式HTTP |
______________________________________________________________________
配置克劳德桌面
File → 设置→ 开发者→ 编辑配置 :
{
"mcpServers": {
"tempo": {
"command": "npx",
"args": ["mcp-remote", "https://votre-app.up.railway.app/mcp"]
}
}
}将URL替换为铁路服务器的URL(或 http://localhost:3000/mcp 本地)。
第一次连接 :Claude Desktop自动打开Tempo授权页面的浏览器。验证后,建立连接,并由MCP Remote自动管理令牌刷新。
______________________________________________________________________
MCP工具可用
工时表
| 输出 | 描述 |
|---|---|
get_worklogs | 列出日期范围内的工作日志(过滤器项目、问题) |
get_user_worklogs | 用户的工作日志 accountId |
create_worklog | 创建工作日志(支持 attributes 对于账单账户) |
update_worklog | 更新现有工作日志 |
delete_worklog | 删除工作日志 |
get_timesheet_status | 用户时间表的批准状态 |
submit_timesheet | 提交时间表供批准 |
get_work_attributes | 列出Tempo中配置的自定义属性 |
search_accounts | 搜索Tempo账单账户 |
容量规划师
| 输出 | 描述 |
|---|---|
search_plans | 计划搜索(用户过滤器、日期、问题/项目) |
get_user_plans | 分配给用户的计划 |
create_plan | 创建容量分配计划 |
update_plan | 更新现有计划 |
delete_plan | 删除计划 |
get_teams | 节奏团队列表 |
get_team_members | 团队成员 |
______________________________________________________________________
注释API Tempo v4
- 问题ID与clé Tempo v4 API 需要
issueId整数,而不是文本键(PROJ-123).
要转换: GET {JIRA_URL}/rest/api/3/issue/PROJ-123?fields=id
- 分页 :所有列表端点都支持
limit(最多5000)etoffset - 计划 :由用户管理(
accountId)-团队计划在v4中不可用 - 工作日志属性 :使用
get_work_attributes要了解实例的确切密钥:
______________________________________________________________________
命令
npm run build # Compiler TypeScript → dist/
npm start # Démarrer le serveur
npm run dev # Compilation watch______________________________________________________________________
安全
| 机制 | 描述 |
|---|---|
| 受保护的秘密 | TEMPO_CLIENT_SECRET 永远不要离开服务器-MCP远程接收随机临时秘密(PROXY_CLIENT_SECRET) |
| grant_type白名单 | 独自 authorization_code 和 refresh_token 被接受 /oauth/token |
| 验证重定向URI | 只有URI http://localhost 和 http://127.0.0.1 接受-保护打开重定向 |
Cookie HttpOnly OAuth状态存储在cookie中 HttpOnly; SameSite=Lax (+ Secure en-HTTPS) | |
| 速率限制 | OAuth端点上的30 req/min,OAuth端点上的120 req/min /mcp |
| 会话TTL | 超过4小时的非活动MCP会话将自动清除(DOS保护) |
| 安全头 | helmet 注射 X-Content-Type-Options, X-Frame-Options, Referrer-Policy等等。 |
| 环境变量验证 | 如果缺少所需变量,服务器拒绝启动,或者 PUBLIC_URL 无效。 |
______________________________________________________________________
故障排除
| 症状 | 原因 | 解决方案 |
|---|---|---|
| OAuth窗口未打开 | 未安装mcp remote | 检查node.js和npx是否可用 |
Could not attach to MCP server | 服务器未启动或URL不正确 /health 在服务器上 | |
| OAuth授权失败 | OAUTH_REDIRECT_URI 不正确 | 检查URI是否与节奏完全匹配 |
| 工具中缺少节奏 | Claude Desktop未重新启动 | 完全退出并重新启动 |
Token exchange failed (404) | URL令牌节奏不正确 TEMPO_TOKEN_URL 在变量中 | |
unsupported_grant_type | 客户端发送不受支持的授予类型 authorization_code 和 refresh_token 接受 | |
| 服务器拒绝启动 | 缺少环境变量或 PUBLIC_URL 无效 | 检查启动日志-必须设置所有必需的变量 |
OAuth缓存被阻止 ~/.mcp-auth/ | 删除 ~/.mcp-auth/ 并重新验证 |
