ChatGPTやClaudeに「自社のデータベースや社内APIに繋いでほしい」と思ったことはないだろうか。Model Context Protocol(MCP)は、AIホストと外部ツールをつなぐオープン標準だ。既製サーバーで賄えない場合や、社内専用のツールを公開したい場合は「自作MCPサーバー」が最善解になる。本記事では、PythonのFastMCPライブラリを使って、5ステップで動くMCPサーバーを作り、Claude DesktopやCursorに登録するまでを一気に解説する。

MCPサーバーを自作する理由
2026年6月時点で公開MCPサーバーは1万以上あり、SDKの月次ダウンロードは9,700万回を超えた。それでも「自作」が必要なシーンは多い。
- 社内専用API:社外に公開できないSlack連携・ERPシステム・独自DB
- 独自ロジック:既製サーバーに存在しないデータ整形や認証フロー
- クロスクライアント対応:Claude Desktop・Cursor・社内エージェントで同じツールを使い回す
MCPを使えば「一度書けばどこでも動く」が実現する。よく言われる「AI版USB-C」という表現が的確だ。
FastMCP vs 公式SDK:どちらを選ぶ?
Pythonで自作する場合、主に2つの選択肢がある。
| 比較項目 | FastMCP | MCP Python SDK(低レベル) |
|---|---|---|
| ボイラープレート量 | 最小(デコレーター1行) | 多め(ハンドラー手動登録) |
| API スタイル | FastAPI風デコレーター | 明示的なハンドラー登録 |
| トランスポート切り替え | 1行で stdio ↔ HTTP | 手動配線が必要 |
| プロトコル制御 | 高レベル抽象(制御は限定) | 低レベルまで制御可能 |
| 向いているケース | 新規サーバーを素早く作る | 仕様準拠が必要な本番実装 |
初めて作るなら FastMCP 一択。公式SDKの上に薄く乗っかる形なので、後から移行する必要があってもスムーズだ。
5ステップで作るMCPサーバー
Step 1:環境構築
Python 3.10以上が前提。仮想環境を作り、SDKをインストールする。
python -m venv mcp-env
source mcp-env/bin/activate # Windows: mcp-env\Scripts\Activate.ps1
pip install "mcp>=1.27,<2"
mcp>=1.27,<2 とピン留めするのは、v2系がまだアルファ段階のため。DigitalOceanのチュートリアルでも同様に推奨されている。
Step 2:最小サーバーを書く
my_server.py を作り、以下を貼り付ける。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("MyServer")
@mcp.tool()
def greet(name: str) -> str:
"""指定した名前に挨拶を返す"""
return f"こんにちは、{name}さん!"
if __name__ == "__main__":
mcp.run() # デフォルトは stdio トランスポート
たったこれだけでClaudeが呼び出せるMCPサーバーになる。@mcp.tool() デコレーターが関数をMCPツールとして自動公開する。
Step 3:ツール・リソース・プロンプトの使い分け
MCPには3種類のプリミティブがある。それぞれ用途が異なる。
| プリミティブ | デコレーター | 向いている用途 | Claudeからの見え方 |
|---|---|---|---|
| Tool(ツール) | @mcp.tool() |
APIコール・DB書き込み・計算など副作用あり操作 | 関数として呼び出し |
| Resource(リソース) | @mcp.resource() |
ファイル・ドキュメント・設定などの読み取り専用データ | ファイルを読む感覚 |
| Prompt(プロンプト) | @mcp.prompt() |
再利用可能なプロンプトテンプレート | スラッシュコマンド的に呼び出し |
例えば社内ナレッジベースを公開するなら、検索はTool・ドキュメント本文はResource と分けると整理しやすい。Promptの詳しい仕様はSpeakeasyのドキュメントが参考になる。

Step 4:Claude Desktop・Cursorに登録する
サーバーをローカルホストに認識させるには、各クライアントの設定ファイルを編集する。絶対パスを使うのが鉄則だ。
Claude Desktop(macOS):~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"my-server": {
"command": "/Users/yourname/mcp-env/bin/python",
"args": ["/Users/yourname/my_server.py"]
}
}
}
Cursor:~/.cursor/mcp.json
{
"mcpServers": {
"my-server": {
"command": "/Users/yourname/mcp-env/bin/python",
"args": ["/Users/yourname/my_server.py"]
}
}
}
Claude Desktopを再起動し、/mcp コマンドでサーバー名が「connected」と表示されれば成功だ。Cursorはエージェントモード中にツールが自動で使われる。
Step 5:動作確認とデバッグ
stdioトランスポートでは、print() を使うとJSON-RPCメッセージが壊れる。ログは必ず stderr に出す。
import sys
print("デバッグ情報", file=sys.stderr)
Claude Desktopのログは macOS では ~/Library/Logs/Claude/mcp.log に記録される。接続エラーが出たら、まず仮想環境のPythonパスとスクリプトのパスを確認しよう。
ローカル(stdio)か、リモート(Streamable HTTP)か
本番運用を考えると、Streamable HTTP トランスポートが選択肢に入る。2025年3月に策定され、SSEは現在非推奨となった。
| stdio(ローカル) | Streamable HTTP(リモート) | |
|---|---|---|
| 起動方法 | クライアントがサブプロセスとして起動 | URLを貼るだけ(Claude Desktop Connectors) |
| 認証 | OS権限に依存 | OAuth / Bearer Tokenをヘッダーで渡す |
| スケール | 単一マシン | クラウドで複数ユーザーに提供可能 |
| 向いているケース | 個人・開発・社内1台 | チーム・SaaS提供・Webクライアント対応 |
FastMCPでのStreamable HTTP切り替えは mcp.run(transport="streamable-http") 1行で済む。Cloudflare Agents を使えばエッジでホスティングも可能だ。
活用アイデア:自作MCPサーバーで何ができるか
- 社内ナレッジ検索:Confluence・NotionのAPIをラップし、Claudeが社内ドキュメントに直接アクセス
- データベースクエリ:DuckDB/MotherDuck・Neon PostgreSQL・Redis など既製実装も参考に
- E2Eテスト自動化:Playwright MCP経由でブラウザ操作をClaude Codeに委譲
- Slackチャンネル要約:Slack APIをツールとして公開し、Claudeが直接投稿・要約
- 社内CLIツールのラッパー:既存シェルスクリプトをツールとして薄くラップするだけでAIに使わせられる
まとめ
MCPサーバーを自作するハードルは、FastMCPのおかげで劇的に下がった。@mcp.tool() デコレーターで関数を定義し、パスを設定ファイルに書くだけ。あとはClaude・Cursorが勝手に呼び出してくれる。まずは自分のよく使うAPIを1つラップするところから始めてみよう。
主な情報源
- How to Build an MCP Server in Python — DigitalOcean
- What Is an MCP Server? 2026 Practitioner's Guide — writehuman.ai
- MCP Server Setup Guide for Claude Desktop 2026 — mayhemcode.com
- MCP SDK vs FastMCP: Which Should You Use? — LinkedIn / Ashish Jain
- Transport — Cloudflare Agents docs
- What are MCP prompts? — Speakeasy
- MCP Adoption Statistics 2026 — digitalapplied.com
- Model Context Protocol 公式サイト
各ツールは提供元の規約に従ってご利用ください。情報は各情報源の公開時点のものです。収集・要約はAI、公開判断は人。