TimeTracker RX MCP
by nori1173-ops
README.md
# TimeTracker RX MCP サーバー
TimeTracker RX(デンソークリエイト社)の REST API を MCP(Model Context Protocol)サーバーとして公開するツールです。
Claude Code / Claude Desktop / Cursor 等の AI ツールから工数管理・プロジェクト管理・分析を直接操作できます。
**セキュリティポリシー: 「人のものを壊さない」** — 自分が管理するリソースのみ書き込みを許可し、他者のプロジェクト・ワークアイテムの破壊を防ぎます。
## バージョン履歴
最新版: **Ver1.09** (2026-06-26)
| Ver | 日付 | 主要変更 |
|---|---|---|
| **Ver1.09** | 2026-06-26 | `update_work_item` を日付更新・`clearSchedule` 対応に拡張(`planned_start_date`/`planned_finish_date`/`fields`/`clear_schedule`/`move_schedule_days`/`field_calc_types`/`assignment_change`/`propagate_to_children` 追加)、`work_item_id`→`work_item_ids` リネームで複数ID一括更新・クリア対応 |
| **Ver1.08** | 2026-06-26 | `create_project`/`update_project` を公式API準拠に引数拡張(plannedStartDate/plannedFinishDate/managerId/members/projectCategories/memberChange 等)、`copy_project` 追加、`get_project` に `includes` 追加 |
| **Ver1.07** | 2026-05-08 | master 系: `skip→offset` 命名統一 + レスポンス `data[]` アンラップ。time_entries 一覧に日付・プロジェクト等のサーバ側フィルタ追加 |
| **Ver1.06** | 2026-05-08 | acl の引数を公式 `ace`/`aceChange` 構造に再設計、analytics の body を公式 `filterBy`/`groups` 構造に再設計 |
| Ver1.05 | 2026-05-07 | `update_work_item` の `status_id` → `status_type_id` リネーム + `actual_progress` 引数追加 |
| Ver1.04 | 2026-04-27 | write 系 body を `{fields:{...}}` ラッパに統一 |
| Ver1.01〜1.02 | 2026-04-27 | OwnershipChecker のレスポンス形式対応 |
| Ver1.00 | 2026-04-20 | Python + FastMCP 初版リリース |
> **互換性ポリシー**: 公式 API 仕様準拠を最優先するため、minor bump (Ver1.0X) でも引数 rename・必須化等の破壊変更を含みます。引数の差分は `tests/test_contract.py` で自動検知されます。
## 機能一覧
### 認証(1)
| ツール名 | 説明 |
|---------|------|
| `get_me` | 自分のユーザー情報取得 |
### ユーザー参照(2)
| ツール名 | 説明 |
|---------|------|
| `list_users` | ユーザー一覧取得(読み取り専用) |
| `get_user` | ユーザー取得(読み取り専用) |
### タイムシート — 自分の工数操作(5)
| ツール名 | 説明 |
|---------|------|
| `list_time_entries` | 自分の実績工数一覧取得 |
| `get_time_entry` | 自分の実績工数取得 |
| `add_time_entry` | 自分の実績工数追加(他人のプロジェクトへの工数登録も可) |
| `update_time_entry` | 自分の実績工数更新 |
| `delete_time_entry` | 自分の実績工数削除 |
### タイムシート — 任意ユーザー参照(2)
| ツール名 | 説明 |
|---------|------|
| `list_user_time_entries` | 任意ユーザーの実績工数一覧取得(読み取り専用) |
| `get_user_time_entry` | 任意ユーザーの実績工数取得(読み取り専用) |
### プロジェクト(7)
| ツール名 | 説明 |
|---------|------|
| `list_projects` | プロジェクト一覧取得(全プロジェクト閲覧可) |
| `get_project` | プロジェクト取得(includes で Members/UserGroups/WorkCalendar を指定可) |
| `create_project` | プロジェクト作成(plannedStartDate/plannedFinishDate 等の公式項目・メンバー対応、管理者は未指定で自分) |
| `update_project` | プロジェクト更新(日付・メンバー変更等の公式項目対応、自分が管理者のPJのみ) |
| `copy_project` | 既存プロジェクトの設定・メンバーをコピーして新規作成 |
| `get_project_calendar` | プロジェクトカレンダー取得 |
| `get_project_profile` | プロジェクトプロファイル取得 |
### ワークアイテム(6)
| ツール名 | 説明 |
|---------|------|
| `list_sub_items` | サブアイテム一覧取得 |
| `get_work_item` | ワークアイテム取得 |
| `create_work_item` | ワークアイテム追加(自分が管理者のプロジェクトのみ) |
| `update_work_item` | ワークアイテム更新(予定日更新・clearSchedule によるクリア・複数ID一括対応、自分が管理者のプロジェクトのみ) |
| `delete_work_item` | ワークアイテム削除(自分が管理者のプロジェクトのみ、アトミック拒否) |
| `duplicate_work_item` | ワークアイテム複製(自分が管理者のプロジェクトのみ) |
### ACL — プロジェクト権限(4)
| ツール名 | 説明 |
|---------|------|
| `get_project_acl` | プロジェクト権限取得(全プロジェクト閲覧可) |
| `add_project_acl` | プロジェクト権限追加(自分が管理者のプロジェクトのみ) |
| `update_project_acl` | プロジェクト権限更新(自分が管理者のプロジェクトのみ) |
| `delete_project_acl` | プロジェクト権限削除(自分が管理者のプロジェクトのみ) |
### マスタ参照(7)
| ツール名 | 説明 |
|---------|------|
| `list_item_types` | アイテムタイプ一覧 |
| `list_status_types` | ステータスタイプ一覧 |
| `list_process_categories` | 工程分類一覧 |
| `list_time_entry_categories` | 作業分類一覧 |
| `list_field_types` | フィールドタイプ一覧 |
| `list_organizations` | 組織一覧 |
| `list_profiles` | プロファイル一覧 |
### 分析(3)
| ツール名 | 説明 |
|---------|------|
| `analyze_time` | 工数分析(全ユーザー対象可) |
| `analyze_item_counts` | アイテム件数分析(全ユーザー対象可) |
| `export_time_entries` | 実績工数エクスポート |
## セットアップ
### 前提条件
- Python 3.12 以上
- [uv](https://docs.astral.sh/uv/)(`curl -LsSf https://astral.sh/uv/install.sh | sh` などでインストール)
- TimeTracker RX の API キー(管理画面のユーザー設定から発行)
### インストール
MCP クライアントごとに最適な方式を使い分けます。
| 環境 | 方式 | 理由 |
|------|------|------|
| Claude Code (WSL/Linux/macOS) | uvx (on-demand) | 事前インストール不要、タグ変更即反映 |
| Cursor (Windows / macOS) | uvx (on-demand) | 同上 |
| Claude Desktop / Cowork (Windows MSIX) | pre-install | MSIX sandbox が spawn 子プロセスからの git fetch を拒否するため |
**uvx 方式(Claude Code / Cursor)**:
```bash
# 動作確認
TIMETRACKER_BASE_URL=https://your-server/TimeTrackerRX/ \
TIMETRACKER_API_KEY=your-key \
uvx --from git+https://github.com/nori1173-ops/timetracker-rx-mcp@Ver1.09 timetracker-rx-mcp
```
**pre-install 方式(Claude Desktop)**:
Windows PowerShell で事前にインストール:
```powershell
uv tool install git+https://github.com/nori1173-ops/timetracker-rx-mcp@Ver1.09 --force
```
インストール先: `%USERPROFILE%\.local\bin\timetracker-rx-mcp.exe`。以降は `timetracker-rx-mcp` コマンドとして実行可能。
**バージョン指定:**
- 本番利用: `@Ver1.09` のようにタグ固定を推奨(破壊変更から保護される)
- 開発版: `@master` で常に最新を追う(破壊変更の可能性あり)
**更新:**
- uvx 方式: `uv cache clean` で再取得
- pre-install 方式: `uv tool upgrade timetracker-rx-mcp --force`
### 環境変数
MCP 設定ファイルの `env` セクションで環境変数を指定します。
| 変数名 | 必須 | 説明 | 例 |
|--------|:---:|------|-----|
| `TIMETRACKER_BASE_URL` | 必 | TimeTracker RX の API ベース URL | `https://your-server/TimeTrackerRX/` |
| `TIMETRACKER_API_KEY` | 必 | ユーザーの API キー | `your-api-key` |
| `TIMETRACKER_TIMEOUT_MS` | 任 | リクエストタイムアウト(ミリ秒、既定 30000) | `60000` |
| `TIMETRACKER_SKIP_TLS_VERIFY` | 任 | 自己署名証明書向け TLS 検証スキップ(既定 false) | `true` |
### MCP 設定
全環境共通で `uvx --from git+https://github.com/nori1173-ops/timetracker-rx-mcp@Ver1.09 timetracker-rx-mcp` を呼び出します。
#### Claude Code(WSL/Linux/macOS)
`~/.claude.json` の `mcpServers` に追記します。
```json
{
"mcpServers": {
"timetracker-rx": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/nori1173-ops/timetracker-rx-mcp@Ver1.09",
"timetracker-rx-mcp"
],
"env": {
"TIMETRACKER_BASE_URL": "https://your-server/TimeTrackerRX/",
"TIMETRACKER_API_KEY": "your-api-key"
}
}
}
}
```
#### Claude Desktop / Cowork(Windows MSIX 環境)
MSIX sandbox で git fetch が失敗するため **pre-install 方式**を使います。事前に `uv tool install` を実行しておく必要があります(上記「インストール」参照)。
`%APPDATA%\Claude\claude_desktop_config.json` の `mcpServers` に追記:
```json
{
"mcpServers": {
"timetracker-rx": {
"command": "timetracker-rx-mcp",
"env": {
"TIMETRACKER_BASE_URL": "https://your-server/TimeTrackerRX/",
"TIMETRACKER_API_KEY": "your-api-key"
}
}
}
}
```
> 新バージョン(Ver1.01 等)リリース時は `uv tool upgrade timetracker-rx-mcp --force` を PowerShell で別途実行してください(Claude Desktop は自動更新されません)。
#### Cursor(Windows / macOS)
```json
{
"mcpServers": {
"timetracker-rx": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/nori1173-ops/timetracker-rx-mcp@Ver1.09",
"timetracker-rx-mcp"
],
"env": {
"TIMETRACKER_BASE_URL": "https://your-server/TimeTrackerRX/",
"TIMETRACKER_API_KEY": "your-api-key"
}
}
}
}
```
> 自己署名証明書の環境では `env` に `"TIMETRACKER_SKIP_TLS_VERIFY": "true"` を追加してください。
## セキュリティポリシー
**「人のものを壊さない」** — このルールはすべての実装に優先します。
| 操作 | 制限 |
|------|------|
| 閲覧(GET) | 全て許可。他者のリソースも読み取り可 |
| プロジェクト作成 | 管理者(managerId)は自分に自動設定 |
| プロジェクト更新 | 自分が管理者のプロジェクトのみ |
| ワークアイテム CRUD | 自分が管理者のプロジェクトのみ |
| ACL 変更 | 自分が管理者のプロジェクトのみ |
| タイムシート操作 | 自分のユーザー ID のみ(他者分は閲覧のみ可) |
| 分析(読み取り) | 全ユーザーのデータを含めて許可 |
| ユーザー管理 | 一覧・取得のみ実装(作成・更新・削除は除外) |
複数 ID の一括操作では、1 つでも権限のない対象が含まれる場合は操作全体を拒否します(アトミック拒否)。
## 開発
### セットアップ
```bash
uv sync --extra dev
```
### テスト
```bash
uv run pytest # 全テスト
uv run pytest --cov # カバレッジ付き
uv run pytest tests/test_ownership.py -v # 単一ファイル
```
### lint / format
```bash
uv run ruff check src/ tests/
uv run ruff format src/ tests/
```
### ローカル実行
```bash
export TIMETRACKER_BASE_URL=https://your-server/TimeTrackerRX/
export TIMETRACKER_API_KEY=your-key
uv run timetracker-rx-mcp
```
## 技術スタック
- Python 3.12+
- [mcp](https://github.com/modelcontextprotocol/python-sdk)(FastMCP)
- [httpx](https://www.python-httpx.org/)(HTTP クライアント、コネクションプール)
- [pydantic](https://docs.pydantic.dev/)(バリデーション)
- [uv](https://docs.astral.sh/uv/)(パッケージ管理)
- [ruff](https://docs.astral.sh/ruff/)(lint + format)
- pytest / pytest-asyncio / respx(テスト)
## アーキテクチャ
詳細は [Documents/DESIGN.md](Documents/DESIGN.md) を参照してください。
## ライセンス
MIT
## 免責事項
- 本プロジェクトはデンソークリエイト社とは無関係の非公式ツールです。
- TimeTracker RX の正規ライセンスが別途必要です。
- API の仕様変更により動作しなくなる可能性があります。
- 本ツールの使用により発生した損害について開発者は責任を負いません。
## 商標
「TimeTracker」はデンソークリエイト株式会社の登録商標です。
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues