Mushi-Mushi
Mushi Mushi's MCP server turns your AI editor into a bug-triage-and-fix console: survey reports, diagnose root causes, ship fixes, and audit app/release health.
Survey bug reports — list recent reports with status/category/severity filters (
get_recent_reports), fetch full detail (get_report_detail), evidence packages with logs/traces/metrics (get_report_evidence), unified timelines (get_report_timeline), and semantic search or dedupe (search_reports,get_similar_bugs).Diagnose and fix — bundle a paste-ready fix prompt with repro steps, tokens and schema context (
get_fix_context), get a quick Stage-2 hint (suggest_fix), build a full review packet (triage_issue), then dispatch a fix agent (dispatch_fix), record an external PR (submit_fix_result), poll CI (refresh_ci), and merge (merge_fix).Prioritize work — get a ranked "do this next" list (
triage_next_steps) or NL→SQL analytics over your data (run_nl_query).Change report state and talk to users — move reports between states (
transition_status), reopen regressions (reopen_report), reply to reporters (reply_to_reporter), ask questions (request_reporter_info), and review/release held outbox messages.Understand the codebase — knowledge-graph traversal, node detail and blast radius (
get_knowledge_graph,get_graph_neighborhood,get_graph_node,get_blast_radius), paste-ready repo digests (get_repo_digest) and architecture diagrams (get_repo_diagram).Audit design and app recipe — App Recipe state (
get_app_recipe), design tokens and off-token deviance (get_design_tokens,get_design_deviance,run_design_deviance), recipe drift (get_recipe_drift), refresh (refresh_recipe), and design score thresholds/autofix settings (get_design_settings,set_design_settings).Check CI gates and inventory — gate findings across many gate types (
list_gate_findings), explain a single finding (explain_finding), inventory snapshot and diffs (get_inventory,diff_inventory), and recipe source files (get_recipe_sources).Propose code changes safely — dry-run or open draft PRs for recipe edits (
propose_recipe_change) and the same fix across up to 10 repos (propose_portfolio_change), tracked viaget_recipe_change.Watch releases and stores — release calendar with batch suggestions (
get_release_calendar), auto-release blockers (get_auto_release_status), store review status and runs (get_store_status,run_store_review), store-review intake and pulls (get_store_reviews,pull_store_reviews,set_store_review_intake).Run hole checks (radar) — view pre-emptive checks like expiring certs or rejected store builds (
get_radar) or trigger a run (run_radar).Manage portfolio and connectors — org-wide app cards (
get_portfolio), cross-app problems (list_portfolio_findings), connected sources (list_connectors), and gated store actions needing human approval (request_connector_action).Ingest external data — import Sentry issues by ID or query (
import_sentry_issues).Set up and stay healthy — orientation and tool discovery (
use_mushi), setup diagnostics (diagnose_setup), activation cockpit (activation_status), SDK version freshness (check_sdk_version), two-way reporter comms health (get_two_way_comms_health), and docs search/read (search_mushi_docs,get_mushi_doc).Manage LLM keys and lessons — list/add/test/remove BYOK keys (
list_byok_keys,add_byok_key,test_byok_key,remove_byok_key), query or browse encoded lessons (query_lessons,list_lessons), and grade fix quality (trigger_judge) or generate regression tests (test_gen_from_report).
SDK for capturing errors and user reports from Angular applications.
Inbound adapter to forward Bugsnag alerts into Mushi.
Sandbox provider for running fix attempts in a sandbox environment.
Inbound adapter to forward Datadog alerts into Mushi.
Inbound adapter to forward Firebase alerts into Mushi.
Outbound integration to open draft pull requests with fixes.
Inbound adapter to forward Grafana Loki alerts into Mushi.
Sandbox provider for running fix attempts in a sandbox environment.
Inbound adapter to forward New Relic alerts into Mushi.
SDK for capturing errors and user reports from Next.js applications.
LLM provider supported as an alternative for the classification pipeline.
Inbound adapter to forward Opsgenie alerts into Mushi.
SDK for capturing errors and user reports from React applications.
Inbound adapter to forward Sentry alerts into Mushi for deeper fix context; outbound plugin to auto-resolve Sentry issues when Mushi merges a fix.
Outbound integration to dispatch fixes via Slack.
Backend database and edge functions platform used for self-hosting the Mushi stack.
SDK for capturing errors and user reports from Svelte applications.
Mushi Mushi
Your AI wrote it. Mushi tells you why it broke.
When a user hits a bug, Mushi explains the cause in plain English and hands your editor a fix to start from. Built for the vibe coder who ships fast with Cursor, Claude Code, Lovable or Bolt, so a bug costs five minutes instead of an afternoon.
Quick start · How it works · Docs · Demo · Why not Sentry? · Self-host · Vision
↑ a diagnosis: the root cause in plain English and a paste-ready fix prompt. Click to open the read-only demo.
How it works
flowchart LR
U["Your users<br/>tap the bug widget"] --> M
S["Your monitoring<br/>Sentry, Crashlytics… (optional)"] -.-> M
M["Mushi<br/>one queue · diagnosis · fix"] --> E["Your editor or agent<br/>Cursor, Claude Code (MCP)"]
E --> P["Draft PR<br/>you review it"]
P --> R["Release<br/>report closes, user is told"]Capture. A user taps the widget. Mushi records a screenshot, the route, their note, and the last console and network events.
Diagnose. Mushi writes the root cause in plain English with a fix prompt. Twenty reports of the same broken button become one row.
Fix. Your editor reads the diagnosis over MCP. If you want, an agent opens a draft PR that you review like any other.
It catches the bugs that never throw an error: the pay button hidden under the keyboard, the Save button tapped twice because nothing happened, the dashboard that takes 12 seconds.
Related MCP server: Playwright MCP
Quick start
npx mushi-mushi # detects your framework, installs the SDK, writes env vars, sends a test report
npx mushi-mushi setup --ide cursor # or --ide claude: your editor can now read diagnosesThen ask your editor: "what's broken in prod?"
The SDK needs two env vars (VITE_MUSHI_PROJECT_ID / VITE_MUSHI_API_KEY, or NEXT_PUBLIC_MUSHI_*; see examples/sdk.env.example). No Sentry, no LLM key, no monitoring stack. The hosted free tier covers 50 diagnoses a month with no card, or you can self-host.
Paste this into Cursor or Claude Code:
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.
The skills also add /mushi-debug (why ingest or MCP fails), /mushi-health (pass/fail across CLI, API and keys) and /mushi-integration (fix dispatch and the two-way loop).
import { MushiProvider } from '@mushi-mushi/react';
export function App() {
return (
<MushiProvider config={{ projectId: 'proj_xxx', apiKey: 'mushi_xxx' }}>
<YourApp />
</MushiProvider>
);
}import { MushiPlugin } from '@mushi-mushi/vue'; // Vue 3 / Nuxt: app.use(MushiPlugin, { projectId, apiKey })
import { initMushi } from '@mushi-mushi/svelte'; // Svelte / SvelteKit: initMushi({ projectId, apiKey })
import { provideMushi } from '@mushi-mushi/angular'; // Angular 17+: providers: [provideMushi({ projectId, apiKey })]
import { MushiProvider } from '@mushi-mushi/react-native';
import { Mushi } from '@mushi-mushi/web'; // any framework: Mushi.init({ projectId, apiKey })Native SDKs (iOS, Android, Flutter) are a preview and install from this repository: see packages/ios, packages/android and packages/flutter. A runnable demo lives in examples/react-demo.
What's inside
Package | For | What it does |
Setup | One-command wizard ( | |
| Your app | The bug widget for your framework |
Your app | The same widget for any site, no framework needed | |
Your server | Reports backend errors into the same queue | |
Your editor | Gives Cursor and Claude Code the diagnosis and fix tools | |
Your terminal | Setup, reports, fixes and health checks | |
Your app's screens | Runs your coding agent over every screen and keeps only measured improvements | |
Backend | Supabase edge functions + Postgres. Hosted for you, or self-host |
Full list and maturity: SDK reference. Architecture: how the pipeline fits together.
Why not just Sentry?
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 | Sentry | |
Catches | Thrown errors and silent UX bugs (dead clicks, slow screens, broken layouts) | Thrown errors, performance traces |
You get | A plain-English root cause and a fix prompt, in your editor | A stack trace and breadcrumbs, in a dashboard |
Auto-fix | Optional: an agent opens a draft PR | Seer add-on (paid) |
Setup | One command that signs you in through the browser; the demo needs no account | SDK + DSN + dashboard |
It works with what you already run. Point a Sentry alert webhook at /v1/webhooks/sentry?projectId=<id> and errors land in the same queue. Merging a Mushi fix resolves the Sentry issue, and the reverse. Adapters also bring in Datadog, Bugsnag, Rollbar, Crashlytics and others. Plugins keep Linear, Jira, GitHub Issues, Slack, Discord, Teams and PagerDuty in sync. Nothing gets ripped out. Details: Sentry vs Mushi.
Self-host
cd deploy && cp .env.example .env # add ANTHROPIC_API_KEY and your Supabase credentials
docker compose up -dWalkthroughs: SELF_HOSTED.md and Docker Compose guide. Self-hosting is bring-your-own-key: you pay your LLM vendor at list price. The hosted service needs no key; it bills per diagnosis with a spend cap (pricing). Teams wiring Mushi into an existing stack (SSO, retention, region routing, Kubernetes) start at docs/operators/. Only the public api function should face the internet: see internal caller authentication.
Where it stops
Area | Still partial |
Native SDKs | iOS, Android and Flutter are previews, not yet on CocoaPods, Maven Central or pub.dev |
Fine-tuning | OpenAI and Bedrock work. Anthropic fine-tuning is not self-service, so its adapter links to the access form |
Knowledge graph | SQL adjacency everywhere. Apache AGE only where the extension is installed (not managed Supabase) |
Inventory and QA gates | Behind Advanced mode and the |
Multi-region | Region pinning works. Active/active write replication is not automated |
Repo at a glance (run pnpm docs-stats): ~514K TS lines · 2,358 source files · 45 workspace / 37 npm packages · 65 edge functions · 472 SQL migrations · 19 pipeline agents. Full tour: docs/SCREENSHOTS.md.
Community and contributing
Questions and show-and-tell: GitHub Discussions. Bugs: Issues (first reply within 24 hours on weekdays). Security: SECURITY.md. Anything else private: kensaurus@gmail.com.
git clone https://github.com/kensaurus/mushi-mushi.git && cd mushi-mushi
pnpm install && pnpm dev # Node ≥ 22, pnpm ≥ 10See CONTRIBUTING.md and docs/stats.md.
License
Open core. Each package directory's own LICENSE governs that package; the root LICENSE states the split.
Part | License | In short |
SDKs, CLI, MCP, plugins, adapters | Use anywhere, including closed-source products | |
Server ( | Self-host and modify freely. Offer a modified server as a service: publish your changes or get a commercial license | |
Enterprise features ( | SSO, audit ingest, retention, region pinning. Paid for production use | |
Name and logo | Forks must rename |
Third-party notices: NOTICE.
More apps from the same maker
App | What it is | |
Learn Thai — bite-size lessons, smart flashcards, and an AI tutor | ||
Where did the money go? Now you'll know. A kakeibo for households | ||
How the Battle Between Extraction and Generation Is Reshaping Our World — a 147,000-word interactive webbook with 268 concepts, 242 citations, and original illustrations | ||
Pair phones, direct the pose, nail the photo | ||
Practice hard conversations before you have them | ||
Bookkeeping and tax-filing co-pilot for one-person companies in Japan | ||
Agent skills and slash commands for Claude Code, Cursor, Codex, and Gemini | ||
All apps from the same maker |
All apps live under kensaur.us.
Available Tools
73 toolsactivation_statusActivation cockpit statusARead-onlyIdempotentInspect
Return the unified activation posture — SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, and the next best action. Read this before guessing which onboarding step is blocking the user. Also available as the mushi://activation resource for resource-reader clients. Returns { sdkActive, reportsIngested, githubConnected, mcpConnected, qaStoriesCreated, nextBestAction }.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID (defaults to the configured project). (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only, idempotent, and open-world hints, so the description does not need to restate safety. It adds value beyond the annotations by specifying the exact returned fields and mentioning the equivalent mushi://activation resource. No contradiction with annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by usage cue and exact return shape. The natural-language list and the JSON key list overlap, but they serve different readers (human summary vs exact field names) without unnecessary prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only status tool with one optional parameter and no output schema, the description covers the return contract, the usage moment, and an alternative protocol. It does not explain edge-state behavior (e.g., what fields look like before activation), but annotations and simplicity make the tool unlikely to cause incorrect invocations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already documents projectId as a defaulting optional UUID. The description does not add parameter-level meaning, but the high coverage keeps this at the baseline rather than lower.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Return the unified activation posture') and enumerates the exact components (SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, next best action), so an agent can distinguish this activation-status tool from siblings like get_inventory or get_recent_reports. The 'next best action' phrase also signals what makes this tool unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs when to use the tool: 'Read this before guessing which onboarding step is blocking the user,' which gives a concrete decision point. It also notes an alternative access path (mushi://activation for resource-reader clients), but it does not spell out when to prefer sibling tools over this one.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_byok_keyAdd an API keyAInspect
Add and immediately validate a BYOK API key for anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase (a scoped, read-only Supabase access token, checked against the linked supabase_project_ref). The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. Write; NOT idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The API key value to add | |
| label | No | Human-readable label for this key | |
| baseUrl | No | Allow-listed OpenAI-compatible HTTPS base URL | |
| priority | No | Priority for ordering (lower = higher priority) | |
| provider | Yes | Provider slug | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: the raw key is stored encrypted in Supabase Vault and never returned, failed probes stay quarantined, and baseUrl is gated to allow-listed OpenAI-compatible HTTPS providers. These are real operational facts an agent cannot infer from readOnlyHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, with the add-and-validate action stated first and caveats trailing. The provider enumeration duplicates the schema enum and 'NOT idempotent' restates the annotation, so a little space is spent on already-structured data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param mutation with no output schema, the description covers the important unknowns: storage, non-return of the secret, validation failure handling, and baseUrl constraints. It stops short of saying what a successful call returns (e.g. a key record/id), which is the remaining gap given no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: baseUrl's allow-list restriction, and that the supabase token must be scoped read-only and is checked against the linked supabase_project_ref. That is more than the schema's one-line 'Allow-listed OpenAI-compatible HTTPS base URL'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (add + immediately validate) and resource (BYOK API key), enumerates the supported providers, and clarifies the special Supabase case. It is clearly distinguishable from siblings test_byok_key, list_byok_keys, and remove_byok_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: it is a write, it is not idempotent, and validation happens on add, which implicitly tells the agent this is the create path. However it never names test_byok_key or explains when to re-test versus add a replacement key, so routing between siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_sdk_versionCheck SDK freshnessARead-onlyIdempotentInspect
Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version). Returns { package, current, latest, outdated } and, when outdated, suggestedActions (Sentry-style, max 1) pointing at search_mushi_docs plus the mushi-sdk-upgrade skill. Read-only. Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK. Does not bump the pin — that stays a human/Dependabot change.
| Name | Required | Description | Default |
|---|---|---|---|
| current | No | Installed version from package.json, if known (e.g. 1.27.0). | |
| package | No | npm package name (default @mushi-mushi/web). Examples: @mushi-mushi/web, @mushi-mushi/node, @mushi-mushi/core. |
Output Schema
| Name | Required | Description |
|---|---|---|
| latest | No | |
| current | No | |
| package | Yes | |
| outdated | No | |
| suggestedActions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark it read-only and idempotent, and the description reinforces this with 'Read-only' and the explicit side-effect boundary 'Does not bump the pin.' It also discloses the response shape including the conditional suggestedActions, which adds useful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information: purpose, endpoint, response, conditionality of suggestions, read-only guarantee, and usage triggers. It is front-loaded with the core action and remains compact without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only check with two optional parameters and an output schema, the description is complete. It covers what the tool compares, when to use it, what it returns, and the boundary that it never mutates the dependency pin.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with clear descriptions for 'current' and 'package', so the description does not need to add parameter details. It does not materially extend the parameter semantics, which matches the baseline 3 for fully covered schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version)'. It is immediately distinguishable from sibling tools by focusing on SDK version drift, and explicitly notes it does not bump the pin, separating it from mutating fix tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit trigger conditions: 'Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK.' It also states a clear boundary: 'Does not bump the pin — that stays a human/Dependabot change,' telling the agent when the tool is not the right action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_setupUnified setup diagnoseARead-onlyIdempotentInspect
Diagnose Mushi setup health and return the single best next action. mode=full (default) runs both SDK-ingest and fix-dispatch preflight checks; mode=ingest runs ingest checks only (project exists, active API key, SDK heartbeat, at least one report); mode=dispatch runs dispatch readiness only (GitHub connected, codebase indexed, LLM key present, autofix enabled). Returns { ready, steps: [{ label, complete, required, hint }], nextAction }. Read-only. The one setup-diagnosis entry point — use this instead of separate connection/ingest checks.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | full (default) = ingest + dispatch; ingest = SDK pipeline only; dispatch = fix preflight only. | |
| projectId | No | Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| ready | Yes | |
| ingest | No | |
| summary | Yes | |
| dispatch | No | |
| connection | No | |
| nextAction | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds 'Read-only' (consistent with annotations) and discloses the exact return shape ({ ready, steps: [{...}], nextAction }), providing context beyond the annotations. No contradiction found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but packs in the purpose, mode breakdown, return format, and a routing note. It is front-loaded with the core purpose and uses semicolons to list mode specifics efficiently. No filler sentences, though it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 2 parameters, a rich output schema, and annotations covering safety, the description covers all necessary calling context: mode options, default behavior, return structure, and a clear routing rule. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining mode defaults ('full (default) runs both...'), the projectId default ('defaults to configured project'), and the alias ('project_id' is accepted too'), which are not fully spelled out in the schema. This extra nuance elevates it slightly above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Diagnose'), a resource ('Mushi setup health'), and a concrete outcome ('return the single best next action'). It also explicitly positions itself as 'The one setup-diagnosis entry point — use this instead of separate connection/ingest checks,' which differentiates it from siblings like get_inventory or get_two_way_comms_health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit mode-based usage: full, ingest, and dispatch, each with its own set of checks. It also names an alternative ('use this instead of separate connection/ingest checks') and clarifies when this tool should be selected, leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diff_inventoryInventory diffARead-onlyIdempotentInspect
Diff two ingested inventory commits (fromSha to toSha): added/removed nodes and edges. Returns { added, removed, changed }. Requires inventory_v2. Read-only. Use before merging a PR that touches inventory.yaml to see what changed; use get_inventory for the current snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| toSha | Yes | Newer commit SHA (the candidate to diff to) | |
| fromSha | Yes | Older commit SHA (the baseline to diff from) | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' is redundant but consistent. It adds genuine value by stating the prerequisite ('Requires inventory_v2') and the exact return shape ('{ added, removed, changed }'), which is critical since there is no output schema. These details go beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, no filler. The core purpose and return format are front-loaded, followed by usage context and sibling routing. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a diff tool with no output schema, the description adequately covers the return shape, prerequisite, and usage context. It could elaborate on edge cases (e.g., what 'changed' encompasses or error conditions), but given the tool's simplicity and the annotations covering safety, this is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all parameters, so the description need not re-explain them. It mentions fromSha and toSha in the narrative but adds no semantic detail beyond the schema's descriptions. The baseline of 3 applies because the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('diff') and resource ('inventory commits') with a clear scope (fromSha to toSha, added/removed nodes/edges). Explicitly differentiates from sibling get_inventory by calling out the current snapshot alternative. Unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('before merging a PR that touches inventory.yaml') and names the alternative tool (get_inventory) with its distinct purpose. No ambiguity about when this tool should be selected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dispatch_fixDispatch Mushi fix agentAInspect
Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). For a project with several linked repos, set targetRepoId (a project_repos.id) to choose the repo the PR opens against; omit it for the primary repo. Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely — without it each call starts a new attempt. Report must be classified — run triage_issue if not.
| Name | Required | Description | Default |
|---|---|---|---|
| agent | No | Which agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent. | |
| reportId | Yes | Report UUID to fix (`report_id` is accepted too.) | |
| projectId | No | Project UUID — defaults to the configured project. (`project_id` is accepted too.) | |
| targetRepoId | No | Optional linked repo id (project_repos.id) to open the fix PR against, for a project with several repos. Omit for the project's primary repo. Another project's repo id is rejected with 400 TARGET_REPO_NOT_IN_PROJECT. | |
| idempotencyKey | No | Optional RFC 4122 UUID. Resend the same key to safely retry without dispatching a duplicate fix job (Idempotency-Key IETF draft). | |
| inventoryActionNodeId | No | Optional inventory Action node UUID for spec-traceability (§2.10). When provided, the fix-worker embeds the expected_outcome contract in the LLM prompt and runs validateAgainstSpec before opening the PR. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fixId | Yes | |
| status | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (openWorld, not readOnly, not idempotent); the description goes well beyond by disclosing the write side effects, the GitHub + LLM key prerequisites, and the idempotencyKey retry semantics (without it each call starts a new attempt). It also states the return shape and that fixId is immediately usable by get_fix_timeline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause carries information (prereqs, agent choice, repo targeting, idempotency, next steps). It is dense as a single paragraph, but for a 6-param dispatch tool with many conditional branches the length is largely justified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description covers prerequisites, the required classification precondition, the safe-retry path, and the follow-up workflow (get_fix_timeline, merge_fix). An agent has everything needed to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents most parameters. The description still adds value the schema lacks, e.g. that the default agent is the in-repo worker and that targetRepoId exists for multi-repo projects, though much of the targetRepoId/idempotencyKey text duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Start a Mushi fix agent for a classified report') plus the concrete side effects it produces (writes a branch, opens a signed draft PR). This clearly distinguishes it from siblings like suggest_fix, submit_fix_result, and merge_fix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: run diagnose_setup mode=dispatch first for prerequisites, run triage_issue if the report isn't classified, set agent=cursor_cloud for a cloud agent, and poll get_fix_timeline then call merge_fix when CI is green. Both when-to-use and named alternatives are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_findingExplain one findingARead-onlyIdempotentInspect
Explain one gate finding by its id (from list_gate_findings, get_radar, get_recipe_drift, get_code_health, get_store_status or the console): which check raised it and what that check is for, the rule, why it fired (reason), the file, line and column or the target it is about, the fix in one sentence (fix.text, with fix.kind, fix.command, fix.consolePath and the stored fix object in fix.detail), and whether it is still open: state open (in the latest run of that check, the latest run found the same problem in the same file or target, or no finished run has looked again yet), not_in_latest_run (the latest run checked that rule clean and no longer has it: fixed or moved), unknown (the latest run could not confirm a fix: it errored or skipped, stored only part of its findings, did not run or could not decide the rule, or read only part of the project; stateReason says which) or allowlisted. The latest run is the newest one that looked at the same thing: a design server scan is compared only with server scans and a CI push only with CI pushes, and a run scoped to another story is skipped. Treat unknown as still open. A finding in a project the key cannot reach is a 404. Returns { id, projectId, gate, gateLabel, gateMeaning, ruleId, rule, severity, reason, fix, location, state, stateReason, run, latestRun }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| findingId | Yes | Gate finding id (the id field of a finding in list_gate_findings, get_radar, get_code_health…) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the state machine (open/not_in_latest_run/unknown/allowlisted), how the 'latest run' is matched (design-server vs server scans, CI vs CI pushes, other-story scopes skipped), the guidance to treat unknown as open, and the 404 for inaccessible projects. That is substantial behavioral context the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded and mostly earns its place, but it is delivered as one enormous run-on sentence with deeply nested parenthetical clauses about state semantics, which is hard to parse. Structure could be broken into separate lines for state, fix, and location.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the full return shape ({ id, projectId, gate, gateLabel, ruleId, rule, severity, reason, fix, location, state, stateReason, run, latestRun }) and the nested fix fields. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the provenance of the id and ties it to the specific source tools, giving the agent more than the schema's format/pattern constraint alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('explain one gate finding by its id') and enumerates exactly what the explanation contains: the raising check, rule, reason, location, fix, and lifecycle state. It also names the sibling tools that produce the id, so an agent can distinguish it from get_fix_context or suggest_fix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says where the id comes from (list_gate_findings, get_radar, get_recipe_drift, get_code_health, get_store_status, or the console) and when a finding is unreachable (404). It does not explicitly contrast itself with adjacent tools like get_fix_context, so it falls short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_app_recipeApp recipeARead-onlyIdempotentInspect
Return the App Recipe for a project: one card per element (schema, design, routes, gates, ci, deploy, env, integrations), each with a state, a plain-English reason, key facts, a findings count and console links, plus the worst state overall and the mushi.recipe.json manifest status. Every element is exactly one of ok | drift | unknown | not_connected | error. unknown means configured but not observed recently and never means healthy; not_connected means nothing is configured. Returns { projectId, worst, elements: { : { state, reason, facts, findingsCount, lastCheckedAt, links } }, manifest, snapshotHash }. Read-only. Use to see how the app is put together and which part is drifting; use get_design_tokens for the token values, get_design_deviance for code that drifts off them, or list_gate_findings for gate detail.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint/idempotentHint, so 'Read-only' is largely redundant, but the description adds real behavioral weight: it defines the full state vocabulary (ok | drift | unknown | not_connected | error) and explicitly warns that 'unknown' never means healthy and 'not_connected' means nothing is configured. That prevents an agent from misreading results. It stops short of auth/rate-limit or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then the element set, the state vocabulary, the return shape, and finally alternatives — each block serves a distinct need. The inline return-shape JSON is the heaviest part but is justified because there is no output schema. Slightly dense rather than wasteful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the return-value burden itself and lists the full response shape ({ projectId, worst, elements, manifest, snapshotHash }) plus the element state semantics. For a single-param read tool this covers everything an agent needs to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter with 100% schema description coverage; the schema already documents projectId, its UUID type, the server-configured default, and the `project_id` alias. The description adds nothing beyond it, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Return the App Recipe for a project') with the exact contents enumerated (per-element cards for schema, design, routes, gates, ci, deploy, env, integrations). It also names the sibling tools it is not (get_design_tokens, get_design_deviance, list_gate_findings), so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to see how the app is put together and which part is drifting' gives the selecting condition, and it explicitly routes to get_design_tokens for token values, get_design_deviance for code that drifts off them, and list_gate_findings for gate detail. When-to-use and alternatives are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auto_release_statusAuto-release blockerARead-onlyIdempotentInspect
Return the automatic release draft that is blocking auto-release for one project, if any. Only one automatic draft can exist at a time, so a draft whose publish failed stops every later automatic release until a person publishes or deletes it (mushi releases publish / delete, or the console Releases page). Optional projectId (defaults to the configured project). Returns { blockingDraft: { id, version, createdAt, autoSource, stale } | null }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint, idempotentHint and openWorldHint, so the closing 'Read-only' is largely redundant. The description earns credit for real behavioral context beyond them: only one automatic draft may exist, and its failure blocks every subsequent automatic release until a human acts. It stops short of permissions or rate-limit details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose, then the blocking semantics, then the remedy, then the return shape. Dense but every clause contributes; the trailing 'Read-only' and repeated default note are minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description explicitly documents the return contract ({ blockingDraft: { id, version, createdAt, autoSource, stale } | null }), covers the optional parameter's default, and explains the blocking condition. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional projectId is fully documented there, including the 'project_id' alias and the server-configured default. The description restates the default without adding syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the automatic release draft that is blocking auto-release for one project') with the singleton scope made explicit. No sibling tool covers this, and the phrase 'if any' plus the nullable return makes the query nature unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes the condition under which a result exists (a failed-publish automatic draft halting later releases) and routes the agent to the resolution paths ('mushi releases publish / delete, or the console Releases page'). It never states an explicit when-not or a named alternative read tool, so it falls just short of the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blast_radiusBlast radiusARead-onlyIdempotentInspect
Return the other components/pages a bug group touches, via knowledge-graph traversal from the report node. Returns { nodes: [{ id, label, type }], edges }. Read-only. Use before dispatch_fix to scope a change safely; use get_knowledge_graph to traverse from an arbitrary seed, or analyze_codebase_impact for file-level import impact.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Graph node UUID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the bar for additional disclosure is lower. The description adds value by explaining the traversal origin ('from the report node') and the exact return shape ('{ nodes: [{ id, label, type }], edges }'), which is especially useful since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states purpose and return format, the second provides usage timing and alternatives. There is no filler or redundant restating of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with strong annotations, the description covers purpose, return shape, intended usage, and alternates. It is complete enough for an agent to decide when to invoke it and what to expect in the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers nodeId as 'Graph node UUID', so baseline is 3. The description adds meaning by indicating the traversal starts from a report node, which clarifies what kind of UUID should be supplied. This is a useful supplement to the schema, though it does not give detailed instructions on locating the nodeId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Return') and resource ('other components/pages a bug group touches'), and clarifies the mechanism ('knowledge-graph traversal from the report node'). It also distinguishes itself from sibling tools by naming get_knowledge_graph and analyze_codebase_impact as alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use before dispatch_fix to scope a change safely.' It also names alternatives with their distinguishing conditions: get_knowledge_graph for arbitrary seeds and analyze_codebase_impact for file-level import impact. This gives an agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_design_devianceDesign devianceARead-onlyIdempotentInspect
Return how far the code drifts off the design system: the latest 0–100 deviance score (lower is better; null means not scored yet), its per-rule breakdown, the score trend, a scan still running if any, the top findings (file, line, literal value, rule, and the nearest token to use instead), and the active rules (off_token_color, off_token_font, off_scale_spacing, off_scale_radius, contrast_below_aa, raw_interactive_element). Optional limit: findings to return (1–200, default 25). Returns { projectId, latest, running, trend, findings, rules }. Read-only. Use to find and fix off-token code; use get_design_tokens for the full token list.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Findings to return, 1–200 (default 25). | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and openWorld, and the description adds real behavioral context beyond them: score range semantics (0–100, lower is better), that null means not scored, that a scan may still be running, and the finding structure. It repeats 'Read-only' from the annotations, slightly redundant, but the semantic disclosures are genuinely useful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, then the return payload is enumerated. It is dense and somewhat run-on, but with no output schema present the field enumeration earns its place; minor redundancy in repeating limit and read-only wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return contract and does so thoroughly: score semantics, rule list, trend, running state, finding fields, and the active-rule enumeration. Combined with the routing note to the sibling, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented in the schema, including the limit range and the projectId default. The description only restates the limit range and default, adding no meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it returns the design-deviance score and its breakdown for a project. It also names the sibling it is not (get_design_tokens), so an agent can route correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to find and fix off-token code') and names the alternative 'get_design_tokens' for the full token list. It does not clarify the relationship to the sibling run_design_deviance (which presumably triggers a scan), leaving a small inference gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_design_settingsDesign score actionsARead-onlyIdempotentInspect
Return what the design deviance score may do on its own for one project: threshold (0–100; the actions fire above it), failCi (mushi recipe check --push fails CI above it), autofix (new warn/error findings above it dispatch a fix) and autofixEnabled (the project auto-fix switch, without which the design auto-fix does nothing), plus canEdit. Optional projectId. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so safety is covered; the description adds real domain semantics beyond that, explaining what each flag actually does (threshold fires actions above it, failCi fails CI on push, autofix dispatches fixes, autofixEnabled gates the whole auto-fix behavior). It doesn't describe error or fallback behavior when no project is configured, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence plus two short trailing fragments; the returned fields are front-loaded and the read-only nature is stated last. It is efficient with no filler, though cramming four field definitions into one sentence slightly hurts scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return value, and it does so by naming all five fields and their meanings. An agent knows what it gets back and that omission of projectId is safe; only the fallback/error case is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single projectId parameter is already fully documented including the snake_case alias. The description only restates that projectId is optional, adding no syntax or scoping detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: it returns the design deviance score's actionable settings for one project, and enumerates the specific fields returned (threshold, failCi, autofix, autofixEnabled, canEdit). It does not explicitly name the write counterpart set_design_settings, but 'Read-only' implicitly frames it against that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the read-side of the settings pair and that projectId scopes it to one project or falls back to the server-configured one. There is no explicit 'use this when... / use set_design_settings when...' routing, which would matter given the paired write tool in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_design_tokensDesign tokensARead-onlyIdempotentInspect
Return the app's normalized design tokens (DTCG: path, type, resolved value, hex / px, alias, CSS var, TS and RN names, description, defining file) for the active token set, plus nameMap (CSS var or TS name → token path). This is the tool that makes a fix use the app's tokens instead of hard-coded literals: look up the token for a colour, spacing, radius or font before writing one. Optional filters: group (first path segment, e.g. color, space), type (color | dimension | fontFamily | …), direction (a named token set instead of the active one). Returns { projectId, set, tokens, nameMap, total }; at most 500 tokens. Read-only. Use get_design_deviance to see where code drifts off these tokens, or get_app_recipe for the overall state.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only tokens of this DTCG $type (color, dimension, fontFamily, …). | |
| group | No | Only tokens in this group (first path segment, e.g. color, space, radius). | |
| direction | No | A named token set (directions/<name>/) instead of the active one. | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces 'Read-only'. Crucially, it adds behavioral facts annotations cannot convey: the 500-token cap, the exact return shape { projectId, set, tokens, nameMap, total }, and the nameMap direction (CSS var/TS name → token path). It doesn't discuss pagination or how the cap interacts with filters, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the return payload, then the motivating use case, then filters, then the return shape and limit. Dense but every clause carries information. Slightly repetitive in listing both return fields in prose and in { ... } form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup tool with no output schema, the description supplies the return shape, the cap, the nameMap semantics, and routing to the two most relevant siblings. An agent has everything needed to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters. The description adds useful framing for group/type/direction (e.g. direction means 'a named token set instead of the active one') but largely restates what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Return) and resource (normalized design tokens) and enumerates the exact payload fields (path, type, resolved value, hex/px, alias, CSS var, TS/RN names, description, defining file). This clearly distinguishes it from siblings like get_design_settings (settings) and get_design_deviance (drift analysis).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the primary use case ('makes a fix use the app's tokens instead of hard-coded literals: look up the token for a colour, spacing, radius or font before writing one') and names two alternatives with their distinct purposes: get_design_deviance for drift, get_app_recipe for overall state.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fix_contextFix context bundleARead-onlyIdempotentInspect
Bundle everything an agent needs to fix one bug in a single call: a paste-ready fixPrompt (plain-English diagnosis + reproduction + suggested fix + relevant code + blast radius), plus report detail, repro steps, component, root cause, ontology tags, and the inventory action (with its expected_outcome contract) the report is filed against, plus recipe: a ≤4 KB excerpt with the app's tokens (CSS var / TS names), the design deviance score and deviance findings in the files this fix touches, so the fix uses the app's tokens instead of literals, and recipe.context: the tables the stack trace names with their columns from the latest schema snapshot (and any it says do not exist), whether the last merged fix is live, and the open hole-check findings, each section with its own state and note. Returns { report, fixPrompt, reproductionSteps, component, rootCause, bugOntologyTags, inventoryAction, recipe }; recipe is always { state, note, … } with state ok | drift | unknown | not_connected | error, never null. Read-only; no second LLM key needed. Use before writing a fix; use triage_issue for a multi-report review packet, or suggest_fix for just the Stage-2 hint.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID to fix (`report_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| recipe | Yes | Design excerpt (≤ 4 KB) for the report's project: tokens with CSS var / TS names, the deviance score, findings in the files this fix touches, and context (tables the stack trace names, whether the last fix is live, open hole checks). Never null; when it could not be read, { state: 'error', note }. |
| report | Yes | |
| component | Yes | Component or page the bug was attributed to |
| fixPrompt | Yes | Paste-ready fix prompt composed server-side, or null |
| rootCause | Yes | Stage-2 root cause, or null before Stage 2 runs |
| bugOntologyTags | Yes | Bug ontology tags, or null |
| inventoryAction | Yes | The inventory action (with its expected_outcome contract) the report is filed against, or null |
| reproductionSteps | Yes | Reproduction steps recorded on the report ([] if none) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint/idempotentHint, and the description goes well beyond them: it discloses the recipe state machine (ok | drift | unknown | not_connected | error, never null), that each section carries its own state and note, and that no second LLM key is required. That is meaningful operational context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is dense but mostly earns its place given the rich 8-field return. However it is delivered as one sprawling near-sentence packing fixPrompt, recipe, recipe.context and inventoryAction into a single block, which hurts readability. Front-loading is good but structure could be split into digestible lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema already existing, the description fills the remaining gaps an agent would care about: what 'recipe' and 'recipe.context' contain, the guaranteed state enum, and how it relates to sibling tools. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters (reportId, projectId plus the snake_case aliases), so the schema already documents them fully. The description adds no extra meaning about the parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and scope ('Bundle everything an agent needs to fix one bug in a single call') and then enumerates the concrete payload sections: fixPrompt, report detail, repro steps, component, root cause, ontology tags, inventory action, and recipe/recipe.context. It also names the distinct siblings (triage_issue, suggest_fix), so an agent can tell this apart from them without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use before writing a fix; use triage_issue for a multi-report review packet, or suggest_fix for just the Stage-2 hint.' It gives the when-to-use condition and two named alternatives with the condition that selects each, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_fix_timelineFix timelineARead-onlyIdempotentInspect
Return the ordered lifecycle of one fix attempt: dispatched, started, branch, commit, PR opened, CI, completed/failed, with timestamps and the PR URL. Returns { events: [{ ts, stage, detail }] }. Read-only. Use to debug "why did this fix fail?" after dispatch_fix; use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, and the description redundantly says 'Read-only.' It adds useful behavioral context beyond the annotations by describing the ordered stage lifecycle and the returned event structure. It does not contradict the annotations, and the safety profile is adequately covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the main purpose, and efficiently provides output shape plus usage guidance. The only minor waste is the standalone 'Read-only.' sentence, which merely repeats the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-fix-attempt tool with only two parameters, the description covers what an agent needs: the exact operation, the output shape, when to call it, and which sibling tools to use instead. No output schema exists, but the description provides the return shape directly, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents fixId and projectId, including accepted aliases. The description adds no new parameter-level semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Return'), a specific resource ('one fix attempt'), and the exact scope ('ordered lifecycle... dispatched, started, branch, commit, PR opened, CI, completed/failed'). It also distinguishes itself from get_report_timeline by explicitly limiting scope to a single fix attempt rather than the whole report thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is explicit when-to-use guidance ('Use to debug "why did this fix fail?" after dispatch_fix') and named alternatives with their purposes ('use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread'). This fully routes an agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graph_neighborhoodGraph neighborhoodARead-onlyIdempotentInspect
Return the BFS neighborhood around one graph node by id or label: { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4). Read-only. Tuned for "what touches this action?"; use get_knowledge_graph to traverse from a component seed, or get_graph_node for a single node's row.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | Yes | Starting graph node id or label to expand around (e.g. an inventory Action id or component name) | |
| depth | No | BFS hops to traverse outward. Default 2; clamped to a max of 4. |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | Edges connecting the returned nodes |
| nodes | Yes | Graph nodes within the depth budget |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotence, and the description goes further by disclosing BFS traversal, a depth budget with default and max, and the returned node/edge structure. It doesn't over-explain beyond what an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, with the core output and depth behavior front-loaded before routing guidance. Every phrase adds either operational or selection value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers what it returns, how traversal depth works, when to use it, and which siblings handle adjacent cases. With an output schema and rich annotations present, nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description reinforces that seed can be by id or label and mentions depth default/max, but those details are already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Return the BFS neighborhood around one graph node by id or label') and gives the exact return shape. It also explicitly positions itself against siblings like get_knowledge_graph and get_graph_node, so it's easy to tell apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit use-case signal ('Tuned for "what touches this action?"') and names two alternatives with their distinct seeding conditions. This leaves no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_graph_nodeGraph node detailARead-onlyIdempotentInspect
Fetch one knowledge-graph node row by id. Returns { node: { id, node_type, label, metadata } } including the v2 derived status on Action nodes (ok | stale | broken). Read-only. Use to inspect a single node's status; use get_graph_neighborhood to see what connects to it.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | The graph_nodes.id of the node to fetch (UUID). |
Output Schema
| Name | Required | Description |
|---|---|---|
| node | Yes | Single graph_nodes row including metadata (Action nodes carry v2 status) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, open-world, and idempotent behavior, so the description only needs to add extra context. It adds the return shape and, notably, the v2 derived status on Action nodes (ok | stale | broken), which is useful behavioral information beyond the annotations. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The action is front-loaded, the return shape is compact, and the sibling distinction is placed at the end. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single required parameter, a rich output schema, and annotations that already convey the safety profile, the description provides all the operational context an agent needs. It also routes to the relevant sibling tool, making the definition complete for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents nodeId as a UUID graph_nodes.id. The description merely repeats 'by id' and adds no additional parameter semantics beyond what the schema provides, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch'), a specific resource ('knowledge-graph node row'), and the lookup key ('by id'). It distinguishes itself from get_graph_neighborhood by clarifying this tool returns a single node's details rather than connections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool to inspect a single node's status and directs the agent to get_graph_neighborhood for connectivity queries. This gives clear when-to-use and alternative guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inventoryInventory snapshotARead-onlyIdempotentInspect
Return the current inventory.yaml snapshot for a project: latest ingest, validation errors, and a per-action status summary. Returns { snapshot, validationErrors, actions: [{ id, status }] }. Requires the inventory_v2 plan. Read-only. Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only.' The description adds a non-obvious prerequisite ('Requires the inventory_v2 plan') and documents the return shape, which is especially valuable because there is no output schema. It does not detail all failure modes, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the core behavior, then add return shape, prerequisite, and sibling routing without waste. The structure makes the tool immediately scannable and actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one optional parameteramen and no output schema, the description provides the return structure, distinguishes from relevant siblings, and states the prerequisite. An agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage: projectId is fully described, including its default behavior and accepted alias. The description adds no new parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Return the current inventory.yaml snapshot' and gives the exact response shape. It also differentiates itself from sibling tools by naming diff_inventory and list_gate_findings and contrasting their purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit selection guidance: 'Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.' It also states the prerequisite 'Requires the inventory_v2 plan,' which tells the agent when the tool is applicable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_knowledge_graphKnowledge graph traversalARead-onlyIdempotentInspect
Traverse the knowledge graph from a seed component or page. Returns { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4 hops). Read-only. Use to see how a component connects to the rest of the app; use get_blast_radius for a bug's impact area, or get_graph_neighborhood for a tighter BFS around one node.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | Yes | Starting graph node id or human-readable label to traverse from | |
| depth | No | BFS hops outward from seed — clamped to 4 in the handler (default 2) |
Output Schema
| Name | Required | Description |
|---|---|---|
| edges | Yes | Edges connecting the returned nodes |
| nodes | Yes | Graph nodes within the depth budget |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces the read-only nature while adding behavioral context beyond annotations: the traversal respects a depth budget (default 2, max4 hops) and returns a specific nodes/edges structure. It does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short,front-loaded with purpose and output, and contains no fluff. The only slight redundancy is stating 'Read-only' when the annotations already declare readOnlyHint, and the return shape is already expressed by the output schema, but overall the structure is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only traversal tool with only one required parameter and a rich output schema, the description covers the key behavioral constraints (depth default/max), the intended usage, and the sibling differentiation. Nothing essential for an agent to correctly select and invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with seed and depth already documented. The description loosely reinforces these concepts by calling the seed a 'component or page' and mentioning the depth budget, but it does not add meaningful semantic details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Traverse the knowledge graph from a seed component or page.' It also names the return shape (nodes and edges) and explicitly differentiates from sibling tools by pointing to get_blast_radius and get_graph_neighborhood, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: 'Use to see how a component connects to the rest of the app.' It also names alternatives and their specific use cases: get_blast_radius for a bug's impact area and get_graph_neighborhood for a tighter BFS around one node.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_mushi_docRead a Mushi docs pageARead-onlyIdempotentInspect
Fetch one official Mushi docs page as Markdown, by a url from search_mushi_docs or a route such as "/quickstart/mcp". Returns { title, url, markdown, truncated }; markdown is capped at 8,000 characters and says where to read the rest. Only indexed docs pages resolve. Read-only; works without an API key. Use after search_mushi_docs when an excerpt is not enough.
| Name | Required | Description | Default |
|---|---|---|---|
| page | Yes | A url from search_mushi_docs, or a docs route such as "/quickstart/mcp". |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | |
| title | Yes | |
| markdown | Yes | |
| truncated | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds substantial behavioral context: the return shape ({ title, url, markdown, truncated }), the 8,000-character cap with a pointer to read more, the requirement that pages be indexed, and the note that no API key is needed. These details go beyond the annotations and are not contradictory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the core purpose and return format. Every sentence adds value: the input source, the return structure, the truncation behavior, the indexing caveat, and the usage timing. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with a detailed output schema and annotations covering safety, the description covers all necessary aspects: input source, output format, size limits, prerequites (indexed pages), authentication (no API key), and when to use. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (the page parameter is described as 'A url from search_mushi_docs, or a docs route such as \"/quickstart/mcp\"'). The description adds a concrete example route and reinforces the two accepted input forms, which slightly enriches the schema but is largely redundant. Since coverage is high, baseline is 3, but the example and explicit mention of the search source push it to 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb+resource: 'Fetch one official Mushi docs page as Markdown'. It also distinguishes from siblings by mentioning the source (url from search_mushi_docs) and the trigger condition ('Use after search_mushi_docs when an excerpt is not enough'). This makes the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: 'Use after search_mushi_docs when an excerpt is not enough' directly names the sibling and the condition for selection. Also states the constraint 'Only indexed docs pages resolve', giving the agent a clear precondition. This is more than enough to route the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolioPortfolio — every app at onceARead-onlyIdempotentInspect
Return every project in one organization as a card: the worst App Recipe state (ok | drift | unknown | not_connected | error; unknown and not_connected never mean healthy), open reports, the latest release, the Mushi SDK version against the latest release of the same package, the hole-check (radar) status with open findings by severity (never_run means not checked yet), and the 30-day LLM spend Mushi itself used. Optional organizationId (UUID); omitted, the only organization of the key owner is used, and a 400 ORG_REQUIRED lists the choices when there are several. Needs an account-level key; a project-bound key gets 403. Returns { organizationId, organizationName, cards, totalProjects, repeatedGroups, holes, readErrors }. A read that failed or was cut short is listed in readErrors and in the unreadable list of each card: those columns are unknown, never zero, "no cap" or "none yet" (holes is null when the integrations could not be read). Read-only. Use list_portfolio_findings for the problems open in two or more apps.
| Name | Required | Description | Default |
|---|---|---|---|
| organizationId | No | Organization UUID — defaults to the key owner's only organization when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the bar is lower, yet the description still adds substantial behavioral context: auth requirements and the 403 outcome, the ORG_REQUIRED 400 disambiguation, and detailed failure semantics (readErrors, unreadable columns reported as unknown rather than zero, holes null when integrations can't be read). It also defines non-obvious enum members ('unknown and not_connected never mean healthy', 'never_run means not checked yet').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, and with no output schema every sentence about card fields, return keys and failure handling earns its place. The opening sentence is a long run-on enumeration with heavy parentheticals, which slightly hurts scannability, but there is essentially no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description supplies what an agent actually needs: the full return shape ({organizationId, organizationName, cards, totalProjects, repeatedGroups, holes, readErrors}), the meaning of ambiguous card states, auth and error-code behavior, and the routing alternative. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the baseline is 3; the description goes beyond the schema's 'defaults to the key owner's only organization when omitted' by explaining the multi-org failure path (400 ORG_REQUIRED lists the choices). UUID format itself is left to the schema, so it is not a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a precise verb+resource+scope ('Return every project in one organization as a card') and immediately enumerates what each card contains. It also distinguishes itself from the nearest sibling by routing two-or-more-app problems to list_portfolio_findings, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the alternative explicitly and the condition that selects it ('Use list_portfolio_findings for the problems open in two or more apps'), and gives the orgId-omission decision path plus the 400 ORG_REQUIRED branch when several organizations exist. The auth precondition (account-level key vs 403 for a project-bound key) is spelled out rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_radarHole checks (radar)ARead-onlyIdempotentInspect
Return the hole checks that catch a problem before a user hits it: store names that differ between the App Store and Google Play, a store listing missing a language, a domain or HTTPS certificate about to expire, missing security headers, a broken privacy link, storage rows deleted with SQL (files left behind and billed), and an Android target SDK or iOS build that the stores will refuse. scope "project" (default; projectId optional) returns every check with state ok | finding | unknown | error, a plain-English reason, and each finding with its fix; unknown means not checked and never means healthy. scope "organization" (organizationId optional, account-level key) returns the open findings of every app. Read-only. To run the checks again, use the console Recipe page.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | project (default) or organization | |
| projectId | No | Project UUID — defaults to the server-configured project (scope project) (`project_id` is accepted too.) | |
| organizationId | No | Organization UUID — defaults to the key owner's only organization (scope organization) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint and openWorldHint, so the 'Read-only' sentence is largely redundant. The description does add genuinely non-structured semantics: the four possible states (ok | finding | unknown | error) and the crucial clarification that 'unknown means not checked and never means healthy', plus that each finding carries a plain-English reason and a fix. It does not repeat annotation content as its only contribution, so it clears the lower bar set by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening clause front-loads the core purpose before the long enumeration of check types, and the scope semantics follow. It is a single dense paragraph rather than a bulleted list, so the enumeration of check categories is heavy to read, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so well: it specifies the four states, the presence of a plain-English reason, and per-finding fixes, which is exactly what an agent needs to interpret results. The one shortfall is that it never mentions the run_radar sibling, so an agent asked to re-run checks is pointed at a UI page instead of an available tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description exceeds it by explaining defaulting behavior and interaction between parameters that the schema only states tersely: projectId is optional and falls back to the server-configured project, organizationId is optional and falls back to the key owner's only organization, and organization scope requires an account-level key.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete verb and resource ('Return the hole checks') and then enumerates the specific defect classes it surfaces (store name mismatches, missing listing languages, expiring certs, broken privacy links, orphaned storage rows, rejected target SDKs). It implicitly distinguishes itself from the sibling run_radar by framing the tool as a read-only retrieval of existing check results rather than a trigger.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional guidance for the two scopes: 'project' (default, projectId optional) returns every check with state, while 'organization' (organizationId optional, account-level key) returns open findings across all apps. However, it does not name the sibling tool run_radar as the way to re-run checks, instead pointing at 'the console Recipe page', which is a UI instruction rather than a tool alternative an agent can act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_reportsRecent bug reportsARead-onlyIdempotentInspect
List recent bug reports for a project, newest first. Returns { reports: [{ id, status, category, severity, summary, component, created_at, processing_error }], total }; includeRaw=true returns every list column instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Optional filters: status (new|classified|grouped|fixing|fixed|verified|reopened|dismissed|…), category (bug|slow|visual|confusing|other), severity (critical|high|medium|low), limit (default 20, max 100). Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reports to return (default 20, max 100) | |
| status | No | Filter by status. "new" also matches queued rows; "classified" and "fixed" include legacy aliases. | |
| category | No | Filter by category. | |
| severity | No | Filter by severity. | |
| projectId | No | Project UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.) | |
| includeRaw | No | Return every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| reports | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint=true, idempotentHint=true, the description adds important behavioral context: it promises newest-first ordering, discloses that includeRaw=true changes the returned columns, and states that reporter identifiers are never returned. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose and return shape, followed by filters and routing guidance. It earns its length because it packs meaningful details (never returns reporter IDs, includeRaw behavior, limit defaults), but a sentence or two could be trimmed since some filter details duplicate the schema enums.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering read-only/idempotent safety, the description still supplies what an agent needs: ordering, optional filters, limit bounds, includeRaw semantics, the never-returned reporter data, and routing to siblings. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters thoroughly, including enums and aliases. The description itself repeats some filter details (status/category/severity enums, limit defaults) and adds the note that reporter identifiers are never returned—useful but not a major compensation need. Baseline 3 is exceeded slightly because the description reinforces the key filter semantics and the default/max limit, but it also largely duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List recent bug reports for a project, newest first'), specifies the return shape, and distinguishes itself from siblings by naming alternatives (get_report_detail, search_reports). The scope (project, newest first) is clear, and the presence of filters reinforces its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.' This provides clear when-to-use guidance and names alternatives, which is exactly what the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipe_changeRecipe change statusARead-onlyIdempotentInspect
Return one recipe change job by jobId (the jobId propose_recipe_change returned): { id, element, status, pr_url, pr_number, branch, error, batch_id, created_at, started_at, finished_at }. status moves queued → running → pr_opened, or ends rejected or failed with the reason in error; a job stuck past its deadline reads as failed. Optional projectId. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| jobId | Yes | The jobId propose_recipe_change returned | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond them: the status state machine (queued → running → pr_opened, rejected, failed), that error carries the failure reason, and that a job past its deadline reads as failed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by the return-field list and lifecycle semantics. Slightly dense with the inline field enumeration, but every element earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields and explaining the terminal statuses and deadline failure behavior. Combined with the jobId/projectId guidance, an agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the projectId default. The description only notes 'Optional projectId' and the jobId source, adding no syntax or format detail beyond what the schema provides — the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return one recipe change job by jobId') and names propose_recipe_change as the originating tool, which lets an agent distinguish it from other get_* siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the usage context clear by tying jobId to the value propose_recipe_change returned, implying this is the follow-up status-polling call. It does not state explicit when-not conditions, but there is no competing sibling that would be confused with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipe_driftRecipe driftARead-onlyIdempotentInspect
Return what drifted from the app recipe, with a fix for each: CI workflows (no concurrency or timeout, macOS on every run, long artifact retention, crons more than daily, the default branch red), deploys (a merged fix not live yet, a failed version probe, web and mobile on different versions), env names declared but missing in CI, migrations in the repo but not applied, and off-token design values. For each gate it says when it last ran (never_run means not checked, never healthy). Returns { projectId, gates: { : { status, checkedAt, commitSha } }, findings: [{ gate, ruleId, severity, message, filePath, line, suggestedFix }] }. Read-only. Mushi never runs DDL or edits workflows: apply schema and CI fixes from your editor.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely new behavioral context: it clarifies that despite returning suggestedFixes it never applies them ('Mushi never runs DDL or edits workflows'), and it explains the semantics of the gate status (never_run means not checked, never healthy).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and return structure are front-loaded, and the long enumeration earns its space because there is no output schema to carry it. It is dense and somewhat run-on, but not padded with filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and delivers: it spells out the return shape ({ projectId, gates, findings }), the field-level meaning of findings and gate status, and the follow-up action for applying fixes. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single optional projectId, so the schema already documents the parameter fully (including the project_id alias). The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Return what drifted from the app recipe') and then enumerates the exact drift categories it detects (CI workflows, deploys, env names, migrations, off-token design values). This clearly separates it from siblings like get_app_recipe (which returns the recipe itself) and get_design_deviance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the rich enumeration of what it detects — you call it to find drift and get fixes — but the description never names an alternative (e.g. get_app_recipe, list_gate_findings, get_design_deviance) or states when-not to use it. The trailing note on applying fixes hints at a boundary but does not route between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recipe_sourcesRecipe source filesARead-onlyIdempotentInspect
Return the repo files a recipe change may edit for one part of the recipe: element gates (mushi.recipe.json budgets and cadence), env (.env.example declarations) or routes (the inventory file). Each file has { path, exists, content, sha, writable, reason }, read from the default branch head; a file over 512 KB or one containing something shaped like a secret has content null. Pass each sha as baseSha to propose_recipe_change so a file that changed since is refused. Optional projectId. Returns { ok, element, branch, headSha, files } or { ok: false, reason }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| element | Yes | gates (mushi.recipe.json budgets), env (.env.example) or routes (the inventory file) | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/openWorld, but the description adds substantial non-obvious behavior: files are read from the default branch head, files over 512 KB or containing secret-shaped content return content null, and stale shas cause refusal at propose time. This is exactly the kind of behavioral context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then behavior, then return shape and the read-only note; nearly every clause earns its place. The parenthetical enumerations of element values duplicate the schema, which is the only minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, yet the description fully specifies the return envelope ({ ok, element, branch, headSha, files } or { ok: false, reason }) and the per-file fields { path, exists, content, sha, writable, reason }. Nothing an agent needs to call and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, and the description largely repeats the enum semantics verbatim. It adds only 'Optional projectId', which the schema already conveys via the description and non-required status. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with scope: 'Return the repo files a recipe change may edit for one part of the recipe', then enumerates the three element variants. An agent can distinguish this from siblings like get_app_recipe, get_recipe_change, and propose_recipe_change without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete workflow instruction: 'Pass each sha as baseSha to propose_recipe_change so a file that changed since is refused', which tells the agent this tool feeds the propose workflow. It does not state when NOT to use it or name alternative sources of similar info (e.g. get_app_recipe), so it falls 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.
get_release_calendarRelease calendarARead-onlyIdempotentInspect
Return the release calendar of one organization: per app, what is live, the fixes merged since (waiting to ship) and the store state, plus a suggested batch of apps to release now versus next that respects the estimated CI minutes of each build. Mushi only proposes the batch; your CI builds and submits. Optional organizationId (UUID); omitted, the only organization of the key owner is used, and a 400 ORG_REQUIRED lists the choices when there are several. Needs an account-level key; a project-bound key gets 403. Returns { rows, batchSuggestion, note }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| organizationId | No | Organization UUID — defaults to the key owner's only organization when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint/openWorldHint annotations by disclosing failure modes (400 ORG_REQUIRED with a list of choices, 403 for project-bound keys), the auth model, and the critical behavioral fact that the tool only proposes a batch rather than executing a release. 'Read-only' does echo the annotation, but the surrounding detail is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries information (contents, batching semantics, defaults, auth, return shape). The prose is dense and somewhat comma-spliced into long clauses, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the return keys ({ rows, batchSuggestion, note }), and it covers scope, defaults, error codes, and permission requirements. An agent has everything needed to call this correctly without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single organizationId param, so the baseline is 3; the description adds real meaning by spelling out the omitted-parameter fallback and the multi-organization error path (400 ORG_REQUIRED lists the choices), which the schema description does not mention.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the release calendar of one organization') and enumerates exactly what it contains: live apps, merged-but-unshipped fixes, store state, and a release batch suggestion. This is clearly distinguishable from siblings like get_store_status and get_auto_release_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the workflow boundary explicitly — 'Mushi only proposes the batch; your CI builds and submits' — which tells the agent what this tool will and will not do. It also gives the key-scope precondition (account-level key vs project-bound 403), though it never names an alternative sibling tool to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_repo_diagramArchitecture diagramARead-onlyIdempotentInspect
Return the latest architecture diagram of the connected repo: its parts (nodes with a label, group, repo path and one-line description), how they connect (edges), the commit it was drawn at, and whether a public page is published for it (url, outdated, indexable). diagram is null when none has been drawn yet: one is drawn from the console Repo page (one AI call per commit). overlay: true also returns the open bug reports and code findings placed on each part (by stack frames, fix files and finding paths). Optional projectId. Returns { diagram, publication } and, with overlay, overlay: { diagram_id, nodes, unplaced, frames_matched, considered } (null while there is no diagram). Works without codebase indexing. Read-only. Use to see where a bug sits in the app before reading code; use get_repo_digest for the code itself.
| Name | Required | Description | Default |
|---|---|---|---|
| overlay | No | Also place the open bug reports and code findings on each part of the diagram | |
| projectId | No | Project UUID (defaults to configured project) (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/openWorld/idempotent, but the description adds substantial context beyond them: the null-when-undrawn behavior, how a diagram gets created (console Repo page, one AI call per commit), the side effect of overlay:true (adds open bugs/findings mapped by stack frames and paths), and that no indexing is required. These are precisely the behaviors an agent needs that the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return shape, then details. It is dense and somewhat run-on with colon/parenthesis packing, but nearly every clause earns its place by carrying distinct behavioral or return-format information rather than restating structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description documents the return envelope ({diagram, publication}) and the overlay variant's shape, including the null cases. Combined with the creation prerequisite and indexing note, an agent has everything required to call and interpret the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description goes beyond the schema by spelling out the concrete effect of overlay:true and the meaning of the overlay payload fields (unplaced, frames_matched, considered). projectId is only labeled 'Optional', which the schema already conveys, so it adds little there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the latest architecture diagram of the connected repo') and enumerates what the diagram contains (nodes with label/group/path/description, edges, commit, publication). It explicitly differentiates itself from the sibling get_repo_digest, which returns the code itself. An agent can tell exactly what this tool produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('see where a bug sits in the app before reading code') and names the alternative with its selecting condition ('use get_repo_digest for the code itself'). It also states a key prerequisite/context ('Works without codebase indexing') and explains the null state arises until a diagram is drawn from the console Repo page.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_repo_digestRepo digest (paste-ready code)ARead-onlyIdempotentInspect
Return the connected GitHub repo as one paste-ready text digest at a pinned commit: a directory tree plus file contents, ranked README → manifests → entry points → source → tests and cut to a token budget (budgetTokens, default 50,000, max 200,000; counts are estimates). Scope it to a folder (path) or to one bug (reportId: the report's stack-frame files, fix files and related code first, then the files that import them). Sensitive files (.env, keys) are never included, and a file that looks like it holds a secret is replaced with a notice. Returns { sha, ref, total_tokens, budget_tokens, files: [{ path, tokens, truncated }], dropped_counts, redacted, scope, text }. Works without codebase indexing. Read-only. Use to hand yourself the code around a bug before fixing it; use get_fix_context for the diagnosis, or search_codebase to find one thing.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | Branch, tag or commit SHA (default: the repo default branch) | |
| path | No | Scope to one folder, e.g. "apps/web/src" | |
| exclude | No | Glob patterns to leave out, e.g. ["tests/"] | |
| include | No | Glob patterns a file must match, e.g. ["src/**/*.ts", "*.md"] | |
| reportId | No | Scope to one bug: the report's files come first, then the rest of the repo by priority (`report_id` is accepted too.) | |
| projectId | No | Project UUID (defaults to configured project) (`project_id` is accepted too.) | |
| budgetTokens | No | Estimated token budget for the whole digest (default 50,000) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly/idempotent/openWorld); the description goes well beyond by disclosing that .env/keys are never included, secret-looking files are replaced with a notice, token counts are estimates, ordering is README → manifests → entry points → source → tests, and it works without indexing. These are exactly the behavioral traits an agent needs before relying on the output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and the return shape are front-loaded, and with no output schema the return-field enumeration earns its place. It is dense, though the first sentence runs long enough that some detail could be trimmed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by spelling out the returned object (sha, ref, total_tokens, files, dropped_counts, redacted, scope, text). Combined with the redaction and indexing caveats, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: budgetTokens default and max, that reportId prioritizes stack-frame files, fix files and related code then the files that import them, and the ranking/scope behavior of path. The exclude/include and projectId params get no extra narrative, keeping it below a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return the connected GitHub repo as one paste-ready text digest at a pinned commit') and immediately differentiates itself from siblings by naming get_fix_context and search_codebase. The agent can tell exactly what artifact this produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes usage: 'Use to hand yourself the code around a bug before fixing it; use get_fix_context for the diagnosis, or search_codebase to find one thing.' It also gives both scoping modes (path vs reportId) with the condition that selects each, so when-to-use and alternatives are fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_detailReport detailARead-onlyIdempotentInspect
Fetch the full record for one bug report by id: description, console logs, network requests, screenshot URL, classification (stage 1/2), fix history, the paste-ready fix packet and the inventory action it is filed against. Returns { report } with the documented fields; includeRaw=true returns every column the detail route has instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Read-only. Use when you have a reportId and need everything about it; for evidence only use get_report_evidence, for the activity thread use get_report_timeline, for a one-call fix bundle use get_fix_context.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID (`report_id` is accepted too.) | |
| projectId | No | Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.) | |
| includeRaw | No | Return every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint and idempotentHint, and the description adds valuable behavioral context: reporter identifiers are never returned, includeRaw=true returns every column instead, and the response is wrapped in { report }. These details go well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, content list, response shape, privacy note, read-only statement, usage scenario, and sibling alternatives. It is dense but not bloated, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the full input schema, output schema, and annotations, this description covers what is returned, what is redacted, the alternative includeRaw mode, and when to choose sibling tools. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter has a description including accepted aliases. The tool description mentions includeRaw's effect but does not add significant new parameter semantics beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states a specific verb 'Fetch' with a specific resource 'the full record for one bug report by id' and enumerates its contents. It distinguishes itself from siblings by naming which tool to use for evidence, timeline, and fix bundle alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you have a reportId and need everything about it' and gives conditional routing to get_report_evidence, get_report_timeline, and get_fix_context. This is textbook when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_evidenceBug report evidenceARead-onlyIdempotentInspect
Return the full evidence package for a single bug report covering all three observability pillars: (1) LOGS — console_logs (error/warn/info/debug entries with timestamps), breadcrumbs (SDK ring buffer: navigation, clicks, network, lifecycle events with category/level), repro_timeline (merged SDK event stream: route/click/request/log/screen), and the reporter's own comments thread; (2) TRACES — network_requests (SDK-captured fetch/XHR with method/status/duration/traceId), backend_spans (server-side spans joined by W3C trace_id: name/duration_ms/parentSpanId/status), and Sentry trace correlation IDs (sentry_trace_id, sentry_event_id) for deeplinks; (3) METRICS — performance_metrics (Web Vitals snapshot: LCP/CLS/INP/TTFB/FCP + INP attribution + page timing + connection info), anomalies (statistical provenance when auto-filed by CI metric regression: baseline_mean/std, score in σ, threshold); plus screenshot_url, browser environment (user agent, URL, viewport, SDK version), and tags. Reporter identifiers (session id, end-user id) are never returned. This is the same data an engineer would collect for a root-cause investigation. Faster than calling get_report_detail + report timeline separately.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID. (`report_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds valuable behavioral disclosure beyond those hints: reporter identifiers (session id, end-user id) are never returned, and the evidence package is explicitly scoped to a single bug report. This is meaningful context about what the tool will and will not surface.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every sentence earns its place: it needs the detail because there is no output schema and the return payload spans many categories. The content is front-loaded with the core purpose, then organized by pillar with numbered subsections, making it easy for an agent to scan. The final comparison to get_report_detail plus report timeline is a useful, non-redundant closing note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining the return value, and it does so thoroughly: it lists logs, traces, metrics, screenshot, browser environment, tags, and explicitly states what is excluded. It also gives the relationship to sibling tools and the efficiency benefit. An agent has enough information to call the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the reportId parameter is documented as 'Report UUID. (`report_id` is accepted too.)'. The description does not add much beyond this, though it reinforces that the parameter selects a single bug report. Since the schema already carries the parameter meaning, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the full evidence package for a single bug report.' It enumerates exactly which data is included across logs, traces, and metrics, and explicitly distinguishes itself from get_report_detail and get_report_timeline. This makes it immediately clear what this tool does and how it relates to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: it returns the data an engineer would collect for root-cause investigation, and it is faster than calling get_report_detail and report timeline separately. It names alternatives and positions this tool as their combined, faster replacement, but it does not explicitly state when-not-to-use it or compare it with more decision-oriented siblings like get_fix_context or suggest_fix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_report_timelineUnified report timelineARead-onlyIdempotentInspect
Return the ordered activity timeline for one report (oldest to newest), merging reporter comments, fix events, QA runs, skill-pipeline steps, and Ask Mushi turns into one lane. Returns { events: [{ ts, kind, actor, summary }] }. Read-only. Use to see what happened end-to-end on a report thread; use get_report_detail for the static record or get_fix_timeline to debug one fix attempt.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | The report UUID (`report_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already supply readOnlyHint, openWorldHint, and idempotentHint. The description adds value by stating the ordering (oldest to newest), the merging behavior across multiple event streams, and the exact return shape. It does not mention potential rate limits or additional access constraints, but for a read-only getter this is sufficient context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences: purpose, return shape, and usage guidance. 'Read-only.' is redundant with the readOnlyHint annotation, which is a minor waste. Otherwise every sentence earns its place and the structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description includes a concrete return shape, names the sibling tools for contrast, and clarifies ordering and merge scope. With only one parameter and annotations covering safety/idempotency, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the parameter description already explains that reportId is the report UUID and accepts report_id. The tool description adds no extra parameter-level semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Return') and resource ('ordered activity timeline for one report'), enumerates the merged event kinds, and explicitly distinguishes itself from get_report_detail and get_fix_timeline. An agent can unambiguously identify what this tool does and when to use it over siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use for an end-to-end view of a report thread, with named alternatives get_report_detail for the static record and get_fix_timeline for debugging a single fix attempt. This is a model of when-to-use/when-not-to-use direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_similar_bugsSimilar bugsARead-onlyIdempotentInspect
Find existing bugs similar to a component, page, or description via pgvector nearest-neighbour search (same backend as search_reports, tuned for "have we seen this before?"). Returns ranked { reports: [{ id, summary, similarity }] }. Read-only. Use to dedupe before filing or group regressions; use search_reports for general free-text search.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 5, max 20) | |
| query | Yes | Component name, page path, or bug description |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds useful behavioral context beyond those: it explains the retrieval technique (pgvector nearest-neighbour), the tuning intent, and the ranked return shape. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose is front-loaded, return format is summarized, and usage/alternative guidance closes it out. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only tool with an output schema, the description covers what it does, what it returns, when to use it, and how it differs from search_reports. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents query as 'Component name, page path, or bug description' and limit with default/max. The description mostly restates this information without adding new parameter semantics, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Find existing bugs similar to...') and names the underlying mechanism (pgvector nearest-neighbour search). It also distinguishes itself from the sibling search_reports by noting it is 'tuned for "have we seen this before?"'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use to dedupe before filing or group regressions; use search_reports for general free-text search.' This tells the agent exactly when to choose this tool versus the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_reviewsStore reviews as reportsARead-onlyIdempotentInspect
Return the store review intake of one project: settings { enabled, maxRating, lastPulledAt, lastStatus, lastError }, the App Store and Google Play sources bound through connectors (connected false when the stored key cannot be read), the 20 reviews seen most recently { store, reviewId, rating, reportId, reviewCreatedAt, seenAt } (reportId set when the review was filed as a report), and canManage / canPull for the caller. Off by default. Optional projectId. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint), so the description adds real context: the intake is off by default, sources report connected=false when the stored key cannot be read, only the 20 most recent reviews are returned, and canManage/canPull expose caller-level authorization. That is useful behavioral nuance beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence front-loads the purpose and then enumerates the return shape, which is justified because there is no output schema. It is long but every clause carries field-level information; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by fully enumerating the returned settings, sources, review fields and permission flags, and it notes the 20-review cap and default-off state. What is missing is the tool's relationship to pull_store_reviews / set_store_review_intake, but nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single optional projectId, including the server-default fallback and the accepted alias. The description only repeats 'Optional projectId', adding nothing the schema does not already state, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Return the store review intake of one project') and enumerates the exact payload (settings, per-store sources, 20 most-recent reviews, caller permissions), which clearly separates it from action-oriented siblings like pull_store_reviews or run_store_review. However, it never explicitly names an alternative, so differentiation is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no comparison to the reads it overlaps with (get_store_status, pull_store_reviews, set_store_review_intake). 'Off by default' hints at a precondition state but does not tell the agent what to do when intake is disabled or which sibling to call instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_store_statusStore review statusARead-onlyIdempotentInspect
Return the latest store review of an app: listing text in the repo vs what is live on the App Store and Google Play (listing_drift, a language out of sync, store length limits), listing claims checked against the code (listing_claim_contradicts_code: for example "never leaves your phone" while the code uploads, or "open source" for a private repo), privacy labels vs data-collecting SDKs, iOS screenshots that look Android-shaped or older than recent releases, and a pre-submission checklist with a risk per item. Each result is ok | finding | unknown (not checked, never healthy). This is a check against the code, not legal advice. status never_run means it has not run yet; it runs from the console. Returns { projectId, checkedAt, status, results, checklist, findings }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already covering readOnly/openWorld/idempotent, the description still adds substantial behavioral context beyond them: it discloses the result vocabulary (ok | finding | unknown, noting 'unknown' means not checked rather than healthy), explains the never_run status and that it is triggered from the console, and states the return shape. This is exactly the extra behavior an agent needs when annotations alone would leave gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main purpose and the 'what gets checked' list are front-loaded, and the operational notes (result states, never_run, return shape, read-only) follow at the end. It is dense and long but each clause carries information; the illustrative examples in parentheses ('never leaves your phone') earn their place as clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by listing the returned fields (projectId, checkedAt, status, results, checklist, findings) plus the status/finding value semantics, which is complete for a single-parameter read. Only minor details such as auth or expected latency are absent, and those are not essential here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (projectId) with 100% schema description coverage, including the default-to-server-config note, so the schema already carries the semantics. The description adds nothing about projectId or how the default project is resolved, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Return the latest store review of an app') and then enumerates exactly what a store review covers (listing drift, claim-vs-code contradictions, privacy labels, screenshots, checklist). This makes it clearly distinct from user-review siblings, but it never names an alternative such as run_store_review or get_store_reviews, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: 'it runs from the console' and the never_run explanation hint that this tool reads existing results rather than triggering a run. There is no explicit when-to-use/when-not-to-use guidance and no named alternative, but the read-only framing and 'not legal advice' caveat give the agent enough to infer the correct context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_two_way_comms_healthTwo-way communication healthARead-onlyIdempotentInspect
Summarize SDK ↔ admin two-way reporter health for a host app: last SDK heartbeat, app version/platform last seen, unread reporter messages, recent reporter replies, and pending QA/TDD follow-ups. Use after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds behavioral context by listing what the summary includes and the verification purpose (confirming two-way delivery), which helps the agent set expectations about output content beyond the generic annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first sentence front-loads the core purpose and deliverables; the second provides the actionable usage context. Every phrase earns its place, and the key scope ('two-way') is stated immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the burden of explaining what the result contains—it does so by naming all key fields. It also supplies the integration scenario and verification goal, which is sufficient for an agent to correctly invoke and use the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the input schema confirms this with 100% coverage. Per calibration, a baseline of 4 applies for zero-parameter tools. The description adds no unnecessary parameter guidance, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Summarize') and resource ('SDK ↔ admin two-way reporter health for a host app'), then enumerates the exact data points covered. This makes it clearly distinguishable from siblings like get_recent_reports or reply_to_reporter, which focus on one side of the communication flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.' This gives a clear temporal and functional context, though it does not name alternatives or explicitly say when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_sentry_issuesImport Sentry issuesAIdempotentInspect
Pull existing Sentry issues into Mushi's report queue: by issueIds (numeric ids or short ids like WEB-12, at most 10) or by a Sentry search query (default is:unresolved) within the project's configured Sentry project, limit 1-10. For a backlog, add sinceDays (1-90) and call again with cursor set to the returned nextCursor until it is null; sentryProject picks another of the project's Sentry projects. Each issue goes through the same path as a Sentry webhook delivery: deduped per issue, linked, classified. An issue already linked to a report answers linked and is never reopened. Returns { items: [{ input, issueId, shortId, outcome, reportId, error? }], created, linked, failed, indexing, sentryProject, sentryProjects, nextCursor }. Write; idempotent; spends classification budget per new report. Needs the Sentry org slug, project slug and an auth token (event:read, project:read) in Integrations → Sentry. Use for issues that existed before the webhook was wired; then call triage_issue on a created report.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many issues a query imports (1-10, default 5) | |
| query | No | Sentry search query within the configured Sentry project (default is:unresolved). Not with issueIds. | |
| cursor | No | nextCursor from the previous import, to fetch the next page of a backlog. Search mode only. | |
| issueIds | No | Sentry issue ids or short ids (e.g. "4501", "WEB-12"), at most 10 | |
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) | |
| sinceDays | No | Only issues seen in the last N days (1-90). Search mode only. | |
| sentryProject | No | Which of the project's Sentry projects to search (default: the primary one). Search mode only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | One entry per requested or matched issue |
| failed | Yes | Issues that could not be imported |
| linked | Yes | Report ids that already existed for these issues |
| created | Yes | Report ids created by this import |
| indexing | Yes | Whether stack-frame files were queued for codebase indexing |
| nextCursor | No | Pass back as cursor to import the next page; null when the backlog is done |
| sentryProject | No | The Sentry project a search ran in (null for issueIds) |
| sentryProjects | No | This project's Sentry projects, primary first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only say write, idempotent, non-destructive, open-world): it discloses dedup-per-issue semantics, that already-linked issues return 'linked' and are never reopened, that each new report spends classification budget, and the exact auth prerequisites (org slug, project slug, token with event:read/project:read in Integrations → Sentry). That is the kind of operational detail an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and mode choice, then pagination, then side effects and auth. Dense and information-rich, but it is one long undivided block with some run-on sentences, so the cursor/sinceDays/cursor-loop and the auth requirement are harder to scan than they should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, zero-required, open-world write tool this covers everything: both input modes, pagination, per-item outcomes, auth and scope requirements, budget cost, and idempotency. An output schema exists, yet the description still names the return envelope and nextCursor, which is helpful rather than redundant.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description synthesizes cross-parameter workflow meaning the schema cannot: mutually exclusive issueIds vs. query modes, the sinceDays/cursor pagination loop, and sentryProject selecting another of the project's Sentry projects. It adds real relational context, though several per-parameter facts (limits, 'search mode only') are duplicated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Pull existing Sentry issues into Mushi's report queue') and immediately distinguishes the two input modes (issueIds vs. a Sentry search query) that no sibling tool offers. An agent can tell this apart from triage_issue, search_reports, or the webhook path without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear situational context ('Use for issues that existed before the webhook was wired'), explains how to work a backlog (sinceDays + cursor loop until nextCursor is null), and routes to the follow-up tool (triage_issue on a created report). It does not state an explicit when-not or name a sibling that does the same job instead, 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.
list_byok_keysList your API key poolARead-onlyIdempotentInspect
List the project's BYOK API keys grouped by provider (anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at }] } plus read-only { legacyKeys } metadata for credentials saved before the pooled lifecycle — never the raw secret. Read-only. Use to see which keys are validated, active, pending, legacy, or rate-limited; use add_byok_key to add one.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, but the description adds real behavioral value: it guarantees the raw secret is never returned, explains the pooled vs. legacyKeys split, and enumerates the returned fields and status values. That is disclosure well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then behavior, then routing in a tight sequence. The inline return-shape block is dense but earns its place given there is no output schema; only minor redundancy in restating "Read-only" alongside the readOnlyHint annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by describing the return envelope ({ keys: [...] }, legacyKeys) and field names. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single projectId parameter is fully documented in the schema, including the alias note. The description adds nothing about the parameter, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("List the project's BYOK API keys") and adds the grouping dimension (by provider) with the enumerated provider slugs. It is clearly distinguishable from siblings like add_byok_key, test_byok_key, and remove_byok_key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ("Use to see which keys are validated, active, pending, legacy, or rate-limited") and routes to add_byok_key for the add case. It does not mention test_byok_key or remove_byok_key as alternatives, so coverage of siblings is partial rather than complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_connectorsConnectorsARead-onlyIdempotentInspect
List the sources connected to an organization: each connector instance with its kind, status (connected | not_connected | blocked | error; blocked means an outside party refuses, for example an App Store agreement not accepted), the scopes it was granted, enabled capabilities and the projects it is bound to, plus the kinds that can be added and those still planned. Never returns credentials. Optional organizationId; account-level key needed. Returns { organizationId, available, planned, instances, legacy }. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| organizationId | No | Organization UUID — defaults to the key owner's only organization when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint/idempotentHint, and the description goes well beyond them: 'Never returns credentials' is a meaningful data-exposure guarantee, 'account-level key needed' is an auth prerequisite, and 'blocked means an outside party refuses, for example an App Store agreement not accepted' explains a non-obvious status value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then the status semantics, then the parameter/auth note, then the return shape — a logical order. The middle clause is a dense run-on list of fields, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the response keys ({ organizationId, available, planned, instances, legacy }) and distinguishing 'available' vs 'planned' kinds, plus flagging the credential omission. An agent has everything needed to call and interpret this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema's own description already explains the default-to-key-owner behavior, so the description's 'Optional organizationId' is largely redundant. Baseline 3 is appropriate when the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('List the sources connected to an organization') immediately followed by a precise inventory of what each entry contains (kind, status, scopes, capabilities, project bindings). The 'Read-only' closing statement cleanly separates it from the sibling 'request_connector_action', which is the mutating counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the enumeration of connector state and the note that an account-level key is needed, but no explicit when-to-use/when-not or named alternative is given. It never tells the agent to prefer this over 'request_connector_action' when it actually wants to change a connector, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_gate_findingsGate findingsARead-onlyIdempotentInspect
List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, … }], findings: [{ severity, rule_id, message, file_path, node_id, … }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | design_drift | ci_drift | deploy_drift | env_drift | radar | portfolio_radar | portfolio_radar_ci | store_review) or finding severity (info | warn | error). The *_drift gates are the App Recipe checks: design_drift is code that drifts off the design tokens, ci_drift / deploy_drift / env_drift are CI, deploy and env vars that drift from the recipe; radar is the Mushi setup checks (a rejected provider key, no spend cap or AI budget, a webhook that never delivered, a stale code index), each with a suggested_fix (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key); portfolio_radar / portfolio_radar_ci / store_review are the app hole checks (prefer get_radar). Available on every plan. Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.
| Name | Required | Description | Default |
|---|---|---|---|
| gate | No | Only runs of this gate (and their findings). | |
| severity | No | Only findings with exactly this severity. | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| runs | Yes | Recent gate_runs rows, newest first |
| findings | Yes | gate_findings rows for those runs |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/openWorld, but the description adds real behavior: newest-first ordering, that radar findings carry a suggested_fix, and a non-obvious auth constraint (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key). It doesn't mention pagination or result limits despite 'recent' runs, and 'Read-only' partially repeats readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, filters, gate semantics, then usage. The bulk of the length comes from restating the 18-value gate enum already present in the schema, which is somewhat duplicative, but the surrounding explanation earns most of the space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain returns, yet it covers filtering, plan availability, gate semantics, sibling routing and an auth caveat. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning to the enum values — it explains that design_drift is code drifting off design tokens, ci_drift/deploy_drift/env_drift relate to recipe drift, and radar covers setup checks. That is semantic enrichment the bare enum does not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: 'List recent inventory gate runs and their findings for a project, newest first.' It also distinguishes itself from siblings by naming get_radar, diff_inventory and get_inventory, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('see which CI gates failed on the last crawl') and names the alternatives with their selecting conditions ('use diff_inventory to compare two commits, or get_inventory for the full snapshot', 'prefer get_radar' for portfolio/store gates). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_lessonsList project lessonsARead-onlyIdempotentInspect
List promoted learning rules ("lessons") for the current project, highest-frequency first. Returns { lessons: [{ id, rule_text, severity, frequency, anti_pattern, … }] }. Read-only. Use to browse the full catalog of encoded heuristics; use query_lessons to retrieve only lessons relevant to a specific diff or PR within a token budget.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max lessons to return (default 50, max 200) | |
| severity | No | Filter to one severity level | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| lessons | Yes | Promoted lesson rows ordered by frequency |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior, and the description reinforces 'Read-only'. Beyond that, it adds behavioral context about 'promoted' lessons and highest-frequency-first ordering. The return shape is mentioned but the output schema already covers it, so this is useful but not critical extra disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences deliver the purpose, output shape, read-only trait, and usage alternative with zero filler. The most decision-relevant information (what it lists and how it is ordered) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and fully documented parameters, nothing essential is missing. The description also supplies the key sibling-routing information, making it complete for an agent to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, severity, and projectId are already fully documented. The description adds minimal parameter-level meaning beyond confirming the 'current project' default, which is consistent with projectId. It does not need to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (List), a specific resource (promoted learning rules/lessons for the current project), and a concrete behavior (highest-frequency first). It also distinguishes itself from query_lessons by describing the full-catalog browsing purpose, making it easy to tell apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('browse the full catalog of encoded heuristics') and when not to, naming query_lessons as the alternative for diff/PR-specific retrieval within a token budget. This gives clear routing guidance with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_portfolio_findingsPortfolio findings — fix onceARead-onlyIdempotentInspect
Return what to fix across the apps of one organization: groups of the same finding rule open in two or more projects (rule, gate, highest severity, affected projectIds, a sample message and one paste-ready fix prompt), the Mushi SDK version per project and package (current | behind | unknown), and integrations most sibling projects have but one lacks. Open means the latest completed gate run per project and gate, not allowlisted; info findings are left out. Optional organizationId as for get_portfolio. Needs an account-level key. Returns { organizationId, groups, sdkSkew, holes, crossProject, readErrors }; a part named in readErrors is unknown, not empty. Read-only. Fix a group repo by repo with list_gate_findings in each project.
| Name | Required | Description | Default |
|---|---|---|---|
| organizationId | No | Organization UUID — defaults to the key owner's only organization when omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/openWorld/idempotent annotations: it defines 'open' (latest completed gate run per project and gate, not allowlisted), notes info findings are excluded, states an account-level key is required, and explains that a part named in readErrors is unknown rather than empty. This is exactly the behavioral detail the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every sentence carries information (definition of open, auth requirement, return shape, sibling routing). It is dense and long, but not padded — the density is justified by a complex multi-part return.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully specifies the return shape ({ organizationId, groups, sdkSkew, holes, crossProject, readErrors }) and the readErrors caveat. Combined with the auth note and sibling routing, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single organizationId param is fully documented in the schema, so baseline is 3. The description only adds a cross-reference ('as for get_portfolio') rather than new syntax or meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return what to fix across the apps of one organization') and enumerates the three things returned: cross-project finding groups, SDK version skew, and integration holes. It is clearly distinguishable from list_gate_findings (single project) and get_portfolio (referenced by name for the orgId convention).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent to list_gate_findings for per-project work and references get_portfolio for the organizationId convention, giving clear usage context. It does not state outright when NOT to use this tool, but the sibling references effectively cover the selection decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reporter_outboxList held reporter updatesARead-onlyIdempotentInspect
List pipeline messages waiting for review before they reach reporters (projects in review mode hold "fix in progress", "fixed", "shipped in vX" and "closed" messages). Each row has { id, report_id, report_title, notification_type, text, body_override, created_at }; text is exactly what the reporter will see. Read-only. Use before release_reporter_update; an empty list means nothing is waiting (or the project sends updates automatically).
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, so safety is covered; the description repeats 'Read-only' but adds real context: which message types are held, that text is exactly what the reporter will see, and the meaning of an empty list. The empty-list disclosure is genuinely useful behavior beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the row-shape detail and the routing hint. It is dense but every clause (message types, row fields, empty-list meaning) carries information, though it packs several concerns into a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the row fields and clarifying text semantics. Combined with annotations covering the safety profile and the routing to release_reporter_update, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single optional projectId, so the schema already documents the parameter fully. The description adds no syntax or defaults beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (held reporter updates / pipeline messages waiting for review), and precisely scopes what it covers: messages held by projects in review mode. It is clearly distinguishable from siblings such as release_reporter_update and get_report_detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use before release_reporter_update', and explains the consequence of an empty result ('nothing is waiting, or the project sends updates automatically'). This names the alternative tool and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_fixMerge fix PRADestructiveIdempotentInspect
Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive and irreversible from Mushi's side — once GitHub merges into the target repo's default branch there is no unmerge endpoint, only a manual revert PR outside this tool. Idempotent — re-running an already-merged attempt is a safe no-op. Prerequisite: CI green (check with refresh_ci); confirm the diff and CI status with the user before calling on a PR you have not reviewed. Use to ship a fix opened by dispatch_fix; use transition_status to change state without merging.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | Fix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.) | |
| mergeMethod | No | GitHub merge method (default squash) |
Output Schema
| Name | Required | Description |
|---|---|---|
| sha | No | Merge commit SHA, when GitHub reported one |
| merged | No | True when GitHub accepted the merge in this call |
| reportId | Yes | Report UUID linked to this fix attempt |
| justMerged | No | True when this call performed the merge |
| reportStatus | Yes | Report workflow status after merge bookkeeping |
| alreadyMerged | No | True when the PR was already merged (idempotent no-op) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already say destructiveHint=true and idempotentHint=true, but the description goes further by explaining that the action is irreversible from Mushi's side, that GitHub has no unmerge endpoint, that a revert would require a manual PR, and that re-running on an already-merged attempt is a safe no-op. This substantially enriches the annotation signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: outcome, return shape, destructiveness, idempotence, prerequisite, and sibling routing. It is front-loaded with the core action and return value before safety context, and no filler or redundant restatement appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and a description covering irreversibility, idempotence, prerequisites, and alternatives, an agent has everything needed to decide whether and when to call this tool. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents fixId and mergeMethod, including the accepted alias fix_id and the default merge method. The description adds little parameter-level detail beyond aligning with the squash default, which is acceptable given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: squash-merge the GitHub PR for a fix attempt, then mark the report fixed and notify the reporter. It also names sibling tools dispatch_fix and transition_status, so an agent can distinguish shipping a fix from dispatching one or changing status without merging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Use to ship a fix opened by dispatch_fix.' It also states the alternative ('use transition_status to change state without merging') and a hard prerequisite: CI must be green, checked via refresh_ci, and the agent must confirm the diff and CI status with the user before merging an unreviewed PR.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_portfolio_changeFix once across apps (draft PRs)AInspect
Propose the same kind of recipe edit in up to 10 repos of one organization, one draft PR per repo with a shared batch id. Dry run by default (the diff and denied paths of each repo); confirm: true opens the drafts. One repo failing never rolls back the others; each result says what happened. Needs an account-level key. Confirm with the user before confirm: true. Returns { dryRun, plans } or { batchId, opened, results }. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| changes | Yes | ||
| confirm | No | true opens one draft PR per repo; omitted or false is a dry run | |
| element | Yes | Which part of the recipe the edit belongs to | |
| organizationId | No | Organization UUID — defaults to the key owner's only organization |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: dry-run default, the fact that 'One repo failing never rolls back the others; each result says what happened,' and the auth requirement ('Needs an account-level key'). For an openWorld, non-idempotent write, these are exactly the traits annotations can't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose, then default mode, failure semantics, prerequisites, and return shape in a tight block. No sentence is filler, and the return schemas are spelled out in place of a missing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so naming '{ dryRun, plans }' versus '{ batchId, opened, results }' and flagging partial-failure behavior and account-level auth makes it callable without extra digging. The only real hole is the missing contrast with the single-repo sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, so the schema carries most parameter meaning. The description only reinforces confirm's dry-run default (already in the schema) and the 10-repo cap; it adds nothing about element, changes, edits, or baseSha, so value over structured fields is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus unusual scope: 'Propose the same kind of recipe edit in up to 10 repos of one organization, one draft PR per repo with a shared batch id.' The multi-repo batch scope implicitly sets it apart from the singular propose_recipe_change, but that sibling is never named, so the differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: dry run by default, 'confirm: true opens the drafts', and a procedural rule 'Confirm with the user before confirm: true.' Strong on how to drive it, but it never says when to pick this over the single-repo sibling or what qualifies a portfolio-sized change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_recipe_changePropose a recipe change (draft PR)AInspect
Propose edits to files the app recipe allows (design tokens, budgets in mushi.recipe.json, .env.example declarations, store listing text under store.listingDir) as ONE draft pull request. Dry run by default: returns the diff of each file, with the baseSha it was taken against, and any path that is not writable (workflows, env files, lockfiles, generated exports and migrations never are) or whose new content would not parse (mushi.recipe.json, the inventory). Send each baseSha back on the confirm so a file that changed since is refused. confirm: true opens the draft PR; it stays a draft so the repo CI does not run until the owner marks it ready, and nothing is merged or published. Confirm with the user before confirm: true. Returns { dryRun, files, denied } or { jobId, status, prUrl }. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| edits | Yes | ||
| title | No | ||
| confirm | No | true opens the draft PR; omitted or false is a dry run | |
| element | Yes | Which part of the recipe the edit belongs to | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say openWorld=true, idempotent=false, destructive=false. The description adds the safety model that matters: the PR stays a draft so repo CI does not run, nothing is merged or published, baseSha pinning prevents reverting someone else's edit, and malformed content (mushi.recipe.json, the inventory) is rejected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The lead sentence front-loads purpose and output (draft PR), and nearly every clause carries operational meaning. It is a dense run-on paragraph with heavy parentheticals, so it is slightly harder to scan than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names both return shapes ({ dryRun, files, denied } and { jobId, status, prUrl }), covers prerequisite (user confirmation), versioning (baseSha), and validation failures. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 60% schema coverage, the description compensates by mapping element/edits to concrete recipe surfaces (design tokens, budgets, .env.example, store listing text) and explaining the baseSha round-trip and confirm semantics. It does not touch title or projectId, so it is strong but not exhaustive over all five parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (propose edits to recipe-allowed files as ONE draft pull request) and enumerates the exact scope: design tokens, mushi.recipe.json budgets, .env.example, store.listingDir. An agent can distinguish it from siblings like propose_portfolio_change or get_recipe_change without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-behavior (dry run by default) and when-not (confirm is refused if a file changed since the dry run; confirm: true requires user confirmation first). It also specifies what is never writable (workflows, env files, lockfiles, generated exports, migrations), making the boundary unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pull_store_reviewsPull store reviews nowAInspect
Pull the latest App Store and Google Play reviews of one project now and file those at or under the star threshold as reports (source store_review), deduplicated against earlier pulls. Intake must be on (400 INTAKE_OFF otherwise), at most one pull every 10 minutes (429 RATE_LIMITED), and not for viewers. It spends the stored store keys read-only and files reports that are then classified. Optional projectId. Returns { status, filed, stores }. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses error codes (400 INTAKE_OFF, 429 RATE_LIMITED), the viewer restriction, deduplication against earlier pulls, that reports are subsequently classified, and that store keys are spent read-only. This goes well past the annotations' write/openWorld profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and efficient, with prerequisites and return shape packed in. Dense but every clause carries information; the trailing one-word 'Write.' is slightly redundant against the annotation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape ({ status, filed, stores }) plus prerequisites, side effects, and error behavior. An agent has everything needed to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the parameter is fully documented there, including the project_id alias. The description only restates that projectId is optional, adding no syntax or format meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (pull), the exact resource (App Store and Google Play reviews), and scope (one project, now). It also names the output artifact (reports with source store_review), so it is distinguishable from read-only siblings like get_store_reviews and run_store_review.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear operational context: intake must be on, rate limited to one pull per 10 minutes, and blocked for viewers. It does not explicitly name which sibling to prefer when you merely want to read reviews (get_store_reviews), so the routing guidance is implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_lessonsQuery lessons for diff contextARead-onlyIdempotentInspect
Retrieve the learning rules ("lessons") most relevant to a given code diff or PR context, packed within a token budget. Uses bi-encoder retrieval + severity-weighted scoring; pass the diff/description as diffText and a maxTokens budget (default 3000). Returns ranked { lessons: [{ title, rule, severity }] }. Read-only. Use before writing a fix or opening a PR; use list_lessons to browse all lessons unfiltered.
| Name | Required | Description | Default |
|---|---|---|---|
| topK | No | Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.) | |
| diffText | Yes | The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.) | |
| maxTokens | No | Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.) | |
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is well covered. The description adds non-obvious behavior: bi-encoder retrieval, severity-weighted scoring, and token-budget packing, which are valuable beyond annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load purpose, then mechanics, then usage guidance. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only retrieval tool: it states the return shape ({ lessons: [...] }), usage context, and distinguishes from sibling list_lessons. With full schema coverage and safety annotations, no critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description mentions diffText and maxTokens defaults but those details already exist in the schema; no new parameter meaning is added beyond what the schema descriptors provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('retrieve'), resource ('learning rules/lessons'), and context ('code diff or PR'). The description explicitly contrasts with list_lessons, naming what it is not and making sibling differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use before writing a fix or opening a PR'. It also names the alternative list_lessons for browsing all lessons unfiltered, providing a clear decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_ciRefresh fix CI statusAIdempotentInspect
Re-poll GitHub for the latest check-run status of a fix attempt's PR and persist it on the fix_attempt row (does not merge or mutate GitHub). Returns { check_run_status, check_run_conclusion, check_run_updated_at }. Write; idempotent. Use right before merge_fix to confirm CI is green; use get_fix_timeline for the full attempt lifecycle.
| Name | Required | Description | Default |
|---|---|---|---|
| fixId | Yes | Fix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| check_run_status | Yes | GitHub check run status after refresh |
| check_run_conclusion | Yes | success | failure | neutral | null while pending |
| check_run_updated_at | Yes | ISO timestamp when CI status was last persisted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds behavioral value by explaining that the write is a local persistence on the fix_attempt row and explicitly denies any external GitHub mutation, which is important context beyond the annotation booleans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the main behavior, then states side effects, return value, and usage guidance, making it easy to scan and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, idempotent write operation with rich annotations, an output schema, and explicit sibling routing, the description covers everything needed to invoke it correctly. It communicates the write target, the external side-effect boundary, the return shape, and the recommended usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema description coverage is 100%, so the schema fully documents fixId, including the accepted alias fix_id. The description reinforces that the parameter refers to the fix attempt whose PR check-runs should be re-polled, but adds no new semantic detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: re-poll GitHub for a fix attempt's PR check-run status and persist it on the fix_attempt row. It also explicitly differentiates itself from related tools by clarifying it does not merge or mutate GitHub, making it easy to distinguish from merge_fix and get_fix_timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use it right before merge_fix to confirm CI is green, and use get_fix_timeline when the full attempt lifecycle is needed. It also lists an exclusion, stating it does not merge or mutate GitHub, which prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_recipeRefresh the app recipeAInspect
Read mushi.recipe.json and the design-token files from the connected repo again and store a new recipe snapshot, instead of waiting for the daily refresh. At most once per project every 5 minutes (429 RATE_LIMITED otherwise). Optional projectId. Returns { ok, state, reason, snapshotId, tokensHash, manifestPresent, tokenCount, issues } where state is ok | drift | unknown | not_connected | error and issues lists manifest problems with their path. Write: it stores a snapshot; nothing in the repo changes. Use after editing mushi.recipe.json or the tokens; then read get_app_recipe or get_design_tokens.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, destructive=false, idempotent=false); the description adds the rate limit ('at most once per project every 5 minutes (429 RATE_LIMITED otherwise)') and the crucial side-effect clarification that it stores a snapshot while 'nothing in the repo changes'. That is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action and rate limit come first, then the return shape, then usage routing. Every sentence earns its place, though the return-field enumeration makes it a single long paragraph with no visual structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing the return payload (state enum, issues list, tokensHash, manifestPresent, tokenCount) and does so fully. Rate limits, side effects, and next steps are all covered for a tool with one optional parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single projectId parameter is already documented, including the `project_id` alias. The description only notes it is optional, which the schema's empty required list already conveys – baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read mushi.recipe.json and the design-token files ... and store a new recipe snapshot') and explicitly contrasts with the daily refresh. An agent can distinguish it from get_app_recipe and get_design_tokens without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both the trigger ('Use after editing mushi.recipe.json or the tokens') and the follow-up ('then read get_app_recipe or get_design_tokens'), plus the alternative it replaces ('instead of waiting for the daily refresh'). Nothing about when to invoke it is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
release_reporter_updateRelease or discard a held reporter updateAIdempotentInspect
Send (action=release, the default) or drop (action=discard) one held reporter message from list_reporter_outbox; bodyOverride replaces its text before sending. Returns { delivered, skipped, failed }. Write; messages a real end user — confirm with the user first. Idempotent in effect: a message that is no longer held returns CONFLICT instead of sending twice.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | release (default) sends it; discard drops it | |
| messageId | Yes | Held message id from list_reporter_outbox | |
| bodyOverride | No | Replacement text to send instead |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, idempotentHint=true): it discloses that this messages a real end user, requires user confirmation, returns CONFLICT instead of double-sending when the message is no longer held, and gives the response shape. That is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: behavior and default first, side-effect warning second, return/idempotency third. No filler; every clause carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description supplies the return shape { delivered, skipped, failed }, the error behavior (CONFLICT), and the required human-confirmation step. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents action's default, bodyOverride's role, and messageId's source. The description largely restates these ('action=release, the default', 'bodyOverride replaces its text before sending') without adding syntax or constraint detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (release/discard), the exact resource (one held reporter message from list_reporter_outbox), and names the sibling that produces the input. An agent can distinguish this from list_reporter_outbox (read) and reply_to_reporter (compose new) without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent where the input comes from (list_reporter_outbox), that action defaults to release, and adds a hard prerequisite ('confirm with the user first' for a real end-user message). It doesn't explicitly contrast with reply_to_reporter as an alternative for non-held messages, but the context is otherwise unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_byok_keyRemove an API keyADestructiveIdempotentInspect
Permanently remove one pooled BYOK credential by key id from the authenticated project, including its Vault secret. Write; destructive; idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| keyId | Yes | Pooled BYOK key UUID from list_byok_keys | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds that it removes 'including its Vault secret', providing context on what gets destroyed beyond the annotation. It also states 'Permanently remove', reinforcing the irreversibility. This adds value beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence with high information density. It front-loads the destructive and idempotent nature, and the scope. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema fully describes parameters, annotations cover safety, and no output schema exists, the description adequately covers what the tool does and its consequences. It doesn't mention prerequisites (e.g., authentication) but those are implied by 'authenticated project'. It is complete for a destructive mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description doesn't add meaning beyond the schema, except that 'keyId' is a pooled BYOK key UUID from list_byok_keys (already in schema). Baseline 3 is appropriate as the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('remove'), a precise resource ('pooled BYOK credential by key id'), and the scope ('from the authenticated project'). It clearly distinguishes from siblings like add_byok_key and test_byok_key by naming the operation and the destructive nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly labels the operation as destructive and idempotent, and mentions it removes a BYOK credential. However, it does not explicitly state when not to use it (e.g., when a key is still in use) or name alternatives. The clear destructive label provides sufficient guidance for an agent to avoid misuse, but not full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reopen_reportReopen report (operator)AIdempotentInspect
Move a previously fixed/verified/dismissed report back to the reopened state for regression review, recording an operator note. Returns { report } with status=reopened. Write; idempotent — reopening an already-reopened report is a no-op. Use when a reporter says "still broken" after a fix shipped; use transition_status for any other state change.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Operator note recorded on the reopen transition | |
| reportId | Yes | Report UUID to move back to reopened status (`report_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| report | Yes | Updated report row with status=reopened |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds behavior beyond annotations: 'Write; idempotent — reopening an already-reopened report is a no-op' and discloses return shape ({ report } with status=reopened). These details extend the idempotentHint and readOnlyHint annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy: the first states action and return, the second covers idempotency and usage guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety/idempotency, the description supplies the trigger, the alternative, the affected states, the return, and the idempotency behavior. Nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description confirms reportId as UUID and note as operator note, but adds no format or constraint details beyond the schema. The 'previously fixed/verified/dismissed' context implicitly constrains the report state, but that is resource-level context, not parameter-level.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'Move a previously fixed/verified/dismissed report back to the reopened state for regression review.' Explicitly names the sibling tool 'transition_status' for any other state change, making differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger condition ('when a reporter says "still broken" after a fix shipped') and an explicit alternative ('use transition_status for any other state change'). This is exactly the when/when-not guidance needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_reporterReply to a reporterAInspect
Send a visible message to the end-user who filed a bug report. The reply appears in the in-app Mushi widget as an admin comment and creates an unread notification badge so the reporter sees it immediately. Use this to answer questions, request reproduction steps, or confirm a fix — without leaving the Cursor IDE.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Message text to send to the reporter | |
| reportId | Yes | Report id to reply to (`report_id` is accepted too.) | |
| authorName | No | Display name for the admin sender (default: "Mushi Admin") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-read-only and non-destructive behavior. The description adds behavioral detail: the reply is visible, appears as an admin comment in the in-app widget, and creates an unread notification badge. This goes beyond the annotations and helps the agent understand the side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first states the action and its visible effect; the second gives concrete usage scenarios. No redundant words, and the key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with fully documented parameters and no output schema, the description covers the purpose, behavior, and usage. It could mention prerequisites (e.g., whether the report must be in a certain state), but that is minor and not critical for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage for all three parameters, each with clear explanations. The description does not add extra parameter-level meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Send a visible message to the end-user who filed a bug report') and resource, and distinguishes itself from sibling tools that handle report state (transition_status, reopen_report) or retrieval (get_report_detail). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases ('answer questions, request reproduction steps, or confirm a fix') and notes the benefit ('without leaving the Cursor IDE'). It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to select it over other report-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_connector_actionRequest a store action (needs approval)AInspect
Ask for one connector action, for example set_rollout or promote_track on a Google Play connector. This only creates a request: nothing runs until a team owner or admin approves it in the console and then runs it there. An API key or this tool can never approve or run it. The approval binds the exact payload and expires after an hour. Confirm with the user first. Returns { id, status: "pending_approval", payloadSha256 }. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | For example set_rollout or promote_track | |
| reason | No | Why, shown to the approver | |
| payload | Yes | The exact action input; the approval binds its hash | |
| projectId | No | (`project_id` is accepted too.) | |
| connectorId | Yes | Connector instance id (list_connectors) | |
| organizationId | No | Organization UUID — defaults to the key owner's only organization |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that this only creates a request, that an API key or the tool itself can never approve or execute, that approval binds the exact payload hash and expires after an hour, and even the return shape. None of this is recoverable from the readOnly/destructive/idempotent hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does and the approval gate immediately, then adds the binding/expiry and return contract without a wasted clause. Dense but every sentence carries operational weight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation-style request tool with no output schema, the description supplies the missing return values, the approval lifecycle, and the safety constraint. An agent has everything needed to call it correctly and warn the user beforehand.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents connectorId, payload, reason, and the optional ids. The description reinforces that the payload is what gets hashed for approval, but adds no syntax or format detail beyond it — baseline 3 for a fully-covered schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Ask for one connector action") and immediately grounds it with concrete examples (set_rollout, promote_track) on a named connector type. An agent can distinguish this request-only tool from execution tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use and an explicit precondition ("Confirm with the user first"), plus the crucial constraint that nothing runs until an owner/admin approves in the console. It does not name an alternative tool or contrast with list_connectors, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_reporter_infoAsk the reporter a questionAInspect
Ask the end-user who filed a report a question: it appears in their in-app "Your reports" thread, marks the report "Waiting on you", and the waiting state clears when they answer (their reply reaches Slack and the console). Returns { comment_id, awaiting_reporter }. Write; messages a real end user and is NOT idempotent — each call posts another question, so confirm the wording with the user first. Fails with NO_REPORTER for reports that came from an integration. Use when you need reproduction details; use reply_to_reporter for a plain reply.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The question, shown to the reporter verbatim | |
| reportId | Yes | Report id to ask about (`report_id` is accepted too.) | |
| authorName | No | Display name for the sender (default: "Developer") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint false, idempotentHint false), and the description adds substantial context beyond them: it declares the real-user side effect, the 'Waiting on you' state transition and how it clears, the return shape, the NO_REPORTER failure mode, and warns that it is NOT idempotent so wording should be confirmed first. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: behavior and side effects come before the routing sentence, and the sibling distinction is placed last. Each clause carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description supplies the return shape ({ comment_id, awaiting_reporter }), the failure mode, and the non-idempotency caveat. For a 3-param write tool, nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents question, reportId, and authorName with aliases and defaults. The description adds no per-parameter meaning beyond what structured data provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: asking the end-user who filed a report a question, and describes the concrete mechanism (appears in their in-app thread, marks report 'Waiting on you'). It explicitly distinguishes itself from the sibling reply_to_reporter, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when you need reproduction details'), names the alternative ('use reply_to_reporter for a plain reply'), and states an exclusion (NO_REPORTER for integration-sourced reports). This is complete when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_design_devianceRun the design deviance scanAInspect
Refresh the design tokens and start a new deviance scan of the repo (off-token colours, fonts, spacing, radius, contrast below AA, raw interactive elements). The scan reads up to 1,500 files in the background: the result is { refresh, run } with run.status "running" (poll get_design_deviance until running clears), or run null when the repo has no tokens to compare against (refresh says why). At most one scan per project every 5 minutes (429 RATE_LIMITED otherwise). Optional projectId. Write: it records a scan; nothing in the repo changes.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: a background scan capping at 1,500 files, the 429 RATE_LIMITED rate-limit ceiling, and the exact result shape ({ refresh, run } with running status or null). Crucially it reconciles the readOnlyHint=false annotation with 'it records a scan; nothing in the repo changes', so the agent understands the write is metadata-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and scan target, then packs behavioral facts efficiently into two dense sentences. It is information-rich rather than padded, though the run-shape detail could be tightened slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one param, no output schema, and high schema coverage, the description supplies everything an agent needs: what it scans, the polling pattern via the sibling, rate limits, and the null-result fallback. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single projectId parameter is fully documented in the schema, including the default. The description only repeats that projectId is optional, adding no new syntax or format meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('start a new deviance scan') plus resource ('design tokens and repo') and enumerates exactly what it detects (off-token colours, fonts, spacing, radius, contrast below AA, raw interactive elements). It is clearly distinguishable from the sibling get_design_deviance, which it frames as the polling counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (get_design_deviance) with the condition that selects it (poll until running clears) and states the trigger constraints (one scan per project per 5 minutes, run null when no tokens). It stops short of saying when a caller should run a scan at all versus just reading tokens, but the routing guidance is solid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_nl_queryAsk your data (NL → SQL)ARead-onlyIdempotentInspect
Answer a natural-language question about your project data by generating and running a read-only SQL query (no privileged schemas, rate-limited to 60/hour). Returns { sql, rows }. Use for ad-hoc analytics ("which components had the most critical bugs this week?"); use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | Question in plain English, e.g. "Which components had the most critical bugs this week?" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds non-obvious behavioral context beyond those: no privileged schemas, a 60/hour rate limit, and a return shape of { sql, rows }. This helps the agent anticipate operational and safety constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, each earning its place. The first defines the operation, constraints, and return format; the second gives usage context and routes to alternatives. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, strong annotations, and absence of an output schema, the description is complete: it communicates purpose, constraints, return shape, rate limit, and alternative tools. An agent has enough information to decide whether and how to invoke this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single required parameter is fully described with an example. The description reinforces the natural-language style and adds an example use case, but it does not add meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: answer a natural-language question by generating and running a read-only SQL query over project data. It clearly distinguishes itself from siblings by framing itself for ad-hoc analytics rather than report lookups or documentation searches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for ad-hoc analytics' and names the alternatives: 'use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.' This gives an agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_radarRun the hole checks nowAInspect
Start the hole checks (radar) for one project now instead of waiting for the daily run: store names, listing languages, domain and certificate expiry, security headers, the privacy link, and the connector-backed checks. The checks run in the background; poll get_radar until checkedAt changes. At most one run per project every 10 minutes (429 RATE_LIMITED with Retry-After otherwise). Optional projectId (defaults to the server-configured project). Returns { started, projectId, startedAt }. Write: it records a new gate run; nothing in your app or repo changes.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: the run is asynchronous/background, the rate-limit contract and error shape are spelled out, and 'Write: it records a new gate run; nothing in your app or repo changes' reconciles non-read-only with non-destructive. It even discloses the return payload, which no output schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then constraints, then return shape and write semantics — a sensible ordering. The mid-sentence enumerations of check types and response fields are dense but each item carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description supplies the return shape ({ started, projectId, startedAt }), the async completion signal, and the write scope. Nothing needed to invoke or follow up on this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents the default and the project_id alias, so the description's mention of 'optional projectId (defaults to the server-configured project)' largely repeats structured data. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('start the hole checks/radar') plus resource ('one project'), and it enumerates the check categories so the agent knows the scope. It explicitly distinguishes itself from the get_radar sibling by casting itself as the trigger and get_radar as the poll target.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'now instead of waiting for the daily run', plus the follow-up procedure (poll get_radar until checkedAt changes) and the hard constraint (max one run per project every 10 minutes, 429 RATE_LIMITED with Retry-After). Both when-to-call and when-not-to-call are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_store_reviewRun the store reviewAInspect
Run the store review for one project now: listing text in the repo against what is live on the App Store and Google Play, listing claims against the code, privacy labels against data-collecting SDKs, screenshots, length limits and the pre-submission checklist. Each result is ok | finding | unknown (not checked, never healthy). This is a check against the code, not legal advice. At most one review per project every 30 minutes (429 RATE_LIMITED otherwise). Optional projectId. Returns { projectId, checkedAt, status, results, checklist, findings, note }; read it again later with get_store_status. Write: it records a gate run; nothing is submitted to a store.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true and idempotentHint=false but give no operational detail. The description discloses the 30-minute per-project rate limit and 429 response, the write semantics (records a gate run), the non-submission guarantee, and the three-valued result semantics including that 'unknown' means never checked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the action and scope land first, then result semantics, guardrails and return shape. Some sentences are long, but every clause carries new information rather than restating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description enumerates the return keys and names get_store_status for later retrieval. It omits per-check detail and remediation, which are plausibly covered by upstream tools, so it is nearly complete rather than fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents projectId including the server-configured default and project_id alias, so the description's 'Optional projectId' merely confirms what the schema carries. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run the store review for one project now') and enumerates exactly what is checked: listing text, claims, privacy labels, screenshots, length limits, checklist. The sibling get_store_status is named as the read counterpart, so an agent can distinguish them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to use (run a review now) versus the alternative (get_store_status to read it later), includes the 429/30-minute rate limit and the 'not legal advice' scope caveat, and notes that nothing is submitted to a store.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_mushi_docsSearch Mushi documentationARead-onlyIdempotentInspect
Search the official Mushi documentation (guides, MCP setup, inventory, QA, skills) by keyword — titles, section headings and summaries are indexed. Returns ranked { results: [{ title, url, excerpt, score }] }. Read-only; works without an API key. Use before guessing API shapes, tool names, or RPC names, then get_mushi_doc to read a page; use run_nl_query for questions about your own project data, not the docs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 8). | |
| query | Yes | Keywords to search official Mushi docs (guides, MCP, inventory, QA). |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and idempotentHint=true, and the description adds meaningful context beyond them: 'works without an API key', the indexing scope ('titles, section headings and summaries'), and the ranked result format. No contradiction with annotations; the added details improve the agent's expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every sentence earns its place—scope, returned shape, auth/read-only note, and sibling routing. There is no fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two parameters, an output schema, and strong annotations, the description covers everything an agent needs: what is searched, the return shape, auth requirements, and how to chain with get_mushi_doc or avoid using it for project data. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (query, limit) are already described in the input schema. The description adds only minor semantic value ('by keyword'), so a baseline 3 is appropriate since the schema already carries the parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search the official Mushi documentation' by keyword, and names the indexed content areas (guides, MCP setup, inventory, QA, skills). This clearly distinguishes it from siblings like get_mushi_doc (fetch a page) and search_reports (search bug reports).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use it ('before guessing API shapes, tool names, or RPC names'), what to do next ('then get_mushi_doc to read a page'), and when not to ('use run_nl_query for questions about your own project data'). This is exemplary sibling routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_reportsSearch reportsARead-onlyIdempotentInspect
Search reports by meaning and keyword (pgvector similarity server-side; falls back to summary/description substring if embeddings are unavailable). Returns ranked { results: [{ id, summary, similarity }] }. Read-only. Use to find reports by free text ("checkout flakiness"); use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10, max 50) | |
| query | Yes | Natural-language search text or component path | |
| threshold | No | Similarity threshold 0..1, default 0.2 |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent hints. The description adds real behavioral context beyond those: server-side pgvector similarity, a fallback to summary/description substring matching when embeddings are unavailable, and the ranked result shape. This is more than minimal, though it does not discuss rate limits or auth—minor given the tool's read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly constructed sentences front-load the mechanism and result format, then move to usage guidance. Every sentence earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema and 100% parameter schema coverage, the description still adds the essential behavioral twist (fallback) and explicit sibling routing. Nothing an agent needs to correctly invoke this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema already documents query, limit, and threshold including defaults. The description reinforces that the query is free text or component path but adds no new parameter-specific detail beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search reports by meaning and keyword') and explicitly names sibling tools (get_similar_bugs, get_recent_reports) with contrasting use cases. An agent can immediately distinguish this from related search/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('Use to find reports by free text') and when-to-use-alternatives guidance ('use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query'). This fully answers the routing question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_design_settingsSet design score actionsAIdempotentInspect
Change what the design deviance score may do for one project: threshold (0–100), failCi (true fails mushi recipe check --push above the threshold) and autofix. Send at least one. An API key can turn autofix off but never on: turning it on lets the project spend on fixes by itself, so it needs a signed-in owner or admin in the console (403 otherwise). Project owners and admins only. Optional projectId. Returns the saved settings. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| failCi | No | true: `mushi recipe check --push` fails CI above the threshold | |
| autofix | No | false turns the design auto-fix off; an API key cannot turn it on | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) | |
| threshold | No | 0–100; the actions fire when the score is above it |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint false, destructiveHint false, idempotentHint true), and the description still adds non-obvious behavior: owner/admin authorization with 403 otherwise, the asymmetric API-key rule (can disable autofix but never enable it), the spending consequence of enabling autofix, and that the saved settings are returned. This is well beyond what structured fields disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the three settings, then progressively adds constraints; nearly every sentence carries information. Slightly dense/crammed and the trailing 'Write.' restates what annotations already imply, which keeps it off a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still states the return ('the saved settings'), the required-input minimum, the default for the optional projectId, and the authorization/cost preconditions. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3; the description earns extra credit by tying failCi to the concrete CI failure behavior and explaining why autofix cannot be enabled via API key. It adds authorization semantics the schema omits, though it does not add format details for projectId beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb (change/set) plus the exact resource and fields: design deviance score actions for one project — threshold, failCi, autofix. An agent can distinguish it from get_design_settings (the read counterpart) purely from the name and opening clause.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real usage constraints: 'Send at least one', 'Project owners and admins only', and the API-key restriction with a 403 outcome. It does not explicitly name the alternative (get_design_settings) for reading current values, so it is clear context without a full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_store_review_intakeSet store review intakeAIdempotentInspect
Turn store reviews as reports on or off for one project and set the star threshold (maxRating 1–5: reviews at or under it are filed). enabled is required. An API key can turn intake off or change the threshold while it is on, but only a signed-in owner or admin can turn it on in the console (403 HUMAN_REQUIRED), because it decides that public reviews become reports. Project owners and admins only. Optional projectId. Returns the saved settings. Write.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | false turns intake off; true keeps it on (only the console can turn it on) | |
| maxRating | No | Reviews at or under this many stars are filed (1–5) | |
| projectId | No | Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, idempotent, non-destructive, open-world write; the description adds the materially important context that enabling has an auth bypass barrier (403 HUMAN_REQUIRED) and why (it decides public reviews become reports), plus the API-key vs console asymmetry. That is real behavioral disclosure beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action, then constraints, then permissions, then return value — no filler sentences. It is dense to the point of being a single crammed block, but every clause (threshold semantics, 403 behavior, role scope) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation tool with no output schema, it covers what the tool does, who may call it, what the failure mode is, and that it returns the saved settings. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents enabled, maxRating range and the projectId default/alias. The description restates the enabled requirement and the 1-5 threshold semantics but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('turn store reviews as reports on or off for one project and set the star threshold'), which cleanly separates it from read-side siblings like get_store_reviews, pull_store_reviews and run_store_review. The mutation intent and the two adjustable settings are clear from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when it works and when it does not: an API key may turn intake off or change the threshold, but turning it on requires a signed-in owner/admin in the console and otherwise returns 403 HUMAN_REQUIRED. It also states the permission scope ('Project owners and admins only') and that projectId is optional, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_fix_resultRecord a fix outcomeAInspect
Record a fix outcome from an external agent (e.g. your own Cursor/Claude run): branch, PR URL, files changed, lines added/removed. Creates a fix_attempt row then patches it to completed and links it to the report. Returns { fixAttemptId }. Write; NOT idempotent — each call creates a new fix_attempt, so call once per PR. Use after you opened a PR outside Mushi; use dispatch_fix to have Mushi open the PR instead, or merge_fix once CI is green.
| Name | Required | Description | Default |
|---|---|---|---|
| prUrl | No | GitHub pull request URL, if a PR was opened (`pr_url` is accepted too.) | |
| branch | Yes | Git branch name where the fix was implemented | |
| summary | Yes | One-line human summary of what the fix changed | |
| reportId | Yes | Report UUID to attach this external fix attempt to (`report_id` is accepted too.) | |
| filesChanged | Yes | Repo-relative paths modified by the fix | |
| linesChanged | Yes | Total lines added + removed across filesChanged | |
| idempotencyKey | No | Optional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | True when the fix_attempt row was created and marked completed |
| fixId | Yes | UUID of the new fix_attempt row |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals internal behavior beyond annotations: it creates a fix_attempt row, patches it to completed, links it to the report, and returns a fixAttemptId. It explicitly flags the write nature and non-idempotence, and explains the idempotency key mechanism and its default derivation. This goes well beyond the annotation hints and gives the agent a realistic model of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and packs essential usage guidance and behavioral context into a compact space. No filler or redundant phrasing; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and a required output, the description covers the invocation trigger, the side effects, the return value, idempotency caveats, and sibling alternatives. Combined with a fully described schema and an output schema, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with detailed descriptions for every parameter, including the nuanced idempotencyKey behavior. The description merely lists field names without adding new semantic meaning; it reinforces the overall purpose but does not clarify any parameter beyond what the schema already provides. Baseline 3 applies since the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Record') and resource ('fix outcome from an external agent'), lists the exact fields involved (branch, PR URL, files changed, lines added/removed), and immediately distinguishes it from sibling tools by naming dispatch_fix and merge_fix as alternatives. This leaves no ambiguity about what the tool does and how it differs from related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit condition for use: 'Use after you opened a PR outside Mushi.' It then states clear alternatives: 'use dispatch_fix to have Mushi open the PR instead, or merge_fix once CI is green.' It also adds a critical usage warning about idempotency ('call once per PR'), which is exactly the kind of guidance an agent needs to avoid mistakes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_fixSuggested fix (from triage)ARead-onlyIdempotentInspect
Return the Stage-2 suggested-fix slice for one report: root cause, suggested fix, repro steps, summary, and component — faster than get_report_detail when you only need the human-readable hint. Returns { reportId, rootCause, suggestedFix, reproductionSteps, summary, component }. Read-only; reads the existing classification (run triage_issue first if unclassified). Use for a quick "what should we try?"; use get_fix_context for the full paste-ready bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Present when no Stage-2 analysis exists — explains why and what to call instead |
| summary | Yes | One-line report summary, or null |
| reportId | Yes | The report this slice was read from |
| component | Yes | Component/page the bug was attributed to, or null |
| rootCause | Yes | Stage-2 root-cause hint, or null if not yet classified |
| suggestedFix | Yes | Stage-2 suggested fix, or null if not yet classified |
| reproductionSteps | Yes | Reproduction steps recorded on the report (array; [] if none) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces safety with 'Read-only' while adding useful behavioral context: it reads existing classification, is faster than get_report_detail, and requires prior triage for unclassified reports. It does not discuss error conditions, but the annotations carry much of the safety burden and the added precondition context is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover purpose, output shape, read-only safety, precondition, speed comparison, and alternative routing with zero filler. The most decision-relevant information is front-loaded: what the tool returns and when to choose it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with both an output schema and strong annotations, the description covers everything an agent needs to invoke it correctly: return shape, precondition, sibling differentiation, and use case. There is no apparent missing context that would lead to incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents reportId as a report UUID, and the tool description itself does not add much beyond the schema's own description. Schema coverage is 100%, so the baseline of 3 applies; the only slight addition is the field list returned, not a semantic augmentation of the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Return the Stage-2 suggested-fix slice for one report') and enumerates the exact fields returned, including rootCause, suggestedFix, reproductionSteps, summary, and component. It also distinguishes itself from sibling tools by naming get_report_detail and get_fix_context, so an agent can clearly tell when this tool is the right one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('when you only need the human-readable hint', 'for a quick "what should we try?"') and when-not-to-use guidance by routing to get_fix_context for a full paste-ready bundle. It also states a clear precondition: run triage_issue first if the report is unclassified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_byok_keyTest an API keyAIdempotentInspect
Re-test one pooled BYOK credential by key id. A successful provider probe activates the key; auth, quota, and network failures keep it out of the runtime pool. Returns the sanitized validation result and updated key metadata. Write; idempotent.
| Name | Required | Description | Default |
|---|---|---|---|
| keyId | Yes | Pooled BYOK key id | |
| projectId | Yes | Project id (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: a successful provider probe activates the key, while auth, quota, and network failures keep it out of the runtime pool. It also states the return value is a sanitized validation result plus updated metadata, which is useful context. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with the core action in the first sentence. The trailing 'Write; idempotent' duplicates annotation flags and adds a small amount of redundancy, but it does not significantly detract from the overall clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two simple parameters and no output schema, the description fully covers what an agent needs to call the tool correctly: the action, the key ID targeting, success/failure behavior, and the return value. No essential contextual information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both keyId and projectId with 100% coverage, so the description is not required to add much. It only refers to 'by key id', which mirrors the schema's keyId description and adds no new parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Re-test one pooled BYOK credential by key id', giving a specific verb, resource, and scope. It clearly distinguishes this from sibling tools like add_byok_key, remove_byok_key, and list_byok_keys by focusing on the testing/activation action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Re-test one pooled BYOK credential' implies the tool is for existing pooled keys, and the outcome descriptions offer behavioral context. However, it never explicitly states when to prefer this over siblings such as add_byok_key or activation_status, and it provides no exclusionary or alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_gen_from_reportGenerate Playwright test from reportAInspect
Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { prUrl, prNumber, branch, path }. Write; consumes LLM budget; NOT idempotent — each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to turn into a Playwright PR (`report_id` is accepted too.) | |
| projectId | No | Project UUID — defaults to configured project (`project_id` is accepted too.) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the write/openWorld/non-idempotent profile, and the description reinforces it with concrete consequences: each call consumes LLM budget and opens a NEW PR, so it is explicitly non-idempotent in effect. It also discloses the credential requirement and the return shape, which matters because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the action and side effect, then preconditions and return shape, then the routing rule. No filler or restatement of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a non-idempotent, credentialed, side-effecting tool: prerequisites, budget cost, irreversibility per call, return payload, and the alternative tool. Nothing material is missing despite the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (reportId, projectId) and their alias forms are already documented. The description only implies that a 'classified report' and a configured project are involved, adding no format or constraint detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource chain: generate a Playwright regression test from a classified report, then open a draft GitHub PR with the spec. It also explicitly contrasts itself with generate_tdd_from_story, so an agent can discriminate it from siblings without reading schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('lock in a regression as an E2E test') and names the alternative with its selecting condition ('use generate_tdd_from_story to build a test from a mapped user story instead'). Preconditions (inventory_v2 plan, GitHub and LLM keys) are stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
transition_statusMove report between statesADestructiveIdempotentInspect
Move a report to a new workflow state, enforcing the same transition rules as the admin UI. Valid targets: classified, grouped, fixing, fixed, verified, reopened, dismissed. When dismissing, closedReason (duplicate, not_reproducible, wont_fix, working_as_intended, spam) sets what the reporter is told — spam closes silently, and duplicate needs the report grouped under another one first; reporterMessage posts your note to the reporter verbatim. Returns { ok }. Write; idempotent (setting the current status is a no-op); rejects illegal transitions. Use to dismiss a duplicate or mark fixed; use merge_fix to mark fixed via a merged PR, or reopen_report for the reopened path.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Reason for the transition (audit trail) | |
| status | Yes | Target status (resolved is stored as fixed) | |
| reportId | Yes | Report UUID (`report_id` is accepted too.) | |
| closedReason | No | When dismissing: what the reporter is told (spam closes silently) | |
| reporterMessage | No | Optional note posted to the reporter verbatim |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare write/idempotent/destructive, but the description adds genuinely non-obvious behavior: illegal transitions are rejected, setting the current status is a no-op, spam closes silently, and a duplicate dismissal requires the report to be grouped first. It also discloses the return shape 'Returns { ok }'. Minor gap: it doesn't spell out permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and valid targets, then prerequisites, then the alternative routing. It is a dense single block, but essentially every clause earns its place; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-param mutation with no output schema, the description covers purpose, valid targets, side-effect semantics, preconditions, return value, and the sibling alternatives. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds the curated set of legal transition targets and the duplicate-grouping precondition on closedReason. Some of its semantics (verbatim reporter message, silent spam close) duplicate the schema, but the transition-target constraint and ordering prerequisite are net-new value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Move a report to a new workflow state') and immediately scopes it with 'enforcing the same transition rules as the admin UI', which tells the agent this is a state-machine transition, not an arbitrary field update. It is clearly distinguishable from siblings like merge_fix and reopen_report, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: '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.' Both the when-to-use and the alternatives with their selecting conditions are stated, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_issueTriage issue end-to-endARead-onlyIdempotentInspect
Read-only combined tool: merges report detail, the reporter thread, similar bugs (matched on the report summary), the fix context (paste-ready fix prompt, repro steps, root cause), the blast radius of the inventory action the report is filed against, and recent pipeline warnings into a single structured review packet. Returns the packet plus prioritised recommended_actions, partial_errors for any source that failed, and notes for any source that does not apply (e.g. no blast radius when the report is not anchored to an inventory action). Equivalent to a Sentry "Analyze with Seer" flow grounded in user-felt reports. Pass reportId to kick off review. Call this before dispatch_fix.
| Name | Required | Description | Default |
|---|---|---|---|
| reportId | Yes | Report UUID to triage. (`report_id` is accepted too.) | |
| projectId | No | Project UUID. Defaults to configured project. (`project_id` is accepted too.) | |
| includeLogs | No | Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | Sources that do not apply to this report, and why |
| report | Yes | The report (documented fields, no reporter identifiers), or the error reading it |
| status | Yes | Workflow status, or unknown |
| category | Yes | bug | slow | visual | confusing | other, or unknown |
| severity | Yes | critical | high | medium | low, or unknown when the report could not be read |
| report_id | Yes | The triaged report UUID |
| fix_context | Yes | Fix-context slice, as get_fix_context returns it |
| recent_logs | Yes | Recent warn+ pipeline log entries for the project, or null |
| blast_radius | Yes | Downstream nodes of the inventory action the report is filed against, or null |
| similar_bugs | Yes | Up to five nearest reports by summary, excluding this one; null when not searched |
| partial_errors | Yes | Sources that failed, as "source: message" |
| triage_summary | Yes | One-line summary |
| reporter_thread | Yes | The unified report timeline (comments, fixes, QA), or null |
| recommended_actions | Yes | What to do next, most important first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavior beyond that: it discloses that the tool merges multiple sources, returns recommended_actions, reports partial_errors for failed sources, and includes notes for non-applicable sources. This gives an agent an accurate mental model of what actually happens when the tool runs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than a simple one-liner but is information-dense and front-loaded with the core purpose. The Sentry 'Analyze with Seer' analogy is helpful but slightly optional; otherwise each clause earns its place given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, annotations, and presence of an output schema, the description is complete: it covers what sources are merged, what the returned packet contains, how failures/non-applicable sources are surfaced, and the intended call order before dispatch_fix. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents reportId, projectId, and includeLogs. The description only adds 'Pass reportId to kick off review', which restates what the schema already conveys, so it does not go beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: a 'read-only combined tool' that 'merges' six named sources into one 'structured review packet'. This clearly distinguishes it from the individual get_* siblings it aggregates, and the ordering hint 'Call this before dispatch_fix' anchors its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit sequencing guidance ('Call this before dispatch_fix') and strongly implies the use case: a combined review packet with recommended actions when analyzing a user-felt report. However, it does not explicitly say when to prefer this over calling the individual get_* tools, or explicitly list when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
triage_next_stepsWhat should I work on now?ARead-onlyIdempotentInspect
Prioritised "do this next" list for the project: blocked auto-fixes first (with the unblock action), then reporters waiting for an answer (they replied in the in-app thread since you last looked), then in-flight fixes to shepherd to merge, then user-felt classified reports by severity, with robot/cron chores (dependency bumps) last. Returns { steps: [{ priority, action, reason, tool, args }], summary }. Read-only. Call this first when the user asks "what needs my attention / what should I triage or fix".
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Project UUID (defaults to the configured project). (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| steps | Yes | |
| summary | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the description is not carrying the safety burden alone. It still adds meaningful context beyond the annotations: the full prioritization ordering, the fact that blocked auto-fixes come with an unblock action, and the stateful dependency ('since you last looked'), which the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the priority ordering before the return shape and usage trigger, and every sentence earns its place. The single dense run-on sentence with nested parentheticals is slightly harder to parse than a bulleted ordering would be, keeping it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain return values, yet it does so concisely and adds the stateful 'since you last looked' caveat plus the read-only guarantee. For a zero-required-parameter triage tool this is essentially complete; only the absence of a when-not/alternative pointer is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (projectId) with 100% schema description coverage, so the schema already documents the UUID format, default behavior, and the project_id alias. The description adds nothing about the parameter, which is acceptable when the schema does the heavy lifting; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('Prioritised "do this next" list for the project') with an explicit ordered scope, and it is immediately distinguishable from siblings like triage_issue, search_reports, or get_recent_reports. The priority ordering is spelled out, so the agent knows exactly what class of output this produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger and routing instruction: 'Call this first when the user asks "what needs my attention / what should I triage or fix".' That is clear when-to-use guidance. It does not name when-not to use it or point to a specific alternative (e.g., triage_issue, search_reports), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trigger_judgeRun Sonnet-as-JudgeAIdempotentInspect
Queue the Sonnet-as-Judge to grade recent fix quality across accessible projects. Returns { dispatched: number } — one judge-batch job per project; scores land asynchronously in judge_results (read back with run_nl_query). Write; consumes LLM budget. Idempotent within a short window. Use before shipping to vet fix quality; use get_fix_timeline to inspect a single attempt instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reports to judge in this batch (default 25, max 100) | |
| projectId | No | Restrict to one project when the API key owns multiple (`project_id` is accepted too.) |
Output Schema
| Name | Required | Description |
|---|---|---|
| dispatched | Yes | Number of judge-batch jobs dispatched (one per accessible project) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable context: it's a write operation that consumes LLM budget, idempotent only 'within a short window', and results land asynchronously in judge_results. This goes beyond the annotations by clarifying the asynchronous nature and budget consumption, though it does not detail failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the core action and then layering return type, side effects, idempotency, and usage guidance. It is dense but every sentence earns its place, though it could be slightly tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered. The description includes how to read results (via run_nl_query), mentions the asynchronous nature, and gives usage context. It lacks error handling or prerequisite details, but given the annotations and simplicity of the tool, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and both parameters have meaningful descriptions ('Max reports to judge', 'Restrict to one project'). The tool description adds no additional parameter guidance beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Queue', the resource 'Sonnet-as-Judge', and the purpose 'to grade recent fix quality across accessible projects'. It also differentiates from the sibling get_fix_timeline by naming it as an alternative for single-attempt inspection. This is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use it ('Use before shipping to vet fix quality') and when not to ('use get_fix_timeline to inspect a single attempt instead'). This provides clear decision rules without requiring the agent to infer context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_mushiMushi — where to startARead-onlyIdempotentInspect
CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use. Pass your intent as a short natural-language phrase ("fix the top bug", "check what I should work on", "run QA tests", "set up Mushi", …). Returns: (1) a curated list of the 5–12 tool names most relevant to that intent, (2) a one-paragraph orientation to the Mushi project and dashboard state, and (3) the single recommended first tool to call. Only tools this connection exposes are recommended; relevant tools hidden by the active feature groups are named with how to enable them. Avoids loading the full tool catalog into context when only a small subset is needed. Read-only; does not call any downstream tools itself.
| Name | Required | Description | Default |
|---|---|---|---|
| intent | No | What you are trying to accomplish with Mushi, e.g. "fix the top bug", "check project health", "run QA tests", "set up Mushi". Leave blank for a general orientation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it explicitly says 'Read-only; does not call any downstream tools itself,' which is a meaningful guarantee for an agent deciding whether to invoke it. It also discloses that hidden tools are named with enablement instructions, which is a useful behavioral trait not visible in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most critical instruction ('CALL THIS FIRST'), then the return contract, then the scope constraint, then the safety note. Every sentence earns its place: the examples are compact, the return format is enumerated, and there is zero filler. It is appropriately sized for a tool that needs to orient an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only orientation tool with one optional parameter, no output schema, and no nested objects, the description is complete. It explains what the tool returns (three enumerated items), how to use it (intent phrase or blank), what it does not do (no downstream calls), and how it handles hidden tools. An agent has everything needed to invoke it correctly without further context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single 'intent' parameter well. The description adds value by giving concrete example values ('fix the top bug', 'check what I should work on', 'run QA tests', 'set up Mushi') and clarifying that leaving it blank yields a general orientation. This goes beyond the schema's examples and clarifies the blank case, which is genuinely useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('CALL THIS FIRST'), a clear resource (Mushi project orientation), and a precise scope: it returns a curated list of 5–12 relevant tools, a one-paragraph orientation, and a single recommended first tool. It also explicitly distinguishes itself from the 40+ sibling tools by being the entry point when unsure which tool to use, so an agent can tell it apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use.' It also provides concrete example intents and states what it avoids (loading the full tool catalog), which implies when not to use it (when you already know the exact tool). This is strong routing guidance relative to the large sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
33 tool updates
v0.1.14- Changed
add_byok_key1 field changed- changed
Input schema / properties / provider / enumPrevious value: -[ - "anthropic", - "openai", - "firecrawl", - "browserbase", - "cursor" -]New value: +[ + "anthropic", + "openai", + "openrouter", + "firecrawl", + "browserbase", + "cursor", + "supabase" +]
- Changed
dispatch_fix1 field changed- added
Input schema / properties / targetRepoIdAdded value: +{ + "description": "Optional linked repo id (project_repos.id) to open the fix PR against, for a project with several repos. Omit for the project's primary repo. Another project's repo id is rejected with 400 TARGET_REPO_NOT_IN_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" +}
- Added
explain_finding - Added
get_app_recipe - Added
get_auto_release_status - Added
get_design_deviance - Added
get_design_settings - Added
get_design_tokens - Changed
get_fix_context2 fields changed- added
Output schema / properties / recipeAdded value: +{ + "additionalProperties": {}, + "description": "Design excerpt (≤ 4 KB) for the report's project: tokens with CSS var / TS names, the deviance score, findings in the files this fix touches, and context (tables the stack trace names, whether the last fix is live, open hole checks). Never null; when it could not be read, { state: 'error', note }.", + "properties": { + "context": { + "additionalProperties": {}, + "description": "Backend and release context for this bug; each section has its own state, and unknown never means healthy", + "properties": { + "deploy": { + "description": "{ state: live | deployed_since_merge | not_live | probe_failed | unknown | no_merged_fix | error, note, lastFix, targets }" + }, + "radar": { + "description": "{ state, note, checkedAt, findings: [{ rule, severity, message, fix }] }: open hole checks" + }, + "schema": { + "description": "{ state, note, snapshotAt, tables: [{ name, columns }], missing }: tables the stack trace names, from the latest schema snapshot" + } + }, + "required": [ + "schema", + "deploy", + "radar" + ], + "type": "object" + }, + "findings": { + "description": "Open design deviance findings in the files this fix touches", + "items": {}, + "type": "array" + }, + "note": { + "description": "Why this state, in plain English", + "type": "string" + }, + "score": { + "description": "Design deviance score 0–100, lower is better; null = not scored", + "type": [ + "number", + "null" + ] + }, + "set": { + "description": "The token set the excerpt was taken from", + "type": [ + "string", + "null" + ] + }, + "state": { + "description": "ok | drift | unknown | not_connected | error; unknown never means healthy", + "enum": [ + "ok", + "drift", + "unknown", + "not_connected", + "error" + ], + "type": "string" + }, + "tokens": { + "description": "Most useful tokens first: { path, value, cssVar, ts }. Use these names, not literals.", + "items": {}, + "type": "array" + }, + "truncated": { + "description": "True when the excerpt was cut to stay under 4 KB", + "type": "boolean" + } + }, + "required": [ + "state", + "note" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "report", - "fixPrompt", - "reproductionSteps", - "component", - "rootCause", - "bugOntologyTags", - "inventoryAction" -]New value: +[ + "report", + "fixPrompt", + "reproductionSteps", + "component", + "rootCause", + "bugOntologyTags", + "inventoryAction", + "recipe" +]
- Added
get_portfolio - Added
get_radar - Added
get_recipe_change - Added
get_recipe_drift - Added
get_recipe_sources - Added
get_release_calendar - Added
get_repo_diagram - Added
get_repo_digest - Added
get_store_reviews - Added
get_store_status - Changed
import_sentry_issues6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "nextCursor from the previous import, to fetch the next page of a backlog. Search mode only.", + "pattern": "^[0-9][0-9.:-]{0,63}$", + "type": "string" +} - added
Input schema / properties / sentryProjectAdded value: +{ + "description": "Which of the project's Sentry projects to search (default: the primary one). Search mode only.", + "pattern": "^[a-z0-9][a-z0-9_-]{0,49}$", + "type": "string" +} - added
Input schema / properties / sinceDaysAdded value: +{ + "description": "Only issues seen in the last N days (1-90). Search mode only.", + "maximum": 90, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Pass back as cursor to import the next page; null when the backlog is done", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / sentryProjectAdded value: +{ + "description": "The Sentry project a search ran in (null for issueIds)", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / sentryProjectsAdded value: +{ + "description": "This project's Sentry projects, primary first", + "items": { + "type": "string" + }, + "type": "array" +}
- Added
list_connectors - Changed
list_gate_findings1 field changed- changed
Input schema / properties / gate / enumPrevious value: -[ - "dead_handler", - "mock_leak", - "api_contract", - "crawl", - "status_claim", - "spec_drift", - "orphan_endpoint", - "unknown_call", - "schema_drift", - "code_health" -]New value: +[ + "dead_handler", + "mock_leak", + "api_contract", + "crawl", + "status_claim", + "spec_drift", + "orphan_endpoint", + "unknown_call", + "schema_drift", + "code_health", + "design_drift", + "ci_drift", + "deploy_drift", + "env_drift", + "radar", + "portfolio_radar", + "portfolio_radar_ci", + "store_review" +]
- Added
list_portfolio_findings - Added
propose_portfolio_change - Added
propose_recipe_change - Added
pull_store_reviews - Added
refresh_recipe - Added
request_connector_action - Added
run_design_deviance - Added
run_radar - Added
run_store_review - Added
set_design_settings - Added
set_store_review_intake
5 tool updates
v0.1.13- Added
import_sentry_issues - Added
list_reporter_outbox - Added
release_reporter_update - Added
request_reporter_info - Changed
transition_status2 fields changed- added
Input schema / properties / closedReasonAdded value: +{ + "description": "When dismissing: what the reporter is told (spam closes silently)", + "enum": [ + "duplicate", + "not_reproducible", + "wont_fix", + "working_as_intended", + "spam" + ], + "type": "string" +} - added
Input schema / properties / reporterMessageAdded value: +{ + "description": "Optional note posted to the reporter verbatim", + "maxLength": 10000, + "type": "string" +}
32 tool updates
v0.1.12- Changed
activation_status2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID (defaults to the configured project).", - "type": "string" -}
- Changed
add_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
diagnose_setup3 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Alias for project_id."New value: +"Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.)" - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID for dispatch checks (defaults to configured project).", - "type": "string" -} - added
Output schema / properties / mode / enumAdded value: +[ + "full", + "ingest", + "dispatch" +]
- Changed
diff_inventory1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
- Changed
dispatch_fix4 fields changed- changed
Input schema / properties / agent / descriptionPrevious value: -"Override the agent adapter"New value: +"Which agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent." - changed
Input schema / properties / agent / enumPrevious value: -[ - "claude_code", - "codex", - "rest_worker", - "mcp" -]New value: +[ + "auto", + "claude_code", + "codex", + "cursor_cloud", + "github_cloud_agent", + "rest_worker", + "rest_fix_worker", + "llm", + "mcp" +] - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to the configured project. (`project_id` is accepted too.)", + "type": "string" +} - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to fix"New value: +"Report UUID to fix (`report_id` is accepted too.)"
- Changed
get_fix_context15 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -} - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID to fix"New value: +"The report UUID to fix (`report_id` is accepted too.)" - added
Output schema / properties / bugOntologyTags / descriptionAdded value: +"Bug ontology tags, or null" - added
Output schema / properties / component / descriptionAdded value: +"Component or page the bug was attributed to" - added
Output schema / properties / component / typeAdded value: +[ + "string", + "null" +] - added
Output schema / properties / fixPrompt / descriptionAdded value: +"Paste-ready fix prompt composed server-side, or null" - added
Output schema / properties / inventoryActionAdded value: +{ + "description": "The inventory action (with its expected_outcome contract) the report is filed against, or null" +} - added
Output schema / properties / report / additionalPropertiesAdded value: +{} - added
Output schema / properties / report / propertiesAdded value: +{ + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / report / requiredAdded value: +[ + "id" +] - added
Output schema / properties / report / typeAdded value: +"object" - added
Output schema / properties / reproductionSteps / descriptionAdded value: +"Reproduction steps recorded on the report ([] if none)" - added
Output schema / properties / rootCause / descriptionAdded value: +"Stage-2 root cause, or null before Stage 2 runs" - changed
Output schema / requiredPrevious value: -[ - "report", - "fixPrompt", - "reproductionSteps", - "component", - "rootCause", - "bugOntologyTags" -]New value: +[ + "report", + "fixPrompt", + "reproductionSteps", + "component", + "rootCause", + "bugOntologyTags", + "inventoryAction" +]
- Changed
get_fix_timeline3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"fix_attempt UUID"New value: +"fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.)" - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -}
- Changed
get_inventory1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to the server-configured project when omitted"New value: +"Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)"
- Added
get_mushi_doc - Changed
get_recent_reports13 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Filter by category: bug, slow, visual, confusing, other"New value: +"Filter by category." - added
Input schema / properties / category / enumAdded value: +[ + "bug", + "slow", + "visual", + "confusing", + "other" +] - added
Input schema / properties / includeRawAdded value: +{ + "description": "Return every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)", + "type": "boolean" +} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — defaults to the server-configured project. Useful when you have multiple projects and want to query a specific one by its ID. Get IDs by calling list_projects or get_account_overview first.", - "type": "string" -} - changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity: critical, high, medium, low"New value: +"Filter by severity." - added
Input schema / properties / severity / enumAdded value: +[ + "critical", + "high", + "medium", + "low" +] - changed
Input schema / properties / status / descriptionPrevious value: -"Filter by status: new, classified, grouped, fixing, fixed, dismissed"New value: +"Filter by status. \"new\" also matches queued rows; \"classified\" and \"fixed\" include legacy aliases." - added
Input schema / properties / status / enumAdded value: +[ + "new", + "pending", + "submitted", + "queued", + "classified", + "grouped", + "fixing", + "fixed", + "dismissed", + "triaged", + "in_progress", + "resolved", + "verified", + "reopened" +] - added
Output schema / properties / reports / items / additionalPropertiesAdded value: +{} - added
Output schema / properties / reports / items / propertiesAdded value: +{ + "category": { + "type": [ + "string", + "null" + ] + }, + "component": { + "type": [ + "string", + "null" + ] + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": "string" + }, + "severity": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "summary": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / reports / items / requiredAdded value: +[ + "id" +] - added
Output schema / properties / reports / items / typeAdded value: +"object"
- Changed
get_report_detail8 fields changed- added
Input schema / properties / includeRawAdded value: +{ + "description": "Return every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)", + "type": "boolean" +} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — required for org-scoped keys with multiple projects.", - "type": "string" -} - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)" - added
Output schema / properties / report / additionalPropertiesAdded value: +{} - added
Output schema / properties / report / propertiesAdded value: +{ + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } +} - added
Output schema / properties / report / requiredAdded value: +[ + "id" +] - added
Output schema / properties / report / typeAdded value: +"object"
- Changed
get_report_evidence3 fields changed- added
Input schema / properties / reportIdAdded value: +{ + "description": "Report UUID. (`report_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / report_idRemoved value: -{ - "description": "Report UUID.", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "report_id" -]New value: +[ + "reportId" +]
- Changed
get_report_timeline1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
- Changed
list_byok_keys1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
list_gate_findings5 fields changed- changed
Input schema / properties / gate / descriptionPrevious value: -"Filter to one gate id: dead-handler | mock-leak | crawl | status-claim"New value: +"Only runs of this gate (and their findings)." - added
Input schema / properties / gate / enumAdded value: +[ + "dead_handler", + "mock_leak", + "api_contract", + "crawl", + "status_claim", + "spec_drift", + "orphan_endpoint", + "unknown_call", + "schema_drift", + "code_health" +] - changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)" - changed
Input schema / properties / severity / descriptionPrevious value: -"Minimum severity to include: low | medium | high | critical"New value: +"Only findings with exactly this severity." - added
Input schema / properties / severity / enumAdded value: +[ + "info", + "warn", + "error" +]
- Changed
list_lessons2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID — defaults to configured project (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID — defaults to configured project", - "type": "string" -}
- Changed
merge_fix3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID whose GitHub PR should be squash-merged"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.)" - added
Output schema / properties / justMergedAdded value: +{ + "description": "True when this call performed the merge", + "type": "boolean" +} - added
Output schema / properties / shaAdded value: +{ + "description": "Merge commit SHA, when GitHub reported one", + "type": [ + "string", + "null" + ] +}
- Changed
query_lessons9 fields changed- added
Input schema / properties / diffTextAdded value: +{ + "description": "The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / diff_textRemoved value: -{ - "description": "The PR diff, code snippet, or description of the change being made.", - "type": "string" -} - added
Input schema / properties / maxTokensAdded value: +{ + "description": "Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.)", + "type": "number" +} - removed
Input schema / properties / max_tokensRemoved value: -{ - "description": "Maximum tokens for returned lessons context (default 3000, max 8000).", - "type": "number" -} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID. Defaults to configured project.", - "type": "string" -} - added
Input schema / properties / topKAdded value: +{ + "description": "Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.)", + "type": "number" +} - removed
Input schema / properties / top_kRemoved value: -{ - "description": "Max number of lessons to return (default 15, max 50).", - "type": "number" -} - changed
Input schema / requiredPrevious value: -[ - "diff_text" -]New value: +[ + "diffText" +]
- Changed
refresh_ci1 field changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID whose PR check-runs should be re-polled"New value: +"Fix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.)"
- Changed
remove_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
reopen_report1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to move back to reopened status"New value: +"Report UUID to move back to reopened status (`report_id` is accepted too.)"
- Changed
reply_to_reporter1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report id to reply to"New value: +"Report id to reply to (`report_id` is accepted too.)"
- Changed
search_mushi_docs3 fields changed- removed
Output schema / properties / results / items / properties / pathRemoved value: -{ - "type": "string" -} - added
Output schema / properties / results / items / properties / urlAdded value: +{ + "type": "string" +} - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "title", - "path", - "excerpt", - "score" -]New value: +[ + "title", + "url", + "excerpt", + "score" +]
- Removed
setup_repo_for_mushi - Changed
submit_fix_result2 fields changed- changed
Input schema / properties / prUrl / descriptionPrevious value: -"GitHub pull request URL, if a PR was opened"New value: +"GitHub pull request URL, if a PR was opened (`pr_url` is accepted too.)" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to attach this external fix attempt to"New value: +"Report UUID to attach this external fix attempt to (`report_id` is accepted too.)"
- Changed
suggest_fix1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to read the Stage-2 suggested-fix slice for"New value: +"Report UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.)"
- Changed
test_byok_key1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
- Changed
test_gen_from_report2 fields changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID to turn into a Playwright PR"New value: +"Report UUID to turn into a Playwright PR (`report_id` is accepted too.)"
- Changed
transition_status1 field changed- changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID"New value: +"Report UUID (`report_id` is accepted too.)"
- Changed
triage_issue35 fields changed- added
Input schema / properties / includeLogsAdded value: +{ + "description": "Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.)", + "type": "boolean" +} - removed
Input schema / properties / include_logsRemoved value: -{ - "description": "Include recent pipeline logs in triage packet (default: true).", - "type": "boolean" -} - added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID. Defaults to configured project.", - "type": "string" -} - added
Input schema / properties / reportIdAdded value: +{ + "description": "Report UUID to triage. (`report_id` is accepted too.)", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - removed
Input schema / properties / report_idRemoved value: -{ - "description": "Report UUID to triage.", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "report_id" -]New value: +[ + "reportId" +] - changed
Output schema / properties / blast_radius / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "affected": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / blast_radius / descriptionAdded value: +"Downstream nodes of the inventory action the report is filed against, or null" - added
Output schema / properties / category / descriptionAdded value: +"bug | slow | visual | confusing | other, or unknown" - added
Output schema / properties / category / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / fix_context / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "bugOntologyTags": { + "description": "Bug ontology tags, or null" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "fixPrompt": { + "description": "Paste-ready fix prompt composed server-side, or null" + }, + "reproductionSteps": { + "description": "Reproduction steps recorded on the report ([] if none)" + }, + "rootCause": { + "description": "Stage-2 root cause, or null before Stage 2 runs" + } + }, + "required": [ + "fixPrompt", + "reproductionSteps", + "component", + "rootCause", + "bugOntologyTags" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / fix_context / descriptionAdded value: +"Fix-context slice, as get_fix_context returns it" - added
Output schema / properties / notesAdded value: +{ + "description": "Sources that do not apply to this report, and why", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / partial_errorsAdded value: +{ + "description": "Sources that failed, as \"source: message\"", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / recent_logs / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "entries": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / recent_logs / descriptionAdded value: +"Recent warn+ pipeline log entries for the project, or null" - added
Output schema / properties / recommended_actions / descriptionAdded value: +"What to do next, most important first" - added
Output schema / properties / recommended_actions / items / additionalPropertiesAdded value: +false - added
Output schema / properties / recommended_actions / items / propertiesAdded value: +{ + "action": { + "type": "string" + }, + "args": { + "additionalProperties": {}, + "description": "Arguments for that tool", + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "reason": { + "type": "string" + }, + "tool": { + "description": "Tool to call next", + "type": "string" + } +} - added
Output schema / properties / recommended_actions / items / requiredAdded value: +[ + "action", + "reason" +] - added
Output schema / properties / recommended_actions / items / typeAdded value: +"object" - added
Output schema / properties / report / anyOfAdded value: +[ + { + "additionalProperties": {}, + "properties": { + "breadcrumbs": {}, + "category": { + "description": "bug | slow | visual | confusing | other", + "type": [ + "string", + "null" + ] + }, + "child_report_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "component": { + "description": "Component or page the bug was attributed to", + "type": [ + "string", + "null" + ] + }, + "console_logs": { + "description": "Console entries captured with the report" + }, + "created_at": { + "type": [ + "string", + "null" + ] + }, + "description": { + "description": "What the reporter wrote (untrusted text)", + "type": [ + "string", + "null" + ] + }, + "environment": { + "description": "Browser/OS/viewport the SDK captured" + }, + "fix_attempts": { + "description": "Latest fix attempts, newest first", + "items": { + "additionalProperties": {}, + "properties": { + "id": { + "type": "string" + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "type": "array" + }, + "fix_packet": { + "description": "Paste-ready fix prompt composed server-side" + }, + "id": { + "description": "Report UUID", + "type": "string" + }, + "inventory_action": { + "description": "Inventory action the report is filed against, when resolved" + }, + "network_logs": { + "description": "Network requests captured with the report" + }, + "project_id": { + "type": [ + "string", + "null" + ] + }, + "reproduction_steps": {}, + "screenshot_url": { + "description": "Signed screenshot URL", + "type": [ + "string", + "null" + ] + }, + "severity": { + "description": "critical | high | medium | low", + "type": [ + "string", + "null" + ] + }, + "stage1_classification": { + "description": "Stage-1 (fast) classification" + }, + "stage2_analysis": { + "description": "Stage-2 analysis: rootCause, suggestedFix, …" + }, + "status": { + "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened", + "type": [ + "string", + "null" + ] + }, + "summary": { + "description": "One-line summary written by the classifier", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "error": { + "type": "string" + } + }, + "required": [ + "error" + ], + "type": "object" + } +] - added
Output schema / properties / report / descriptionAdded value: +"The report (documented fields, no reporter identifiers), or the error reading it" - added
Output schema / properties / report_id / descriptionAdded value: +"The triaged report UUID" - changed
Output schema / properties / reporter_thread / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": {}, + "properties": { + "report_id": { + "type": "string" + }, + "timeline": { + "items": {}, + "type": "array" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Output schema / properties / reporter_thread / descriptionAdded value: +"The unified report timeline (comments, fixes, QA), or null" - added
Output schema / properties / severity / descriptionAdded value: +"critical | high | medium | low, or unknown when the report could not be read" - added
Output schema / properties / severity / typeAdded value: +[ + "string", + "null" +] - changed
Output schema / properties / similar_bugs / anyOfPrevious value: -[ - {}, - { - "type": "null" - } -]New value: +[ + { + "items": { + "additionalProperties": {}, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "string", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "reportGroupId": { + "type": [ + "string", + "null" + ] + }, + "reportId": { + "type": "string" + }, + "similarity": { + "type": "number" + } + }, + "required": [ + "reportId", + "similarity" + ], + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Output schema / properties / similar_bugs / descriptionAdded value: +"Up to five nearest reports by summary, excluding this one; null when not searched" - added
Output schema / properties / status / descriptionAdded value: +"Workflow status, or unknown" - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - added
Output schema / properties / triage_summary / descriptionAdded value: +"One-line summary" - changed
Output schema / requiredPrevious value: -[ - "report_id", - "severity", - "category", - "status", - "report", - "reporter_thread", - "similar_bugs", - "fix_context", - "blast_radius", - "recent_logs", - "recommended_actions", - "triage_summary" -]New value: +[ + "report_id", + "severity", + "category", + "status", + "partial_errors", + "notes", + "report", + "reporter_thread", + "similar_bugs", + "fix_context", + "blast_radius", + "recent_logs", + "recommended_actions", + "triage_summary" +]
- Changed
triage_next_steps2 fields changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)", + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - removed
Input schema / properties / project_idRemoved value: -{ - "description": "Project UUID (defaults to the configured project).", - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" -}
- Changed
trigger_judge1 field changed- changed
Input schema / properties / projectId / descriptionPrevious value: -"Restrict to one project when the API key owns multiple"New value: +"Restrict to one project when the API key owns multiple (`project_id` is accepted too.)"
41 tool updates
v0.1.10- Changed
activation_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
add_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Added
check_sdk_version - Changed
diagnose_setup2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
diff_inventory1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
dispatch_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_blast_radius1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_fix_context2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_fix_timeline1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_graph_neighborhood2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_graph_node2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_inventory1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_knowledge_graph2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_recent_reports2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_detail2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_evidence1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_report_timeline1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_similar_bugs2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_two_way_comms_health1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_byok_keys1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_gate_findings2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_lessons2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
merge_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
query_lessons1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
refresh_ci8 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / check_run_conclusion / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_conclusion / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / check_run_status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / check_run_updated_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / check_run_updated_at / typeAdded value: +[ + "string", + "null" +]
- Changed
remove_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
reopen_report2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
reply_to_reporter1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
run_nl_query1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_mushi_docs2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_reports2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
setup_repo_for_mushi1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
submit_fix_result2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
suggest_fix2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
test_byok_key1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
test_gen_from_report1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
transition_status1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
triage_issue2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
triage_next_steps2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
trigger_judge2 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
use_mushi1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
4 tool updates
v0.1.9- Changed
submit_fix_result1 field changed- changed
Input schema / properties / idempotencyKey / descriptionPrevious value: -"Optional UUID — resend the same key to safely retry without creating duplicate fix rows"New value: +"Optional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one."
- Changed
suggest_fix1 field changed- added
Output schema / properties / noteAdded value: +{ + "description": "Present when no Stage-2 analysis exists — explains why and what to call instead", + "type": "string" +}
- Changed
transition_status2 fields changed- changed
Input schema / properties / status / descriptionPrevious value: -"Target status"New value: +"Target status (resolved is stored as fixed)" - changed
Input schema / properties / status / enumPrevious value: -[ - "pending", - "classified", - "grouped", - "fixing", - "fixed", - "resolved", - "verified", - "reopened", - "dismissed" -]New value: +[ + "pending", + "classified", + "triaged", + "in_progress", + "grouped", + "fixing", + "fixed", + "resolved", + "verified", + "reopened", + "dismissed" +]
- Added
triage_next_steps
5 tool updates
v0.1.8- Added
add_byok_key - Added
list_byok_keys - Added
remove_byok_key - Added
test_byok_key - Added
use_mushi
60 tool updates
v0.1.2- Added
activation_status - Removed
add_byok_key - Removed
analyze_codebase_impact - Removed
analyze_wiki_knowledge - Removed
approve_qa_story - Removed
ask_codebase - Removed
award_bonus_points - Removed
checkin_pipeline_step - Removed
diagnose_connection - Changed
diagnose_setup1 field changed- added
Output schema / properties / connectionAdded value: +{}
- Added
diff_inventory - Removed
fix_suggest - Removed
generate_tdd_from_story - Removed
get_account_overview - Removed
get_activation_status - Removed
get_backend_health - Removed
get_codebase_domains - Removed
get_codebase_tour - Removed
get_file_summary - Added
get_graph_neighborhood - Added
get_graph_node - Added
get_inventory - Changed
get_knowledge_graph3 fields changed- changed
Input schema / properties / depth / descriptionPrevious value: -"Traversal depth (default 2, max 4)"New value: +"BFS hops outward from seed — clamped to 4 in the handler (default 2)" - changed
Input schema / properties / seed / descriptionPrevious value: -"Starting node id or label"New value: +"Starting graph node id or human-readable label to traverse from" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "edges": { + "description": "Edges connecting the returned nodes", + "items": {}, + "type": "array" + }, + "nodes": { + "description": "Graph nodes within the depth budget", + "items": {}, + "type": "array" + } + }, + "required": [ + "nodes", + "edges" + ], + "type": "object" +}
- Removed
get_map_run_status - Removed
get_pipeline_logs - Removed
get_pipeline_run - Removed
get_project_context - Removed
get_qa_story_run - Removed
get_reporter_thread - Removed
get_skill - Removed
get_usage - Removed
graph_neighborhood - Removed
graph_node_status - Removed
improve_qa_story - Removed
ingest_setup_check - Removed
inventory_diff - Removed
inventory_findings - Removed
inventory_get - Removed
list_byok_keys - Added
list_gate_findings - Changed
list_lessons4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max number of lessons to return (default 50, max 200)."New value: +"Max lessons to return (default 50, max 200)" - changed
Input schema / properties / project_id / descriptionPrevious value: -"Project UUID. Defaults to configured project."New value: +"Project UUID — defaults to configured project" - changed
Input schema / properties / severity / descriptionPrevious value: -"Filter by severity level."New value: +"Filter to one severity level" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "lessons": { + "description": "Promoted lesson rows ordered by frequency", + "items": {}, + "type": "array" + } + }, + "required": [ + "lessons" + ], + "type": "object" +}
- Removed
list_pending_review_stories - Removed
list_projects - Removed
list_qa_story_runs - Removed
list_skills - Removed
list_top_contributors - Removed
map_user_stories - Changed
merge_fix3 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged" - changed
Input schema / properties / mergeMethod / descriptionPrevious value: -"GitHub merge method"New value: +"GitHub merge method (default squash)" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "alreadyMerged": { + "description": "True when the PR was already merged (idempotent no-op)", + "type": "boolean" + }, + "merged": { + "description": "True when GitHub accepted the merge in this call", + "type": "boolean" + }, + "reportId": { + "description": "Report UUID linked to this fix attempt", + "type": "string" + }, + "reportStatus": { + "description": "Report workflow status after merge bookkeeping", + "type": "string" + } + }, + "required": [ + "reportId", + "reportStatus" + ], + "type": "object" +}
- Changed
refresh_ci2 fields changed- changed
Input schema / properties / fixId / descriptionPrevious value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose PR check-runs should be re-polled" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "check_run_conclusion": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "success | failure | neutral | null while pending" + }, + "check_run_status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "GitHub check run status after refresh" + }, + "check_run_updated_at": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "ISO timestamp when CI status was last persisted" + } + }, + "required": [ + "check_run_status", + "check_run_conclusion", + "check_run_updated_at" + ], + "type": "object" +}
- Changed
reopen_report3 fields changed- changed
Input schema / properties / note / descriptionPrevious value: -"Triage note"New value: +"Operator note recorded on the reopen transition" - changed
Input schema / properties / reportId / descriptionPrevious value: -"Report UUID"New value: +"Report UUID to move back to reopened status" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "report": { + "description": "Updated report row with status=reopened" + } + }, + "required": [ + "report" + ], + "type": "object" +}
- Removed
run_fullstack_audit - Removed
run_qa_story - Removed
search_codebase - Removed
set_tier - Removed
setup_check - Removed
start_skill_pipeline - Changed
submit_fix_result7 fields changed- changed
Input schema / properties / branch / descriptionPrevious value: -"Git branch name"New value: +"Git branch name where the fix was implemented" - changed
Input schema / properties / filesChanged / descriptionPrevious value: -"Files modified"New value: +"Repo-relative paths modified by the fix" - changed
Input schema / properties / linesChanged / descriptionPrevious value: -"Total lines changed"New value: +"Total lines added + removed across filesChanged" - changed
Input schema / properties / prUrl / descriptionPrevious value: -"GitHub PR URL"New value: +"GitHub pull request URL, if a PR was opened" - changed
Input schema / properties / reportId / descriptionPrevious value: -"The report UUID"New value: +"Report UUID to attach this external fix attempt to" - changed
Input schema / properties / summary / descriptionPrevious value: -"Fix summary"New value: +"One-line human summary of what the fix changed" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "fixId": { + "description": "UUID of the new fix_attempt row", + "type": "string" + }, + "ok": { + "description": "True when the fix_attempt row was created and marked completed", + "type": "boolean" + } + }, + "required": [ + "ok", + "fixId" + ], + "type": "object" +}
- Added
suggest_fix - Removed
test_notification_channel - Changed
trigger_judge1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "dispatched": { + "description": "Number of judge-batch jobs dispatched (one per accessible project)", + "type": "number" + } + }, + "required": [ + "dispatched" + ], + "type": "object" +}
2 tool updates
v0.1.1- Changed
dispatch_fix2 fields changed- added
Input schema / properties / reportId / formatAdded value: +"uuid" - added
Input schema / properties / reportId / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
- Changed
triage_issue2 fields changed- added
Input schema / properties / report_id / formatAdded value: +"uuid" - added
Input schema / properties / report_id / patternAdded value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
72 tool updates
v0.1.0- First observed
add_byok_key - First observed
analyze_codebase_impact - First observed
analyze_wiki_knowledge - First observed
approve_qa_story - First observed
ask_codebase - First observed
award_bonus_points - First observed
checkin_pipeline_step - First observed
diagnose_connection - First observed
diagnose_setup - First observed
dispatch_fix - First observed
fix_suggest - First observed
generate_tdd_from_story - First observed
get_account_overview - First observed
get_activation_status - First observed
get_backend_health - First observed
get_blast_radius - First observed
get_codebase_domains - First observed
get_codebase_tour - First observed
get_file_summary - First observed
get_fix_context - First observed
get_fix_timeline - First observed
get_knowledge_graph - First observed
get_map_run_status - First observed
get_pipeline_logs - First observed
get_pipeline_run - First observed
get_project_context - First observed
get_qa_story_run - First observed
get_recent_reports - First observed
get_report_detail - First observed
get_report_evidence - First observed
get_report_timeline - First observed
get_reporter_thread - First observed
get_similar_bugs - First observed
get_skill - First observed
get_two_way_comms_health - First observed
get_usage - First observed
graph_neighborhood - First observed
graph_node_status - First observed
improve_qa_story - First observed
ingest_setup_check - First observed
inventory_diff - First observed
inventory_findings - First observed
inventory_get - First observed
list_byok_keys - First observed
list_lessons - First observed
list_pending_review_stories - First observed
list_projects - First observed
list_qa_story_runs - First observed
list_skills - First observed
list_top_contributors - First observed
map_user_stories - First observed
merge_fix - First observed
query_lessons - First observed
refresh_ci - First observed
reopen_report - First observed
reply_to_reporter - First observed
run_fullstack_audit - First observed
run_nl_query - First observed
run_qa_story - First observed
search_codebase - First observed
search_mushi_docs - First observed
search_reports - First observed
set_tier - First observed
setup_check - First observed
setup_repo_for_mushi - First observed
start_skill_pipeline - First observed
submit_fix_result - First observed
test_gen_from_report - First observed
test_notification_channel - First observed
transition_status - First observed
triage_issue - First observed
trigger_judge
TDQS
Scored across 73 tools
The descriptions are unusually cross-referential and explicitly tell agents which tool to use for which scenario, which helps distinguish many overlapping report, fix, graph, gate, and design tools. However, with 73 tools, there are still several clusters with genuinely blurry boundaries—e.g., get_report_detail, get_report_evidence, get_fix_context, triage_issue, and suggest_fix all serve report analysis; get_knowledge_graph, get_graph_neighborhood, and get_blast_radius all traverse graph relationships. The volume alone makes misselection likely despite strong per-tool guidance.
Most tool names follow a predictable snake_case verb_noun pattern (search_reports, get_report_detail, dispatch_fix, merge_fix, list_gate_findings). A few names break the pattern slightly, such as use_mushi, activation_status, and triage_issue, but they remain readable and are not chaotic. Overall consistency is strong with minor deviations.
73 tools is an extreme mismatch for practical agent use and far exceeds the typical 3-15 well-scoped range. Even for a broad platform like Mushi, the surface is bloated and imposes a severe context and selection burden. Per the calibration example, 50+ tools falls into the lowest count-appropriateness band.
The surface covers an unusually wide domain: report search/detail/evidence/timeline, triage, fix dispatch/merge/CI, design tokens/deviance, recipe/gates, inventory, store reviews, portfolio views, BYOK keys, connectors, docs, and lessons. Lifecycle coverage is extensive, with only minor gaps such as no explicit report deletion or manual report-edit tool, and a few referenced tools (e.g., analyze_codebase_impact) absent from the set.
Maintenance
Related MCP Connectors
Voice-powered bug reporting with 13 MCP tools. Record bugs by talking; let AI find and fix them.
AI-native git hosting — repos, PRs, issues, CI gates, and AI code review over MCP (60 tools).
MCP-native AI SRE: ask what's broken in production, get a reviewed GitHub fix PR.
Package intelligence MCP for AI agents — 22 tools, 19 ecosystems, AGPL SDK, free.
Related MCP Servers
AlicenseAqualityAmaintenanceA remote Model Context Protocol server acting as middleware to the Sentry API, allowing AI assistants like Claude to access Sentry data and functionality through natural language interfaces.739 npm930MIT- AlicenseAqualityNot gradedmaintenanceA server that enables LLMs to interact with web pages through structured accessibility snapshots without needing screenshots or visually-tuned models.246,403,349 npm1-
- AlicenseBqualityAmaintenanceOpen source contribution manager — tracks PRs across repos, discovers contributable issues, diagnoses CI failures, and drafts maintainer responses. 21 MCP tools, 5 resources, 3 prompts. Ships as CLI, MCP server, and Claude Code plugin.2018MIT
- AlicenseAqualityDmaintenanceMCP server for VibeCheck bug reports. Gives AI assistants direct access to screen recordings, console logs, network requests, user actions, and web vitals — right inside your editor.58 npmMIT