MCP_Server_Setup について
MCP_Server_Setupは、開発者向けのPython MCPサーバー構築・実行例です。ツールやリソースの定義、テスト、stdioまたはSSEでのクライアント接続を扱います。
主な機能
- 01MCPツールとリソースの定義
- 02MCP Inspectorでのテスト
- 03Claude Desktopへの登録
- 04stdioとSSEの利用
活用シーン
- 01MCPサーバーのローカルテスト
- 02Claude Desktopへのサーバー接続
- 03stdioまたはSSEでのクライアント接続
MCP 対応
MCPサーバーの構築方法と、stdioまたはSSEによるMCPクライアントとの接続方法を示します。定義したツールやリソースをクライアントに公開できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("DemoServer")
@mcp.tool()
def say_hello(name: str) -> str:
"""Say hello to someone
Args:
name: The person's name to greet
"""
return f"Hello, {name}! Nice to meet you."
if __name__ == "__main__":
mcp.run()
サーバーの実行
MCP サーバーを実行する方法はいくつかあります。
1. MCP Inspector を使った開発モード
サーバーをテストする最も簡単な方法は、MCP Inspector を使うことです。
mcp dev server.py
これにより、サーバーがローカルで実行され、サーバーのツールやリソースを直接操作できるウェブベースのツールである MCP Inspector に接続されます。テストに最適です。
2. Claude Desktop との連携
Claude Desktop がインストールされている場合、Claude で使えるようにサーバーをインストールできます。
mcp install server.py
これにより、サーバーが Claude Desktop の設定に追加され、Claude から利用できるようになります。
3. 直接実行(必要な場合、または SSE の場合のみ)
サーバーを直接実行することもできます。
# Method 1: Running as a Python script
python server.py
# Method 2: Using UV (recommended)
uv run server.py
MCP サーバーを実行するとどうなるか
MCP サーバーを実行すると、次の処理が行われます。
- サーバーは、定義した機能(ツール、リソースなど)を初期化します。
- 特定のトランスポートで接続を待ち受けます。
デフォルトでは、MCP サーバーは従来のウェブサーバー用ポートを使いません。代わりに、次のいずれかを使います。
- stdio トランスポート:サーバーは標準入力と標準出力を介して通信します(
mcp runのデフォルトで、Claude Desktop との連携に使用されます)。 - SSE トランスポート:HTTP ベースの通信に使用されます(明示的に設定した場合に使用されます)。
特定のポートを使って HTTP 経由でサーバーを公開するには、SSE トランスポートを使うようにサーバーを変更する必要があります。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("MyServer", host="127.0.0.1", port=8050)
# Add your tools and resources here...
if __name__ == "__main__":
# Run with SSE transport on port 8000
mcp.run(transport="sse")
その後、次のように実行できます。
python server.py
これにより、サーバーが http://127.0.0.1:8050 で起動します。
クライアント側の実装(標準入出力を使用)
それでは、サーバーを使うクライアントの作成方法を見てみましょう。
import asyncio
import nest_asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def main():
server_params = StdioServerParameters(
command="python", # The command to run your server
args=["server.py"], # Arguments to the command
)
async with stdio_client(server_params) as (read_stream, write_stream):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools_result = await session.list_tools()
print("Available tools:")
for tool in tools_result.tools:
print(f" - {tool.name}: {tool.description}")
result = await session.call_tool("add", arguments={"a": 2, "b": 3})
print(f"2 + 3 = {result.content[0].text}")
if __name__ == "__main__":
asyncio.run(main())
このクライアントは、次の処理を行います。
- stdio 経由でサーバーへの接続を作成します。
- MCP セッションを確立します。
- 利用可能なツールを一覧表示します。
- 引数を指定して
addツールを呼び出します。
クライアント側の実装(Server-Sent Events を使用)
SSE を使ってサーバーに接続する方法は次のとおりです。
import asyncio
import nest_asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
async def main():
async with sse_client("http://localhost:8050/sse") as (read_stream, write_stream):
async with ClientSession(read_stream, write_stream) as session:
await session.initialize()
tools_result = await session.list_tools()
print("Available tools:")
for tool in tools_result.tools:
print(f" - {tool.name}: {tool.description}")
result = await session.call_tool("add", arguments={"a": 2, "b": 3})
print(f"2 + 3 = {result.content[0].text}")
if __name__ == "__main__":
asyncio.run(main())
どちらの方法を選ぶべきか
- stdio を使用するのは、クライアントとサーバーが同じプロセス内で実行される場合、またはクライアントからサーバープロセスを直接起動する場合です。
- HTTP を使用するのは、サーバーがクライアントとは別に実行される場合です。異なるマシンやコンテナで実行されることもあります。
ほとんどの本番環境におけるバックエンド連携では、HTTP 方式のほうが分離性とスケーラビリティに優れています。一方、stdio 方式は開発環境や密結合システムでは、よりシンプルな場合があります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。