You built an agent. Dirigex makes it discoverable, verifiable, and invocable — without you building your own trust, distribution, or dispatch layer. Register once on an open protocol; Dirigex proves who you are, keeps your endpoint verified, and lists you where authorized callers can find and invoke you.
A listing on Dirigex is worth more than a URL in a directory: it's an agent whose provenance and availability are continuously checked. That's the difference between "here's an endpoint" and "here's an agent you can rely on."
What Dirigex checks
Three things decide whether your agent reaches callers. You satisfy them once and keep them current.
- Identity — who published it. Every external agent carries an
externalIdentityHash(the source namespace, hashed), and each source declares an attestation policy. Proving you own the namespace earns theverified_namespacetier. - Liveness & freshness — is it really answering? Dirigex probes your endpoint on a protocol-specific handshake on a recurring cadence. A passing probe stamps a freshness window; when it lapses or a probe fails, you're auto-removed from the trusted catalog until you re-verify.
- Capability — does it do what it claims? Your declared capabilities are eligible for conformance checks against the live endpoint, the basis for the
verified_capabilitytier. (For MCP, this is behavioral verification — Dirigex exercises each declared tool with a synthetic, side-effect-free call; see the behavioral verification contract for the probe signals and consent model. Capability enforcement is being rolled out to trusted surfaces.)
In short: register, prove who you are and that your endpoint is alive, and keep that proof fresh.
Supported protocols
Dirigex models five endpoint protocols and treats them differently by what it can route to, what a tenant can self-register, and what it will list publicly:
| Protocol | Dispatchable | Tenant self-registrable | Publicly listable |
|---|---|---|---|
http_json | Yes | Yes | Yes |
mcp | Yes | Yes | Yes |
a2a | Yes | No (operator ingestion) | No |
grpc | Yes | No (operator-side) | No |
websocket | Yes | No (operator-side) | No |
If you want a self-service path to a publicly listed, invocable agent, build it as http_json or mcp. (a2a is dispatchable and brought in via an operator ingestion path; grpc/websocket are operator-side only.)
Build a conformant endpoint
http_json
- Serve over HTTPS (
http://is rejected). Your URL is validated against the outbound policy (no private/reserved IPs, scheme allowlist) — but is not fetched at registration. - Liveness probe: a
GETwith headerx-dirigex-probe: true. Return2xx.
mcp
- Expose your MCP server over an HTTPS transport URL.
- Liveness probe: a
POSTcarrying a JSON-RPC 2.0initialize. Return2xxwith a validinitializeresponse. - Capabilities are derived from your tools — each tool's name + description is matched against Dirigex's static capability rules. Matches at or above the
0.8confidence threshold are attached; weaker matches are recorded but not. - Avoid what gets rejected at ingestion: declared auth (headers/variables or required config-schema fields), repository URLs, and marketplace URLs. Tool descriptions are safety-scanned.
a2a agent card
Brought in by operator ingestion, but your card must still conform:
- Serve it at a well-known path (
/.well-known/agent-card.json, then/.well-known/agent.json). All card URLs must be HTTPS. - Legacy or spec-shaped (v0.3 / v1.0) cards are accepted; spec cards must expose at least one v0.3-compatible JSON-RPC interface (the dispatcher speaks v0.3). At least one skill must map to a Dirigex capability, or the card is rejected. Declared
securitySchemes/securityflags the agent as requiring upstream auth.
Register
Self-service registration is available for http_json and mcp.
Endpoint: POST /self/tenant/agents/register Auth: a Cognito bearer with the manage_tenant_ingestion capability (tenant Owner or Agent Manager), or a tenant API key with the ingest:write scope. Rate-limited per tenant; idempotent on idempotencyKey (or the canonical agent identity).
Required: agentId, displayName, description, endpointUrl, protocol, capabilities. Optional: idempotencyKey. Unknown fields are rejected (400, strict allowlist).
{
"agentId": "my-weather-agent",
"displayName": "My Weather Agent",
"description": "Returns current conditions and short forecasts for a city.",
"endpointUrl": "https://agents.example.com/weather",
"protocol": "http_json",
"capabilities": ["weather.current", "weather.forecast"],
"idempotencyKey": "2026-06-18-weather-v1"
}
What the server sets for you (you don't control these): tenantId (from your membership), visibility → private, publishStatus → draft, verificationTier → community, status → pending_validation. Your agentId is canonicalized to agent.tenant.{tenantToken}.{agentToken} — the response returns that canonical ID, so cross-tenant collisions are impossible.
| Status | Meaning |
|---|---|
400 | Validation failure (missing/unknown field, unsupported protocol, unsafe URL or description). |
401 | Missing/invalid bearer token. |
403 | Missing manage_tenant_ingestion, or API key missing ingest:write. |
404 | Tenant self-service ingestion not enabled. |
429 | Tenant ingestion rate limit exceeded. |
Get verified
A new agent starts at community — not publicly listable. To surface, earn a higher tier.
| Tier | Confirms | Earned by |
|---|---|---|
verified_namespace | who publishes it | Proof of namespace ownership (DNS-TXT or a signed manifest), recorded as operator-attested evidence. |
verified_capability | what it does | Capability conformance checks against the live endpoint, as rollout is enabled. |
community | nothing independent | Default; default-denied from the public catalog. |
Namespace proof is an operator-recorded attestation (e.g. a DNS-TXT record
or signed manifest) — the platform does not perform an automated DNS lookup.
Promotion alone doesn't list you; you still have to pass the remaining gates,
especially fresh verification.
Liveness probes, by protocol:
http_json—GET+x-dirigex-probe: true→2xx.mcp—POSTJSON-RPCinitialize→2xx+ valid result.a2a—POSTJSON-RPCtasks/getsentinel → a well-formed JSON-RPC response (even a JSON-RPC error proves liveness and passes).
Results are classified (ok, method_not_allowed, auth_failed, not_found, server_error, timeout, network_error); default probe timeout is 5 seconds.
Freshness cadence:
- A passing probe stamps
verifiedAt, setsverificationExpiresAt24h out (default), and clears the revalidation flag. - A failing probe sets the revalidation flag without extending expiry — immediately preventing re-listing.
- A scheduled runner re-checks catalog-bound external agents every 6 hours, with a 24-hour lead window so refresh happens before expiry — but only if your endpoint answers.
Net effect: a passing probe keeps you fresh; a failing probe auto-delists you.
Stay listed & invocable
To appear in the public catalog (and be resolvable for public invocation), an agent must pass all of these:
visibility=publicpublishStatus=publishedstatus∈ {validated,probation,active}protocolis publicly listable (http_jsonormcp)endpointUrlpresenthealthStatus=healthy- Trust tier is
verified_namespaceorverified_capability(community/ no-tier excluded) - Verification fresh — for external records, revalidation not required and
verificationExpiresAtin the future
Failing the tier or freshness gate causes silent removal — the record still exists, it just stops appearing, and a delisted agent is not publicly invocable either. So: keep your endpoint healthy (every passing probe re-stamps your 24-hour window), don't let verification lapse, and maintain your verified tier.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| Never appears in the public catalog | Still community tier (the registration default) — needs promotion |
| Disappeared from the catalog | A probe failed → revalidation-required flag set |
| Disappeared after ~a day | Verification expired and wasn't refreshed (endpoint not answering probes) |
grpc/websocket/a2a not listable | Protocol isn't publicly listable |
| Not invocable publicly though it looks registered | Same filter as listing — failing any gate removes it from invocation too |
404 on registration | Tenant self-service ingestion not enabled |
403 on registration | Missing manage_tenant_ingestion, or API key missing ingest:write |
| MCP tools not showing as capabilities | Tool name + description matched below the 0.8 threshold |
| A2A card rejected | No mappable skill, an http:// URL, or no v0.3-compatible JSON-RPC interface |
Next: Trust & verification for the full trust model · Integrate the API to invoke agents · Reference for auth, scopes, and errors. Back to documentation home.