MCP ガイド — Claude に外部ツールをつなげる
最終確認日: 2026年3月24日 / MCP SDK: Python 1.x, TypeScript 1.x / Claude Desktop 最新版
Claude は標準状態でも高度な会話能力を持っていますが、「社内のデータベースを参照する」「GitHub のリポジトリを操作する」「ファイルシステムを読み書きする」といった外部との連携は、そのままでは行えません。
MCP(Model Context Protocol) はこの問題を解決するオープン標準です。USB-C ポートがさまざまなデバイスを同じ規格で接続できるように、MCP は AI アプリケーションとあらゆる外部システムを標準化された方法でつなぎます。
このガイドでは、MCP の仕組みを理解したうえで、実際に Claude Desktop や Claude Code へ MCP サーバーを接続する手順を解説します。
MCP とは — アーキテクチャの全体像
3つの役割を理解する
MCP のエコシステムは ホスト / クライアント / サーバー という3つの役割で構成されます。
| 役割 | 説明 | 例 |
|---|---|---|
| ホスト | AI モデルを実行し、MCP クライアントを内包するアプリケーション | Claude Desktop, Claude Code |
| クライアント | ホスト内でサーバーとの通信を担うコンポーネント | ホストに内蔵(1サーバーにつき1クライアント) |
| サーバー | 外部システムへのアクセスを提供する軽量プロセス | Filesystem サーバー、GitHub サーバー等 |
Claude Desktop(ホスト)
├── MCP クライアント A ←→ Filesystem サーバー(ローカルファイル)
├── MCP クライアント B ←→ GitHub サーバー(GitHub API)
└── MCP クライアント C ←→ Slack サーバー(Slack API)
ホストは複数の MCP サーバーを同時に利用できます。Claude Desktop でファイルを読みながら GitHub を操作する、といったことも1つの会話の中でシームレスに行えます。
MCP サーバーが提供できる3種類の機能
MCP サーバーはクライアントに対して次の3種類のリソースを公開できます。
| 種類 | 説明 | 例 |
|---|---|---|
| Resources(リソース) | ファイルのように読み取れるデータ | ファイル内容, DB レコード, API レスポンス |
| Tools(ツール) | LLM が呼び出せる関数(ユーザー承認付き) | ファイル書き込み, メール送信, コード実行 |
| Prompts(プロンプト) | 再利用可能なプロンプトテンプレート | レポート生成用テンプレート等 |
なぜ直接 API 呼び出しではなく MCP なのか
直接 API を呼び出す方法の問題点:
- ツールごとに異なる認証方式・エラー処理・データ形式への対応が必要
- LLM にツールの使い方を学習させるためのプロンプトエンジニアリングが複雑化
- ツールを追加するたびにアプリケーション側のコード変更が必要
MCP を使う利点:
- 標準化: すべてのサーバーが同じプロトコルで通信するため、一度書いた MCP クライアントはすべてのサーバーと互換
- エコシステム: コミュニティが作った数百のサーバーをすぐに利用可能
- セキュリティ: ホストはサーバーの機能(使えるツール、アクセスできるデータ)を明示的に制御できる
既成サーバーの利用 — すぐに使えるサーバー一覧
Anthropic とコミュニティが提供する MCP サーバーは github.com/modelcontextprotocol/servers にまとめられています。
Anthropic 公式が提供するサーバー
| サーバー名 | 機能 | 用途例 |
|---|---|---|
| Filesystem | ローカルファイルの読み書き | コードレビュー、ドキュメント整理 |
| GitHub | リポジトリ・Issue・PR の操作 | コードレビュー補助、Issue 管理 |
| GitLab | GitLab プロジェクト操作 | CI/CD パイプライン確認 |
| Google Drive | Drive ファイルの検索・読取 | ドキュメント参照 |
| Google Maps | 地図・場所情報の取得 | 住所検索、ルート案内 |
| Slack | メッセージ送受信・チャンネル操作 | 通知自動化 |
| PostgreSQL | PostgreSQL DB への読取専用アクセス | データ分析 |
| SQLite | SQLite DB の読み書き | ローカルデータ管理 |
| Puppeteer | ブラウザ自動操作 | Web スクレイピング、E2E テスト |
| Fetch | Web ページの取得・変換 | 公開 API の呼び出し |
| Memory | ナレッジグラフによる記憶の永続化 | コンテキスト跨ぎの記憶 |
| AWS KB Retrieval | AWS Knowledge Base からの情報取得 | RAG 構築 |
コミュニティサーバーの探し方
公式の一覧以外にも、以下のリソースでサーバーを探せます。
- modelcontextprotocol.io/servers — 公式カタログ
- mcp.so — コミュニティが運営するサーバーディレクトリ
- npm / PyPI —
@modelcontextprotocol/server-で始まるパッケージ
つまづきポイント: 「どのサーバーを使えばいいかわからない」
まず用途から逆算してみてください。「ファイルを操作したい」→ Filesystem、「GitHub を使いたい」→ GitHub サーバーと対応は明快です。見つからない場合は npm で
mcp serverと検索するか、後述の自作サーバー入門を参照してください。
Claude Desktop での設定
Claude Desktop の MCP 設定は claude_desktop_config.json という JSON ファイルで管理します。
設定ファイルの場所
%APPDATA%\Claude\claude_desktop_config.json
エクスプローラーのアドレスバーに %APPDATA%\Claude\ と入力して開けます。
ファイルが存在しない場合は新規作成してください。
設定ファイルの基本構造
{
"mcpServers": {
"サーバー名": {
"command": "実行コマンド",
"args": ["引数1", "引数2"],
"env": {
"環境変数名": "値"
}
}
}
}
mcpServers の中に、使いたいサーバーをキーとして並べます。キー名(例: "filesystem")は Claude の会話内でサーバーを識別する名前になります。
例1: Filesystem サーバー(ローカルファイル操作)
# まず npx でサーバーをインストール確認(初回は自動ダウンロード)
npx -y @modelcontextprotocol/server-filesystem --help
claude_desktop_config.json:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/Documents",
"/Users/yourname/Projects"
]
}
}
}
args の最後に指定するパスが、Claude がアクセスできるディレクトリになります。複数指定可能です。セキュリティ上、必要最小限のディレクトリのみを指定することを推奨します。
例2: GitHub サーバー
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
}
}
}
GitHub の Personal Access Token は github.com/settings/tokens で発行します。必要なスコープは操作内容によって異なりますが、読み取りのみなら repo:read で十分です。
例3: 複数サーバーを同時に設定
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/yourname/Projects"
]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxxxxxxxxxxxxxxxxx"
}
},
"fetch": {
"command": "uvx",
"args": ["mcp-server-fetch"]
}
}
}
設定を保存後、Claude Desktop を完全に再起動する必要があります。再起動後、チャット画面の入力欄にハンマーアイコン(🔨)が表示されれば MCP サーバーが認識されています。
つまづきポイント: ハンマーアイコンが表示されない
- JSON の構文エラーがないか確認(カンマの有無、括弧の対応など)
commandのパス(npx,uvx,node等)が正しいか確認。which npxでフルパスを調べて指定するとよい場合があります- Claude Desktop を Dock から完全に終了し、再起動する
- macOS では
~/Library/Logs/Claude/にログファイルがあり、エラー内容を確認できます
Claude Code での設定
Claude Code では、プロジェクトのルートディレクトリに .mcp.json ファイルを置くことでプロジェクト単位の MCP 設定が可能です。この設定をリポジトリにコミットすれば、チーム全員が同じ MCP 環境を共有できます。
.mcp.json の構造
.mcp.json の構造は Claude Desktop の claude_desktop_config.json と同じ形式です。
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"."
]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}
"." を指定すると、現在のプロジェクトルートを対象にできます。環境変数は ${ENV_VAR_NAME} の形式で参照可能です。実際の値は .env ファイルや CI/CD の環境変数として管理し、.mcp.json 自体にシークレットを書かないようにしましょう。
claude mcp コマンドによる管理
Claude Code では claude mcp コマンドで MCP サーバーを管理できます。
# 登録済みの MCP サーバー一覧を表示
claude mcp list
# MCP サーバーを追加(プロジェクトスコープ)
claude mcp add filesystem npx -- -y @modelcontextprotocol/server-filesystem .
# MCP サーバーを追加(グローバルスコープ)
claude mcp add --scope global github npx -- -y @modelcontextprotocol/server-github
# サーバーの詳細を確認
claude mcp get filesystem
# サーバーを削除
claude mcp remove filesystem
スコープについて:
| スコープ | 設定ファイルの場所 | 適用範囲 |
|---|---|---|
project(デフォルト) | .mcp.json(プロジェクトルート) | そのプロジェクトのみ |
local | ~/.config/claude/mcp.json 等 | ローカルマシン全体 |
global | グローバル設定ファイル | 全プロジェクト |
Claude Code での動作確認
Claude Code セッション内で /mcp スラッシュコマンドを使うと、接続中の MCP サーバーの状態を確認できます。
/mcp
ツールが正しく読み込まれていれば、利用可能なツール一覧が表示されます。
つまづきポイント: .mcp.json を追加したのにツールが使われない
Claude Code は起動時に
.mcp.jsonを読み込みます。ファイルを追加・変更した後は、Claude Code のセッションを/exitで終了し、再起動してください。/mcpコマンドで接続状態を確認できます。
自作サーバー入門
既成のサーバーで対応できない場合は、自分で MCP サーバーを作れます。MCP SDK は TypeScript と Python の両方で提供されています。
TypeScript で作る最小限のサーバー
前提条件: Node.js 18 以上
mkdir my-mcp-server
cd my-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk zod
npm install --save-dev typescript @types/node
npx tsc --init
src/index.ts:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
// サーバーのインスタンスを作成
const server = new McpServer({
name: "my-server",
version: "1.0.0",
});
// ツールを定義する
server.tool(
"greet",
"指定した名前に挨拶する",
{
name: z.string().describe("挨拶する相手の名前"),
},
async ({ name }) => {
return {
content: [
{
type: "text",
text: `こんにちは、${name}さん!`,
},
],
};
}
);
// サーバーを起動
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Server started"); // STDIO サーバーでは stderr に出力すること
重要: STDIO 通信を使うサーバーでは、
console.log()は絶対に使わないでください。stdout に書き込むと JSON-RPC メッセージが壊れてサーバーが動作しなくなります。デバッグ出力は必ずconsole.error()を使って stderr に書き出してください。
package.json に build スクリプトを追加してビルドします。
npx tsc
node dist/index.js
Python で作る最小限のサーバー
前提条件: Python 3.10 以上、uv パッケージマネージャー
uv init my-mcp-server
cd my-mcp-server
uv add "mcp[cli]"
server.py:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def greet(name: str) -> str:
"""指定した名前に挨拶する。
Args:
name: 挨拶する相手の名前
"""
return f"こんにちは、{name}さん!"
if __name__ == "__main__":
mcp.run(transport="stdio")
uv run server.py
自作サーバーを Claude Desktop に登録する
ビルド・動作確認ができたら、claude_desktop_config.json に追加します。
{
"mcpServers": {
"my-server": {
"command": "node",
"args": ["/絶対パス/my-mcp-server/dist/index.js"]
}
}
}
Python の場合:
{
"mcpServers": {
"my-server": {
"command": "uv",
"args": [
"--directory",
"/絶対パス/my-mcp-server",
"run",
"server.py"
]
}
}
}
パスは必ず絶対パスで指定してください。相対パスは動作しません。
デバッグとトラブルシューティング
Claude Desktop のログを確認する
# ログフォルダを開く
explorer "$env:APPDATA\Claude\logs"
MCP Inspector でサーバーを単体テスト
サーバーをデプロイする前に、MCP Inspector という開発ツールで動作確認できます。
npx @modelcontextprotocol/inspector node dist/index.js
ブラウザが開き、サーバーのツール・リソース・プロンプトを GUI で確認・テストできます。
よくあるエラーと解決策
| エラー | 原因 | 解決策 |
|---|---|---|
| ハンマーアイコンが表示されない | JSON 構文エラー / サーバーの起動失敗 | ログを確認、JSON をバリデート |
command not found | npx / uv のパスが通っていない | command にフルパスを指定(例: /usr/local/bin/npx) |
| ツールは表示されるが実行でエラー | サーバー側のロジックエラー | Inspector で単体テスト、stderr ログを確認 |
GITHUB_TOKEN が認識されない | 環境変数が渡されていない | "env" フィールドに明示的に記載 |
| サーバーがすぐ終了する | stdout へのログ書き込み(STDIO の場合) | console.log → console.error に変更 |
つまづきポイント: Python の
uvコマンドが見つからない
uvはまだ広く普及していないツールです。commandにuvと書いただけでは macOS 上で見つからないことがあります。which uvでフルパスを確認し(例:/Users/yourname/.cargo/bin/uv)、そのフルパスをcommandフィールドに指定してください。
セキュリティの考慮事項
MCP は Claude の能力を大きく拡張しますが、それはリスクも伴います。本番環境での利用や他人が作ったサーバーを使う際には、以下の点に注意してください。
アクセス範囲を最小限にする
Filesystem サーバーを設定する際は、Claude がアクセスできるディレクトリを必要最小限にしてください。
// 悪い例: ホームディレクトリ全体へのアクセス
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/yourname"]
// 良い例: 特定のプロジェクトディレクトリのみ
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/Users/yourname/my-project/docs"]
API トークンの権限を絞る
GitHub トークン等は最小権限の原則に従い、必要なスコープのみを付与します。読み取り専用で十分な場合は書き込み権限を与えないでください。
信頼できるサーバーのみを使う
コミュニティが作った MCP サーバーを使う前に、以下を確認してください。
- ソースコードが公開されているか(npm / PyPI からインストールする場合も、元のリポジトリを確認)
- 実績のある開発者・組織が管理しているか
- 必要以上のデータにアクセスしようとしていないか
環境変数にシークレットを書かない
.mcp.json はリポジトリにコミットされることが多いため、シークレット(API キー、トークン)を直接書かないようにします。
// 悪い例: トークンを直書き
"env": { "GITHUB_TOKEN": "ghp_abc123..." }
// 良い例: 環境変数参照
"env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
実際のトークンは .env ファイル(.gitignore に追加)や CI/CD のシークレット管理で管理します。
ツール実行の承認フロー
MCP のツール(Tools)は、Claude が実行しようとすると Claude Desktop / Claude Code 上でユーザーに承認を求めるダイアログが表示されます(ホスト実装によります)。重要な操作(ファイル削除、外部サービスへの書き込み等)を自動承認しないよう、ホストの設定を確認してください。
次のステップ
MCP の基本を習得したら、以下のリソースで理解を深められます。
- API 入門 — Claude をアプリに組み込む — Claude API を直接呼び出してアプリを構築する方法。MCP と組み合わせることでさらに強力なシステムを作れます
- MCP 公式サーバーカタログ — コミュニティが作った MCP サーバーの一覧
- MCP アーキテクチャ詳細 — トランスポート層(STDIO vs HTTP/SSE)やプロトコルの詳細
- MCP SDK リファレンス(TypeScript) — TypeScript SDK の API ドキュメント
- MCP SDK リファレンス(Python) — Python SDK の API ドキュメント