Skip to main content
Glama
Growth-Management

trocco-mcp-tools

Official
README.md
# trocco-mcp-tools

TROCCO API を Model Context Protocol (MCP) から扱うためのツール群です。TROCCO workflow と BigQuery datamart の差分監査に必要な情報を取得し、ChatGPT から監査エージェントが SQL、出力先、更新方式、依存関係、リスク候補を整理できる状態を目指します。現在は読み取り系を中心にしつつ、datamart definition / datamart job については明示的な安全条件付きの操作系ツールも提供します。

## 現在の優先方針

現在の最優先は、実監査そのものではなく、この TROCCO MCP server を ChatGPT から追加・接続できる状態にすることです。

進め方:

1. Cloud Run などに HTTP MCP endpoint を deploy する
2. `TROCCO_API_KEY` を安全に server 側へ注入する
3. ChatGPT から MCP server を追加する
4. ChatGPT から `build_workflow_audit_payload` を呼べることを確認する
5. 以後の監査は ChatGPT から MCP tool を利用して実行する

## 目的

このリポジトリでは、TROCCO と BigQuery を使った差分監査を支援するため、次の情報を MCP ツール経由で取得します。

- workflow の基本情報
- workflow task 一覧
- task dependency 一覧
- TROCCO BigQuery datamart task の definition id
- datamart SQL
- datamart の出力先 dataset / table
- write_disposition、incremental_column、merge_keys、lookback_period などの更新設定
- SQL から推定した source table / destination / write disposition
- resolved destination / resolved write disposition
- risk flags
- downstream references

初期段階では監査に必要な読み取り系を主軸にし、操作系は BigQuery datamart definition と datamart job に限定します。workflow definition create/update と transfer definition create/update は、task/dependency 破壊リスクや connector 種別差が大きいため第2弾以降の対象です。

## 実装構成

- Runtime: Node.js 20+
- Language: TypeScript
- MCP framework: `@modelcontextprotocol/sdk`
- Validation: `zod`
- Stdio entry point: `src/index.ts`
- HTTP entry point: `src/http.ts`
- Shared MCP server factory: `src/server.ts`
- TROCCO API client: `src/troccoClient.ts`
- SQL analysis: `src/sqlAnalysis.ts`
- Audit model: `src/auditModel.ts`
- SQL inventory model: `src/inventoryModel.ts`
- HTTP smoke test: `scripts/smoke-http.mjs`
- Datamart action smoke test: `scripts/smoke-datamart-actions.mjs`

## Transport

この repository では 2 種類の起動方式を持ちます。

- stdio: Cloud Shell やローカルでの検証用
- Streamable HTTP: ChatGPT / Cloud Run 接続用

HTTP endpoint:

- `GET /status`: status check
- `POST /mcp`: MCP Streamable HTTP endpoint

`MCP_AUTH_TOKEN` を設定した場合、`POST /mcp` は `Authorization: Bearer <token>` または `x-mcp-auth-token: <token>` を要求します。

## 既定の監査対象

明示指定がない場合、監査エージェントは次の workflow を既定対象として扱います。

- `pipeline_definition_id=3847`
- `SH_PLUS_BQ_RAISE_data_daily_new`

## 環境変数

TROCCO API 接続に必要な認証情報は環境変数から読み込みます。

- `TROCCO_API_KEY`: TROCCO API key
- `TROCCO_BASE_URL`: TROCCO API base URL。未指定時は `https://trocco.io` を使います
- `PORT`: HTTP server port。Cloud Run では自動設定されます
- `MCP_AUTH_TOKEN`: HTTP MCP endpoint 用の bearer token
- `MCP_ENDPOINT`: smoke test 用 MCP endpoint URL
- `PIPELINE_DEFINITION_ID`: smoke test 用 workflow id。未指定時は `3847`
- `DATAMART_JOB_ID`: datamart action smoke test 用 job id。未指定時は `1`

TROCCO API は `Authorization: Token {{API KEY}}` 形式の header で認証します。

## セットアップ

```bash
npm install
npm run build
```

stdio server を起動します。

```bash
TROCCO_API_KEY=... npm run start:stdio
```

