最小限のPython MCPサーバを作ってLLMを騙してみる
MCPサーバーを作ってみる
松尾研究所テックブログのMCP入門記事で紹介されていた、以下の公式MCP Python SDKが、MCPサーバを作ることができるということで気になったので、実際に作ってみました。
同じようなことをしている先人の記事が沢山あったので、本記事の参考リンクにも掲載します。より詳しい解説などが知りたい人は参照してみてください。
MCPサーバの作成
仮想環境構築
MCPサーバーでは、ホストの環境から分離するために、仮想環境を使うのがベターです(使わなくても作成はできます)。PythonだとuvかDockerが良いと思います。今回は手軽に使用できるuvを使用します。uvのセットアップや基本的な使い方に関しては以下記事を参照してください。
uvでは、以下のコマンドで仮想環境を構築できます。
$ uv init mcp-server-demo
$ cd mcp-server-demo
$ uv add "mcp[cli]"
作成されたmcp-server-demo
フォルダの下にserver.py
という以下のようなサンプルコードを作成します。コードをみて分かる通り、足し算をするだけのMCPサーバです。
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server with debug enabled
mcp = FastMCP("Demo", debug=True)
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add this part to run the server
if __name__ == "__main__":
# stdioトランスポートを使用
print("Starting MCP server in stdio mode")
mcp.run(transport="stdio")
Cline/Cursorのセットアップ
MCPの設定を記述するjsonファイルに(clineだとcline_mcp_setttings.json
、Cursorだとmcp.json
)に、以下のように書きます。
<mcp server directory>
には、MCPサーバのプログラムを格納したディレクトリの絶対パスを指定します。例えば、/Users/karaage/mcp-server-demo
みたいな感じです。
{
"mcpServers": {
"mcp-demo-server": {
"command": "uv",
"args": [
"--directory",
"<mcp server directory>",
"run",
"server.py"
],
"alwaysAllow": [
"add"
],
"disabled": false
}
}
}
上記を設定すると、Cline/Cursorが記載されたコマンドを実行して、MCPサーバを起動します。
Cline/CursorのMCPサーバ画面で以下のように表示されていればサーバは起動しています(エラーが出ているとエラーが表示されます)。
右上の再起動(回転矢印アイコン)をクリックしたら、サーバーを再起動できます。
コードの変更を反映したいときは再起動してください。
MCPサーバのテスト
使い方は、MCPクライアント(今回はCline or Cursor)で以下のように指示するだけです。
MCPサーバ mcp-demo-serverを使って足し算をしてください
MCPサーバが正しく設定されていたら、勝手にLLMがMCPサーバを使ってくれます。
わざと引き算a - b
にしてみた例です。
LLMが計算間違いに気づいていますね。
では答えから1を引くようにして(a + b - 1
)少し複雑な計算をしてみたらどうでしょうか?
LLMは計算間違いに気づかず、MCPサーバの結果を鵜呑みにしてしまいました。このように、LLMは、基本MCPサーバを信頼して行動します。
今回のようにサンプルコードで試している分には問題ありませんが、実際に使用したMCPサーバに悪意あるコードが仕掛けられていたら危険な結果になることが想像できるかと思います。
今は過渡期で、多くのMCPサーバが出ています。うっかり怪しいMCPサーバを使ったりしないようにしましょう。また、慣れないうちはMCPサーバの結果を必ず確認するようにしましょう。
まとめ
MCPサーバの理解を深めるために、最小のPython MCPサーバを作ってみました。実際に小さくでも作ってみると理解が深まりますね。
次は、より実用的なMCPサーバを作ってみたいと思います。
参考リンク
関連記事
Discussion