Skip to main content

Plugin Entry Points

Every plugin exports a default entry object. The SDK provides three helpers for creating them.
Looking for a walkthrough? See Channel Plugins or Provider Plugins for step-by-step guides.

definePluginEntry

Import: openclaw/plugin-sdk/plugin-entry For provider plugins, tool plugins, hook plugins, and anything that is not a messaging channel.
  • id must match your openclaw.plugin.json manifest.
  • kind is for exclusive slots: "memory" or "context-engine".
  • configSchema can be a function for lazy evaluation.

defineChannelPluginEntry

Import: openclaw/plugin-sdk/core Wraps definePluginEntry with channel-specific wiring. Automatically calls api.registerChannel({ plugin }) and gates registerFull on registration mode.
  • setRuntime is called during registration so you can store the runtime reference (typically via createPluginRuntimeStore).
  • registerFull only runs when api.registrationMode === "full". It is skipped during setup-only loading.

defineSetupPluginEntry

Import: openclaw/plugin-sdk/core For the lightweight setup-entry.ts file. Returns just { plugin } with no runtime or CLI wiring.
OpenClaw loads this instead of the full entry when a channel is disabled, unconfigured, or when deferred loading is enabled. See Setup and Config for when this matters.

Registration mode

api.registrationMode tells your plugin how it was loaded: defineChannelPluginEntry handles this split automatically. If you use definePluginEntry directly for a channel, check mode yourself:

Plugin shapes

OpenClaw classifies loaded plugins by their registration behavior: Use openclaw plugins inspect <id> to see a plugin’s shape.