HTTP server を起動します。

```bash
TROCCO_API_KEY=... MCP_AUTH_TOKEN=... npm run start:http
```

status check:

```bash
curl http://localhost:8080/status
```

## Cloud Run deployment

Secret Manager に TROCCO API key を保存します。

```bash
printf '%s' '<TROCCO_API_KEY>' | gcloud secrets create trocco-api-key --data-file=-
```

MCP endpoint 用 token は `trocco-mcp-auth-token` として保存済みの前提です。未作成の場合だけ次を実行します。

```bash
openssl rand -hex 32 | gcloud secrets create trocco-mcp-auth-token --data-file=-
```

Cloud Run に deploy します。

```bash
gcloud run deploy trocco-mcp-tools \
  --source . \
  --region asia-northeast1 \
  --allow-unauthenticated \
  --set-secrets TROCCO_API_KEY=trocco-api-key:latest,MCP_AUTH_TOKEN=trocco-mcp-auth-token:latest
```

Deploy 後に確認します。

```bash
curl https://<cloud-run-url>/status
```

ChatGPT に追加するときの MCP endpoint は次です。

```text
https://<cloud-run-url>/mcp
```

ChatGPT 側の connector 設定では、`trocco-mcp-auth-token` と同じ値を bearer token として設定してください。

## HTTP smoke test

Cloud Run deploy 後、ChatGPT に追加する前に MCP client で疎通確認します。

```bash
export MCP_ENDPOINT="https://<cloud-run-url>/mcp"
export MCP_AUTH_TOKEN="$(gcloud secrets versions access latest --secret=trocco-mcp-auth-token)"
npm run smoke:http
```

期待する summary:

```json
{
  "ok": true,
  "check": "build_workflow_audit_payload",
  "pipeline_definition_id": 3847,
  "payload_ok": true,
  "workflow_name": "SH_PLUS_BQ_RAISE_data_daily_new",
  "datamart_count": 31,
  "datamart_error_count": 0
}
```

Datamart action tools の一覧確認をします。

```bash
export MCP_ENDPOINT="https://<cloud-run-url>/mcp"
export MCP_AUTH_TOKEN="$(gcloud secrets versions access latest --secret=trocco-mcp-auth-token)"
npm run smoke:actions
```

この smoke test は `get_datamart_job_status` の guarded response も確認します。`create_datamart_definition` や `update_datamart_definition` の実 write は実行しません。

## Inspector / local verification

Inspector で stdio server を確認します。

```bash
TROCCO_API_KEY=... npm run build
TROCCO_API_KEY=... npm run inspector
```

Cloud Shell などで Inspector proxy が扱いづらい場合は、MCP SDK client から stdio server を直接呼び出して確認します。

## MCP tools

SQL資産棚卸しでは、巨大な `build_workflow_audit_payload` を展開せず、次の順で小さく取得します。

1. `list_workflow_datamarts`
2. `get_datamart` または `get_datamarts`
3. 必要に応じて `analyze_datamart_sql`
4. `search_keys` を使ったGitHub/dbtモデル検索

### `get_workflow`

指定した workflow の構造を取得します。

TROCCO endpoint:

- `GET /api/pipeline_definitions/{pipeline_definition_id}`

Input:

```json
{
  "pipeline_definition_id": 3847
}
```

### `get_datamart`

指定した datamart definition をSQL資産棚卸し用の標準形式で取得します。`pipeline_definition_id` を指定すると、Workflow上の直接上流Datamartも `dependencies.workflow_nodes` に含めます。`include_query: false` ではSQL全文を省略し、`include_raw: true` のときだけTROCCO APIの生レスポンスを含めます。

TROCCO endpoint:

- `GET /api/datamart_definitions/{datamart_definition_id}`

Input:

```json
{
  "datamart_definition_id": 12345,
  "pipeline_definition_id": 3847,
  "include_query": true
}
```

### `list_workflow_datamarts`

Workflowのtask順を保ってDatamart IDと名前だけを軽量取得します。引数省略時は最大50件を返し、`limit` / `offset` でページングできます。`execution_order` はWorkflowの `tasks[]` における1始まりの位置です。SQL全文は返しません。一部のnodeを解析できない場合も有効な結果は保持し、`warnings` に対象node付きで記録します。

