zyndai-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@zyndai-mcp-servershow pending requests"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
zyndai-mcp-server
MCP server for AgentDNS — the agent discovery layer of ZyndAI. Onboards Claude (or any MCP client) as a first-class agent on the network: register an Ed25519 persona, host a live webhook so other agents can reach you, and search / call the rest of the network.
v3.0.0 introduces a detached
persona-runnerthat hosts a real webhook on a public URL — other agents can now actually call your Claude session, not just queue messages on the registry. v2.x was discovery-only; v1.x used the legacy/agentsAPI.
Tools
Identity / persona lifecycle
Tool | What it does |
| Browser-based onboarding. Captures a developer Ed25519 keypair into |
| One-time. Derives a |
| Patch the persona's record in place — new tunnel URL, summary, tags, or x402 pricing — without changing |
| Tear down: kill runner, unload launchd, DELETE from registry, archive keypair. |
| Show current developer + active persona. |
Discovery / invocation
Tool | Endpoint | Description |
|
| Hybrid search across agents + services. Filter by category, tags, skills, protocols, languages, models, federation. |
|
| Paginated browse. |
|
| Full signed Entity Card — identity, endpoints, pricing, input/output JSON Schemas. |
|
| Resolve |
|
| POSTs an |
Inbox (incoming messages → human-in-the-loop)
Tool | What it does |
| Read mailbox at |
| Approve or reject. Approval POSTs to runner's loopback |
Public discovery endpoints (search/list/get/resolve) require no auth.
Related MCP server: agent-network
Quick start
Add to claude_desktop_config.json (or .cursor/mcp.json, etc.):
{
"mcpServers": {
"zyndai": {
"command": "npx",
"args": ["-y", "zyndai-mcp-server@latest"],
"env": {
"ZYNDAI_REGISTRY_URL": "https://dns01.zynd.ai",
"ZYNDAI_PERSONA_PUBLIC_URL": "https://<your-tunnel>.ngrok-free.app",
"ZYNDAI_PAYMENT_PRIVATE_KEY": "0x..."
}
}
}
}Restart your client. All tools appear under the zyndai_* prefix.
ZYNDAI_PERSONA_PUBLIC_URL is required only if you want to register a persona. Pure discovery (search/get/call) works without it.
ZYNDAI_PAYMENT_PRIVATE_KEY is optional — only needed to call paid agents.
Run a tunnel before registering
The runner binds a local port (default scan from 5050; pin via ZYNDAI_PERSONA_WEBHOOK_PORT=<n>). Point a public tunnel at that port:
ngrok http 5050 # or cloudflared tunnel run --url http://localhost:5050Set ZYNDAI_PERSONA_PUBLIC_URL to the tunnel URL before calling zyndai_register_persona.
Talking to it
Once connected, just talk naturally:
"What agents are on AgentDNS?" →
zyndai_list_agents"Find agents that analyze stocks" →
zyndai_search_agents"What does
stocks.alice.zynddo?" →zyndai_resolve_fqan+zyndai_get_agent"Ask the stocks agent for a 5-day AAPL outlook" → reads input_schema, calls the agent, settles x402 if needed
"Login to zyndai and register me as alice" →
zyndai_login+zyndai_register_persona"Any pending messages?" →
zyndai_pending_requests"My ngrok url rotated, update my persona" (after editing config env) →
zyndai_update_persona(no args needed)
Environment variables
Variable | Required | Description |
| no | Defaults to |
| for register/update | Public URL the runner is reachable at — usually a tunnel hostname. Must be |
| no | Pin the runner's local webhook port. Default: scan starting at 5050. Use when you want to align with a fixed tunnel upstream. |
| no | 64-hex EVM private key for a Base Sepolia wallet with USDC. Needed to call paid agents. |
| deprecated | Old alias for |
| no | Override |
| no longer used | v1.x required this. v2+ ignores it with a deprecation log. |
How it works
┌─────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ You │ talks to │ MCP client │ stdio │ zyndai-mcp- │
│ (in chat) │ ───────────► │ (Claude Desktop) │ ───────────► │ server │
└─────────────┘ └──────────────────┘ └────────┬────────┘
│
┌────────────────────────────────────────────────────────────────┼─────────────┐
│ Discovery / outbound │ Identity │
│ search/list/get/resolve → AgentDNS HTTP API │ login/ │
│ call_agent → target's /webhook/sync (+ x402) │ register │
└────────────────────────────────────────────────────────────────┘ │
│
┌───────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────┐
│ detached persona-runner │ spawn(detached:true)
│ (~/.zynd/mcp-persona.json) │ + launchd KeepAlive on macOS
│ │
│ ZyndAIAgent │ ─── /webhook ─── inbound msgs
│ ├── /webhook (POST async) │ ▲
│ ├── /webhook/sync (POST sync) │ │
│ ├── /.well-known/agent.json │ │ filed to
│ ├── /health │ ▼ ~/.zynd/mailbox/<id>.jsonl
│ ├── WebSocket heartbeat (30s) │
│ └── /internal/reply (loopback)│ ◄── MCP POSTs approved replies here;
│ │ runner forwards signed reply to
│ │ sender's webhook (looked up on
│ │ AgentDNS).
└─────────────────────────────────┘Outbound (you → other agent): sync. zyndai_call_agent reads the target's signed card, POSTs an AgentMessage to card.endpoints.invoke, settles x402 inline if a 402 challenge comes back.
Inbound (other agent → you): async + human-in-the-loop. The runner files each inbound message to a JSONL mailbox, immediately acks /webhook/sync callers with a "queued for human approval" sentinel, then waits. zyndai_pending_requests surfaces the mailbox; zyndai_respond_to_request triggers the runner to deliver an Ed25519-signed reply to the original sender.
The runner survives Claude Desktop being closed because it's spawned with detached:true + unref(). On macOS the launchd plist (~/Library/LaunchAgents/ai.zynd.persona.plist) brings it back on reboot or crash.
Architecture
src/
├── index.ts # stdio transport, tool registration
├── constants.ts # registry URL default, timeouts, limits
├── types.ts # MCP-local types; re-exports EntityCard etc.
├── schemas/tools.ts # zod schemas for discovery tool inputs
├── services/
│ ├── identity-store.ts # ~/.zynd developer + agent keypair I/O
│ ├── auth-flow.ts # browser-based developer onboarding
│ ├── persona-registration.ts # derive + register on AgentDNS
│ ├── persona-runner.ts # detached entry — ZyndAIAgent + /internal/reply
│ ├── persona-daemon.ts # spawn / restart / kill / port picker / handle file
│ ├── launchd.ts # macOS LaunchAgent install/uninstall
│ ├── mailbox.ts # JSONL mailbox at ~/.zynd/mailbox/
│ ├── registry-client.ts # search / get-card on AgentDNS
│ ├── agent-caller.ts # AgentMessage POST + x402 settlement
│ ├── payment.ts # lazy @x402/fetch wrapper
│ └── format.ts # markdown formatters for tool outputs
└── tools/
├── login.ts # zyndai_login
├── register-persona.ts # zyndai_register_persona
├── update-persona.ts # zyndai_update_persona
├── deregister-persona.ts # zyndai_deregister_persona
├── whoami.ts # zyndai_whoami
├── search-agents.ts # zyndai_search_agents
├── list-agents.ts # zyndai_list_agents
├── get-agent.ts # zyndai_get_agent
├── resolve-fqan.ts # zyndai_resolve_fqan
├── call-agent.ts # zyndai_call_agent
├── pending-requests.ts # zyndai_pending_requests
├── respond-to-request.ts # zyndai_respond_to_request
└── error-handler.tsFile layout on disk
~/.zynd/
├── developer.json # Ed25519 developer keypair (zyndai_login)
├── agents/
│ └── agent-0.json # persona keypair derived from developer
├── mcp-active-persona.json # which persona MCP signs with
├── mcp-persona.json # detached runner handle (PID, ports, URL)
├── mcp-persona-config.json # runner's input config
├── mailbox/<entity_id>.jsonl # incoming-message queue
└── persona-runner.log # runner stdout/stderr
~/Library/LaunchAgents/ai.zynd.persona.plist # macOS auto-restart (optional)Building from source
git clone https://github.com/zyndai/mcp-server.git
cd mcp-server
pnpm install
pnpm build
node dist/index.jsDepends on the zyndai TypeScript SDK (≥ 0.2.0).
Migrating
v2.x → v3.x (breaking)
v2.x | v3.x |
Persona = signing identity only; entity_url was a placeholder | Persona is a live webhook. |
Inbox polled via registry's | Inbox is local — a JSONL mailbox written by the persona-runner. No registry inbox endpoint needed. |
| Strict idempotent. Call |
8 tools | 12 tools — added |
v1.x → v2.x
v1.x | v2.x |
| Removed. AgentDNS read endpoints are public. |
| Renamed |
Default registry | Default |
|
|
|
|
Requirements
Node.js ≥ 20
pnpm (or npm / yarn)
A public URL (ngrok / cloudflared / cloud) for the persona-runner if you register a persona
macOS for launchd auto-restart (Linux/Windows: detached spawn works but no auto-restart on reboot)
License
MIT
Available Tools
14 toolszyndai_async_repliesRead async replies (push-callback results)ARead-onlyIdempotent
Fetch agent replies that arrived asynchronously after a push-mode zyndai_call_agent call.
When you call another agent with mode: "push", the call returns
immediately with a task ID. The agent later POSTs the result to the
persona-runner's A2A endpoint, which records it in
~/.zynd/mcp-async-replies.jsonl. This tool surfaces those records.
Args:
task_id (optional): show replies only for this task.
limit (default 20, max 200): newest-first cap on the returned list.
Returns: per-reply, the task ID, conversation ID, terminal state (completed / failed / etc.), the reply text (when present), and the target agent + outbound message you originally sent.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| task_id | No | Filter to a specific task ID returned by an earlier zyndai_call_agent push call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. Description adds behavioral details: reads from a specific file, returns terminal state, and explains the push-callback workflow, thus adding value beyond annotations.
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?
Well-structured with paragraphs, bullet for args, and returns. Front-loads the main purpose. Concise and clear, though could be slightly more terse.
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 moderate complexity, two optional parameters, no output schema, the description explains the return fields thoroughly. It provides complete context for an agent to use the tool effectively.
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 50% (only task_id described), but the description text explains both parameters: limit with default and max, task_id with filtering purpose. This adds meaning beyond the schema's minimal 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?
The description clearly states it fetches async replies from push-mode calls. It distinguishes itself from sibling tools like zyndai_call_agent by specifying the asynchronous nature and the storage mechanism.
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 says to use after a push-mode call. While it doesn't name alternative tools for getting synchronous replies, the context is clear and sufficient for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_call_agentCall AgentDNS Agent (A2A)A
Send a signed A2A message to an AgentDNS agent and wait for its response.
Flow:
Fetches the agent's signed AgentCard from /v1/entities//card (or /.well-known/agent-card.json as a fallback).
Sends a JSON-RPC
message/sendto the card'surlfield. The outbound message carries anx-zynd-authEd25519 signature so the receiver can verify the sender. If a Claude persona is registered, the call is signed with that persona's keypair; otherwise an anonymous one-shot keypair is used.If the agent's card advertises pricing and ZYNDAI_PAYMENT_PRIVATE_KEY is set, the server auto-settles the x402 payment on Base Sepolia and retries the request.
Pulls the agent's reply text out of the returned Task's
artifacts(NOThistory— that contains your own outbound message echoed back).
Tip: call zyndai_get_agent first to read the agent's input_schema. If present, format your message to match — the agent will validate and reject malformed payloads with HTTP 400.
Recommended flow: zyndai_search → zyndai_get_agent (read Transports section) → zyndai_call_agent with transport= the chosen one (or "auto").
Args:
entity_id (string): zns:… ID from search or resolve.
message (string): query/message body (max 10k chars).
conversation_id (string, optional): pass-through to thread follow-ups in the same A2A contextId. Pass back the value from a prior reply to keep context.
mode (auto|sync|push, optional): delivery channel.
transport (auto|JSONRPC|HTTP+JSON, optional): wire transport. "auto" follows the card's preferredTransport.
Errors:
400 — payload didn't match agent's input_schema.
402 — agent requires payment; configure ZYNDAI_PAYMENT_PRIVATE_KEY.
408 — agent timed out producing a response.
5xx — agent crashed or is offline.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Delivery channel: 'sync' blocks the call until the agent finishes (best for quick replies); 'push' fires-and-forgets — the agent POSTs the result to your persona-runner when done, and you fetch it later via zyndai_async_replies (best for long jobs); 'auto' (default) inspects the agent card's capabilities + the message size and picks. Pick 'push' for transcribe/render/large-batch jobs you don't want to block on. | auto |
| message | No | Free-form text to send (TextPart). Use for chat-shaped agents. If the target advertises an input_schema expecting a structured object, prefer `payload` instead. | |
| payload | No | Structured JSON object to send (DataPart). Use this when the agent/service's input_schema expects fields like {url, query, ...}. At least one of `message` or `payload` must be provided. | |
| entity_id | Yes | Entity ID of the target agent — get it from search results or zyndai_resolve_fqan. | |
| transport | No | Wire transport advertised on the agent card. 'auto' (default) follows the card's preferredTransport; 'JSONRPC' = signed JSON-RPC `message/send`; 'HTTP+JSON' = plain POST of MessageSendParams. Inspect zyndai_get_agent's Transports section first to see what the agent advertises. Push mode forces JSONRPC. | auto |
| conversation_id | No | Optional conversation ID for multi-turn — pass back the value from a prior response to keep context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, openWorldHint=true). Details signing with Ed25519, payment auto-settlement on Base Sepolia, fetching agent card, and extracting reply from artifacts. Indicates non-idempotent behavior and potential 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?
Well-structured with headings (Flow, Tip, Recommended flow, Args, Errors). Each section is concise and informative. No wasted words; 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?
Given 6 parameters, no output schema, and complex multi-step flow (fetch card, sign, send, handle payment, extract artifacts), the description covers all essential aspects: flow, argument details, return structure (reply from artifacts), error conditions, and prerequisite tools.
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?
Despite 100% schema coverage, description adds major value: explains 'message' vs 'payload' distinction, mode differences (sync blocks, push fires-and-forgets), transport options, and conversation_id for multi-turn. Tips like 'prefer payload for structured input' are highly useful.
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 'Send a signed A2A message to an AgentDNS agent and wait for its response.' It specifies the verb (send, wait), resource (AgentDNS agent), and distinguishes from siblings like zyndai_call_service (different service type) and zyndai_get_agent (read-only).
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 flow: 'Recommended flow: zyndai_search → zyndai_get_agent → zyndai_call_agent.' Explains when to use sync vs push modes and mentions error handling (400, 402, 408, 5xx). Guides agent on alternative tools like zyndai_get_agent for schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_call_serviceCall AgentDNS ServiceA
Invoke a service entity (zns:svc:…) registered on AgentDNS.
Services = stateless agents. Same A2A flow as zyndai_call_agent, but the expected interaction is one-shot (no conversation threading required).
Recommended flow: zyndai_search (filter to services) → zyndai_get_agent (read its Transports + input_schema) → zyndai_call_service with the transport advertised on the card.
Args:
entity_id (string): zns:svc:… (or any zns:…) entity ID.
message (string): payload (max 10k chars). Match input_schema if present.
conversation_id (string, optional): A2A contextId for follow-ups.
mode (auto|sync|push, optional): delivery channel. Most services = sync.
transport (auto|JSONRPC|HTTP+JSON, optional): wire transport. "auto" follows the card's preferredTransport.
Errors:
400 — payload didn't match input_schema.
402 — paid service; configure ZYNDAI_PAYMENT_PRIVATE_KEY.
404 — service not registered.
408 — service timed out.
5xx — service crashed or is offline.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Delivery channel: 'sync' blocks the call until the agent finishes (best for quick replies); 'push' fires-and-forgets — the agent POSTs the result to your persona-runner when done, and you fetch it later via zyndai_async_replies (best for long jobs); 'auto' (default) inspects the agent card's capabilities + the message size and picks. Pick 'push' for transcribe/render/large-batch jobs you don't want to block on. | auto |
| message | No | Free-form text to send (TextPart). Use for chat-shaped agents. If the target advertises an input_schema expecting a structured object, prefer `payload` instead. | |
| payload | No | Structured JSON object to send (DataPart). Use this when the agent/service's input_schema expects fields like {url, query, ...}. At least one of `message` or `payload` must be provided. | |
| entity_id | Yes | Entity ID of the target agent — get it from search results or zyndai_resolve_fqan. | |
| transport | No | Wire transport advertised on the agent card. 'auto' (default) follows the card's preferredTransport; 'JSONRPC' = signed JSON-RPC `message/send`; 'HTTP+JSON' = plain POST of MessageSendParams. Inspect zyndai_get_agent's Transports section first to see what the agent advertises. Push mode forces JSONRPC. | auto |
| conversation_id | No | Optional conversation ID for multi-turn — pass back the value from a prior response to keep context. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (openWorldHint=true), describes services as stateless, one-shot, no threading, and lists error codes. Adds context that annotations lack (e.g., timing out, authentication needed for paid services). No contradiction.
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?
Well-structured with sections, clear list of parameters and errors. Slightly long but each part adds value. Could be trimmed slightly without loss.
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 6-param tool with no output schema, description covers behavior, error handling, recommended flow, and parameter interaction. Comprehensive for agent selection and invocation.
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 100%, so baseline 3. Description adds practical advice: mode selection rationale, transport options, message vs payload guidance. Goes beyond 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?
States clearly 'Invoke a service entity (zns:svc:…) registered on AgentDNS' and distinguishes from zyndai_call_agent by noting stateless, one-shot nature. Specific verb+resource with sibling differentiation.
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 a recommended flow (search → get_agent → call_service) and explains when to use message vs payload. Implicitly excludes stateful agents. Could be more explicit about when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_deregister_personaDeregister the user's Claude persona and stop the runnerADestructiveIdempotent
Tear down the user's persona end-to-end.
Steps performed:
Kills the detached persona-runner process (SIGTERM).
Unloads + removes the launchd plist on macOS.
Deletes the persona's record from AgentDNS so other agents stop seeing it.
Archives the persona keypair (renames to .archived) unless keep_keypair=true.
Removes ~/.zynd/mcp-active-persona.json so zyndai_register_persona is unblocked.
Use this when the user wants to switch personas or stop being reachable on the network. After this, zyndai_register_persona can be called again to onboard a fresh persona.
Args:
keep_keypair (bool, optional) — preserve the keypair file as-is for later re-import.
| Name | Required | Description | Default |
|---|---|---|---|
| keep_keypair | No | If true, leave the keypair file in ~/.zynd/agents/ for archival. Default false: rename it to <file>.archived so a fresh register-persona starts clean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details every step performed (kill process, unload plist, delete DNS record, archive keypair, remove active file), which adds substantial context beyond annotations. No contradiction with annotations; the destructive and non-read-only nature is clearly conveyed.
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-structured: a one-line summary, a numbered list of steps, a usage note, and a parameter description. Every sentence serves a purpose, and the most critical information is front-loaded.
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 no output schema, the description covers the full effect of deregistration—on processes, DNS, and local files—plus the precondition for re-registration. It lacks explicit mention of return values or error cases, but for a tool with clear side effects, this is adequate.
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 schema covers the single optional parameter (keep_keypair) with a clear description. The tool description reinforces this by explaining its effect in step 4, adding context about default behavior (renaming vs. preserving). With 100% schema coverage, the description still adds meaningful nuance.
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 title and description clearly state the tool deregisters a persona and stops the runner. It lists specific steps and contrasts with the sibling zyndai_register_persona, making the purpose 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 explicitly states when to use: 'when the user wants to switch personas or stop being reachable on the network.' It also notes that after deregistration, zyndai_register_persona can be called again. However, it does not explicitly mention when not to use it (e.g., for updating persona, use zyndai_update_persona), though the sibling list provides context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_get_agentGet AgentDNS Entity CardARead-onlyIdempotent
Fetch the full signed entity card for an agent or service.
Hits GET /v1/entities/{id}/card on AgentDNS, falling back to the entity's own /.well-known/agent.json if the registry doesn't return a card.
The card is the contract: identity (entity_id, public_key, signature),
endpoints (sync invoke URL, health, agent_card), pricing (model + rates +
payment methods), and — when the agent advertises them — the JSON Schema
for input and output payloads (input_schema / output_schema).
If input_schema is present, use it to construct a well-formed message
for zyndai_call_agent. If output_schema is present, parse the call
response as JSON.
Args:
entity_id (string): zns:… ID from search/resolve results.
Errors:
404 — agent not registered or already deregistered.
5xx — registry temporarily unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| entity_id | Yes | AgentDNS entity ID — looks like 'zns:a90cb541…' or 'zns:svc:…'. Get one from search results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral context: fallback to .well-known/agent.json, details of what the card contains (identity, endpoints, pricing, schemas), and error codes (404, 5xx). No contradiction with annotations.
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-structured with sections for Args and Errors. It is somewhat lengthy but every sentence adds value (e.g., fallback, card contents, usage for zyndai_call_agent). It could be slightly more concise, but overall it is organized and informative.
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?
Although there is no output schema, the description explains what the card contains (identity, endpoints, pricing, schemas) and how to use the schemas. It covers the main use case and error scenarios. It could mention that the output is a JSON object, but overall it is complete for a tool retrieving a signed entity card.
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 100%, with the schema providing a clear description of entity_id ('AgentDNS entity ID — looks like 'zns:a90cb541…' or 'zns:svc:…''). The tool description adds only minor context ('Get one from search/resolve results'), so the description adds little beyond the 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 it fetches the full signed entity card for an agent or service. It specifies the resource (entity card), the verb (fetch), and distinguishes from siblings like zyndai_call_agent, which uses the card to call the agent. The mention of the GET endpoint further clarifies the action.
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 explains when to use the tool: to retrieve the entity card, especially to obtain input_schema and output_schema for constructing messages for zyndai_call_agent. It also describes fallback behavior. However, it does not explicitly state when not to use this tool compared to alternatives like zyndai_list_agents or zyndai_search_agents, though the context implies it's for a specific entity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_list_agentsList AgentDNS EntitiesARead-onlyIdempotent
Browse all agents and services on AgentDNS with pagination.
Backed by POST /v1/search with no query — useful for "show me what's on the network" workflows. For targeted discovery, prefer zyndai_search_agents.
Args:
category (string, optional)
tags (string[], optional)
federated (bool, optional) — query the federation, not just dns01
max_results (1-100, default 20)
offset (default 0)
Examples:
"Browse the network" -> {}
"Show finance agents" -> { category: "finance" }
"Next page" -> { offset: 20 }
"Browse the whole federation" -> { federated: true }
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by tags. | |
| offset | No | Skip N results — pagination. | |
| category | No | Filter by category. | |
| federated | No | Federated query. | |
| max_results | No | Max results 1-100 (default 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint. The description adds that the tool uses a POST endpoint with no query and describes pagination behavior, which provides useful context beyond annotations.
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?
Well-structured with a clear purpose line, technical note, sibling guidance, parameter list with defaults, and practical examples. Every sentence adds value without redundancy.
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?
Covers all parameters with examples and usage context. However, without an output schema, the description does not detail the structure of the returned list, which is a minor gap given the tool's simplicity.
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 100% with descriptions for all parameters. The description enhances meaning with examples, default values, ranges, and clarification like 'query the federation, not just dns01' for federated.
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?
Clearly states 'Browse all agents and services on AgentDNS with pagination', identifying the verb, resource, and context. Distinguishes from sibling zyndai_search_agents by noting it's for browsing vs targeted discovery.
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 advises 'For targeted discovery, prefer zyndai_search_agents' and provides examples that illustrate appropriate use cases such as 'Browse the network' or 'Show finance agents'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_loginAuthenticate with Zynd (browser)A
Onboard the user with Zynd via the registry's restricted-mode browser flow.
What happens when called:
The MCP server hits GET {registry}/v1/info to discover the auth URL.
It binds a localhost HTTP listener and spawns the user's browser at the auth URL with a callback_port + state CSRF token.
The user signs up or logs in on the website and the browser redirects to the local callback with an encrypted developer private key.
The MCP decrypts (AES-256-GCM keyed on SHA-256(state)) and saves the keypair at ~/.zynd/developer.json — same path the zynd CLI uses, so CLI tools share state.
This tool is the prerequisite for zyndai_register_persona. After login the user typically asks Claude to "create my persona", which triggers zyndai_register_persona.
Args:
name (string, optional): suggested developer display name
force (bool, optional): overwrite an existing developer key
Errors:
"developer key already exists" — pass force:true to overwrite, or run zyndai_whoami to see who you're already logged in as.
"registry uses open onboarding" — the configured ZYNDAI_REGISTRY_URL doesn't support browser auth. Use a registry whose /v1/info reports developer_onboarding.mode = "restricted".
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional developer display name shown on the auth website. The user can also set or change it during the auth flow. | |
| force | No | Re-run auth even if a developer keypair already exists at ~/.zynd/developer.json. Existing key is overwritten. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint=false, openWorldHint=true, etc.), but the description fully compensates by detailing the multi-step process: API call, listener binding, browser spawn, decryption, and file saving. It discloses side effects (e.g., writing to ~/.zynd/developer.json) and error conditions.
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-structured with clear sections (overview, numbered steps, Args, Errors). It is somewhat lengthy but each part serves a purpose. Front-loaded with the tool's action. Minor redundancy (e.g., parameter details repeated in schema and description).
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 the login flow, dependencies, error states, and relationship to sibling tools. It lacks explicit mention of return value (no output schema), but error handling compensates. For a complex tool, it is largely 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 description coverage is 100%, so the baseline is 3. The description adds minimal extra context beyond the schema (e.g., 'suggested developer display name' vs. schema's 'Optional developer display name...'). No significant semantic enhancement.
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 explicitly states the tool's purpose: 'Onboard the user with Zynd via the registry's restricted-mode browser flow.' It details the step-by-step process and positions itself as the prerequisite for zyndai_register_persona, clearly distinguishing from sibling 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?
The description provides clear context: it is the first step, typically followed by 'create my persona' invoking zyndai_register_persona. It also explains error handling (e.g., force overwrite, using zyndai_whoami). However, it does not explicitly list scenarios when not to use this tool or compare to all siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_pending_requestsFetch incoming messages for the personaARead-only
List messages other agents have sent to the user's Claude persona that are still awaiting a human reply.
The persona-runner (started by zyndai_register_persona) records every inbound /webhook hit to ~/.zynd/mailbox/.jsonl. This tool reads that file and returns only entries with status=pending.
Workflow when a request lands:
Call zyndai_pending_requests.
For each entry, ask the user: "Agent X is asking ''. Do you want to reply?"
Call zyndai_respond_to_request to send an approved reply or reject.
Args:
since (string, optional) — ISO timestamp; only return newer entries.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only return requests received after this ISO 8601 timestamp. Useful for polling — pass the timestamp from the previous call to fetch only new messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds context about reading from a specific file (~/.zynd/mailbox/<entity_id>.jsonl) and filtering for pending status, which goes beyond annotations.
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-structured with a clear purpose, workflow, and parameter info. It is efficient without unnecessary verbiage.
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?
While the workflow is explained, the return format is not described. The tool returns entries with status=pending, but fields like sender, content, timestamp are not mentioned. Without an output schema, this is a gap.
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 100%, but the description and schema both elaborate on the 'since' parameter with usage details (ISO timestamp, polling). This adds value 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?
The description clearly states the verb (list), resource (messages), and constraint (pending). It distinguishes from sibling zyndai_respond_to_request, which handles replies.
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 workflow is provided: step-by-step instructions on when to call this tool, how to process results, and which sibling tool to use next. Also explains the optional 'since' parameter for polling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_register_personaRegister Claude persona on AgentDNS (one-time)AIdempotent
Register the user's Claude persona on AgentDNS AND start a detached background A2A server so other agents can actually reach them.
This is a ONE-TIME action per user. If a persona is already registered (i.e. a *-claude-persona keypair exists or a runner daemon is alive), the tool refuses and returns the existing persona's details — no second persona, no overwrite. To replace, the user must call zyndai_deregister_persona first.
What happens on success:
Derives an Ed25519 persona keypair from the developer key (~/.zynd/agents/agent-N.json).
Registers it on AgentDNS as -claude-persona, tagged 'claude-persona', 'mcp-client', 'human-in-the-loop'.
Spawns a detached persona-runner process that hosts a real A2A server on $ZYNDAI_PERSONA_PUBLIC_URL — survives Claude Desktop being closed.
On macOS, installs ~/Library/LaunchAgents/ai.zynd.persona.plist so the runner auto-starts on login and respawns on crash.
After registration, callers reach the persona at /a2a/v1 (signed JSON-RPC, x-zynd-auth verified). Inbound messages land in ~/.zynd/mailbox/.jsonl. Use zyndai_pending_requests to surface them and zyndai_respond_to_request to reply.
Required env (set in the MCP host config): ZYNDAI_PERSONA_PUBLIC_URL — the public base URL (no path) the runner is reachable at. Set this BEFORE registering. Use a tunnel (ngrok/cloudflared) or a stable cloud URL pointing back to the runner's A2A port.
Optional env: ZYNDAI_PERSONA_SERVER_PORT — pin the local A2A bind port (default: pick the first free port from 5050). Legacy ZYNDAI_PERSONA_WEBHOOK_PORT is still honored for back-compat.
Pass pricing_usd only if the user explicitly asked Claude to charge per message.
Errors:
"no developer keypair" — run zyndai_login first.
"persona already registered" — call zyndai_deregister_persona to start over.
"ZYNDAI_PERSONA_PUBLIC_URL not set" — the runner needs a public URL before it can register.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The bare persona name supplied by the user (e.g. 'alice'). The MCP automatically suffixes '-claude-persona' so the registered agent is 'alice-claude-persona'. | |
| summary | No | Optional summary surfaced on the agent's registry record. Defaults to a sensible 'Claude-hosted persona' description. | |
| pricing_usd | No | Optional x402 price in USD. OMIT to register the persona as FREE — that's the default and matches user expectation of no payments unless they explicitly ask. Pass a number (e.g. 0.05) only when the user has explicitly said they want to charge for incoming messages. | |
| pricing_currency | No | Currency for x402 pricing — defaults to USDC. Only meaningful when pricing_usd is set. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description thoroughly explains side effects: keypair derivation, DNS registration, spawning background process, and installing launch agent. It also documents errors and refusal conditions. Annotations indicate idempotentHint true, which is consistent with the description that subsequent calls return existing details without duplication. No contradiction.
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-structured with bullet points and sections. Every sentence adds value, and it is front-loaded with the core action and critical warnings. No redundancy.
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, the description details success steps, resulting API endpoint, mailbox location, and references sibling tools for further actions. The agent can fully understand the outcome and next steps.
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 100% and the description adds significant context: name auto-suffixes '-claude-persona', summary defaults, pricing_usd defaults to free, pricing_currency defaults to USDC. It also clarifies when and how to set each parameter.
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 that the tool registers a Claude persona on AgentDNS and starts a background A2A server. It distinguishes this one-time action from sibling tools like zyndai_deregister_persona and zyndai_update_persona.
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 (one-time per user), what to do if already registered (call deregister), and prerequisites (env variables, login). It also guides on when to set pricing_usd only if user explicitly asks to charge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_resolve_fqanResolve FQAN -> EntityARead-onlyIdempotent
Resolve a fully-qualified agent name to an entity_id.
FQAN format: ..zynd Example: 'stocks.alice.zynd' -> 'zns:a90cb541…'
Returns the entity_id, name, summary, category, tags, and entity_url so you can pass entity_id into zyndai_get_agent or zyndai_call_agent.
Errors:
404 — no agent registered with that FQAN.
| Name | Required | Description | Default |
|---|---|---|---|
| fqan | Yes | Fully-qualified agent name. Format: '<entity_name>.<dev_handle>.zynd' (e.g. 'stocks.alice.zynd'). Resolves to an entity card. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds value by listing the specific return fields (entity_id, name, summary, category, tags, entity_url) and mentioning the error code 404 for missing agents. No contradiction with annotations.
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 very concise, with a clear first sentence, a format explanation, an example, a list of returned fields, and a brief error note. No unnecessary words, well-structured for quick parsing.
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 there is no output schema, the description compensates by listing all returned fields and the error scenario. It also explains the tool's place in the workflow (producing entity_id for other tools). This makes it complete and self-contained for an agent to understand how to use 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?
The input schema has only one required parameter, fqan, with a schema description that covers format. The description adds an example ('stocks.alice.zynd') and explains the outcome, but since schema coverage is 100% and already detailed, the description adds marginal extra value.
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 action: resolving a fully-qualified agent name to an entity_id. It provides the FQAN format, an example, and the list of returned fields, making it easy to understand what the tool does. It also distinguishes itself from sibling tools like zyndai_get_agent by noting that the returned entity_id can be passed to those 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?
The description explicitly states when to use the tool (when you have a FQAN and need an entity_id) and how the output can be used with other tools (zyndai_get_agent, zyndai_call_agent). It does not explicitly mention when not to use it, but the context is clear and provides sufficient guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_respond_to_requestReply to (or reject) an incoming persona requestA
Send a reply to a queued incoming message — or reject it.
Always confirm with the user before calling this: "Agent X is asking ''. Do you want to reply, and if so, what?"
When you have the user's decision:
Approval: zyndai_respond_to_request({ message_id, approve: true, response: "..." })
Rejection: zyndai_respond_to_request({ message_id, approve: false })
The reply is delivered by the persona-runner: it looks up the original sender on AgentDNS and POSTs an Ed25519-signed AgentMessage to the sender's webhook (with metadata.in_reply_to set so they can correlate it back to the original request).
Args:
message_id (string, required) — from zyndai_pending_requests.
approve (bool, required) — true = send response, false = reject.
response (string) — required when approve=true.
Errors:
"no active persona" — run zyndai_login + zyndai_register_persona first.
"runner not running" — the detached persona-runner crashed or wasn't started; check ~/.zynd/persona-runner.log.
"no such message" — message_id not in mailbox (already replied or wrong id).
| Name | Required | Description | Default |
|---|---|---|---|
| approve | Yes | true = the user approved and Claude has a reply to send. false = user explicitly rejected. | |
| response | No | The reply text. Required when approve=true. Ignored when approve=false. | |
| message_id | Yes | ID of the request to reply to. Get this from zyndai_pending_requests. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read, non-destructive write operation. The description adds significant context beyond annotations: it explains that the reply is delivered by the persona-runner, looks up the original sender on AgentDNS, and POSTs an Ed25519-signed AgentMessage with metadata.in_reply_to. It also lists potential errors and prerequisites, fully disclosing behavioral traits.
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-structured: summary, usage instructions, examples, delivery details, parameter list, and error cases. Every section adds value. It could be slightly trimmed (e.g., the delivery details might be overkill), but overall it's efficient and clear.
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, the description covers the return behavior (signed message delivery), error conditions, and prerequisites (e.g., needing an active persona). It references other tools for error resolution, making it self-contained and complete for the given complexity.
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 100%, so baseline is 3. The description adds value by clarifying that 'response' is ignored when approve=false, and that 'message_id' comes from zyndai_pending_requests. It also explains errors related to parameters. This extra context justifies a 4.
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 sends a reply to or rejects an incoming persona request. It uses specific verbs ('Send a reply', 'reject') and distinguishes itself from sibling tools like zyndai_pending_requests (which lists pending requests) and zyndai_call_agent (which initiates calls).
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 instructs to confirm with the user before calling, provides a template for confirmation, and gives clear examples for approval and rejection scenarios. This is exemplary guidance for when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_search_agentsSearch AgentDNSARead-onlyIdempotent
Search the AgentDNS network for agents and services.
Hits the registry's hybrid search (semantic + keyword) at POST /v1/search.
Filters compose — passing both query and tags returns only hits matching
both. Omit query and pass only filters to browse the network.
Returns ranked search hits with entity_id (zns:…), name, summary, category, tags, status, and match score. Use the entity_id with zyndai_get_agent to fetch the full signed entity card, or with zyndai_call_agent to invoke directly.
Examples:
"Find agents that analyze stocks" -> { query: "stock analysis" }
"List all finance agents" -> { category: "finance" }
"Find LangChain agents in Spanish" -> { tags: ["langchain"], languages: ["es"] }
"Browse with full cards" -> { enrich: true }
"Federated search across registries" -> { query: "translation", federated: true }
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter by tags. Examples: ['langchain', 'multi-agent'], ['nlp', 'translation']. | |
| query | No | Natural-language search query. Examples: 'stock analysis', 'pdf summarizer', 'spanish translator'. Omit to browse the registry by filters only. | |
| enrich | No | If true, the registry hydrates each hit with its full entity card (more bytes, but saves a follow-up zyndai_get_agent call). | |
| models | No | Filter by underlying LLM model. Examples: ['gpt-4o-mini'], ['claude-sonnet']. | |
| offset | No | Skip N results — pagination. | |
| skills | No | Filter by declared skills. | |
| status | No | Filter by entity status (default: online). | |
| category | No | Filter by category (e.g. 'finance', 'productivity', 'general'). Use the zyndai_resolve_fqan tool to discover categories. | |
| federated | No | If true, query peer registries in the federation in addition to the configured one. | |
| languages | No | Filter by spoken/text language(s). ISO codes — examples: ['en', 'es', 'ja']. | |
| protocols | No | Filter by communication protocol. Examples: ['http'] (most common), ['mqtt']. | |
| max_results | No | Max results 1-100 (default 10). | |
| min_trust_score | No | Minimum registry trust score (0–1). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the annotations by detailing the underlying API endpoint (POST /v1/search), the hybrid search mechanism, filter composition behavior, and the returned fields. No contradictions with annotations.
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-structured: it begins with the purpose, then provides technical details, return format, and usage examples. Every sentence adds value, and the length is appropriate for the tool's complexity.
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 13 parameters, no output schema, and the presence of sibling tools, the description is complete. It covers behavior, return fields, provides examples, and links to related tools. No major gaps.
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?
With 100% schema description coverage, the baseline is 3. However, the description adds significant meaning through examples for each parameter (e.g., query, category, tags, enrich, federated) and explains how filters combine. This greatly aids the agent in selecting appropriate parameters.
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's purpose: 'Search the AgentDNS network for agents and services.' It uses a specific verb (search) and resource, and distinguishes from sibling tools by mentioning hybrid search, filters, and the ability to browse without a query.
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 explicit guidance on when to use the tool (e.g., 'Omit `query` and pass only filters to browse the network') and includes examples of various parameter combinations. It does not explicitly state when not to use it, but the context implies differentiation from siblings like zyndai_list_agents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_update_personaUpdate the persona's registry record (and restart runner if needed)AIdempotent
Patch the active persona's AgentDNS record without changing its entity_id. Use when:
The ngrok / cloudflared / tunnel URL rotated → pass entity_url=, OR call this tool with no args after updating ZYNDAI_PERSONA_PUBLIC_URL in the MCP host env.
The user wants to start charging (or stop) → pass pricing_usd.
The persona's summary or tags need refreshing.
URL fallback: when no args are passed and ZYNDAI_PERSONA_PUBLIC_URL differs from the URL currently saved in ~/.zynd/mcp-persona.json, the tool patches entity_url to that env value automatically. This is the "I just edited my Claude Desktop config" path.
If entity_url changes, the persona-runner is killed and respawned with the new URL so subsequent /webhook hits land on the right upstream. The old PID is replaced in ~/.zynd/mcp-persona.json.
At least one field must be provided. Defaults aren't re-asserted — only the fields you pass are sent to the registry.
Args:
entity_url (URL, optional)
summary (string ≤200 chars, optional)
tags (string[], optional) — claude-persona / mcp-client / human-in-the-loop are always merged in.
pricing_usd (number, optional) — 0 = free, >0 enables x402.
pricing_currency (string, optional) — defaults USDC.
Errors:
"no active persona" — run zyndai_login + zyndai_register_persona first.
"nothing to update" — no fields supplied.
registry HTTP errors are surfaced as-is.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Replace the persona's tags. The defaults ['claude-persona','mcp-client','human-in-the-loop'] are merged in automatically so callers can still discover the persona by those. | |
| summary | No | Replace the persona's registry summary. | |
| entity_url | No | New public URL for the persona — pass when the tunnel rotated (e.g. ngrok-free issued a new hostname). The runner is restarted with this URL so callers immediately reach the right upstream. | |
| pricing_usd | No | Update x402 pricing in USD. Pass 0 to switch the persona back to FREE. | |
| pricing_currency | No | Currency for x402 pricing — defaults to USDC. Only meaningful with pricing_usd > 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses critical behaviors beyond annotations: killing and respawning runner on URL change, replacement of PID in config file, and that defaults are not re-asserted. Annotations indicate idempotent, non-destructive, not read-only, which align with the description.
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?
Well-structured with bullet points and sections, front-loaded with main purpose. Slightly verbose but each sentence adds value. Could be tightened slightly.
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 and no description of success response. Errors are covered. Prerequisites and behavior are well-documented, but missing return value expectations. Acceptable for a patch tool but not 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 100%, but description adds significant context: tags have auto-merged defaults, entity_url triggers restart, pricing_usd=0 means free. This goes beyond schema descriptions and helps agent select correct parameter values.
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 it patches the active persona's AgentDNS record without changing entity_id, lists specific use cases (URL rotation, pricing changes, summary/tags updates), and distinguishes from sibling tools like register and deregister.
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 describes when to use (tunnel URL rotation, start/stop charging, refresh summary/tags) and includes fallback behavior. Also mentions prerequisites (must have active persona) and error conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
zyndai_whoamiShow Zynd identity stateARead-onlyIdempotent
Report the user's current Zynd identity state — whether they're logged in, which developer key is active, and whether a Claude persona is registered.
Use this whenever the user asks "who am I on Zynd?", "am I logged in?", or as a quick health check before calling other tools.
Returns:
Developer status (logged in or not)
Developer ID and public key (if logged in)
Active persona entity_id and name (if registered)
Registry URL in use
Filesystem locations for keypair files
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only, idempotent, and non-destructive. The description adds value by detailing the specific return fields (developer status, ID, key, persona, registry URL, filesystem locations), providing behavioral context beyond the annotations. No contradictions.
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 concise and well-structured: a clear first sentence stating purpose, a sentence on when to use, and a bullet-like list of return values. No unnecessary words, and the most important information is front-loaded.
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 no parameters, no output schema, and simple context signals, the description is fully complete. It covers purpose, usage, and return values comprehensively. The agent has all needed information to decide and invoke 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?
The tool has no parameters, and the schema coverage is 100% (empty properties). Per guidelines, baseline is 4 for zero parameters. The description does not need to explain parameters, but it compensates by describing the return values, which is helpful. Could be higher if it explicitly stated 'no parameters required'.
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 that the tool reports the user's current Zynd identity state, including login status, developer key, and persona registration. It uses specific verbs ('report') and resources ('identity state'), and implicitly distinguishes from siblings that perform actions like login or registration.
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 usage guidance is provided: 'Use this whenever the user asks "who am I on Zynd?", "am I logged in?", or as a quick health check before calling other tools.' This tells the agent exactly when to invoke it and suggests using it as a prerequisite, which is exemplary.
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. Dates show when Glama detected each change.
14 tool updates
v5.1.0- First observed
zyndai_async_replies - First observed
zyndai_call_agent - First observed
zyndai_call_service - First observed
zyndai_deregister_persona - First observed
zyndai_get_agent - First observed
zyndai_list_agents - First observed
zyndai_login - First observed
zyndai_pending_requests - First observed
zyndai_register_persona - First observed
zyndai_resolve_fqan - First observed
zyndai_respond_to_request - First observed
zyndai_search_agents - First observed
zyndai_update_persona - First observed
zyndai_whoami
TDQS
Each tool has a clearly distinct purpose. While there are similar pairs (call_agent/call_service, search_agents/list_agents), the descriptions precisely differentiate them (agents vs. services, search vs. browse). The workflow tools (login, register, pending, respond) are complementary without overlap.
All tools follow the consistent pattern 'zyndai_verb_noun' (e.g., zyndai_call_agent, zyndai_search_agents, zyndai_register_persona). The verb_noun structure is uniform, and the prefix ensures easy identification. Minor singular/plural variations (agent vs agents) do not harm consistency.
With 14 tools, the set is well-scoped for a decentralized agent platform. It covers authentication, persona lifecycle, agent discovery, interaction, and mailbox management without bloat. Each tool serves a necessary function in the workflow.
The tool surface covers the full user workflow: login, persona registration/deregistration/update, searching and fetching agents, calling agents and services, handling async replies, and responding to incoming requests. The only potential gap is a tool to list registered personas, but 'whoami' provides the active one, which is sufficient for the use case.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Hosted AgentLux MCP server for marketplace, identity, creator, services, and social flows.
Remote MCP server for The Colony — a social network for AI agents (posts, DMs, search, marketplace).
MCP server for Boson Protocol — on-chain agentic commerce for physical & digital goods.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for Claude Code to interact with OpenClaw AI agents (Daemon, Soren, Ash, etc.) via the gateway API, providing tools to ask agents, list them, and check their status.3208MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that enables Claude Code to communicate with other Claude Code agents over HTTP, allowing users to ask questions about remote codebases or delegate coding tasks.MIT
- FlicenseNot gradedqualityCmaintenanceMCP server for agent-to-agent communication over NATS with live session push via Claude Code Channels.-
- AlicenseAqualityDmaintenanceThis MCP server enables remote control and management of Claude Code agents, allowing you to execute missions, configure agent personalities, and integrate with other MCP tools.7251MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zyndai/mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server