Skip to content

Configuration

Two JSON files, one env namespace. Every config the SDK and CLI care about lives in one of these places.

File locations

FileUsed byPurpose
<project>/agent.config.jsonzynd agent run, ZyndAIAgentPer-agent metadata, server, registry, pricing
<project>/service.config.jsonzynd service run, ZyndServicePer-service metadata
<project>/.envThe agent / service runtimeAPI keys, runtime overrides
~/.zynd/config.jsonThe CLIDefault registry URL
~/.zynd/developer.jsonThe CLI / SDKDeveloper Ed25519 keypair
~/.zynd/agents/<name>/keypair.jsonThe SDKAgent's HD-derived Ed25519 keypair
~/.zynd/services/<name>/keypair.jsonThe SDKService's HD-derived Ed25519 keypair
<project>/.well-known/agent-card.jsonThe SDK / clientsAuto-generated signed card; rebuilt on each run

agent.config.json

Fields generated by the scaffold and read by the SDK on zynd agent run.

FieldTypeDefaultDescription
namestringrequiredDisplay name; slug used in FQAN
descriptionstring""Short summary published in the card
versionstring"0.1.0"Semver
categorystring"general"Discovery category
tagsstring[][]Discovery tags
registry_urlstring"https://zns01.zynd.ai"The registry to register on
server_hoststring"0.0.0.0"Webhook bind host
server_portnumber5000Webhook port
auth_mode"permissive" | "strict""permissive"Inbound message signature policy
entity_indexnumberautoHD derivation index — auto-allocated by zynd agent init
skillsobject[]one defaultCapability blocks; each {id, name, description, tags, examples}
entity_urlstringfrom runtimeOverride the public URL written into the registry record
keypair_pathstringfrom ZYND_AGENT_KEYPAIR_PATHOverride the keypair location
entity_pricingobjectabsentx402 pricing block (see x402)
pricestringabsentConvenience alias for a per_request block (e.g. "$0.01")
fqanstringabsentPre-claimed FQAN if you have a handle
webhook_portnumberabsentLegacy alias for server_port — both work, prefer server_port

A complete fresh-scaffold config:

json
{
  "name": "my-agent",
  "description": "my-agent agent",
  "version": "0.1.0",
  "category": "general",
  "tags": [],
  "registry_url": "https://zns01.zynd.ai",
  "server_host": "0.0.0.0",
  "server_port": 5000,
  "auth_mode": "permissive",
  "entity_index": 190,
  "skills": [
    {
      "id": "default",
      "name": "my-agent",
      "description": "my-agent's primary capability — replace this with what your agent actually does.",
      "tags": [],
      "examples": []
    }
  ]
}

service.config.json

Same fields as agent.config.json plus two service-only fields:

FieldTypeDefaultDescription
service_endpointstringabsentOverride the public service endpoint advertised in the card if it differs from entity_url
openapi_urlstringabsentOptional OpenAPI URL for clients that introspect

.env (project root)

The scaffold writes a minimal .env. Add API keys for the LLM (or other tools) you use.

sh
ZYND_AGENT_KEYPAIR_PATH=/home/dillu/.zynd/agents/my-agent/keypair.json

OPENAI_API_KEY=sk-...
TAVILY_API_KEY=tvly-...

Don't commit .env

Add .env to .gitignore. The scaffold does this for you on TypeScript projects (which ship a .gitignore); on Python add the line yourself.

Environment variables

Anything the SDK or CLI reads from the environment.

Where Zynd reads from

VariableDefaultRead byPurpose
ZYND_HOME~/.zyndCLI / SDKOverride the config directory
ZYND_REGISTRY_URLhttps://zns01.zynd.aiCLI / SDKOverride the registry
ZYND_AGENT_KEYPAIR_PATH~/.zynd/agents/<name>/keypair.jsonSDKOverride the agent keypair location
ZYND_SERVICE_KEYPAIR_PATH~/.zynd/services/<name>/keypair.jsonSDKOverride the service keypair location
ZYND_ENTITY_URLbound host:portSDKOverride the public URL written into the registry record
ZYND_SERVER_PORTfrom configSDKOverride the webhook port
ZYND_PAYMENT_NETWORKbase-sepoliaSDKEVM network for x402 (base, base-sepolia, optimism, etc.)

What you provide

VariableWhen you set it
OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.The LLM your framework calls
TAVILY_API_KEYIf you use Tavily search as a tool
Provider-specific credentialsWhatever your tools need

~/.zynd/config.json

A small CLI-only file:

json
{
  "registry_url": "https://zns01.zynd.ai"
}

Used as the default --registry for every command. Override per-command with --registry <url>.

~/.zynd/developer.json

Created by zynd init or zynd auth login. Treat as a private key.

json
{
  "public_key": "<base64>",
  "private_key": "<base64>"
}

The CLI uses it to sign every developer-scoped action; the SDK derives agent keys from it.

~/.zynd/agents/<name>/keypair.json

Created by zynd agent init (or zynd keys derive). HD-derived from the developer key.

json
{
  "public_key": "<base64>",
  "private_key": "<base64>",
  "derived_from": {
    "developer_public_key": "ed25519:<base64>",
    "index": 190
  }
}

derived_from is what lets the SDK rebuild a developer_proof for POST /v1/entities.

~/.zynd/services/<name>/keypair.json

Same shape as the agent keypair, under the services namespace.

.well-known/agent-card.json

Auto-generated by zynd agent run (and zynd card build). Don't edit manually — edit agent.config.json and re-run.

json
{
  "_note": "Auto-generated by `zynd agent run` from agent.config.json. Do not edit manually — edit agent.config.json instead."
}

After a successful run the file fills with the signed card. See Agent Cards for the schema.

Precedence

When the SDK reads a setting, it picks the first that's defined:

  1. CLI flag (where applicable, e.g., --port, --registry).
  2. Environment variable (e.g., ZYND_SERVER_PORT, ZYND_REGISTRY_URL).
  3. agent.config.json / service.config.json.
  4. ~/.zynd/config.json (CLI only).
  5. Built-in default (e.g., 5000 for the port, https://zns01.zynd.ai for the registry).

See also

Released under the MIT License.