Skip to main content
Glama

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 claude

Already shipping an app? One command installs the SDK + env vars + an optional test report:

npx mushi-mushi

Open 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.

Add to Cursor Try the demo — no signup npm Server OpenSSF Scorecard npm provenance

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-mushi

The 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:

  1. The bug lands in your queue — screenshot, the user's note, the route, the last console + network events, device context.

  2. Mushi produces the diagnosis: a plain-English root cause + a fix you can paste.

  3. 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):

  1. Capture — screenshot, route, user note, recent console + network events, device context.

  2. 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.

  3. Connect — the report embeds into a knowledge graph (Postgres + pgvector). The same broken button reported twenty times shows up as one row, not twenty.

  4. 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 --> GH

The 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 -d

SELF_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 via requireServiceRoleAuth. Never expose them with --no-verify-jwt. Only the public api function should face the internet — see packages/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.js
import { 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 the MushiMushi product. There is no version tag to pin to yet.

  • Flutter: a git dependency on packages/flutter in pubspec.yaml — see packages/flutter.

  • Android: a Gradle composite build from a clone — see packages/android.

Want a runnable example? examples/react-demo is 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, pg_cron self-healing, Stage 2 streaming via streamObject with progressive reports.stage2_partial UI updates and OpenAI fallback

—

Judge / self-improve

Sonnet judge with OpenAI fallback, prompt A/B auto-promotion via judge → avg_judge_score → promoteCandidate, OpenAI fine-tune adapter end-to-end (submit JSONL → poll → predict against fine_tuned_model_id, BYOK OPENAI_API_KEY), Bedrock fine-tune adapter (SigV4-signed CreateModelCustomizationJob, requires MUSHI_BEDROCK_FINETUNE_ENABLED=1 + AWS BYOK keys)

Anthropic fine-tune API is not publicly self-service in 2026 — the adapter stub links to the access-request form.

Fix orchestrator

Single-repo validateResult gating, GitHub PR, MCP JSON-RPC 2.0 client, multi-repo coordinator, first-party ClaudeCodeAgent (spawns local claude CLI) and CodexAgent (OpenAI Responses API, BYOK) — both gated behind explicit env flags so shared deployments never invoke them unintentionally

—

Sandbox

Provider abstraction; local-noop (tests) + e2b / modal / cloudflare (prod). Production refuses local-noop unless MUSHI_ALLOW_LOCAL_SANDBOX=1.

—

Verify

Playwright screenshot diff + step interpreter (navigate / click / type / press / select / assertText / waitFor / observe)

—

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 graph_nodes / graph_edges ships in every deployment

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.yaml, SDK-driven discovery, Claude proposer, ESLint gate rules, 5-gate composite GitHub check, synthetic monitor, expected_outcome contract end-to-end — see docs/operators/

Inventory is gated behind Advanced mode + the inventory_v2 plan flag.

Self-host (Helm)

Single-pod deploy on any Kubernetes; pre-install Job applies all SQL migrations from a bundled ConfigMap. Multi-region via global.region + global.peerRegions Helm values.

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-mushi

Then: /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 dev

Requires 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 — core, web, react, vue, svelte, angular, react-native, capacitor, flutter, ios, android, node, cli, mcp, mcp-ci, plugin-* (13 plugins), adapters (11 sources), inventory-schema, inventory-auth-runner, eslint-plugin-mushi-mushi, brand, marketing-ui

MIT

Use, fork, sell, embed in proprietary products.

Trademarks separate — see below.

Server packages — @mushi-mushi/server, @mushi-mushi/agents, @mushi-mushi/verify

AGPLv3

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 (packages/server/ee/) — SSO/SCIM, audit-log ingest, retention policy CRUD, region pinning, SOC2 evidence

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 docs/operators/.

Trademarks — "Mushi Mushi", "Mushi", 虫, the bug logo

Trademark policy

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

NOTICE

—

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

Glot It

Learn Thai — bite-size lessons, smart flashcards, and an AI tutor

yen-yen

Where did the money go? Now you'll know. A kakeibo for households

The Wanting Mind

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

Help Her Take Photo

Pair phones, direct the pose, nail the photo

Cooler Heads

Practice hard conversations before you have them

一人社長 Solo Boss

Bookkeeping and tax-filing co-pilot for one-person companies in Japan

Tsumagoi Work&Camp 嬬恋牧場

Coworking camp at 1,444 m — Instagram · Facebook · Maps

cursor-kenji

Ready-made playbooks for your AI coding editor

KENSAURUS

Everything else built under the same roof

All apps live under kensaur.us.


Available Tools

41 tools
activation_statusActivation cockpit statusA
Read-onlyIdempotent
Inspect

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 }.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNoProject UUID (defaults to the configured project). (`project_id` is accepted too.)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesThe API key value to add
labelNoHuman-readable label for this key
baseUrlNoAllow-listed OpenAI-compatible HTTPS base URL
priorityNoPriority for ordering (lower = higher priority)
providerYesProvider slug
projectIdYesProject id (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 freshnessA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
currentNoInstalled version from package.json, if known (e.g. 1.27.0).
packageNonpm package name (default @mushi-mushi/web). Examples: @mushi-mushi/web, @mushi-mushi/node, @mushi-mushi/core.

Output Schema

ParametersJSON Schema
NameRequiredDescription
latestNo
currentNo
packageYes
outdatedNo
suggestedActionsNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 diagnoseA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNofull (default) = ingest + dispatch; ingest = SDK pipeline only; dispatch = fix preflight only.
projectIdNoProject UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
readyYes
ingestNo
summaryYes
dispatchNo
connectionNo
nextActionNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 diffA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toShaYesNewer commit SHA (the candidate to diff to)
fromShaYesOlder commit SHA (the baseline to diff from)
projectIdNoProject UUID — defaults to configured project (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoWhich agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent.
reportIdYesReport UUID to fix (`report_id` is accepted too.)
projectIdNoProject UUID — defaults to the configured project. (`project_id` is accepted too.)
idempotencyKeyNoOptional RFC 4122 UUID. Resend the same key to safely retry without dispatching a duplicate fix job (Idempotency-Key IETF draft).
inventoryActionNodeIdNoOptional 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

ParametersJSON Schema
NameRequiredDescription
fixIdYes
statusYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 radiusA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesGraph node UUID

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 bundleA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesThe report UUID to fix (`report_id` is accepted too.)
projectIdNoProject UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportYes
componentYesComponent or page the bug was attributed to
fixPromptYesPaste-ready fix prompt composed server-side, or null
rootCauseYesStage-2 root cause, or null before Stage 2 runs
bugOntologyTagsYesBug ontology tags, or null
inventoryActionYesThe inventory action (with its expected_outcome contract) the report is filed against, or null
reproductionStepsYesReproduction steps recorded on the report ([] if none)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 timelineA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixIdYesfix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.)
projectIdNoProject UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 neighborhoodA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedYesStarting graph node id or label to expand around (e.g. an inventory Action id or component name)
depthNoBFS hops to traverse outward. Default 2; clamped to a max of 4.

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYesEdges connecting the returned nodes
nodesYesGraph nodes within the depth budget

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 detailA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe graph_nodes.id of the node to fetch (UUID).

Output Schema

ParametersJSON Schema
NameRequiredDescription
nodeYesSingle graph_nodes row including metadata (Action nodes carry v2 status)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 snapshotA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 traversalA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedYesStarting graph node id or human-readable label to traverse from
depthNoBFS hops outward from seed — clamped to 4 in the handler (default 2)

Output Schema

ParametersJSON Schema
NameRequiredDescription
edgesYesEdges connecting the returned nodes
nodesYesGraph nodes within the depth budget

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 pageA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageYesA url from search_mushi_docs, or a docs route such as "/quickstart/mcp".

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
markdownYes
truncatedYes

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 reportsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax reports to return (default 20, max 100)
statusNoFilter by status. "new" also matches queued rows; "classified" and "fixed" include legacy aliases.
categoryNoFilter by category.
severityNoFilter by severity.
projectIdNoProject 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.)
includeRawNoReturn 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

