🚀 Tempo Filler MCP Server
このサーバーは、JIRA内のTempo作業ログを管理するためのModel Context Protocol (MCP)サーバーです。AIアシスタントがTempoのタイムトラッキングシステムとやり取りできるようにし、作業ログの取得、作成、一括操作、管理を可能にします。
🚀 クイックスタート
-
コードの取得:
git clone https://github.com/TRANZACT/tempo-filler-mcp-server.git
cd tempo-filler-mcp-server
-
サーバーのビルド:
npm install && npm run build
-
AIアシスタントの設定:
{
"servers": {
"tempo-filler": {
"type": "stdio",
"command": "node",
"args": ["/full/path/to/tempo-filler-mcp-server/dist/index.js"],
"env": {
"TEMPO_BASE_URL": "https://jira.company.com",
"TEMPO_PAT": "your-personal-access-token"
}
}
}
}
-
テスト: AIアシスタントに「今週の作業ログを取得して」と尋ねます。
🔧 このサーバーの構築方法
このMCPサーバーは、AIを活用した開発ツールを使用してわずか3時間で構築されました。これは、現代のAI支援型コーディングの威力を示しています。
開発タイムライン
-
仕様策定フェーズ
- GitHub CopilotとClaude Sonnet 4を使用して、完全な技術仕様を作成しました。
- すべてのAPIエンドポイント、データ構造、ツールインターフェースを定義しました。
- 反復的な会話を通じて要件を洗練しました。
-
実装フェーズ
- VS CodeとClaude Codeを使用して、全体の実装を一発で行いました。
- 完全なTypeScriptコードベース、ツール実装、およびクライアントロジックを生成しました。
- すべての核心機能を単一のAI支援セッションで実装しました。
-
改良フェーズ
- Claude Codeの使用制限に達した後、GitHub CopilotとClaude Sonnet 4に戻りました。
- APIペイロードのフォーマットと認証の問題を修正しました。
- Tempo APIの統合をデバッグし、磨きました。
成功の要因
- まずは明確な仕様: 詳細な仕様があることで、効果的な一発実装が可能になりました。
- AIツールの相乗効果: 異なるAIツールが開発の異なるフェーズで優れた成果を収めました。
- 反復的な改良: AIアシスタントとの迅速なフィードバックループによるデバッグ。
このプロジェクトは、AIを活用した開発が堅牢で本番環境で使用可能なツールの作成を劇的に加速できることを示しています。
✨ 主な機能
- 作業ログの取得: 日付範囲と課題フィルターを使用して、ユーザーの作業ログを取得します。
- 作業ログの作成: 自動的な課題解決機能を持つ単一の作業ログエントリを追加します。
- 一括操作: 並列処理を使用して、複数の作業ログエントリを効率的に作成します。
- 作業ログの削除: 既存の作業ログエントリを削除します。
- リソースアクセス: 作業ログデータと最近の課題を閲覧します。
- プロンプトテンプレート: 作業ログデータの分析プロンプトを生成します。
📦 インストール
前提条件
- Node.js (バージョン16以上)
- npm (Node.jsに付属)
- Tempo TimesheetsプラグインがインストールされたJIRAインスタンス
- JIRAアカウントの個人用アクセストークン
手順
-
ソースコードの取得:
git clone https://github.com/TRANZACT/tempo-filler-mcp-server.git
cd tempo-filler-mcp-server
-
依存関係のインストール:
npm install
-
サーバーのビルド:
npm run build
-
JIRAの認証情報を取得 (下記の認証設定を参照)
🛠️ 設定
サーバーは、認証と設定のために環境変数を必要とします。
必須環境変数
TEMPO_BASE_URL: あなたのJIRAインスタンスのURL (例: https://jira.company.com)
TEMPO_PAT: 認証用の個人用アクセストークン
オプション環境変数
TEMPO_DEFAULT_HOURS: 1日のデフォルト勤務時間 (デフォルト: 8)
個人用アクセストークン (PAT) の作成
- JIRAインスタンスにログインします。
- プロフィール → 個人用アクセストークンに移動します。
- トークンを作成をクリックします。
- 名前を付けます (例: "Tempo MCP Server")。
- 適切な権限 (課題と作業ログの読み取り/書き込みアクセス) を設定します。
- トークンの値をコピーして、
TEMPO_PATで使用します。
💻 AIアシスタントとの使用方法
GitHub Copilotの設定 (VS Code)
MCPサーバーの設定ファイル (例: mcp.json) に以下を追加します。
{
"servers": {
"tempo-filler": {
"type": "stdio",
"command": "node",
"args": [
"/full/path/to/tempo-filler-mcp-server/dist/index.js"
],
"env": {
"TEMPO_BASE_URL": "https://jira.company.com",
"TEMPO_PAT": "your-personal-access-token-here"
}
}
}
}
Claude Desktopの設定
Claude Desktopの設定ファイルに以下を追加します。
{
"mcpServers": {
"tempo-filler": {
"command": "node",
"args": ["/full/path/to/tempo-filler-mcp-server/dist/index.js"],
"env": {
"TEMPO_BASE_URL": "https://jira.company.com",
"TEMPO_PAT": "your-personal-access-token"
}
}
}
}
セットアップ手順
-
サーバーのビルド: npm run build
-
dist/index.jsファイルの完全パスを見つけます。
pwd
-
AIアシスタントに設定を追加します (完全パス + /dist/index.js を使用)
-
AIアシスタントを再起動して、MCPサーバーを読み込みます。
-
接続をテスト: 「今週の作業ログを取得して」と尋ねます。
認証設定
サーバーは、安全な認証のために個人用アクセストークン (PAT) を使用します。
-
JIRAインスタンスでPATを生成します。
- プロフィール → 個人用アクセストークンに移動します。
- 課題と作業ログの読み取り/書き込み権限を持つトークンを作成します。
- トークンの値をコピーします (再度表示されることはありません)。
-
環境変数を設定します。
TEMPO_BASE_URL: あなたのJIRAのURL (例: https://jira.company.com)
TEMPO_PAT: あなたの個人用アクセストークン
🛠️ 利用可能なツール
1. get_worklogs - 作業ログの取得
日付範囲で作業ログを取得し、オプションでフィルタリングできます。
パラメーター:
startDate (文字列): YYYY-MM-DD形式の開始日
endDate (文字列、オプション): 終了日、デフォルトは開始日
issueKey (文字列、オプション): 特定の課題キーでフィルタリング
使用例:
"7月の勤務時間を取得"
→ 返却値: 合計: 184時間 (23件のエントリ)
• PROJ-1234: 184.0時間 (23件のエントリ)
"7月のPROJ-1234の作業ログを表示"
→ 特定の課題に結果をフィルタリング
2. post_worklog - 単一の作業ログの記録
特定の課題と日付の新しい作業ログエントリを作成します。
パラメーター:
issueKey (文字列): JIRAの課題キー (例: "PROJ-1234")
hours (数値): 作業時間 (小数、0.1 - 24)
startDate (文字列): YYYY-MM-DD形式の日付
endDate (文字列、オプション): 複数日のエントリの終了日
billable (ブール値、オプション): 時間が請求可能かどうか (デフォルト: true)
description (文字列、オプション): 作業の説明
使用例:
"7月10日にPROJ-1234に8時間を記録"
→ 返却値: ✅ 作業ログが正常に作成されました
課題: PROJ-1234 - サンプルプロジェクトタスク
時間: 8時間
日付: 2025-07-10
作業ログID: 1211549
3. bulk_post_worklogs - 複数の作業ログの作成
並列処理を使用して、複数の作業ログエントリを効率的に作成します。
パラメーター:
worklogs (配列): 作業ログオブジェクトの配列:
issueKey (文字列): JIRAの課題キー
hours (数値): 作業時間
date (文字列): YYYY-MM-DD形式の日付
description (文字列、オプション): 作業の説明
billable (ブール値、オプション): すべてのエントリの時間が請求可能かどうか
使用例:
"7月11日から15日までの平日に毎日8時間をPROJ-1234に記録"
→ 返却値: ✅ 一括作業ログの作成が開始されました
3件の作業ログエントリを処理しています...
✅ 成功: 3件
❌ 失敗: 0件
📊 合計時間: 24時間
"7月のすべての平日にPROJ-1234に8時間を記録"
→ 月のすべての平日に23件のエントリを作成
4. delete_worklog - 作業ログの削除
IDで既存の作業ログエントリを削除します。
パラメーター:
worklogId (文字列): 削除するTempo作業ログのID
使用例:
"IDが1211547の作業ログを削除"
→ 指定された作業ログエントリを削除
💻 使用例
作業ログの閲覧
"7月の勤務時間を取得"
→ 7月のすべての作業ログの要約を返し、課題と日付別に合計を表示
"2025年7月の作業ログを表示"
→ get_worklogsを使用して詳細な作業ログ情報を取得
"先週何をしていたか"
→ 先週の作業ログを取得し、課題別に内訳を表示
単一の作業ログの作成
"7月10日にPROJ-1234に8時間を記録"
→ 単一の作業ログエントリを作成:
✅ 課題: PROJ-1234 - サンプルプロジェクトタスク
✅ 時間: 8時間 (請求可能)
✅ 日付: 2025-07-1日
✅ 作業ログID: 1211549
"今日、PROJ-123に6.5時間を記録し、説明を「バグ修正とテスト」とする"
→ カスタム説明を持つpost_worklogを使用
一括作業ログの作成
"7月11日から15日までの平日に毎日8時間をPROJ-1234に記録"
→ 5件の作業ログエントリを作成 (週末をスキップ):
✅ 7月11日 (金曜日): 8時間
✅ 7月14日 (月曜日): 8時間
✅ 7月15日 (火曜日): 8時間
合計: 3平日で24時間
"今週のタイムシートを埋める - 毎日PROJ-1111に4時間、PROJ-2222に4時間"
→ 1日に複数の課題を持つbulk_post_worklogsを使用
"7月31日までの日付を埋める"
→ 月の残りの平日を自動的に埋める
高度な一括操作
"7月全体の時間を記録:
- PROJ-1234: 平日に毎日8時間
- 週末をスキップ
- すべての時間は請求可能"
→ 7月のすべての平日に22件の作業ログエントリを作成
"第2四半期のタイムシートを、以下のように1日8時間で埋める:
- 60%をPROJ-1234 (開発) に
- 40%をPROJ-5678 (会議) に"
→ 時間を計算し、四半期のエントリを作成
作業ログの管理
"IDが1211547の作業ログを削除"
→ 指定された作業ログエントリを削除
"7月の勤務時間を課題別に要約して表示"
→ 作業ログを課題別にグループ化し、合計とパーセンテージを表示
🌟 実際の使用例
成功した実装に基づいて、以下は実用的なシナリオです。
毎日の作業ログの記録
ユーザー: "今日、PROJ-1234に8時間を記録"
AI: ✅ 作業ログが正常に作成されました
課題: PROJ-1234 - サンプルプロジェクトタスク
時間: 8時間
日付: 2025-08-01
作業ログID: 1211550
作業時間: 1日
月次の作業ログの埋め込み
ユーザー: "7月のすべての平日にPROJ-1234に8時間を記録"
AI: ✅ 一括作業ログの作成が開始されました
23件の作業ログエントリを処理しています...
✅ 成功: 23件
❌ 失敗: 0件
📊 合計時間: 184時間
作業時間の分析
ユーザー: "7月の勤務時間を取得"
AI: 📊 合計時間: 184時間 (23件のエントリ)
課題別の内訳:
• PROJ-1234: 184.0時間 (23件のエントリ)
平日のパターン: 毎日8時間
完了率: 100% (すべての平日が埋まっています)
🛠️ 開発
プロジェクト構造
src/
├── index.ts # メインのMCPサーバーエントリポイント
├── tempo-client.ts # PAT認証を持つTempo APIクライアント
├── tools/ # ツールの実装
│ ├── get-worklogs.ts
│ ├── post-worklog.ts
│ ├── bulk-post.ts
│ └── delete-worklog.ts
└── types/ # TypeScriptの型定義
├── tempo.ts
├── mcp.ts
└── index.ts
ビルドコマンド
npm run build: TypeScriptをJavaScriptにコンパイル
npm run dev: ビルドしてサーバーを実行
npm run typecheck: コンパイルせずに型チェック
テスト
サーバーは、MCPインスペクターを使用するか、互換性のあるAIアシスタントと統合することでテストできます。
🔒 セキュリティ
- 安全な認証のために個人用アクセストークンが使用されます。
- 資格情報はログに記録されたり、公開されたりすることはありません。
- すべてのパラメーターに入力検証が行われます。
- レート制限とエラーハンドリングにより、APIの乱用から保護されます。
📄 API互換性
このサーバーは以下と互換性があります。
- JIRA Core/Software 8.14以降
- Tempo Timesheets 4.x
- Model Context Protocol仕様
⚠️ トラブルシューティング
セットアップの問題
サーバーが見つからない/パスの問題:
dist/index.jsの完全な絶対パスを使用していることを確認します。
- Windowsの場合:
C:\Users\YourName\tempo-filler-mcp-server\dist\index.js
- macOS/Linuxの場合:
/Users/YourName/tempo-filler-mcp-server/dist/index.js
- ファイルが存在することを確認します:
ls dist/index.js (ファイルが表示されるはず)
ビルド失敗:
- Node.jsのバージョンを確認します:
node --version (16以上である必要があります)
- キャッシュをクリアして再試行します:
npm cache clean --force && npm install && npm run build
- ビルド出力のエラーメッセージを確認します。
AIアシスタントがサーバーを読み込まない:
- 設定を追加した後、AIアシスタントを完全に再起動します。
- 設定ファイルの構文を確認します (有効なJSONである必要があります)
- 環境変数が正しく設定されていることを確認します。
認証の問題
- 個人用アクセストークンが有効で、適切な権限を持っていることを確認します。
- JIRAインスタンスのURLが正しいことを確認します。
- JIRAインスタンスにTempoが適切にインストールされ、設定されていることを確認します。
接続の問題
- JIRAインスタンスへのネットワーク接続を確認します。
- ファイアウォールとプロキシの設定を確認します。
- 環境からJIRAインスタンスにアクセスできることを確認します。
権限の問題
- 指定された課題に時間を記録する権限がユーザーアカウントにあることを確認します。
- Tempoがユーザーに時間を記録することを許可するように設定されていることを確認します。
- JIRAのプロジェクト権限を確認します。
📄 ライセンス
ISCライセンス - 詳細はpackage.jsonを参照してください。
🤝 コントリビューション
コントリビューションは大歓迎です!既存のコードスタイルに従い、すべてのツールが実際のTempo APIエンドポイントで正しく動作することを確認してください。