ProxyHub MCPから1行につき1つの IP:port を出力するには、チャットのテキストをコピーするのではなく、完全なJSON-RPC応答から始めます。

  1. MCPクライアントから list_proxies を呼び出し、type を http に設定します。
  2. 応答全体を mcp-response.json として保存します。
  3. 以下の標準ライブラリだけを使う変換スクリプトを、応答と同じ場所に mcp-to-file.py として保存します。
import json
from ipaddress import IPv4Address
from pathlib import Path

reply = json.loads(
    Path("mcp-response.json").read_text(encoding="utf-8")
)
if "error" in reply:
    raise RuntimeError("MCP returned a JSON-RPC error")

result = reply["result"]
if result.get("isError"):
    raise RuntimeError("The proxy tool reported an error")

data = result["structuredContent"]
endpoints = []
seen = set()

for row in data["proxies"]:
    if row["type"] != "http":
        continue
    host = str(IPv4Address(row["ip"]))
    port = row["port"]
    if type(port) is not int or not 1 <= port <= 65535:
        raise ValueError("Invalid proxy port")
    endpoint = f"{host}:{port}"
    if endpoint not in seen:
        seen.add(endpoint)
        endpoints.append(endpoint)

text = "\n".join(endpoints)
Path("http-proxies.txt").write_text(
    text + ("\n" if text else ""),
    encoding="utf-8",
)
print(f"Saved {len(endpoints)} HTTP endpoints")

そのディレクトリで実行します。

uv run --no-project python mcp-to-file.py

表示された件数と http-proxies.txt を確認してください。元の応答は残ります。JSON-RPCエラーとツールレベルの isError 応答は例外になります。正常応答でも該当項目がなければ空ファイルを書き込み、0件と報告します。ツールの上限は1回につき100件なので、出力はその回に返された範囲であり、必ずしもHTTPプロキシリスト全体ではありません。

変換スクリプトは http と報告された行だけを受け付け、IPv4の構文とポート範囲を検査します。現在の収集処理が使うIPv4形式に合わせています。別のプロトコルでは、その情報を保持するか別ファイルにしてください。単にIP:portを混在させたファイルでは、受け取るクライアントがどのハンドシェイクを使うべきか分かりません。

エクスポートした行も、あくまでデータです。updated_at が記録するのは保存データの更新時刻であり、自分のネットワークからの実際のリクエストではありません。選んだエンドポイントは、必要な宛先に対して上限を設けたHTTPプロキシリクエストで試します。MCP呼び出し自体が失敗したならデータ取得を調べます。後からエクスポート済みのエンドポイント経由でのリクエストが失敗したなら、その別個のプロキシ接続を調べてください。

関連記事