Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Wire a compiled rote pipeline up as an MCP tool so Claude can trigger the deployed workflow directly. Use when the user says "register my compiled pipeline", "serve my pipelines over MCP", "trigger the workflow from Claude", "hook the pipeline up to Claude", or asks what to do after `rote compile` and deployment. Covers `rote register` and `rote serve` plus the `claude mcp add` wiring.
.claude/skills/ccplugins-serve/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -20% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -12% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -15% | 0% |
| case-04 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -39% | 0% |
rote serve is one MCP server exposing every registered pipeline as a callable tool. The flow:
rote compile → deploy the runtime → rote register → rote serve → call from Clauderote serve triggers deployed workflows; it does not host them. MCP triggering supports the dbos (default), temporal, and cloudflare runtimes.
The CLI ships on PyPI as rote-cli with an executable named rote, so every invocation is uvx --from rote-cli rote <args> (never uvx rote-cli ...). For unreleased features, substitute the source: uvx --from git+https://github.com/trevhud/rote rote <args>.
compiled/pipeline.yaml).(python main.py --serve or dbos start) against the system database you'll register — enqueued runs sit in status enqueued until that process exists; for Temporal, a worker against the user's cluster; for Cloudflare, wrangler deploy done. If not, stop and help with that first.
sh# DBOS (the default). System DB URL: --system-database-url, else # $DBOS_SYSTEM_DATABASE_URL, else the emitted app's SQLite file # (derived from <out-dir>/runtime/dbos/main.py). uvx --from rote-cli rote register <out-dir> # Temporal (defaults: localhost:7233, namespace "default", # task queue = pipeline.name, workflow type = the emitted versioned name) uvx --from rote-cli rote register <out-dir> --runtime temporal # Cloudflare uvx --from rote-cli rote register <out-dir> --runtime cloudflare \ --url https://<worker>.workers.dev
This upserts ~/.rote/registry.json. Re-registering updates in place. After re-compiling a changed skill, register again — the DBOS and Temporal workflow names are derived from the pipeline content hash and must stay in sync with the emitted code.
rote serve needs the serve extra (FastMCP) plus dbos when any registered pipeline runs on DBOS, so the spec includes both:
shclaude mcp add --scope user rote -- uvx --from 'rote-cli[serve,dbos]' rote serve
For unreleased features, use the GitHub source instead:
shclaude mcp add --scope user rote -- \ uvx --from 'rote-cli[serve,dbos] @ git+https://github.com/trevhud/rote' rote serve
Verify with claude mcp list. Each registry entry becomes two tools (three for DBOS): <name> (starts a run, returns {workflow_id, status: "started"} immediately — compiled pipelines run minutes to days), <name>_status (polls a run by workflow_id), and for DBOS <name>_signal (resumes a run parked at a HITL gate: workflow_id + gate signal name + resume payload — so Claude can deliver approvals itself). A DBOS run whose status stays enqueued means the emitted app process isn't running against the registered system database.
A running rote serve picks up registry changes live — no restart of the server, ever. But clients differ:
list_changed notification: newly registered pipelines appear immediately.
pipeline registered while they're connected appears only after a reconnect — restart Desktop or toggle the server off/on; on claude.ai, re-enable the connector.
Tell the user this proactively if they plan to use Desktop or claude.ai.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 20,442 | 8,684 | -58% | 1 | 1 | 0% | 3,113 | 2,488 | -20% | 0 | 0 | — |
case-02 | fail→pass | 14,790 | 6,975 | -53% | 1 | 1 | 0% | 2,419 | 2,128 | -12% | 0 | 0 | — |
case-03 | fail→pass | 15,155 | 6,345 | -58% | 1 | 1 | 0% | 2,256 | 1,928 | -15% | 0 | 0 | — |
case-04 | fail→pass | 13,355 | 4,429 | -67% | 1 | 1 | 0% | 1,901 | 1,663 | -13% | 0 | 0 | — |
case-05 | pass→pass | 13,849 | 13,230 | -4% | 1 | 1 | 0% | 2,360 | 2,871 | +22% | 0 | 0 | — |
case-06 | pass→pass | 21,443 | 9,680 | -55% | 1 | 1 | 0% | 2,258 | 2,743 | +21% | 0 | 0 | — |
case-07 | pass→pass | 10,104 | 7,373 | -27% | 1 | 1 | 0% | 1,538 | 2,130 | +38% | 0 | 0 | — |
case-08 | fail→pass | 16,369 | 3,431 | -79% | 1 | 1 | 0% | 2,493 | 1,513 | -39% | 0 | 0 | — |
case-09 | fail→pass | 9,135 | 3,604 | -61% | 1 | 1 | 0% | 1,669 | 1,456 | -13% | 0 | 0 | — |
case-10 | fail→pass | 22,365 | 4,441 | -80% | 1 | 1 | 0% | 3,346 | 1,571 | -53% | 0 | 0 | — |
case-11 | fail→pass | 10,114 | 4,793 | -53% | 1 | 1 | 0% | 1,757 | 1,738 | -1% | 0 | 0 | — |
case-12 | fail→pass | 11,297 | 5,085 | -55% | 1 | 1 | 0% | 1,569 | 1,598 | +2% | 0 | 0 | — |
case-13 | fail→pass | 15,841 | 2,439 | -85% | 1 | 1 | 0% | 2,313 | 1,282 | -45% | 0 | 0 | — |
case-14 | pass→pass | 12,520 | 5,455 | -56% | 1 | 1 | 0% | 2,064 | 1,461 | -29% | 0 | 0 | — |
case-15 | fail→pass | 14,151 | 7,788 | -45% | 1 | 1 | 0% | 2,083 | 1,866 | -10% | 0 | 0 | — |
case-16 | fail→pass | 11,925 | 2,900 | -76% | 1 | 1 | 0% | 1,938 | 1,314 | -32% | 0 | 0 | — |
case-17 | fail→pass | 30,056 | 3,625 | -88% | 1 | 1 | 0% | 5,345 | 1,432 | -73% | 0 | 0 | — |
case-18 | pass→pass | 6,050 | 2,381 | -61% | 1 | 1 | 0% | 847 | 1,210 | +43% | 0 | 0 | — |
case-19 | fail→pass | 17,625 | 2,801 | -84% | 1 | 1 | 0% | 3,072 | 1,353 | -56% | 0 | 0 | — |
case-20 | fail→pass | 16,869 | 1,960 | -88% | 1 | 1 | 0% | 2,545 | 1,150 | -55% | 0 | 0 | — |
case-21 | pass→pass | 4,623 | 2,255 | -51% | 1 | 1 | 0% | 487 | 1,141 | +134% | 0 | 0 | — |
case-22 | fail→pass | 49,003 | 2,605 | -95% | 1 | 1 | 0% | 8,506 | 1,307 | -85% | 0 | 0 | — |
case-23 | fail→pass | 10,660 | 5,472 | -49% | 1 | 1 | 0% | 1,593 | 1,717 | +8% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +74 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.