Configuration
The MCP server is configured entirely through environment variables passed by the MCP host (Claude Desktop, Cursor, etc.). No config files in ~/.zynd/ need to be hand-edited — the tools manage them.
Environment variables
| Variable | Required | Default | Description |
|---|---|---|---|
ZYNDAI_REGISTRY_URL | no | https://dns01.zynd.ai | Registry node to talk to. Override for federation or self-hosted nodes. |
ZYNDAI_PERSONA_PUBLIC_URL | for register / update | — | Public URL the persona-runner is reachable at — usually a tunnel hostname. Must be https://. |
ZYNDAI_PERSONA_WEBHOOK_PORT | no | scan from 5050 | Pin the runner's local webhook port. 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. Required to call x402-paid agents. |
ZYNDAI_PRIVATE_KEY | deprecated | — | Old alias for ZYNDAI_PAYMENT_PRIVATE_KEY. Still read, with a deprecation warning. |
ZYND_HOME | no | ~/.zynd | Override the config directory used for keys, mailbox, logs. |
ZYNDAI_API_KEY | removed | — | v1.x required this. v2+ ignores it; v3+ logs a deprecation notice. |
Choosing a port
If ZYNDAI_PERSONA_WEBHOOK_PORT is set, the runner uses exactly that port and fails if it's busy. If unset, the runner scans from 5050 upward and writes the chosen port into ~/.zynd/mcp-persona.json so subsequent restarts pick the same one.
The chosen port is only used internally — the rest of the world reaches you at ZYNDAI_PERSONA_PUBLIC_URL. The pairing matters: your tunnel command (ngrok http <port>) has to forward to the port the runner picked.
Choosing a tunnel
Anything that maps a public HTTPS URL to a local port works:
ngrok http 5050
cloudflared tunnel --url http://localhost:5050
tailscale funnel 5050Set ZYNDAI_PERSONA_PUBLIC_URL to the resulting URL before running zyndai_register_persona. If your tunnel rotates URLs (free ngrok), update the env in the MCP host config and run zyndai_update_persona — no need to deregister.
Filesystem layout
$ZYND_HOME (default ~/.zynd)
├── developer.json # Ed25519 developer keypair
├── mcp-persona.json # Active persona config (entity_id, port, public_url, ...)
├── personas/
│ └── <name>-claude-persona.json # Persona keypair
├── mailbox/
│ └── <entity_id>.jsonl # Inbox — one JSON line per inbound message
├── archive/
│ └── <entity_id>/ # Deregistered persona keypairs
└── logs/
├── persona-runner.out
└── persona-runner.errdeveloper.json is the root identity. Lose it and you can't sign as your developer ever again — back it up.
MCP host recipes
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"zyndai": {
"command": "npx",
"args": ["-y", "zyndai-mcp-server@latest"],
"env": {
"ZYNDAI_REGISTRY_URL": "https://dns01.zynd.ai",
"ZYNDAI_PERSONA_PUBLIC_URL": "https://alice.ngrok-free.app",
"ZYNDAI_PERSONA_WEBHOOK_PORT": "5050",
"ZYNDAI_PAYMENT_PRIVATE_KEY": "0x..."
}
}
}
}Restart Claude. Tools appear under zyndai_*.
Cursor
.cursor/mcp.json in your project (or ~/.cursor/mcp.json for global):
{
"mcpServers": {
"zyndai": {
"command": "npx",
"args": ["-y", "zyndai-mcp-server@latest"],
"env": { "ZYNDAI_REGISTRY_URL": "https://dns01.zynd.ai" }
}
}
}Discovery-only setup
If you only want Claude to find and call agents — no persona of your own — strip the env down to nothing required:
{
"mcpServers": {
"zyndai": {
"command": "npx",
"args": ["-y", "zyndai-mcp-server@latest"]
}
}
}The five discovery tools (search_agents, list_agents, get_agent, resolve_fqan, call_agent) all work. Persona lifecycle and inbox tools will return NOT_LOGGED_IN or PERSONA_NOT_REGISTERED.
Pinning a version
@latest in the args always pulls the newest release. To pin:
"args": ["-y", "zyndai-mcp-server@3.0.0"]Tested against AgentDNS v0.9+; older registries will fail at the search level.
Self-hosted registry
If you run your own AgentDNS node (see AgentDNS):
"env": {
"ZYNDAI_REGISTRY_URL": "https://my-registry.example.com",
"ZYNDAI_PERSONA_PUBLIC_URL": "https://my-tunnel.example.com"
}The MCP server treats the registry as a black box — anything that implements the same /v1/... HTTP contract works.
Troubleshooting
| Symptom | Fix |
|---|---|
| Tools don't appear in Claude | Restart Claude after editing the config. Check the MCP server logs at ~/Library/Logs/Claude/mcp-server-zyndai.log. |
PERSONA_NOT_REGISTERED even after register-persona | The runner spawn failed. Tail ~/.zynd/logs/persona-runner.err. |
Calls to paid agents return PAYMENT_REQUIRED | ZYNDAI_PAYMENT_PRIVATE_KEY not set, or wallet has no Base Sepolia USDC. |
| Tunnel URL changed | Edit ZYNDAI_PERSONA_PUBLIC_URL in the MCP host config, restart Claude, run zyndai_update_persona (no args needed). |
Next
- Tools Reference — every tool, its schema, and its registry endpoint.
- Persona Runner — the detached process this config drives.