Skip to content

Plugin loads but registers zero tools on OpenClaw >=2026.6.11 — missing contracts.tools in openclaw.plugin.json #272

Description

@starpig1981

Problem

After installing @qverisai/qveris on OpenClaw >=2026.6.11, the plugin loads (status: loaded, enabled: true) but registers zero tools:

$ openclaw plugins inspect qveris --runtime --json | jq '.plugin | {status, toolNames}'
{
  "status": "loaded",
  "toolNames": []
}

diagnostics shows a single error:

{
  "level": "error",
  "pluginId": "qveris",
  "message": "plugin must declare contracts.tools before registering agent tools"
}

Root cause

OpenClaw 2026.6.11 switched to contract-driven tool registration: plugins must declare the tools they expose in the manifest (openclaw.plugin.json) under contracts.tools. Runtime calls to api.registerTool(..., { names: [...] }) are only allowed for names already listed in the manifest.

The plugin's runtime register call is correct (dist/index.js:8-9):

api.registerTool((ctx) => createQverisTools({ api, ctx }), {
  names: ["qveris_discover", "qveris_call", "qveris_inspect"]
});

…but openclaw.plugin.json (peer dependency already declares openclaw: ">=2026.6.11") only ships these top-level keys:

{ "id", "setup", "uiHints", "configSchema" }

There is no "contracts" section, so the Gateway refuses registration.

For comparison, the @openclaw/tavily-plugin manifest (which works fine on the same host) includes:

"contracts": {
  "webSearchProviders": ["tavily"],
  "tools": ["tavily_search", "tavily_extract"]
}

Reproduction

  1. Install: openclaw plugins install @qverisai/qveris
  2. Enable + restart gateway
  3. openclaw plugins inspect qveris --runtime --jsontoolNames: [], diagnostics reports the contract error above
  4. Same host, install @openclaw/tavily-plugin → works (toolNames: ["tavily_search", "tavily_extract"], diagnostics empty). The only manifest difference is the contracts block.

Suggested fix

Add to packages/openclaw-qveris-plugin/openclaw.plugin.json:

"contracts": {
  "tools": ["qveris_discover", "qveris_call", "qveris_inspect"]
}

(placement: between uiHints and configSchema, matching tavily's layout)

Verified workaround locally

I patched the installed manifest under ~/.openclaw/npm/projects/.../node_modules/@qverisai/qveris/openclaw.plugin.json with the block above, then openclaw plugins disable qveris && openclaw plugins enable qveris. Result:

toolNames: ["qveris_discover", "qveris_call", "qveris_inspect"]
diagnostics: []

Calling qveris_discover / qveris_call then works normally. So the only thing missing in 2026.7.15 is the manifest field — runtime code is already correct.

Happy to send this as a PR against packages/openclaw-qveris-plugin if useful; let me know the preferred branch.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions