Skip to main content
Glama
zyndai

zyndai-mcp-server

by zyndai

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-runner that 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 /agents API.

Tools

Identity / persona lifecycle

Tool

What it does

zyndai_login

Browser-based onboarding. Captures a developer Ed25519 keypair into ~/.zynd/developer.json.

zyndai_register_persona

One-time. Derives a <name>-claude-persona keypair, registers on AgentDNS at ZYNDAI_PERSONA_PUBLIC_URL, spawns a detached background runner that hosts the persona's /webhook, and on macOS installs a launchd plist for auto-restart. Strict idempotent — refuses if already registered.

zyndai_update_persona

Patch the persona's record in place — new tunnel URL, summary, tags, or x402 pricing — without changing entity_id. Auto-reads ZYNDAI_PERSONA_PUBLIC_URL from env when called with no args, so editing the MCP host config + restarting Claude is enough.

zyndai_deregister_persona

Tear down: kill runner, unload launchd, DELETE from registry, archive keypair.

zyndai_whoami

Show current developer + active persona.

Discovery / invocation

Tool

Endpoint

Description

zyndai_search_agents

POST /v1/search

Hybrid search across agents + services. Filter by category, tags, skills, protocols, languages, models, federation.

zyndai_list_agents

POST /v1/search

Paginated browse.

zyndai_get_agent

GET /v1/entities/{id}/card

Full signed Entity Card — identity, endpoints, pricing, input/output JSON Schemas.

zyndai_resolve_fqan

POST /v1/search

Resolve stocks.alice.zyndentity_id.

zyndai_call_agent

card.endpoints.invoke

POSTs an AgentMessage to the target's /webhook/sync. x402 auto-pay if ZYNDAI_PAYMENT_PRIVATE_KEY is set. Signs with the active persona's keypair when one is registered.

Inbox (incoming messages → human-in-the-loop)

Tool

What it does

zyndai_pending_requests

Read mailbox at ~/.zynd/mailbox/<entity_id>.jsonl — entries the runner queued from inbound /webhook hits.

zyndai_respond_to_request

Approve or reject. Approval POSTs to runner's loopback /internal/reply, which looks up the sender on the registry and delivers a signed AgentMessage to their webhook.

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:5050

Set 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.zynd do?"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

ZYNDAI_REGISTRY_URL

no

Defaults to https://dns01.zynd.ai. Override per registry node for federation.

ZYNDAI_PERSONA_PUBLIC_URL

for register/update

Public URL the runner is reachable at — usually a tunnel hostname. Must be https://....

ZYNDAI_PERSONA_WEBHOOK_PORT

no

Pin the runner's local webhook port. Default: scan starting at 5050. Use when you want to align with a fixed tunnel upstream.

ZYNDAI_PAYMENT_PRIVATE_KEY

no

64-hex EVM private key for a Base Sepolia wallet with USDC. Needed to call paid agents.

ZYNDAI_PRIVATE_KEY

deprecated

Old alias for ZYNDAI_PAYMENT_PRIVATE_KEY. Still read.

ZYND_HOME

no

Override ~/.zynd config dir.

ZYNDAI_API_KEY

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.ts

File 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.js

Depends 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. ZYNDAI_PERSONA_PUBLIC_URL is required at register time.

Inbox polled via registry's /v1/inbox/... (404 in many deployments)

Inbox is local — a JSONL mailbox written by the persona-runner. No registry inbox endpoint needed.

register-persona had a force flag

Strict idempotent. Call zyndai_deregister_persona to start over.

8 tools

12 tools — added zyndai_update_persona, zyndai_deregister_persona.

v1.x → v2.x

v1.x

v2.x

ZYNDAI_API_KEY required

Removed. AgentDNS read endpoints are public.

ZYNDAI_PRIVATE_KEY for x402

Renamed ZYNDAI_PAYMENT_PRIVATE_KEY; old name still works.

Default registry https://registry.zynd.ai

Default https://dns01.zynd.ai. Override per node with ZYNDAI_REGISTRY_URL.

agent_id (UUID)

entity_id (zns:…) cryptographically derived from the public key.

Agent shape

EntityCard — entity_id, public_key, endpoints, pricing, input_schema, output_schema, signature.

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 tools
zyndai_async_repliesRead async replies (push-callback results)A
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
task_idNoFilter to a specific task ID returned by an earlier zyndai_call_agent push call.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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:

  1. Fetches the agent's signed AgentCard from /v1/entities//card (or /.well-known/agent-card.json as a fallback).

  2. Sends a JSON-RPC message/send to the card's url field. The outbound message carries an x-zynd-auth Ed25519 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.

  3. 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.

  4. Pulls the agent's reply text out of the returned Task's artifacts (NOT history — 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDelivery 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
messageNoFree-form text to send (TextPart). Use for chat-shaped agents. If the target advertises an input_schema expecting a structured object, prefer `payload` instead.
payloadNoStructured 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_idYesEntity ID of the target agent — get it from search results or zyndai_resolve_fqan.
transportNoWire 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_idNoOptional conversation ID for multi-turn — pass back the value from a prior response to keep context.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDelivery 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
messageNoFree-form text to send (TextPart). Use for chat-shaped agents. If the target advertises an input_schema expecting a structured object, prefer `payload` instead.
payloadNoStructured 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_idYesEntity ID of the target agent — get it from search results or zyndai_resolve_fqan.
transportNoWire 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_idNoOptional conversation ID for multi-turn — pass back the value from a prior response to keep context.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 runnerA
DestructiveIdempotent

Tear down the user's persona end-to-end.

Steps performed:

  1. Kills the detached persona-runner process (SIGTERM).

  2. Unloads + removes the launchd plist on macOS.

  3. Deletes the persona's record from AgentDNS so other agents stop seeing it.

  4. Archives the persona keypair (renames to .archived) unless keep_keypair=true.

  5. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keep_keypairNoIf 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

A4.6/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 CardA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
entity_idYesAgentDNS entity ID — looks like 'zns:a90cb541…' or 'zns:svc:…'. Get one from search results.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 EntitiesA
Read-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 }

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by tags.
offsetNoSkip N results — pagination.
categoryNoFilter by category.
federatedNoFederated query.
max_resultsNoMax results 1-100 (default 20).

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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:

  1. The MCP server hits GET {registry}/v1/info to discover the auth URL.

  2. It binds a localhost HTTP listener and spawns the user's browser at the auth URL with a callback_port + state CSRF token.

  3. The user signs up or logs in on the website and the browser redirects to the local callback with an encrypted developer private key.

  4. 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".

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional developer display name shown on the auth website. The user can also set or change it during the auth flow.
forceNoRe-run auth even if a developer keypair already exists at ~/.zynd/developer.json. Existing key is overwritten.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 personaA
Read-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:

  1. Call zyndai_pending_requests.

  2. For each entry, ask the user: "Agent X is asking ''. Do you want to reply?"

  3. Call zyndai_respond_to_request to send an approved reply or reject.

Args:

  • since (string, optional) — ISO timestamp; only return newer entries.

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoOnly return requests received after this ISO 8601 timestamp. Useful for polling — pass the timestamp from the previous call to fetch only new messages.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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)A
Idempotent

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:

  1. Derives an Ed25519 persona keypair from the developer key (~/.zynd/agents/agent-N.json).

  2. Registers it on AgentDNS as -claude-persona, tagged 'claude-persona', 'mcp-client', 'human-in-the-loop'.

  3. Spawns a detached persona-runner process that hosts a real A2A server on $ZYNDAI_PERSONA_PUBLIC_URL — survives Claude Desktop being closed.

  4. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe bare persona name supplied by the user (e.g. 'alice'). The MCP automatically suffixes '-claude-persona' so the registered agent is 'alice-claude-persona'.
summaryNoOptional summary surfaced on the agent's registry record. Defaults to a sensible 'Claude-hosted persona' description.
pricing_usdNoOptional 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_currencyNoCurrency for x402 pricing — defaults to USDC. Only meaningful when pricing_usd is set.

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 -> EntityA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fqanYesFully-qualified agent name. Format: '<entity_name>.<dev_handle>.zynd' (e.g. 'stocks.alice.zynd'). Resolves to an entity card.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
approveYestrue = the user approved and Claude has a reply to send. false = user explicitly rejected.
responseNoThe reply text. Required when approve=true. Ignored when approve=false.
message_idYesID of the request to reply to. Get this from zyndai_pending_requests.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 AgentDNSA
Read-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 }

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoFilter by tags. Examples: ['langchain', 'multi-agent'], ['nlp', 'translation'].
queryNoNatural-language search query. Examples: 'stock analysis', 'pdf summarizer', 'spanish translator'. Omit to browse the registry by filters only.
enrichNoIf true, the registry hydrates each hit with its full entity card (more bytes, but saves a follow-up zyndai_get_agent call).
modelsNoFilter by underlying LLM model. Examples: ['gpt-4o-mini'], ['claude-sonnet'].
offsetNoSkip N results — pagination.
skillsNoFilter by declared skills.
statusNoFilter by entity status (default: online).
categoryNoFilter by category (e.g. 'finance', 'productivity', 'general'). Use the zyndai_resolve_fqan tool to discover categories.
federatedNoIf true, query peer registries in the federation in addition to the configured one.
languagesNoFilter by spoken/text language(s). ISO codes — examples: ['en', 'es', 'ja'].
protocolsNoFilter by communication protocol. Examples: ['http'] (most common), ['mqtt'].
max_resultsNoMax results 1-100 (default 10).
min_trust_scoreNoMinimum registry trust score (0–1).

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoReplace 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.
summaryNoReplace the persona's registry summary.
entity_urlNoNew 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_usdNoUpdate x402 pricing in USD. Pass 0 to switch the persona back to FREE.
pricing_currencyNoCurrency for x402 pricing — defaults to USDC. Only meaningful with pricing_usd > 0.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 stateA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 14 tool updatesv5.1.0
    • First observedzyndai_async_replies
    • First observedzyndai_call_agent
    • First observedzyndai_call_service
    • First observedzyndai_deregister_persona
    • First observedzyndai_get_agent
    • First observedzyndai_list_agents
    • First observedzyndai_login
    • First observedzyndai_pending_requests
    • First observedzyndai_register_persona
    • First observedzyndai_resolve_fqan
    • First observedzyndai_respond_to_request
    • First observedzyndai_search_agents
    • First observedzyndai_update_persona
    • First observedzyndai_whoami

TDQS

A4.7/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityInactive
ResponsivenessSyncing

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

Related MCP Servers

Latest Blog Posts

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