ParametersJSON Schema
NameRequiredDescription
totalYes
reportsYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 detailA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesThe report UUID (`report_id` is accepted too.)
projectIdNoProject UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)
includeRawNoReturn 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

ParametersJSON Schema
NameRequiredDescription
reportYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 evidenceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport UUID. (`report_id` is accepted too.)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 timelineA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesThe report UUID (`report_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 bugsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 5, max 20)
queryYesComponent name, page path, or bug description

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 healthA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 poolA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdYesProject id (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 findingsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
gateNoOnly runs of this gate (and their findings).
severityNoOnly findings with exactly this severity.
projectIdNoProject UUID — defaults to configured project (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
runsYesRecent gate_runs rows, newest first
findingsYesgate_findings rows for those runs

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 lessonsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax lessons to return (default 50, max 200)
severityNoFilter to one severity level
projectIdNoProject UUID — defaults to configured project (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
lessonsYesPromoted lesson rows ordered by frequency

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 PRA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixIdYesFix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.)
mergeMethodNoGitHub merge method (default squash)

Output Schema

ParametersJSON Schema
NameRequiredDescription
shaNoMerge commit SHA, when GitHub reported one
mergedNoTrue when GitHub accepted the merge in this call
reportIdYesReport UUID linked to this fix attempt
justMergedNoTrue when this call performed the merge
reportStatusYesReport workflow status after merge bookkeeping
alreadyMergedNoTrue when the PR was already merged (idempotent no-op)

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 contextA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
topKNoMax number of lessons to return (default 15, max 50). (`top_k` is accepted too.)
diffTextYesThe PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.)
maxTokensNoMaximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.)
projectIdNoProject UUID. Defaults to configured project. (`project_id` is accepted too.)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fixIdYesFix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
check_run_statusYesGitHub check run status after refresh
check_run_conclusionYessuccess | failure | neutral | null while pending
check_run_updated_atYesISO timestamp when CI status was last persisted

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 keyA
DestructiveIdempotent
Inspect

Permanently remove one pooled BYOK credential by key id from the authenticated project, including its Vault secret. Write; destructive; idempotent.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyIdYesPooled BYOK key UUID from list_byok_keys
projectIdYesProject id (`project_id` is accepted too.)

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOperator note recorded on the reopen transition
reportIdYesReport UUID to move back to reopened status (`report_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportYesUpdated report row with status=reopened

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesMessage text to send to the reporter
reportIdYesReport id to reply to (`report_id` is accepted too.)
authorNameNoDisplay name for the admin sender (default: "Mushi Admin")

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYesQuestion in plain English, e.g. "Which components had the most critical bugs this week?"

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 documentationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 8).
queryYesKeywords to search official Mushi docs (guides, MCP, inventory, QA).

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 reportsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results (default 10, max 50)
queryYesNatural-language search text or component path
thresholdNoSimilarity threshold 0..1, default 0.2

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
prUrlNoGitHub pull request URL, if a PR was opened (`pr_url` is accepted too.)
branchYesGit branch name where the fix was implemented
summaryYesOne-line human summary of what the fix changed
reportIdYesReport UUID to attach this external fix attempt to (`report_id` is accepted too.)
filesChangedYesRepo-relative paths modified by the fix
linesChangedYesTotal lines added + removed across filesChanged
idempotencyKeyNoOptional 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