```json
{
  "pipeline_definition_id": 3847,
  "limit": 50,
  "offset": 0
}
```

### `get_datamarts`

最大5件を小規模batchで取得します。一部失敗時も成功結果は `datamarts` に残り、失敗は `datamart_errors` に対象ID付きで返ります。

```json
{
  "datamart_definition_ids": [8251, 8269],
  "pipeline_definition_id": 3847,
  "include_query": false
}
```

### `analyze_datamart_sql`

SQLから `source_tables`、`ctes`、特徴的な `sql_identifiers`、destination候補、write mode候補、優先度付き `search_keys` を返します。

```json
{
  "query": "select * from `project.dataset.source_table`",
  "datamart_definition_id": 8251,
  "name": "example_datamart",
  "destination_fqtn": "project.dataset.example_table"
}
```

### `build_workflow_audit_payload`

指定した workflow と、その配下の BigQuery datamart definition をまとめて取得します。監査コメント生成の入力 payload として使う統合 tool です。

Input:

```json
{
  "pipeline_definition_id": 3847
}
```

Output の主な項目:

```json
{
  "ok": true,
  "pipeline_definition_id": 3847,
  "workflow_name": "SH_PLUS_BQ_RAISE_data_daily_new",
  "workflow": {},
  "datamarts": [
    {
      "definition_id": 12345,
      "name": "example_datamart",
      "destination_dataset": "dataset",
      "destination_table": "table",
      "write_disposition": "append",
      "sql_analysis": {},
      "resolved_destination": {},
      "resolved_write_disposition": {},
      "risk_flags": [],
      "downstream_references": []
    }
  ],
  "datamart_errors": []
}
```

### `create_datamart_definition`

datamart definition を作成します(2026-09拡張で bigquery/snowflake/databricks/redshift に対応。`data_warehouse_type` を省略、または `"bigquery"` を指定した場合は拡張前と完全に同じ動作です)。操作系 tool のため、`confirm: true` と `create_reason` が必須です。他の warehouse を使う場合は `data_warehouse_type` と対応する `datamart_snowflake_setting` / `datamart_databricks_setting` / `datamart_redshift_setting` を指定してください(bigquery のみ Terraform provider で検証済み。他は公式APIドキュメントのみに基づくbest-effort — 詳細は [docs/api-coverage.md](docs/api-coverage.md))。`is_runnable_concurrently` は TROCCO API 側で全 warehouse type 共通の必須項目のため、この tool でも必須入力です(省略すると 500 "Unknown error occurred" になっていたため2026-09に追加)。

TROCCO endpoint:

- `POST /api/datamart_definitions`

Input example:

```json
{
  "name": "SH_PLUS_AGGREGATION_example",
  "description": "example aggregation datamart",
  "is_runnable_concurrently": false,
  "datamart_bigquery_option": {
    "bigquery_connection_id": 345,
    "query": "select 1 as id",
    "destination_dataset": "dataset_aggregation_tables",
    "destination_table": "example_table",
    "write_disposition": "truncate",
    "partitioning": "time_unit_column",
    "partitioning_time": "DAY",
    "partitioning_field": "date_jst"
  },
  "confirm": true,
  "create_reason": "Create a new AGGREGATION datamart for the audited SOURCE->AGGREGATION flow."
}
```

### `run_datamart_job`

既存の datamart definition を実行します。操作系 tool のため、`confirm: true` と `run_reason` が必須です。

TROCCO endpoint:

- `POST /api/datamart_jobs`

Input example:

```json
{
  "datamart_definition_id": 12345,
  "confirm": true,
  "run_reason": "Validate the new datamart definition after review."
}
```

### `update_datamart_definition`

既存の datamart definition の一部設定を更新します(2026-09拡張で全 warehouse に対応。`data_warehouse_type` を省略した場合は現在のリソースの値から自動判定し、bigquery であれば拡張前と完全に同じ動作です)。操作系 tool のため、`confirm: true` と `change_reason` が必須です。

TROCCO endpoint:

