axis-mcp
README.md
# Axis MCP Server
Axis(チーム向け行動管理ツール)のデータを Claude に丸ごと理解させる MCP サーバー。
**Claude Code / Claude Desktop / claude.ai (Web) の3クライアントすべて**から接続できる。
- ローカル利用(Code / Desktop): **stdio** トランスポート(ホスティング不要)
- どこからでも利用(特に claude.ai Web): **Streamable HTTP** トランスポート + Bearer トークン認証(公開HTTPSにデプロイ)
接続すると Claude が「今日のタスク・ゴール階層・KPI進捗・期日・担当」を把握した状態で会話できる。
---
## セットアップ
```bash
cd axis-mcp
npm install
# .env を用意(下記「環境変数」参照)— 特に service_role キーは最新の有効なものに
npm run build
```
### 環境変数(.env)
| Key | 必須 | 説明 |
|-----|------|------|
| `AXIS_SUPABASE_URL` | ✅ | Supabase プロジェクト URL(例: `https://trqpkkxugbqkvxsxmdfh.supabase.co`) |
| `AXIS_SUPABASE_SERVICE_ROLE_KEY` | ✅ | Supabase service_role キー。**Axis本体(goal-os)と同一プロジェクト**(`trqpkkxugbqkvxsxmdfh`)なので、`goal-os/.env.local` の `SUPABASE_SERVICE_ROLE_KEY` の値をそのままコピーすればよい(ダッシュボード不要)。古いキーだと `Invalid API key` になる |
| `AXIS_DEFAULT_TEAM_ID` | 任意 | 既定チームID。設定すると Claude が team_id を指定せずツールを呼べる |
| `AXIS_DEFAULT_USER_ID` | 任意 | 既定ユーザーID(今日のタスクなどの主体) |
| `MCP_TRANSPORT` | 任意 | `stdio`(既定) or `http` |
| `MCP_BEARER_TOKEN` | http時必須 | HTTP接続の認証トークン(各クライアントが `Authorization: Bearer` で送る) |
| `MCP_PORT` | 任意 | HTTPポート(既定 8787) |
| `MCP_READONLY` | 任意 | `1` で書き込み系ツールを無効化(閲覧専用にする) |
| `AXIS_MEMBER_TOKENS` | メンバー運用時 | メンバー別トークンの JSON 配列(下記「メンバーにも使わせる」参照) |
> このチームの既定値: `AXIS_DEFAULT_TEAM_ID=db544bee-cae2-4310-9510-7c8193a3aa3e`(マイチーム)/ `AXIS_DEFAULT_USER_ID=694aae26-94e3-4e3c-a6a3-461f17d0d388`(弘中颯人)
---
## 接続方法
### 1) Claude Code(ローカル・stdio)
```bash
claude mcp add axis --command node --args /Users/hironakahayato/axis-mcp/dist/index.js
# もしくは設定ファイル ~/.claude/mcp.json に直接記載
```
### 2) Claude Desktop(ローカル・stdio)
`~/Library/Application Support/Claude/claude_desktop_config.json`:
```json
{
"mcpServers": {
"axis": {
"command": "node",
"args": ["/Users/hironakahayato/axis-mcp/dist/index.js"],
"env": {
"AXIS_SUPABASE_URL": "https://trqpkkxugbqkvxsxmdfh.supabase.co",
"AXIS_SUPABASE_SERVICE_ROLE_KEY": "(有効なservice_roleキー)",
"AXIS_DEFAULT_TEAM_ID": "db544bee-cae2-4310-9510-7c8193a3aa3e",
"AXIS_DEFAULT_USER_ID": "694aae26-94e3-4e3c-a6a3-461f17d0d388"
}
}
}
}
```
### 3) claude.ai(Web・リモートHTTP)※ Pro 以上が必要
まず公開HTTPSにデプロイする。リポジトリに **Render Blueprint(`render.yaml`) / Railway(`railway.json`) / `Dockerfile`** を同梱済みなので、ほぼワンクリック。
**Render(推奨・無料枠):**
1. [render.com](https://render.com) → New + → **Blueprint** → このリポジトリを選択
2. `render.yaml` が読まれる。デプロイ時に入力を求められる env:
- `AXIS_SUPABASE_SERVICE_ROLE_KEY` … goal-os と同じ service_role キー
- `MCP_BEARER_TOKEN` … Render が自動生成(控えておく)
3. デプロイ完了 → `https://axis-mcp-xxxx.onrender.com` が公開URL。`/health` で疎通確認。
**Railway:** New Project → Deploy from repo → `Dockerfile`/`railway.json` 自動検出 → Variables に `AXIS_SUPABASE_URL` / `AXIS_SUPABASE_SERVICE_ROLE_KEY` / `MCP_BEARER_TOKEN` / `MCP_TRANSPORT=http` / `AXIS_DEFAULT_TEAM_ID` / `AXIS_DEFAULT_USER_ID` を設定。
**ローカルで試すだけ:**
```bash
MCP_TRANSPORT=http MCP_BEARER_TOKEN=(長いランダム文字列) npm start
# → http://localhost:8787/mcp
```
**claude.ai 側の接続:** 設定 → コネクタ → **カスタムコネクタを追加**:
- URL: `https://<your-host>/mcp`
- 認証: Bearer トークンに `MCP_BEARER_TOKEN` の値を貼る
同じHTTPSエンドポイントは Claude Code / Desktop からも使える:
```bash
claude mcp add axis --transport http --url https://<your-host>/mcp \
--header "Authorization: Bearer (MCP_BEARER_TOKEN)"
```
---
## メンバーにも使わせる(チーム展開)
各メンバーが自分の Claude(claude.ai / Desktop / Code)を繋いで「自分のタスク・自分視点」で使える。
**仕組み**: メンバーごとに個人トークンを発行 → サーバーが `Authorization: Bearer <token>` から「誰か」を判定し、その人視点でデータを返す(非owner は他人の private ゴールが見えない/今日のタスクは自分のぶんのみ=Axis本体と同じ振る舞い)。
1. **トークンを env に設定**(HTTPデプロイ時のサーバー env):
```
AXIS_MEMBER_TOKENS=[{"token":"axis_xxx","user_id":"<uuid>","name":"山本将来","is_owner":false}, ...]
```
- `is_owner:true` のトークンは全体閲覧+`list_teams`可。`false` は本人スコープ+privacy制限。
- (このチームの全メンバー分は発行済み。配布用一覧は `goal-os/outputs/axis-mcp-tokens.md`。※秘密情報なのでGit管理しない)
2. **各メンバーがコネクタ登録**: claude.ai → 設定 → コネクタ → カスタムコネクタ →
- URL: `https://<your-host>/mcp`
- 認証: 自分のトークンを Bearer に貼る
3. これで「axisで今日の自分のタスク見せて」が各自のClaudeで動く。
> トークンの無効化=env から該当行を消して再デプロイ。`MCP_BEARER_TOKEN`(管理者トークン)は owner 全権として併用可。
## 利用可能なツール(18個)
### 発見・閲覧(read)
| ツール | 説明 |
|--------|------|
| `whoami` | 既定チーム/ユーザーと今日の日付を返す(起点) |
| `list_teams` | チーム一覧とメンバー(team_id 特定用) |
| `get_goal_tree` | **ゴールを階層ツリーで取得(全体像把握に最適)** |
| `get_goals` | ゴール一覧(status/phase/担当者でフィルタ。アーカイブ配下は除外) |
| `get_goal_detail` | ゴール詳細(KPI・サブゴール・成果物・コメント数) |
| `search_goals` | キーワードでゴール検索 |
| `get_today_tasks` | 今日のToDo一覧 |
| `get_kpi_progress` | KPI進捗(達成率付き、アーカイブ除外) |
| `get_overdue_goals` | 期日超過ゴール(アーカイブ除外) |
| `get_phase_summary` | フェーズ(四半期)サマリー |
| `get_team_members` | チームメンバー一覧 |
| `get_vision` | 年間目標(ビジョン) |
| `get_comments` | ゴールのコメントスレッド |
### 書き込み(write・`MCP_READONLY=1` で無効化可)
| ツール | 説明 |
|--------|------|
| `add_today_task` | 今日のToDoにタスク追加 |
| `complete_task` | タスクを完了に |
| `complete_goal` | ゴールを完了に(子孫連動) |
| `update_kpi_value` | KPI現在値を更新 |
| `add_comment` | ゴールにコメント追加 |
> アーカイブ済みサブツリーの除外ロジックは Axis 本体の `getArchivedSubtreeGoalIds` と同等。
---
## 開発
```bash
npm run dev # stdio(ホットリロード)
npm run dev:http # Streamable HTTP(要 MCP_BEARER_TOKEN)
npm run build # TypeScript ビルド
npm start # stdio で起動
npm run start:http # HTTP で起動
```
ヘルスチェック: `GET /health` → `{"ok":true,"service":"axis-mcp"}`
## ライセンス
MIT
TDQS
B3.2/5.0
Scored across 13 tools
Disambiguation5/5
各ツールは明確に異なる目的を持つ。コメント、ゴール、タスク、KPI、通知、メンバー、ビジョンと、操作対象がよく分かれており、エージェントが誤選択する可能性は低い。
Naming Consistency4/5
全体的にget_xxxとadd_xxx/complete_xxxの動詞+名詞パターンで統一されており、混乱は少ない。ただしcomplete_goalとcomplete_taskの対象の違いは明示されているが、add_commentのみadd_で他がget_系なので若干の不統一がある。
Tool Count5/5
13個のツールは、目標管理・タスク管理・KPI追跡・通知・チーム情報をカバーするのに適切な数であり、過不足は感じられない。
Completeness4/5
ゴール・タスク・KPI・コメントの参照と更新(完了、コメント追加)が揃っている。ただし、タスクの作成・更新・削除や、ゴールの作成・更新がなく、CRUDが完全ではないため、ややギャップがある。
Maintenance
ActivityStale
ResponsivenessNo issues