Every agent a tool. Every protocol bridged.
Open registry where AI agents register via agent.json, get discovered, and are bridged. Agents speak A2A (Google) and are exposed at runtime as MCP tools (Anthropic). Next.js 16, Prisma 6, Postgres, self-hosted on Coolify.
Why this exists.
Agents from different ecosystems — Claude/MCP, Google/A2A, self-hosted — currently can't talk to each other. Every vendor builds their own walled garden. Developers building or consuming agents need a neutral discovery layer that existing marketplaces don't provide.
GPT Store, Claude MCP Directory — vendor lock-in, schema-thin, no cross-protocol execution bridge. AgoraHub is the attempt to build one registry where an A2A agent automatically shows up as an MCP tool in Claude Desktop, without the agent builder having to write anything twice.
The box it had to fit in.
How it runs.
Four deliberate choices.
MCP bridge instead of a custom protocol.
/api/mcp/toolsPrisma + Postgres instead of a vector DB.
Next.js proxy instead of middleware.
src/proxy.ts — CSP, HSTS, Permissions-Policy, CORS allowlistmiddleware.ts on the edge runtimemiddleware.ts, and the edge-runtime constraints (no Node API access) were already limiting for IP validation and HMAC verification. The new proxy hook runs as a real Node handler — one file, no build-target split, and inside the Docker image on Coolify it behaves identically to local. Less magic, more control.SSRF quarantine synchronously into the AuditLog.
Things that were not obvious.
Schema compatibility with a concrete diff
schema-compatibility.ts compares their JSON Schemas structurally — required fields, type compatibility, enum overlap. The user gets not just a yes/no, but a concrete diff: "Agent B expects language: 'de'|'en', your agent sends lang: string".This prevents half of all failing task runs. A binary check ("incompatible") would have frustrated developers, because they'd have to open both JSON Schemas manually and compare them themselves. Diff output is 2 hours of work and saves every user 20 minutes — one of those asymmetries that turns a developer tool from functional into pleasant.
Trust auto-progression with hysteresis
Otherwise a single timeout on a foreign endpoint would instantly demote good agents — and that happens all the time when the agent runs against flaky third-party APIs. MCP tools are only exposed from trust score ≥ 10, so Claude users are protected from junk without me having to moderate manually. The threshold is the only human touchpoint in the entire trust system.
API keys as hash + prefix
newKey). In the DB only SHA-256 hash + 8-character prefixlive. Auth lookup: request arrives with key → extract prefix → index hit on keyPrefix → hash comparison.No full-table scans (the prefix is indexed and rare enough to match <5 candidates), and a DB leak gives no attacker working credentials. Classic GitHub pattern, but surprisingly many registries still store keys plaintext or encrypted-but-decryptable today.
SSRF fallback across all IPs
The scanner validates each IP individually and picks the first valid one for the call. DNS rebinding attacks (where the IP changes between resolve and connect) are blocked because the HTTP client pins to the validated IP, not to the hostname. A ten-line fix that closes an entire attack class.
What's running.
What I learned.
Bridges beat protocols.
I could have defined my own agent protocol that's "better" than A2A and MCP. Reality: every client users already have speaks one of the two. Forcing a third protocol would have been an adoption wall. The bridge strategy takes the question "which protocol wins" off the table — both win, AgoraHub is the translator. That's more boring than designing your own protocol, but it's the reason the first Claude user was productive in minutes.
User-submitted URLs are an attack primitive.
Every registered agent supplies a URL my server is supposed to call. From an attacker's angle that's exactly the definition of SSRF. I put the security chain (DNS gate, IP validation, port enforcement, synchronous audit logs) in front of the first real integration — not after the first malicious agent tried to query AWS metadata. For tools that call user URLs, security engineering isn't a feature, it's the foundation. Whoever retrofits it as a feature retrofits too late.