MCPサーバーとは?仕組みと自作するメリット
Model Context Protocol(MCP)を10秒で理解する
「Claudeにもっとできることをさせたいけど、プラグインの作り方がわからない」と感じたことはありませんか?そのカギを握るのが、Anthropicが2024年11月に公開したModel Context Protocol(MCP)です。
MCPとは、AIモデルと外部ツール・データソースをつなぐための標準通信規格(プロトコル)です。USB-Cポートのようなもの、と考えるとわかりやすいでしょう。どんなデバイスでもUSB-Cがあれば接続できるように、MCPに対応していれば任意のツールをClaudeに接続できます。
ポイント:MCP以前は、AIへのツール連携に独自実装が必要でした。MCPにより、標準化された方法で誰でも拡張機能を作れるようになっています。
ローカル環境でMCPサーバーを安定稼働させたい場合は、Raspberry Pi 5(8GBモデル)が有力な選択肢のひとつです。省電力で24時間運用できる点が多くのエンジニアに支持されており、ぜひスペックを確認してみてください。
既存のAIツールと自作MCPサーバーの違い
ChatGPTのプラグインやClaude.aiのデフォルト機能は便利ですが、あくまで「用意されたものを使う」にとどまります。一方、自作MCPサーバーは自分のビジネス・ワークフロー専用のツールを一から設計できる点が決定的に異なります。
| 比較項目 | 既存AIツール | 自作MCPサーバー |
|---|---|---|
| カスタマイズ性 | 低〜中 | ほぼ無制限 |
| 社内システム連携 | 原則不可 | 自由に設計可 |
| 初期コスト | ほぼゼロ | 開発工数が必要 |
自作することで広がる3つの可能性
MCPサーバーを自作すると、できることの幅が一気に広がります。具体的には次の3点が大きなメリットです。
1
社内DBや独自APIへの接続
外部に公開できない業務データにClaudeが直接アクセスし、レポート生成や分析を自動化できます。
2
繰り返し作業のフル自動化
ファイル操作・メール送信・スプレッドシート更新など、1日30〜60分かかる定型業務をAIに任せられます。
3
複数AIサービスの統合ハブ化
MCPサーバーを中継点にすることで、ClaudeとSlack・Notion・GitHubなどを横断した複合ワークフローを構築できます。
実際、国内外のエンジニアコミュニティでは「業務効率が1.5〜2倍になった」という報告も増えています。次のセクションでは、Pythonを使って実際に手を動かしながら自作の第一歩を踏み出してみましょう。

