Skip to main content
Every field has specific naming rules enforced at defineIntegration() import time. This is the complete reference.

Slug

The kebab-case identifier for your integration. Used as:
  • Route segment (/api/integrations/<slug>)
  • MCP namespace prefix
  • Widget ID prefix
  • Project identifier
Must be globally unique — validateIntegrationDefinitions() rejects a duplicate slug, and a slug a first-party integration uses.

Widget IDs

Globally unique within the entire Ekanos instance. Prefix with your slug to avoid collisions:

Tool names

Lowercase snake_case. The effective name the assistant sees is namespaced by slug:

Webhook and schedule IDs

Kebab-case. These are your names, not the vendor’s event names:
Duplicate ids within one definition are rejected. Collisions across definitions are caught by validateIntegrationDefinitions() at registration.

Storage keys

A key is "<dataType>" or "<dataType>/<subtype>", lowercase [a-z0-9_-], with at most one /. The data type (the part before /) must be one the scope allows: activation is readable but never writable or deletable through ctx.storage — the host owns activation rows. secret is reserved in both scopes; use ctx.secrets instead. A subtype is at most 100 characters.

Cron expressions

Standard 5 fields: minute hour day-of-month month day-of-week
Validation happens at import time.

Egress entries

HTTPS origin: scheme, host, optional port. No path, query, fragment, credentials.
Wildcards are a single leading *. only. They match subdomains at any depth, but never the apex — list the apex separately if you call it:
Scheme and port must match exactly; a wildcard never crosses either. Default ports are normalized, so https://api.example.com:443 and https://api.example.com are the same origin.

OAuth endpoints

Must be absolute HTTPS URLs and covered by your egress allowlist:

Semantic names

Use clear, descriptive names that tell the reviewer what you do:

Validation timing

Validation happens at import time, and the host re-validates against the same schema at registration:
The thrown message lists every issue by path:
Cron syntax and OAuth egress coverage are checked right after the schema parse, in a second pass with the same message shape.

Next steps