この記事は自社ブログ(nands.tech)の要約版です
はじめに
僕は普段、生成AIに「答えを出す」段階だけで終わってしまうのをなんとか現場で「実行まで持っていく」形にする仕事をしています。この記事は Claude Code と MCP を組み合わせて、実際に外部サービスを操作するワークフローを最短で試せるように実践的に整理したものです。手を動かすためのコマンド例・小さなコードスニペットを多めに載せています。まずはローカルで確かめてみましょう。
要点(超短縮)
- Claude Code はアーティファクトから MCP コネクタを呼ぶ形で外部操作する
- viewer_id(誰のコンテキストか)を必ず伝搬する
- Claude Code 2.1.215 以降は /verify や /code-review を自動実行しないので必要なら明示的に呼ぶ
- 小さく試してログを取り、段階的に本番へ
ステップ一覧(やること)
- 前提の権限・UI確認(Artifacts が使えるか)
- MCP 側でコネクタを正しく作る(認証情報登録)
- アーティファクト/マニフェストにコネクタ宣言を追加
- viewer 単位の認可(OAuth)を実装してトークンを保管
- MCP 経由でベクトル検索や API 呼び出しを叩いてみる
- /verify と /code-review を明示的に回してから実行
- ログ・レート制限・カナリアで安全運用
以下、各ステップを実際に動かせるコマンドやコードで解説します。
ステップ1:まずは「触れるか」を確認(5分チェック)
- 管理コンソールで Artifacts 作成UIが見えるか確認
- Artifacts 作成を UI で試してみる(テスト名で OK)
実行例(API で最小作成):
curl -sS -X POST "https://claude.example/api/artifacts" \
-H "Authorization: Bearer $CLAUDE_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"quick-mcp-test","connectors":["dummy"],"description":"test"}' \
| jq .
エラーが返るときは権限(artifact:create)か MCP 側の設定が怪しいので管理者に問い合わせる。
ステップ2:MCP 側でコネクタを作る(実戦)
- プロバイダ側で OAuth アプリ登録(必要なら)
- MCP のダッシュボードに client_id / secret または API キーを登録
- 最低限「接続テスト」ボタンで成功を確認
MCP にコネクタを登録する curl 例:
curl -sS -X POST "https://mcp.example/api/connectors" \
-H "Authorization: Bearer $MCP_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "slack-bot",
"type": "http",
"config": {"client_id":"xxxx","client_secret":"yyyy","scopes":["chat:write"]}
}' | jq .
ローカル開発用には .env を作って
MCP_ADMIN_TOKEN=xxxx
MCP_CLIENT_ID=xxxx
MCP_CLIENT_SECRET=yyyy
.gitignore を忘れずに。
ステップ3:アーティファクトのマニフェストにコネクタを宣言する
- マニフェストに connectors と secrets の紐付けを入れる
- マニフェストはデプロイ前に構文チェックする
artifact.json の例:
{
"name":"invoice-processor",
"version":"0.1.0",
"connectors": ["slack-bot","vectordb"],
"secrets": {
"slack-bot": "secret_slack_prod",
"vectordb": "secret_vectordb_prod"
}
}
構文チェック:
jq . artifact.json >/dev/null || echo "invalid JSON"
ステップ4:viewer 単位の認可フロー(ユーザーの権限で実行)
- 各ユーザーごとに OAuth を回してトークンを保存する
- state を Redis/DB に保持して CSRF 対策を行う
認可開始 URL 生成(例):
const state = uuidv4(); // 保存する
const url = `https://mcp.example/oauth/authorize?response_type=code&client_id=${CLIENT_ID}&redirect_uri=${ENCODED_REDIRECT}&scope=actions&state=${state}`;
コールバックでトークン交換(bash 例):
curl -sS -X POST "https://mcp.example/oauth/token" \
-u "${CLIENT_ID}:${CLIENT_SECRET}" \
-d "grant_type=authorization_code&code=${CODE}&redirect_uri=${REDIRECT_URI}" | jq .
取得した access_token / refresh_token は DB に暗号化して保存。定期的に expires_at を見て refresh を回す自動ジョブを用意する。
ステップ5:MCP 経由でベクトル検索や外部 API を叩く(実践)
- コネクタ経由で一つ機能を動かしてみる(例:ベクトルDB検索→スニペット取得)
ベクトル検索実行の最小例:
curl -sS -X POST "https://mcp.example/api/execute" \
-H "Authorization: Bearer $MCP_EXEC_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"viewer_id":"user:hiro",
"connector":"vectordb",
"action":"search",
"params":{"q":"請求書テンプレート", "top_k":5}
}' | jq .
結果から snippet と source を取り出す例:
curl ... | jq '.results[] | {id:.id, score:.score, snippet:.snippet, url:.source}'
ステップ6:/verify と /code-review を明示的に使う(安全ゲート)
- Claude Code 2.1.215 以降、自動で /verify / /code-review は走らない。実行前に必ず手動で呼び出してチェックする
- 出力は必ずファイル保存して追跡可能にする
/verify 呼び出し(対話例):
/verify
artifacts: [manifest.json, build.tar.gz]
checks: [schema, deps, signatures]
実行ログを保存:
echo "$VERIFY_OUTPUT" > claude_verify_$(date -Iseconds).txt
/code-review の活用例:
- セキュリティや入力検証だけを重点的に見るようにプロンプトで指示する
- 指摘事項は Issue に自動登録するワークフローを作ると運用が楽
ステップ7:運用で死なないための監視/制御
- 監査ログを必須化して必ず外部に送る
- レート制限は MCP 側、あるいは前段の API Gateway / Nginx で実装
- カナリア(5〜10%)で段階展開、失敗時に自動ロールバック
監査ログ送信の例:
curl -sS -X POST "https://logs.example/ingest" \
-H "Authorization: Bearer $LOG_TOKEN" \
-H "Content-Type: application/json" \
-d '{"event":"mcp-call","viewer":"user:hiro","connector":"vectordb","status":"ok"}'
簡易リトライ(指数バックオフ)の例:
for i in 0 1 2 3; do
curl -sS ... && break
sleep $((2**i))
done
おわりに(まずやることリスト)
- 管理コンソールで Artifacts 作成ができるかを確認する(ステップ1)
- MCP にテストコネクタを作り、簡単な execute を叩く(ステップ2/5)
- 1ユーザーで OAuth フローを回して token 取得を確認する(ステップ4)
- /verify を手動で一回実行して出力を保存する(ステップ6)
- 最後にログ受信エンドポイントへ簡単なイベントを送ってみる(ステップ7)
僕の実作業では、まずローカルの curl と jq で順番に確かめてから、CI に組み込む流れにしました。手順どおりにやれば、生成AI が「答えるだけ」から「実際に動かす」役割へと一歩進みます。困ったら僕の試したコマンドをそのままコピペしてみてください。
詳細な実装手順はこちら → https://nands.tech/posts/claude-code-mcp-integration-dbc3ye