- `PATCH /api/datamart_definitions/{datamart_definition_id}`

Input example:

```json
{
  "datamart_definition_id": 12345,
  "patch": {
    "write_disposition": "truncate",
    "partitioning": "time_unit_column",
    "partitioning_time": "DAY",
    "partitioning_field": "date_jst"
  },
  "expected_current": {
    "write_disposition": "append"
  },
  "confirm": true,
  "change_reason": "Align write mode with the SOURCE->AGGREGATION audit policy."
}
```

## Action tool safety

操作系 tool は、監査支援のために限定的に提供します。

- `confirm: true` がない入力は schema validation で拒否されます
- `create_reason` / `change_reason` / `run_reason` / `delete_reason` のいずれかを必須にします
- create/update の option は基本的に allowlist された項目のみ受け付けます(`.passthrough()` としているものは、未知フィールドをそのまま通す代わりに型チェックは限定的です — 詳細は各 schema ファイル参照)
- `update_*` 系 tool は `expected_current` が指定され、現在値と一致しない場合は PATCH を送信しません(`conflict` エラー)
- `delete_*` 系 tool(2026-09拡張)は GET → 存在確認 → 任意で `expected_name`/`expected_current` 照合 → confirm/reason 確認 → DELETE の順で安全に削除します
- secret になり得るフィールド(password/secret/client_secret/access_token/refresh_token/api_key/private_key/private_key_id/service_account_json[_key]/aws_secret_access_key/credentials/token に一致するキー)は、すべての TROCCO API レスポンス(成功・エラー詳細とも)から再帰的に `"[REDACTED]"` に置換されます(`src/security.ts` の `redactSecrets`)
- Users / Teams / Resource Groups の CRUD は対象外です(`resource_group_id` 等の参照フィールド自体は他リソースで通常通り扱います)

追加の運用メモは `docs/definition-actions.md` および 2026-09拡張の全 Tool 対応表は [docs/api-coverage.md](docs/api-coverage.md) を参照してください。

## 拡張された Tool 群 (2026-09)

上記の11 tool(既存)に加えて、Users/Teams/Resource Groups を除く TROCCO API を広くカバーする 36 の新規 Tool を追加しました。各ドメインの schema/tool 実装は `src/*Schemas.ts` / `src/*Tools.ts`(フラット配置、既存の `auditModel.ts` 等と同じ camelCase 命名規則)にあります。

- **転送ジョブ**: `run_transfer_job`, `get_transfer_job`, `list_transfer_jobs`
- **転送設定**: `list_job_definitions`, `get_job_definition`, `create_job_definition`, `update_job_definition`, `delete_job_definition`
- **データマート**(既存3 tool に追加): `list_datamart_definitions`, `delete_datamart_definition`
- **ワークフロージョブ**: `run_pipeline_job`, `get_pipeline_job`
- **ワークフロー定義**: `list_pipeline_definitions`, `create_pipeline_definition`, `update_pipeline_definition`(汎用PATCH), `delete_pipeline_definition`
- **接続情報**: `list_connections`, `get_connection`, `create_connection`, `update_connection`, `delete_connection`
- **ラベル**: `list_labels`, `get_label`, `create_label`, `update_label`, `delete_label`
- **dbt**: `list/get/create/update/delete_dbt_git_repository`, `list/get/create/update/delete_dbt_job_definition`

`patch_workflow_tasks`(既存)はキュレーションされた安全なタスク種別が `databricks_data_check` / `redshift_data_check` / `snowflake_data_check` / `tableau_extract` / `http_request` まで拡張されました(従来の `bigquery_data_check` / `if_else` / `slack_notify` は動作不変)。`trocco_transfer` 等の別リソースを実行してしまうタスク種別は今回も対象外のままです — それらは `update_pipeline_definition` を使ってください。

完全な API 対応表(公式56操作のうち41対象・全実装・未対応理由)は [docs/api-coverage.md](docs/api-coverage.md) を参照してください。

## SQL analysis

`sql_analysis` は SQL コメントを除去したうえで、監査に必要な最低限の候補を抽出します。

