• Claude Code
  • MCP
  • 設定
  • Linux

Claude Code の MCP 設定完全手順:claude mcp add / 削除 / スコープの違いを実際に試した

公開 更新

データベース、地球儀、歯車のアイコンからケーブルが端末画面につながり、反対側の書類アイコンにも接続されている様子を描いたイラスト
イラスト(生成画像)。実際の画面ではありません。
確認したバージョン
Claude Code 2.1.303
確認日
2026/10/19
確認した環境
Debian GNU/Linux 13(GUI なしのサーバー環境)

この記事でわかること

  • claude mcp add で HTTP サーバーを追加する手順(認証不要の公式ドキュメント MCP を使用)
  • local / project / user の 3 スコープが実際にどのファイルに書き込むか
  • Python で作った最小の stdio MCP サーバーをつなぐ方法
  • claude mcp list の Connected / Pending approval / Failed to connect の意味と直し方
  • 削除とスコープ変更、同じ名前が複数スコープにあるときの挙動
目次(11項目)
  1. 検証環境
  2. 先に結論:スコープと保存先
  3. 1HTTP の MCP サーバーを追加する
  4. 2project スコープと user スコープで追加する
  5. 3対話モードで .mcp.json のサーバーを承認する
  6. 4自作の stdio MCP サーバーをつなぐ
  7. 5スコープを変更する・削除する
  8. claude mcp list の状態の読み方
  9. つまずきポイントのチェックリスト
  10. まとめ
  11. 参考

Claude Code は MCP(Model Context Protocol) を使って、外部のツールやデータにつなげられます。設定自体は claude mcp add の 1 行で済みますが、「どのファイルに書かれたのか」「なぜ Pending approval のままなのか」「接続に失敗したときどこを見るか」でつまずきやすいところです。

この記事では、認証のいらない公式ドキュメントの MCP サーバーと、Python で作った小さな自作サーバーを使って、追加・確認・削除・スコープ変更までを実際に試しました。

この記事の画面について

端末の画像は、tmux の capture-pane で取り込んだ文字と色をそのまま画像にしたものです。内容は編集していません。claude mcp list の出力には、筆者の claude.ai アカウントから同期されたコネクタやプラグインの行も出るため、画面内のコマンドで grep -v を使ってそれらの行を除いています(除いていることがわかるよう、コマンドもそのまま写っています)。一部の画像は、関係する部分だけを切り出しています。

検証環境

項目 内容
確認日 2026-10-19
Claude Code 2.1.303(ネイティブ版、Claude Pro でログイン)
OS Debian GNU/Linux 13(trixie)
自作サーバー Python 3.13.5、MCP Python SDK(mcp)2.3.0
モデル 使用量を抑えるため --model haiku

MCP まわりは更新が速く、表示や仕様はバージョンで変わります。この記事の内容は上記の環境で確認したものです。

先に結論:スコープと保存先

公式ドキュメントの表と、実際に書き込まれたファイルは一致していました。

スコープ 指定 使えるプロジェクト 保存先(実際に確認)
local(既定) --scope local または省略 追加したプロジェクトだけ ~/.claude.json の projects["<パス>"].mcpServers
project --scope project そのプロジェクト(チームで共有) プロジェクト直下の .mcp.json
user --scope user すべてのプロジェクト ~/.claude.json のトップレベル mcpServers

ポイント

「local スコープ」は ~/.claude.json(ホームディレクトリ)に保存されます。名前は似ていますが、プロジェクト内の .claude/settings.local.json とは別物です(公式ドキュメントにも同じ注意書きがあります)。

手順 1:HTTP の MCP サーバーを追加する

