Mushi-Mushi
Mushi-Mushi is a bug-reporting and fixing server: it ingests user-felt bug reports from your app, classifies and explains them in plain English, lets you investigate evidence, dispatch AI fix agents that open PRs, and manage the whole workflow.
Bug report lifecycle — list, search, and dedupe reports; fetch full detail, evidence (console/network logs, screenshots), timelines, and stage-1/2 classification; transition status, reopen, dismiss, and reply to reporters.
Fix orchestration — get a paste-ready fix context, dispatch an agent (Claude Code, Codex, Cursor Cloud, etc.) to open a draft PR, refresh CI, merge the PR, record external fixes, and generate Playwright regression tests.
Triage & prioritisation — get a prioritised "what to work on next" list, run an end-to-end triage packet (report + similar bugs + blast radius + logs), or a Sonnet-as-Judge quality review.
Knowledge graph & inventory — traverse the app component graph, compute blast radius, fetch inventory snapshots and diffs, and list CI gate findings (dead handlers, mock leaks, API contract, etc.).
Analytics & search — ask natural-language questions over project data (NL→SQL), search reports by meaning/embedding, and query similar bugs for dedupe.
Setup & operations — diagnose setup health (ingest vs. dispatch), check activation status, verify SDK freshness, and manage BYOK API keys (add, test, remove, list) for Anthropic/OpenAI/Firecrawl/etc.
Learning & documentation — query and list project "lessons" (encoded heuristics) for diff context, and search/read official Mushi docs.
Two-way communication — check SDK↔admin health and send visible replies back to end-users through the in-app widget.
SDK for capturing errors and user reports from Angular applications.
Inbound adapter to forward Bugsnag alerts into Mushi.
Sandbox provider for running fix attempts in a sandbox environment.
Inbound adapter to forward Datadog alerts into Mushi.
Inbound adapter to forward Firebase alerts into Mushi.
Outbound integration to open draft pull requests with fixes.
Inbound adapter to forward Grafana Loki alerts into Mushi.
Sandbox provider for running fix attempts in a sandbox environment.
Inbound adapter to forward New Relic alerts into Mushi.
SDK for capturing errors and user reports from Next.js applications.
LLM provider supported as an alternative for the classification pipeline.
Inbound adapter to forward Opsgenie alerts into Mushi.
SDK for capturing errors and user reports from React applications.
Inbound adapter to forward Sentry alerts into Mushi for deeper fix context; outbound plugin to auto-resolve Sentry issues when Mushi merges a fix.
Outbound integration to dispatch fixes via Slack.
Backend database and edge functions platform used for self-hosting the Mushi stack.
SDK for capturing errors and user reports from Svelte applications.
Mushi Mushi
Your AI wrote it. Mushi tells you why it broke.
Plain-English diagnosis + a paste-ready fix, right inside Cursor and Claude Code. No log-reading. No second LLM API key for MCP.
Fastest path — drop Mushi into your AI editor:
npx mushi-mushi setup --ide cursor # or: --ide claudeAlready shipping an app? One command installs the SDK + env vars + an optional test report:
npx mushi-mushiOpen source and self-hostable: MIT SDKs, AGPLv3 server — bring your own LLM key, no second key for MCP, no lock-in. Self-host in minutes · licensing.
What is Mushi, exactly? Read the one-page constitution: VISION.md — the single source of truth for positioning, the north-star sentence, and who this is for.
Node ≥20.19 · CI · SDK MIT · enterprise · Smithery
Vision · Quick start · Connect your editor · Self-host · Why not just Sentry? · Packages · Docs · Try the read-only demo · Console (sign in) · Operators / platform · Roadmap
↑ the diagnosis: plain-English root cause + a paste-ready fix prompt · click to read one in the read-only demo, no signup
60-second proof
Using Cursor, Claude Code, or another AI editor? Paste this prompt and your agent does the whole setup — install, wiring, and a verified test report:
Install the Mushi skills from github.com/kensaurus/mushi-mushi (
npx skills add kensaurus/mushi-mushi), then run the mushi-setup skill to wire the Mushi SDK and MCP server into this app and send a test report to verify the connection.
Or run the wizard yourself:
npx mushi-mushiThe wizard auto-detects your framework, installs the right SDK, writes framework-prefixed env vars (e.g. VITE_MUSHI_PROJECT_ID / VITE_MUSHI_API_KEY, or NEXT_PUBLIC_MUSHI_*) to .env.local, and prints the snippet to paste. Those two vars are all the SDK needs — no Supabase, no LLM key (see examples/sdk.env.example; the root .env.example is for self-hosting the backend only). Then, the moment something breaks:
The bug lands in your queue — screenshot, the user's note, the route, the last console + network events, device context.
Mushi produces the diagnosis: a plain-English root cause + a fix you can paste.
You pull it into your editor over MCP:
npx mushi-mushi setup --ide cursor # then ask Cursor: "what's broken in prod?"No Sentry, no account, no monitoring stack required to see value. Self-host the whole thing in under five minutes, or use the free hosted tier (no card).
Related MCP server: Playwright MCP
What this is
For the solo AI-first builder (the vibe coder): you ship fast with Cursor, Claude Code, Lovable, or Bolt, then lose afternoons when something breaks in code you didn't fully write. Mushi is the comprehension layer — plain-English diagnosis in your editor over MCP, so a bug costs five minutes instead of your afternoon. (Small teams and agencies hit the same pain.)
These are the bugs that never trigger an error alert, in code you didn't write:
A user added a coupon and the pay button slipped under their keyboard.
A new signup tapped Save twice because nothing visibly happened the first time.
A Pro customer's dashboard takes 12 seconds to load — and they've opened the competitor's tab.
A layout that looks fine on your laptop folds in half on the one Android model used by 18% of your traffic.
What it is not
Not another dashboard you have to go read, and not an enterprise monitoring stack — standalone first, no Sentry/Datadog/Firebase required. Full positioning: VISION.md.
The diagnosis loop
When a user shakes their phone (or clicks the reporter):
Capture — screenshot, route, user note, recent console + network events, device context.
Classify — two-stage LLM tags severity, category, and a plain-English root-cause hint. The screenshot goes through an air-gapped vision pass that can't see the text prompt. A nightly judge scores the classifier and feeds a prompt-A/B loop.
Connect — the report embeds into a knowledge graph (Postgres + pgvector). The same broken button reported twenty times shows up as one row, not twenty.
Fix (optional) — Dispatch fix (or Slack / MCP / CI) runs an agent in a sandbox, runs your tests, and opens a draft PR. You review it like any other PR.
flowchart LR
subgraph App["Your app"]
SDK["mushi-mushi/{react, vue, svelte, angular, …}<br/>shadow-DOM widget · screenshot · console · network"]
end
subgraph Edge["Supabase Edge (Hono gateway + ~50 functions)"]
API["api"]
FF["fast-filter"]
CR["classify-report<br/>+ vision + RAG"]
ORCH["fix-worker"]
end
subgraph DB["Postgres + pgvector"]
REP["reports"]
KG["knowledge graph"]
FIX["fix_attempts"]
end
subgraph Agents["mushi-mushi/agents"]
SBX["sandbox: e2b / modal / cloudflare"]
GH["GitHub PR"]
end
SDK -->|HTTPS| API
API --> FF --> CR
CR --> KG
CR --> REP
REP --> ORCH --> Agents
Agents --> GHThe architecture, sequence diagram, and component-by-component spec live in apps/docs/content/concepts/architecture.mdx.
Self-host in under 5 minutes
A single Docker Compose file gets you a working stack against your own Supabase project:
cd deploy
cp .env.example .env # ANTHROPIC_API_KEY, Supabase creds
docker compose up -dSELF_HOSTED.md and the Self-host in minutes guide are the long-form walkthroughs. A Helm chart lives at deploy/helm/ — one helm install on any cluster.
Hosted: sign up at kensaur.us/mushi-mushi/, click Start free, no card, create a project, and copy your projectId + apiKey. The free tier covers 50 diagnoses a month (no card required).
One BYOK rule, both ways. Self-host and you bring your own Anthropic / OpenAI key — you pay the vendor at list rate, we never mark up a token. On hosted you bring no key at all: we meter by diagnosis (the plain-English root cause + fix), never by tokens, with a per-project spend cap and 50 / 80 / 100% alerts so the bill can't surprise you. Full numbers: pricing.
Internal edge functions (
fast-filter,classify-report,fix-worker,judge-batch,intelligence-report,usage-aggregator,generate-synthetic) authenticate viarequireServiceRoleAuth. Never expose them with--no-verify-jwt. Only the publicapifunction should face the internet — seepackages/server/README.md.
Why not just Sentry?
The question every team asks, answered once:
Sentry is built around what the code threw, with a User Feedback widget and replay alongside. Mushi starts from what the user reported, ingests Sentry's errors too, explains each one in plain English, and hands your agent a fix prompt to start from. One queue, with or without Sentry.
Mushi works standalone. If you already run Sentry, point a Sentry issue-alert
webhook at /v1/webhooks/sentry?projectId=<your-project> and errors land in the
same queue as user reports — deduped per Sentry issue, triaged in plain English,
fix-dispatchable from the console, Slack, or your editor. The loop closes both
ways: merging a Mushi fix resolves the linked Sentry issue, and resolving in
Sentry resolves the linked report. A repeat alert on a fixed report reopens it
as a regression instead of filing a duplicate.
Beyond Sentry, inbound adapters translate Datadog, Bugsnag, Rollbar,
Crashlytics, New Relic, Honeycomb, Grafana Loki, CloudWatch, Opsgenie, and
Firebase alerts into the same queue; outbound plugins keep Linear, Jira, GitHub
Issues, Slack, Discord, Teams, and PagerDuty in sync. Nothing gets ripped out —
Mushi is the mediator between what you already run. Operator-depth (SSO,
retention, region routing): docs/operators/.
Mushi | Sentry | Langfuse | |
Catches | Thrown errors and silent UX bugs (dead clicks, slow screens, layout breaks) | Thrown errors, performance traces | LLM call traces, prompt evals |
Output | Plain-English root cause + paste-ready fix, in your editor | Stack trace + breadcrumbs, in a dashboard | Trace tree + scores, in a dashboard |
Auto-fix | Optional: sandbox agent opens a draft PR | Seer add-on (paid) | Not in scope |
Second LLM key for MCP | No — reuses your app's key | N/A | N/A |
Setup | One command, no account required to try | SDK + DSN + dashboard | SDK + project + dashboard |
Different jobs: Sentry watches what your code throws, Langfuse watches what your LLM calls do, Mushi watches what your user experiences — including the bugs that never throw.
Framework coverage
Most developers install one SDK — npx mushi-mushi picks it for you. React/Next.js quick start:
npm install @mushi-mushi/react # also covers Next.jsimport { MushiProvider } from '@mushi-mushi/react';
function App() {
return (
<MushiProvider config={{ projectId: 'proj_xxx', apiKey: 'mushi_xxx' }}>
<YourApp />
</MushiProvider>
);
}// Vue 3 / Nuxt
import { MushiPlugin } from '@mushi-mushi/vue';
app.use(MushiPlugin, { projectId: 'proj_xxx', apiKey: 'mushi_xxx' });
// Svelte / SvelteKit
import { initMushi } from '@mushi-mushi/svelte';
initMushi({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' });
// Angular 17+
import { provideMushi } from '@mushi-mushi/angular';
bootstrapApplication(AppComponent, { providers: [provideMushi({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })] });
// React Native / Expo
import { MushiProvider } from '@mushi-mushi/react-native';
// Vanilla JS / any framework
import { Mushi } from '@mushi-mushi/web';
Mushi.init({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' });Native SDKs are a preview. They are not on CocoaPods trunk, Maven Central or pub.dev yet, so install them from this repository:
iOS (SwiftPM):
.package(url: "https://github.com/kensaurus/mushi-mushi.git", branch: "master"), then add theMushiMushiproduct. There is no version tag to pin to yet.Flutter: a git dependency on
packages/flutterinpubspec.yaml— seepackages/flutter.Android: a Gradle composite build from a clone — see
packages/android.
Want a runnable example?
examples/react-demois a minimal Vite + React app with test buttons for dead clicks, thrown errors, failed API calls, and console errors.
Full package list and maturity table: SDK reference.
Where it stops
Mushi is honest about what's still partial. Skim before you commit:
Area | Working | Still partial |
Classification | Haiku fast-filter, Sonnet deep + vision air-gap closed, structured outputs, prompt-cached prompts, | — |
Judge / self-improve | Sonnet judge with OpenAI fallback, prompt A/B auto-promotion via | Anthropic fine-tune API is not publicly self-service in 2026 — the adapter stub links to the access-request form. |
Fix orchestrator | Single-repo | — |
Sandbox | Provider abstraction; | — |
Verify | Playwright screenshot diff + step interpreter ( | — |
Enterprise | Plugin marketplace + HMAC, audit ingest, region pinning, retention CRUD, Stripe metering, SAML SSO via Supabase Auth Admin API, OIDC SSO self-service — see the commercial boundary below for which of these are paid/Enterprise-tier | — |
Graph backend | SQL adjacency over | Apache AGE is a hosted-tier enhancement when the extension is installed. Managed Supabase stays on SQL adjacency. |
Inventory v2 & QA-gates | Hand-written | Inventory is gated behind Advanced mode + the |
Self-host (Helm) | Single-pod deploy on any Kubernetes; pre-install Job applies all SQL migrations from a bundled ConfigMap. Multi-region via | Full active/active write replication is not automated yet — write routing relies on client-side region stickiness. |
Running this for a team?
The platform depth — inbound adapters, outbound plugins, A2A / AG-UI / MCP interop, the inventory.yaml QA-gate system, the synthetic monitor, SSO / audit / retention / region pinning, and open-standards plumbing — lives in docs/operators/ so the front door stays on the wedge. Start there if you're wiring Mushi into an existing stack or evaluating it as a platform.
Cursor & Claude Skills
Install Mushi skills in your Cursor or Claude Code project for one-command setup, usage, and debugging:
npx skills add kensaurus/mushi-mushiThen: /mushi-setup (guided SDK install + MCP wiring), /mushi-debug (diagnose ingest / MCP / pipeline failures), /mushi-health (pass/fail check across CLI, API, edge functions, BYOK keys), /mushi-integration (two-way loop, fix dispatch, lessons). The admin Connect & Update page (/connect) mirrors the same flows with one-click Add to Cursor deeplinks.
Repo at a glance (run pnpm docs-stats): ~407K TS lines · 1,886 source files · 44 workspace / 36 npm packages · 59 edge functions · 375 SQL migrations · 19 pipeline agents. Full tour: docs/SCREENSHOTS.md.
Community
Questions, ideas and show-and-tell live in GitHub Discussions — post a screenshot of your first diagnosis in the pinned Show and tell thread, or ask anything; the maintainer answers on weekdays. Release notes go to Discussions → Announcements. Bugs go in Issues, first reply within 24 hours on weekdays. Security reports follow SECURITY.md; anything else private goes to kensaurus@gmail.com.
Contributing
Issues and PRs welcome:
git clone https://github.com/kensaurus/mushi-mushi.git
cd mushi-mushi
pnpm install
pnpm devRequires Node.js ≥ 22 and pnpm ≥ 10. See individual package READMEs, docs/stats.md for canonical counts, and CONTRIBUTING.md.
License & branding
This repository is open-core — the Supabase / Grafana model. The SDK packages are MIT — use them in any product, open or closed. The server (the part you self-host or we run for you) is AGPLv3 — true OSI open source: self-host it, fork it, modify it for your own org. If you offer a modified server as a hosted service to third parties, publish your changes or see COMMERCIAL-LICENSE.md. A small Enterprise Edition boundary (packages/server/ee/) is source-available but commercial for production use — that's operator/enterprise plumbing only, never the wedge. The root LICENSE states this split before the MIT text, and where a package directory carries its own LICENSE, that file governs the package.
Surface | License | Permitted | Notes |
SDK packages — | Use, fork, sell, embed in proprietary products. | Trademarks separate — see below. | |
Server packages — | Use, modify, self-host, fork for your own org. SaaS modifiers publish changes or commercial license. | OSI-approved copyleft. The cloud runs this exact core. | |
Enterprise features ( | EE license — commercial / paid tier | Available on the Enterprise plan (hosted) or with a commercial license (self-host). | The code may be source-visible, but production use of these specific features is a paid boundary — see |
Trademarks — "Mushi Mushi", "Mushi", 虫, the bug logo | Refer to the project, build add-ons, link to the repo. | Forks must rename. Hosting a service under the Mushi name requires written permission. | |
Third-party attributions | — | Upstream projects we depend on and their licenses. |
Security researchers: see SECURITY.md for the threat model, PII commitments, and safe-harbor terms.
More from KENSAURUS
App | What it is | |
Learn Thai — bite-size lessons, smart flashcards, and an AI tutor | ||
Where did the money go? Now you'll know. A kakeibo for households | ||
How the Battle Between Extraction and Generation Is Reshaping Our World — a 147,000-word interactive webbook with 268 concepts, 242 citations, and original illustrations | ||
Pair phones, direct the pose, nail the photo | ||
Practice hard conversations before you have them | ||
Bookkeeping and tax-filing co-pilot for one-person companies in Japan | ||
Ready-made playbooks for your AI coding editor | ||
Everything else built under the same roof |
All apps live under kensaur.us.
Available Tools
41 toolsactivation_statusActivation cockpit statusARead-onlyIdempotentInspect
Return the unified activation posture — SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, and the next best action. Read this before guessing which onboarding step is blocking the user. Also available as the mushi://activation resource for resource-reader clients. Returns { sdkActive, reportsIngested, githubConnected, mcpConnected, qaStoriesCreated, nextBestAction }.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID (defaults to the configured project). (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, and open-world hints, so the description does not need to restate safety. It adds value beyond the annotations by specifying the exact returned fields and mentioning the equivalent mushi://activation resource. No contradiction with annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by usage cue and exact return shape. The natural-language list and the JSON key list overlap, but they serve different readers (human summary vs exact field names) without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with one optional parameter and no output schema, the description covers the return contract, the usage moment, and an alternative protocol. It does not explain edge-state behavior (e.g., what fields look like before activation), but annotations and simplicity make the tool unlikely to cause incorrect invocations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents projectId as a defaulting optional UUID. The description does not add parameter-level meaning, but the high coverage keeps this at the baseline rather than lower.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Return the unified activation posture') and enumerates the exact components (SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, next best action), so an agent can distinguish this activation-status tool from siblings like get_inventory or get_recent_reports. The 'next best action' phrase also signals what makes this tool unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use the tool: 'Read this before guessing which onboarding step is blocking the user,' which gives a concrete decision point. It also notes an alternative access path (mushi://activation for resource-reader clients), but it does not spell out when to prefer sibling tools over this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_byok_keyAdd an API keyAInspect
Add and immediately validate a BYOK API key for anthropic | openai | firecrawl | browserbase | cursor. The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. Write; NOT idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The API key value to add | |
| label | No | Human-readable label for this key | |
| baseUrl | No | Allow-listed OpenAI-compatible HTTPS base URL | |
| priority | No | Priority for ordering (lower = higher priority) | |
| provider | Yes | Provider slug | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral detail beyond annotations: the key is stored encrypted in Supabase Vault and never returned, failed probes remain quarantined, and baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. These are not present in the annotations and give the agent critical knowledge about side effects and constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. The primary action is front-loaded ('Add and immediately validate'), followed by critical storage/security details and a non-idempotency warning. Each sentence provides necessary information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers storage, validation, quarantine behavior, and baseUrl constraints. It doesn't explain what the response contains, but that is arguably not needed for an add operation. It might benefit from mentioning prerequisites like projectId existence, but the core calling context is well covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes all six parameters. The description adds marginal extra meaning by clarifying the baseUrl restriction ('only for allow-listed OpenAI-compatible HTTPS providers'), which slightly reinforces the schema's phrasing. It does not meaningfully explain label, priority, or projectId beyond what the schema does, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific verb and resource: 'Add and immediately validate a BYOK API key', followed by the exact list of supported providers (anthropic, openai, firecrawl, browserbase, cursor). This clearly distinguishes it from sibling tools like test_byok_key (which tests existing keys) and remove_byok_key (which deletes them).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool (adding a new BYOK key with immediate validation) but does not explicitly name alternatives or when-not-to-use conditions. It provides clear context by mentioning the immediate validation step, which indirectly suggests test_byok_key for testing without adding, but lacks an explicit routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sdk_versionCheck SDK freshnessARead-onlyIdempotentInspect
Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version). Returns { package, current, latest, outdated } and, when outdated, suggestedActions (Sentry-style, max 1) pointing at search_mushi_docs plus the mushi-sdk-upgrade skill. Read-only. Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK. Does not bump the pin — that stays a human/Dependabot change.
| Name | Required | Description | Default |
|---|---|---|---|
| current | No | Installed version from package.json, if known (e.g. 1.27.0). | |
| package | No | npm package name (default @mushi-mushi/web). Examples: @mushi-mushi/web, @mushi-mushi/node, @mushi-mushi/core. |
Output Schema
| Name | Required | Description |
|---|---|---|
| latest | No | |
| current | No | |
| package | Yes | |
| outdated | No | |
| suggestedActions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark it read-only and idempotent, and the description reinforces this with 'Read-only' and the explicit side-effect boundary 'Does not bump the pin.' It also discloses the response shape including the conditional suggestedActions, which adds useful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information: purpose, endpoint, response, conditionality of suggestions, read-only guarantee, and usage triggers. It is front-loaded with the core action and remains compact without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only check with two optional parameters and an output schema, the description is complete. It covers what the tool compares, when to use it, what it returns, and the boundary that it never mutates the dependency pin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for 'current' and 'package', so the description does not need to add parameter details. It does not materially extend the parameter semantics, which matches the baseline 3 for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version)'. It is immediately distinguishable from sibling tools by focusing on SDK version drift, and explicitly notes it does not bump the pin, separating it from mutating fix tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger conditions: 'Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK.' It also states a clear boundary: 'Does not bump the pin — that stays a human/Dependabot change,' telling the agent when the tool is not the right action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_setupUnified setup diagnoseARead-onlyIdempotentInspect
Diagnose Mushi setup health and return the single best next action. mode=full (default) runs both SDK-ingest and fix-dispatch preflight checks; mode=ingest runs ingest checks only (project exists, active API key, SDK heartbeat, at least one report); mode=dispatch runs dispatch readiness only (GitHub connected, codebase indexed, LLM key present, autofix enabled). Returns { ready, steps: [{ label, complete, required, hint }], nextAction }. Read-only. The one setup-diagnosis entry point — use this instead of separate connection/ingest checks.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | full (default) = ingest + dispatch; ingest = SDK pipeline only; dispatch = fix preflight only. | |
| projectId | No | Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| ready | Yes | |
| ingest | No | |
| summary | Yes | |
| dispatch | No | |
| connection | No | |
| nextAction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds 'Read-only' (consistent with annotations) and discloses the exact return shape ({ ready, steps: [{...}], nextAction }), providing context beyond the annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but packs in the purpose, mode breakdown, return format, and a routing note. It is front-loaded with the core purpose and uses semicolons to list mode specifics efficiently. No filler sentences, though it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 2 parameters, a rich output schema, and annotations covering safety, the description covers all necessary calling context: mode options, default behavior, return structure, and a clear routing rule. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining mode defaults ('full (default) runs both...'), the projectId default ('defaults to configured project'), and the alias ('project_id' is accepted too'), which are not fully spelled out in the schema. This extra nuance elevates it slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Diagnose'), a resource ('Mushi setup health'), and a concrete outcome ('return the single best next action'). It also explicitly positions itself as 'The one setup-diagnosis entry point — use this instead of separate connection/ingest checks,' which differentiates it from siblings like get_inventory or get_two_way_comms_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit mode-based usage: full, ingest, and dispatch, each with its own set of checks. It also names an alternative ('use this instead of separate connection/ingest checks') and clarifies when this tool should be selected, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_inventoryInventory diffARead-onlyIdempotentInspect
Diff two ingested inventory commits (fromSha to toSha): added/removed nodes and edges. Returns { added, removed, changed }. Requires inventory_v2. Read-only. Use before merging a PR that touches inventory.yaml to see what changed; use get_inventory for the current snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| toSha | Yes | Newer commit SHA (the candidate to diff to) | |
| fromSha | Yes | Older commit SHA (the baseline to diff from) | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' is redundant but consistent. It adds genuine value by stating the prerequisite ('Requires inventory_v2') and the exact return shape ('{ added, removed, changed }'), which is critical since there is no output schema. These details go beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler. The core purpose and return format are front-loaded, followed by usage context and sibling routing. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a diff tool with no output schema, the description adequately covers the return shape, prerequisite, and usage context. It could elaborate on edge cases (e.g., what 'changed' encompasses or error conditions), but given the tool's simplicity and the annotations covering safety, this is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters, so the description need not re-explain them. It mentions fromSha and toSha in the narrative but adds no semantic detail beyond the schema's descriptions. The baseline of 3 applies because the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('diff') and resource ('inventory commits') with a clear scope (fromSha to toSha, added/removed nodes/edges). Explicitly differentiates from sibling get_inventory by calling out the current snapshot alternative. Unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('before merging a PR that touches inventory.yaml') and names the alternative tool (get_inventory) with its distinct purpose. No ambiguity about when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatch_fixDispatch Mushi fix agentAInspect
Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely — without it each call starts a new attempt. Report must be classified — run triage_issue if not.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Which agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent. | |
| reportId | Yes | Report UUID to fix (`report_id` is accepted too.) | |
| projectId | No | Project UUID — defaults to the configured project. (`project_id` is accepted too.) | |
| idempotencyKey | No | Optional RFC 4122 UUID. Resend the same key to safely retry without dispatching a duplicate fix job (Idempotency-Key IETF draft). | |
| inventoryActionNodeId | No | Optional inventory Action node UUID for spec-traceability (§2.10). When provided, the fix-worker embeds the expected_outcome contract in the LLM prompt and runs validateAgainstSpec before opening the PR. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fixId | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the real-world side effects (branch creation, signed draft PR), the non-idempotent behavior ('without it each call starts a new attempt'), and the prerequisite of GitHub + LLM key. These are consistent with readOnlyHint=false and idempotentHint=false, and they add detail the annotations alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause carries information: purpose, agent override, prerequisites, return contract, retry semantics, and classification precondition. It is front-loaded with the main action. The only minor blemish is the cryptic 'Write;' marker, which slightly obscures the retry note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a rich schema and output schema, the description covers everything an agent needs to invoke it correctly: when it is applicable, prerequisites, what it returns, how to monitor it, and how to complete the workflow. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all 5 parameters with descriptions (100% coverage). The description adds value by emphasizing that agent defaults to the in-repo worker and by framing idempotencyKey omission as a new attempt. This is a modest addition over the schema, which already explains the idempotency behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a Mushi fix agent'), plus the concrete side effects ('writes a branch and opens a signed draft PR'). This clearly differentiates it from siblings like suggest_fix, which only produce suggestions, and submit_fix_result, which submits results.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides direct context for when to dispatch: a report must be classified, with an explicit fallback ('run triage_issue if not'). It also names prerequisites and the post-dispatch workflow (poll get_fix_timeline, merge_fix when CI is green). It does not enumerate all alternative tools, but the key conditions and sequencing are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blast_radiusBlast radiusARead-onlyIdempotentInspect
Return the other components/pages a bug group touches, via knowledge-graph traversal from the report node. Returns { nodes: [{ id, label, type }], edges }. Read-only. Use before dispatch_fix to scope a change safely; use get_knowledge_graph to traverse from an arbitrary seed, or analyze_codebase_impact for file-level import impact.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Graph node UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the bar for additional disclosure is lower. The description adds value by explaining the traversal origin ('from the report node') and the exact return shape ('{ nodes: [{ id, label, type }], edges }'), which is especially useful since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states purpose and return format, the second provides usage timing and alternatives. There is no filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with strong annotations, the description covers purpose, return shape, intended usage, and alternates. It is complete enough for an agent to decide when to invoke it and what to expect in the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers nodeId as 'Graph node UUID', so baseline is 3. The description adds meaning by indicating the traversal starts from a report node, which clarifies what kind of UUID should be supplied. This is a useful supplement to the schema, though it does not give detailed instructions on locating the nodeId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and resource ('other components/pages a bug group touches'), and clarifies the mechanism ('knowledge-graph traversal from the report node'). It also distinguishes itself from sibling tools by naming get_knowledge_graph and analyze_codebase_impact as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use before dispatch_fix to scope a change safely.' It also names alternatives with their distinguishing conditions: get_knowledge_graph for arbitrary seeds and analyze_codebase_impact for file-level import impact. This gives an agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fix_contextFix context bundleARead-onlyIdempotentInspect
Bundle everything an agent needs to fix one bug in a single call: a paste-ready fixPrompt (plain-English diagnosis + reproduction + suggested fix + relevant code + blast radius), plus report detail, repro steps, component, root cause, ontology tags, and the inventory action (with its expected_outcome contract) the report is filed against. Returns { report, fixPrompt, reproductionSteps, component, rootCause, bugOntologyTags, inventoryAction }. Read-only; no second LLM key needed. Use before writing a fix; use triage_issue for a multi-report review packet, or suggest_fix for just the Stage-2 hint.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID to fix (`report_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes | |
| component | Yes | Component or page the bug was attributed to |
| fixPrompt | Yes | Paste-ready fix prompt composed server-side, or null |
| rootCause | Yes | Stage-2 root cause, or null before Stage 2 runs |
| bugOntologyTags | Yes | Bug ontology tags, or null |
| inventoryAction | Yes | The inventory action (with its expected_outcome contract) the report is filed against, or null |
| reproductionSteps | Yes | Reproduction steps recorded on the report ([] if none) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds valuable context beyond those: it is read-only, requires 'no second LLM key needed,' and explains that the fixPrompt is 'paste-ready' with a specific composition (diagnosis, reproduction, suggested fix, relevant code, blast radius). This goes beyond the annotations and schema by clarifying operational and content expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence earns its place: purpose, bundled contents, return shape, read-only/cost note, and usage routing. It is front-loaded with the core purpose and does not waste words on redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so the description does not need to explain return values in detail. It covers when to use the tool, what it returns conceptually, its read-only nature, the absence of a second LLM key requirement, and how to route to alternatives. For a read-only bundle tool with clear annotations, this description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both reportId and projectId already described in the input schema. The description does not add substantial parameter-specific semantics beyond what the schema provides; it mentions report detail and project context only implicitly. With full schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Bundle everything an agent needs to fix one bug in a single call') and enumerates the bundled contents, the exact return fields, and the tool's relationship to siblings. It distinguishes itself from triage_issue and suggest_fix by naming what each alternative is for, so an agent can select the right tool without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use before writing a fix' and then names concrete alternatives with their specific scopes ('use triage_issue for a multi-report review packet, or suggest_fix for just the Stage-2 hint'). This directly tells the agent when to use this tool versus its closest siblings, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fix_timelineFix timelineARead-onlyIdempotentInspect
Return the ordered lifecycle of one fix attempt: dispatched, started, branch, commit, PR opened, CI, completed/failed, with timestamps and the PR URL. Returns { events: [{ ts, stage, detail }] }. Read-only. Use to debug "why did this fix fail?" after dispatch_fix; use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description redundantly says 'Read-only.' It adds useful behavioral context beyond the annotations by describing the ordered stage lifecycle and the returned event structure. It does not contradict the annotations, and the safety profile is adequately covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the main purpose, and efficiently provides output shape plus usage guidance. The only minor waste is the standalone 'Read-only.' sentence, which merely repeats the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-fix-attempt tool with only two parameters, the description covers what an agent needs: the exact operation, the output shape, when to call it, and which sibling tools to use instead. No output schema exists, but the description provides the return shape directly, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents fixId and projectId, including accepted aliases. The description adds no new parameter-level semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Return'), a specific resource ('one fix attempt'), and the exact scope ('ordered lifecycle... dispatched, started, branch, commit, PR opened, CI, completed/failed'). It also distinguishes itself from get_report_timeline by explicitly limiting scope to a single fix attempt rather than the whole report thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is explicit when-to-use guidance ('Use to debug "why did this fix fail?" after dispatch_fix') and named alternatives with their purposes ('use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread'). This fully routes an agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graph_neighborhoodGraph neighborhoodARead-onlyIdempotentInspect
Return the BFS neighborhood around one graph node by id or label: { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4). Read-only. Tuned for "what touches this action?"; use get_knowledge_graph to traverse from a component seed, or get_graph_node for a single node's row.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | Yes | Starting graph node id or label to expand around (e.g. an inventory Action id or component name) | |
| depth | No | BFS hops to traverse outward. Default 2; clamped to a max of 4. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | Edges connecting the returned nodes |
| nodes | Yes | Graph nodes within the depth budget |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotence, and the description goes further by disclosing BFS traversal, a depth budget with default and max, and the returned node/edge structure. It doesn't over-explain beyond what an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the core output and depth behavior front-loaded before routing guidance. Every phrase adds either operational or selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers what it returns, how traversal depth works, when to use it, and which siblings handle adjacent cases. With an output schema and rich annotations present, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces that seed can be by id or label and mentions depth default/max, but those details are already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Return the BFS neighborhood around one graph node by id or label') and gives the exact return shape. It also explicitly positions itself against siblings like get_knowledge_graph and get_graph_node, so it's easy to tell apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use-case signal ('Tuned for "what touches this action?"') and names two alternatives with their distinct seeding conditions. This leaves no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graph_nodeGraph node detailARead-onlyIdempotentInspect
Fetch one knowledge-graph node row by id. Returns { node: { id, node_type, label, metadata } } including the v2 derived status on Action nodes (ok | stale | broken). Read-only. Use to inspect a single node's status; use get_graph_neighborhood to see what connects to it.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | The graph_nodes.id of the node to fetch (UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| node | Yes | Single graph_nodes row including metadata (Action nodes carry v2 status) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, and idempotent behavior, so the description only needs to add extra context. It adds the return shape and, notably, the v2 derived status on Action nodes (ok | stale | broken), which is useful behavioral information beyond the annotations. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The action is front-loaded, the return shape is compact, and the sibling distinction is placed at the end. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, a rich output schema, and annotations that already convey the safety profile, the description provides all the operational context an agent needs. It also routes to the relevant sibling tool, making the definition complete for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents nodeId as a UUID graph_nodes.id. The description merely repeats 'by id' and adds no additional parameter semantics beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a specific resource ('knowledge-graph node row'), and the lookup key ('by id'). It distinguishes itself from get_graph_neighborhood by clarifying this tool returns a single node's details rather than connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool to inspect a single node's status and directs the agent to get_graph_neighborhood for connectivity queries. This gives clear when-to-use and alternative guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inventoryInventory snapshotARead-onlyIdempotentInspect
Return the current inventory.yaml snapshot for a project: latest ingest, validation errors, and a per-action status summary. Returns { snapshot, validationErrors, actions: [{ id, status }] }. Requires the inventory_v2 plan. Read-only. Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only.' The description adds a non-obvious prerequisite ('Requires the inventory_v2 plan') and documents the return shape, which is especially valuable because there is no output schema. It does not detail all failure modes, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the core behavior, then add return shape, prerequisite, and sibling routing without waste. The structure makes the tool immediately scannable and actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one optional parameteramen and no output schema, the description provides the return structure, distinguishes from relevant siblings, and states the prerequisite. An agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage: projectId is fully described, including its default behavior and accepted alias. The description adds no new parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Return the current inventory.yaml snapshot' and gives the exact response shape. It also differentiates itself from sibling tools by naming diff_inventory and list_gate_findings and contrasting their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit selection guidance: 'Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.' It also states the prerequisite 'Requires the inventory_v2 plan,' which tells the agent when the tool is applicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_knowledge_graphKnowledge graph traversalARead-onlyIdempotentInspect
Traverse the knowledge graph from a seed component or page. Returns { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4 hops). Read-only. Use to see how a component connects to the rest of the app; use get_blast_radius for a bug's impact area, or get_graph_neighborhood for a tighter BFS around one node.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | Yes | Starting graph node id or human-readable label to traverse from | |
| depth | No | BFS hops outward from seed — clamped to 4 in the handler (default 2) |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | Edges connecting the returned nodes |
| nodes | Yes | Graph nodes within the depth budget |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces the read-only nature while adding behavioral context beyond annotations: the traversal respects a depth budget (default 2, max4 hops) and returns a specific nodes/edges structure. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short,front-loaded with purpose and output, and contains no fluff. The only slight redundancy is stating 'Read-only' when the annotations already declare readOnlyHint, and the return shape is already expressed by the output schema, but overall the structure is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only traversal tool with only one required parameter and a rich output schema, the description covers the key behavioral constraints (depth default/max), the intended usage, and the sibling differentiation. Nothing essential for an agent to correctly select and invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with seed and depth already documented. The description loosely reinforces these concepts by calling the seed a 'component or page' and mentioning the depth budget, but it does not add meaningful semantic details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Traverse the knowledge graph from a seed component or page.' It also names the return shape (nodes and edges) and explicitly differentiates from sibling tools by pointing to get_blast_radius and get_graph_neighborhood, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: 'Use to see how a component connects to the rest of the app.' It also names alternatives and their specific use cases: get_blast_radius for a bug's impact area and get_graph_neighborhood for a tighter BFS around one node.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mushi_docRead a Mushi docs pageARead-onlyIdempotentInspect
Fetch one official Mushi docs page as Markdown, by a url from search_mushi_docs or a route such as "/quickstart/mcp". Returns { title, url, markdown, truncated }; markdown is capped at 8,000 characters and says where to read the rest. Only indexed docs pages resolve. Read-only; works without an API key. Use after search_mushi_docs when an excerpt is not enough.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | A url from search_mushi_docs, or a docs route such as "/quickstart/mcp". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | Yes | |
| markdown | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds substantial behavioral context: the return shape ({ title, url, markdown, truncated }), the 8,000-character cap with a pointer to read more, the requirement that pages be indexed, and the note that no API key is needed. These details go beyond the annotations and are not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the core purpose and return format. Every sentence adds value: the input source, the return structure, the truncation behavior, the indexing caveat, and the usage timing. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with a detailed output schema and annotations covering safety, the description covers all necessary aspects: input source, output format, size limits, prerequites (indexed pages), authentication (no API key), and when to use. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the page parameter is described as 'A url from search_mushi_docs, or a docs route such as \"/quickstart/mcp\"'). The description adds a concrete example route and reinforces the two accepted input forms, which slightly enriches the schema but is largely redundant. Since coverage is high, baseline is 3, but the example and explicit mention of the search source push it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Fetch one official Mushi docs page as Markdown'. It also distinguishes from siblings by mentioning the source (url from search_mushi_docs) and the trigger condition ('Use after search_mushi_docs when an excerpt is not enough'). This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use after search_mushi_docs when an excerpt is not enough' directly names the sibling and the condition for selection. Also states the constraint 'Only indexed docs pages resolve', giving the agent a clear precondition. This is more than enough to route the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_reportsRecent bug reportsARead-onlyIdempotentInspect
List recent bug reports for a project, newest first. Returns { reports: [{ id, status, category, severity, summary, component, created_at, processing_error }], total }; includeRaw=true returns every list column instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Optional filters: status (new|classified|grouped|fixing|fixed|verified|reopened|dismissed|…), category (bug|slow|visual|confusing|other), severity (critical|high|medium|low), limit (default 20, max 100). Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reports to return (default 20, max 100) | |
| status | No | Filter by status. "new" also matches queued rows; "classified" and "fixed" include legacy aliases. | |
| category | No | Filter by category. | |
| severity | No | Filter by severity. | |
| projectId | No | Project UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.) | |
| includeRaw | No | Return every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| reports | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint=true, idempotentHint=true, the description adds important behavioral context: it promises newest-first ordering, discloses that includeRaw=true changes the returned columns, and states that reporter identifiers are never returned. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose and return shape, followed by filters and routing guidance. It earns its length because it packs meaningful details (never returns reporter IDs, includeRaw behavior, limit defaults), but a sentence or two could be trimmed since some filter details duplicate the schema enums.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering read-only/idempotent safety, the description still supplies what an agent needs: ordering, optional filters, limit bounds, includeRaw semantics, the never-returned reporter data, and routing to siblings. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters thoroughly, including enums and aliases. The description itself repeats some filter details (status/category/severity enums, limit defaults) and adds the note that reporter identifiers are never returned—useful but not a major compensation need. Baseline 3 is exceeded slightly because the description reinforces the key filter semantics and the default/max limit, but it also largely duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List recent bug reports for a project, newest first'), specifies the return shape, and distinguishes itself from siblings by naming alternatives (get_report_detail, search_reports). The scope (project, newest first) is clear, and the presence of filters reinforces its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.' This provides clear when-to-use guidance and names alternatives, which is exactly what the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_detailReport detailARead-onlyIdempotentInspect
Fetch the full record for one bug report by id: description, console logs, network requests, screenshot URL, classification (stage 1/2), fix history, the paste-ready fix packet and the inventory action it is filed against. Returns { report } with the documented fields; includeRaw=true returns every column the detail route has instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Read-only. Use when you have a reportId and need everything about it; for evidence only use get_report_evidence, for the activity thread use get_report_timeline, for a one-call fix bundle use get_fix_context.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID (`report_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) | |
| includeRaw | No | Return every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, and the description adds valuable behavioral context: reporter identifiers are never returned, includeRaw=true returns every column instead, and the response is wrapped in { report }. These details go well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, content list, response shape, privacy note, read-only statement, usage scenario, and sibling alternatives. It is dense but not bloated, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the full input schema, output schema, and annotations, this description covers what is returned, what is redacted, the alternative includeRaw mode, and when to choose sibling tools. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a description including accepted aliases. The tool description mentions includeRaw's effect but does not add significant new parameter semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific verb 'Fetch' with a specific resource 'the full record for one bug report by id' and enumerates its contents. It distinguishes itself from siblings by naming which tool to use for evidence, timeline, and fix bundle alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you have a reportId and need everything about it' and gives conditional routing to get_report_evidence, get_report_timeline, and get_fix_context. This is textbook when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_evidenceBug report evidenceARead-onlyIdempotentInspect
Return the full evidence package for a single bug report covering all three observability pillars: (1) LOGS — console_logs (error/warn/info/debug entries with timestamps), breadcrumbs (SDK ring buffer: navigation, clicks, network, lifecycle events with category/level), repro_timeline (merged SDK event stream: route/click/request/log/screen), and the reporter's own comments thread; (2) TRACES — network_requests (SDK-captured fetch/XHR with method/status/duration/traceId), backend_spans (server-side spans joined by W3C trace_id: name/duration_ms/parentSpanId/status), and Sentry trace correlation IDs (sentry_trace_id, sentry_event_id) for deeplinks; (3) METRICS — performance_metrics (Web Vitals snapshot: LCP/CLS/INP/TTFB/FCP + INP attribution + page timing + connection info), anomalies (statistical provenance when auto-filed by CI metric regression: baseline_mean/std, score in σ, threshold); plus screenshot_url, browser environment (user agent, URL, viewport, SDK version), and tags. Reporter identifiers (session id, end-user id) are never returned. This is the same data an engineer would collect for a root-cause investigation. Faster than calling get_report_detail + report timeline separately.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID. (`report_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds valuable behavioral disclosure beyond those hints: reporter identifiers (session id, end-user id) are never returned, and the evidence package is explicitly scoped to a single bug report. This is meaningful context about what the tool will and will not surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place: it needs the detail because there is no output schema and the return payload spans many categories. The content is front-loaded with the core purpose, then organized by pillar with numbered subsections, making it easy for an agent to scan. The final comparison to get_report_detail plus report timeline is a useful, non-redundant closing note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining the return value, and it does so thoroughly: it lists logs, traces, metrics, screenshot, browser environment, tags, and explicitly states what is excluded. It also gives the relationship to sibling tools and the efficiency benefit. An agent has enough information to call the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the reportId parameter is documented as 'Report UUID. (`report_id` is accepted too.)'. The description does not add much beyond this, though it reinforces that the parameter selects a single bug report. Since the schema already carries the parameter meaning, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the full evidence package for a single bug report.' It enumerates exactly which data is included across logs, traces, and metrics, and explicitly distinguishes itself from get_report_detail and get_report_timeline. This makes it immediately clear what this tool does and how it relates to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it returns the data an engineer would collect for root-cause investigation, and it is faster than calling get_report_detail and report timeline separately. It names alternatives and positions this tool as their combined, faster replacement, but it does not explicitly state when-not-to-use it or compare it with more decision-oriented siblings like get_fix_context or suggest_fix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_timelineUnified report timelineARead-onlyIdempotentInspect
Return the ordered activity timeline for one report (oldest to newest), merging reporter comments, fix events, QA runs, skill-pipeline steps, and Ask Mushi turns into one lane. Returns { events: [{ ts, kind, actor, summary }] }. Read-only. Use to see what happened end-to-end on a report thread; use get_report_detail for the static record or get_fix_timeline to debug one fix attempt.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID (`report_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint, openWorldHint, and idempotentHint. The description adds value by stating the ordering (oldest to newest), the merging behavior across multiple event streams, and the exact return shape. It does not mention potential rate limits or additional access constraints, but for a read-only getter this is sufficient context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose, return shape, and usage guidance. 'Read-only.' is redundant with the readOnlyHint annotation, which is a minor waste. Otherwise every sentence earns its place and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description includes a concrete return shape, names the sibling tools for contrast, and clarifies ordering and merge scope. With only one parameter and annotations covering safety/idempotency, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter description already explains that reportId is the report UUID and accepts report_id. The tool description adds no extra parameter-level semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and resource ('ordered activity timeline for one report'), enumerates the merged event kinds, and explicitly distinguishes itself from get_report_detail and get_fix_timeline. An agent can unambiguously identify what this tool does and when to use it over siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use for an end-to-end view of a report thread, with named alternatives get_report_detail for the static record and get_fix_timeline for debugging a single fix attempt. This is a model of when-to-use/when-not-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_similar_bugsSimilar bugsARead-onlyIdempotentInspect
Find existing bugs similar to a component, page, or description via pgvector nearest-neighbour search (same backend as search_reports, tuned for "have we seen this before?"). Returns ranked { reports: [{ id, summary, similarity }] }. Read-only. Use to dedupe before filing or group regressions; use search_reports for general free-text search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 5, max 20) | |
| query | Yes | Component name, page path, or bug description |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds useful behavioral context beyond those: it explains the retrieval technique (pgvector nearest-neighbour), the tuning intent, and the ranked return shape. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose is front-loaded, return format is summarized, and usage/alternative guidance closes it out. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with an output schema, the description covers what it does, what it returns, when to use it, and how it differs from search_reports. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents query as 'Component name, page path, or bug description' and limit with default/max. The description mostly restates this information without adding new parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find existing bugs similar to...') and names the underlying mechanism (pgvector nearest-neighbour search). It also distinguishes itself from the sibling search_reports by noting it is 'tuned for "have we seen this before?"'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use to dedupe before filing or group regressions; use search_reports for general free-text search.' This tells the agent exactly when to choose this tool versus the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_two_way_comms_healthTwo-way communication healthARead-onlyIdempotentInspect
Summarize SDK ↔ admin two-way reporter health for a host app: last SDK heartbeat, app version/platform last seen, unread reporter messages, recent reporter replies, and pending QA/TDD follow-ups. Use after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds behavioral context by listing what the summary includes and the verification purpose (confirming two-way delivery), which helps the agent set expectations about output content beyond the generic annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence front-loads the core purpose and deliverables; the second provides the actionable usage context. Every phrase earns its place, and the key scope ('two-way') is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of explaining what the result contains—it does so by naming all key fields. It also supplies the integration scenario and verification goal, which is sufficient for an agent to correctly invoke and use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the input schema confirms this with 100% coverage. Per calibration, a baseline of 4 applies for zero-parameter tools. The description adds no unnecessary parameter guidance, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Summarize') and resource ('SDK ↔ admin two-way reporter health for a host app'), then enumerates the exact data points covered. This makes it clearly distinguishable from siblings like get_recent_reports or reply_to_reporter, which focus on one side of the communication flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.' This gives a clear temporal and functional context, though it does not name alternatives or explicitly say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_byok_keysList your API key poolARead-onlyIdempotentInspect
List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at }] } plus read-only { legacyKeys } metadata for credentials saved before the pooled lifecycle — never the raw secret. Read-only. Use to see which keys are validated, active, pending, legacy, or rate-limited; use add_byok_key to add one.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it states the return shape (pooled keys plus legacyKeys metadata), explicitly says 'never the raw secret', and clarifies that legacyKeys are read-only metadata for pre-pooled credentials. This is meaningful additional transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the core action and grouping first, then the return shape, then the safety note, then usage guidance and the sibling alternative. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one documented parameter and no output schema, the description is nearly complete. It explains the return structure, the safety property (no raw secrets), and the usage context. The only minor gap is that it doesn't describe pagination or ordering, but for a list of pooled keys this is a small omission given the annotations already cover safety and idempotency.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single parameter (projectId). The description doesn't add parameter-level detail beyond what the schema provides, but it does clarify the overall return semantics. Baseline 3 is appropriate when the schema carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('the project's BYOK API keys'), and a grouping dimension ('by provider'), naming the exact providers. It also distinguishes itself from siblings by explicitly pointing to add_byok_key as the tool for adding keys, so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('Use to see which keys are validated, active, pending, legacy, or rate-limited') and names the alternative for a different action ('use add_byok_key to add one'). This is clear context with an explicit exclusion and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gate_findingsGate findingsARead-onlyIdempotentInspect
List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, … }], findings: [{ severity, rule_id, message, file_path, node_id, … }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health) or finding severity (info | warn | error). Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| gate | No | Only runs of this gate (and their findings). | |
| severity | No | Only findings with exactly this severity. | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | Recent gate_runs rows, newest first |
| findings | Yes | gate_findings rows for those runs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and openWorldHint, so the description doesn't need to re-derive safety. It adds value by disclosing the newest-first ordering, the returned runs/findings shape, and the available gate/severity filters. The explicit 'Read-only' line is redundant with annotations but not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by the return shape, filters, and sibling routing. It is slightly dense because it repeats the full enum lists that the schema already provides, but every sentence carries functional value and it remains compact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with three optional, fully documented parameters and an output schema, the description covers purpose, ordering, return shape, filters, and alternatives. 'Recent' is not precisely bounded and pagination is not mentioned, but those are minor gaps given the output schema and annotation coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both gate and severity already carry enums and meaningful descriptions. The description restates the filter options and maps them to the conceptual purpose, but it doesn't add substantial meaning beyond the schema, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List recent inventory gate runs and their findings for a project, newest first.' It clearly differentiates the tool from siblings by explicitly naming diff_inventory and get_inventory as alternatives for different tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides direct usage guidance: 'Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.' This tells the agent exactly when to pick this tool over nearby alternatives, with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lessonsList project lessonsARead-onlyIdempotentInspect
List promoted learning rules ("lessons") for the current project, highest-frequency first. Returns { lessons: [{ id, rule_text, severity, frequency, anti_pattern, … }] }. Read-only. Use to browse the full catalog of encoded heuristics; use query_lessons to retrieve only lessons relevant to a specific diff or PR within a token budget.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max lessons to return (default 50, max 200) | |
| severity | No | Filter to one severity level | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| lessons | Yes | Promoted lesson rows ordered by frequency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, and the description reinforces 'Read-only'. Beyond that, it adds behavioral context about 'promoted' lessons and highest-frequency-first ordering. The return shape is mentioned but the output schema already covers it, so this is useful but not critical extra disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the purpose, output shape, read-only trait, and usage alternative with zero filler. The most decision-relevant information (what it lists and how it is ordered) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and fully documented parameters, nothing essential is missing. The description also supplies the key sibling-routing information, making it complete for an agent to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, severity, and projectId are already fully documented. The description adds minimal parameter-level meaning beyond confirming the 'current project' default, which is consistent with projectId. It does not need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (List), a specific resource (promoted learning rules/lessons for the current project), and a concrete behavior (highest-frequency first). It also distinguishes itself from query_lessons by describing the full-catalog browsing purpose, making it easy to tell apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('browse the full catalog of encoded heuristics') and when not to, naming query_lessons as the alternative for diff/PR-specific retrieval within a token budget. This gives clear routing guidance with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_fixMerge fix PRADestructiveIdempotentInspect
Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive and irreversible from Mushi's side — once GitHub merges into the target repo's default branch there is no unmerge endpoint, only a manual revert PR outside this tool. Idempotent — re-running an already-merged attempt is a safe no-op. Prerequisite: CI green (check with refresh_ci); confirm the diff and CI status with the user before calling on a PR you have not reviewed. Use to ship a fix opened by dispatch_fix; use transition_status to change state without merging.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | Fix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.) | |
| mergeMethod | No | GitHub merge method (default squash) |
Output Schema
| Name | Required | Description |
|---|---|---|
| sha | No | Merge commit SHA, when GitHub reported one |
| merged | No | True when GitHub accepted the merge in this call |
| reportId | Yes | Report UUID linked to this fix attempt |
| justMerged | No | True when this call performed the merge |
| reportStatus | Yes | Report workflow status after merge bookkeeping |
| alreadyMerged | No | True when the PR was already merged (idempotent no-op) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already say destructiveHint=true and idempotentHint=true, but the description goes further by explaining that the action is irreversible from Mushi's side, that GitHub has no unmerge endpoint, that a revert would require a manual PR, and that re-running on an already-merged attempt is a safe no-op. This substantially enriches the annotation signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: outcome, return shape, destructiveness, idempotence, prerequisite, and sibling routing. It is front-loaded with the core action and return value before safety context, and no filler or redundant restatement appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and a description covering irreversibility, idempotence, prerequisites, and alternatives, an agent has everything needed to decide whether and when to call this tool. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents fixId and mergeMethod, including the accepted alias fix_id and the default merge method. The description adds little parameter-level detail beyond aligning with the squash default, which is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: squash-merge the GitHub PR for a fix attempt, then mark the report fixed and notify the reporter. It also names sibling tools dispatch_fix and transition_status, so an agent can distinguish shipping a fix from dispatching one or changing status without merging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use to ship a fix opened by dispatch_fix.' It also states the alternative ('use transition_status to change state without merging') and a hard prerequisite: CI must be green, checked via refresh_ci, and the agent must confirm the diff and CI status with the user before merging an unreviewed PR.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_lessonsQuery lessons for diff contextARead-onlyIdempotentInspect
Retrieve the learning rules ("lessons") most relevant to a given code diff or PR context, packed within a token budget. Uses bi-encoder retrieval + severity-weighted scoring; pass the diff/description as diffText and a maxTokens budget (default 3000). Returns ranked { lessons: [{ title, rule, severity }] }. Read-only. Use before writing a fix or opening a PR; use list_lessons to browse all lessons unfiltered.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.) | |
| diffText | Yes | The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.) | |
| maxTokens | No | Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.) | |
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is well covered. The description adds non-obvious behavior: bi-encoder retrieval, severity-weighted scoring, and token-budget packing, which are valuable beyond annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load purpose, then mechanics, then usage guidance. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only retrieval tool: it states the return shape ({ lessons: [...] }), usage context, and distinguishes from sibling list_lessons. With full schema coverage and safety annotations, no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description mentions diffText and maxTokens defaults but those details already exist in the schema; no new parameter meaning is added beyond what the schema descriptors provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('retrieve'), resource ('learning rules/lessons'), and context ('code diff or PR'). The description explicitly contrasts with list_lessons, naming what it is not and making sibling differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use before writing a fix or opening a PR'. It also names the alternative list_lessons for browsing all lessons unfiltered, providing a clear decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_ciRefresh fix CI statusAIdempotentInspect
Re-poll GitHub for the latest check-run status of a fix attempt's PR and persist it on the fix_attempt row (does not merge or mutate GitHub). Returns { check_run_status, check_run_conclusion, check_run_updated_at }. Write; idempotent. Use right before merge_fix to confirm CI is green; use get_fix_timeline for the full attempt lifecycle.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | Fix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| check_run_status | Yes | GitHub check run status after refresh |
| check_run_conclusion | Yes | success | failure | neutral | null while pending |
| check_run_updated_at | Yes | ISO timestamp when CI status was last persisted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds behavioral value by explaining that the write is a local persistence on the fix_attempt row and explicitly denies any external GitHub mutation, which is important context beyond the annotation booleans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the main behavior, then states side effects, return value, and usage guidance, making it easy to scan and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, idempotent write operation with rich annotations, an output schema, and explicit sibling routing, the description covers everything needed to invoke it correctly. It communicates the write target, the external side-effect boundary, the return shape, and the recommended usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%, so the schema fully documents fixId, including the accepted alias fix_id. The description reinforces that the parameter refers to the fix attempt whose PR check-runs should be re-polled, but adds no new semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: re-poll GitHub for a fix attempt's PR check-run status and persist it on the fix_attempt row. It also explicitly differentiates itself from related tools by clarifying it does not merge or mutate GitHub, making it easy to distinguish from merge_fix and get_fix_timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use it right before merge_fix to confirm CI is green, and use get_fix_timeline when the full attempt lifecycle is needed. It also lists an exclusion, stating it does not merge or mutate GitHub, which prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_byok_keyRemove an API keyADestructiveIdempotentInspect
Permanently remove one pooled BYOK credential by key id from the authenticated project, including its Vault secret. Write; destructive; idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| keyId | Yes | Pooled BYOK key UUID from list_byok_keys | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds that it removes 'including its Vault secret', providing context on what gets destroyed beyond the annotation. It also states 'Permanently remove', reinforcing the irreversibility. This adds value beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with high information density. It front-loads the destructive and idempotent nature, and the scope. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema fully describes parameters, annotations cover safety, and no output schema exists, the description adequately covers what the tool does and its consequences. It doesn't mention prerequisites (e.g., authentication) but those are implied by 'authenticated project'. It is complete for a destructive mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description doesn't add meaning beyond the schema, except that 'keyId' is a pooled BYOK key UUID from list_byok_keys (already in schema). Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('remove'), a precise resource ('pooled BYOK credential by key id'), and the scope ('from the authenticated project'). It clearly distinguishes from siblings like add_byok_key and test_byok_key by naming the operation and the destructive nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly labels the operation as destructive and idempotent, and mentions it removes a BYOK credential. However, it does not explicitly state when not to use it (e.g., when a key is still in use) or name alternatives. The clear destructive label provides sufficient guidance for an agent to avoid misuse, but not full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reopen_reportReopen report (operator)AIdempotentInspect
Move a previously fixed/verified/dismissed report back to the reopened state for regression review, recording an operator note. Returns { report } with status=reopened. Write; idempotent — reopening an already-reopened report is a no-op. Use when a reporter says "still broken" after a fix shipped; use transition_status for any other state change.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Operator note recorded on the reopen transition | |
| reportId | Yes | Report UUID to move back to reopened status (`report_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes | Updated report row with status=reopened |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior beyond annotations: 'Write; idempotent — reopening an already-reopened report is a no-op' and discloses return shape ({ report } with status=reopened). These details extend the idempotentHint and readOnlyHint annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy: the first states action and return, the second covers idempotency and usage guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety/idempotency, the description supplies the trigger, the alternative, the affected states, the return, and the idempotency behavior. Nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description confirms reportId as UUID and note as operator note, but adds no format or constraint details beyond the schema. The 'previously fixed/verified/dismissed' context implicitly constrains the report state, but that is resource-level context, not parameter-level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'Move a previously fixed/verified/dismissed report back to the reopened state for regression review.' Explicitly names the sibling tool 'transition_status' for any other state change, making differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger condition ('when a reporter says "still broken" after a fix shipped') and an explicit alternative ('use transition_status for any other state change'). This is exactly the when/when-not guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reporterReply to a reporterAInspect
Send a visible message to the end-user who filed a bug report. The reply appears in the in-app Mushi widget as an admin comment and creates an unread notification badge so the reporter sees it immediately. Use this to answer questions, request reproduction steps, or confirm a fix — without leaving the Cursor IDE.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send to the reporter | |
| reportId | Yes | Report id to reply to (`report_id` is accepted too.) | |
| authorName | No | Display name for the admin sender (default: "Mushi Admin") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds behavioral detail: the reply is visible, appears as an admin comment in the in-app widget, and creates an unread notification badge. This goes beyond the annotations and helps the agent understand the side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first states the action and its visible effect; the second gives concrete usage scenarios. No redundant words, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with fully documented parameters and no output schema, the description covers the purpose, behavior, and usage. It could mention prerequisites (e.g., whether the report must be in a certain state), but that is minor and not critical for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all three parameters, each with clear explanations. The description does not add extra parameter-level meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Send a visible message to the end-user who filed a bug report') and resource, and distinguishes itself from sibling tools that handle report state (transition_status, reopen_report) or retrieval (get_report_detail). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases ('answer questions, request reproduction steps, or confirm a fix') and notes the benefit ('without leaving the Cursor IDE'). It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to select it over other report-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_nl_queryAsk your data (NL → SQL)ARead-onlyIdempotentInspect
Answer a natural-language question about your project data by generating and running a read-only SQL query (no privileged schemas, rate-limited to 60/hour). Returns { sql, rows }. Use for ad-hoc analytics ("which components had the most critical bugs this week?"); use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | Question in plain English, e.g. "Which components had the most critical bugs this week?" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds non-obvious behavioral context beyond those: no privileged schemas, a 60/hour rate limit, and a return shape of { sql, rows }. This helps the agent anticipate operational and safety constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first defines the operation, constraints, and return format; the second gives usage context and routes to alternatives. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, strong annotations, and absence of an output schema, the description is complete: it communicates purpose, constraints, return shape, rate limit, and alternative tools. An agent has enough information to decide whether and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single required parameter is fully described with an example. The description reinforces the natural-language style and adds an example use case, but it does not add meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: answer a natural-language question by generating and running a read-only SQL query over project data. It clearly distinguishes itself from siblings by framing itself for ad-hoc analytics rather than report lookups or documentation searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for ad-hoc analytics' and names the alternatives: 'use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.' This gives an agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_mushi_docsSearch Mushi documentationARead-onlyIdempotentInspect
Search the official Mushi documentation (guides, MCP setup, inventory, QA, skills) by keyword — titles, section headings and summaries are indexed. Returns ranked { results: [{ title, url, excerpt, score }] }. Read-only; works without an API key. Use before guessing API shapes, tool names, or RPC names, then get_mushi_doc to read a page; use run_nl_query for questions about your own project data, not the docs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 8). | |
| query | Yes | Keywords to search official Mushi docs (guides, MCP, inventory, QA). |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and idempotentHint=true, and the description adds meaningful context beyond them: 'works without an API key', the indexing scope ('titles, section headings and summaries'), and the ranked result format. No contradiction with annotations; the added details improve the agent's expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every sentence earns its place—scope, returned shape, auth/read-only note, and sibling routing. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, an output schema, and strong annotations, the description covers everything an agent needs: what is searched, the return shape, auth requirements, and how to chain with get_mushi_doc or avoid using it for project data. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (query, limit) are already described in the input schema. The description adds only minor semantic value ('by keyword'), so a baseline 3 is appropriate since the schema already carries the parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search the official Mushi documentation' by keyword, and names the indexed content areas (guides, MCP setup, inventory, QA, skills). This clearly distinguishes it from siblings like get_mushi_doc (fetch a page) and search_reports (search bug reports).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it ('before guessing API shapes, tool names, or RPC names'), what to do next ('then get_mushi_doc to read a page'), and when not to ('use run_nl_query for questions about your own project data'). This is exemplary sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_reportsSearch reportsARead-onlyIdempotentInspect
Search reports by meaning and keyword (pgvector similarity server-side; falls back to summary/description substring if embeddings are unavailable). Returns ranked { results: [{ id, summary, similarity }] }. Read-only. Use to find reports by free text ("checkout flakiness"); use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10, max 50) | |
| query | Yes | Natural-language search text or component path | |
| threshold | No | Similarity threshold 0..1, default 0.2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent hints. The description adds real behavioral context beyond those: server-side pgvector similarity, a fallback to summary/description substring matching when embeddings are unavailable, and the ranked result shape. This is more than minimal, though it does not discuss rate limits or auth—minor given the tool's read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly constructed sentences front-load the mechanism and result format, then move to usage guidance. Every sentence earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and 100% parameter schema coverage, the description still adds the essential behavioral twist (fallback) and explicit sibling routing. Nothing an agent needs to correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents query, limit, and threshold including defaults. The description reinforces that the query is free text or component path but adds no new parameter-specific detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search reports by meaning and keyword') and explicitly names sibling tools (get_similar_bugs, get_recent_reports) with contrasting use cases. An agent can immediately distinguish this from related search/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use to find reports by free text') and when-to-use-alternatives guidance ('use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query'). This fully answers the routing question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_fix_resultRecord a fix outcomeAInspect
Record a fix outcome from an external agent (e.g. your own Cursor/Claude run): branch, PR URL, files changed, lines added/removed. Creates a fix_attempt row then patches it to completed and links it to the report. Returns { fixAttemptId }. Write; NOT idempotent — each call creates a new fix_attempt, so call once per PR. Use after you opened a PR outside Mushi; use dispatch_fix to have Mushi open the PR instead, or merge_fix once CI is green.
| Name | Required | Description | Default |
|---|---|---|---|
| prUrl | No | GitHub pull request URL, if a PR was opened (`pr_url` is accepted too.) | |
| branch | Yes | Git branch name where the fix was implemented | |
| summary | Yes | One-line human summary of what the fix changed | |
| reportId | Yes | Report UUID to attach this external fix attempt to (`report_id` is accepted too.) | |
| filesChanged | Yes | Repo-relative paths modified by the fix | |
| linesChanged | Yes | Total lines added + removed across filesChanged | |
| idempotencyKey | No | Optional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the fix_attempt row was created and marked completed |
| fixId | Yes | UUID of the new fix_attempt row |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals internal behavior beyond annotations: it creates a fix_attempt row, patches it to completed, links it to the report, and returns a fixAttemptId. It explicitly flags the write nature and non-idempotence, and explains the idempotency key mechanism and its default derivation. This goes well beyond the annotation hints and gives the agent a realistic model of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and packs essential usage guidance and behavioral context into a compact space. No filler or redundant phrasing; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and a required output, the description covers the invocation trigger, the side effects, the return value, idempotency caveats, and sibling alternatives. Combined with a fully described schema and an output schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with detailed descriptions for every parameter, including the nuanced idempotencyKey behavior. The description merely lists field names without adding new semantic meaning; it reinforces the overall purpose but does not clarify any parameter beyond what the schema already provides. Baseline 3 applies since the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Record') and resource ('fix outcome from an external agent'), lists the exact fields involved (branch, PR URL, files changed, lines added/removed), and immediately distinguishes it from sibling tools by naming dispatch_fix and merge_fix as alternatives. This leaves no ambiguity about what the tool does and how it differs from related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit condition for use: 'Use after you opened a PR outside Mushi.' It then states clear alternatives: 'use dispatch_fix to have Mushi open the PR instead, or merge_fix once CI is green.' It also adds a critical usage warning about idempotency ('call once per PR'), which is exactly the kind of guidance an agent needs to avoid mistakes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_fixSuggested fix (from triage)ARead-onlyIdempotentInspect
Return the Stage-2 suggested-fix slice for one report: root cause, suggested fix, repro steps, summary, and component — faster than get_report_detail when you only need the human-readable hint. Returns { reportId, rootCause, suggestedFix, reproductionSteps, summary, component }. Read-only; reads the existing classification (run triage_issue first if unclassified). Use for a quick "what should we try?"; use get_fix_context for the full paste-ready bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present when no Stage-2 analysis exists — explains why and what to call instead |
| summary | Yes | One-line report summary, or null |
| reportId | Yes | The report this slice was read from |
| component | Yes | Component/page the bug was attributed to, or null |
| rootCause | Yes | Stage-2 root-cause hint, or null if not yet classified |
| suggestedFix | Yes | Stage-2 suggested fix, or null if not yet classified |
| reproductionSteps | Yes | Reproduction steps recorded on the report (array; [] if none) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces safety with 'Read-only' while adding useful behavioral context: it reads existing classification, is faster than get_report_detail, and requires prior triage for unclassified reports. It does not discuss error conditions, but the annotations carry much of the safety burden and the added precondition context is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover purpose, output shape, read-only safety, precondition, speed comparison, and alternative routing with zero filler. The most decision-relevant information is front-loaded: what the tool returns and when to choose it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with both an output schema and strong annotations, the description covers everything an agent needs to invoke it correctly: return shape, precondition, sibling differentiation, and use case. There is no apparent missing context that would lead to incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents reportId as a report UUID, and the tool description itself does not add much beyond the schema's own description. Schema coverage is 100%, so the baseline of 3 applies; the only slight addition is the field list returned, not a semantic augmentation of the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Return the Stage-2 suggested-fix slice for one report') and enumerates the exact fields returned, including rootCause, suggestedFix, reproductionSteps, summary, and component. It also distinguishes itself from sibling tools by naming get_report_detail and get_fix_context, so an agent can clearly tell when this tool is the right one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('when you only need the human-readable hint', 'for a quick "what should we try?"') and when-not-to-use guidance by routing to get_fix_context for a full paste-ready bundle. It also states a clear precondition: run triage_issue first if the report is unclassified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_byok_keyTest an API keyAIdempotentInspect
Re-test one pooled BYOK credential by key id. A successful provider probe activates the key; auth, quota, and network failures keep it out of the runtime pool. Returns the sanitized validation result and updated key metadata. Write; idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| keyId | Yes | Pooled BYOK key id | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: a successful provider probe activates the key, while auth, quota, and network failures keep it out of the runtime pool. It also states the return value is a sanitized validation result plus updated metadata, which is useful context. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core action in the first sentence. The trailing 'Write; idempotent' duplicates annotation flags and adds a small amount of redundancy, but it does not significantly detract from the overall clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two simple parameters and no output schema, the description fully covers what an agent needs to call the tool correctly: the action, the key ID targeting, success/failure behavior, and the return value. No essential contextual information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both keyId and projectId with 100% coverage, so the description is not required to add much. It only refers to 'by key id', which mirrors the schema's keyId description and adds no new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Re-test one pooled BYOK credential by key id', giving a specific verb, resource, and scope. It clearly distinguishes this from sibling tools like add_byok_key, remove_byok_key, and list_byok_keys by focusing on the testing/activation action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Re-test one pooled BYOK credential' implies the tool is for existing pooled keys, and the outcome descriptions offer behavioral context. However, it never explicitly states when to prefer this over siblings such as add_byok_key or activation_status, and it provides no exclusionary or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_gen_from_reportGenerate Playwright test from reportAInspect
Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { qaStoryId, prUrl }. Write; consumes LLM budget; NOT idempotent — each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to turn into a Playwright PR (`report_id` is accepted too.) | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, and the description adds important context beyond that: it consumes LLM budget, is NOT idempotent, and each call opens a new PR. It also discloses the return shape ({ qaStoryId, prUrl }). This is meaningful behavioral disclosure that goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the action, the prerequisites, the return value, the side effects, and the alternative in three sentences. Every sentence earns its place, and the most important behavioral warnings (consumes LLM budget, not idempotent) are placed before the usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with no output schema, the description covers the key facts an agent needs: what it does, what it requires, what it returns, and how it differs from the sibling. It doesn't describe the PR contents or failure modes, but the annotations plus description cover the critical operational context. A 4 is appropriate because it's complete enough for correct invocation, with minor gaps around error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds a small amount of value by noting that reportId is the input to turn into a PR and that projectId defaults to the configured project, but it doesn't add substantial meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Generate'), a resource ('Playwright regression test from a classified report'), and a concrete outcome ('open a draft GitHub PR with the spec'). It also distinguishes itself from the sibling generate_tdd_from_story by naming the alternative and its different input source, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('Use to lock in a regression as an E2E test') and names the alternative ('use generate_tdd_from_story to build a test from a mapped user story instead'). It also states prerequisites (inventory_v2 plan, GitHub and LLM keys configured), which is clear context for when the tool is applicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transition_statusMove report between statesADestructiveIdempotentInspect
Move a report to a new workflow state, enforcing the same transition rules as the admin UI. Valid targets: classified, grouped, fixing, fixed, verified, reopened, dismissed. Returns { report } with the updated status. Write; idempotent (setting the current status is a no-op); rejects illegal transitions. Use to dismiss a duplicate or mark fixed; use merge_fix to mark fixed via a merged PR, or reopen_report for the reopened path.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Reason for the transition (audit trail) | |
| status | Yes | Target status (resolved is stored as fixed) | |
| reportId | Yes | Report UUID (`report_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint and readOnlyHint, but the description adds value by stating it is a write operation, idempotent (no-op on current status), rejects illegal transitions, and returns the updated report object. This goes beyond the annotation hints and clarifies behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences pack purpose, valid targets, return shape, idempotency, rejection behavior, and usage guidance without waste. The critical constraint (valid targets) is front-loaded, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 params, 2 required, and no output schema, the description covers all essentials: what it does, what targets are allowed, return format, idempotency, rejection, and how it relates to siblings. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds critical semantic info: the valid targets are limited to 7 statuses, even though the schema enum lists 11. This restricts usage and clarifies the transition rules. It also reinforces that 'resolved' is stored as 'fixed' via the schema, and the description's explicit list is essential for correct parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (move) and resource (report) with a clear goal: changing workflow state. It lists valid targets and distinguishes itself from sibling tools merge_fix and reopen_report by naming them, making the purpose unambiguous and differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool ('to dismiss a duplicate or mark fixed') and when to use alternatives (merge_fix for merged PR, reopen_report for reopened path). Also mentions enforcing same transition rules as admin UI, giving clear context for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_issueTriage issue end-to-endARead-onlyIdempotentInspect
Read-only combined tool: merges report detail, the reporter thread, similar bugs (matched on the report summary), the fix context (paste-ready fix prompt, repro steps, root cause), the blast radius of the inventory action the report is filed against, and recent pipeline warnings into a single structured review packet. Returns the packet plus prioritised recommended_actions, partial_errors for any source that failed, and notes for any source that does not apply (e.g. no blast radius when the report is not anchored to an inventory action). Equivalent to a Sentry "Analyze with Seer" flow grounded in user-felt reports. Pass reportId to kick off review. Call this before dispatch_fix.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to triage. (`report_id` is accepted too.) | |
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) | |
| includeLogs | No | Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | Sources that do not apply to this report, and why |
| report | Yes | The report (documented fields, no reporter identifiers), or the error reading it |
| status | Yes | Workflow status, or unknown |
| category | Yes | bug | slow | visual | confusing | other, or unknown |
| severity | Yes | critical | high | medium | low, or unknown when the report could not be read |
| report_id | Yes | The triaged report UUID |
| fix_context | Yes | Fix-context slice, as get_fix_context returns it |
| recent_logs | Yes | Recent warn+ pipeline log entries for the project, or null |
| blast_radius | Yes | Downstream nodes of the inventory action the report is filed against, or null |
| similar_bugs | Yes | Up to five nearest reports by summary, excluding this one; null when not searched |
| partial_errors | Yes | Sources that failed, as "source: message" |
| triage_summary | Yes | One-line summary |
| reporter_thread | Yes | The unified report timeline (comments, fixes, QA), or null |
| recommended_actions | Yes | What to do next, most important first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavior beyond that: it discloses that the tool merges multiple sources, returns recommended_actions, reports partial_errors for failed sources, and includes notes for non-applicable sources. This gives an agent an accurate mental model of what actually happens when the tool runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than a simple one-liner but is information-dense and front-loaded with the core purpose. The Sentry 'Analyze with Seer' analogy is helpful but slightly optional; otherwise each clause earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, annotations, and presence of an output schema, the description is complete: it covers what sources are merged, what the returned packet contains, how failures/non-applicable sources are surfaced, and the intended call order before dispatch_fix. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents reportId, projectId, and includeLogs. The description only adds 'Pass reportId to kick off review', which restates what the schema already conveys, so it does not go beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: a 'read-only combined tool' that 'merges' six named sources into one 'structured review packet'. This clearly distinguishes it from the individual get_* siblings it aggregates, and the ordering hint 'Call this before dispatch_fix' anchors its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit sequencing guidance ('Call this before dispatch_fix') and strongly implies the use case: a combined review packet with recommended actions when analyzing a user-felt report. However, it does not explicitly say when to prefer this over calling the individual get_* tools, or explicitly list when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_next_stepsWhat should I work on now?ARead-onlyIdempotentInspect
Prioritised "do this next" list for the project: blocked auto-fixes first (with the unblock action), then in-flight fixes to shepherd to merge, then user-felt classified reports by severity, with robot/cron chores (dependency bumps) last. Returns { steps: [{ priority, action, reason, tool, args }], summary }. Read-only. Call this first when the user asks "what needs my attention / what should I triage or fix".
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID (defaults to the configured project). (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| steps | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, and open-world, and the description reinforces read-only while adding real behavioral context: the priority ordering, the output shape, and the fact that next-step actions carry tool/args. It could note that it only recommends actions rather than executing them, but the read-only hint implies this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry a lot of useful detail without redundant fluff, and the most important 'prioritised next list' concept is front-loaded. The priority categories are packed into a long first sentence, but it remains readable and each clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an entry-point planning tool, the description covers the priority algorithm, output schema, read-only safety, and the exact user query that should trigger it. With an output schema present and annotations covering safety/idempotency, nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single optional projectId parameter is fully documented in the schema (100% coverage), including the default behavior and project_id alias. The description adds no additional parameter-level meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clearly scoped verb-object: it returns a prioritised 'do this next' list for the project, with a defined ordering across blocked auto-fixes, in-flight fixes, reports, and chores. The trigger phrase 'Call this first when the user asks...' distinguishes it from siblings like triage_issue or get_recent_reports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use instruction: call first when the user asks what needs attention or what to triage/fix. It does not explicitly name alternatives or list when-not-to-use conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_judgeRun Sonnet-as-JudgeAIdempotentInspect
Queue the Sonnet-as-Judge to grade recent fix quality across accessible projects. Returns { dispatched: number } — one judge-batch job per project; scores land asynchronously in judge_results (read back with run_nl_query). Write; consumes LLM budget. Idempotent within a short window. Use before shipping to vet fix quality; use get_fix_timeline to inspect a single attempt instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reports to judge in this batch (default 25, max 100) | |
| projectId | No | Restrict to one project when the API key owns multiple (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| dispatched | Yes | Number of judge-batch jobs dispatched (one per accessible project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable context: it's a write operation that consumes LLM budget, idempotent only 'within a short window', and results land asynchronously in judge_results. This goes beyond the annotations by clarifying the asynchronous nature and budget consumption, though it does not detail failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the core action and then layering return type, side effects, idempotency, and usage guidance. It is dense but every sentence earns its place, though it could be slightly tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered. The description includes how to read results (via run_nl_query), mentions the asynchronous nature, and gives usage context. It lacks error handling or prerequisite details, but given the annotations and simplicity of the tool, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters have meaningful descriptions ('Max reports to judge', 'Restrict to one project'). The tool description adds no additional parameter guidance beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Queue', the resource 'Sonnet-as-Judge', and the purpose 'to grade recent fix quality across accessible projects'. It also differentiates from the sibling get_fix_timeline by naming it as an alternative for single-attempt inspection. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use it ('Use before shipping to vet fix quality') and when not to ('use get_fix_timeline to inspect a single attempt instead'). This provides clear decision rules without requiring the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_mushiMushi — where to startARead-onlyIdempotentInspect
CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use. Pass your intent as a short natural-language phrase ("fix the top bug", "check what I should work on", "run QA tests", "set up Mushi", …). Returns: (1) a curated list of the 5–12 tool names most relevant to that intent, (2) a one-paragraph orientation to the Mushi project and dashboard state, and (3) the single recommended first tool to call. Only tools this connection exposes are recommended; relevant tools hidden by the active feature groups are named with how to enable them. Avoids loading the full tool catalog into context when only a small subset is needed. Read-only; does not call any downstream tools itself.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | What you are trying to accomplish with Mushi, e.g. "fix the top bug", "check project health", "run QA tests", "set up Mushi". Leave blank for a general orientation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it explicitly says 'Read-only; does not call any downstream tools itself,' which is a meaningful guarantee for an agent deciding whether to invoke it. It also discloses that hidden tools are named with enablement instructions, which is a useful behavioral trait not visible in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical instruction ('CALL THIS FIRST'), then the return contract, then the scope constraint, then the safety note. Every sentence earns its place: the examples are compact, the return format is enumerated, and there is zero filler. It is appropriately sized for a tool that needs to orient an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only orientation tool with one optional parameter, no output schema, and no nested objects, the description is complete. It explains what the tool returns (three enumerated items), how to use it (intent phrase or blank), what it does not do (no downstream calls), and how it handles hidden tools. An agent has everything needed to invoke it correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'intent' parameter well. The description adds value by giving concrete example values ('fix the top bug', 'check what I should work on', 'run QA tests', 'set up Mushi') and clarifying that leaving it blank yields a general orientation. This goes beyond the schema's examples and clarifies the blank case, which is genuinely useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('CALL THIS FIRST'), a clear resource (Mushi project orientation), and a precise scope: it returns a curated list of 5–12 relevant tools, a one-paragraph orientation, and a single recommended first tool. It also explicitly distinguishes itself from the 40+ sibling tools by being the entry point when unsure which tool to use, so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use.' It also provides concrete example intents and states what it avoids (loading the full tool catalog), which implies when not to use it (when you already know the exact tool). This is strong routing guidance relative to the large sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
32 tool updates
v0.1.12- Changed
activation_status2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID (defaults to the configured project).", - "type": "string" -}
- Changed
add_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
diagnose_setup3 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Alias for project_id."New value: +"Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.)" - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID for dispatch checks (defaults to configured project).", - "type": "string" -} - added
Output schema / properties / mode / enumAdded value: +[ + "full", + "ingest", + "dispatch" +]
- Changed
diff_inventory1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
- Changed
dispatch_fix4 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Override the agent adapter"New value: +"Which agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent." - changed
Input schema / properties / agent / enumPrevious value: -[ - "claude_code", - "codex", - "rest_worker", - "mcp" -]New value: +[ + "auto", + "claude_code", + "codex", + "cursor_cloud", + "github_cloud_agent", + "rest_worker", + "rest_fix_worker", + "llm", + "mcp" +] - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to the configured project. (`project_id` is accepted too.)", + "type": "string" +} - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to fix"New value: +"Report UUID to fix (`report_id` is accepted too.)"
- Changed
get_fix_context15 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -} - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID to fix"New value: +"The report UUID to fix (`report_id` is accepted too.)" - added
Output schema / properties / bugOntologyTags / descriptionAdded value: +"Bug ontology tags, or null" - added
Output schema / properties / component / descriptionAdded value: +"Component or page the bug was attributed to" - added
Output schema / properties / component / typeAdded value: +[ + "string", + "null" +] - added
Output schema / properties / fixPrompt / descriptionAdded value: +"Paste-ready fix prompt composed server-side, or null" - added
Output schema / properties / inventoryActionAdded value: +{ + "description": "The inventory action (with its expected_outcome contract) the report is filed against, or null" +} - added
Output schema / properties / report / additionalPropertiesAdded value: +{} - added
Output schema / properties / report / propertiesAdded value: +{ + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / report / requiredAdded value: +[ + "id" +] - added
Output schema / properties / report / typeAdded value: +"object" - added
Output schema / properties / reproductionSteps / descriptionAdded value: +"Reproduction steps recorded on the report ([] if none)" - added
Output schema / properties / rootCause / descriptionAdded value: +"Stage-2 root cause, or null before Stage 2 runs" - changed
Output schema / requiredPrevious value: -[ - "report", - "fixPrompt", - "reproductionSteps", - "component", - "rootCause", - "bugOntologyTags" -]New value: +[ + "report", + "fixPrompt", + "reproductionSteps", + "component", + "rootCause", + "bugOntologyTags", + "inventoryAction" +]
- Changed
get_fix_timeline3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"fix_attempt UUID"New value: +"fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.)" - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -}
- Changed
get_inventory1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to the server-configured project when omitted"New value: +"Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)"
- Added
get_mushi_doc - Changed
get_recent_reports13 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter by category: bug, slow, visual, confusing, other"New value: +"Filter by category." - added
Input schema / properties / category / enumAdded value: +[ + "bug", + "slow", + "visual", + "confusing", + "other" +] - added
Input schema / properties / includeRawAdded value: +{ + "description": "Return every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)", + "type": "boolean" +} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — defaults to the server-configured project. Useful when you have multiple projects and want to query a specific one by its ID. Get IDs by calling list_projects or get_account_overview first.", - "type": "string" -} - changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity: critical, high, medium, low"New value: +"Filter by severity." - added
Input schema / properties / severity / enumAdded value: +[ + "critical", + "high", + "medium", + "low" +] - changed
Input schema / properties / status / descriptionPrevious value: -"Filter by status: new, classified, grouped, fixing, fixed, dismissed"New value: +"Filter by status. \"new\" also matches queued rows; \"classified\" and \"fixed\" include legacy aliases." - added
Input schema / properties / status / enumAdded value: +[ + "new", + "pending", + "submitted", + "queued", + "classified", + "grouped", + "fixing", + "fixed", + "dismissed", + "triaged", + "in_progress", + "resolved", + "verified", + "reopened" +] - added
Output schema / properties / reports / items / additionalPropertiesAdded value: +{} - added
Output schema / properties / reports / items / propertiesAdded value: +{ + "category": { + "type": [ + "string", + "null" + ] + }, + "component": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "severity": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / reports / items / requiredAdded value: +[ + "id" +] - added
Output schema / properties / reports / items / typeAdded value: +"object"
- Changed
get_report_detail8 fields changed- added
Input schema / properties / includeRawAdded value: +{ + "description": "Return every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)", + "type": "boolean" +} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -} - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)" - added
Output schema / properties / report / additionalPropertiesAdded value: +{} - added
Output schema / properties / report / propertiesAdded value: +{ + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / report / requiredAdded value: +[ + "id" +] - added
Output schema / properties / report / typeAdded value: +"object"
- Changed
get_report_evidence3 fields changed- added
Input schema / properties / reportIdAdded value: +{ + "description": "Report UUID. (`report_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / report_idRemoved value: -{ - "description": "Report UUID.", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "report_id" -]New value: +[ + "reportId" +]
- Changed
get_report_timeline1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
- Changed
list_byok_keys1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
list_gate_findings5 fields changed- changed
Input schema / properties / gate / descriptionPrevious value: -"Filter to one gate id: dead-handler | mock-leak | crawl | status-claim"New value: +"Only runs of this gate (and their findings)." - added
Input schema / properties / gate / enumAdded value: +[ + "dead_handler", + "mock_leak", + "api_contract", + "crawl", + "status_claim", + "spec_drift", + "orphan_endpoint", + "unknown_call", + "schema_drift", + "code_health" +] - changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)" - changed
Input schema / properties / severity / descriptionPrevious value: -"Minimum severity to include: low | medium | high | critical"New value: +"Only findings with exactly this severity." - added
Input schema / properties / severity / enumAdded value: +[ + "info", + "warn", + "error" +]
- Changed
list_lessons2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to configured project (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — defaults to configured project", - "type": "string" -}
- Changed
merge_fix3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID whose GitHub PR should be squash-merged"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.)" - added
Output schema / properties / justMergedAdded value: +{ + "description": "True when this call performed the merge", + "type": "boolean" +} - added
Output schema / properties / shaAdded value: +{ + "description": "Merge commit SHA, when GitHub reported one", + "type": [ + "string", + "null" + ] +}
- Changed
query_lessons9 fields changed- added
Input schema / properties / diffTextAdded value: +{ + "description": "The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / diff_textRemoved value: -{ - "description": "The PR diff, code snippet, or description of the change being made.", - "type": "string" -} - added
Input schema / properties / maxTokensAdded value: +{ + "description": "Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.)", + "type": "number" +} - removed
Input schema / properties / max_tokensRemoved value: -{ - "description": "Maximum tokens for returned lessons context (default 3000, max 8000).", - "type": "number" -} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID. Defaults to configured project.", - "type": "string" -} - added
Input schema / properties / topKAdded value: +{ + "description": "Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.)", + "type": "number" +} - removed
Input schema / properties / top_kRemoved value: -{ - "description": "Max number of lessons to return (default 15, max 50).", - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "diff_text" -]New value: +[ + "diffText" +]
- Changed
refresh_ci1 field changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID whose PR check-runs should be re-polled"New value: +"Fix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.)"
- Changed
remove_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
reopen_report1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to move back to reopened status"New value: +"Report UUID to move back to reopened status (`report_id` is accepted too.)"
- Changed
reply_to_reporter1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report id to reply to"New value: +"Report id to reply to (`report_id` is accepted too.)"
- Changed
search_mushi_docs3 fields changed- removed
Output schema / properties / results / items / properties / pathRemoved value: -{ - "type": "string" -} - added
Output schema / properties / results / items / properties / urlAdded value: +{ + "type": "string" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "title", - "path", - "excerpt", - "score" -]New value: +[ + "title", + "url", + "excerpt", + "score" +]
- Removed
setup_repo_for_mushi - Changed
submit_fix_result2 fields changed- changed
Input schema / properties / prUrl / descriptionPrevious value: -"GitHub pull request URL, if a PR was opened"New value: +"GitHub pull request URL, if a PR was opened (`pr_url` is accepted too.)" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to attach this external fix attempt to"New value: +"Report UUID to attach this external fix attempt to (`report_id` is accepted too.)"
- Changed
suggest_fix1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to read the Stage-2 suggested-fix slice for"New value: +"Report UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.)"
- Changed
test_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
test_gen_from_report2 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to turn into a Playwright PR"New value: +"Report UUID to turn into a Playwright PR (`report_id` is accepted too.)"
- Changed
transition_status1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID"New value: +"Report UUID (`report_id` is accepted too.)"
- Changed
triage_issue35 fields changed- added
Input schema / properties / includeLogsAdded value: +{ + "description": "Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.)", + "type": "boolean" +} - removed
Input schema / properties / include_logsRemoved value: -{ - "description": "Include recent pipeline logs in triage packet (default: true).", - "type": "boolean" -} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID. Defaults to configured project.", - "type": "string" -} - added
Input schema / properties / reportIdAdded value: +{ + "description": "Report UUID to triage. (`report_id` is accepted too.)", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - removed
Input schema / properties / report_idRemoved value: -{ - "description": "Report UUID to triage.", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "report_id" -]New value: +[ + "reportId" +] - changed
Output schema / properties / blast_radius / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "affected": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / blast_radius / descriptionAdded value: +"Downstream nodes of the inventory action the report is filed against, or null" - added
Output schema / properties / category / descriptionAdded value: +"bug | slow | visual | confusing | other, or unknown" - added
Output schema / properties / category / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / fix_context / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "bugOntologyTags": { + "description": "Bug ontology tags, or null" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "fixPrompt": { + "description": "Paste-ready fix prompt composed server-side, or null" + }, + "reproductionSteps": { + "description": "Reproduction steps recorded on the report ([] if none)" + }, + "rootCause": { + "description": "Stage-2 root cause, or null before Stage 2 runs" + } + }, + "required": [ + "fixPrompt", + "reproductionSteps", + "component", + "rootCause", + "bugOntologyTags" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / fix_context / descriptionAdded value: +"Fix-context slice, as get_fix_context returns it" - added
Output schema / properties / notesAdded value: +{ + "description": "Sources that do not apply to this report, and why", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / partial_errorsAdded value: +{ + "description": "Sources that failed, as \"source: message\"", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / recent_logs / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entries": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / recent_logs / descriptionAdded value: +"Recent warn+ pipeline log entries for the project, or null" - added
Output schema / properties / recommended_actions / descriptionAdded value: +"What to do next, most important first" - added
Output schema / properties / recommended_actions / items / additionalPropertiesAdded value: +false - added
Output schema / properties / recommended_actions / items / propertiesAdded value: +{ + "action": { + "type": "string" + }, + "args": { + "additionalProperties": {}, + "description": "Arguments for that tool", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "description": "Tool to call next", + "type": "string" + } +} - added
Output schema / properties / recommended_actions / items / requiredAdded value: +[ + "action", + "reason" +] - added
Output schema / properties / recommended_actions / items / typeAdded value: +"object" - added
Output schema / properties / report / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +] - added
Output schema / properties / report / descriptionAdded value: +"The report (documented fields, no reporter identifiers), or the error reading it" - added
Output schema / properties / report_id / descriptionAdded value: +"The triaged report UUID" - changed
Output schema / properties / reporter_thread / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "report_id": { + "type": "string" + }, + "timeline": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / reporter_thread / descriptionAdded value: +"The unified report timeline (comments, fixes, QA), or null" - added
Output schema / properties / severity / descriptionAdded value: +"critical | high | medium | low, or unknown when the report could not be read" - added
Output schema / properties / severity / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / similar_bugs / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "reportGroupId": { + "type": [ + "string", + "null" + ] + }, + "reportId": { + "type": "string" + }, + "similarity": { + "type": "number" + } + }, + "required": [ + "reportId", + "similarity" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / similar_bugs / descriptionAdded value: +"Up to five nearest reports by summary, excluding this one; null when not searched" - added
Output schema / properties / status / descriptionAdded value: +"Workflow status, or unknown" - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - added
Output schema / properties / triage_summary / descriptionAdded value: +"One-line summary" - changed
Output schema / requiredPrevious value: -[ - "report_id", - "severity", - "category", - "status", - "report", - "reporter_thread", - "similar_bugs", - "fix_context", - "blast_radius", - "recent_logs", - "recommended_actions", - "triage_summary" -]New value: +[ + "report_id", + "severity", + "category", + "status", + "partial_errors", + "notes", + "report", + "reporter_thread", + "similar_bugs", + "fix_context", + "blast_radius", + "recent_logs", + "recommended_actions", + "triage_summary" +]
- Changed
triage_next_steps2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID (defaults to the configured project).", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" -}
- Changed
trigger_judge1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Restrict to one project when the API key owns multiple"New value: +"Restrict to one project when the API key owns multiple (`project_id` is accepted too.)"
41 tool updates
v0.1.10- Changed
activation_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
add_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Added
check_sdk_version - Changed
diagnose_setup2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
diff_inventory1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
dispatch_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_blast_radius1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_fix_context2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_fix_timeline1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_graph_neighborhood2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_graph_node2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_inventory1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_knowledge_graph2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_recent_reports2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_detail2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_evidence1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_timeline1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_similar_bugs2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_two_way_comms_health1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_byok_keys1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_gate_findings2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_lessons2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
merge_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
query_lessons1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
refresh_ci8 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / check_run_conclusion / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_conclusion / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / check_run_status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / check_run_updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
remove_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
reopen_report2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
reply_to_reporter1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
run_nl_query1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_mushi_docs2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_reports2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
setup_repo_for_mushi1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
submit_fix_result2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
suggest_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
test_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
test_gen_from_report1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
transition_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
triage_issue2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
triage_next_steps2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
trigger_judge2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
use_mushi1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
4 tool updates
v0.1.9- Changed
submit_fix_result1 field changed- changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Optional UUID — resend the same key to safely retry without creating duplicate fix rows"New value: +"Optional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one."
- Changed
suggest_fix1 field changed- added
Output schema / properties / noteAdded value: +{ + "description": "Present when no Stage-2 analysis exists — explains why and what to call instead", + "type": "string" +}
- Changed
transition_status2 fields changed- changed
Input schema / properties / status / descriptionPrevious value: -"Target status"New value: +"Target status (resolved is stored as fixed)" - changed
Input schema / properties / status / enumPrevious value: -[ - "pending", - "classified", - "grouped", - "fixing", - "fixed", - "resolved", - "verified", - "reopened", - "dismissed" -]New value: +[ + "pending", + "classified", + "triaged", + "in_progress", + "grouped", + "fixing", + "fixed", + "resolved", + "verified", + "reopened", + "dismissed" +]
- Added
triage_next_steps
5 tool updates
v0.1.8- Added
add_byok_key - Added
list_byok_keys - Added
remove_byok_key - Added
test_byok_key - Added
use_mushi
60 tool updates
v0.1.2- Added
activation_status - Removed
add_byok_key - Removed
analyze_codebase_impact - Removed
analyze_wiki_knowledge - Removed
approve_qa_story - Removed
ask_codebase - Removed
award_bonus_points - Removed
checkin_pipeline_step - Removed
diagnose_connection - Changed
diagnose_setup1 field changed- added
Output schema / properties / connectionAdded value: +{}
- Added
diff_inventory - Removed
fix_suggest - Removed
generate_tdd_from_story - Removed
get_account_overview - Removed
get_activation_status - Removed
get_backend_health - Removed
get_codebase_domains - Removed
get_codebase_tour - Removed
get_file_summary - Added
get_graph_neighborhood - Added
get_graph_node - Added
get_inventory - Changed
get_knowledge_graph3 fields changed- changed
Input schema / properties / depth / descriptionPrevious value: -"Traversal depth (default 2, max 4)"New value: +"BFS hops outward from seed — clamped to 4 in the handler (default 2)" - changed
Input schema / properties / seed / descriptionPrevious value: -"Starting node id or label"New value: +"Starting graph node id or human-readable label to traverse from" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "edges": { + "description": "Edges connecting the returned nodes", + "items": {}, + "type": "array" + }, + "nodes": { + "description": "Graph nodes within the depth budget", + "items": {}, + "type": "array" + } + }, + "required": [ + "nodes", + "edges" + ], + "type": "object" +}
- Removed
get_map_run_status - Removed
get_pipeline_logs - Removed
get_pipeline_run - Removed
get_project_context - Removed
get_qa_story_run - Removed
get_reporter_thread - Removed
get_skill - Removed
get_usage - Removed
graph_neighborhood - Removed
graph_node_status - Removed
improve_qa_story - Removed
ingest_setup_check - Removed
inventory_diff - Removed
inventory_findings - Removed
inventory_get - Removed
list_byok_keys - Added
list_gate_findings - Changed
list_lessons4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max number of lessons to return (default 50, max 200)."New value: +"Max lessons to return (default 50, max 200)" - changed
Input schema / properties / project_id / descriptionPrevious value: -"Project UUID. Defaults to configured project."New value: +"Project UUID — defaults to configured project" - changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity level."New value: +"Filter to one severity level" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "lessons": { + "description": "Promoted lesson rows ordered by frequency", + "items": {}, + "type": "array" + } + }, + "required": [ + "lessons" + ], + "type": "object" +}
- Removed
list_pending_review_stories - Removed
list_projects - Removed
list_qa_story_runs - Removed
list_skills - Removed
list_top_contributors - Removed
map_user_stories - Changed
merge_fix3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged" - changed
Input schema / properties / mergeMethod / descriptionPrevious value: -"GitHub merge method"New value: +"GitHub merge method (default squash)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "alreadyMerged": { + "description": "True when the PR was already merged (idempotent no-op)", + "type": "boolean" + }, + "merged": { + "description": "True when GitHub accepted the merge in this call", + "type": "boolean" + }, + "reportId": { + "description": "Report UUID linked to this fix attempt", + "type": "string" + }, + "reportStatus": { + "description": "Report workflow status after merge bookkeeping", + "type": "string" + } + }, + "required": [ + "reportId", + "reportStatus" + ], + "type": "object" +}
- Changed
refresh_ci2 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose PR check-runs should be re-polled" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "check_run_conclusion": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "success | failure | neutral | null while pending" + }, + "check_run_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "GitHub check run status after refresh" + }, + "check_run_updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ISO timestamp when CI status was last persisted" + } + }, + "required": [ + "check_run_status", + "check_run_conclusion", + "check_run_updated_at" + ], + "type": "object" +}
- Changed
reopen_report3 fields changed- changed
Input schema / properties / note / descriptionPrevious value: -"Triage note"New value: +"Operator note recorded on the reopen transition" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID"New value: +"Report UUID to move back to reopened status" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "report": { + "description": "Updated report row with status=reopened" + } + }, + "required": [ + "report" + ], + "type": "object" +}
- Removed
run_fullstack_audit - Removed
run_qa_story - Removed
search_codebase - Removed
set_tier - Removed
setup_check - Removed
start_skill_pipeline - Changed
submit_fix_result7 fields changed- changed
Input schema / properties / branch / descriptionPrevious value: -"Git branch name"New value: +"Git branch name where the fix was implemented" - changed
Input schema / properties / filesChanged / descriptionPrevious value: -"Files modified"New value: +"Repo-relative paths modified by the fix" - changed
Input schema / properties / linesChanged / descriptionPrevious value: -"Total lines changed"New value: +"Total lines added + removed across filesChanged" - changed
Input schema / properties / prUrl / descriptionPrevious value: -"GitHub PR URL"New value: +"GitHub pull request URL, if a PR was opened" - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"Report UUID to attach this external fix attempt to" - changed
Input schema / properties / summary / descriptionPrevious value: -"Fix summary"New value: +"One-line human summary of what the fix changed" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "fixId": { + "description": "UUID of the new fix_attempt row", + "type": "string" + }, + "ok": { + "description": "True when the fix_attempt row was created and marked completed", + "type": "boolean" + } + }, + "required": [ + "ok", + "fixId" + ], + "type": "object" +}
- Added
suggest_fix - Removed
test_notification_channel - Changed
trigger_judge1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "dispatched": { + "description": "Number of judge-batch jobs dispatched (one per accessible project)", + "type": "number" + } + }, + "required": [ + "dispatched" + ], + "type": "object" +}
2 tool updates
v0.1.1- Changed
dispatch_fix2 fields changed- added
Input schema / properties / reportId / formatAdded value: +"uuid" - added
Input schema / properties / reportId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
triage_issue2 fields changed- added
Input schema / properties / report_id / formatAdded value: +"uuid" - added
Input schema / properties / report_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
72 tool updates
v0.1.0- First observed
add_byok_key - First observed
analyze_codebase_impact - First observed
analyze_wiki_knowledge - First observed
approve_qa_story - First observed
ask_codebase - First observed
award_bonus_points - First observed
checkin_pipeline_step - First observed
diagnose_connection - First observed
diagnose_setup - First observed
dispatch_fix - First observed
fix_suggest - First observed
generate_tdd_from_story - First observed
get_account_overview - First observed
get_activation_status - First observed
get_backend_health - First observed
get_blast_radius - First observed
get_codebase_domains - First observed
get_codebase_tour - First observed
get_file_summary - First observed
get_fix_context - First observed
get_fix_timeline - First observed
get_knowledge_graph - First observed
get_map_run_status - First observed
get_pipeline_logs - First observed
get_pipeline_run - First observed
get_project_context - First observed
get_qa_story_run - First observed
get_recent_reports - First observed
get_report_detail - First observed
get_report_evidence - First observed
get_report_timeline - First observed
get_reporter_thread - First observed
get_similar_bugs - First observed
get_skill - First observed
get_two_way_comms_health - First observed
get_usage - First observed
graph_neighborhood - First observed
graph_node_status - First observed
improve_qa_story - First observed
ingest_setup_check - First observed
inventory_diff - First observed
inventory_findings - First observed
inventory_get - First observed
list_byok_keys - First observed
list_lessons - First observed
list_pending_review_stories - First observed
list_projects - First observed
list_qa_story_runs - First observed
list_skills - First observed
list_top_contributors - First observed
map_user_stories - First observed
merge_fix - First observed
query_lessons - First observed
refresh_ci - First observed
reopen_report - First observed
reply_to_reporter - First observed
run_fullstack_audit - First observed
run_nl_query - First observed
run_qa_story - First observed
search_codebase - First observed
search_mushi_docs - First observed
search_reports - First observed
set_tier - First observed
setup_check - First observed
setup_repo_for_mushi - First observed
start_skill_pipeline - First observed
submit_fix_result - First observed
test_gen_from_report - First observed
test_notification_channel - First observed
transition_status - First observed
triage_issue - First observed
trigger_judge
TDQS
Scored across 41 tools
Most tools have clearly distinct purposes and the descriptions carefully cross-reference alternatives, but there are several overlapping retrieval surfaces: get_report_detail/get_report_evidence/get_fix_context/triage_issue all return similar report data, and search_reports/get_similar_bugs plus get_knowledge_graph/get_graph_neighborhood/get_blast_radius have fuzzy boundaries. An agent can pick correctly with careful reading, but misselection risk is real.
Tool names consistently follow a snake_case verb_noun pattern (get_, list_, search_, add_, merge_, etc.) across all categories. Even the catch-all use_mushi fits the verb-first convention and doesn't break the overall readability.
At 41 tools, the server is well beyond the 3-15 sweet spot and into 'too many' territory. While the tools span distinct subdomains (reports, fixes, knowledge graph, keys, docs, setup), the count forces agents to navigate a very large catalog, and several tools could plausibly be merged or hidden behind sub-resources.
The tool surface covers the core bug-report-to-fix lifecycle well: ingest visibility, triage, fix context, dispatch, CI polling, merging, status transitions, and QA test generation. Minor gaps exist—no lesson creation/editing, no direct report editing beyond status changes, and no way to update a fix attempt—but these are workable and not blocking for the main workflows.
Maintenance
Related MCP Connectors
Voice-powered bug reporting with 13 MCP tools. Record bugs by talking; let AI find and fix them.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
MCP-native AI SRE: ask what's broken in production, get a reviewed GitHub fix PR.
Package intelligence MCP for AI agents — 22 tools, 19 ecosystems, AGPL SDK, free.
Related MCP Servers
AlicenseAqualityAmaintenanceA remote Model Context Protocol server acting as middleware to the Sentry API, allowing AI assistants like Claude to access Sentry data and functionality through natural language interfaces.721 npm863MIT- AlicenseAqualityNot gradedmaintenanceA server that enables LLMs to interact with web pages through structured accessibility snapshots without needing screenshots or visually-tuned models.246,706,544 npm1-
- AlicenseBqualityAmaintenanceOpen source contribution manager — tracks PRs across repos, discovers contributable issues, diagnoses CI failures, and drafts maintainer responses. 21 MCP tools, 5 resources, 3 prompts. Ships as CLI, MCP server, and Claude Code plugin.2016MIT
- AlicenseBqualityAmaintenanceMarketplace where AI coding agents fix GitHub bugs for cash bounties. Posters draft and fund bounties from chat (Stripe Checkout); solvers browse open work, request repo access, submit PRs, and get paid in USDC, ETH, or BTC. 11 tools.27377 npm1MIT