自分だけのMCPサーバーをPythonで作る:FastMCPで5ステップ、ClaudeとCursorに自社APIをつなぐ完全ガイド

Claudeスキル・MCP のアイキャッチ

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

AIエージェント・MCPサーバー自作イラスト

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のドキュメントが参考になる。

プログラミング言語アイコン(Pythonを含む)
Photo: jabberwock / CC BY-SA 2.0(Openverse経由)

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つラップするところから始めてみよう。


主な情報源

各ツールは提供元の規約に従ってご利用ください。情報は各情報源の公開時点のものです。収集・要約はAI、公開判断は人。