【2025年最新】MCPサーバーを自作する方法|Claude拡張ガイド
目次
「Claudeに自分のデータベースやAPIを使わせたい」「独自のツールをAIに連携させたい」という方に朗報です。Anthropicが提供するMCP(Model Context Protocol)を使えば、Claudeの機能を自由に拡張できます。
本記事では、MCPサーバーを自作する方法をTypeScript/Pythonのコード例付きで詳しく解説します。プログラミング経験がある方なら、30分程度で基本的なMCPサーバーを作成できるようになります。
この記事でわかること
- MCPの基本概念とアーキテクチャ
- TypeScript/PythonでのMCPサーバー実装方法
- Claude CodeやClaude Desktopへの接続設定
- 実践的なサーバー実装例
1. MCP(Model Context Protocol)とは?
MCP(Model Context Protocol)は、Anthropicが2024年11月に発表したオープンソースのプロトコルです。AIアプリケーションと外部データソース・ツールを接続するための標準化された通信規格として設計されています。
MCPの特徴
- オープンスタンダード:誰でも無料で利用・実装可能
- 双方向通信:リアルタイムなデータのやり取り
- セキュリティ重視:ローカル実行によるデータ保護
- 多言語対応:TypeScript、Python等のSDKを提供
MCPで何ができるのか?
MCPを使うことで、Claudeに以下のような機能を追加できます。
- ローカルファイルの読み書き(ドキュメント管理、コード操作)
- データベースへのアクセス(SQLクエリ実行、データ取得)
- 外部APIとの連携(Slack、GitHub、Notion等)
- Webスクレイピング(最新情報の取得)
- カスタムツールの実行(独自のビジネスロジック)
2. MCPのアーキテクチャと仕組み
MCPの構成要素
MCPはクライアント-サーバーモデルで動作します。
| コンポーネント | 役割 | 例 |
|---|---|---|
| MCPホスト | AIとの対話を管理するアプリケーション | Claude Desktop, Claude Code |
| MCPクライアント | サーバーとの接続を維持するプロトコル層 | ホスト内に組み込み |
| MCPサーバー | 外部リソースを提供する軽量プログラム | 自作サーバー、公開サーバー |
MCPサーバーが提供できる3つの機能
MCPサーバーは以下の3種類の機能(プリミティブ)を公開できます。
Resources
ファイルやデータを読み取り専用で提供。例:ドキュメント、設定ファイル、データベースレコード
Tools
AIが呼び出せる関数を提供。例:API呼び出し、計算処理、データ更新
Prompts
再利用可能なプロンプトテンプレート。例:コードレビュー用プロンプト、翻訳プロンプト
トランスポート方式
MCPは2つの通信方式をサポートしています。
- stdio(標準入出力):ローカル実行向け。プロセス間通信で高速・安全
- SSE(Server-Sent Events):リモートサーバー向け。HTTPベースで柔軟なデプロイが可能
本記事では、Claude CodeやClaude Desktopとの連携に適したstdio方式を中心に解説します。
3. 開発環境のセットアップ
TypeScriptでの開発準備
TypeScriptでMCPサーバーを開発する場合、以下の環境が必要です。
- Node.js 18以上
- npm または yarn
- TypeScript(npm install typescriptでインストール)
プロジェクトを作成し、MCP SDKをインストールします。
# プロジェクト作成
mkdir my-mcp-server
cd my-mcp-server
npm init -y
# MCP SDKと依存関係をインストール
npm install @modelcontextprotocol/sdk zod
npm install -D typescript @types/node
# TypeScript設定
npx tsc --init
Pythonでの開発準備
PythonでMCPサーバーを開発する場合の要件は以下の通りです。
- Python 3.10以上
- uv(推奨)またはpip
# uvを使う場合(推奨)
uv init my-mcp-server
cd my-mcp-server
uv add mcp
# pipを使う場合
pip install mcp
4. 最初のMCPサーバーを作る(TypeScript編)
簡単な「挨拶ツール」を提供するMCPサーバーを作成してみましょう。
ステップ1: サーバーコードの作成
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: "hello-mcp-server",
version: "1.0.0",
});
// ツールを登録
server.tool(
"greet",
"指定された名前に挨拶するツール",
{
name: z.string().describe("挨拶する相手の名前"),
},
async ({ name }) => {
return {
content: [
{
type: "text",
text: `こんにちは、${name}さん!MCPサーバーからの挨拶です。`,
},
],
};
}
);
// stdioトランスポートで起動
const transport = new StdioServerTransport();
await server.connect(transport);
console.error("Hello MCP Server is running...");
ステップ2: ビルドと実行
package.jsonにビルドスクリプトを追加します。
{
"type": "module",
"scripts": {
"build": "tsc",
"start": "node dist/index.js"
}
}
また、tsconfig.jsonを以下のように設定します。
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "./dist",
"rootDir": "./src",
"strict": true,
"esModuleInterop": true
},
"include": ["src/**/*"]
}
ビルドを実行します。
npm run build
ポイント
MCPサーバーはstdio経由で通信するため、通常のconsole.logではなくconsole.errorを使ってデバッグ出力します(標準出力はMCP通信に使用されるため)。
5. PythonでMCPサーバーを作る
Python版のMCP SDKを使って同様のサーバーを作成します。
シンプルなサーバー実装
server.pyを作成します。
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
# サーバーインスタンスを作成
server = Server("hello-mcp-server")
# ツール一覧を返すハンドラ
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="greet",
description="指定された名前に挨拶するツール",
inputSchema={
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "挨拶する相手の名前"
}
},
"required": ["name"]
}
)
]
# ツール実行ハンドラ
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "greet":
user_name = arguments.get("name", "ゲスト")
return [
TextContent(
type="text",
text=f"こんにちは、{user_name}さん!MCPサーバーからの挨拶です。"
)
]
raise ValueError(f"Unknown tool: {name}")
# サーバー起動
async def main():
async with stdio_server() as (read_stream, write_stream):
await server.run(
read_stream,
write_stream,
server.create_initialization_options()
)
if __name__ == "__main__":
import asyncio
asyncio.run(main())
FastMCPを使った簡略化
Python版にはFastMCPというデコレータベースの簡略化APIも用意されています。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("hello-server")
@mcp.tool()
def greet(name: str) -> str:
"""指定された名前に挨拶するツール"""
return f"こんにちは、{name}さん!MCPサーバーからの挨拶です。"
if __name__ == "__main__":
mcp.run()
FastMCPを使うと、関数の型ヒントから自動的にスキーマが生成されるため、コード量を大幅に削減できます。
6. Claude Codeへの接続方法
自作したMCPサーバーをClaude Codeから使えるように設定します。
プロジェクト固有の設定(.mcp.json)
プロジェクトルートに.mcp.jsonファイルを作成します。
{
"mcpServers": {
"hello-server": {
"command": "node",
"args": ["/path/to/my-mcp-server/dist/index.js"]
}
}
}
Python版の場合は以下のように設定します。
{
"mcpServers": {
"hello-server": {
"command": "python",
"args": ["/path/to/my-mcp-server/server.py"]
}
}
}
グローバル設定
全プロジェクトで共通して使うサーバーは、~/.claude/settings.jsonに設定できます。
{
"mcpServers": {
"hello-server": {
"command": "node",
"args": ["/absolute/path/to/dist/index.js"]
}
}
}
設定の確認
Claude Codeで以下のコマンドを実行し、サーバーが認識されているか確認します。
claude mcp list
動作確認
設定後、Claude Codeを起動すると自動的にMCPサーバーが起動されます。「greetツールを使って太郎さんに挨拶して」と指示すると、自作ツールが呼び出されます。
7. 実践例:データベース連携サーバー
より実用的な例として、SQLiteデータベースを操作するMCPサーバーを作成してみましょう。
TypeScriptでの実装
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
import Database from "better-sqlite3";
const db = new Database("./data.db");
const server = new McpServer({
name: "sqlite-mcp-server",
version: "1.0.0",
});
// テーブル一覧を取得するツール
server.tool(
"list_tables",
"データベース内のテーブル一覧を取得",
{},
async () => {
const tables = db
.prepare("SELECT name FROM sqlite_master WHERE type='table'")
.all();
return {
content: [
{
type: "text",
text: JSON.stringify(tables, null, 2),
},
],
};
}
);
// SELECT クエリを実行するツール
server.tool(
"query",
"SELECT文を実行してデータを取得",
{
sql: z.string().describe("実行するSELECT文"),
},
async ({ sql }) => {
// SELECT文のみ許可(安全対策)
if (!sql.trim().toUpperCase().startsWith("SELECT")) {
return {
content: [{ type: "text", text: "エラー: SELECT文のみ許可されています" }],
isError: true,
};
}
try {
const rows = db.prepare(sql).all();
return {
content: [{ type: "text", text: JSON.stringify(rows, null, 2) }],
};
} catch (error) {
return {
content: [{ type: "text", text: `エラー: ${error}` }],
isError: true,
};
}
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
公開されているMCPサーバー例
参考として、既に公開されている代表的なMCPサーバーを紹介します。
| サーバー名 | 機能 |
|---|---|
| @modelcontextprotocol/server-filesystem | ファイルの読み書き、ディレクトリ操作 |
| @modelcontextprotocol/server-github | GitHub API操作(リポジトリ、PR、Issue) |
| @modelcontextprotocol/server-slack | Slackメッセージ送信、チャンネル操作 |
| @modelcontextprotocol/server-puppeteer | Webブラウザ操作、スクレイピング |
8. よくある質問
Q. MCPサーバーとは何ですか?
MCPサーバーは、Anthropicが開発したModel Context Protocol(MCP)に基づいて動作するサーバーです。AIモデル(Claude等)が外部ツールやデータソースと連携するための標準化されたインターフェースを提供します。
Q. MCPサーバーを作るには何が必要ですか?
Node.js(TypeScriptの場合)またはPython 3.10以上が必要です。公式SDKとして@modelcontextprotocol/sdk(npm)またはmcp(pip)を使用します。プログラミング経験があれば30分程度で基本的なサーバーを作成できます。
Q. MCPサーバーでできることは?
MCPサーバーでは、Resources(ファイルやデータの読み取り)、Tools(関数の実行)、Prompts(プロンプトテンプレート)の3種類の機能を提供できます。これによりClaudeにデータベース接続、API呼び出し、ファイル操作などの能力を追加できます。
Q. Claude Codeに自作MCPサーバーを追加するには?
プロジェクトルートに.mcp.jsonファイルを作成し、サーバーの起動コマンドを設定します。例: {"mcpServers": {"my-server": {"command": "node", "args": ["dist/index.js"]}}} として保存すると、Claude Codeが自動的にサーバーを認識します。
Q. MCPは無料で使えますか?
はい、MCPはオープンソースプロトコルであり、SDK、仕様、サンプルコードすべて無料で利用できます。ただし、MCPを利用するクライアント(Claude Desktop、Claude Code等)の利用料金は別途必要です。
まとめ
本記事では、MCPサーバーを自作する方法を詳しく解説しました。
この記事のポイント
- MCPはAnthropicのオープンプロトコルで、AIと外部ツールを接続できる
- 3つのプリミティブ(Resources, Tools, Prompts)を提供可能
- TypeScript/Pythonの公式SDKで簡単に開発できる
- .mcp.jsonでClaude Codeに接続設定
- データベース連携やAPI操作など、実用的なサーバーも構築可能
MCPを活用することで、Claudeの能力を大幅に拡張できます。まずは簡単なツールから始めて、徐々に機能を追加していくことをおすすめします。
公式ドキュメント(modelcontextprotocol.io)も参考にしながら、独自のMCPサーバー開発に挑戦してみてください。