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箇条

  1. uvの --project を使う: これを使えば、どのフォルダを開いていても正しい .venv(ライブラリ群)が読み込まれます。
  2. パスはすべて絶対パスで書く: IDEがどこからコマンドを叩いても迷子にならないようにします。
  3. stdioを信じる: ネットワーク設定やポート競合に悩まされることなく、最も安定してプロセス間通信を行えます。

エージェントに「手足」を与えることで、定型作業の自動化は一気に加速します。この最小構成をベースに、自分だけの道具箱を広げてみてください。