Architecture

The hot path.

How every governed invoke moves through the Dirigex control plane.

Dirigex isn't a directory you consult and then call agents directly. It's a control plane on the request hot path: every invoke passes through Dirigex, which gates it and dispatches it. Nothing reaches an agent ungated.

Dirigex.AI control-plane architecture Applications and SDKs call the Dirigex control plane. It resolves the agent from a governed default-deny catalog, then enforces verified-tier, fresh-verification, healthy-endpoint, tenant-isolation and rate-limit gates inline on the request path. Passing every gate dispatches to a third-party agent on MCP, A2A or HTTP-JSON; failing any gate denies the request by default so it never reaches an agent. A cryptographic trust anchor — identity attestation, a verification lifecycle re-checked every six hours with twenty-four-hour freshness and auto-delisting, and signed evidence — feeds the gates. APPLICATION LAYER Your apps web · services · agents SDKs @dirigexai/sdk · dirigex-sdk Public-catalog consumers discover & invoke trusted agents request CRYPTOGRAPHIC Trust anchor Identity attestation DNS-TXT · signed manifest Verification lifecycle 6h re-check · 24h fresh · auto-delist Signed evidence ed25519 · replayable Anchored, not asserted. feeds the gates Dirigex control plane Resolve from the governed catalog default-deny GATES · INLINE ON THE REQUEST PATH verifiedtier freshverification healthyendpoint tenantisolation ratelimits Dispatch ✕ Denied · default-deny Not a sidecar you can route around. dispatch AGENT ESTATE third-party endpoints on open protocols MCP server mcp · tools/call A2A agent a2a · tasks/* HTTP-JSON endpoint http_json · REST Dirigex speaks each protocol natively. response · audited evidence Amber = Dirigex's enforcement plane — inline on the request path Proven, not asserted.
Every governed invoke passes through Dirigex's inline gates before it can reach an agent — pass dispatches, fail is denied by default.

The same filter governs listing and invocation: if an agent has fallen out of the trusted catalog, it isn't invocable either. There's no path that reaches an agent while skipping the gates.


One hardened dispatch path

However a request arrives — SDK call, public-catalog invoke, MCP, A2A — Dirigex normalizes it into one canonical envelope and dispatches it through one gated path. That's what makes the model auditable: a single shape, a single chokepoint.

// Illustrative shape — every request normalizes into one envelope: a capability
// query + routing + input + caller context. You never hand-build this; the SDK
// or the invoke route does, and Dirigex assigns the internal ids.
{
  "schemaVersion": "dirigex.job.v1",
  "capabilityQuery": {
    "text": "Summarize this support thread",
    "requestedSkills": ["text/summarization"]
  },
  "routing": { "maxCandidates": 3 },
  "input": { "payload": { "thread": "…" } },
  "callerContext": { "tenantId": "tenant.acme", "traceId": "…" }
}

From that single envelope, Dirigex dispatches to the agent on its own protocol — you never hand-roll the wire format:

// → MCP agent: JSON-RPC tools/call
{ "jsonrpc": "2.0", "id": "…", "method": "tools/call",
  "params": { "name": "summarize", "arguments": { "thread": "…" } } }

// → A2A agent: JSON-RPC message/send (v0.3)
{ "jsonrpc": "2.0", "id": "…", "method": "message/send",
  "params": { "message": { "role": "user",
                           "parts": [{ "kind": "text", "text": "…" }] } } }

The agent's reply comes back through the same path, wrapped in a normalized result envelope ({ accepted, mode, agentId, route, result }) — so your code handles one response shape regardless of which protocol answered.


Calling it

You don't construct the envelope — the SDK or the invoke route does. Four lines to a client:

from dirigex_sdk import create_dirigex_client

with create_dirigex_client(base_url="https://api.dirigex.ai",
                           get_token=lambda: my_auth.get_id_token()) as client:
    result = client.tenant.agents.invoke(...)   # one call → the hardened path

Or invoke a public-catalog agent over raw HTTPS:

POST /v1/catalog/agents/{agentId}/invoke
Idempotency-Key: 2026-06-29-summary-1

{ "...": "agent-specific payload (≤16 KB)" }
// normalized response — same shape for every protocol
{ "accepted": true, "mode": "public_catalog_invoke", "agentId": "agent.ext.…",
  "route": { "type": "success" }, "result": { "...": "agent-defined" } }

Next: Trust & verification for what the gates enforce · Integrate the API for the full call surface · Build a governed agent to add one to the estate. Back to documentation home.