Claude Codeの MCPを 仕事に つなぐ前に 決める こと

ローカルの架空商品台帳から1件だけ読むMCPサーバーを例に、接続する仕事、接続先、認証、権限を先に決める手順を説明します。教材のproduct_server.pyとmcp.example.jsonを使い、ツールが見つかったか、実際に呼ばれたか、出典IDが返ったかの3点を確かめます。止めたいときの外し方も扱います。
この記事で終える仕事
MCPを使うと、Claude Codeが外部のツールやデータを直接読めるようになります。ただ、最初から業務で共有しているサービスにつなぐと、読める範囲も止め方も決まらないまま使い始めることになります。
この記事では、教材のPythonサーバー product_server.py と設定例 mcp.example.json を使います。架空の商品台帳から1件(DEMO-01)だけを読み、次の3点を確かめるところまでが手順です。
ツールが発見されたか
そのツールが実際に呼ばれたか
返ってきた出典IDが台帳と一致するか
使うのは教材に同梱されたコードと設定だけです。実在の顧客データ、共有サービス、OAuthのサインインは扱いません。教材は 資料をつなぐ練習 から入手できます。
接続する仕事を一行で決める
公式ドキュメントでは、MCPサーバーをつなぐ目安として「別のツールからチャットへデータを貼り付けていると気づいたとき」が挙げられています(MCPリファレンス)。接続する前に、何を読むためにつなぐのかを一行で書きます。今回は「商品台帳から承認済みの表現と出典IDを1件読む」です。
次の表に空欄が残っているなら、まだ接続を始める段階ではありません。
横にスクロールして比較できます
| 項目 | 今回の例 | 実務で決める内容 |
|---|---|---|
| 仕事 | 承認済み表現を1件読む | 何を読み何に使うか |
| 接続先 | 手元で動く product_server.py | ローカルかリモートか |
| 読むデータ | 架空商品 DEMO-01 の固定レコード | 範囲と件数の上限 |
| 書き込み | なし | 書き込みを許すか |
| 認証 | なし | OAuthかトークンか、誰の権限で読むか |
| 確認する点 | 発見と呼び出しと出典ID | 成功と判断する条件 |
| 止める条件 | 出典IDが一致しない | 接続を外すきっかけ |
最初は読むだけの仕事にします。結果が台帳と合っているかを人が照合しやすいからです。
接続先と認証を決める
接続方式は、サーバーがどこで動くかで決まります。公式リファレンスでは、リモートのサービスにはHTTP、手元のプロセスにはstdioが案内されています。教材はstdio方式です。Claude CodeがPython 3でサーバーを子プロセスとして起動し、ネットワークも認証情報も使いません。
設定の置き場所(スコープ)は次の3つです。
横にスクロールして比較できます
| スコープ | 読み込まれる範囲 | チームでの共有 | 保存先 |
|---|---|---|---|
| local | 現在のプロジェクトのみ | しない | ~/.claude.json |
| project | 現在のプロジェクトのみ | バージョン管理を通じて共有 | プロジェクト直下の .mcp.json |
| user | 自分のすべてのプロジェクト | しない | ~/.claude.json |
練習では、どのスコープにも登録しません。起動するときに --mcp-config で設定ファイルを渡し、あわせて --strict-mcp-config を付けます。こうするとClaude Codeは渡したサーバーだけを使うので、何が呼ばれたかを切り分けやすくなります(MCPリファレンス)。
実在のサービスにつなぐ場合は、認証の扱いを決める必要があります。リモートサーバーのOAuthは claude -p の実行中には完了できません。先に対話セッションの /mcp か、シェルで claude mcp login <name> を実行して済ませておきます。トークンを使う場合は、.mcp.json に値を直接書かずに ${API_KEY} のような環境変数の展開を使います。トークンや接続文字列は、記事、手順書、共有リポジトリのどこにも残さないでください。
教材のサーバーと設定を用意する
教材を展開すると、knowledge-connections/mcp/product_server.py と設定例の mcp.example.json が入っています。教材フォルダの中で、ファイルを動かさずに使ってください。
product_server.py が公開するツールは read_demo_product の1つだけです。コードからは次のことがわかります。
返すのは固定の架空レコード1件だけです(
product_idはDEMO-01、source_refはdemo-product-v1)ネットワーク処理、認証情報、任意のファイルパス、書き込み処理はありません
引数を付けて呼ぶと、
isError付きでThis tool accepts no arguments.を返します
設定例は教材を直接書き換えずに使います。mcp.example.json を同じフォルダに my-mcp.json などの名前でコピーし、コピーのほうで product_server.py へのパスを自分の展開先の絶対パスに直します。サーバー名は practice-catalog です。書き換えた後は、たとえば次のような形になります(パスは例です)。
{
"mcpServers": {
"practice-catalog": {
"type": "stdio",
"command": "python3",
"args": ["/Users/you/materials/knowledge-connections/mcp/product_server.py"]
}
}
}教材ファイルの項目の並びがこの例と違っていても、直すのはパスだけです。python3 にPATHが通っていない環境では、which python3 で表示されたフルパスを command に書いてください。
読み取りを試して3点を確かめる
コピーした設定ファイルを渡して、Claude Codeを起動します。
claude --strict-mcp-config --mcp-config /absolute/path/my-mcp.json起動したら、実演で使ったものと同じ次の依頼文を入力します。
practice-catalog の read_demo_product を一度呼び、商品IDと使用できる表現と出典IDを返してください。実データではなく架空の例であることを明記してください。ファイル変更はしません。初めてツールが呼ばれるときに許可を求められたら、mcp__practice-catalog__read_demo_product であることを確かめてから許可します。そのあと、次の3点を確認します。
発見:
/mcpにpractice-catalogが接続済みとして表示され、ツールが1つあること呼び出し: 出力に、サーバー名の付いた
read_demo_productの呼び出しが表示されていること出典ID:
DEMO-01とdemo-product-v1が返っていること
実演の条件と結果
2026年10月14日に、同じ --strict-mcp-config --mcp-config の構成と上の依頼文で1回だけ実行しました。printモード(-p)で実行し、返ってきたJSONはホスト側のスクリプトが保存しています。記録は教材の measurement-and-updates/observed/mcp.json に入っています。上で紹介した対話セッションの手順そのものは、この実演では通していません。
横にスクロールして比較できます
| 区分 | 内容 |
|---|---|
| Claude Code | 2.1.285 |
| モデル | claude-opus-5-5 |
| 実行回数 | 1回 |
| 終了コード | 0 |
| 所要時間 | 6.256秒 |
| CLIが報告した料金 | 約0.037米ドル(定価ベースのAPI換算値で、実際の請求額ではない) |
横にスクロールして比較できます
| 確認点 | 記録された内容 | 判定 |
|---|---|---|
| 発見 | 利用可能なツールに mcp__practice-catalog__read_demo_product があり、practice-catalog の状態は connected | 確認済み |
| 呼び出し | mcp__practice-catalog__read_demo_product が引数 {} で呼ばれた | 確認済み |
| 出典ID | product_id は DEMO-01、source_ref は demo-product-v1、fictional は true | 台帳と一致 |
最終的に返った値は次のとおりです。
{
"product_id": "DEMO-01",
"approved_claim": "ページを取り外せるノート",
"source_ref": "demo-product-v1",
"fictional": true
}これは、固定レコードを1件だけ返す教材サーバーで1回実行した結果です。所要時間と料金は、環境や依頼文によって変わります。実在サービスへの接続や、複数件の読み取りがうまくいくことを示す結果ではありません。
注釈と権限設定の限界
教材のツール定義には readOnlyHint: true が付いています。ただし、これはサーバーが自分で申告している注釈です。今回「読み取り専用」と言える根拠は、コードを読んで書き込み処理もネットワーク処理もないと確かめたことにあります。公式ドキュメントも、接続する前にサーバーを信頼できるか確認するよう警告しています。外部のコンテンツを取得するサーバーは、プロンプトインジェクションの危険にもつながります。
--strict-mcp-config やツールごとの許可で決められるのは、Claude Codeがどのサーバーに接続し、どのツールを呼ぶかだけです。readOnlyHint、スキルの allowed-tools、CLAUDE.mdの指示も同じで、どれも実サービス側の認証や最小権限の代わりにはなりません。実在のサービスにつなぐときは、接続に使う資格情報そのものの権限を絞ります。公式リファレンスのPostgreSQLの例でも、読み取り専用のユーザーを使うよう案内されています。社内での扱いは Claude Codeを社内で使うときのセキュリティ を、手順の定型化は Claude Codeのスキルで制作確認を定型化する を参照してください。
失敗したときと接続を外すとき
3つの確認点のどこで止まったかによって、確かめる場所が変わります。
横にスクロールして比較できます
| 症状 | 確かめること |
|---|---|
| /mcp にサーバーやツールが出ない | 設定ファイルの絶対パスと product_server.py のパスが正しいか。端末で python3 <絶対パス>/product_server.py を直接実行し、エラーが出ずに入力待ちになるかを見る。確認が済んだら Ctrl+C で止める |
| 起動の途中で時間切れになる | 起動の待ち時間は既定で30秒。MCP_TIMEOUT=60000 を付けて起動すると延ばせる |
| ツールはあるのに呼ばれない | 許可を求められたときに拒否していないか。依頼文にサーバー名とツール名が入っているか |
| This tool accepts no arguments. が返る | 引数付きで呼ばれている。依頼文から条件の指定を外す |
| 設定の変更が反映されない | 設定はセッションの開始時に読み込まれる。いったん終了して起動し直す |
| 出典IDが demo-product-v1 と違う | その出力は使わない。次の手順で接続を外し、サーバーと設定を見直す |
止めると決めたら、設定した方法に合わせて外します。
起動時に
--mcp-configで渡しただけの場合は、次の起動から渡さなければ接続されません。教材のmcp.example.jsonを書き換えたり消したりする必要はありません。自分で作ったmy-mcp.jsonは、不要だと判断したときだけ削除してください。共有されている設定ファイルは消さないでくださいclaude mcp addで登録した場合は、claude mcp remove practice-catalogで削除します。設定を残したまま止めたいときは、/mcpで無効に切り替えますプロジェクト直下の
.mcp.jsonは、claude -pでは確認なしで読み込まれます。読み込ませたくないときはdisabledMcpjsonServersに入れるか、--strict-mcp-configを付けて起動します
Claude Codeが子プロセスとして起動したstdioサーバーは、セッションの終了などで切断されるとき、Claude Codeが停止の信号を送って終了させます(MCPリファレンス)。一方、上の切り分けのように自分で端末から起動したプロセスは、この対象に入りません。自分で止めて、止まったことを確かめてください。
次の一歩
まず教材で3点の確認を一度通してください。実際の業務でつなぐかどうかは、この練習の結果とは別に判断します。法人で導入を検討する場合は 法人導入の確認票 を使います。「外部接続と接続先の権限」「許可する読み取りと書き込み」「停止手順と復旧責任」の行を、自社の契約と社内規程に基づいて記入してください。
参考情報