PythonでMCPサーバーを動かしてみる

MCP

はじめに

MCP (Model Context Protocol) は、AIエージェントが外部ツールやリソースにアクセスするための標準プロトコルです。
この記事では、Python 用の SDK を使って MCP サーバーを作成し、http でアクセスできる状態にしてみます。

プロジェクト構成

python-mcp-handson
├── Dockerfile
├── README.md
├── pyproject.toml
├── src
│   └── main.py
└── uv.lock

セットアップ

uv で Python プロジェクトを作成し、MCP ライブラリを追加します。

mkdir python-mcp-handson
cd python-mcp-handson
uv init
uv add "mcp[cli]"

サーバーの実装

src/main.py に MCP サーバーのコードを記述します。
ホストの設定以外は公式ドキュメントのサンプルコードとほぼ同じです。

from mcp.server.fastmcp import FastMCP

# Stateless server with JSON responses (recommended)
mcp = FastMCP(
    "StatelessServer", stateless_http=True, json_response=True, host="0.0.0.0" # hostに0.0.0.0を指定して外部からアクセス可能にする
)


# Add a simple tool to demonstrate the server
@mcp.tool()
def greet(name: str = "World") -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"


# Run server with streamable_http transport
if __name__ == "__main__":
    mcp.run(transport="streamable-http")

host="0.0.0.0" を指定することで、Docker コンテナ外部からアクセス可能になります。

Dockerfile

uv の公式イメージをベースに、依存関係をインストールしてサーバーを起動します。

FROM ghcr.io/astral-sh/uv:python3.14-alpine

WORKDIR /app

COPY pyproject.toml uv.lock ./
RUN uv sync --frozen

COPY src ./src

CMD ["uv", "run", "src/main.py"]

ビルドと実行

イメージをビルドしてコンテナを起動します。

docker build -t python-mcp-handson .
docker run --name python-mcp-handson --rm -p 8000:8000 python-mcp-handson

ポート 8000 でサーバーが起動します。

GitHub Copilot Chat から利用する

任意のエージェントから MCP サーバーとして利用できますが、今回は Visual Studio Code の GitHub Copilot Chat からアクセスします。

プロジェクトルートに .vscode/mcp.json を作成して以下の内容を記述します。

{
    "servers": {
        "python-mcp-handson": {
            "url": "http://localhost:8000/mcp",
            "type": "http"
        }
    },
    "inputs": []
}

これで GitHub Copilot Chat から python-mcp-handson サーバーにアクセスできるようになります。
Copilot Chat のエージェントモードで greet ツールを呼び出すことで、サーバーの動作を確認できます。

まとめ

今回は Python で MCP サーバーを実装し、Docker コンテナとして起動して GitHub Copilot Chat から利用するまでの手順を紹介しました。
このサーバーをベースに、さらに複雑なツールや機能を追加していくことができます。
次回はこのサーバーを使って、実際のユースケースに基づいたツールの実装例を紹介していきます。

コメント

タイトルとURLをコピーしました