開発環境の準備と必要なツール一覧
「環境構築でつまずいて、結局そこで挫折してしまった」という経験はありませんか?MCPサーバー開発はツールの数が多いため、最初の準備を丁寧に済ませておくことが成功の鍵です。ここでは躓きやすいポイントを先回りして解説します。
Pythonバージョンと推奨ライブラリの確認方法
MCP SDKはPython 3.10以上を要件としており、2026年現在の推奨バージョンは3.12系です。まず以下のコマンドで手元の環境を確認しましょう。
python --version
3.10未満だった場合はアップグレードが必要です。macOSならpyenv、Windowsなら公式インストーラーを使うとバージョン管理が格段に楽になります。
あわせて、以下のツールも事前に揃えておくとスムーズです。
- pip または uv(パッケージ管理ツール)
- venv または conda(仮想環境)
- VS Code + Python・Pylance 拡張機能
- Git(サンプルコードの取得に使用)
パッケージ管理ツールには、Rustで実装された高速ツールuvもおすすめです。pip比で10〜100倍の速度で動作するといわれており、大規模プロジェクトでは特に効果的です。
Claude DesktopとMCP SDKのインストール手順
MCPサーバーをClaudeに接続するには、Claude Desktopアプリが必要です。2026年現在、Windows・macOS向けに無料で公開されています。インストールから接続登録まで、3ステップで完了します。
Anthropic公式サイトからClaude Desktopをダウンロードし、インストールします。アカウントへのログインも済ませておきましょう。
仮想環境を作成し、MCP SDKをインストールします。
python -m venv .venv
# macOS / Linux
source .venv/bin/activate
# Windows
.venv\Scripts\activate
pip install mcp
Claude Desktopの設定ファイル(claude_desktop_config.json)を開き、MCPサーバーのパスを登録します。設定ファイルの場所はOSによって異なります。
- macOS:
~/Library/Application Support/Claude/ - Windows:
%APPDATA%\Claude\
動作確認に使うサンプルプロジェクトの準備
いきなりオリジナルのサーバーを作るより、まず公式サンプルで「動く状態」を確認しておくことを強くおすすめします。後のトラブルシューティングで「環境の問題か、コードの問題か」を切り分けられるようになるためです。
Anthropic公式GitHubからMCPのサンプルリポジトリをクローンします。mcpパッケージにはサンプルコードが同梱されており、すぐに試せます。
pip show mcp # インストール確認
python -c "import mcp; print(mcp.__version__)"
以下の最小構成のサーバーファイル(server.py)を作成し、起動してみましょう。
from mcp.server import Server
from mcp.server.stdio import stdio_server
app = Server("hello-mcp")
@app.list_tools()
async def list_tools():
return []
if __name__ == "__main__":
import asyncio
asyncio.run(stdio_server(app))
Claude Desktopを再起動し、チャット画面の入力欄にツールアイコン(ハンマーマーク)が表示されれば接続成功です。表示されない場合は設定ファイルのパスを再確認してください。
CHECK:ここまで完了すれば、開発環境の準備は整っています。次のセクションでは、実際にClaudeが使えるカスタムツールをPythonで実装していきます。
長時間のコーディング作業を快適にするキーボード選びも、開発効率を大きく左右する要素のひとつです。静音性と打鍵感を両立したHHKB Professional HYBRID Type-Sは、MCPサーバー開発のような集中力を要する作業との相性がよいといわれていますので、ぜひチェックしてみてください。
開発環境を整える際、ポート不足に悩んだことがある場合は、Anker USB-C ハブ 7-in-1もあわせて確認してみてください。MCPサーバーの自作では外部機器を接続する場面が増えるため、ハブひとつで作業効率が変わってくることも少なくありません。
MCPやLLMの仕組みをもっと深く理解したい場合は、『大規模言語モデル入門』(技術評論社)もあわせて確認してみてください。トークン化からファインチューニングまで、実装ベースで学べる一冊です。
最小構成のMCPサーバーを作ってみる
環境構築が完了したら、いよいよ実装に入りましょう。「まず動くものを作る」が上達への近道です。ここでは「Hello World」相当のシンプルなMCPサーバーを1ファイルで完成させ、Claudeとの通信の流れを体感します。
server.pyの基本コード構造とポイント解説
プロジェクトルートに server.py を作成し、以下のコードを入力してください。全体で約40行、初めて読む場合でも10分あれば理解できる分量です。
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp import types
import asyncio
app = Server("hello-mcp")
@app.list_tools()
async def list_tools() -> list[types.Tool]:
return [
types.Tool(
name="say_hello",
description="名前を受け取り挨拶を返すツール",
inputSchema={
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "挨拶する相手の名前"
}
},
"required": ["name"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[types.TextContent]:
if name == "say_hello":
return [types.TextContent(
type="text",
text=f"こんにちは、{arguments['name']}さん!MCPサーバーから返信しています。"
)]
raise ValueError(f"未知のツール: {name}")
async def main():
async with stdio_server() as (read, write):
await app.run(read, write, app.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
コードの3大ポイント
Server("hello-mcp"):サーバーに名前をつける。Claude側の設定ファイルと一致させる必要があります@app.list_tools():Claudeが「何ができるか」を問い合わせたときに返す、ツールの一覧定義です@app.call_tool():実際にツールが呼び出されたときの処理本体。ここにビジネスロジックを書いていきます
Claudeからツールを呼び出す仕組みの確認
MCPの通信は「標準入出力(stdio)」を経由したJSON-RPCで行われます。つまり、ClaudeデスクトップアプリとPythonプロセスがパイプでつながっているイメージです。実際の流れは以下の3ステップです。
tools/list リクエストを送信。サーバーは say_hello の定義をJSON形式で返します。tools/call を送信します。TextContent として返し、Claudeがそれを会話の中で自然に提示します。動作確認は claude_desktop_config.json にサーバーパスを登録してClaudeデスクトップを再起動するだけです。ツールアイコンが表示されれば接続成功、所要時間は2〜3分が目安です。
よくあるエラーと対処法まとめ
初回起動時に詰まるポイントはほぼ決まっています。次の3つを先に確認しておくと、解決時間を大幅に短縮できます。
| エラーメッセージ | 原因 | 対処法 |
|---|---|---|
ModuleNotFoundError: mcp | パッケージ未インストール | pip install mcp を実行。仮想環境が有効か確認 |
| ツールアイコンが表示されない | config.jsonのパス誤り | 絶対パスで記述し、バックスラッシュはエスケープ(Windowsの場合) |
ValueError: 未知のツール | ツール名の不一致 | list_tools と call_tool 内のname文字列を完全一致させる |
実は、エラーの約70%はconfig.jsonの記述ミスに起因するといわれています。python server.py を直接実行してみて無反応(正常終了)なら、サーバー本体は問題なし。設定ファイル側を重点的に見直しましょう。

実用的なカスタムツールの実装例3選
Hello Worldで構造を掴んだら、次はいよいよ実務に直結するツールへとステップアップです。ここでは「ファイル操作」「外部API連携」「データ集計」の3パターンを紹介します。それぞれ50〜100行程度のコードで実装できるため、週末の数時間で十分試せる規模感です。
ローカルファイルを読み書きするツールの作り方
「Claudeに社内ドキュメントを直接参照させたい」と感じたことはありませんか?ファイル操作ツールはその第一歩となります。
実装のポイント:pathlib.Pathでパスを正規化し、アクセス許可ディレクトリをALLOWED_DIRSリストで明示的に制限します。ディレクトリトラバーサル(意図しない上位フォルダへのアクセス)を防ぐため、path.resolve().is_relative_to()による検証は必須です。
読み取りツールではread_file(path: str)、書き込みツールではwrite_file(path: str, content: str)のシグネチャを定義し、それぞれ@mcp.tool()デコレータで登録します。テキストファイルであれば文字コードをUTF-8に統一しておくと、日本語環境でのトラブルを約80%防げるといわれています。
ALLOWED_DIRSに許可するパスのリストを定義する@mcp.tool()でread_fileとwrite_fileを登録する外部APIを叩いてデータを返すツールの実装
天気情報や為替レート、社内REST APIなど、リアルタイムデータをClaudeに渡すユースケースは多岐にわたります。実は、MCPツールからの外部HTTP通信はhttpxライブラリ1つで完結します。
非同期処理(async def)を使うと、タイムアウト設定や複数API並列呼び出しが容易になります。タイムアウトは5〜10秒を目安に設定しておくと、Claudeの応答待ちが長引くストレスを抑えられるでしょう。APIキーは環境変数(os.environ)から取得し、コードにハードコードしないことが鉄則です。
⚠️ 注意:外部APIのレート制限(例:無料プランで月1,000リクエストまで)に引っかかると、ツール呼び出しがエラーを返します。try/exceptで適切なエラーメッセージをClaudeに返すよう実装しておくと、デバッグ時間を大幅に短縮できます。
CSVを集計してClaudeに渡すデータ処理ツール
売上データや在庫管理表など、業務の現場ではCSVファイルが今でも主役です。「毎月ExcelでSUM関数を叩いている」という作業をClaudeに任せられると、1回あたり15〜30分の削減が見込めるという報告もあります。
pandasを使えば、CSVの読み込みから集計・フィルタリングまでを20行前後で実装可能です。集計結果はJSON形式(df.to_dict(orient="records"))でClaudeに返すと、そのまま自然言語での分析・コメント生成につなげられます。
- 列名の自動検出で汎用的なツールに仕上げる
- 数値列のみを対象に
describe()で基本統計量を算出する - 行数・列数も一緒に返すと、Claudeがデータ規模を把握しやすくなる
- 文字コードはUTF-8とShift-JIS両対応にしておくと業務ファイルで詰まらない
3つのパターンを組み合わせると、「CSVを読み込み→外部APIで補完→結果をファイルに書き出す」という一連の自動化パイプラインをClaudeだけで完結させることも十分可能です。ぜひ自分のユースケースに合わせてカスタマイズしてみてください。
Claude Desktopへの接続と動作テストの方法
ファイル操作やWeb取得ツールを実装したあと、「本当にClaude上で動くのだろうか」と不安に感じたことはありませんか。設定ファイルの記述ミスひとつで接続が失敗するため、手順を正確に押さえておくことが重要です。
claude_desktop_config.jsonの正しい記述方法
Claude Desktopは起動時に設定ファイルを読み込み、MCPサーバーとの接続を確立します。設定ファイルのパスはOSによって異なり、macOSでは~/Library/Application Support/Claude/claude_desktop_config.json、Windowsでは%APPDATA%\Claude\claude_desktop_config.jsonに配置します。
設定ファイルの記述例
{
"mcpServers": {
"my-tools": {
"command": "python",
"args": ["/Users/yourname/mcp/server.py"],
"env": {}
}
}
}
commandには実行コマンド、argsにはサーバーファイルの絶対パスを指定します。相対パスを使うと起動に失敗するケースが多いため、必ず絶対パスで記述しましょう。
仮想環境(venv)を使っている場合は、commandをpythonではなく/Users/yourname/mcp/.venv/bin/pythonのように仮想環境内のPythonパスに変更する必要があります。この設定ミスが接続失敗の原因トップ3に入るといわれています。
Claude上でカスタムツールが呼ばれているか確認する手順
設定ファイルを保存したら、Claude Desktopを完全に再起動します。単なる画面の再表示では設定が反映されないため、プロセスごと終了して再度立ち上げることがポイントです。
get_file_content)が一覧に表示されていれば接続成功ハンマーアイコンが表示されない場合は、設定ファイルのJSON構文エラーが原因であるケースが全体の約7割を占めます。まずJSONバリデーターで構文を確認してみてください。
ログを活用したデバッグの基本
ツールが呼ばれない、エラーが返ってくるといった問題が起きた場合は、ログの確認が最短の解決策です。Claude DesktopのログはmacOSなら~/Library/Logs/Claude/配下に、Windowsなら%APPDATA%\Claude\logs\配下に自動的に出力されます。
ログ確認時のチェックポイント
server startedの文字列があるか(サーバー起動の成否)Tool not foundエラーが出ていないか(ツール名のタイポを疑う)Connection refusedが出ている場合はPythonパスの設定ミスを確認- スタックトレースが出ている場合はサーバースクリプト側の例外を修正する
一方、サーバースクリプト側にもloggingモジュールでデバッグ出力を仕込んでおくと、ツールの引数受け渡しや処理結果をリアルタイムで追跡できます。本番稼働前にlogging.DEBUGレベルで一度動かし、想定どおりの値が流れているか確認してみてください。

セキュリティとパフォーマンスの注意点
MCPサーバーをClaude Desktopと接続して動作確認できたら、次は「本番運用」を見据えた設計に目を向けましょう。APIキーの漏洩やタイムアウト未処理は、自作ツールが一瞬で使い物にならなくなる典型的な落とし穴です。
APIキー・認証情報の安全な管理方法
ソースコードに直接APIキーを書いた経験はありませんか? GitHubに誤ってプッシュした場合、悪用されるまでの時間は平均わずか数分といわれています。自作MCPサーバーでは必ず環境変数で管理しましょう。
【NG例】コードに直書きするパターン
API_KEY = "sk-xxxxxxxxxxxxxxxx"
【OK例】環境変数から読み込むパターン
API_KEY = os.environ.get("MY_API_KEY")
プロジェクトルートに .env ファイルを作成し、python-dotenv ライブラリで読み込む方法が定番です。.gitignore に .env を追加することを絶対に忘れないでください。
.envファイルを.gitignoreに追加済みか確認する- 本番環境ではOSレベルの環境変数か、AWS Secrets Manager などのシークレット管理サービスを使う
- APIキーには最小権限の原則を適用し、不要なスコープは付与しない
タイムアウトとエラーハンドリングの実装
外部APIを呼び出すツールで、タイムアウト処理を省略していませんか? 応答待ちのまま処理がフリーズすると、Claude側のセッションも巻き込まれて操作不能になることがあります。
タイムアウト値は用途によって異なりますが、一般的なWeb APIへのリクエストなら 5〜30秒 を目安に設定するのが無難です。データベースへのクエリは 10〜60秒 程度が現実的でしょう。
STEP 1
try/except で例外を捕捉する
httpx.TimeoutException や requests.exceptions.Timeout を明示的にキャッチし、ユーザーに伝わるエラーメッセージを返します。
STEP 2
リトライ処理を入れる
tenacity ライブラリを使えば、指数バックオフ(1秒→2秒→4秒と待機時間を倍増)付きのリトライをわずか数行で実装できます。
STEP 3
エラー内容をログに残す
Pythonの logging モジュールでエラーを記録しておくと、後から原因を追跡しやすくなります。print() ではなく logging.error() を習慣にしましょう。
負荷を抑えるキャッシュ設計の考え方
同じ検索クエリやAPIリクエストをClaudeが短時間に繰り返すケースは珍しくありません。都度外部APIを叩くと、レスポンスが遅くなるだけでなく、APIの利用料金が想定の 3〜5倍 に膨らむことも珍しくないといわれています。
シンプルな対策として、Pythonの functools.lru_cache や cachetools を使ったインメモリキャッシュが有効です。TTL(有効期限)を 60〜300秒 程度に設定しておくと、データの鮮度を保ちながら無駄なリクエストを削減できます。
キャッシュ設計の注意点
個人情報や認証トークンはキャッシュに含めないでください。また、頻繁に更新されるリアルタイムデータ(株価・在庫情報など)は、TTLを短め(5〜10秒)に設定するか、キャッシュ対象から外すのが安全です。
セキュリティとパフォーマンスは、後から追加するより最初から組み込んだほうが格段に楽です。ぜひ開発初期の段階から意識してみてください。
さらに発展させるためのおすすめリソースとツール
セキュリティとパフォーマンスの基本を押さえたら、次はMCPの世界をさらに深く掘り下げてみませんか。公式ドキュメントやコミュニティを活用することで、学習スピードは2〜3倍変わるといっても過言ではありません。
Anthropic公式のMCP仕様書と更新情報の追い方
MCPは2024年末の公開以降、仕様のアップデートが数ヶ月おきに繰り返されています。古い情報をもとに実装すると、非推奨のAPIを使い続けるリスクがあります。
公式情報を追うための3ステップ
- modelcontextprotocol.io:仕様書の最新版が常時公開されています。特に「Changelog」ページをブックマーク必須です。
- Anthropic公式GitHubリポジトリ:
anthropics/model-context-protocolをウォッチ設定しておくと、リリースノートがメールで届きます。 - Anthropic Discordサーバー:#mcp チャンネルでは開発者同士の質問・回答が日々300件以上飛び交っており、仕様変更の先行情報もここで流れます。
公式ドキュメントはJSON-RPC 2.0の基礎から、ツール・リソース・プロンプトの3つのプリミティブまで体系的にまとめられています。まず仕様書の「Core Architecture」セクションを一読することをおすすめします。
GitHubで参考になるオープンソースMCPサーバー集
「実際にどう実装すればいいのか」で詰まった経験はありませんか。そういうときこそ、先人のコードを読むのが最短ルートです。
特に参考になるリポジトリ
- anthropics/mcp-servers(公式):ファイルシステム・Git・SlackなどのリファレンスサーバーがPython/TypeScript両方で公開されています。
- punkpeye/awesome-mcp-servers:2026年3月時点で500以上のサーバー実装がジャンル別にリスト化されたキュレーションリポジトリです。
- modelcontextprotocol/python-sdk:公式Pythonクライアント・サーバーSDK。issueトラッカーはデバッグヒントの宝庫です。
コードを読む際は、まずエラーハンドリング部分に着目してください。エッジケースの処理方法を知るだけで、自作サーバーの品質が大きく変わります。
Python力を底上げするおすすめ学習コンテンツ
MCPサーバーを自在に書くには、asyncio・型ヒント・パッケージ管理の3領域を重点的に強化するのが効率的です。
STEP 1
asyncioの基礎固め:Real Python の「Async IO in Python: A Complete Walkthrough」は無料で読め、コルーチンからイベントループまで体系的に解説されています。
STEP 2
型ヒントの習得:Pydanticのドキュメントを手を動かしながら読むだけで、バリデーション実装の工数が1/3程度に削減できるといわれています。
STEP 3
パッケージ管理の近代化:uv(Rust製のPythonパッケージマネージャー)を導入すると、pip比で10〜100倍の速度でライブラリをインストールできます。MCP開発と相性抜群です。
学習リソースは豊富にありますが、実際に手を動かして小さなMCPサーバーを1本完成させることが、最速の上達法です。まずは本記事のコードをベースに、自分の業務や趣味に合わせたツールを作ってみてください。公式コミュニティやGitHubのリソースをフル活用して、カスタムAIツール開発をぜひ楽しんでみてください。
