Chapter 34: MCP サーバー連携
Model Context Protocol による外部ツール統合
34.1 MCP(Model Context Protocol)とは
MCP(Model Context Protocol)は Anthropic が策定したAI モデルと外部ツールを接続するための標準プロトコルです。2024年末に公開され、現在は多くのツールベンダーが MCP サーバーを提供しています。
MCP が解決する問題:
- これまで: AI に外部ツールを連携させるには各社が独自の統合を実装する必要があった
- MCP 以降: 標準化されたインターフェースで、どの AI クライアントとも接続できる
MCP のアーキテクチャ
MCP が提供する機能
| 機能 | 説明 |
|---|---|
| Tools | AI が呼び出せる関数(ファイル操作・API 呼び出し等) |
| Resources | AI が読み込めるデータソース(ファイル・DB・URL 等) |
| Prompts | 再利用可能なプロンプトテンプレート |
34.2 標準 MCP サーバーの導入
Claude Code への MCP サーバー追加は claude mcp add コマンドで行います。
設定方法
# 1. ファイルシステム MCP サーバー(ローカルファイル操作)
claude mcp add filesystem -- npx -y @modelcontextprotocol/server-filesystem /path/to/workspace
# 2. GitHub MCP サーバー
claude mcp add github -- npx -y @modelcontextprotocol/server-github
# 3. Brave Search MCP サーバー
claude mcp add brave-search -- npx -y @modelcontextprotocol/server-brave-search設定は ~/.claude/mcp_settings.json に保存されます:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"],
"env": {}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}利用可能な主要 MCP サーバー一覧
| MCP サーバー | 用途 |
|---|---|
@modelcontextprotocol/server-filesystem | ローカルファイル操作 |
@modelcontextprotocol/server-github | GitHub Issues/PR/コード |
@modelcontextprotocol/server-slack | Slack メッセージ送受信 |
@modelcontextprotocol/server-postgres | PostgreSQL クエリ |
@modelcontextprotocol/server-brave-search | Web 検索 |
@modelcontextprotocol/server-puppeteer | ブラウザ操作 |
TODO: あとで実際のスクリーンショットに置き換え -
claude mcp listの出力と、MCP サーバーが有効になった Claude Code の画面
34.3 Slack 連携
Slack MCP サーバーを使うと、Claude Code から直接 Slack にメッセージを送ったり、チャンネルの内容を参照したりできます。
セットアップ
# Slack Bot Token を環境変数に設定
export SLACK_BOT_TOKEN="xoxb-..."
export SLACK_TEAM_ID="T..."
claude mcp add slack -- npx -y @modelcontextprotocol/server-slack活用例: 開発通知の自動化
PR マージ完了時に Slack の #dev-updates チャンネルに通知するワークフロー:
Claude Code に指示する例:
「feature/auth ブランチの PR をマージして、
完了したら #dev-updates チャンネルに
"✅ auth 機能をリリースしました。変更点: [変更概要]" を投稿してください」Claude Code は以下を自動実行します:
gh pr mergeで PR をマージ- Slack MCP の
send_messageツールで通知
Slack MCP が提供するツール
| ツール名 | 機能 |
|---|---|
slack_list_channels | チャンネル一覧を取得 |
slack_get_channel_history | チャンネルの会話履歴を取得 |
slack_post_message | メッセージを投稿 |
slack_reply_to_thread | スレッドに返信 |
slack_get_users | ユーザー一覧を取得 |
34.4 GitHub / データベース連携
GitHub MCP による高度なワークフロー
GitHub MCP を使うと、Issues・PR・コードの操作を Claude Code から直接行えます。
# 環境変数の設定
export GITHUB_PERSONAL_ACCESS_TOKEN="ghp_..."
claude mcp add github -- npx -y @modelcontextprotocol/server-github活用できる操作:
# Issue の自動トリアージ
「未対応の Issue を全て読んで、優先度(Critical/High/Medium/Low)を
ラベルで付けてください。基準: セキュリティ > データ破損 > 機能バグ > 改善」
# PR 自動レビュー
「今週オープンされた PR を全て確認して、
テストが不足しているものに review request コメントを残してください」PostgreSQL MCP によるデータ操作
claude mcp add postgres -- npx -y @modelcontextprotocol/server-postgres \
"postgresql://user:password@localhost:5432/mydb"注意: 本番 DB への接続は読み取り専用ユーザーを使うこと。MCP サーバー経由で誤って本番データを書き換えるリスクがあります。
活用例:
# スロークエリの自動調査
「過去1週間のスロークエリログを分析して、
インデックスの追加で改善できるクエリをリストアップしてください。
改善案の SQL も合わせて提案してください」34.5 Figma 連携(デザイン → コード)
Figma MCP サーバーを使うと、デザインデータを読み込んでコードを生成するデザイン→コード自動化が実現します。
セットアップ
Figma MCP は Claude Code に組み込まれています:
# claude_desktop_config.json または mcp_settings.json
{
"mcpServers": {
"figma": {
"command": "npx",
"args": ["-y", "@figma/mcp-server-figma"],
"env": {
"FIGMA_API_KEY": "${FIGMA_API_KEY}"
}
}
}
}使用例
Figma URL: https://figma.com/design/abc123/MyApp?node-id=1-2
「このノード(node-id: 1-2)をTailwind CSSを使ったReact コンポーネントに変換してください。
- TypeScript 使用
- Props は適切に型定義する
- アクセシビリティ属性を付与する」TODO: あとで実際のスクリーンショットに置き換え - Figma デザインとそこから生成された React コードの対比
34.6 カスタム MCP サーバーの作成
標準の MCP サーバーに存在しない社内ツールや独自サービスには、カスタム MCP サーバーを実装します。
実装例(TypeScript / Node.js)
// my-company-mcp/src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
const server = new Server(
{ name: "my-company-mcp", version: "1.0.0" },
{ capabilities: { tools: {} } }
);
// ツールの定義
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: [
{
name: "get_deployment_status",
description: "サービスのデプロイ状態を取得する",
inputSchema: {
type: "object",
properties: {
service: {
type: "string",
description: "サービス名(例: api, web, worker)",
},
environment: {
type: "string",
enum: ["staging", "production"],
},
},
required: ["service", "environment"],
},
},
],
}));
// ツールの実装
server.setRequestHandler(CallToolRequestSchema, async (request) => {
if (request.params.name === "get_deployment_status") {
const { service, environment } = request.params.arguments as {
service: string;
environment: string;
};
// 社内 API を呼び出す
const response = await fetch(
`https://deploy.internal.example.com/api/status/${environment}/${service}`
);
const data = await response.json();
return {
content: [
{
type: "text",
text: JSON.stringify(data, null, 2),
},
],
};
}
throw new Error(`Unknown tool: ${request.params.name}`);
});
// サーバー起動
const transport = new StdioServerTransport();
await server.connect(transport);登録とテスト
# ビルド
cd my-company-mcp && npm run build
# 登録
claude mcp add my-company -- node /path/to/my-company-mcp/dist/index.js
# 動作確認
claude mcp list
# → my-company: node /path/to/my-company-mcp/dist/index.js ✓カスタム MCP の設計指針
- ツールは1機能1ツール: 複数の操作をまとめない
- 入力スキーマを厳密に: AI が正しいパラメータを渡せるよう
requiredを明示する - エラーを丁寧に返す: エラーメッセージが AI の自己修正に活用される
- べき等性を保つ: 同じ入力を何度呼ばれても安全な設計にする
- 読み取りと書き込みを分ける: 誤操作リスクを減らすため、書き込みツールは別に定義する