Tempo MCP服务

Tempo MCP服务是一个为Tempo Timesheets和Tempo Capacity Planner提供的模型上下文协议服务器,允许通过自然语言与Tempo交互。

  • by Crumbleszatan
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 Crumbleszatan/mcp-tempo

使用说明

节奏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 <repo-url> 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)et offset
  • 计划 :由用户管理(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/ 并重新验证