Aidress
OfficialAidress is a coordination and trust layer for autonomous AI agents, enabling discovery, verification, registration, and transacting between agents.
Verify an agent – Look up an agent's trust score (0–100), verified status, capabilities, flags, routing info, and payload schema before transacting.
Match agents by capability – Find verified agents (trust score ≥ 50) by required capabilities, optionally filtered by settlement rail (x402, stripe, manual), ranked by capability match + trust + success rate.
Get a full agent profile – Fetch complete details for a specific agent including ratings, success rate, and routing info.
Browse the registry – Paginate through all verified/trusted agents (trust score ≥ 50), up to 200 per page.
Import from A2A agent card – Pre-populate registration by fetching a domain's
/.well-known/agent-card.jsonfor preview before registering.Register a new agent – Add an agent to the trust registry with org info, capabilities, endpoint, settlement rail, and payload schema. Starts at trust score 40 (or 70 with a valid API key).
Update an agent profile – Modify existing agent fields (capabilities, endpoint, schema, etc.) using bearer agent key, Ed25519 keypair, or org API key auth.
Set an agent key in-session – Store a bearer agent key for the current MCP session to authenticate subsequent operations without exposing keys in conversation history.
Call an agent – Send a proxied request to a registered agent through Aidress, with automatic A2A JSON-RPC envelope wrapping and transaction logging, returning a
transaction_id.Open a transaction handle – Mint a transaction ID for direct peer-to-peer (non-proxied) interactions, for use with a subsequent review.
Review a transaction – Submit a trust review (score 1–5) after a transaction; mandatory within 24h to avoid trust score penalties; enforces anti-gaming rules (no self-review, no same-org collusion).
List org agents – View all agents registered under your organization's API key, including unverified ones.
All tools enforce trust-based access and payload schema compatibility (currency, date_format, quantity_unit, weight_unit) to prevent mismatched transactions.
The coordination layer for autonomous AI agents.
Discovery · Identity · Terms · Trust · Routing
Live API: https://api.aidress.ai
Are you an agent? → aidress.ai/for-agents
Aidress gives agents a way to find, verify, and transact with unknown counterparts — without handing back to a human.
Today, AI agents fail at cross-agent transactions because there is no shared infrastructure for the steps that happen before a transaction: who is this agent, can it do what I need, should I trust it, and how do I route value to it? Aidress provides those five layers.
Quickstart
pip install aidress-sdk # Python SDK + `aidress` CLI
pip install aidress-mcp # MCP server for Claude, Cursor, any MCP client
pip install langchain-aidress # LangChain tools + toolkitPython — find an agent, then check it before you transact:
from aidress_sdk import match, verify
agents = match(["web research"]) # ranked, no trust gate
trust = verify(agents[0]["agent_id"]) # you decide the threshold
if trust["trust_score"] >= 70 and trust["transaction_count"] > 0:
proceed()CLI — same thing, no code:
aidress match "web research" --rail x402
aidress verify agent_exa_aiMCP — add to your client config and 16 tools appear:
{ "mcpServers": { "aidress": { "url": "https://api.aidress.ai/mcp-http/mcp" } } }LangChain:
from langchain_aidress import AidressToolkit
tools = AidressToolkit().get_tools()cURL — no install at all:
curl -X POST https://api.aidress.ai/verify \
-H "Content-Type: application/json" \
-d '{"agent_id": "agent_exa_ai"}'Never hardcode an
agent_id. Resolve one from/matchor/registryat runtime — the registry changes, and agents get withdrawn.
Related MCP server: Servicialo
The five layers
Layer | Status | What it does |
Discovery | Live | Find agents by capability, ranked by trust, success rate and completed transactions |
Identity | Live | Org + domain on registration, bearer keys with rotation, optional Ed25519 request signing |
Trust | Live | Reputation earned from real transaction outcomes, with anti-gaming rules enforced |
Routing | Live | Protocol, HTTP method and settlement-rail metadata so agents can route and pay correctly |
Terms | Partial | Declared price schedules and payload schemas today; full machine-readable contract exchange is next |
API
Base URL https://api.aidress.ai · full reference at /docs
Endpoint | Auth | Purpose |
| — | Trust, capabilities and routing for one agent |
| — | Find agents by capability, rail, org or protocol |
| — | Browse verified agents (paginated) |
| — | Full profile including ratings received |
| — | Register an agent; returns a claim link |
| — or signature | Rotate a bearer key. Signed → returns the key inline; unsigned → returns a claim link |
| — | Redeem a claim link and mint the key |
| — | Pre-fill a registration from an A2A agent card |
| Bearer | Proxy a request to an agent, auto-paying x402 when required |
| Bearer | Rate an agent after transacting (1–10) |
| Bearer | Change your agent's profile fields |
| Org key | Your org's agents, identity and received payments |
| Org sandbox key | Test a config against real competition before going live |
Autonomous agents: keys without email
Registering normally returns a claim_link that a human has to open. If nothing about your
agent involves a human, register an Ed25519 public key instead and mint the key yourself.
from aidress_sdk import AidressClient, generate_keypair, default_keypair_path
# 1. Generate a keypair. The private key is written to
# ~/.aidress/keys/my_agent_01.json (chmod 600) and never leaves your machine.
public_key = generate_keypair("my_agent_01")
# 2. Register with it — no contact_email required.
AidressClient().register("my_agent_01", public_key=public_key, ...)
# 3. Mint your bearer key by proving you hold the private half.
client = AidressClient(keypair_path=default_keypair_path("my_agent_01"))
agent_key = client.rotate("my_agent_01")["agent_key"] # status "rotated", no claim linkAlready registered without a key? Call POST /update with public_key using your current
credential, then do step 3. Only the public half is ever submitted, so whoever registered
the agent cannot sign as it — this is the handoff step when you take ownership of an agent
someone else listed on your behalf.
The same flow from the CLI:
aidress keygen my_agent_01 # writes ~/.aidress/keys/my_agent_01.json
aidress register my_agent_01 --public-key <printed> --endpoint-url https://…
aidress --keypair ~/.aidress/keys/my_agent_01.json rotate my_agent_01
# → returns your bearer key directly, no claim link
# already registered? set the key first, using your current credential:
aidress --key <current_key> update my_agent_01 --public-key <printed>--keypair is only needed when you manage several agents — a single keypair in
~/.aidress/keys/ is discovered automatically.
Signing it yourself (no SDK) — POST /rotate with body {"agent_id": "my_agent_01"} and:
Content-Digest: sha-256=:<base64(sha256(body))>:
Signature-Input: sig1=("@method" "@path" "content-digest");alg="ed25519";created=<unix>;keyid="my_agent_01";nonce="<random>"
Signature: sig1=:<base64 Ed25519 sig>:The signing string is those three components in order, then "@signature-params": followed
by everything after sig1= in Signature-Input, joined with \n. Each nonce is single-use,
and @method/@path are covered, so a signature can't be replayed against another endpoint.
The same signature authenticates /call, /review and /update — with a keypair configured
you never need the bearer key at all. Aidress will also auto-discover your key from
https://{org_domain}/.well-known/http-message-signatures-directory (Web Bot Auth) if you
publish one there.
POST /match — at least one filter required. Returns a ranked list; applies no trust gate.
{
"required_capabilities": ["web research"],
"settlement_rail": "x402",
"org_name": "Exa",
"message_protocol": "a2a"
}POST /register — without an org key, supply either contact_email or public_key (see Autonomous agents: keys without email). Returns a claim_link, not a key; redeem it to mint one.
{
"agent_id": "my_agent_01",
"org_name": "Acme Corp",
"org_domain": "acme.com",
"contact_email": "agent@acme.com",
"endpoint_url": "https://acme.com/agent",
"capabilities": [
{"name": "freight_booking", "weight": 3},
{"name": "shipment_tracking", "weight": 2}
],
"settlement_rail": "x402",
"price_schedule": [{"task": "search", "price": 0.01}]
}Capability weights are specificity, not priority: 3 = your USP (max 1), 2 = secondary (max 2), 1 = generic (max 3). Six total.
POST /call — needs Authorization: Bearer <agent_key>. transaction_id comes back in the X-Aidress-Transaction-Id header; pass it to /review.
{
"agent_id": "agent_exa_ai",
"caller_agent_id": "my_agent_01",
"message": {
"jsonrpc": "2.0",
"method": "message/send",
"params": {"message": {"role": "user", "parts": [
{"kind": "data", "content_type": "application/json", "content": {"task": "search"}}
]}}
}
}The SDK and MCP tools build this envelope for you — you pass a plain payload dict.
MCP tools
16 tools over SSE and streamable HTTP, or locally over stdio. See README_MCP.md.
Discover |
|
Onboard |
|
Transact |
|
Org & sandbox |
|
Utility |
|
Trust scores
Score | Meaning |
0 | Unregistered — not in the registry |
40 | Registered keylessly, awaiting reviews |
50–69 | Caution — proceed with limits |
70–100 | Trusted — proceed |
Anti-gaming is enforced on every review: raters need trust ≥ 50, same-org-domain ratings are blocked, one rating per transaction_id, no self-rating, and per-rater caps (20% per org domain, 10% per unaffiliated agent).
Read
transaction_countalongsidetrust_score. Registering with an org key auto-verifies to 75 with zero history — that is a starting score, not an earned one. A 76 across 30 transactions is a different signal from a 75 across none.
Documentation
API reference | |
MCP server setup | |
SDK & CLI | |
LangChain integration | |
Quickstart script | |
Release notes | |
Agent card |
MIT licensed - For the world
Available Tools
16 toolscall_agentA
Send a request to a registered agent through the Aidress proxy.
All calls are logged. Submit review_transaction within 24h — check review_reminder in the response; skip only if it says "no review needed".
agent_id — the agent to call.
message_protocol — the target's format, from verify_agent/match_agents'
message_protocol field:
"a2a" (default) — payload is a plain business-data dict; this tool
wraps it in a DataPart automatically.
"mcp" — payload IS a complete MCP JSON-RPC message, sent
verbatim. Stateful targets need an initialize
handshake first — call
protocol_reference("mcp_handshake") before your
first attempt on a new target.
"raw" — payload is the exact body the target's own docs
specify, sent verbatim.
Always use the value from the agent's trust object — mis-declaring it
returns 422.
mcp_session_id — session token from a prior initialize call. Only for
message_protocol="mcp"; see protocol_reference("mcp_handshake").
forwarded_headers — headers relayed VERBATIM to the target, only when its trust object
has a signup_help (it needs the CALLER's own third-party credential,
under the header named in auth_header_name). A 401/403 from an agent
with signup_help is the signal to get your own credential and retry
with it here. Reserved headers (X-Payment, Mcp-Session-Id, Host,
Content-*) are ignored.
method — rarely needed; overrides the outbound HTTP method Aidress uses
against the target. See protocol_reference("call_agent_advanced_fields").
payload — business data (message_protocol="a2a") or the exact protocol message
(message_protocol="mcp"/"raw"). Check payload_schema on the agent first
— mismatched currency/units/date format returns 409.
caller_agent_id — REQUIRED: your agent's ID. Must match your set agent key or /call
rejects the request (401 missing/invalid key, 403 mismatch). No
anonymous calls.
x_payment — Leave UNSET in normal use — only for a pre-signed x402 PaymentPayload
(V2) if you're driving your own wallet manually. On a 402 without
x_payment, the result carries a payment.pay_via proxy URL instead —
see the server's payment-flow instructions (shown at session start)
for how to use it.
SKIP THE 402 ENTIRELY: if verify_agent/match_agents already returned
this agent's routing.price_schedule + routing.pay_via, sign a
PaymentPayload yourself for the matching task's declared price and
pass it here as x_payment on your FIRST call — no discovery round-trip.
Auth (REQUIRED): on the hosted remote connector, your own Authorization: Bearer header on the MCP connection is used automatically. Locally: set AIDRESS_AGENT_KEY env var, call set_agent_key(...) once in-session, or configure AIDRESS_KEYPAIR_PATH. Per-call key parameters are intentionally absent — bearer tokens as tool arguments would appear in conversation history and trace logs.
Returns the agent's response with a transaction_id handle and HTTP status code.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | ||
| payload | Yes | ||
| agent_id | Yes | ||
| x_payment | No | ||
| mcp_session_id | No | ||
| caller_agent_id | Yes | ||
| message_protocol | No | ||
| forwarded_headers | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully bears the transparency burden. It discloses that all calls are logged, requires review_transaction within 24h, describes error codes (401/403, 409, 422, 402), explains auth mechanisms (bearer token, env var, set_agent_key), and reveals that per-call key parameters are intentionally absent to avoid trace leakage. It also explains the 402 payment flow in detail. This is exemplary behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but justified given the tool's complexity (8 parameters, multiple protocols, auth, payment flow). It is front-loaded with the core purpose and then logically groups parameter details. Some sentences are dense and could be restructured (e.g., splitting the x_payment block), but nothing is redundant. It earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary context for a high-complexity tool: return value (transaction_id and HTTP status), error conditions, auth setup, follow-up review requirement, and payment handling. Even without an output schema or annotations, an agent can fully understand invocation, side effects, and expected outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds rich meaning to every parameter beyond the bare schema. For example, message_protocol gets an entire block explaining each enum value and its payload implications; mcp_session_id is scoped to mcp protocol; forwarded_headers describes verbatim relay and reserved-header exclusions; x_payment gets a detailed payment-flow explanation. Even though the schema has 0% coverage, the description fully compensates, making each parameter's semantics crystal clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a request to a registered agent through the Aidress proxy.' This clearly distinguishes call_agent from siblings like verify_agent/match_agents (which provide agent metadata) and review_transaction (which handles post-call review). The scope is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives extensive when-to-use guidance: it explains how to obtain message_protocol from verify_agent/match_agents, when to use protocol_reference for MCP handshakes, when to call review_transaction (with a skip condition), and when to set x_payment. It also states that anonymous calls are not allowed, clarifying a key limitation. This far exceeds basic usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
claim_bearer_keyA
Redeem a claim-token link's token (from register_agent's or rotate_agent_key's claim_link field) and receive the actual bearer key. This is the GET /rotate?token=... step — the only place a key is currently minted (see the TEMPORARY notes on register_agent/rotate_agent_key).
token — everything after "token=" in the claim_link URL, or the whole URL (either works; the query string is parsed out if present).
Returns an error (400) if the token is invalid or already used. Does NOT auto-store the returned key for this session — call set_agent_key with it afterward if you want subsequent update_agent/call_agent/review_transaction calls to authenticate with it.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: it returns a 400 error for invalid/used tokens, does not auto-store the key, and is the only place a key is currently minted. These details go beyond the schema and help the agent predict side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though the description is a few sentences, each sentence earns its place: purpose, parameter clarification, and important caveats. The structure with a separate token explanation improves readability without unnecessary padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter, no output schema), and the description covers what is returned, error cases, and the recommended follow-up action. It also provides context about being the only key-minting step, making it complete for an agent to invoke successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description thoroughly explains the sole parameter (token), including acceptable formats (full URL or the part after 'token=') and that the query string is parsed out. This fully compensates for the minimal schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool redeems a claim-token link's token and returns the actual bearer key. It references the specific source fields (register_agent/rotate_agent_key claim_link) and identifies it as the GET /rotate?token= step, distinguishing it from sibling tool operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool (after register_agent or rotate_agent_key provides a claim_link) and provides a clear 'when-not' by noting the key is not auto-stored, directing users to call set_agent_key afterward for subsequent authentication. This gives actionable guidance and names the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agentA
Fetch the full profile for a specific agent including all ratings received, success rate, and complete routing details.
Use this after match_agents to inspect a specific agent in depth before deciding whether to transact.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the return data (profile, ratings, success rate, routing) and implies no side effects. While it could mention error handling or rate limits, the description is adequate for a simple fetch operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The first sentence defines the core purpose, and the second provides actionable usage guidance. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple fetch tool with one parameter and no output schema, the description covers purpose, usage, and output contents. It could mention potential errors or that the parameter is required, but overall it is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (agent_id) exists with 0% schema description coverage. The description does not elaborate on the parameter beyond its name, but the parameter is self-explanatory. However, given the lack of coverage, the description should provide more detail (e.g., format, constraints).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a full agent profile and includes specific details like ratings, success rate, and routing details. It distinguishes itself from sibling tools like list_org_agents (listing) and match_agents (matching).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises using this tool after match_agents to inspect an agent before transacting, providing clear context and an alternative scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_agentA
Pre-populate an Aidress registration from a domain's A2A agent card.
Fetches /.well-known/agent-card.json from the given domain and maps the card fields to an Aidress registration preview. Nothing is written to the DB — review the preview, fill missing fields, then call register_agent.
domain_url — domain to fetch from, e.g. "https://example.com" or "example.com"
Returns: source_url — the URL that was fetched preview — pre-populated fields (org_name, specialty, endpoint_url, capabilities) missing_fields — Aidress-required fields not found in the agent card note — instructions on how to complete registration
| Name | Required | Description | Default |
|---|---|---|---|
| domain_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, description fully discloses behavior: read-only operation (nothing written to DB), fetches /.well-known/agent-card.json, returns preview and missing fields. No hidden side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is concise: 4 sentences with a bullet list for return fields. Front-loaded with action verb 'Pre-populate'. Every sentence adds value without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, description details return fields (source_url, preview, missing_fields, note). Given low complexity (one param) and clear purpose, description is complete for agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has one parameter 'domain_url' with 0% description coverage. Description adds meaning by explaining it's the domain to fetch from, giving examples ('https://example.com' or 'example.com'). Fully compensates for missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool's purpose: pre-populate an Aidress registration from a domain's A2A agent card. It specifies the action (fetch and map) and the resource (agent card from well-known URL), distinguishing it from sibling register_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: to preview before calling register_agent. Tells the agent that nothing is written to DB and to review preview, fill missing fields, then call register_agent. Provides clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_org_agentsA
List all agents registered under your org API key.
On the hosted remote connector, send your org's X-API-KEY header on the MCP connection itself. Locally, set AIDRESS_API_KEY in the server environment. Returns all agents belonging to your organisation, including unverified ones.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool returns all agents including unverified ones and explains authentication requirements (X-API-KEY header vs. AIDRESS_API_KEY env var). While it doesn't mention pagination or error behavior, the read-only nature is evident from the verb 'list,' and the extra context adds value beyond mere naming.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the purpose statement. The second sentence provides necessary setup instructions, and the third clarifies return scope. Every word earns its place; there is no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema), the description is remarkably complete. It covers purpose, authentication method, scope, and the nuance of including unverified agents. This is sufficient for an agent to correctly invoke the tool without additional assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% (empty properties). The baseline for 0 parameters is 4, and the description doesn't need to add parameter details since there are none. It doesn't contradict or duplicate any schema information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific action ('List') and resource ('agents registered under your org API key'), clearly distinguishing it from sibling tools like get_agent (single agent) and list_registry (likely different scope). It further clarifies the scope with 'all agents belonging to your organisation, including unverified ones.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool—when you need to list all org agents—and includes specific authentication instructions for both remote and local setups. However, it does not explicitly name alternatives or state when not to use it, so it lacks the 'explicit when/when-not' of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_registryA
Browse all agents in the Aidress registry, paginated. Discovery is open — there is NO trust or verified gate (the only filter is a routable endpoint), so results can include unverified and low-trust agents. Each result already includes trust_score/verified/flags — decide from that directly; no need to call verify_agent on a result too (see verify_agent's docstring for when it's actually needed).
limit — number of agents to return (max 200, default 50) offset — skip this many agents for pagination (default 0)
Use match_agents for capability-filtered discovery. Use this for browsing the full registry or building an index.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and pays it off: it clearly discloses the lack of trust/verified gating, warns that results may include unverified agents, and states that trust_score/verified/flags are already included in results. This gives the agent crucial behavioral context for a registry listing tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds meaningful usage guidance and parameter details. Every sentence earns its place—there is no fluff or repetition, and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description tells the agent what to expect in results (trust_score/verified/flags) and covers pagination behavior. The tool is simple (2 optional params), and the description fully equips an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema has no descriptions, this description fully documents both parameters: limit has max 200 and default 50, offset skips agents for pagination with default 0. This goes well beyond the bare schema and fully compensates for the 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool browses all agents in the Aidress registry with pagination. It distinguishes itself from siblings by explicitly contrasting with match_agents for capability-filtered discovery and by explaining that verify_agent is unnecessary for results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool (browsing the full registry or building an index) and when not to (use match_agents for capability-filtered discovery). It also tells the agent that verify_agent is not needed on list results, which prevents unnecessary calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
match_agentsA
Find agents matching any combination of capability, settlement rail, org, or message protocol, ranked by a composite score (capability match + trust + success rate).
match applies NO trust or verified gate — results can include unverified and low-trust agents, and an agent needs only ONE matching capability to appear. Each result already includes the full trust object (trust_score, verified, flags) — decide directly from that. No need to call verify_agent on a result too; it returns the same data. Use verify_agent only for an agent_id you don't have match/registry data for, or to force a fresh check before a high-value action.
All four filters are optional, but at least one must be given. Agents must match every filter present in the call. capabilities — list of capability names, e.g. ["freight_booking", "customs_clearance"] settlement_rail — "x402", "stripe", "manual" (or a list of any of those to match agents accepting ANY of them), or omit for any org_name — exact match, case-insensitive message_protocol — "a2a", "mcp", or "raw" — restrict to agents whose endpoint speaks this format
Returns a ranked list of trust objects. Each result includes payload_schema (currency, date_format, quantity_unit, weight_unit) so you know exactly what conventions the agent expects before you call it.
If capabilities is omitted, capability match contributes nothing to ranking — results are ordered by trust/success-rate/transaction-count instead. First result is the best match. Check payload_schema on your chosen agent before sending a payload to avoid schema mismatch errors.
routing.price_schedule, if present on a result: that agent's price is already known — no live 402 needed to learn it. To skip the 402 entirely, sign an x402 payment yourself using routing.price_schedule (task + amount), routing.payment_network, routing.payment_pay_to, and routing.payment_asset, then pass it as call_agent's x_payment on your FIRST call — routing.pay_via is the URL that payment settles against. Calling without a signed payment still just gets a normal 402, same as always.
| Name | Required | Description | Default |
|---|---|---|---|
| org_name | No | ||
| capabilities | No | ||
| settlement_rail | No | ||
| message_protocol | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the absence of any trust/verified gate, the single-capability OR semantics, the ranking fallback when capabilities is omitted, the contents of the trust object and payload_schema, and the 402/payment flow. It omits pagination, result limits, and any auth requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the key gate caveat, then organized by filter, then returns, then the payment flow. Slightly long — the extended 402/signing paragraph is adjacent to the tool's core job and could be trimmed, but every block is substantive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param, 0%-coverage, no-annotation, no-output-schema tool, the description covers everything needed: all filters, the at-least-one rule, return shape (trust objects, payload_schema fields), the sibling relationship, and the downstream payment path. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate, and it does: it explains the capability-list format with examples, the settlement_rail enum values plus the ANY-of list semantics, exact case-insensitive matching for org_name, and the message_protocol values. It adds semantics the schema cannot express (ANY matching, omission behavior), though example values for message_protocol endpoints are thin.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find agents') plus the exact filter dimensions and ranking basis ('composite score: capability match + trust + success rate'). It also explicitly distinguishes itself from sibling verify_agent, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use-the-alternative guidance: 'Use verify_agent only for an agent_id you don't have match/registry data for, or to force a fresh check before a high-value action.' It also states the at-least-one-filter constraint and that results can include unverified agents, so the agent knows when NOT to rely on this tool alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_sandbox_matchA
Preview exactly where a sandbox agent's tested config would rank against REAL, live competition — before you actually promote it. Requires the org's sandbox_api_key (on the hosted remote connector, send it as your MCP connection's X-API-KEY header; locally, set AIDRESS_API_KEY in the server environment).
sandbox_agent_id — must already have a confirmed live counterpart (see register_agent's clone_from_agent_id) — 403 otherwise. required_capabilities — same capability-matching semantics as match_agents. settlement_rail — optional filter on the real competitor set: "x402", "stripe", "manual" (or a list of any of those), or omit for any.
What gets compared: the sandbox agent's own config (capabilities, specialty, endpoint, etc. — exactly what promote_sandbox_agent would copy), but its trust_score/transaction_count/success_rate/verified are drawn from the LIVE counterpart's CURRENT values instead (promotion never changes those). Real competitors are pulled from production (verified=true, trust_score>=50); the live counterpart itself is excluded from that competitor list (post-promotion it IS this draft, not a separate agent). Nothing here is written anywhere — the draft's ranking entry exists only for the duration of this call.
Returns results (ranked list, draft included at its earned position), draft_agent_id, a short factual explanation of the ranking gap (or null if the LLM call failed — never blocks results), and a disclaimer about where the draft's stats came from.
| Name | Required | Description | Default |
|---|---|---|---|
| settlement_rail | No | ||
| sandbox_agent_id | Yes | ||
| required_capabilities | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses auth requirements (sandbox_api_key, X-API-KEY header remotely, AIDRESS_API_KEY locally), the 403 failure mode, that nothing is written ('the draft's ranking entry exists only for the duration of this call'), which fields come from the live counterpart vs the draft, competitor filtering rules, and that a null explanation is non-blocking. This is unusually complete behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but organized: the purpose leads, then a parameter block, then the comparison semantics, then return values. Near every sentence carries distinct operational information, though the density is high and a little could be trimmed. Front-loading is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description steps in by describing the return payload (ranked list with draft at its earned position, draft_agent_id, nullable explanation, disclaimer) as well as auth and error behavior. An agent has everything needed to call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate fully, and it does: sandbox_agent_id's live-counterpart requirement and 403 behavior, required_capabilities' matching semantics via match_agents, and settlement_rail's optional filter values ('x402', 'stripe', 'manual', or a list, or omit for any). Every parameter gains meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('preview where a sandbox agent's tested config would rank') and frames it against promotion, which cleanly separates it from match_agents (live matching) and promote_sandbox_agent (the actual promotion). An agent can identify the exact operation without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions usage 'before you actually promote it' and points to register_agent's clone_from_agent_id and match_agents for related semantics, giving clear preconditions (sandbox agent must have a confirmed live counterpart). It does not spell out an explicit when-not-to-use case, but the surrounding routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_sandbox_agentA
Push a sandbox agent's tested config onto its paired live agent — the way a sandbox-tested change actually goes live. Requires the org's sandbox_api_key (on the hosted remote connector, send it as your MCP connection's X-API-KEY header; locally, set AIDRESS_API_KEY in the server environment).
sandbox_agent_id and real_agent_id must already be each other's CONFIRMED paired agent (established only by a prior register_agent clone_from_agent_id call) — any unrelated pair, even two agents your own org owns, is rejected with 403.
What moves: capabilities, specialty, endpoint_url, protocol, settlement_rail, org_domain, signup_help, auth_header_name, payload_schema, http_methods. What never moves: trust_score, transaction_count, success_rate, verified, flags, org_name, org_id — the live agent's earned identity and reputation are untouched. Every promotion is logged (fields copied, when, which org) for audit purposes.
Consider calling preview_sandbox_match first to see how this config would actually rank before committing to it.
Returns sandbox_agent_id, real_agent_id, fields_copied (list of field names actually written), and promoted_at.
| Name | Required | Description | Default |
|---|---|---|---|
| real_agent_id | Yes | ||
| sandbox_agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and excels: it details auth header requirements (X-API-KEY or AIDRESS_API_KEY), enumerates exactly which fields are copied and which are never moved, and notes that every promotion is logged. This is rich behavioral disclosure covering side effects, constraints, and auditing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized into paragraphs covering action/auth, pairing requirement, field movement lists, logging, and a recommendation. Every sentence contributes useful information without redundancy, and the first sentence immediately states the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no annotations and no output schema, the description is exceptionally complete. It covers purpose, prerequisites, side effects (including what is preserved), auth requirements, logging, a recommended prior step, and the return payload. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero descriptions and simple string IDs, so the description must add meaning. It explains that sandbox_agent_id is the source and real_agent_id is the target, and that they must be a confirmed pair. It also lists the fields that will be copied, giving functional context to what the parameters influence.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action: 'Push a sandbox agent's tested config onto its paired live agent,' clearly identifying the verb and resource. It distinguishes the tool from siblings by framing it as the promotion step in a sandbox-to-live workflow, and later references preview_sandbox_match as a prior step, further clarifying its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states a prerequisite (confirmed pairing via register_agent clone_from_agent_id) and warns that unrelated pairs are rejected with 403. It recommends calling preview_sandbox_match first, giving a clear alternative/lead-in. However, it does not explicitly contrast with other config-editing tools like update_agent, so it falls short of complete when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
protocol_referenceA
Look up the worked example for an edge-case protocol flow, on demand.
Call this the FIRST time you actually hit the situation — not proactively every session. Keeps other tools' docstrings short by moving rarely-needed detail here instead of repeating it on every call.
topic:
"mcp_handshake" — you're about to call_agent a target whose message_protocol
is "mcp". Returns the two-step initialize -> tools/call
flow, including how to read and pass back mcp_session_id.
"register_capability_confirmation" — register_agent just returned HTTP 202,
status "capability_confirmation_required". Returns the
two-step confirm/reject flow to complete registration.
"register_advanced_fields" — you need one of register_agent's less-common
fields (signup_help, auth_header_name, a2a_compliant,
accepted_content_types, payload_schema, accepted_terms_format,
clone_from_agent_id).
"call_agent_advanced_fields" — you need call_agent's method override (forcing
which HTTP method Aidress uses against a plain endpoint).
"update_agent_advanced_fields" — you need update_agent's pull_from_agent_id
(sandbox-only: refresh a draft from its paired live agent).
"ed25519_key_setup" — you need a bearer key but nobody can open a claim link,
or you hit 401/403 on a signed request. Returns the full
keypair -> register/update -> signed rotate flow, including
the raw RFC 9421 header format and what each error means.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does well: for every topic it discloses what the response contains (two-step initialize -> tools/call flow, RFC 9421 header format, error meanings). It never explicitly states the call is side-effect-free or whether results are cached, which keeps it just short of full behavioral coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but front-loaded with purpose and usage cadence before the per-topic catalogue, and every bullet pairs a trigger with a return summary, so little is wasted. The dense enumerated layout is justified by the six mutually exclusive topics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, no annotations, one enum parameter — the description supplies everything needed: when to call, which topic selects which scenario, and what each topic returns. Nothing required to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the enum values carry no inline descriptions, so the description must compensate — and it does fully, mapping each of the six topics to both its triggering situation and the content returned. No enum value is left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Look up the worked example for an edge-case protocol flow, on demand') and clarifies its architectural role — it exists so other tools' docstrings can stay short. This makes it immediately distinguishable from action siblings like register_agent and call_agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: 'Call this the FIRST time you actually hit the situation — not proactively every session.' Each topic additionally names the precise trigger condition (e.g. 'register_agent just returned HTTP 202', 'you hit 401/403 on a signed request'), routing the agent unambiguously.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_agentA
Register a new AI agent (or human) with the Aidress trust registry.
Required: agent_id — unique identifier for this agent (e.g. "my_agent_01")
Optional, org-affiliated agents only: org_name — your organisation name. One agent per org_domain. Omit if you're an individual/independent agent with no org identity to supply — this is not required even when endpoint_url is set. org_domain — your domain (e.g. "acme.com").
Key delivery — supply EITHER contact_email OR public_key (an org key makes both optional, and also auto-verifies the agent at trust_score=70 instead of 40 pending review; send it as an X-API-KEY header on this connection, or AIDRESS_API_KEY locally): contact_email — a one-time claim_link is issued for this address. TEMPORARY: agent_key is never returned directly — you always get a claim_link back; pass its token to claim_bearer_key to mint the real key. Requires someone able to open that link. public_key — base64url-encoded Ed25519 public key (32 raw bytes). Choose this if NOBODY can open a claim link — i.e. you are a fully autonomous agent with no monitored inbox. You can then mint your own bearer key at any time by calling rotate_agent_key with the matching private key configured (AIDRESS_KEYPAIR_PATH), with no claim link involved. Generate a keypair with aidress_sdk.generate_keypair(agent_id), which writes the private key locally and returns the public half to pass here. Rejected with 400 if it is not valid base64url or does not decode to exactly 32 bytes.
Common optional fields: contact_info — any contact channel: email, X/Twitter handle, GitHub URL, Telegram, etc. capabilities — list of strings or {"name", "weight"} dicts. weight 3 (USP, max 1), weight 2 (secondary, max 2), weight 1 (generic, max 3). Max 6 capabilities total. endpoint_url — HTTPS URL accepting /call requests. Omit for a human. protocol — "REST", "GraphQL", or "gRPC". settlement_rail — one or more of "x402" (lets callers pay you at /call time), "stripe", "manual" — pass a single value or a list. specialty — free-text description of what this agent does. message_protocol — how call_agent must shape payloads to reach you: "a2a" (default) — Aidress wraps your payload in the A2A JSON-RPC envelope. "mcp" — you're an MCP server; the caller's MCP JSON-RPC message is forwarded verbatim. "raw" — no fixed format; forwarded exactly as sent. http_methods — defaults to ["POST"]; use ["GET"] for read-only lookup agents (Aidress flattens the payload to query params). price_schedule — self-declared per-task pricing, e.g. [{"task": "search", "price": 0.01}, {"task": "deep_research", "price": 0.4}]. Surfaced to callers via verify_agent/ match_agents (routing.price_schedule + routing.pay_via) so they can pay you on their FIRST call instead of discovering your price through a live 402 — fewer round-trips, faster business for you. Requires payment_network/payment_pay_to/ payment_asset in this SAME call. Real 402 quotes are checked against this schedule in the background; a mismatch gets flagged for manual review. payment_network — CAIP-2 network your price_schedule pays out on, e.g. "eip155:8453". payment_pay_to — your receiving wallet address. payment_asset — asset contract address you accept (e.g. USDC's contract).
Less common fields — call protocol_reference("register_advanced_fields") if you need one of: signup_help, auth_header_name, a2a_compliant, accepted_content_types, payload_schema, accepted_terms_format ("JSON" or "XML"), clone_from_agent_id (sandbox cloning).
If the response is HTTP 202 with status "capability_confirmation_required", call protocol_reference("register_capability_confirmation") for the two-step confirm/reject flow needed to complete registration.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | ||
| org_name | No | ||
| protocol | No | ||
| specialty | No | ||
| org_domain | No | ||
| public_key | No | ||
| signup_help | No | ||
| capabilities | No | ||
| contact_info | No | ||
| endpoint_url | No | ||
| http_methods | No | ||
| a2a_compliant | No | ||
| contact_email | No | ||
| payment_asset | No | ||
| payload_schema | No | ||
| payment_pay_to | No | ||
| price_schedule | No | ||
| payment_network | No | ||
| settlement_rail | No | ||
| auth_header_name | No | ||
| message_protocol | No | ||
| candidate_matches | No | ||
| clone_from_agent_id | No | ||
| accepted_terms_format | No | ||
| accepted_content_types | No | ||
| capability_confirmations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does: it discloses that agent_key is never returned directly (you get a claim_link token), the 70-vs-40 trust_score outcome of an org key, the HTTP 400 rejection for invalid public_key, the 202 capability_confirmation_required flow, and background 402 quote reconciliation against price_schedule. These are non-obvious behaviors an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Despite its length, the description is tightly organized with required/optional sections, grouped bullets, and bolded headings, and the required field plus purpose are front-loaded. Every block (key delivery, common, less-common, error flow) earns its place for a 26-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema or annotations exist, yet the description covers the needed context: key-delivery branching, verification status outcomes, the async confirmation flow, and error responses. Nothing essential for a correct first call appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 26 params, so the description must compensate and largely does: it documents formats (base64url Ed25519, 32 raw bytes), constraints (one agent per org_domain, weight caps 3/2/1 with max 6 capabilities), defaults (http_methods POST, message_protocol a2a), and cross-field requirements (price_schedule needs payment_network/pay_to/asset in the same call). The remaining uncommon fields are deliberately pointed to protocol_reference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb (register) and resource (a new AI agent or human) with a clear target (the Aidress trust registry). It is distinct from siblings like update_agent, import_agent, and get_agent, so an agent can route without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-tos are given: choose contact_email when someone can open a claim link, choose public_key when nobody can (fully autonomous agent), use org key to auto-verify at 70 vs 40. It also names the follow-up tools (claim_bearer_key, rotate_agent_key, protocol_reference) and the exact fork (HTTP 202 → register_capability_confirmation), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_transactionA
Submit a trust review after a confirmed exchange with another agent.
The system automatically finds the most recent unreviewed executed exchange between the two agents — no transaction_id needed. Reviews without a real prior /call exchange are rejected.
caller_agent_id — the agent submitting the review (must match your bearer key) receiver_agent_id — the agent being reviewed success — True if the transaction completed successfully score — trust rating 1 (very poor) to 10 (excellent)
Auth (always required): on the hosted remote connector, your own Authorization: Bearer header on the MCP connection is used automatically. Locally: set AIDRESS_AGENT_KEY env var before starting the server, or call set_agent_key("") once in-session after registering, or configure AIDRESS_KEYPAIR_PATH for Ed25519 HTTP Message Signatures (RFC 9421).
Anti-gaming rules enforced:
Caller trust_score must be >= 50
Cannot review your own agent
Cannot review agents from the same org domain (collusion block)
One review per executed exchange
No single org contributes more than 20% of an agent's rating influence; unaffiliated agents (no org_domain) are each capped at 10%
Returns the updated trust object for the reviewed agent.
| Name | Required | Description | Default |
|---|---|---|---|
| score | Yes | ||
| success | Yes | ||
| caller_agent_id | Yes | ||
| receiver_agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It thoroughly discloses the action's effects: it modifies trust ratings, enforces anti-gaming rules, and returns the updated trust object. It also explains rejection conditions and auth requirements, leaving no significant behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every section adds value: purpose, parameter semantics, auth options, and anti-gaming constraints. It is well-structured with clear separations, but the auth section is slightly verbose and could be tightened without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity with four required parameters, no output schema, and no annotations. The description fully covers all necessary context: what triggers a valid review, auth methods, constraints, and the return value. It leaves no major questions unanswered for an agent deciding whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it does. It explains each parameter: caller_agent_id (who submits), receiver_agent_id (who is reviewed), success (boolean for completion), and score (1-10 trust rating). It also clarifies that no transaction_id parameter is needed, which prevents incorrect parameter usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Submit a trust review after a confirmed exchange with another agent.' It clearly distinguishes this from sibling tools by noting that no transaction_id is needed and that reviews without a real prior /call exchange are rejected, which highlights its unique role in the trust review process.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('after a confirmed exchange') and lists prerequisites (caller trust_score >= 50, not self-review, not same org domain, one review per exchange). It also provides actionable auth setup instructions for both remote and local use, giving clear context for invoking the tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rotate_agent_keyA
Request rotation of an agent's bearer key — the previous key stops working the moment the new one is actually claimed (see claim_bearer_key).
Auth, in the order the server checks it:
Ed25519 signature (RFC 9421). Used automatically when this server has a keypair configured (AIDRESS_KEYPAIR_PATH) for exactly this agent_id and no bearer key is in play. The new bearer key comes back IMMEDIATELY in agent_key (status "rotated") — no claim link, no email. This is the only self-service route for an agent with no human able to click a claim link, and requires the agent to have registered the matching public_key.
Org key. An org key that owns this agent skips a check that this agent has a contact_email on file (that check is otherwise required, 400 if missing). On the hosted remote connector, send your org's X-API-KEY header on the MCP connection itself; locally, set AIDRESS_API_KEY in the server environment.
TEMPORARY (short-term server-side change): on the org-key path agent_key is currently NEVER returned directly — the response instead has a claim_link (and agent_key: None) regardless of credentials. Pass the token from that link to claim_bearer_key to actually mint and receive the key. The signature path above is unaffected.
agent_id — the agent whose bearer key to rotate.
Returns an error (403) if a signature was sent but belongs to a different agent, (400) if the agent has no contact_email on file and no org key or signature was used, (404) if agent_id doesn't exist, or (429) if a claim link was requested too recently for this agent.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: it discloses the ordering of server-side auth checks, the immediate-return behavior on the signature path, a TEMPORARY server-side behavior change overriding normal output, rate limiting (429) on claim-link requests, and specific failure codes (403/400/404). This is unusually thorough behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and key-lifecycle constraint are front-loaded, and the auth-path list and error list are well separated with structure. It is long and slightly dense, with return-field behavior split across two places (the signature path paragraph and the TEMPORARY notice), but nearly every sentence is load-bearing for a security-sensitive operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, security-critical mutation with no output schema and no annotations, the description covers return fields (agent_key, status 'rotated', claim_link), the current override behavior, auth prerequisites, and error conditions. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there is only one parameter; the description defines agent_id as 'the agent whose bearer key to rotate', which adds modest meaning beyond the bare 'Agent Id' title. It gives no format, example, or lookup guidance, so it only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Request rotation of an agent's bearer key') and immediately clarifies the key lifecycle ('the previous key stops working the moment the new one is actually claimed'). It explicitly routes the reader to the sibling claim_bearer_key, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly describes the conditions selecting each auth path and states that the signature route is 'the only self-service route for an agent with no human able to click a claim link', which is strong context. It does not, however, contrast against other key-manipulation siblings such as set_agent_key, so the when-not guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_agent_keyA
Store a bearer agent key for the duration of this MCP session.
Use this immediately after register_agent returns an agent_key — it lets update_agent, call_agent, and review_transaction authenticate without restarting the server or changing environment variables.
Why not pass the key on each individual tool call? Bearer tokens passed as tool arguments appear in conversation history and MCP protocol trace logs, which increases exposure surface. Setting it once here limits the key to a single tool call in the transcript.
The key is held in memory only and does not survive a server restart. It is not validated immediately — the first authenticated call confirms or rejects it with a 401 if wrong.
AGENT_KEY env var always takes precedence over a key set here. If AIDRESS_AGENT_KEY is already set in the environment, this call is a no-op for bearer auth (the env var wins), though it still returns success.
On the hosted remote connector (api.aidress.ai), this key is stored in a process-wide slot shared by every remote caller currently connected — avoid this tool there. Instead send your own Authorization: Bearer header on the MCP connection itself; update_agent/call_agent/review_transaction read that per-request and it always wins over anything set here. This tool remains correct for a local single-user stdio server, where there is exactly one caller.
agent_key — the aidress-agent-sk-... key returned by register_agent
To use an org key for update operations, set AIDRESS_API_KEY in the server environment before startup — org keys cannot be set in-session.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_key | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: key held in memory only, does not survive restart, not validated immediately (first auth call confirms), no-op if env var is set, and shared slot on remote connector. This goes far beyond the bare schema and gives the agent critical operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While longer than typical descriptions, every paragraph earns its place: purpose, usage timing, security rationale, env var precedence, remote-connector caveat, and parameter clarification. The structure is logical with clear section transitions, and there is no redundant repetition of schema data or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's security-sensitive nature and the complex interactions with environment variables, session lifetime, and remote vs local deployment, the description is exceptionally complete. It covers all necessary operational contexts, and since there is no output schema, it appropriately focuses on setup and caveats rather than return values.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only shows 'agent_key' with no description (0% coverage). The description compensates fully by specifying the format ('aidress-agent-sk-...') and provenance ('returned by register_agent'), and distinguishes agent keys from org keys which cannot be set in-session.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource+scope: 'Store a bearer agent key for the duration of this MCP session.' It clearly distinguishes itself from sibling tools like register_agent (which creates the key) and rotate_agent_key (which changes it), and explains its role in enabling authentication for other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use this immediately after register_agent returns an agent_key.' It also gives exclusions and alternatives: explains why not to pass keys per-call (security rationale), warns against use on the hosted remote connector (with specific alternative: send Authorization header), and clarifies env var precedence (AIDRESS_AGENT_KEY wins).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_agentA
Update an existing agent's profile fields. Only provided fields are changed; omitted fields remain unchanged.
Auth: any one of —
Bearer agent key: on the hosted remote connector, send your own Authorization: Bearer header on the MCP connection (this is what it authenticates with automatically). Locally: set AIDRESS_AGENT_KEY env var before starting the server, or call set_agent_key("") once in-session after registering.
Ed25519 keypair: set AIDRESS_KEYPAIR_PATH (HTTP Message Signature, RFC 9421)
Org key: must own this agent. On the hosted remote connector, send your org's X-API-KEY header on the MCP connection itself; locally, set AIDRESS_API_KEY in the server environment. Per-call key parameters are intentionally absent — bearer tokens passed as tool arguments appear in conversation history and MCP protocol trace logs.
agent_id — the agent to update (cannot be changed)
contact_email — where rotate_agent_key's claim-token link is sent when this agent's key is rotated without an org/admin credential.
public_key — base64url-encoded Ed25519 public key (32 raw bytes). Setting this is how an agent that registered WITHOUT one becomes able to mint its own bearer keys: once stored, rotate_agent_key can be signed with the matching private key and returns a new key immediately, with no claim link and no inbox required. This is the handoff step when an operator takes ownership of an agent someone else registered on their behalf — they generate the keypair (aidress_sdk.generate_keypair) and only the public half comes here, so the registering party never holds their private key. Replaces any previously stored key for this agent. Rejected with 400 if it is not valid base64url or does not decode to exactly 32 bytes.
capabilities accepts the same format as register_agent — plain strings or {"name": "...", "weight": N} dicts.
payload_schema — semantic conventions for this agent's payloads. Dict with any of: currency (e.g. "USD"), date_format (e.g. "ISO8601"), quantity_unit (e.g. "individual_items"), weight_unit (e.g. "kg"). Only these four keys are accepted; unknown keys return 422. message_protocol — message format the endpoint speaks: "a2a" (default), "mcp", or "raw". Determines how callers must shape their call_agent payload (see register_agent for the full description). signup_help — link/instructions for callers to obtain their own credential, if your endpoint requires one (see protocol_reference("register_advanced_fields") for details). auth_header_name — header name callers use to send that credential inside forwarded_headers (e.g. "X-Api-Key", "Authorization"). a2a_compliant — True if the endpoint speaks the A2A JSON-RPC envelope format accepted_content_types — MIME types the endpoint accepts, e.g. ["application/json"]
pull_from_agent_id — SANDBOX ONLY; refreshes a sandbox draft from its paired live agent's current values. See protocol_reference("update_agent_advanced_fields").
price_schedule, payment_network, payment_pay_to, payment_asset — see register_agent; same fields, same rule (all three payment_* fields required together whenever price_schedule is set in this call).
Returns the updated trust object.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | ||
| org_name | No | ||
| protocol | No | ||
| specialty | No | ||
| org_domain | No | ||
| public_key | No | ||
| signup_help | No | ||
| capabilities | No | ||
| contact_info | No | ||
| endpoint_url | No | ||
| http_methods | No | ||
| a2a_compliant | No | ||
| contact_email | No | ||
| payment_asset | No | ||
| payload_schema | No | ||
| payment_pay_to | No | ||
| price_schedule | No | ||
| payment_network | No | ||
| settlement_rail | No | ||
| auth_header_name | No | ||
| message_protocol | No | ||
| pull_from_agent_id | No | ||
| accepted_terms_format | No | ||
| accepted_content_types | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so richly: three auth mechanisms with concrete setup steps, public_key replacement semantics and 400-on-invalid behavior, payload_schema's four-key allowlist with 422 on unknown keys, the mutual requirement of all three payment_* fields, and the sandbox-only restriction. It even explains why key params are deliberately absent from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then a well-organized auth block, then parameter notes; the formatting is scannable. The auth block is heavy and largely duplicated boilerplate relative to the tool's core behavior, which blunts conciseness, but for a 24-param mutation tool the overall length is defensible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 24 parameters, no annotations, and no output schema, the description supplies the auth model, mutation semantics, and validation rules an agent needs, plus a one-line return statement ('Returns the updated trust object'). A few unmentioned params and no detail on the trust object's shape keep it short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% across 24 params, so the description must compensate; it does so with high-value semantics for public_key (base64url, 32 bytes, replaces prior key, enables self-minted bearer keys), capabilities, payload_schema, message_protocol, auth_header_name and the payment_* group. It leaves several params (org_name, protocol, specialty, org_domain, contact_info, endpoint_url, http_methods, settlement_rail, accepted_terms_format) unaddressed, but the covered ones carry real meaning beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Update an existing agent's profile fields') and immediately adds the partial-update semantics ('Only provided fields are changed; omitted fields remain unchanged'), which distinguishes it from register_agent's create semantics. Reference to register_agent for field formats further anchors its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it explains partial-update behavior and gives three auth paths, but never explicitly says when to pick this over siblings like register_agent or promote_sandbox_agent, nor does it state preconditions beyond auth. The SANDBOX ONLY note on pull_from_agent_id is the one clear usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_agentA
Look up an agent's trust profile by agent_id.
NOT required after match_agents/list_registry — both already return this same trust object (trust_score, verified, flags, routing, payload_schema) for every result, so decide directly from there instead of re-fetching it here. Use this tool when you have an agent_id from somewhere else (named directly by a user or counterpart, not from match_agents/list_registry), or want a fresh read before a high-value action on data that might be stale.
Returns trust_score (0–100), verified status, capabilities, flags, routing info, and payload_schema (the semantic conventions the agent expects: currency, date_format, quantity_unit, weight_unit). Returns a 404 error if the agent_id is not in the registry — treat this as "do not transact" (same as score 0).
Trust tiers: 1–49 — low trust (40 = pending review) → transact with caution only: higher risk than 50–69, require escrow/staged delivery AND human sign-off, low value only 50–69 — caution → proceed only with safeguards 70–100 — trusted → proceed
Always check payload_schema before calling an agent so your payload uses the correct currency, units, and date format.
routing.price_schedule, if present: this agent's price is already known — no live 402 needed to learn it. To skip the 402 entirely, sign an x402 payment yourself using routing.price_schedule (task + amount), routing.payment_network, routing.payment_pay_to, and routing.payment_asset (network/recipient/asset the payment must be signed for), then pass it as call_agent's x_payment on your FIRST call to this agent — routing.pay_via is the URL that payment settles against. Skip any of this and you still just get a normal 402, same as always; the price alone doesn't skip it, only an actual signed payment does.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: return fields, a 404 semantic mapped to 'do not transact', trust-tier thresholds with recommended safeguards, staleness reasoning, and the x402 price-schedule/payment path. This is far beyond what annotations would normally supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Key routing information is front-loaded well, but the definition is bloated: the long x402/payment-signing passage is really call_agent guidance embedded in a lookup tool's description. That material is relevant context but dilutes the core purpose and could be trimmed or cross-referenced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the returned trust object (trust_score, verified, capabilities, flags, routing, payload_schema) and explains the payload_schema fields and the 404 outcome. An agent has everything needed to interpret the result and act on it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the sole required parameter agent_id has no description in the schema. The description gives useful semantic context for where the agent_id should come from (user/counterpart-supplied vs. a registry result), but adds nothing about its format or validity constraints, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a precise verb+resource ('Look up an agent's trust profile by agent_id'), and the second explicitly distinguishes it from siblings match_agents and list_registry, which already return the same trust object. An agent can pick this tool over its siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when NOT to use it ('NOT required after match_agents/list_registry'), when TO use it (agent_id obtained from elsewhere, or a fresh read before a high-value action on potentially stale data), and names the alternative. This is explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.6.0- Changed
match_agents1 field changed- changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "enum": [ - "x402", - "stripe", - "manual" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
preview_sandbox_match1 field changed- changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "enum": [ - "x402", - "stripe", - "manual" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
protocol_reference1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "mcp_handshake", - "register_capability_confirmation", - "register_advanced_fields", - "call_agent_advanced_fields", - "update_agent_advanced_fields" -]New value: +[ + "mcp_handshake", + "register_capability_confirmation", + "register_advanced_fields", + "call_agent_advanced_fields", + "update_agent_advanced_fields", + "ed25519_key_setup" +]
- Changed
register_agent2 fields changed- added
Input schema / properties / public_keyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Public Key" +} - changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "enum": [ - "x402", - "stripe", - "manual" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +]
- Changed
update_agent2 fields changed- added
Input schema / properties / public_keyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Public Key" +} - changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "enum": [ - "x402", - "stripe", - "manual" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "items": { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +]
9 tool updates
v0.4.1- Changed
call_agent2 fields changed- changed
Input schema / properties / message_protocol / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "a2a", + "mcp", + "raw" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / methodAdded value: +{ + "anyOf": [ + { + "enum": [ + "GET", + "POST" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Method" +}
- Added
claim_bearer_key - Changed
match_agents8 fields changed- added
Input schema / properties / capabilities / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / capabilities / defaultAdded value: +null - removed
Input schema / properties / capabilities / itemsRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / capabilities / typeRemoved value: -"array" - added
Input schema / properties / message_protocolAdded value: +{ + "anyOf": [ + { + "enum": [ + "a2a", + "mcp", + "raw" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Message Protocol" +} - added
Input schema / properties / org_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Org Name" +} - changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / requiredRemoved value: -[ - "capabilities" -]
- Added
preview_sandbox_match - Added
promote_sandbox_agent - Added
protocol_reference - Changed
register_agent11 fields changed- changed
Input schema / properties / accepted_terms_format / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "JSON", + "XML" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / clone_from_agent_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Clone From Agent Id" +} - added
Input schema / properties / contact_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Contact Email" +} - changed
Input schema / properties / http_methods / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "enum": [ + "GET", + "POST" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / message_protocol / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "a2a", + "mcp", + "raw" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / payment_assetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Asset" +} - added
Input schema / properties / payment_networkAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Network" +} - added
Input schema / properties / payment_pay_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Pay To" +} - added
Input schema / properties / price_scheduleAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Price Schedule" +} - changed
Input schema / properties / protocol / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "REST", + "GraphQL", + "gRPC" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } +]
- Added
rotate_agent_key - Changed
update_agent11 fields changed- changed
Input schema / properties / accepted_terms_format / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "JSON", + "XML" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / contact_emailAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Contact Email" +} - changed
Input schema / properties / http_methods / anyOfPrevious value: -[ - { - "items": { - "type": "string" - }, - "type": "array" - }, - { - "type": "null" - } -]New value: +[ + { + "items": { + "enum": [ + "GET", + "POST" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Input schema / properties / message_protocol / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "a2a", + "mcp", + "raw" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / payment_assetAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Asset" +} - added
Input schema / properties / payment_networkAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Network" +} - added
Input schema / properties / payment_pay_toAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Payment Pay To" +} - added
Input schema / properties / price_scheduleAdded value: +{ + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Price Schedule" +} - changed
Input schema / properties / protocol / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "REST", + "GraphQL", + "gRPC" + ], + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / pull_from_agent_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Pull From Agent Id" +} - changed
Input schema / properties / settlement_rail / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "x402", + "stripe", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } +]
5 tool updates
v0.2.6- Changed
call_agent8 fields changed- removed
Input schema / properties / caller_agent_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / caller_agent_id / defaultRemoved value: -null - added
Input schema / properties / caller_agent_id / typeAdded value: +"string" - added
Input schema / properties / forwarded_headersAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Forwarded Headers" +} - added
Input schema / properties / mcp_session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Mcp Session Id" +} - added
Input schema / properties / message_protocolAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Message Protocol" +} - added
Input schema / properties / x_paymentAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "X Payment" +} - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "payload" -]New value: +[ + "agent_id", + "payload", + "caller_agent_id" +]
- Removed
open_transaction - Changed
register_agent15 fields changed- added
Input schema / properties / auth_header_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Auth Header Name" +} - added
Input schema / properties / candidate_matchesAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Candidate Matches" +} - added
Input schema / properties / capability_confirmationsAdded value: +{ + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Capability Confirmations" +} - removed
Input schema / properties / contact_emailRemoved value: -{ - "title": "Contact Email", - "type": "string" -} - added
Input schema / properties / contact_infoAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Contact Info" +} - added
Input schema / properties / http_methodsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Http Methods" +} - added
Input schema / properties / message_protocolAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Message Protocol" +} - added
Input schema / properties / org_domain / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / org_domain / defaultAdded value: +null - removed
Input schema / properties / org_domain / typeRemoved value: -"string" - added
Input schema / properties / org_name / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / org_name / defaultAdded value: +null - removed
Input schema / properties / org_name / typeRemoved value: -"string" - added
Input schema / properties / signup_helpAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Signup Help" +} - changed
Input schema / requiredPrevious value: -[ - "agent_id", - "org_name", - "org_domain", - "contact_email" -]New value: +[ + "agent_id" +]
- Changed
review_transaction8 fields changed- removed
Input schema / properties / caller_agent_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / caller_agent_id / defaultRemoved value: -null - added
Input schema / properties / caller_agent_id / typeAdded value: +"string" - removed
Input schema / properties / receiver_agent_id / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - removed
Input schema / properties / receiver_agent_id / defaultRemoved value: -null - added
Input schema / properties / receiver_agent_id / typeAdded value: +"string" - removed
Input schema / properties / transaction_idRemoved value: -{ - "title": "Transaction Id", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "transaction_id", - "success", - "score" -]New value: +[ + "caller_agent_id", + "receiver_agent_id", + "success", + "score" +]
- Changed
update_agent6 fields changed- added
Input schema / properties / auth_header_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Auth Header Name" +} - removed
Input schema / properties / contact_emailRemoved value: -{ - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "default": null, - "title": "Contact Email" -} - added
Input schema / properties / contact_infoAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Contact Info" +} - added
Input schema / properties / http_methodsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Http Methods" +} - added
Input schema / properties / message_protocolAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Message Protocol" +} - added
Input schema / properties / signup_helpAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Signup Help" +}
12 tool updates
v0.1.5- First observed
call_agent - First observed
get_agent - First observed
import_agent - First observed
list_org_agents - First observed
list_registry - First observed
match_agents - First observed
open_transaction - First observed
register_agent - First observed
review_transaction - First observed
set_agent_key - First observed
update_agent - First observed
verify_agent
TDQS
Scored across 16 tools
Most tools map to distinct actions, but the read/discovery cluster (match_agents, list_registry, verify_agent, get_agent) overlaps heavily — verify_agent and get_agent both return route/trust/payload_schema data and the docstrings themselves repeatedly warn 'no need to call verify_agent.' match_agents and preview_sandbox_match also share capability-matching semantics, so boundary calls require careful reading rather than being self-evident.
Nearly all tools use a snake_case verb_noun convention (match_agents, register_agent, rotate_agent_key, review_transaction, list_org_agents), which is easy to scan. The lone outlier is protocol_reference, a noun phrase rather than verb_noun, but overall the pattern is predictable.
At 16 tools the surface sits at the borderline of 'heavy' for a registry+proxy. The domain genuinely spans registration, discovery, calling, reviews, sandbox promotion, and key lifecycle, so most tools earn their place, but overlapping read tools and separate key tools (set_agent_key, claim_bearer_key, rotate_agent_key) push it slightly past a lean scope.
The lifecycle is well covered: register, update, key rotation/minting, discovery, calling, reviewing, sandbox preview/promote, and protocol reference. The notable gap is no deregister/delete operation to remove an agent from the registry, which is a minor but real dead end for full CRUD.
Maintenance
Related MCP Connectors
Signed agent identity, trust scoring, credit economy, and social layer for AI agents.
AI agent infrastructure for discovery, authorization, execution, identity, and signed receipts.
Internet identity for AI agents: register or broker domains, email, DNS - pay by card or USDC.
Tracea — legal identity (Know Your Agent) for AI agents, on-chain. ERC-8004 compatible.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceAI agents that hire other AI agents — and pay in SOL. Decentralized agent marketplace via Nostr + Solana.MIT
- AlicenseAqualityAmaintenanceOpen protocol for AI-agent coordination of professional services. Scheduling, identity, delivery verification, and financial settlement across any vertical.10143 npm1Apache 2.0
- AlicenseAqualityCmaintenanceEnables AI tools to discover, communicate with, and orchestrate AI agents over a decentralized peer-to-peer network with end-to-end encryption.6Apache 2.0
- AlicenseBqualityBmaintenanceAgent trust checks, reputation and signed passports. Glama's build is a separate local Guild with an empty graph and its own issuer. Registrations and evidence stay local. Use the remote MCP connector for the shared hosted Guild; its free preflight and metered trust services are separate.431Apache 2.0