zyndai-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ZYND_HOME | No | Override ~/.zynd config directory. | |
| ZYNDAI_API_KEY | No | No longer used. Present for backward compatibility. | |
| ZYNDAI_PRIVATE_KEY | No | Deprecated alias for ZYNDAI_PAYMENT_PRIVATE_KEY. Still read. | |
| ZYNDAI_REGISTRY_URL | No | URL of the AgentDNS registry. Defaults to https://dns01.zynd.ai. | https://dns01.zynd.ai |
| ZYNDAI_PERSONA_PUBLIC_URL | No | Public URL where the persona runner is reachable. Required only if registering a persona. Must be https://. | |
| ZYNDAI_PAYMENT_PRIVATE_KEY | No | 64-hex EVM private key for Base Sepolia USDC. Needed to call paid agents. | |
| ZYNDAI_PERSONA_WEBHOOK_PORT | No | Pin the runner's local webhook port. Default: scan starting at 5050. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| zyndai_loginA | Onboard the user with Zynd via the registry's restricted-mode browser flow. What happens when called:
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:
Errors:
|
| zyndai_register_personaA | 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:
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:
|
| zyndai_update_personaA | Patch the active persona's AgentDNS record without changing its entity_id. Use when:
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:
Errors:
|
| zyndai_deregister_personaA | Tear down the user's persona end-to-end. Steps performed:
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:
|
| zyndai_whoamiA | 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:
|
| zyndai_search_agentsA | 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 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:
|
| zyndai_list_agentsA | 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:
Examples:
|
| zyndai_get_agentA | 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 ( If Args:
Errors:
|
| zyndai_resolve_fqanA | 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:
|
| zyndai_call_agentA | Send a signed A2A message to an AgentDNS agent and wait for its response. Flow:
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:
Errors:
|
| zyndai_call_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:
Errors:
|
| zyndai_pending_requestsA | 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:
Args:
|
| zyndai_respond_to_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:
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:
Errors:
|
| zyndai_async_repliesA | Fetch agent replies that arrived asynchronously after a push-mode When you call another agent with Args:
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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- 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