Files
relicario/tools/relay/call.py
adlee-was-taken dd0010db62 feat(relay): expand to dev-c role + python/ts MCP fallback shims
queue.ts and server.ts now know about dev-c alongside pm/dev-a/dev-b
so the four-role coordination paradigm works end-to-end. start.sh
opens a fourth window for dev-c. call.py and call.ts are HTTP shims
that agents can use when the MCP relay tools aren't registered in
their session (the kickoff prompts reference call.py by path as a
fallback).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-05 17:49:21 -04:00

82 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""
CLI shim: call a relay MCP tool via raw SSE protocol.
Usage:
python3 call.py read_messages '{"for":"pm"}'
python3 call.py post_message '{"from":"pm","to":"dev-a","kind":"directive","body":"..."}'
python3 call.py list_pending '{"for":"pm"}'
"""
import sys, json, threading, requests, time
BASE = "http://localhost:7331"
tool_name = sys.argv[1]
args = json.loads(sys.argv[2]) if len(sys.argv) > 2 else {}
result = {"done": False, "value": None}
endpoint_url = {"url": None}
msg_id = 1
def read_sse():
with requests.get(f"{BASE}/sse", stream=True, timeout=15) as r:
for line in r.iter_lines(decode_unicode=True):
if not line:
continue
if line.startswith("data:"):
data = line[5:].strip()
if not endpoint_url["url"] and data.startswith("/message"):
endpoint_url["url"] = BASE + data
elif endpoint_url["url"]:
try:
payload = json.loads(data)
if payload.get("id") == msg_id:
result["value"] = payload
result["done"] = True
return
except json.JSONDecodeError:
pass
t = threading.Thread(target=read_sse, daemon=True)
t.start()
# Wait for endpoint
for _ in range(50):
if endpoint_url["url"]:
break
time.sleep(0.1)
if not endpoint_url["url"]:
print(json.dumps({"error": "no endpoint received"}))
sys.exit(1)
# Send initialize
init_payload = {
"jsonrpc": "2.0", "id": 0, "method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "relay-cli", "version": "0.1.0"}
}
}
requests.post(endpoint_url["url"], json=init_payload, timeout=5)
# Send tools/call
call_payload = {
"jsonrpc": "2.0", "id": msg_id, "method": "tools/call",
"params": {"name": tool_name, "arguments": args}
}
requests.post(endpoint_url["url"], json=call_payload, timeout=5)
# Wait for result
for _ in range(100):
if result["done"]:
break
time.sleep(0.1)
if result["done"]:
content = result["value"].get("result", {}).get("content", [])
for item in content:
if item.get("type") == "text":
print(item["text"])
else:
print(json.dumps({"error": "timeout waiting for response"}))
sys.exit(1)