feat(mcp): add Java MCP bridge and agent config

This commit is contained in:
jade
2026-07-09 16:03:58 +09:00
parent e74e8f763c
commit 7db0b4e8af
3 changed files with 229 additions and 0 deletions

110
mcp-bridge.py Normal file
View File

@@ -0,0 +1,110 @@
import sys
import json
import urllib.request
import urllib.error
def send_response(response: dict):
print(json.dumps(response), flush=True)
def handle_message(msg: dict):
if "method" in msg:
if msg["method"] == "initialize":
send_response({
"jsonrpc": "2.0",
"id": msg.get("id"),
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {"tools": {}},
"serverInfo": {"name": "axhub-gateway", "version": "1.0.0"}
}
})
elif msg["method"] == "notifications/initialized":
pass
elif msg["method"] == "tools/list":
try:
req = urllib.request.Request("http://localhost:8081/mcp/api/v1/tools/list")
with urllib.request.urlopen(req, timeout=5) as response:
data = json.loads(response.read().decode())
tools = []
for t in data.get("result", {}).get("tools", []):
schema = t.get("parametersSchema", {})
if "type" not in schema:
schema["type"] = "object"
tools.append({
"name": t["toolName"],
"description": t.get("description", "No description"),
"inputSchema": schema
})
send_response({
"jsonrpc": "2.0",
"id": msg.get("id"),
"result": {"tools": tools}
})
except Exception as e:
send_response({"jsonrpc": "2.0", "id": msg.get("id"), "error": {"code": -32603, "message": str(e)}})
elif msg["method"] == "tools/call":
try:
params = msg.get("params", {})
req_payload = {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": params.get("name"),
"arguments": params.get("arguments", {})
},
"id": msg.get("id")
}
req_data = json.dumps(req_payload).encode()
req = urllib.request.Request(
"http://localhost:8081/mcp/api/v1/tools/call",
data=req_data,
headers={"Content-Type": "application/json", "X-Agent-Id": "Antigravity"}
)
with urllib.request.urlopen(req, timeout=10) as response:
resp_data = json.loads(response.read().decode())
result_obj = resp_data.get("result", resp_data)
if "error" in resp_data:
result_obj = resp_data["error"]
result_text = json.dumps(result_obj, ensure_ascii=False, indent=2)
is_error = resp_data.get("error") is not None or (isinstance(result_obj, dict) and result_obj.get("status") == "ERROR")
send_response({
"jsonrpc": "2.0",
"id": msg.get("id"),
"result": {
"content": [{"type": "text", "text": result_text}],
"isError": is_error
}
})
except urllib.error.HTTPError as e:
error_data = e.read().decode()
send_response({
"jsonrpc": "2.0",
"id": msg.get("id"),
"result": {
"content": [{"type": "text", "text": f"HTTP Error {e.code}: {error_data}"}],
"isError": True
}
})
except Exception as e:
send_response({
"jsonrpc": "2.0",
"id": msg.get("id"),
"result": {
"content": [{"type": "text", "text": f"Error calling tool: {e}"}],
"isError": True
}
})
else:
if "id" in msg:
send_response({"jsonrpc": "2.0", "id": msg.get("id"), "error": {"code": -32601, "message": "Method not found"}})
for line in sys.stdin:
line = line.strip()
if not line:
continue
try:
msg = json.loads(line)
handle_message(msg)
except Exception as e:
pass