Plugin model & registry
How ClawQL packages become plugins, which MCP tools each plugin owns, and the living registry of shipped vs planned extensions.
main via node scripts/sync-clawql-plugin-docs.mjs (prebuild / dev). Package extraction ground truth: modularization implementation status.ClawQL plugin registry
Status: Living reference (June 2026)
Audience: Operators, contributors, third-party plugin authors
Companion: ClawQL plugin model (concepts and target architecture)
This page is the registry of ClawQL plugins: what exists today, what horizontal packages are becoming plugins, and how to enable or compose each one. For the full explanation of “becoming a plugin” vs package extraction, read the plugin model.
1. Plugin kinds
| Kind | Registers MCP tools? | Primary hook | Example |
|---|---|---|---|
default | Yes (when composed) | onRegister, onTeardown | clawql-memory (planned) |
mcp-proxy | No | beforeCallTool | panguard-mcp-proxy (shipped) |
Not plugins: search, execute, cache, and audit are gateway core — always composed in clawql-api, not optional plugin Layers.
2. Registry (all plugins)
| Plugin ID | Package / location | Kind | Registration | MCP tools | Enable / compose | Notes |
|---|---|---|---|---|---|---|
panguard-mcp-proxy | clawql-api (PanguardProxyPlugin) | mcp-proxy | ✅ Shipped — createClawQLApi() default | (none) | Default on; CLAWQL_PANGUARD_PROXY_PLUGIN=0 to omit. Active policy: CLAWQL_PANGUARD_IN_PROCESS=1 | beforeCallTool chokepoint (#272) |
clawql-memory | packages/clawql-memory | default | 📋 Logic shipped; tools still in src/tools.ts | memory_ingest, memory_recall | Default on; CLAWQL_ENABLE_MEMORY=0 to hide | Vault + optional memory.db; future onIngestHook / onRecallFilter for verticals |
clawql-documents | packages/clawql-documents | default | 📋 Scaffold shipped; tools in src/tools.ts | ingest_external_knowledge | Default on; CLAWQL_ENABLE_DOCUMENTS=0 to hide | Bulk Markdown + URL ingest; full Tika/Gotenberg pipeline planned |
clawql-automation | packages/clawql-automation | default | 📋 Scaffold shipped; tools in src/tools.ts | schedule, notify | CLAWQL_ENABLE_SCHEDULE=1, CLAWQL_ENABLE_NOTIFY=1 | Schedule worker + Slack notify via execute |
clawql-documents-onyx | src/ (Onyx bridge) | default | 📋 Tool in tools.ts; not a separate package yet | knowledge_search_onyx | Documents on + CLAWQL_ENABLE_ONYX=1 | Will fold into DocumentsPlugin |
clawql-sandbox | src/sandbox-* (planned package) | default | 📋 Planned extraction | sandbox_exec | CLAWQL_ENABLE_SANDBOX=1 | Seatbelt / Docker / Cloudflare bridge |
clawql-ouroboros | clawql-ouroboros npm package | default | 📋 Planned plugin Layer | ouroboros_create_seed_from_document, ouroboros_run_evolutionary_loop, ouroboros_get_lineage_status | CLAWQL_ENABLE_OUROBOROS=1 | Effect rewrite + thin MCP glue planned |
clawql-hitl-label-studio | src/ | default | 📋 Planned | hitl_enqueue_label_studio | CLAWQL_ENABLE_HITL_LABEL_STUDIO=1 | May move to clawql-automation or standalone |
| Vertical plugins | verticals/clawql-* (planned) | default | 📋 Not started | Domain-specific | Operator ClawQLInstance CRD / tier flags | e.g. lending, legal-us — see Verticals guide |
| Third-party | clawql-*-plugin npm (roadmap) | default | 📋 No public API yet | Author-defined | Operator Layer list or env | Depends on clawql-core + clawql-api only |
Legend: ✅ Shipped · 📋 Planned or partial (logic may exist; Plugin.onRegister not wired)
3. MCP tools by owning plugin (target)
When plugin registration lands, each tool will be registered only if its plugin is composed.
| MCP tool(s) | Owning plugin (target) | Package today | Site reference |
|---|---|---|---|
search, execute | Gateway core | clawql-api + src/ shims | MCP tools |
cache, audit | Gateway core | src/ | MCP tools |
memory_ingest, memory_recall | clawql-memory | clawql-memory | Vault memory |
ingest_external_knowledge | clawql-documents | clawql-documents | external-ingest.md |
knowledge_search_onyx | clawql-documents (Onyx) | src/ | Onyx knowledge |
schedule | clawql-automation | clawql-automation | Schedule |
notify | clawql-automation | clawql-automation | Notify |
sandbox_exec | clawql-sandbox | src/ | Sandbox exec |
ouroboros_* | clawql-ouroboros | clawql-ouroboros | Ouroboros |
hitl_enqueue_label_studio | TBD | src/ | HITL |
4. Composition at startup (target)
createClawQLApi({
plugins: [
createPanguardProxyPlugin(), // mcp-proxy — always unless disabled
MemoryPlugin, // when memory tier enabled
DocumentsPlugin, // when documents tier enabled
AutomationPlugin, // when schedule/notify enabled
// LendingPlugin, AcmeWidgetsPlugin, …
],
})
Today only PanguardProxyPlugin is passed through createClawQLApi(\{ plugins \}). Horizontal packages are imported by src/tools.ts directly.
5. Third-party plugin checklist (roadmap)
When the public registration API stabilizes:
- Publish
clawql-yourname-featuredepending onclawql-core+clawql-api(notclawql-mcptransport). - Export a
Pluginfactory and (eventually) an EffectLayer. - Implement
onRegisterto register MCP tools and declarerequiredSpecs. - Document the Operator toggle or
CLAWQL_ENABLE_*flag. - Add a row to this registry via PR (or published manifest in a later phase).
Until then, contribute in-repo via providers/ and MCP tools in the monorepo.
6. References
| Doc | Use when |
|---|---|
| ClawQL plugin model | Concepts, today vs target, request flow |
| Modularization implementation status | Package extraction phases, shims |
| Contributor Technical Specification §1.1 | Full Plugin field semantics |
| MCP tools matrix | Tool parameters and env gates |
| #306 | Package delivery epic |
ClawQL plugin model — horizontal packages and MCP tools
Status: Partially shipped (June 2026)
Audience: Contributors, integrators, and third-party plugin authors
Related: Modularization implementation status · Effect + plugin plan · Plugin registry · Contributor Technical Specification §1.1
This document explains what it means for clawql-memory, clawql-documents, and clawql-automation to become plugins, how that differs from today’s layout, and how third-party plugins will work.
1. One-sentence summary
A plugin is how a package tells clawql-api: “When I’m enabled, register my MCP tools, wire my background workers, declare my provider dependencies, and participate in gateway hooks — and when I’m disabled, leave zero footprint.”
For memory, documents, and automation, yes — the plugin’s main visible job is registering the respective MCP tools (memory_ingest, memory_recall, ingest_external_knowledge, schedule, notify). Plugins also own lifecycle and optional pipeline hooks, not just tool names.
2. Today: packages exist, tools.ts still owns registration
Extraction phases 1–9 moved business logic into workspace packages. MCP registration did not move with it.
| Package | Logic lives in | MCP tools still registered in |
|---|---|---|
clawql-memory | runMemoryIngest, runMemoryRecall, vault, memory.db, … | src/tools.ts (if (enableMemory) \{ server.tool("memory_ingest", …) \}) |
clawql-documents | runIngestExternalKnowledge, URL formatting | src/tools.ts (ingest_external_knowledge) |
clawql-automation | schedule worker, runNotifySlack | src/tools.ts + src/clawql-schedule.ts shim (schedule, notify) |
Transport-only concerns stay in src/ today:
- Zod schemas at
server.tool(...)registration time wrapMcpToolHandler(OpenTelemetry)logMcpToolShape(payload shape logging, no secrets)CLAWQL_ENABLE_*gates inregisterTools()
So the split is intentionally incomplete: packages are libraries; tools.ts is still the switchboard that decides which tools exist.
3. Target: each horizontal package ships a Plugin
At gateway startup, composition looks like:
createClawQLApi({
plugins: [
PanguardProxyPlugin, // kind: mcp-proxy — policy chokepoint, no new tools
MemoryPlugin, // registers memory_* tools when enabled
DocumentsPlugin, // registers ingest_external_knowledge when enabled
AutomationPlugin, // registers schedule + notify; starts schedule worker
// future: LendingPlugin, YourCompanyPlugin, …
],
})
When CLAWQL_ENABLE_MEMORY=0 (or the Operator CRD omits the memory Layer), MemoryPlugin is not composed → listTools has no memory_ingest / memory_recall, and heavy vault/sql.js paths are not loaded for that process tier.
3.1 MCP tools each horizontal plugin will register
| Plugin (planned) | MCP tools | Notes |
|---|---|---|
| MemoryPlugin | memory_ingest, memory_recall | Vault writes, memory.db sync, optional vectors |
| DocumentsPlugin | ingest_external_knowledge | Today’s bulk Markdown + URL ingest; future document-pipeline tools (Tika, etc.) would register here too |
| AutomationPlugin | schedule, notify | Schedule worker starts in onRegister or Layer scope; notify uses execute path for Slack chat_postMessage |
Core tools search, execute, cache, and audit stay in the gateway / core tier — not owned by these horizontal plugins.
3.2 Conceptual onRegister (not shipped yet)
The contributor spec defines the target contract: onRegister receives ClawQLApi and registers tools via Effect. A simplified illustration:
const MemoryPlugin: Plugin = {
id: 'clawql-memory',
version: '1.0.0',
onRegister: (api) =>
Effect.gen(function* () {
yield* api.registerMcpTool(
'memory_ingest',
memoryIngestSchema,
handleMemoryIngest,
)
yield* api.registerMcpTool(
'memory_recall',
memoryRecallSchema,
handleMemoryRecall,
)
}),
onTeardown: (api) =>
Effect.gen(function* () {
// Close pools, flush workers if any
}),
}
Handlers call into clawql-memory (runMemoryIngest, etc.). Transport wrappers (logMcpToolShape) may remain in a thin MCP adapter or move behind a small registration helper on ClawQLApi — that detail is implementation, not the model.
4. Plugins are more than tool registration
Tool registration is what most integrators see. The full plugin contract (see Contributor Technical Specification §1.1) also includes:
| Capability | Purpose | Example |
|---|---|---|
onRegister | Register MCP tools, internal ops, hooks | MemoryPlugin adds memory_* tools |
onTeardown | Graceful shutdown | AutomationPlugin stops schedule worker, closes sql.js DB |
requiredSpecs / recommendedSpecs | Startup validation | AutomationPlugin notify may require Slack in loaded spec |
onIngestHook | Transform/filter nodes entering Memory 2.0 | Vertical enriches or rejects ingest payloads |
onRecallFilter | Tighten recall beyond ATR | Ethical wall, patient partition |
beforeCallTool (mcp-proxy kind) | Run before any MCP tool | Panguard today — no new tools |
4.1 Panguard: plugin without tools
PanguardProxyPlugin is already shipped. It does not register MCP tools. It implements beforeCallTool so policy/ATR runs on every tool invocation. Same Plugin interface, different role — shows that “plugin” ≠ “adds tools” only.
5. Shipped vs target (honest matrix)
| Item | Shipped today | Target |
|---|---|---|
Plugin interface | Minimal (id, version, onRegister, onTeardown, beforeCallTool) in clawql-core | Full contract in contributor spec (onIngestHook, requiredSpecs, …) |
PluginRegistry + createClawQLApi() | ✅ | ✅ |
| Memory / documents / automation as plugins | ❌ Logic in packages; tools in tools.ts | MemoryPlugin, DocumentsPlugin, AutomationPlugin |
| Third-party npm plugins | ❌ No public registration API | Publish clawql-*-plugin; compose via Operator / env |
Effect Layer per horizontal package | ❌ Domain code mostly async | MemoryLayer, DocumentsLayer, AutomationLayer composed at bootstrap |
6. What extraction already did vs what “becoming plugins” finishes
| Done (package extraction) | Remaining (plugin work) |
|---|---|
runMemoryIngest, runMemoryRecall, vault, memory.db in clawql-memory | Move server.tool("memory_ingest", …) blocks from tools.ts into MemoryPlugin.onRegister |
runIngestExternalKnowledge in clawql-documents | Same for ingest_external_knowledge |
Schedule + notify in clawql-automation; configureNotifyDeps from tools.ts | Fold notify wiring into AutomationLayer; register schedule / notify in plugin |
Thin MCP shims + logMcpToolShape in src/ | Keep transport-only concerns in MCP package or registerMcpTool helper |
Becoming plugins does not mean moving more files — it means owning MCP surface area and lifecycle when enabled, instead of centralizing registration in tools.ts.
7. Third-party and vertical plugins
The same model extends to verticals (clawql-lending, clawql-legal, …) and community extensions:
- Publish an npm package (e.g.
clawql-acme-widgets) depending onclawql-core+clawql-api— not onclawql-mcptransport internals. - Export a
Plugin(and eventually an EffectLayer). - Implement
onRegisterto register your MCP tools and declarerequiredSpecsif you need Postgres, Onyx, etc. - Document the Operator toggle or
CLAWQL_ENABLE_*flag that includes or omits your Layer.
Until Layer composition is stable, in-repo extensions should continue via bundled providers (providers/) and MCP tools in the monorepo. Third-party registration without forking tools.ts is explicitly roadmap, not current API.
8. Request flow (target)
Agent (stdio / HTTP / gRPC)
│
▼
MCP transport (src/server*.ts, thin tools adapter)
│
▼
createClawQLApi({ plugins: [...] })
│
├── Core: search / execute / cache / audit (always on)
│
├── PanguardProxyPlugin.beforeCallTool (every tool)
│
└── If MemoryPlugin composed:
memory_ingest / memory_recall → clawql-memory
If DocumentsPlugin composed:
ingest_external_knowledge → clawql-documents
If AutomationPlugin composed:
schedule / notify → clawql-automation
9. References
| Doc | Use when |
|---|---|
| Plugin registry | Shipped vs planned plugins, enable flags |
| Modularization implementation status | Package layout, shims, extraction PRs |
| Effect + plugin plan | Effect Layers, plugin checklist, CI |
| Contributor Technical Specification §1.1 | Full Plugin field semantics |
| MCP tools matrix | Operator-facing tool list and env flags |
| #306 | Package delivery epic |
