MCPサーバーを自作して理解する(Windows+VSCode+Python)
はじめに
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 CopilotとGitHub 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"
            ]
        }
    }
},
~省略~
Discussion