ParametersJSON Schema
NameRequiredDescription
okYesTrue when the fix_attempt row was created and marked completed
fixIdYesUUID of the new fix_attempt row

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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)A
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNoPresent when no Stage-2 analysis exists — explains why and what to call instead
summaryYesOne-line report summary, or null
reportIdYesThe report this slice was read from
componentYesComponent/page the bug was attributed to, or null
rootCauseYesStage-2 root-cause hint, or null if not yet classified
suggestedFixYesStage-2 suggested fix, or null if not yet classified
reproductionStepsYesReproduction steps recorded on the report (array; [] if none)

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 keyA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyIdYesPooled BYOK key id
projectIdYesProject id (`project_id` is accepted too.)

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport UUID to turn into a Playwright PR (`report_id` is accepted too.)
projectIdNoProject UUID — defaults to configured project (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statesA
DestructiveIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason for the transition (audit trail)
statusYesTarget status (resolved is stored as fixed)
reportIdYesReport UUID (`report_id` is accepted too.)

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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-endA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesReport UUID to triage. (`report_id` is accepted too.)
projectIdNoProject UUID. Defaults to configured project. (`project_id` is accepted too.)
includeLogsNoInclude recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYesSources that do not apply to this report, and why
reportYesThe report (documented fields, no reporter identifiers), or the error reading it
statusYesWorkflow status, or unknown
categoryYesbug | slow | visual | confusing | other, or unknown
severityYescritical | high | medium | low, or unknown when the report could not be read
report_idYesThe triaged report UUID
fix_contextYesFix-context slice, as get_fix_context returns it
recent_logsYesRecent warn+ pipeline log entries for the project, or null
blast_radiusYesDownstream nodes of the inventory action the report is filed against, or null
similar_bugsYesUp to five nearest reports by summary, excluding this one; null when not searched
partial_errorsYesSources that failed, as "source: message"
triage_summaryYesOne-line summary
reporter_threadYesThe unified report timeline (comments, fixes, QA), or null
recommended_actionsYesWhat to do next, most important first

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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?A
Read-onlyIdempotent
Inspect

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
projectIdNoProject UUID (defaults to the configured project). (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
stepsYes
summaryYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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-JudgeA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax reports to judge in this batch (default 25, max 100)
projectIdNoRestrict to one project when the API key owns multiple (`project_id` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dispatchedYesNumber of judge-batch jobs dispatched (one per accessible project)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 startA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentNoWhat 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

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

  1. 32 tool updatesv0.1.12
    • Changedactivation_status2 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID (defaults to the configured project).",
        -  "type": "string"
        -}
    • Changedadd_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changeddiagnose_setup3 fields changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Alias for project_id."New value: +"Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.)"
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID for dispatch checks (defaults to configured project).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / mode / enum
        Added value: +[
        +  "full",
        +  "ingest",
        +  "dispatch"
        +]
    • Changeddiff_inventory1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
    • Changeddispatch_fix4 fields changed
      • changedInput schema / properties / agent / description
        Previous 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."
      • changedInput schema / properties / agent / enum
        Previous 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"
        +]
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — defaults to the configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to fix"New value: +"Report UUID to fix (`report_id` is accepted too.)"
    • Changedget_fix_context15 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID to fix"New value: +"The report UUID to fix (`report_id` is accepted too.)"
      • addedOutput schema / properties / bugOntologyTags / description
        Added value: +"Bug ontology tags, or null"
      • addedOutput schema / properties / component / description
        Added value: +"Component or page the bug was attributed to"
      • addedOutput schema / properties / component / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / fixPrompt / description
        Added value: +"Paste-ready fix prompt composed server-side, or null"
      • addedOutput schema / properties / inventoryAction
        Added value: +{
        +  "description": "The inventory action (with its expected_outcome contract) the report is filed against, or null"
        +}
      • addedOutput schema / properties / report / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / report / properties
        Added 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"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / report / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / report / type
        Added value: +"object"
      • addedOutput schema / properties / reproductionSteps / description
        Added value: +"Reproduction steps recorded on the report ([] if none)"
      • addedOutput schema / properties / rootCause / description
        Added value: +"Stage-2 root cause, or null before Stage 2 runs"
      • changedOutput schema / required
        Previous value: -[
        -  "report",
        -  "fixPrompt",
        -  "reproductionSteps",
        -  "component",
        -  "rootCause",
        -  "bugOntologyTags"
        -]New value: +[
        +  "report",
        +  "fixPrompt",
        +  "reproductionSteps",
        +  "component",
        +  "rootCause",
        +  "bugOntologyTags",
        +  "inventoryAction"
        +]
    • Changedget_fix_timeline3 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"fix_attempt UUID"New value: +"fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.)"
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
    • Changedget_inventory1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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.)"
    • Addedget_mushi_doc
    • Changedget_recent_reports13 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter by category: bug, slow, visual, confusing, other"New value: +"Filter by category."
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "bug",
        +  "slow",
        +  "visual",
        +  "confusing",
        +  "other"
        +]
      • addedInput schema / properties / includeRaw
        Added 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"
        +}
      • addedInput schema / properties / projectId
        Added 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"
        +}
      • removedInput schema / properties / project_id
        Removed 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"
        -}
      • changedInput schema / properties / severity / description
        Previous value: -"Filter by severity: critical, high, medium, low"New value: +"Filter by severity."
      • addedInput schema / properties / severity / enum
        Added value: +[
        +  "critical",
        +  "high",
        +  "medium",
        +  "low"
        +]
      • changedInput schema / properties / status / description
        Previous 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."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "new",
        +  "pending",
        +  "submitted",
        +  "queued",
        +  "classified",
        +  "grouped",
        +  "fixing",
        +  "fixed",
        +  "dismissed",
        +  "triaged",
        +  "in_progress",
        +  "resolved",
        +  "verified",
        +  "reopened"
        +]
      • addedOutput schema / properties / reports / items / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / reports / items / properties
        Added 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"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / reports / items / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / reports / items / type
        Added value: +"object"
    • Changedget_report_detail8 fields changed
      • addedInput schema / properties / includeRaw
        Added 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"
        +}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
      • addedOutput schema / properties / report / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / report / properties
        Added 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"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / report / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / report / type
        Added value: +"object"
    • Changedget_report_evidence3 fields changed
      • addedInput schema / properties / reportId
        Added value: +{
        +  "description": "Report UUID. (`report_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / report_id
        Removed value: -{
        -  "description": "Report UUID.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "report_id"
        -]New value: +[
        +  "reportId"
        +]
    • Changedget_report_timeline1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
    • Changedlist_byok_keys1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedlist_gate_findings5 fields changed
      • changedInput schema / properties / gate / description
        Previous value: -"Filter to one gate id: dead-handler | mock-leak | crawl | status-claim"New value: +"Only runs of this gate (and their findings)."
      • addedInput schema / properties / gate / enum
        Added value: +[
        +  "dead_handler",
        +  "mock_leak",
        +  "api_contract",
        +  "crawl",
        +  "status_claim",
        +  "spec_drift",
        +  "orphan_endpoint",
        +  "unknown_call",
        +  "schema_drift",
        +  "code_health"
        +]
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
      • changedInput schema / properties / severity / description
        Previous value: -"Minimum severity to include: low | medium | high | critical"New value: +"Only findings with exactly this severity."
      • addedInput schema / properties / severity / enum
        Added value: +[
        +  "info",
        +  "warn",
        +  "error"
        +]
    • Changedlist_lessons2 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — defaults to configured project (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — defaults to configured project",
        -  "type": "string"
        -}
    • Changedmerge_fix3 fields changed
      • changedInput schema / properties / fixId / description
        Previous 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.)"
      • addedOutput schema / properties / justMerged
        Added value: +{
        +  "description": "True when this call performed the merge",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / sha
        Added value: +{
        +  "description": "Merge commit SHA, when GitHub reported one",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedquery_lessons9 fields changed
      • addedInput schema / properties / diffText
        Added value: +{
        +  "description": "The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / diff_text
        Removed value: -{
        -  "description": "The PR diff, code snippet, or description of the change being made.",
        -  "type": "string"
        -}
      • addedInput schema / properties / maxTokens
        Added value: +{
        +  "description": "Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.)",
        +  "type": "number"
        +}
      • removedInput schema / properties / max_tokens
        Removed value: -{
        -  "description": "Maximum tokens for returned lessons context (default 3000, max 8000).",
        -  "type": "number"
        -}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID. Defaults to configured project.",
        -  "type": "string"
        -}
      • addedInput schema / properties / topK
        Added value: +{
        +  "description": "Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.)",
        +  "type": "number"
        +}
      • removedInput schema / properties / top_k
        Removed value: -{
        -  "description": "Max number of lessons to return (default 15, max 50).",
        -  "type": "number"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "diff_text"
        -]New value: +[
        +  "diffText"
        +]
    • Changedrefresh_ci1 field changed
      • changedInput schema / properties / fixId / description
        Previous 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.)"
    • Changedremove_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedreopen_report1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to move back to reopened status"New value: +"Report UUID to move back to reopened status (`report_id` is accepted too.)"
    • Changedreply_to_reporter1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report id to reply to"New value: +"Report id to reply to (`report_id` is accepted too.)"
    • Changedsearch_mushi_docs3 fields changed
      • removedOutput schema / properties / results / items / properties / path
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / results / items / properties / url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "title",
        -  "path",
        -  "excerpt",
        -  "score"
        -]New value: +[
        +  "title",
        +  "url",
        +  "excerpt",
        +  "score"
        +]
    • Removedsetup_repo_for_mushi
    • Changedsubmit_fix_result2 fields changed
      • changedInput schema / properties / prUrl / description
        Previous 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.)"
      • changedInput schema / properties / reportId / description
        Previous 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.)"
    • Changedsuggest_fix1 field changed
      • changedInput schema / properties / reportId / description
        Previous 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.)"
    • Changedtest_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedtest_gen_from_report2 fields changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to turn into a Playwright PR"New value: +"Report UUID to turn into a Playwright PR (`report_id` is accepted too.)"
    • Changedtransition_status1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID"New value: +"Report UUID (`report_id` is accepted too.)"
    • Changedtriage_issue35 fields changed
      • addedInput schema / properties / includeLogs
        Added value: +{
        +  "description": "Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.)",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / include_logs
        Removed value: -{
        -  "description": "Include recent pipeline logs in triage packet (default: true).",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID. Defaults to configured project.",
        -  "type": "string"
        -}
      • addedInput schema / properties / reportId
        Added 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"
        +}
      • removedInput schema / properties / report_id
        Removed 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"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "report_id"
        -]New value: +[
        +  "reportId"
        +]
      • changedOutput schema / properties / blast_radius / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "affected": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / blast_radius / description
        Added value: +"Downstream nodes of the inventory action the report is filed against, or null"
      • addedOutput schema / properties / category / description
        Added value: +"bug | slow | visual | confusing | other, or unknown"
      • addedOutput schema / properties / category / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / fix_context / anyOf
        Previous 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"
        +  }
        +]
      • addedOutput schema / properties / fix_context / description
        Added value: +"Fix-context slice, as get_fix_context returns it"
      • addedOutput schema / properties / notes
        Added value: +{
        +  "description": "Sources that do not apply to this report, and why",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / partial_errors
        Added value: +{
        +  "description": "Sources that failed, as \"source: message\"",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / recent_logs / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "entries": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / recent_logs / description
        Added value: +"Recent warn+ pipeline log entries for the project, or null"
      • addedOutput schema / properties / recommended_actions / description
        Added value: +"What to do next, most important first"
      • addedOutput schema / properties / recommended_actions / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / recommended_actions / items / properties
        Added 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"
        +  }
        +}
      • addedOutput schema / properties / recommended_actions / items / required
        Added value: +[
        +  "action",
        +  "reason"
        +]
      • addedOutput schema / properties / recommended_actions / items / type
        Added value: +"object"
      • addedOutput schema / properties / report / anyOf
        Added 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"
        +  }
        +]
      • addedOutput schema / properties / report / description
        Added value: +"The report (documented fields, no reporter identifiers), or the error reading it"
      • addedOutput schema / properties / report_id / description
        Added value: +"The triaged report UUID"
      • changedOutput schema / properties / reporter_thread / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "report_id": {
        +        "type": "string"
        +      },
        +      "timeline": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / reporter_thread / description
        Added value: +"The unified report timeline (comments, fixes, QA), or null"
      • addedOutput schema / properties / severity / description
        Added value: +"critical | high | medium | low, or unknown when the report could not be read"
      • addedOutput schema / properties / severity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / similar_bugs / anyOf
        Previous 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"
        +  }
        +]
      • addedOutput schema / properties / similar_bugs / description
        Added value: +"Up to five nearest reports by summary, excluding this one; null when not searched"
      • addedOutput schema / properties / status / description
        Added value: +"Workflow status, or unknown"
      • addedOutput schema / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / triage_summary / description
        Added value: +"One-line summary"
      • changedOutput schema / required
        Previous 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"
        +]
    • Changedtriage_next_steps2 fields changed
      • addedInput schema / properties / projectId
        Added 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"
        +}
      • removedInput schema / properties / project_id
        Removed 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"
        -}
    • Changedtrigger_judge1 field changed
      • changedInput schema / properties / projectId / description
        Previous 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.)"
  2. 41 tool updatesv0.1.10
    • Changedactivation_status1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedcheck_sdk_version
    • Changeddiagnose_setup2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddiff_inventory1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddispatch_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_blast_radius1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_fix_context2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_fix_timeline1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_graph_neighborhood2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_graph_node2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_inventory1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_knowledge_graph2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_recent_reports2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_detail2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_evidence1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_timeline1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_similar_bugs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_two_way_comms_health1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_byok_keys1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_gate_findings2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_lessons2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmerge_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedquery_lessons1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrefresh_ci8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties / check_run_conclusion / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_conclusion / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / check_run_status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / check_run_updated_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_updated_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedremove_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreopen_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreply_to_reporter1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrun_nl_query1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_mushi_docs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_reports2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsetup_repo_for_mushi1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsubmit_fix_result2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsuggest_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtest_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtest_gen_from_report1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtransition_status1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtriage_issue2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtriage_next_steps2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtrigger_judge2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeduse_mushi1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. 4 tool updatesv0.1.9
    • Changedsubmit_fix_result1 field changed
      • changedInput schema / properties / idempotencyKey / description
        Previous 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."
    • Changedsuggest_fix1 field changed
      • addedOutput schema / properties / note
        Added value: +{
        +  "description": "Present when no Stage-2 analysis exists — explains why and what to call instead",
        +  "type": "string"
        +}
    • Changedtransition_status2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"Target status"New value: +"Target status (resolved is stored as fixed)"
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "pending",
        -  "classified",
        -  "grouped",
        -  "fixing",
        -  "fixed",
        -  "resolved",
        -  "verified",
        -  "reopened",
        -  "dismissed"
        -]New value: +[
        +  "pending",
        +  "classified",
        +  "triaged",
        +  "in_progress",
        +  "grouped",
        +  "fixing",
        +  "fixed",
        +  "resolved",
        +  "verified",
        +  "reopened",
        +  "dismissed"
        +]
    • Addedtriage_next_steps
  4. 5 tool updatesv0.1.8
    • Addedadd_byok_key
    • Addedlist_byok_keys
    • Addedremove_byok_key
    • Addedtest_byok_key
    • Addeduse_mushi
  5. 60 tool updatesv0.1.2
    • Addedactivation_status
    • Removedadd_byok_key
    • Removedanalyze_codebase_impact
    • Removedanalyze_wiki_knowledge
    • Removedapprove_qa_story
    • Removedask_codebase
    • Removedaward_bonus_points
    • Removedcheckin_pipeline_step
    • Removeddiagnose_connection
    • Changeddiagnose_setup1 field changed
      • addedOutput schema / properties / connection
        Added value: +{}
    • Addeddiff_inventory
    • Removedfix_suggest
    • Removedgenerate_tdd_from_story
    • Removedget_account_overview
    • Removedget_activation_status
    • Removedget_backend_health
    • Removedget_codebase_domains
    • Removedget_codebase_tour
    • Removedget_file_summary
    • Addedget_graph_neighborhood
    • Addedget_graph_node
    • Addedget_inventory
    • Changedget_knowledge_graph3 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Traversal depth (default 2, max 4)"New value: +"BFS hops outward from seed — clamped to 4 in the handler (default 2)"
      • changedInput schema / properties / seed / description
        Previous value: -"Starting node id or label"New value: +"Starting graph node id or human-readable label to traverse from"
      • changedOutput 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"
        +}
    • Removedget_map_run_status
    • Removedget_pipeline_logs
    • Removedget_pipeline_run
    • Removedget_project_context
    • Removedget_qa_story_run
    • Removedget_reporter_thread
    • Removedget_skill
    • Removedget_usage
    • Removedgraph_neighborhood
    • Removedgraph_node_status
    • Removedimprove_qa_story
    • Removedingest_setup_check
    • Removedinventory_diff
    • Removedinventory_findings
    • Removedinventory_get
    • Removedlist_byok_keys
    • Addedlist_gate_findings
    • Changedlist_lessons4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max number of lessons to return (default 50, max 200)."New value: +"Max lessons to return (default 50, max 200)"
      • changedInput schema / properties / project_id / description
        Previous value: -"Project UUID. Defaults to configured project."New value: +"Project UUID — defaults to configured project"
      • changedInput schema / properties / severity / description
        Previous value: -"Filter by severity level."New value: +"Filter to one severity level"
      • changedOutput 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"
        +}
    • Removedlist_pending_review_stories
    • Removedlist_projects
    • Removedlist_qa_story_runs
    • Removedlist_skills
    • Removedlist_top_contributors
    • Removedmap_user_stories
    • Changedmerge_fix3 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged"
      • changedInput schema / properties / mergeMethod / description
        Previous value: -"GitHub merge method"New value: +"GitHub merge method (default squash)"
      • changedOutput 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"
        +}
    • Changedrefresh_ci2 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose PR check-runs should be re-polled"
      • changedOutput 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"
        +}
    • Changedreopen_report3 fields changed
      • changedInput schema / properties / note / description
        Previous value: -"Triage note"New value: +"Operator note recorded on the reopen transition"
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID"New value: +"Report UUID to move back to reopened status"
      • changedOutput 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"
        +}
    • Removedrun_fullstack_audit
    • Removedrun_qa_story
    • Removedsearch_codebase
    • Removedset_tier
    • Removedsetup_check
    • Removedstart_skill_pipeline
    • Changedsubmit_fix_result7 fields changed
      • changedInput schema / properties / branch / description
        Previous value: -"Git branch name"New value: +"Git branch name where the fix was implemented"
      • changedInput schema / properties / filesChanged / description
        Previous value: -"Files modified"New value: +"Repo-relative paths modified by the fix"
      • changedInput schema / properties / linesChanged / description
        Previous value: -"Total lines changed"New value: +"Total lines added + removed across filesChanged"
      • changedInput schema / properties / prUrl / description
        Previous value: -"GitHub PR URL"New value: +"GitHub pull request URL, if a PR was opened"
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"Report UUID to attach this external fix attempt to"
      • changedInput schema / properties / summary / description
        Previous value: -"Fix summary"New value: +"One-line human summary of what the fix changed"
      • changedOutput 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"
        +}
    • Addedsuggest_fix
    • Removedtest_notification_channel
    • Changedtrigger_judge1 field changed
      • changedOutput 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"
        +}
  6. 2 tool updatesv0.1.1
    • Changeddispatch_fix2 fields changed
      • addedInput schema / properties / reportId / format
        Added value: +"uuid"
      • addedInput schema / properties / reportId / pattern
        Added 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)$"
    • Changedtriage_issue2 fields changed
      • addedInput schema / properties / report_id / format
        Added value: +"uuid"
      • addedInput schema / properties / report_id / pattern
        Added 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)$"
  7. 72 tool updatesv0.1.0
    • First observedadd_byok_key
    • First observedanalyze_codebase_impact
    • First observedanalyze_wiki_knowledge
    • First observedapprove_qa_story
    • First observedask_codebase
    • First observedaward_bonus_points
    • First observedcheckin_pipeline_step
    • First observeddiagnose_connection
    • First observeddiagnose_setup
    • First observeddispatch_fix
    • First observedfix_suggest
    • First observedgenerate_tdd_from_story
    • First observedget_account_overview
    • First observedget_activation_status
    • First observedget_backend_health
    • First observedget_blast_radius
    • First observedget_codebase_domains
    • First observedget_codebase_tour
    • First observedget_file_summary
    • First observedget_fix_context
    • First observedget_fix_timeline
    • First observedget_knowledge_graph
    • First observedget_map_run_status
    • First observedget_pipeline_logs
    • First observedget_pipeline_run
    • First observedget_project_context
    • First observedget_qa_story_run
    • First observedget_recent_reports
    • First observedget_report_detail
    • First observedget_report_evidence
    • First observedget_report_timeline
    • First observedget_reporter_thread
    • First observedget_similar_bugs
    • First observedget_skill
    • First observedget_two_way_comms_health
    • First observedget_usage
    • First observedgraph_neighborhood
    • First observedgraph_node_status
    • First observedimprove_qa_story
    • First observedingest_setup_check
    • First observedinventory_diff
    • First observedinventory_findings
    • First observedinventory_get
    • First observedlist_byok_keys
    • First observedlist_lessons
    • First observedlist_pending_review_stories
    • First observedlist_projects
    • First observedlist_qa_story_runs
    • First observedlist_skills
    • First observedlist_top_contributors
    • First observedmap_user_stories
    • First observedmerge_fix
    • First observedquery_lessons
    • First observedrefresh_ci
    • First observedreopen_report
    • First observedreply_to_reporter
    • First observedrun_fullstack_audit
    • First observedrun_nl_query
    • First observedrun_qa_story
    • First observedsearch_codebase
    • First observedsearch_mushi_docs
    • First observedsearch_reports
    • First observedset_tier
    • First observedsetup_check
    • First observedsetup_repo_for_mushi
    • First observedstart_skill_pipeline
    • First observedsubmit_fix_result
    • First observedtest_gen_from_report
    • First observedtest_notification_channel
    • First observedtransition_status
    • First observedtriage_issue
    • First observedtrigger_judge

TDQS

A4.1/5.0

Scored across 41 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    A 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.
    7
    21 npm
    863
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Open 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.
    20
    16
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Marketplace 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.
    27
    377 npm
    1
    MIT