Claude Codeを使い始めたエンジニアが次に直面する課題は、「外部ツールとどう連携させるか」ではないでしょうか。GitHubのIssueを自動で取得したい、データベースに直接クエリを投げたい、Slackに通知を飛ばしたい。こうしたニーズに対して、個別にAPIを叩くスクリプトを書くのは現実的ではありません。MCP(Model Context Protocol)は、まさにこの問題を解決するために設計されたプロトコルです。本記事では、Claude CodeにおけるMCPサーバーの設定方法から、カスタムサーバーの構築、SDK連携、そして実務での活用パターンまでを、実際のコマンドと設定例を交えながら解説します。
MCPとは?Claude Codeでの役割
MCP(Model Context Protocol)は、Anthropic社が2024年末にオープンソースとして公開したプロトコルです。AIエージェントと外部ツール・データソースを接続するための標準規約を定めており、MCPとは?AIエージェント連携の新標準で詳しく解説しています。ここでは、Claude Codeの文脈に絞って要点を整理します。
MCPが解決する課題
従来、Claude Codeに外部機能を持たせるには、プロンプトでURLを指定してcurlを実行させたり、専用のシェルスクリプトを書いて呼び出させたりと、その場しのぎの対応が必要でした。ツールが3つ4つならまだしも、10個を超えてくると管理コストが急激に増大します。
MCPは「AIエージェントとツールの間のUSB-C」とたとえられます。一度MCPクライアント(Claude Code側)がプロトコルに対応すれば、あとはMCPサーバーを追加するだけで新しいツールが使えるようになります。Claude Codeは2025年初頭からMCPクライアント機能を内蔵しており、追加のインストールなしでMCPサーバーに接続できます。
Claude CodeにおけるMCPの位置づけ
Claude CodeでのMCPの役割を整理すると、以下の3つに集約されます。
| 役割 | 説明 |
|---|---|
| ツールの拡張 | ファイルシステム操作、Web検索、API呼び出しなど、Claude Codeの標準機能を超えた操作が可能になる |
| コンテキストの注入 | データベースの内容やドキュメントをリソースとしてClaudeに提供できる |
| ワークフローの自動化 | 複数のMCPサーバーを組み合わせて、複雑な業務フローを一つの会話内で完結させられる |
2026年4月時点で、MCPエコシステムには251を超えるベンダー検証済みサーバーが公開されています。GitHub、Slack、PostgreSQL、Figmaなど、主要なサービスやツールのほとんどがMCPサーバーとして利用可能な状態です。
トランスポートの種類
MCPサーバーとの通信方式は大きく2種類あります。
| トランスポート | 通信方式 | 用途 |
|---|---|---|
| stdio | ローカルプロセスの標準入出力 | ローカル開発、個人利用 |
| HTTP/SSE | HTTPベースのリモート通信 | チーム共有、クラウドサービス連携 |
stdio方式は、MCPサーバーをClaude Codeの子プロセスとして起動し、stdin/stdoutで通信します。セットアップが簡単で、ローカルで完結するため認証の問題も発生しにくいのが利点です。
HTTP/SSE方式は、リモートのMCPサーバーにHTTP経由で接続します。GitHub MCPサーバーのように、サービス提供側がホストしているサーバーに接続する場合はこちらを使います。OAuth認証にも対応しており、セキュアなアクセス制御が可能です。
筆者の経験では、自作のMCPサーバーはstdioで手元で動かし、SaaS系のサービス連携にはHTTP/SSEを使うという使い分けが自然に定まりました。
MCPサーバーの設定方法
MCPサーバーの設定は、CLIコマンドを使う方法と、設定ファイルを直接編集する方法の2つがあります。
CLIコマンドによる追加
もっとも手軽なのは claude mcp add コマンドです。
# stdioトランスポートでローカルサーバーを追加
claude mcp add --transport stdio my-server npx -y @example/mcp-server
# HTTP/SSEトランスポートでリモートサーバーを追加
claude mcp add --transport http github-server https://api.githubcopilot.com/mcp/基本的な構文は以下のとおりです。
claude mcp add --transport <stdio|http> <サーバー名> <コマンドまたはURL> [引数...]
スコープを指定することで、設定の適用範囲を制御できます。
# プロジェクトスコープ(デフォルト):.mcp.json に保存
claude mcp add --transport stdio my-server command
# ユーザースコープ:~/.claude/settings.json に保存
claude mcp add --scope user --transport stdio my-server command追加したサーバーの一覧を確認するには、以下のコマンドを使います。
# 登録済みMCPサーバーの一覧
claude mcp list
# 特定のサーバーの詳細
claude mcp get my-server不要になったサーバーは claude mcp remove で削除できます。
claude mcp remove my-server設定ファイルによる管理
チーム開発では、設定ファイルをリポジトリに含めて共有する方法が実用的です。プロジェクトルートに .mcp.json を配置します。
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/project"],
"type": "stdio"
},
"github": {
"url": "https://api.githubcopilot.com/mcp/",
"type": "http"
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"type": "stdio",
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb"
}
}
}
}各サーバーの設定項目を整理します。
| 項目 | 説明 | stdioの場合 | HTTPの場合 |
|---|---|---|---|
command | 起動コマンド | 必須 | 不要 |
args | コマンド引数 | 任意 | 不要 |
url | サーバーURL | 不要 | 必須 |
type | トランスポート種別 | "stdio" | "http" |
env | 環境変数 | 任意 | 任意 |
ユーザー個人の設定は ~/.claude/settings.json に記述します。
{
"mcpServers": {
"slack-notifier": {
"command": "node",
"args": ["/Users/me/mcp-servers/slack-server.js"],
"type": "stdio",
"env": {
"SLACK_BOT_TOKEN": "xoxb-your-token-here"
}
}
}
}設定の優先順位は、プロジェクトスコープ(.mcp.json)がユーザースコープ(~/.claude/settings.json)より優先されます。同名のサーバーが両方に存在する場合、プロジェクト側の設定が使われます。
環境変数の扱い
MCPサーバーにAPIキーやトークンを渡す場合、env フィールドを使います。ただし、.mcp.json をリポジトリにコミットする場合は、秘密情報を直接記述しないように注意が必要です。
筆者が採用している方法は、環境変数名だけを .mcp.json に記述し、実際の値はローカルの .env ファイルや環境変数で管理するパターンです。
{
"mcpServers": {
"my-service": {
"command": "npx",
"args": ["-y", "@example/mcp-server"],
"type": "stdio",
"env": {
"API_KEY": "${MY_SERVICE_API_KEY}"
}
}
}
}このようにシェル変数の展開構文を使えば、.mcp.json 自体にはシークレットが含まれないため、安全にバージョン管理できます。
組み込みMCPサーバーの活用
Claude Codeには、追加のインストールなしで利用できる組み込みのMCPサーバーがいくつか用意されています。これらはClaude Code自体が提供するツールで、MCPプロトコルを通じてアクセスされます。
ファイルシステムサーバー
Claude Codeの基本機能であるファイル操作は、内部的にMCPのToolsプリミティブとして実装されています。Read、Write、Edit、Globといったツールがこれに該当します。これらは明示的な設定なしで最初から利用可能です。
ただし、プロジェクト外のディレクトリにアクセスしたい場合は、外部のファイルシステムMCPサーバーを追加で設定する必要があります。
claude mcp add --transport stdio fs-extra npx -y @modelcontextprotocol/server-filesystem /path/to/other/directoryWeb検索
Claude Codeは外部のWeb検索機能にもMCP経由でアクセスできます。最新の技術情報やドキュメントを検索しながらコーディングを進める場面で有用です。
Tool Search(オンデマンドツール検出)
MCPサーバーを多数登録すると、利用可能なツールの数が膨大になり、コンテキストウィンドウを圧迫するという問題が発生します。Claude Codeはこの課題に対して、Tool Searchという仕組みで対応しています。
Tool Searchは、すべてのツール定義を最初からコンテキストに読み込むのではなく、必要なときに必要なツールだけを動的に検出してロードする仕組みです。この最適化により、コンテキストの使用量を最大95%削減できるとされています。
仕組みとしては、Claude Codeがユーザーの指示を解析し、関連しそうなツールをMCPサーバーに問い合わせて、マッチしたツールのスキーマだけをコンテキストに追加します。ツールが50個、100個と増えても、1回のタスクで実際に必要になるのは数個程度であることが多いため、この最適化は非常に効果的です。
実際に筆者のプロジェクトでは、GitHub、PostgreSQL、Slack、Figmaの4つのMCPサーバーを登録していますが、Tool Searchのおかげでコンテキストの圧迫を感じることはほとんどありません。ファイルの読み書きだけで完結するタスクでは、外部MCPサーバーのツールはコンテキストに一切ロードされません。
Claude Code自身をMCPサーバーとして使う
あまり知られていない機能ですが、Claude Code自身がMCPサーバーとして振る舞うことも可能です。
claude mcp serveこのコマンドを実行すると、Claude Codeがstdioベースのmcpサーバーとして起動します。他のMCPクライアント(たとえばClaude Desktopや、別のAIエージェント)からClaude Codeの機能を呼び出せるようになります。
この機能が活きるのは、たとえばCI/CDパイプラインの中でClaude Codeの分析能力を使いたい場合や、他のAIエージェントフレームワークからClaude Codeの高度なコード理解能力を借りたい場合です。MCPという標準プロトコルがあるからこそ、こうした相互運用が自然に実現できるのだと実感します。
カスタムMCPサーバーの構築
既存のMCPサーバーでカバーできない要件がある場合は、カスタムサーバーを構築します。MCPのSDKは複数の言語で提供されていますが、ここではTypeScriptとPythonの例を示します。
TypeScriptでの構築
TypeScript用のMCP SDKを使った最小限のサーバー実装です。
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-custom-server",
version: "1.0.0",
});
// ツールの定義
server.tool(
"get_project_stats",
"プロジェクトのコード統計情報を取得する",
{
directory: z.string().describe("対象ディレクトリのパス"),
extensions: z.array(z.string()).optional().describe("対象の拡張子(例: ['.ts', '.tsx'])"),
},
async ({ directory, extensions }) => {
// ここにビジネスロジックを実装
const stats = await collectStats(directory, extensions);
return {
content: [
{
type: "text",
text: JSON.stringify(stats, null, 2),
},
],
};
}
);
// サーバーの起動
const transport = new StdioServerTransport();
await server.connect(transport);このサーバーをClaude Codeに登録するには、以下のようにします。
claude mcp add --transport stdio project-stats node /path/to/my-server.jsあるいは .mcp.json に記述します。
{
"mcpServers": {
"project-stats": {
"command": "npx",
"args": ["tsx", "./mcp-servers/project-stats.ts"],
"type": "stdio"
}
}
}Pythonでの構築
Python用のMCP SDKを使った場合の実装例です。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("my-python-server")
@mcp.tool()
def query_database(query: str, database: str = "main") -> str:
"""指定されたデータベースにSQLクエリを実行する
Args:
query: 実行するSQLクエリ
database: 対象データベース名
"""
# データベースクエリの実行ロジック
result = execute_query(database, query)
return format_result(result)
@mcp.tool()
def analyze_logs(log_path: str, level: str = "ERROR") -> str:
"""ログファイルを解析して指定レベル以上のエントリを抽出する
Args:
log_path: ログファイルのパス
level: フィルタするログレベル
"""
entries = parse_log_file(log_path, level)
return format_entries(entries)
if __name__ == "__main__":
mcp.run(transport="stdio")PythonサーバーのClaude Codeへの登録です。
claude mcp add --transport stdio log-analyzer python /path/to/my_server.pyリソースの公開
ツールだけでなく、リソース(読み取り専用のデータ)を公開することもできます。
import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
const server = new McpServer({
name: "docs-server",
version: "1.0.0",
});
// 静的リソース
server.resource(
"project-readme",
"file:///project/README.md",
async (uri) => ({
contents: [
{
uri: uri.href,
text: await readFile("./README.md", "utf-8"),
mimeType: "text/markdown",
},
],
})
);
// 動的リソース(テンプレート)
server.resource(
"db-schema",
new ResourceTemplate("db://schema/{tableName}", { list: undefined }),
async (uri, { tableName }) => {
const schema = await getTableSchema(tableName);
return {
contents: [
{
uri: uri.href,
text: JSON.stringify(schema, null, 2),
mimeType: "application/json",
},
],
};
}
);リソースとして公開されたデータは、Claude Codeがタスクに必要なコンテキストとして自動的に参照できます。データベースのスキーマ情報やプロジェクトのドキュメントをリソースとして公開しておくと、Claudeが正確な情報に基づいてコードを生成できるようになります。
カスタムサーバーの設計で気をつけること
筆者がカスタムMCPサーバーを構築する中で学んだ注意点をいくつか共有します。
ツールの粒度を適切に保つ: 1つのツールに多くの機能を詰め込むと、AIモデルがいつどう使うか判断しにくくなります。「1ツール1責務」を意識し、説明文(description)を具体的に書くことが重要です。
エラーハンドリングを丁寧に行う: MCPサーバーがクラッシュすると、Claude Codeのセッション全体に影響します。try-catchで適切にエラーを捕捉し、わかりやすいエラーメッセージを返すようにしましょう。
入力のバリデーションにはスキーマを活用する: TypeScriptならZod、PythonならPydanticを使って入力パラメータを厳密に型定義することで、不正な入力によるエラーを防止できます。MCPのSDKはこれらのバリデーションライブラリと統合されているため、自然に型安全な実装が可能です。
冪等性を意識する: AIモデルは同じツールを複数回呼び出す場合があります。データの書き込みや外部APIへのリクエストを伴うツールでは、重複実行しても問題が起きないように設計しましょう。
Claude Code SDKとの連携
Claude Code SDKは、Claude Codeの機能をプログラムから利用するためのSDKです。MCPサーバーと組み合わせることで、高度なAIエージェントシステムを構築できます。
SDK概要
Claude Agent SDKは、AIエージェントの構築に必要な機能を提供するフレームワークです。MCPクライアント機能が組み込まれており、SDKを通じてMCPサーバーのツールをエージェントに利用させることができます。
import { Agent, MCPServerStdio, MCPServerHTTP } from "claude-agent-sdk";
// stdioトランスポートのMCPサーバー
const filesystemServer = new MCPServerStdio({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "/project"],
});
// HTTPトランスポートのMCPサーバー
const githubServer = new MCPServerHTTP({
url: "https://api.githubcopilot.com/mcp/",
});
// エージェントの定義
const agent = new Agent({
name: "code-reviewer",
model: "claude-sonnet-4-20250514",
instructions: "コードレビューを実施し、改善提案を行うエージェントです。",
mcpServers: [filesystemServer, githubServer],
});
// エージェントの実行
const result = await agent.run("PRの変更内容をレビューして改善点を指摘してください");
console.log(result.output);サブエージェントでのMCP活用
Claude Agent SDKでは、メインエージェントがサブエージェントを呼び出す階層構造を構築できます。各サブエージェントに異なるMCPサーバーを割り当てることで、責務を明確に分離できます。
import { Agent, MCPServerStdio } from "claude-agent-sdk";
// データベース操作専用のサブエージェント
const dbAgent = new Agent({
name: "db-agent",
model: "claude-haiku-4-20250514",
instructions: "データベースへのクエリ実行を担当します。安全なSELECT文のみ実行してください。",
mcpServers: [
new MCPServerStdio({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-postgres"],
env: { DATABASE_URL: process.env.DATABASE_URL },
}),
],
});
// コード分析専用のサブエージェント
const codeAgent = new Agent({
name: "code-agent",
model: "claude-sonnet-4-20250514",
instructions: "ソースコードの構造分析と品質評価を担当します。",
mcpServers: [
new MCPServerStdio({
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "/project/src"],
}),
],
});
// メインエージェント(サブエージェントをツールとして利用)
const mainAgent = new Agent({
name: "project-analyst",
model: "claude-sonnet-4-20250514",
instructions: `
プロジェクトの総合分析を行うエージェントです。
データベースの状態確認にはdb-agentを、
コードの分析にはcode-agentを活用してください。
`,
tools: [dbAgent.asTool(), codeAgent.asTool()],
});
const result = await mainAgent.run(
"このプロジェクトのデータベーススキーマとソースコードの整合性を確認してください"
);この設計のメリットは、各サブエージェントの権限を最小限に絞れることです。データベースエージェントはDBにしかアクセスできず、コードエージェントはファイルシステムにしかアクセスできません。セキュリティの観点から、これは重要な設計判断です。
ツールの権限制御
MCPサーバーのツールには、Claude Codeの権限管理システムが適用されます。ユーザーの明示的な許可なしに、破壊的な操作(ファイルの削除、データの書き込みなど)は実行されません。
カスタムサーバーを構築する際は、ツールが読み取り専用なのか書き込みを伴うのかを明確に区別し、descriptionにその旨を記述することを推奨します。Claude Codeはdescriptionの内容をもとに、ユーザーへの確認を求めるかどうかを判断する材料の一つとしています。
実務でのMCP活用ユースケース
ここからは、筆者やaduceのチームで実際に活用しているMCPの具体的なユースケースを紹介します。
GitHub連携
もっとも利用頻度が高いのがGitHub MCPサーバーです。
claude mcp add --transport http github https://api.githubcopilot.com/mcp/この設定だけで、Claude Codeから以下のような操作が可能になります。
- Issue一覧の取得と内容の確認
- Pull Requestの作成とレビューコメントの投稿
- リポジトリのブランチやタグの管理
- GitHub Actionsのワークフロー状態の確認
たとえば、「Issue #42の内容を確認して、実装方針をまとめてほしい」と指示するだけで、Claude CodeがGitHub MCPサーバー経由でIssueの内容を取得し、コードベースと照合しながら実装方針を提案してくれます。筆者は日常的にこのワークフローを使っており、Issueを開いてコピー&ペーストする手間が完全になくなりました。
データベースクエリ
PostgreSQL MCPサーバーを使えば、Claude Codeがデータベースに直接クエリを実行できます。
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"type": "stdio",
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}「usersテーブルのスキーマを確認して、新しいマイグレーションファイルを作成してほしい」といった指示に対して、Claude Codeは実際にデータベースのスキーマを参照しながら、正確なマイグレーションSQLを生成できます。
ここで重要なのは、開発環境のデータベースのみを接続対象にすることです。本番データベースへの接続は、誤った書き込みクエリが実行されるリスクがあるため避けるべきです。筆者は開発環境専用の読み取り専用ユーザーを作成し、そのクレデンシャルだけをMCPサーバーに渡すようにしています。
Slack通知
CI/CDパイプラインやタスク完了時にSlackへ通知を送るユースケースです。
claude mcp add --transport stdio slack npx -y @modelcontextprotocol/server-slackClaude Codeでの長時間のコード生成やリファクタリングが完了した際に、「完了したらSlackの#devチャンネルに通知して」と指示しておくことで、作業の完了を自動的にチームに共有できます。
Figmaデザイン連携
Figma MCPサーバーを使うと、デザインファイルの情報をClaude Codeに直接渡せます。
claude mcp add --transport stdio figma npx -y @anthropic/mcp-server-figma「FigmaのデザインカンプからReactコンポーネントを生成してほしい」といった指示に対して、Claude CodeがFigmaのレイアウト情報、カラー値、フォント情報を直接参照しながら、デザインに忠実なコンポーネントコードを生成できます。デザインとコードの間の「伝言ゲーム」を大幅に削減できるユースケースとして、筆者のチームでも導入を進めています。
複数サーバーを組み合わせたワークフロー
MCPの真価が発揮されるのは、複数のサーバーを組み合わせた場面です。以下は、筆者が実際に使っている .mcp.json の例です。
{
"mcpServers": {
"github": {
"url": "https://api.githubcopilot.com/mcp/",
"type": "http"
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"type": "stdio",
"env": {
"DATABASE_URL": "${DEV_DATABASE_URL}"
}
},
"slack": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-slack"],
"type": "stdio",
"env": {
"SLACK_BOT_TOKEN": "${SLACK_BOT_TOKEN}"
}
}
}
}この構成で、たとえば以下のような一連の作業を1つの会話内で完結させられます。
- GitHub IssueからバグレポートのDを取得
- データベースのスキーマを確認して原因を特定
- 修正コードを生成・適用
- テストを実行して問題がないことを確認
- Pull Requestを作成
- Slackにレビュー依頼を投稿
従来であれば、ブラウザでGitHubを開き、データベースクライアントを起動し、エディタでコードを書き、ターミナルでテストを実行し、再びGitHubでPRを作成し、Slackにメッセージを投稿する——という一連の作業を手動で行っていたものが、Claude Codeへの自然言語の指示だけで完結します。
MCPサーバー導入時のチェックリスト
実務への導入に際して、筆者が確認している項目を整理します。
| 確認項目 | 内容 |
|---|---|
| 認証情報の管理 | APIキーやトークンは環境変数で管理し、設定ファイルに直接記述しない |
| 権限の最小化 | MCPサーバーに渡すクレデンシャルは必要最小限の権限に絞る |
| 本番環境の隔離 | 本番のデータベースやサービスには直接接続しない |
| ログの記録 | カスタムサーバーではリクエスト/レスポンスのログを記録する |
| エラー時のフォールバック | MCPサーバーが利用不可な場合の代替手段を用意する |
| チーム内の合意 | どのMCPサーバーを使うか、権限範囲はどこまでかをチームで合意する |
まとめ
本記事では、Claude CodeとMCPを組み合わせた外部ツール連携の全体像を解説しました。改めて要点を整理します。
MCPはAnthropic社が2024年末に公開したオープンプロトコルであり、AIエージェントと外部ツールの間に標準的なインターフェースを提供します。Claude Codeは標準でMCPクライアント機能を内蔵しており、claude mcp add コマンドや .mcp.json ファイルで簡単にサーバーを追加できます。
stdioとHTTP/SSEの2つのトランスポートを用途に応じて使い分け、Tool Searchによるオンデマンドなツール検出でコンテキストの効率的な利用も実現されています。カスタムサーバーの構築にはTypeScriptやPythonのSDKが利用でき、Claude Agent SDKを使えばサブエージェントにMCPツールを持たせた高度なシステムも構築可能です。
MCPの本質的な価値は、「AIエージェントが使えるツールの幅を、統一された方法で拡張できること」にあります。個別のAPI連携コードを書く時代から、プロトコルベースのプラグインアーキテクチャへと移行しつつある今、MCPはその中核を担う技術です。
Claude Codeの基本的な使い方についてはClaude Code使い方ガイドを、MCPの概念的な理解を深めたい場合はMCPとは?AIエージェント連携の新標準をあわせてご覧ください。
MCPを活用したAIエージェント開発や、Claude Codeの導入支援について、ご質問やご相談がありましたらお問い合わせよりお気軽にご連絡ください。