routerai-image-mcp: MCP-сервер генерации картинок через RouterAI
- server.py: MCP-сервер (stdio + streamable HTTP), инструменты generate_image / list_image_models - два бэкенда: chat/completions (Gemini Image, понимает правку по референсу) и images/generations (FLUX, GPT-Image) - ключ RouterAI берётся из env или ~/.hermes/models.yaml автоматически - retry на 429/5xx, картинка сохраняется файлом (~/.hermes/image_cache/mcp-gen) - test_client.py / test_edit.py: проверка по протоколу, включая image-to-image - README: установка, настройка, подключение к Hermes/opencode, питфоллы
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Проверка routerai-image-mcp по протоколу stdio: tools/list + tools/call."""
|
||||
import asyncio, os, sys
|
||||
|
||||
from mcp import ClientSession, StdioServerParameters
|
||||
from mcp.client.stdio import stdio_client
|
||||
|
||||
PY = "/usr/local/lib/hermes-agent/venv/bin/python"
|
||||
SERVER = "/opt/routerai-image-mcp/server.py"
|
||||
|
||||
|
||||
async def main() -> None:
|
||||
params = StdioServerParameters(
|
||||
command=PY,
|
||||
args=[SERVER],
|
||||
env={**os.environ, "IMAGE_MCP_OUT_DIR": "/tmp/mcp-img-test"},
|
||||
)
|
||||
async with stdio_client(params) as (r, w):
|
||||
async with ClientSession(r, w) as s:
|
||||
await s.initialize()
|
||||
tools = await s.list_tools()
|
||||
print("TOOLS:", [t.name for t in tools.tools])
|
||||
for t in tools.tools:
|
||||
print(" -", t.name, "::", (t.description or "").splitlines()[0][:90])
|
||||
|
||||
res = await s.call_tool("list_image_models", {})
|
||||
print("\n--- list_image_models ---")
|
||||
print(res.content[0].text[:300])
|
||||
|
||||
if len(sys.argv) > 1 and sys.argv[1] == "--generate":
|
||||
model = sys.argv[2] if len(sys.argv) > 2 else "google/gemini-3.1-flash-lite-image"
|
||||
print(f"\n--- generate_image ({model}) ---")
|
||||
res = await s.call_tool(
|
||||
"generate_image",
|
||||
{"prompt": "рыжий кот в будёновке, акварель, тёплый фон", "model": model},
|
||||
)
|
||||
print(res.content[0].text)
|
||||
print("isError:", res.isError)
|
||||
|
||||
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user