現在時刻を返すMCPサーバを作ってCursorと連携させてみる(uv編)
はじめに
以前の記事でDockerを用いてPythonの実行環境を構築し、コンテナ内でMCPサーバを稼働させてCursorと連携する構成を試しました。
無事に目的は達成できたものの、主に以下の点で不便さを感じました。
- Dockerコンテナの起動状況を把握しておかないといけないので、普段使いするには煩わしい。
- MCP Inspectorが使いにくい。
これらを解消したく、今回はホストマシン上にuvでPythonの仮想環境を構築し、その環境下で実装したMCPサーバをCursorと連携することにします。
この記事で達成したいこと
- uvでPythonの仮想環境を構築し、その環境下でMCPサーバを実装する
- 実装したMCPサーバをMCP Inspectorで動作確認する
- 実装したMCPサーバとCursorを連携する
前提条件
$ sw_vers
ProductName: macOS
ProductVersion: 14.6.1
BuildVersion: 23G93
$ uv --version
uv 0.7.3 (Homebrew 2025-05-07)
$ npx --version
11.3.0
MCPサーバ導入
下準備
まずは新しいPythonプロジェクトを作成し、FastMCPをプロジェクトに追加します。
# プロジェクト作成
$ uv init mcp-time-server
# FastMCP追加
$ cd mcp-time-server
$ uv add fastmcp
MCPサーバ開発
実装自体は以前の記事と変わっていません。
from datetime import datetime
from fastmcp import FastMCP
mcp = FastMCP(name="TimeServer")
@mcp.tool()
def get_current_time() -> str:
"""return the current time."""
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
if __name__ == "__main__":
mcp.run(transport="stdio")
MCPサーバ動作確認
実装したMCPサーバの動作確認を行うため、MCP Inspectorを使います。
MCP InspectorとはMCPサーバの動作確認を行うためのブラウザベースの開発者ツールです。
まずはプロジェクトルートに移動して以下のコマンドを実行します。
$ uv run fastmcp dev main.py
少し待つと起動が完了するので、コンソールに表示されるURLにアクセスします。
すると以下のような画面が表示されます。
Connectボタンを押してMCPサーバと接続してみます。
無事に接続できたら、今回実装したのはget_current_time
という名前のToolなのでこの関数を実行してみて結果を確認します。
実装通り%Y-%m-%d %H:%M:%S
形式で現在時刻を返却していることが確認できました
Cursorと連携
mcp.json
には以下のように記述します。
command
を絶対パスにしないとエラーになるので注意です。
当該MCPサーバと正常に接続できたら成功です。
{
"mcpServers": {
"time": {
+ "command": "/opt/homebrew/bin/uv",
+ "args": ["--directory", "/path/to/mcp-time-server", "run", "main.py"]
}
}
}
おわりに
今回はホストマシン上にuvでPythonの仮想環境を構築し、その環境下で実装したMCPサーバをCursorと連携する構成を試してみました。
MCP Inspectorを利用できるようになり、AIエージェントにより近い立場でMCPサーバの振る舞いを確認できるようになりました。
また、副次的な効果として、poetryを使った時と比べるとプロジェクトがシンプルになっていたり、Dockerを使った時と比べるとmcp.json
の記述がシンプルになっていたりして、uvを使うほうが色々と見通しが良くなり好みであると感じました。
とはいえ、今回の構成は個人利用でコードベースも非常に簡単な場合における評価なので、MCPサーバの処理が複雑化したり、チームで利用する場合においても同様の利点が得られるかは引き続き検証が必要だと思いました。
最終的には今やっている取り組みをチームに展開していきたい目標があったりするので、今回得られた知見を次に繋げていきたいです💪
Discussion