Model Context Protocol(MCP)は Anthropic が公開したオープンなプロトコルで、LLM クライアントに外部ツールやリソースを接続するための共通規格である。Claude Desktop は MCP クライアントとして動き、設定ファイルにサーバーを追記するだけで Claude に独自ツールを渡せる。
何が嬉しいのか
- ツールを一度書けば、対応する任意の MCP クライアントから使える
- 権限・入出力スキーマが JSON Schema で明示される
- stdio / SSE など複数のトランスポートに対応
最小のサーバー実装(Python)
公式 SDK mcp を使う。社内の計算ツールを Claude から呼べる状態にしてみる。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("calc-server")
@mcp.tool()
def add(a: float, b: float) -> float:
'''2つの数を加算する'''
return a + b
@mcp.tool()
def tax_included(price: float, rate: float = 0.10) -> float:
'''税込価格を計算する'''
return round(price * (1 + rate))
if __name__ == "__main__":
mcp.run()
関数のドックストリングがそのままツール説明になり、型ヒントが入力スキーマに変換される。
Claude Desktop への登録
claude_desktop_config.json に以下を追記する。パスは OS ごとに異なる(macOS なら ~/Library/Application Support/Claude/)。
{
"mcpServers": {
"calc": {
"command": "python",
"args": ["/absolute/path/to/server.py"]
}
}
}
Claude Desktop を再起動すると、チャット内のツールアイコンに calc が現れる。
リソースも公開できる
ツールは「副作用のある関数」、リソースは「読み取り専用のデータ」と棲み分けされている。社内ドキュメントを渡すならリソースが適切。
@mcp.resource("docs://onboarding")
def onboarding_doc() -> str:
return open("onboarding.md", encoding="utf-8").read()
実運用で気をつける点
-
副作用の強い操作には確認を入れる。ファイル削除・外部 API 課金などは引数に
dry_runを設ける - エラーメッセージは人間向けに書く。LLM はエラー文を読んで次の行動を決めるため、曖昧だと暴走する
- ログを stdout に出さない。stdio トランスポートでは JSON が壊れる。ログは stderr へ
まとめ
MCP は「LLM に自分の道具箱を渡す」ための最短ルートである。SDK を入れて関数にデコレータを付けるだけで、Claude Desktop から即座に呼べる。社内ツールを MCP 化しておくと、別クライアントに乗り換えても資産が生き続けるのも大きい。