Zenn
💻

MCPサーバーを自作して理解する(Windows+VSCode+Python)

に公開
2

はじめに

MCPについてハッキリと理解できていないので、簡単なMCPサーバーを自作してMCPの動きを理解してみることにしました。

MCPとはについては、先人の方々が説明されているので割愛します。

今回は下記構成で実験をしてみました。

MCPクライアント : Visual Studio Code (Cursor、Claudeデスクトップでも動きました)
MCPサーバー : Pythonで自作

MCPサーバーの仕様は、受け取ったパラメーターを少し加工して返してくるだけです。
例えば山田太郎と送ったらコンニチハ, 山田太郎!!!!とだけ返してくる非常に簡単なMCPサーバーです。

イメージ

実行環境

  • Windows11 Pro 23H2
  • Visual Studio Code Ver 1.99.2
    • GitHub Copilot Ver 1.301.0
    • GitHub Copilot Chat Ver 0.26.3
  • Python Ver 3.13.2
  • uv Ver 0.6.12

準備

  • Visual Studio Codeをインストールする
    • 拡張機能GitHub CopilotGitHub Copilot Chatを追加する
  • Pythonをインストールする
  • uvコマンドをインストールする

uvコマンドのインストール

PowerShellから下記コマンドを実行する

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

プロジェクト作成

プロジェクト名をecho_helloとします。

# プロジェクトの新規作成
uv init echo_hello
cd echo_hello

# Python仮想環境を使用
uv venv
.venv\Scripts\activate

# 依存関係をインストールする
uv add mcp[cli] httpx

# MCPサーバーのソースコード作成
new-item echo_hello.py

MCPサーバーをPythonで作成

ファイル : echo_hello.py

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# FastMCPサーバーの初期化
mcp = FastMCP("echo_hello")

# FastMCPサーバーが呼び出された時の処理
@mcp.tool()
async def echo_hello(name: str) -> str:
    # 「コンニチハ、{プロンプトから渡された値}!!!!」と返すだけ
    return f"コンニチハ, {name}!!!!"

if __name__ == "__main__":
    # 初期化とサーバー実行
    mcp.run(transport='stdio')

MCPサーバーの登録

ファイル:C:\Users\%USERPROFILE%\AppData\Roaming\Code\User\settings.json

※ディレクトリとファイル名は適宜修正してください。

~省略~
"mcp": {
    "inputs": [],
    "servers": {
        "echo_hello": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\Workspace\\mcp\\mcp_server_demo\\echo_hello",
                "run",
                "echo_hello.py"
            ]
        }
    }
},
~省略~

MCPサーバーの登録 (図解)

※ GitHub Copilotのチャット入力エリアで質問するからエージェントに変更してください。

MCPサーバーの起動

MCPクライアントからMCPサーバーを呼び出してみる

GitHub Copilotのチャット欄にecho_hello 山田太郎と入力して実行する

続行と表示されたら、そのまま続行をクリックする

実行結果

無事コンニチハ, 山田太郎!!!!が返ってきました。

さいごに

実際に動かしてみて、MCPクライアントやMCPサーバーの流れが理解できました。
あとは色々なサービスが提供しているMCPサーバーの設定を追加していけば幅が広がりそうです。
また、CursorやClaudeデスクトップでも同じことができました。
MCPサーバーの設定を最後に書いておきます。

Cursor

ファイル : C:\Users\%USERPROFILE%\.cursor\mcp.json

{
    "mcpServers": {
        "echo_hello": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\Workspace\\mcp\\mcp_server_demo\\echo_hello",
                "run",
                "echo_hello.py"
            ]
        }
    }
}

Claudeデスクトップ

ファイル : C:\Users\%USERPROFILE%\AppData\Roaming\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "echo_hello": {
      "command": "uv",
      "args": [
        "--directory",
        "C:\\Workspace\\mcp\\mcp_server_demo\\echo_hello",
        "run",
        "echo_hello.py"
      ]
    }
  }
}

Visual Studio Code

ファイル : C:\Users\%USERPROFILE%\AppData\Roaming\Code\User\settings.json

~省略~
"mcp": {
    "inputs": [],
    "servers": {
        "echo_hello": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\Workspace\\mcp\\mcp_server_demo\\echo_hello",
                "run",
                "echo_hello.py"
            ]
        }
    }
},
~省略~
2

Discussion

ログインするとコメントできます