まずは認証のいらないサーバーで流れを確認します。公式のクイックスタートでも最初の例に使われている、Claude Code ドキュメントの MCP サーバー(https://code.claude.com/docs/mcp)を追加しました。

claude mcp add --transport http claude-code-docs https://code.claude.com/docs/mcp
claude --version が 2.1.303 を表示し、claude mcp add の結果として Added HTTP MCP server claude-code-docs ... to local config と File modified: /home/box/.claude.json [project: /workspace/mcp-demo] が表示された端末画面
実際の画面スコープを省略すると local になります。File modified の行で、どのファイルに書かれたかがわかります

Added ... to local config の後の File modified: 行に、書き込まれたファイルとプロジェクトのパスが表示されます。

書き込まれた内容と接続状態を確認する

jq '.projects["/workspace/mcp-demo"].mcpServers' ~/.claude.json
claude mcp list
claude mcp get claude-code-docs
jq で ~/.claude.json の該当プロジェクトに type http と url が入っていること、claude mcp list で claude-code-docs が Connected、claude mcp get で Scope: Local config と Status: Connected が表示された端末画面
実際の画面設定は ~/.claude.json のプロジェクトの下に入りました。get ではスコープと削除コマンドも表示されます

claude mcp get は、スコープ・状態・接続先に加えて、削除するときのコマンド(-s local 付き)まで表示してくれます。

注意

~/.claude.json には、ログイン中のアカウント情報やほかのプロジェクトの履歴も入っています。中身を人に見せたり、スクリーンショットを撮ったりするときは、jq で必要な部分だけを取り出すのがおすすめです。

手順 2:project スコープと user スコープで追加する

同じサーバーを、名前を変えて project スコープと user スコープでも追加しました。

claude mcp add --scope project --transport http docs-team https://code.claude.com/docs/mcp
cat .mcp.json
claude mcp add --scope user --transport http docs-everywhere https://code.claude.com/docs/mcp
jq '.mcpServers' ~/.claude.json
project スコープの追加で /workspace/mcp-demo/.mcp.json が作られ、user スコープの追加で ~/.claude.json のトップレベル mcpServers に docs-everywhere が入ったことを示す端末画面
実際の画面project は .mcp.json、user は ~/.claude.json のトップレベルに書かれました

.mcp.json は末尾に改行がない形で書き出されたため、cat の直後にプロンプトがくっついて表示されています。チームで Git 管理するなら、エディタ側で改行が追加されて差分が出ることがあるので覚えておくとよいです。

project スコープは「承認待ち」になる

この状態で一覧を見ると、project スコープの docs-team だけ状態が違います。

claude mcp list で docs-everywhere と claude-code-docs は Connected、docs-team だけ Pending approval (run claude to approve) と表示された端末画面
実際の画面.mcp.json のサーバーは、承認するまで Pending approval のままです

.mcp.json はリポジトリに入れて共有するファイルなので、clone しただけで勝手にサーバーが動かないよう、対話モードの claude で承認するまで使われません。ドキュメントの表現では「設定決定を報告する」状態で、接続を試した結果ではありません。

手順 3:対話モードで .mcp.json のサーバーを承認する

プロジェクトで claude を起動すると、フォルダの信頼確認のあとに MCP サーバーの承認ダイアログが出ました。

New MCP server found in this project: docs-team と表示され、Use this MCP server、Use this and all future MCP servers in this project、Continue without using this MCP server の 3 択で、最後の項目が選ばれている画面
実際の画面初期状態では「使わずに続ける」が選ばれています。使うときは矢印キーで選び直します

初期選択が 「Continue without using this MCP server」(使わずに続ける) になっている点に注意してください。Enter を連打すると承認されません。

承認後に /mcp を開くと、スコープごとにサーバーと設定ファイルの場所がまとめて表示されます。

/mcp の Manage MCP servers 画面。Project MCPs に .mcp.json の docs-team、Local MCPs に ~/.claude.json [project: /workspace/mcp-demo] の claude-code-docs、User MCPs に docs-everywhere が並んでいる
実際の画面/mcp はスコープと保存先の確認に便利です(この下に続く claude.ai から同期されたコネクタ・プラグインの行は省いています)

サーバーを選ぶと詳細画面になり、状態や設定ファイルの場所、再接続・無効化のメニューが出ます。

Docs-team MCP Server の詳細画面。Status connected、URL、Config location /workspace/mcp-demo/.mcp.json、Tools: 3 tools と、View tools、Reconnect、Disable などのメニューが表示されている
実際の画面サーバーの詳細。ここから Disable で一時的に無効化もできます
Tools for docs-team の画面に search_claude_code_docs と query_docs_filesystem_claude_code_docs が read-only、submit_feedback が open-world として表示されている
実際の画面ドキュメント MCP が提供するツールは 3 つでした

承認はどこに保存されるのか

承認の結果は、~/.claude.json ではなく、プロジェクトの .claude/settings.local.json に書かれていました。

cat .claude/settings.local.json で enabledMcpjsonServers に docs-team が入っていることと、claude mcp list で 3 つとも Connected になったことを示す端末画面
実際の画面承認は .claude/settings.local.json の enabledMcpjsonServers に記録され、一覧も Connected に変わりました

claude -p では承認なしで読み込まれる

公式ドキュメントによると、claude -p や Agent SDK のセッションでは承認ダイアログを出せないため、project スコープのサーバーを確認なしで読み込みます。知らないリポジトリで claude -p を実行する前には .mcp.json の中身を確認するか、--strict-mcp-config を使ってください(この挙動はこの記事では試していません。ドキュメントの記述です)。

手順 4:自作の stdio MCP サーバーをつなぐ

次は、手元で動くプログラムをサーバーにする stdio 方式です。Python の公式 SDK で、ツールを 2 つだけ持つ最小のサーバーを作りました。

mkdir -p /workspace/mcp-demo && cd /workspace/mcp-demo
python3 -m venv .venv
.venv/bin/pip install mcp

server.py(実際に使ったファイルそのままです):

"""最小の stdio MCP サーバー(検証用)"""
from datetime import datetime
from zoneinfo import ZoneInfo

from mcp.server import MCPServer

mcp = MCPServer("jptools")


@mcp.tool()
def jst_now() -> str:
    """現在の日本時間(Asia/Tokyo)を返す"""
    return datetime.now(ZoneInfo("Asia/Tokyo")).strftime("%Y-%m-%d %H:%M:%S JST")


@mcp.tool()
def count_chars(text: str) -> dict:
    """文字数・バイト数(UTF-8)・行数を数える"""
    return {
        "chars": len(text),
        "utf8_bytes": len(text.encode("utf-8")),
        "lines": text.count("\n") + 1,
    }


if __name__ == "__main__":
    mcp.run()  # 既定は stdio トランスポート

注意:SDK 2.x では FastMCP の名前が変わっている

ネット上のサンプルによくある from mcp.server.fastmcp import FastMCP は、今回入った mcp 2.3.0 では ModuleNotFoundError になりました。エラーメッセージに「2.x で FastMCP は MCPServer に改名された(from mcp.server.mcpserver import MCPServer)、v1 のコードを使うなら mcp<2 に固定」と書かれていたので、MCPServer に書き換えています(from mcp.server import MCPServer でも読み込めました)。

わざと失敗させてみる

stdio サーバーは -- の後ろに起動コマンドを書きます。最初に、ファイル名を打ち間違えた状態(server.py → sever.py)で登録してみました。

claude mcp add jptools -- /workspace/mcp-demo/.venv/bin/python /workspace/mcp-demo/sever.py
claude mcp get jptools
claude mcp add は Added stdio MCP server jptools と成功を表示したが、claude mcp get では Status: Failed to connect、Issue: CONNECTION_CLOSED: Connection closed と表示された端末画面
実際の画面add はコマンドの中身を確かめないので成功します。get で初めて Failed to connect がわかります

claude mcp add は設定を書き込むだけなので、コマンドが間違っていても Added と表示されます。claude mcp get の Issue: CONNECTION_CLOSED だけでは原因がわからないので、登録したコマンドをそのまま自分で実行するのが早いです。

同じコマンドを直接実行して can't open file ... sever.py: No such file or directory を確認し、claude mcp remove で削除、正しいパスで再登録して claude mcp get が Connected になった端末画面
実際の画面直接実行すると原因がすぐわかります。remove して正しいパスで登録し直しました

Claude から自作ツールを呼ぶ

接続できたら、claude -p から呼んでみます。MCP のツールは mcp__<サーバー名>__<ツール名> という名前になるので、--allowedTools で許可します。

claude -p で jptools の count_chars を使うよう頼み、chars 8、utf8_bytes 24、lines 1 の JSON が返ってきた端末画面
実際の画面「こんにちは、世界」は 8 文字・UTF-8 で 24 バイト。自作ツールの結果が返ってきました

つまずいた点:--allowedTools の後ろにプロンプトを書かない

最初は claude -p --model haiku --allowedTools 'mcp__jptools__count_chars' '(プロンプト)' の順で書いたところ、次のエラーになりました。--allowedTools は複数の値を受け取るオプションなので、後ろに置いたプロンプトまでツール名として扱われたようです。プロンプトを先に書くと動きました。

claude -p --model haiku --allowedTools の後ろにプロンプトを置いたところ Error: Input must be provided either through stdin or as a prompt argument when using --print と表示された端末画面
実際の画面オプションの後ろにプロンプトを置いたときのエラー

ついでに、手順 1 のドキュメント MCP も使ってみました。公式クイックスタートの例と同じく MCP_TIMEOUT について調べさせています。

claude -p で claude-code-docs を使って MCP_TIMEOUT を調べさせ、起動タイムアウトをミリ秒で指定する環境変数でデフォルトは 30 秒、という回答と出典 URL が返ってきた端末画面
実際の画面ドキュメント MCP 経由の回答。内容は環境変数リファレンスの記述(デフォルト 30000 ミリ秒)と一致していました

手順 5:スコープを変更する・削除する

スコープは追加時に決まり、あとから変更するコマンドはありません。削除して、別のスコープで追加し直すのが公式の手順です。

claude mcp remove claude-code-docs --scope local
claude mcp add --scope user --transport http claude-code-docs https://code.claude.com/docs/mcp
claude mcp remove で local config から削除し、--scope user で追加し直した後、claude mcp get で Scope: User config (available in all your projects) と表示された端末画面
実際の画面local から user に移しました

同じ名前が 2 つのスコープにあるとき

わざと local にも同じ名前で(存在しない URL を)登録して、どちらが使われるかを見ました。

local に同名の claude-code-docs を example.invalid で追加すると、claude mcp get は Local config の定義を表示して Failed to connect になり、スコープ指定なしの remove は exists in multiple scopes と表示して -s local / -s user を指定するよう案内した端末画面
実際の画面local の定義が優先されました。スコープなしの remove は、どちらを消すか指定するよう求めてきます
  • claude mcp get は local の定義を表示しました。ドキュメントの優先順位(local → project → user → プラグイン → claude.ai コネクタ)どおりです。項目ごとのマージはされず、定義まるごとが使われます。
  • スコープを付けずに remove すると、削除せずに -s local / -s user の指定を求めてきました。

なお、example.invalid への接続エラーはこの検証環境では ECONNRESET と表示されました。ネットワーク環境によって表示は変わると思われます(未確認)。

後片付け

すべてのサーバーを -s 付きで remove した後、.mcp.json が mcpServers が空の状態で残り、claude mcp list には何も表示されなくなった端末画面
実際の画面全部削除しても .mcp.json は空のまま残りました

削除して気づいたことが 2 つあります。

  • project スコープを全部消しても、.mcp.json は {"mcpServers": {}} として残りました。不要ならファイルごと削除します。
  • 承認の記録(.claude/settings.local.json の enabledMcpjsonServers)は、サーバーを消しても docs-team が残ったままでした。同じ名前で別の中身のサーバーが後から追加されたときにどう扱われるかは未確認です。気になる場合は手で消すか、claude mcp reset-project-choices を使ってください。

claude mcp list の状態の読み方

今回実際に見た状態と、ドキュメントに載っている状態をまとめます。

表示 意味 対処 確認
✔ Connected 使える — 実際に表示
⏸ Pending approval .mcp.json のサーバーが未承認 対話モードの claude で承認 実際に表示
✘ Failed to connect サーバーが応答しない コマンド・URL を直接試す 実際に表示
! Needs authentication ブラウザでのサインインかトークンが必要 /mcp から認証、または --header claude.ai から同期されたプラグインで表示
! Connected · tools fetch failed 接続できたがツール一覧を取れない claude mcp get で詳細を見る ドキュメントのみ(未確認)
⊘ Disabled for this project プロジェクトで無効化されている /mcp で有効に戻す ドキュメントのみ(未確認)

実際に試した結果

  • 3 つのスコープの保存先は、公式ドキュメントの表どおりでした
  • .mcp.json のサーバーは承認するまで Pending approval。承認ダイアログの初期選択は「使わずに続ける」
  • 承認は .claude/settings.local.json に保存され、サーバー削除後も残った
  • claude mcp add はコマンドの誤りを検出しない。get で確認し、失敗したらコマンドを直接実行する
  • --allowedTools の後ろにプロンプトを置くとエラーになる

つまずきポイントのチェックリスト

  • claude mcp list に知らないサーバーが出る → claude.ai にログインしていると、アカウントのコネクタ(claude.ai ...)や同期されたプラグイン(plugin:...)も並びます。なお、ANTHROPIC_API_KEY を設定していると claude.ai のコネクタは読み込まれない旨の警告が出ました(エラー・利用制限の記事で詳しく扱っています)。
  • project スコープのサーバーが使われない → Pending approval になっていないか確認。対話モードで承認します。
  • stdio サーバーが Failed to connect → claude mcp get に出るコマンドをそのまま実行する。仮想環境の Python は絶対パスで書くと確実です。
  • claude -p でツールが使われない・エラーになる → --allowedTools mcp__サーバー名__ツール名 を付け、プロンプトはオプションより前に書く。
  • 起動が遅いサーバーがタイムアウトする → MCP_TIMEOUT(ミリ秒、既定 30000)で延ばせます(ドキュメントの記述。今回は試していません)。

まとめ

まとめ

  • 追加は claude mcp add。HTTP は --transport http <名前> <URL>、stdio は <名前> -- <コマンド>
  • 既定は local(~/.claude.json のプロジェクトの下)。共有したいなら project(.mcp.json)、全プロジェクトで使うなら user
  • .mcp.json のサーバーは対話モードで承認するまで使われない
  • 状態の確認は claude mcp get と /mcp。スコープ変更は「削除して追加し直す」
  • MCP のツールを使わせるときは mcp__サーバー名__ツール名 で許可する

MCP サーバーを増やすと、ツール名などがコンテキストに入ります。どれくらい入っているかは /context で確認できます(利用制限の記事で実際の画面を載せています)。決まった手順を Claude に覚えさせたいだけなら、MCP より Skills(SKILL.md) のほうが手軽な場合もあります。設定ファイルの置き場所の考え方は hooks の記事 も参考にしてください。

参考

この記事は、AI を使って下書きを作り、手順とコマンドの出力・画面は筆者の検証環境で実際に実行して確認しています。アイキャッチ画像は生成画像(イラスト)で、実際の画面ではありません。

↑