前回、 Figma-Context-MCP を使ってFigmaのデータからReactアプリを作りました。
Cline + Figma-Context-MCP にて、Figmaのデザインを元にReactアプリを作ってみた - メモ的な思考的な
次は自分でもMCPサーバを作ってみたいと考えました。そこで、Model Context Protocol (MCP)のドキュメントを読んだところ、For Server DevelopersページにMCPサーバの開発方法が記載されていました。また、https://api.weather.gov にアクセスしてデータを取得するサンプルも紹介されていました。
For Server Developers - Model Context Protocol
そこで、もう少し簡単なものとしてechoするだけのMCPサーバを作ってみたことから、メモを残します。
目次
環境
- Windows 11
- Python 3.13.2
- uv 0.6.11
- mcp 1.6.0
- Cline 3.8.4
- MCPクライアントとして利用
- モデルは Gemini 2.5 Pro exp 0325
- ターミナルはGit Bash
- Windows版のGitに付属していたもの
環境構築
今回はWindows11上でMCPサーバを作るため、Python環境を構築します。
MCPのドキュメントによると uv で環境構築をしていたことから、今回は uv を使って環境構築します。
uv をインストールするためドキュメントを読むと、いくつかの方法でインストールできそうでした。今回は WinGet を使ってインストールします。
$ winget install --id=astral-sh.uv -e
あとはMCPのドキュメント通りに環境を構築します。なお、今回はechoするだけなので、 uv add するのは mcp だけにします。
# echo_pyプロジェクトを作成 $ uv init echo_py # プロジェクトディレクトリへ移動 $ cd echo_py/ # venvを使って仮想環境を作成 $ uv venv Using CPython 3.13.2 Creating virtual environment at: .venv Activate with: source .venv/Scripts/activate # Git Bashなので、 source を使ってactivate $ source .venv/Scripts/activate (ringo_mcp_py) # mcpをインストール $ uv add mcp[cli]
MCPサーバを作る
事前検討
実装する機能について
- Resources
- Tools
- Prompts
の各機能を実装すれば良さそうでした。
https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file#what-is-mcp
Python SDKのREADMEを読み進めたところ、 Echo Server のサンプルが掲載されていました。
https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file#echo-server
このサンプルは
- Resources
- Tools
- Prompts
のいずれも実装していました。
ただ今回は簡単な実装とするため、MCPのドキュメントのように Tools だけを用意することにしました。MCP の Python SDK によると、 Tools は @mcp_tool デコレータを使えば良さそうでした。
https://github.com/modelcontextprotocol/python-sdk?tab=readme-ov-file#tools
実装するTransportについて
MCPドキュメントでは Transport Type について
- Standard Input/Output (stdio)
- Server-Sent Events (SSE)
の2つが紹介されていました。
https://modelcontextprotocol.io/docs/concepts/transports#built-in-transport-types
また、2025-03-26のspecificationを見たところ、SSEの代わりに Streamable HTTP が採用されるとのことでした。
- Transports – Model Context Protocol Specification
- [RFC] Replace HTTP+SSE with new "Streamable HTTP" transport by jspahrsummers · Pull Request #206 · modelcontextprotocol/specification
次に、Python SDKでの FastMCP の実装を見たところ、
- 実装されているのは、
stdioutとsseのみ mcp.run()のように引数なしで起動する場合、Standard Input/Output (stdio) が使われる
と分かりました。
https://github.com/modelcontextprotocol/python-sdk/blob/v1.6.0/src/mcp/server/fastmcp/server.py#L148
実装
今回は簡単なMCPサーバとするため、以下の方針としました。
- 機能は
Toolsのみ - Transportは
Standard Input/Output (stdio)
実装はこちらです。
from mcp.server.fastmcp import FastMCP mcp = FastMCP("echo server") @mcp.tool() def echo_message(message: str) -> str: return f"Response: {message}" if __name__ == "__main__": mcp.run(transport='stdio')
動作確認
Clineから作成したechoするだけのMCPサーバを扱えることを確認します。
まずは、作成したMCPサーバを起動します。起動した後ターミナルには何も表示されませんが、問題ありません。
$ uv run main.py
続いて、Clineの cline_mcp_settings.json に今回のMCPサーバを追加します。今回はWindows環境なので、以下の点に注意します。
commandには、uvのフルパスを指定する- Git Bashで
which uvを実行し、uvのフルパスを指定
- Git Bashで
argsには、プロジェクトのパス ("C:\\path\\to\\echo_py") と起動するMCPサーバのPythonスクリプト (main.py)を指定
{ "mcpServers": { "echo server": { "command": "C:\\Users\\<UserName>\\AppData\\Local\\Microsoft\\WinGet\\Packages\\astral-sh.uv_Microsoft.Winget.Source_***\\uv", "args": [ "--directory", "C:\\path\\to\\echo_py", "run", "main.py" ], "disabled": false, "autoApprove": [] } } }
設定が終わり接続ができると、Clineの MCP Servers にある Installed には以下のように表示されます。
準備ができたので、動作確認します。
Clineにプロンプトを渡します。
MCPサーバである echo server は認識できていますか?
すると返事がありました。
はい、echo server は接続済みとして認識しとるで。echo_message いうツールが利用可能や。
使い方について聞いてみます。
echo_message ツールを使うにはどうしたら良いですか?
echo_message ツールを使うには、use_mcp_tool いうツールを使うんや。 具体的には、こんな感じで使うで。
と返事があり、以下のような感じで承認を求めてきました。
承認すると、以下のようにレスポンスが返ってきたようでした。
さらに追加で問いかけがありました。
Hello, world! と返事をしたところ、 echo_message ツールを使ってエコーしたことを確認できました。
echoするだけのMCPサーバが完成しました。
ソースコード
GitHubに上げました。
https://github.com/thinkAmi-sandbox/echo_mcp_python_server-example
プルリクはこちら。
https://github.com/thinkAmi-sandbox/echo_mcp_python_server-example/pull/1




