Commit Graph

6 Commits

Author SHA1 Message Date
replicas-connector[bot] 5680754126 Add cargo-mcp, and correct the router on the hosted MCP server (#116)
mcp.getcargo.io/mcp is live and serves thirteen platform tools plus
whatever a workspace published with defineMcpServer. Nothing in the
bundle covered it, and cargo/SKILL.md asserted "There is no first-party
'Cargo MCP server'" - true when written, wrong now, and the one claim an
agent would act on.

- cargo-mcp/SKILL.md (1.0.0): connect, the discover to price to execute
  to poll spine, and the routing table for MCP tool vs cargo-ai.
- cargo/SKILL.md (1.22.0): the MCP section becomes a three-way
  disambiguation. Hosted server, workspace server served over stdio by
  cargo-ai mcp, and an MCP client attached to a Cargo agent are three
  things sharing a name and sharing no answers.
- evals/routing.jsonl: "How do I use Cargo from ChatGPT?" now expects
  cargo-mcp; three cases added for the new surface.
- Counts, catalogs, plugin manifests, SKILL_DIRS, llms.txt, metadata.

skills-lint, routing-eval, sync-trigger-slugs and the cargo-gtm script
fixtures all pass.

Co-authored-by: Cargo FSD <fsd@getcargo.io>
Co-authored-by: Auree Aubert <16732193+aureeaubert@users.noreply.github.com>
Co-authored-by: replicas-connector[bot] <replicas-connector[bot]@users.noreply.github.com>
2026-08-27 10:28:58 -07:00
Auree Aubert e61f67f105 New skill: cargo-mailbox-management, and Cargo sends now (#113)
`mailboxManagement` landed in the CLI (cargo#5493, plus warm-up stats in
cargo#5646) and nothing in the bundle covered it. It is the first domain
that makes Cargo own the inbox, so the gap was not one more capability
skill — it was a skill whose absence let an agent send mail with no idea
what it cost or what governed it.

- New `cargo-mailbox-management` (the fifteenth capability skill): six
  command groups, the send that is deliberately not in them, and four
  references — the ramp arithmetic and fleet sizing, the `sendEmail`
  action, response shapes, troubleshooting — plus eight worked recipes.

- The two facts an agent gets wrong without it. A mailbox is a recurring
  monthly credit charge (100-160 per mailbox per month), not a per-record
  one, and `mailbox remove` is the only way to stop it. And volume is a
  ramp, not a setting: 5/day to 40/day over 45 days from `warmupStartedAt`,
  pinned at 5/day forever if warm-up never started, reset to day 0 by
  `stop-warmup`, and `dailySendLimit` can only tighten it.

- `cargo-gtm`'s acceptable use said the pack never sends. That paragraph
  is the substance of the plugin-directory remedy, and mailboxManagement
  made it false. Section 1 now says what is true, section 6 names the ramp
  and calls spreading one campaign across extra mailboxes what it is, and
  section 7 cross-references the new skill.

- `cargo-cdk` gained `defineMailbox` and `defineDomain` in the same release
  and had documented neither. Both are now in the builder table with the
  create-only, monthly-fee and whole-zone rules that bite.

- Known gap, filed rather than papered over: `mailbox create --domain-uuid`
  is required and no command lists sending domains.

Counts move 17 to 18 across the router, README, AGENTS, CONTRIBUTING and
the manifests. Seven new routing cases, two of them hard-tier negatives
pinning the boundary the word "email" blurs. Core tier 93/93; lint,
metadata, llms.txt, trigger slugs, cookbooks and hooks all clean.


Claude-Session: https://claude.ai/code/session_01TF1ZRweJqqnPeGbVmUeGkY

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-23 21:47:30 -07:00
Auree Aubert fb95217c52 Make the cookbook menu a local file, and route on one-off vs standing (#110)
* Make the cookbook menu a local file, and route on one-off vs standing

cargo-cdk told the agent to "read the cookbook menu (the repo README's table)"
— a network fetch to another GitHub repo, mid-task, which an agent may simply
not make. When it does not, it authors from scratch a GTM outcome that was
already sitting there written. A menu you have to go and get is a menu that
gets skipped.

So the menu becomes a local reference, generated from the cookbook repo:

  .github/data/cookbooks.json      committed snapshot
  .github/scripts/sync-cookbooks.ts  --refresh to re-pull, --check in CI
  cargo-cdk/references/cookbooks.md  generated prose

Same shape as sync-trigger-slugs.ts, deliberately: CI reads the snapshot and
never the network, so a change in the cookbook repo cannot turn this build red
on its own. Staleness is fixed on purpose, with --refresh.

Two things the pointers got wrong, beyond being remote:

Routing. cargo-cdk's description triggers on "as code", "in git", "Terraform
for Cargo". Nobody says that when what they want is a rep cockpit. The real
seam is one-off versus standing: "build our TAM" is cargo-gtm when the user
wants a list today and a cookbook when they want a pipeline that keeps
producing it. The words are identical, so both skills now say so explicitly and
the description carries the outcome vocabulary.

What a cookbook is. Both pointers called them "scaffoldable outcome templates",
which invites copy-and-fill. The code is a worked example: each cookbook
declares what may be reshaped, what must hold, and what must be answered, and
installing one means adapting it until it is this company's code.

Also carries the --force warning into both, because the damage is silent:
`cdk init --force` into a non-empty directory replaces the project's
package.json and reverts adapted cookbook code while cargo.state.json survives,
so the next plan diffs a live workspace against code nobody wrote.

Note: the snapshot includes `variations`, which land in cargo-cookbooks#3.
Re-run --refresh once that merges.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Read the menu from SKILL.md frontmatter; leave "install a cookbook" to deploy-cookbook

cargo-cookbooks folded cookbook.json into SKILL.md (every reader of the
contract is an agent, and agents read markdown), so sync-cookbooks.ts now reads
frontmatter (outcome, state, chain) plus `kind` and `requires` from
cargo.scaffold.json, and the variations table under "## What you can change".
Foundations take their one-liner from the README's first paragraph. No new
dependency: the frontmatter is validated as real YAML in its own repo, so four
scalar fields do not need a parser here.

Two corrections to the previous commit on this branch:

  - cargo-cdk's description carried "install a cookbook" verbatim, which is
    deploy-cookbook's own trigger. With both installed the tie went to
    cargo-cdk, so the skill that merely points at cookbooks beat the one that
    installs them. cargo-cdk now carries discovery vocabulary ("is there a
    cookbook for this", "start from a cookbook") and leaves the install phrase
    to the skill that does the work.

  - `cargo-ai manifest add` is the way into an existing project (copy-in,
    existing files kept, every file hashed in manifest.json). It replaces the
    "scaffold to a temp dir and copy across" advice, which was a workaround
    for a command that already existed. skills-lint learns the `manifest`
    domain, shipped in 1.0.57.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* List every scaffoldable cookbook in the menu, not only the ones with a skill

The menu hid 16 of 20 cookbooks because they had no SKILL.md yet. The old
pointer sent the agent to a README that listed all 20, so this was a
regression: a user asking for contact sourcing was told nothing existed while
the code sat there and cdk init --from scaffolded it fine. Every outcome is
listed now; the Skill column says whether the adaptation contract exists or
the README and PLACEHOLDER comments are the interview.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* cargo-cdk: no session reload needed to reach a cookbook skill mid-task

A cargo-skills user who asks for a cookbook outcome is one hop from the skill
that installs it. Say exactly what to do in that hop: skills add, then read
the two SKILL.md files directly; or `npx skills use` to read one without
installing. And name the --dir default, which lands a cookbook in infra/
where a plain CDK project imports nothing from.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* menu: manifest add, not scaffold-to-temp, into an existing project

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* regenerate cargo-cdk metadata

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* menu: read state from the cookbook manifest, not from customer-facing frontmatter

cargo-cookbooks moved state, approval and chain out of SKILL.md frontmatter
into cargo.scaffold.json, because SKILL.md is what a customer installs and
Cargo's bookkeeping is not their concern. The menu now takes everything from
the manifest and each README's first paragraph; SKILL.md contributes only the
variations table. One code path for foundations, unconverted and converted
outcomes alike.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* regenerate metadata

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Point at gtm-skills' catalog.json: the CDK examples are skills there now

cargo-cookbooks merged into gtm-skills as flat, self-contained skills, and
that repo publishes one validated catalog.json. This script fetches it and
parses no markdown; the menu lists the skills that carry a CDK example and
the folders whose skill is not written yet. cargo-cdk and the router say
what changed in the model: the agent copies the folder in and reconciles it,
there is no scaffolder, and the shell comes from cdk init --template blank.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* menu: gtm-skills keeps only skills at the root, so no 'no skill yet' section

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Address review: GTM_SKILLS_ROOT accepts a dir or the catalog file; routing cases for cargo-cdk's new vocabulary

Bugbot's third finding (foundation variations dropped from the menu) is moot:
gtm-skills dissolved base-gtm and crm-sync into the skills that used them, so
there are no foundations and nothing to render.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Name things what they are: CDK examples, not cookbooks

The script, snapshot, reference file and type were named after the repo the
examples came from before the merge. That repo is being archived and the
examples are skills in gtm-skills now, so the names follow: sync-cdk-examples,
.github/data/cdk-examples.json, references/cdk-examples.md, CdkExample. The
llms.txt link to cargo-cookbooks goes; the linter's note that the CLI's
manifest domain includes 'manifest add' goes too, ahead of its removal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* cookbook is the name of the kind: rename the menu, snapshot and sync back to it

gtm-skills#12 fixes metadata.source as one-off | cookbook. So the menu of
gtm-skills that carry a worked CDK example is the cookbook menu, and the file,
snapshot, script and type are named for the kind, not for the repo they once
came from.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 17:57:26 -07:00
Auree Aubert e262b64780 Document the ASCII diagram format, and route "show me the workflow" here (#108)
* Document the ASCII diagram format, and route "show me the workflow" here

CLI 1.0.56 adds `--format ascii` to `node diagram`, so the command now renders a
drawing a person can read in a terminal as well as a Mermaid block to paste
somewhere that renders it. Two gaps went with it.

**Format selection.** `references/node-diagram.md` gains a `## The ASCII format`
section: a table that picks the format by where the output is going, the legend
(detour `├──┐…├──┘` vs fork `┌──┴──┐`, `┆ on failure`, `💳`, `◀━`, `↑`), and the
width limit. Its closing section used to say "don't replace the diagram with an
ASCII drawing; it wastes context and reads worse than the sentence" — true when
the only option was hand-drawing one, wrong now that the CLI emits a real
drawing, so it becomes the fallback for CLIs older than 1.0.56. The flag table,
the JSON shape, and the "Show the graph, don't describe it" callout all carry
`--format` now.

**Routing.** The reference documented the command well, but the description
carried no visualise vocabulary at all — and the description is the only thing an
agent reads before deciding whether to load a skill. Asked to explain a workflow,
a session never loaded this skill: it fell back to `workflow list` /
`release get-deployed` and reconstructed the routing by hand, which walks
`childrenUuids` only, drops every `fallbackChildUuid` hop, and describes a
workflow that survives a provider outage as one that dies on it. The description
now leads with "or show what it would run" and carries "show me the workflow",
"what does this tool do", "visualize this play", "draw the graph", "explain this
workflow".

`cargo-diagnostics` gains a fourth evidence surface — the graph a run executed
with the failing node marked — and the rule that a step which looks skipped is
often one the run reached via a fallback edge, which is a different diagnosis
with a different fix.

Six evals pin the split: drawing a healthy graph is orchestration, drawing a run
that broke is diagnostics. Core tier 86/86, linter clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Refresh the ASCII sample against the catalog naming

The reference still showed `Code` and `AI agent`, which the platform calls
JavaScript and Agent — the CLI now takes both from the native-integration
catalog rather than from a map of its own, so the sample had drifted. Regenerated
from the renderer, and the prose says where the names come from.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Note that the ASCII format draws loop bodies

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Remove an accidentally committed worktree pointer

A `git add -A` in the previous commit swept in `.claude/worktrees/`, a local
scratch worktree, as an embedded repository pointer. It is not part of the
skills and clones cannot resolve it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-15 22:39:35 -07:00
Auree Aubert 57254032cf Record which skills a session actually loaded (#78)
* Record which skills a session actually loaded

Routing is the thing this bundle turns on, and it has been argued rather
than measured. evals/routing.jsonl now scores 100% on the real-model
tier — a ceiling effect, not a victory: every prompt in it was written by
someone looking at the descriptions they were grading, and several were
added to pin behavior that had just been implemented. A suite that always
passes has stopped discovering anything. Prompts nobody wrote to pass
have to come from real sessions.

- hooks/skill-loads.sh reads a Claude Code transcript and emits a marker
  naming the skills invoked and the recipes/playbooks/guides opened:
  `[cargo-skills: cargo-gtm | docs: build-tam,waterfall]`. The session
  hooks append it to the row's summary, so it is queryable today over
  workspace_management.sessions with no schema change.
- Wired into both session-checkpoint.sh and session-end.sh. Recomputed
  from the whole transcript each time rather than accumulated, so a
  session that dies abruptly still carries it. Emits nothing at all for
  sessions that never touched Cargo.
- evals/README.md documents the three questions the data answers (which
  skills never load, which sessions loaded two before settling, which
  load with no doc read after) and how each turns into an eval case.
- Self-test wired into skills-lint, because a regression here corrupts
  telemetry silently instead of failing loudly.

Two bugs the fixtures passed and real transcripts caught:

- **Prose mentions counted as reads.** The doc regex matched a bare path
  anywhere in the transcript, and a skill's own catalog table names every
  recipe and playbook — so one cargo-gtm load reported all 43 playbooks
  as opened. Now anchored to a `"file_path":` tool input. Fixture 7 is
  that exact case.
- **Dangling prefix** when docs were read without a Skill call, giving
  `[cargo-skills: | docs: …]`. Both halves are now independently optional.

Also: the doc list caps at 12, and says `+N more` rather than looking
complete.

PRIVACY: skill and document names only, all of them already public in
this repository. Never a prompt, file contents, an argument, a record, or
anything a user typed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Fix Bugbot issues: preserve marker in sync finalize, retain skill load order

1. End hook drops skill marker (high severity): The sync finalize now
   includes the skill marker in the placeholder summary, so it persists
   even when refine() fails, times out, or is skipped. The marker is
   fast (no LLM call, just grep/sed).

2. Skill order lost to sorting (medium severity): Replaced 'sort -u'
   with 'awk !seen[$0]++' to preserve load order. The first skill in
   a multi-skill session is the misroute candidate, so order matters
   for harvest question 2.

Added test case 10 to verify load order preservation.

Co-authored-by: Auree Aubert <aureeaubert@users.noreply.github.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Auree Aubert <aureeaubert@users.noreply.github.com>
2026-08-12 14:33:36 -07:00
Auree Aubert 3708f8c955 Agent discoverability: trigger-shaped descriptions, routing evals, standalone bootstrap (#77)
* Agent discoverability: trigger-shaped descriptions, routing evals, standalone bootstrap

The `description` field is the only text an agent weighs before deciding
whether to load a skill. Everything else in the bundle is invisible until
that decision is already made — and twelve of the seventeen descriptions
read as "Manage <CLI nouns> using the Cargo CLI", which matches a user who
is already thinking in Cargo's object model rather than one stating a job.

This rebuilds that layer and, for the first time, tests it.

Routing
- Every description rewritten to a four-part template: job in the user's
  words -> literal quoted trigger phrases -> proper nouns -> an explicit
  `Skip when:` pointing at the sibling skill that owns the adjacent case.
- Integration and provider names are generated, not hand-maintained.
  sync-trigger-slugs.ts fills cargo-gtm's `Providers:` list from the
  playbook tree and cargo-connection's `Integrations:` list from a
  committed catalog snapshot (138 integrations, 50 credits-based).
  `--refresh` re-pulls from a logged-in CLI; `--check` gates CI.
- evals/routing.jsonl (92 prompts) + routing-eval.ts, wired into CI.
  Structural tier asserts the template and that each skill keeps >=5 terms
  unique to it; lexical tier requires the expected skill to rank first;
  an opt-in --llm tier asks a real model to route from descriptions alone.
  Deep paraphrases are tagged "hard" and reported rather than gated — a
  lexical proxy cannot judge them fairly.

Standalone installs
- `skills add --skill <one>` is a supported path and the registry lists
  each skill separately, but thirteen skills' only install instructions
  were a relative link to ../cargo/references/prerequisites.md, which does
  not exist in a single-skill install. Every SKILL.md now has a
  self-contained Bootstrap section, enforced by the linter.

Coverage
- New capability skill cargo-segmentation — the segmentation CLI domain,
  previously uncovered while segments were load-bearing in most recipes.
  Verified against the live CLI, including the flag traps.
- Three cargo-gtm recipes: source-planning (probe and cost candidate
  sources per *hit* before any fan-out), ads-audience-activation (Google
  Customer Match / LinkedIn Matched Audiences), review-and-iterate (human
  review of judgment output, kept as an eval set).
- Router gains a "these skills vs a workspace MCP server" section: Cargo
  has no first-party MCP server — a workspace builds one and serves it
  over `cargo-ai mcp` — so the routing rule is scale and reproducibility.

Index and hygiene
- llms.txt now lists every recipe and provider playbook with a generated
  summary: 17 entries -> ~80 job-named addressable URLs.
- Router trimmed ~80 lines of per-skill summaries that restated each
  skill's own description; critical rules kept in full.
- Linter: bootstrap check, skill-count claims validated against the tree,
  `doctor` and `mcp` added to the known CLI domains.
- CONTRIBUTING.md, keyword-dense README opening, updated repo metadata.

Also carries the aiArk/apolloio priority-stack promotion authored in a
parallel session on this branch (cargo-gtm 1.12.0) — the two touch the
same SKILL.md files and could not be split cleanly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Surface the 100-credit free tier where an agent meets it

There is no purchase gate between installing Cargo and producing a real
deliverable — a new account starts with 100 free credits and no card — and
nothing in the bundle said so. An agent that doesn't know the budget can't
tell a first-time user whether the demo is a look around or a commitment,
and defaults to hedging.

Now stated at every point an agent encounters the question:

- README opening and the generated llms.txt install block: an agent can
  install, sign the user up, and hand back a list in one turn.
- Router install section and prerequisites.md, with anchors for what 100
  credits buys (~5,000 sourced leads, ~1,000 verified-email enrichments,
  ~50 fully enriched contacts).
- cargo-quickstart: the demo spends ~0.5 of the 100, and the skill now
  says so before the first paid call — that reframes the moment from a
  purchase decision into a look around, which is the job of a quickstart.
- cargo-billing: a "what 100 credits buys" table, plus two new trigger
  phrases so free-tier questions route here at all.
- cost-discipline.md: on a new account, receipts and next-step proposals
  must be framed against the free tier. "87.6 of your 100 free credits
  left" is a number the user can act on; "87.6 remaining" is not. Also
  warns that phone lookups (6-7/call) are the fastest way to burn a tier
  a first session should end with something left to try.

Two routing eval cases added for free-tier questions (79/79 core).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Run the routing evals against a real model in CI

The lexical tier passes 79/79, but it is a deterministic proxy written
alongside the descriptions it grades — it cannot fail in a way that
surprises us, which is what makes it weak evidence. The only honest
scoreboard for the description rewrite is whether a real model, shown
nothing but the 17 descriptions, routes the eval prompts correctly.

That tier existed but had never run. Now it does, in its own workflow.

- New .github/workflows/routing-evals-llm.yml, using the repo's
  ANTHROPIC_API_KEY. Deliberately not part of skills-lint: it costs money
  and is non-deterministic, so it must never stand between a typo fix and
  a merge. Triggers on PRs and pushes that touch a SKILL.md, the eval
  cases, or the runner; weekly on a schedule so model drift surfaces even
  when nobody edits a description; and on demand with a model override.
- runLlm reworked for CI: 6-way concurrency (92 sequential calls is a slow
  job), retry with backoff on 429/5xx, tolerant answer parsing, and a
  core/hard/overall breakdown instead of one number.
- Results are written to GITHUB_STEP_SUMMARY as a table, including every
  misroute with what the model picked instead — so a regression is
  readable on the run page without opening logs.
- Optional --llm-min=<percent> floor, wired to the exit code. Left unset
  until the first runs establish a baseline; a floor guessed before the
  data would either never fire or block on noise.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Act on the first real-model routing run: 92/94, two fixes

Baseline from the model tier (claude-haiku-4-5, judging from the 17
descriptions alone): 92/94 overall — core 79/79, hard 13/15. The lexical
proxy's 3/15 on the hard tier was noise about the proxy, not the
descriptions, which is what that tier existed to establish.

Both misroutes were worth having:

- "Our outbound is going to the wrong people — help me figure out who
  actually buys from us" routed to cargo-context instead of cargo-gtm.
  A real collision: cargo-context's triggers include "who do we sell to",
  which reads as ICP ownership. It owns *writing the conclusion down*;
  deriving it from won/lost data is cargo-gtm. Added that boundary to
  cargo-context's Skip when, and the two phrasings to cargo-gtm.

- "Give the assistant access to our sales collateral so it stops making
  things up" routed to cargo-content instead of cargo-ai — and the model
  was right. As written the first step is getting the collateral into the
  workspace. Corrected the expectation and added the other side of the
  boundary as its own case ("attach the library we already uploaded to
  the agent"), which the lexical tier then failed, correctly: cargo-ai
  never said "library" or "release resources". Added both, so the
  content/ai split is now legible to a ranker and a model.

Set --llm-min=93 now that a baseline exists. Deliberately below the
observed 98%, not at it: a model tier that fails on one non-deterministic
flip trains people to ignore it.

Lexical 80/80 core.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Document cargo-ai mcp — the bridge that was written down nowhere

Cargo reaches coding agents through two doors. Skills reach agents that
implement skills.sh; a workspace MCP server reaches everything else —
Claude Desktop, ChatGPT, and whatever ships next. The second door was
fully built and documented in exactly one place: `cargo-ai mcp --help`.

Worse, cargo-ai/SKILL.md taught `ai mcp-server create` (building a server)
without ever mentioning the command that serves it, so an agent could
construct one and have no idea how to connect it — and the section
conflated publishing a server with consuming someone else's, which are
unrelated surfaces.

- MCP section rewritten around the two directions, with a table: publish
  (`ai mcp-server`, called by any MCP client, wired via `cargo-ai mcp`)
  vs consume (`ai mcp-client`, called by your agents, wired via
  `release update-draft --mcp-clients`). States plainly that there is no
  first-party Cargo MCP server — a workspace builds its own.
- Documents `cargo-ai mcp` with the registration one-liner, the
  CARGO_MCP_SERVER_UUID fallback, and the stdout-is-protocol constraint.
- Details verified against the live API rather than --help: actions take
  kind "tool" *or* "agent" (an agent is exposable as a callable MCP
  tool), resources take model or file, and `update` replaces the arrays
  wholesale instead of merging — a real footgun.
- Routing rule for which door to use, pointing at the router section.
- Two trigger phrases ("expose our tools as an MCP server", "use Cargo
  from Claude Desktop or ChatGPT") and two eval cases, so the publish
  direction is reachable from a description at all. It previously wasn't.

Lexical 81/81 core.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-12 10:18:32 -07:00