Plugins
Register and manage skill plugins — /plugins, /plugins/sync, /plugins/{plugin_id}.
Plugins register skill bundles with the gateway so the MoE engine can discover them. A client syncs its local workspace and global plugin directories up to the gateway; the gateway keeps the registry.
Base URL: https://api.misar.io/coder. All three endpoints authenticate with Authorization: Bearer <API_KEY>.
List plugins
/pluginsRegistered plugins, newest first, capped at 200.
Query parameters
statusstringqueryFilter by plugin status. An unrecognised value simply yields an empty list rather than an error.
Response fields
pluginsobject[]Plugin manifests — see the field list below.
countnumberNumber of plugins returned.
curl https://api.misar.io/coder/plugins \
-H "Authorization: Bearer $MISARCODER_API_KEY"{
"plugins": [
{
"id": "pl_01J8…",
"plugin_id": "misar.workspace.deploy-helper",
"name": "deploy-helper",
"version": "1.2.0",
"description": "Deployment skills for the acme stack",
"type": "skill",
"capabilities": ["skills:4"],
"endpoints": [],
"auth": "none",
"signature": "",
"status": "active",
"security_score": 0.92,
"registered_at": "2026-07-30T10:11:00.000Z",
"updated_at": "2026-08-01T08:02:14.000Z",
"invocations": 41,
"successes": 40,
"total_latency": 12.482,
"meta": { "source": "workspace", "skill_count": 4 }
}
],
"count": 1
}Manifest fields
idstringInternal registry id, prefixed pl_. Use this to delete.
plugin_idstringSemantic id, formed as misar.<source>.<name>.
namestringPlugin name.
versionstringPlugin version. Deduplication is on plugin_id plus version.
descriptionstringTruncated to 300 characters.
typestringPlugin type. Synced plugins are registered as skill.
capabilitiesstring[]Declared capabilities, e.g. skills:4.
statusstringLifecycle state — active or disabled.
security_scorenumberRounded to three decimal places.
invocationsnumberTimes the plugin was called.
successesnumberSuccessful invocations.
total_latencynumberCumulative latency in seconds, rounded to three decimal places.
metaobjectFree-form metadata, e.g. { source, skill_count }.
Sync plugins
/plugins/syncRegisters a batch of plugins discovered on the client and returns the full registry afterwards.
Request body
pluginsobject[]bodyrequiredPlugin entries to register.
plugins[].namestringbodyrequiredPlugin name.
plugins[].versionstringbodydefault: 0.0.0Plugin version.
plugins[].descriptionstringbodyShort description.
plugins[].sourcestringbodydefault: workspaceworkspace or global. Becomes part of the semantic plugin_id.
plugins[].skillCountnumberbodydefault: 0How many skills the plugin bundles.
Response fields
syncednumberHow many entries registered successfully.
pluginsobject[]The registry after the sync, capped at 200.
countnumberLength of plugins.
curl -X POST https://api.misar.io/coder/plugins/sync \
-H "Authorization: Bearer $MISARCODER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"plugins": [
{
"name": "deploy-helper",
"version": "1.2.0",
"description": "Deployment skills for the acme stack",
"source": "workspace",
"skillCount": 4
}
]
}'{ "synced": 1, "plugins": [], "count": 0 }Sync is idempotent per version
Re-syncing the same plugin_id and version returns the existing registration rather than creating a duplicate. Bump the version to register a change.
Disable a plugin
/plugins/{plugin_id}This disables, it does not delete
The plugin's status is set to disabled and the record is retained. A removed: true response means "the plugin is now disabled", and disabling an already-disabled plugin also returns true.
Path parameters
plugin_idstringpathrequiredEither the internal pl_… id or the semantic misar.<source>.<name> id. Slashes are permitted.
Response fields
removedbooleantrue when the plugin is disabled.
idstringEcho of the id you supplied, not the internal one.
curl -X DELETE https://api.misar.io/coder/plugins/misar.workspace.deploy-helper \
-H "Authorization: Bearer $MISARCODER_API_KEY"{ "removed": true, "id": "misar.workspace.deploy-helper" }Status codes
| Code | Meaning |
|---|---|
200 | Listed, synced, or disabled |
401 | Missing authorization or Invalid API key |
404 | Plugin '<id>' not found |
422 | Body failed validation |
Limits
| Limit | Value |
|---|---|
| Plugins returned by list and sync | 200 |
| Entries per sync request | Unbounded |
| Description length stored | 300 characters |