- `from` / `join` から source table 候補を抽出
- `with ... as` から CTE 名を抽出し、source table 候補からCTE参照を除外
- GitHub検索候補としてDatamart名、destination、source、CTE、SQL identifierを優先度順に生成
- `create or replace table` / `insert into` / `insert <table>` / `delete from` / `merge` から destination 候補を抽出
- `delete from` と `insert` の組み合わせを `delete_insert` として推定
- `merge` を `merge` として推定
- destination と source が同じ table の場合に `destination_also_used_as_source` を `true` にする

高度な SQL lineage parser ではないため、確定値ではなく監査用の候補値として扱います。

## Resolved audit fields

`resolved_destination` は、API metadata と SQL 推定を分けて扱います。

- API の `destination_dataset` / `destination_table` があれば `source = api`
- API destination がなく SQL 内 destination があれば `source = sql_inferred`
- どちらもなければ `source = unknown`

`resolved_write_disposition` は、API の `write_disposition` を優先しつつ、SQL 推定値も保持します。

- API の `write_disposition` があれば `source = api`
- API 値がなく SQL 推定値があれば `source = sql_inferred`
- どちらもなければ `unknown`

## Risk flags

現在の実装では、次の `risk_flags` を返します。

- `missing_api_destination`: API metadata に destination がない
- `sql_destination_inferred`: SQL から destination を推定した
- `destination_also_used_as_source`: destination と source が同じ table の可能性がある
- `api_write_disposition_but_sql_destination_unknown`: API write_disposition はあるが SQL から destination が取れない
- `write_disposition_mismatch`: API と SQL 推定の write_disposition が食い違う

## Downstream references

`downstream_references` は、ある datamart の resolved destination が、別 datamart の `sql_analysis.source_tables` に含まれる場合に返します。workflow dependency と合わせて確認することで、後続参照や依存漏れの監査に使います。

## Error payload

MCP tool は失敗時も JSON text として次の形を返します。

```json
{
  "ok": false,
  "error": {
    "code": "auth_error",
    "message": "TROCCO API authentication failed. Check TROCCO_API_KEY.",
    "status": 401,
    "endpoint": "https://trocco.io/api/...",
    "detail": {}
  }
}
```

Error code:

- `config_error`: `TROCCO_API_KEY` が未設定
- `auth_error`: 401 / 403
- `not_found`: 404。workflow または datamart が存在しない、もしくは権限がない
- `api_error`: その他の HTTP error
- `network_error`: TROCCO API に接続できない
- `validation_error`: 400 / 422、または `confirm`/reason 未指定、または zod schema 不一致(2026-09拡張で追加)
- `conflict`: 409、または `expected_current` が現在値と一致しない(2026-09拡張で追加)
- `rate_limit_exceeded`: 429(2026-09拡張で追加。GET は `Retry-After` を尊重して自動リトライ、POST/PATCH/DELETE はジョブ二重実行を避けるため自動リトライしない)
- `permission_error` / `timeout` / `unsupported`: 予約済み(2026-09拡張で `TroccoErrorCode` に追加。`timeout` はリクエストが `TROCCO_TIMEOUT_MS`(既定30秒)を超えた場合に使用)

## 次の確認ステップ

1. Cloud Run に最新の branch を deploy する
2. `/status` と `/mcp` の認証を確認する
3. `npm run smoke:http` を実行する
4. `npm run smoke:actions` を実行する
5. ChatGPT に `https://<cloud-run-url>/mcp` を追加する
6. ChatGPT から `build_workflow_audit_payload` を実行し、監査に進む

TDQS

B3.2/5.0

Scored across 2 tools

Disambiguation5/5

Both tools target distinct resources (datamart vs workflow) with no overlapping functionality, making them easily distinguishable.

Naming Consistency5/5

Both tools follow the consistent verb_noun pattern (get_datamart, get_workflow), providing predictability.

Tool Count2/5

Only two tools for a server named 'trocco-mcp-tools' is very limited; likely insufficient for a data platform's typical operations.

Completeness2/5

Only read operations (get) are provided; missing create, update, delete, and other lifecycle operations, leaving significant gaps.

Maintenance

ActivityMaintained
ResponsivenessWithin a week