Skip to main content
ReferencePartially shippedJune 2026

Plugin model & registry

How ClawQL packages become plugins, which MCP tools each plugin owns, and the living registry of shipped vs planned extensions.

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

KindRegisters MCP tools?Primary hookExample
defaultYes (when composed)onRegister, onTeardownclawql-memory (planned)
mcp-proxyNobeforeCallToolpanguard-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 IDPackage / locationKindRegistrationMCP toolsEnable / composeNotes
panguard-mcp-proxyclawql-api (PanguardProxyPlugin)mcp-proxy✅ Shipped — createClawQLApi() default(none)Default on; CLAWQL_PANGUARD_PROXY_PLUGIN=0 to omit. Active policy: CLAWQL_PANGUARD_IN_PROCESS=1beforeCallTool chokepoint (#272)
clawql-memorypackages/clawql-memorydefault📋 Logic shipped; tools still in src/tools.tsmemory_ingest, memory_recallDefault on; CLAWQL_ENABLE_MEMORY=0 to hideVault + optional memory.db; future onIngestHook / onRecallFilter for verticals
clawql-documentspackages/clawql-documentsdefault📋 Scaffold shipped; tools in src/tools.tsingest_external_knowledgeDefault on; CLAWQL_ENABLE_DOCUMENTS=0 to hideBulk Markdown + URL ingest; full Tika/Gotenberg pipeline planned
clawql-automationpackages/clawql-automationdefault📋 Scaffold shipped; tools in src/tools.tsschedule, notifyCLAWQL_ENABLE_SCHEDULE=1, CLAWQL_ENABLE_NOTIFY=1Schedule worker + Slack notify via execute
clawql-documents-onyxsrc/ (Onyx bridge)default📋 Tool in tools.ts; not a separate package yetknowledge_search_onyxDocuments on + CLAWQL_ENABLE_ONYX=1Will fold into DocumentsPlugin
clawql-sandboxsrc/sandbox-* (planned package)default📋 Planned extractionsandbox_execCLAWQL_ENABLE_SANDBOX=1Seatbelt / Docker / Cloudflare bridge
clawql-ouroborosclawql-ouroboros npm packagedefault📋 Planned plugin Layerouroboros_create_seed_from_document, ouroboros_run_evolutionary_loop, ouroboros_get_lineage_statusCLAWQL_ENABLE_OUROBOROS=1Effect rewrite + thin MCP glue planned
clawql-hitl-label-studiosrc/default📋 Plannedhitl_enqueue_label_studioCLAWQL_ENABLE_HITL_LABEL_STUDIO=1May move to clawql-automation or standalone
Vertical pluginsverticals/clawql-* (planned)default📋 Not startedDomain-specificOperator ClawQLInstance CRD / tier flagse.g. lending, legal-us — see Verticals guide
Third-partyclawql-*-plugin npm (roadmap)default📋 No public API yetAuthor-definedOperator Layer list or envDepends 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 todaySite reference
search, executeGateway coreclawql-api + src/ shimsMCP tools
cache, auditGateway coresrc/MCP tools
memory_ingest, memory_recallclawql-memoryclawql-memoryVault memory
ingest_external_knowledgeclawql-documentsclawql-documentsexternal-ingest.md
knowledge_search_onyxclawql-documents (Onyx)src/Onyx knowledge
scheduleclawql-automationclawql-automationSchedule
notifyclawql-automationclawql-automationNotify
sandbox_execclawql-sandboxsrc/Sandbox exec
ouroboros_*clawql-ouroborosclawql-ouroborosOuroboros
hitl_enqueue_label_studioTBDsrc/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:

  1. Publish clawql-yourname-feature depending on clawql-core + clawql-api (not clawql-mcp transport).
  2. Export a Plugin factory and (eventually) an Effect Layer.
  3. Implement onRegister to register MCP tools and declare requiredSpecs.
  4. Document the Operator toggle or CLAWQL_ENABLE_* flag.
  5. 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

DocUse when
ClawQL plugin modelConcepts, today vs target, request flow
Modularization implementation statusPackage extraction phases, shims
Contributor Technical Specification §1.1Full Plugin field semantics
MCP tools matrixTool parameters and env gates
#306Package 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.

PackageLogic lives inMCP tools still registered in
clawql-memoryrunMemoryIngest, runMemoryRecall, vault, memory.db, …src/tools.ts (if (enableMemory) \{ server.tool("memory_ingest", …) \})
clawql-documentsrunIngestExternalKnowledge, URL formattingsrc/tools.ts (ingest_external_knowledge)
clawql-automationschedule worker, runNotifySlacksrc/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 in registerTools()

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 composedlistTools 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 toolsNotes
MemoryPluginmemory_ingest, memory_recallVault writes, memory.db sync, optional vectors
DocumentsPluginingest_external_knowledgeToday’s bulk Markdown + URL ingest; future document-pipeline tools (Tika, etc.) would register here too
AutomationPluginschedule, notifySchedule 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:

CapabilityPurposeExample
onRegisterRegister MCP tools, internal ops, hooksMemoryPlugin adds memory_* tools
onTeardownGraceful shutdownAutomationPlugin stops schedule worker, closes sql.js DB
requiredSpecs / recommendedSpecsStartup validationAutomationPlugin notify may require Slack in loaded spec
onIngestHookTransform/filter nodes entering Memory 2.0Vertical enriches or rejects ingest payloads
onRecallFilterTighten recall beyond ATREthical wall, patient partition
beforeCallTool (mcp-proxy kind)Run before any MCP toolPanguard 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)

ItemShipped todayTarget
Plugin interfaceMinimal (id, version, onRegister, onTeardown, beforeCallTool) in clawql-coreFull contract in contributor spec (onIngestHook, requiredSpecs, …)
PluginRegistry + createClawQLApi()
Memory / documents / automation as plugins❌ Logic in packages; tools in tools.tsMemoryPlugin, DocumentsPlugin, AutomationPlugin
Third-party npm plugins❌ No public registration APIPublish clawql-*-plugin; compose via Operator / env
Effect Layer per horizontal package❌ Domain code mostly asyncMemoryLayer, 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-memoryMove server.tool("memory_ingest", …) blocks from tools.ts into MemoryPlugin.onRegister
runIngestExternalKnowledge in clawql-documentsSame for ingest_external_knowledge
Schedule + notify in clawql-automation; configureNotifyDeps from tools.tsFold 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:

  1. Publish an npm package (e.g. clawql-acme-widgets) depending on clawql-core + clawql-apinot on clawql-mcp transport internals.
  2. Export a Plugin (and eventually an Effect Layer).
  3. Implement onRegister to register your MCP tools and declare requiredSpecs if you need Postgres, Onyx, etc.
  4. 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

DocUse when
Plugin registryShipped vs planned plugins, enable flags
Modularization implementation statusPackage layout, shims, extraction PRs
Effect + plugin planEffect Layers, plugin checklist, CI
Contributor Technical Specification §1.1Full Plugin field semantics
MCP tools matrixOperator-facing tool list and env flags
#306Package delivery epic