AIエージェントに独自の「道具」を持たせる際、最もシンプルで確実なのが MCP (Model Context Protocol) を使った方法です。
ここでは、Pythonのパッケージ管理ツール uv を使って書いたスクリプトを、IDE(CursorやAntigravity等)上のエージェントから呼び出すための「最短ルート」を解説します。
1. 最小構成のMCPサーバーを書く
もっとも汎用性が高いのは、標準入出力(stdio)を利用した実装です。複雑なライブラリを使わず、JSON-RPCのやり取りを定義するだけで十分です。
# mcp_server.py
import sys
import json
import asyncio
# ツール定義
TOOLS = [
{
"name": "say_hello",
"description": "挨拶を返すシンプルなツール",
"inputSchema": {
"type": "object",
"properties": { "name": { "type": "string" } },
"required": ["name"]
}
}
]
async def main():
# 標準入出力を通じた対話ループの実装
# (ここでは概念のみ。実際にはmcp SDKや軽量なラッパーを使用)
pass
if __name__ == "__main__":
asyncio.run(main())
2. コマンドラインでの動作確認
設定ファイルに書く前に、uv を使って直接実行できることを確認します。
uv run --project /path/to/project python /path/to/project/mcp_server.py
ここでエラーが出ず、プロセスが立ち上がる(あるいは入力を待つ状態になる)ことが重要です。
3. MCPクライアント(IDE)の設定
ここが最も重要なポイントです。IDEの設定ファイル(mcp_config.json 等)に、先ほどのコマンドを登録します。
ポイントは「すべての環境を固定する」こと。 IDE側のカレントディレクトリ設定に依存しないよう、uv の --project 引数を利用します。
{
"mcpServers": {
"my-custom-tool": {
"command": "/path/to/uv", // uv自体の絶対パス
"args": [
"run",
"--project", "/path/to/project", // ← これで仮想環境を固定
"python",
"/path/to/project/mcp_server.py" // ← スクリプトも絶対パス
]
}
}
}
まとめ:安定稼働のための3箇条
- uvの
--projectを使う: これを使えば、どのフォルダを開いていても正しい.venv(ライブラリ群)が読み込まれます。 - パスはすべて絶対パスで書く: IDEがどこからコマンドを叩いても迷子にならないようにします。
- stdioを信じる: ネットワーク設定やポート競合に悩まされることなく、最も安定してプロセス間通信を行えます。
エージェントに「手足」を与えることで、定型作業の自動化は一気に加速します。この最小構成をベースに、自分だけの道具箱を広げてみてください。