MCP (Model Context Protocol)
重要キーワード
MCP (Model Context Protocol)
MCP は AI とツール/データソースを繋ぐオープン標準 プロトコル。 Anthropic が提唱し、現在は多くの IDE・エージェントが対応しています。
なぜ MCP?
LLM は単体では「外の世界」にアクセスできません。 従来は各社が 独自のツール定義 をしていたため、再利用性が低かった。 MCP は 共通インターフェース を提供し、サーバー (ツール側) を 1 度作れば多くのクライアントから使えます。
構成
[ Claude / IDE ] <----- MCP -----> [ MCP Server ]
├ Tools (関数)
├ Resources (ファイル等)
└ Prompts (テンプレ)
サーバーは 3 種類の「ケーパビリティ」を提供します: - Tools: Claude が呼べる関数 - Resources: Claude が読める静的・動的データ (ファイルや DB レコード) - Prompts: ユーザーが呼べる定型プロンプト
Claude Code への追加
claude mcp add github stdio "npx @modelcontextprotocol/server-github"
設定は ~/.claude/settings.json の mcpServers に書かれます。
{
"mcpServers": {
"github": {
"type": "stdio",
"command": "npx",
"args": ["@modelcontextprotocol/server-github"],
"env": { "GITHUB_TOKEN": "$GITHUB_TOKEN" }
}
}
}
主なトランスポート
- stdio: ローカルプロセスを spawn (一番安全・速い)
- SSE: リモートサーバーに HTTP+SSE 接続 (要認証)
- HTTP: シンプルな REST 風 (新しめ)
例: 公式・人気の MCP サーバー
- github: PR・Issue・リポジトリ操作
- filesystem: 任意のディレクトリ読み書き
- postgres: SQL クエリ実行
- brave-search: Web 検索
- slack: メッセージ送受信
- memory: 永続メモリ
- puppeteer: ブラウザ自動操作
数百種類が公開されており、https://github.com/modelcontextprotocol/servers で一覧が見られます。
自分で MCP サーバーを書く
Python の mcp SDK を使うと数行で書けます。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-server")
@mcp.tool()
def echo(text: str) -> str:
'''与えられた文字列をそのまま返す'''
return text
if __name__ == "__main__":
mcp.run()
クライアントから claude mcp add my-server stdio "python my_server.py" で接続。
Local vs Remote
- stdio: ローカルプロセスを spawn (一番安全)
- SSE / HTTP: リモート MCP サーバーに接続 (要認証)
社内サービスは HTTP MCP で公開、社員の Claude Code から共有利用するパターンが増えています。
セキュリティ
- 任意の MCP は 任意のコードに見える ので、信頼できる発行元のものだけを入れる。
- 認証情報は環境変数経由で渡す。
- 不要な MCP は無効化 (
claude mcp disable <name>)。 - MCP サーバー側で 権限スコープ を最小化 (read-only から始める)。
Claude.ai との互換性
claude.ai の Connectors も多くは MCP サーバーとして実装されているため、 自社で書いた MCP は Claude Code でもブラウザでも使える 二刀流が可能。
試す
MCP サーバーアイデアを Claude に出してもらいましょう。
私たちは EC サイトを運営しています。社内で使える MCP サーバーのアイデアを 5 つ提案してください。各案に「提供する Tools / 想定ユーザー / 認証方式」を含めてください。実用 MCP サーバー集 (セットアップ完全版)
MCP 1: GitHub MCP (PR・Issue 操作)
何ができる: PR レビュー、Issue 検索、コミット履歴調査、ファイル取得、リポジトリ作成 など。 Claude Code から GitHub にフルアクセス可能。
前提: 個人アクセストークン (PAT) — repo, read:org, read:user 程度が無難
追加コマンド:
claude mcp add github stdio "npx -y @modelcontextprotocol/server-github" -e GITHUB_TOKEN=ghp_xxx
使い方の例:
> https://github.com/anthropics/anthropic-sdk-python の最新 5 PR を要約して
> issue #42 にコメントして「LGTM、approve しました」と書いて
> このリポジトリの直近 10 コミットを著者別に集計
セキュリティ注意:
- PAT は repo:read のみ にする (write が必要なら自分で打つ判断を)
- 組織のリポジトリでは fine-grained PAT を使い、対象を絞る
MCP 2: Filesystem MCP (任意ディレクトリの読み書き)
何ができる: 指定ディレクトリ配下のファイルを Claude が読み書き。プロジェクト外のリソース (ドキュメント・参考資料) を参照させる用途。
claude mcp add fs stdio "npx -y @modelcontextprotocol/server-filesystem ~/Documents/specs ~/Documents/notes"
使い方の例:
> ~/Documents/specs/api-spec-v2.md を読んで、これに沿って実装して
> ~/Documents/notes 配下の設計メモから、認証関連だけ抽出して要約
注意: 引数で渡したパス だけ がアクセス可能。/etc や ~/.ssh を渡さないこと。
MCP 3: Notion MCP (社内 Wiki 連携)
何ができる: Notion のページを検索・読み込み・更新。チームの設計書や議事録を Claude に直接読ませる。
claude mcp add notion stdio "npx -y @notionhq/notion-mcp-server" -e NOTION_API_KEY=secret_xxx
Notion 側の設定: 1. https://www.notion.so/my-integrations でインテグレーション作成 2. 共有したい Page で「Connections」→ 作成したインテグレーションを追加 3. 取得した secret を環境変数で渡す
使い方の例:
> Notion の「設計レビュー 2026Q1」ページを読んで、未決議事項を Issue として GitHub に起票して
MCP 4: Slack MCP (メッセージ送受信)
何ができる: 特定チャンネルのメッセージ取得、メンション検索、メッセージ送信。
claude mcp add slack stdio "npx -y @modelcontextprotocol/server-slack" -e SLACK_BOT_TOKEN=xoxb-xxx -e SLACK_TEAM_ID=Txxx
Slack 側:
1. https://api.slack.com/apps で新規 App
2. Bot Token Scopes に channels:read, channels:history, chat:write 追加
3. ワークスペースに install → Bot User OAuth Token を取得
使い方:
> #general の最新 50 メッセージから、未対応の質問を抽出してリストにして
> #ops に「本日のデプロイ完了しました 🚀」と投稿
注意: write 権限を渡すと暴走時のリスクあり。最初は read-only スコープから始める。
MCP 5: PostgreSQL MCP (DB 直接操作)
何ができる: SQL クエリ実行、スキーマ確認。
claude mcp add pg stdio "npx -y @modelcontextprotocol/server-postgres postgresql://user:pass@localhost:5432/mydb"
使い方:
> users テーブルから直近 7 日のサインアップ数を日別に集計して
> orders テーブルのスキーマを確認し、何かおかしい箇所があれば指摘
⚠️ 強く推奨: read-only ユーザーで接続 すること:
CREATE USER claude_readonly WITH PASSWORD 'xxx';
GRANT CONNECT ON DATABASE mydb TO claude_readonly;
GRANT USAGE ON SCHEMA public TO claude_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO claude_readonly;
→ Claude が誤って DROP TABLE を打っても DB が無事。
自作 MCP サーバー (FastMCP, 30 行)
社内専用サービスとつなぐ MCP を Python で書いてみる:
# my_server.py
from mcp.server.fastmcp import FastMCP
import requests
import os
mcp = FastMCP("my-internal-tools")
@mcp.tool()
def get_user_status(user_id: str) -> dict:
"""社内ユーザーシステムからユーザーの状態を取得"""
r = requests.get(
f"https://internal.example.com/api/users/{user_id}",
headers={"Authorization": f"Bearer {os.environ['INTERNAL_API_TOKEN']}"},
timeout=10,
)
r.raise_for_status()
return r.json()
@mcp.tool()
def search_tickets(query: str, limit: int = 10) -> list[dict]:
"""社内チケットシステムを検索"""
r = requests.get(
"https://tickets.example.com/api/search",
params={"q": query, "limit": limit},
headers={"Authorization": f"Bearer {os.environ['TICKETS_API_TOKEN']}"},
timeout=10,
)
return r.json()["results"]
if __name__ == "__main__":
mcp.run()
登録:
claude mcp add my-internal stdio "python /path/to/my_server.py" \
-e INTERNAL_API_TOKEN=xxx \
-e TICKETS_API_TOKEN=yyy
これで /mcp 一覧に my-internal が出て、Tools に get_user_status と search_tickets が表示される。
MCP 運用のベストプラクティス
| 観点 | 推奨 |
|---|---|
| 認証 | 環境変数経由 (-e KEY=VALUE)、settings.json には書かない |
| スコープ | 最小権限から始める (read-only → write は別途) |
| 信頼 | 公式 / 著名 OSS のみ。野良 MCP に PAT を渡さない |
| 監査 | ~/.claude/mcp-logs/ に通信ログを残す設定を |
| 障害 | MCP が落ちると Claude のターンも長くなるので timeout を短めに |
💡 claude.ai の Connectors も多くは MCP サーバーの実装。自社で書いた MCP は Claude Code でもブラウザの Claude でも共通で使える。
演習: github MCP を追加して PR を要約
公式の github MCP サーバーを Claude Code に追加し、特定リポジトリのオープン PR を一覧 → 要約させてください。
GITHUB_TOKEN(個人アクセストークン, repo 権限) を取得claude mcp add github stdio "npx -y @modelcontextprotocol/server-github" -e GITHUB_TOKEN=$GITHUB_TOKEN- Claude Code で「
/ の最新 PR を 5 件、それぞれ 1 行で要約して」と依頼
演習: FastMCP で hello サーバーを書く
Python で 30 行程度の MCP サーバーを書いてください。
- ツール hello(name: str) → "Hello, {name}!" を返す
- ツール now() → 現在時刻 ISO8601
Claude Code に登録して動作確認。
まとめ
お疲れ様でした!