エージェント機能

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

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点を確かめるところまでが手順です。

  1. ツールが発見されたか

  2. そのツールが実際に呼ばれたか

  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点を確認します。

  1. 発見: /mcp に practice-catalog が接続済みとして表示され、ツールが1つあること

  2. 呼び出し: 出力に、サーバー名の付いた read_demo_product の呼び出しが表示されていること

  3. 出典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 Code2.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 が引数 {} で呼ばれた確認済み
出典IDproduct_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点の確認を一度通してください。実際の業務でつなぐかどうかは、この練習の結果とは別に判断します。法人で導入を検討する場合は 法人導入の確認票 を使います。「外部接続と接続先の権限」「許可する読み取りと書き込み」「停止手順と復旧責任」の行を、自社の契約と社内規程に基づいて記入してください。

参考情報

  1. mcp
  2. mcp quickstart

TRY THIS WORKFLOW

自分の仕事で試す

資料をつなぐ練習セットを使い、入力と確認の手順を手元で試せます。登録は不要です。

教材を使う →法人導入の相談をする →検証と編集の方針