Skip to main content
An integration is a single call to defineIntegration() that declares everything your package does. The function validates at import time and returns a deep-frozen definition.

Basic structure

Required fields

Only four are strictly required:
  • slug — kebab-case identifier, used as the route segment and MCP namespace
  • name — display name for the marketplace and dashboard
  • description — one-line summary (the marketplace’s generic card uses it when you ship no tile)
  • version — semver, used by the platform to diff definitions on promotion
Everything else is optional. An integration with only a marketplace tile and no tools is valid. An integration with only tools and no widgets is valid.

Export name

The export must be named integration. Two things import it by that name:
  1. The host’s build process, when your package is added to the platform
  2. ekanos.json, the small project file the CLI keeps at your root

Schema is strict

Every key is validated, and unrecognized keys are rejected. You cannot declare fields the platform assigns at runtime:
  • productId, kind, trust tier, credentialModel, per-tool effect/sensitivity — the closest you get is the proposes block
  • Widget fields productId, widgetConfigId, workspaceId, collapsed, isPinned, health, integrationMetadata — these are set by the host
An extra key is a hard error, not silently ignored. This prevents accidents where you thought you declared something but actually didn’t.

Type the storage

Pass your storage schema as a generic to lock in the types:

Validation timing

Validation happens at import time, and the host re-parses the same object against the same schema when it registers you:
You get feedback as soon as the module loads, without a separate CLI step.

Next steps