Skip to main content
Glama

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.

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

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"]
  1. Capture. A user taps the widget. Mushi records a screenshot, the route, their note, and the last console and network events.

  2. Diagnose. Mushi writes the root cause in plain English with a fix prompt. Twenty reports of the same broken button become one row.

  3. 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 diagnoses

Then 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

mushi-mushi

Setup

One-command wizard (npx mushi-mushi)

@mushi-mushi/react, vue, svelte, angular, react-native, capacitor

Your app

The bug widget for your framework

@mushi-mushi/web

Your app

The same widget for any site, no framework needed

@mushi-mushi/node

Your server

Reports backend errors into the same queue

@mushi-mushi/mcp

Your editor

Gives Cursor and Claude Code the diagnosis and fix tools

@mushi-mushi/cli

Your terminal

Setup, reports, fixes and health checks

@mushi-mushi/ux

Your app's screens

Runs your coding agent over every screen and keeps only measured improvements

packages/server

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

Walkthroughs: 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 inventory_v2 plan flag

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 ≥ 10

See 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

MIT

Use anywhere, including closed-source products

Server (server, agents, verify)

AGPLv3

Self-host and modify freely. Offer a modified server as a service: publish your changes or get a commercial license

Enterprise features (packages/server/ee/)

EE license

SSO, audit ingest, retention, region pinning. Paid for production use

Name and logo

Trademark policy

Forks must rename

Third-party notices: NOTICE.

More apps from the same maker

App

What it is

Glot It

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

yen-yen

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

The Wanting Mind

How the Battle Between Extraction and Generation Is Reshaping Our World — a 147,000-word interactive webbook with 268 concepts, 242 citations, and original illustrations

Help Her Take Photo

Pair phones, direct the pose, nail the photo

Cooler Heads

Practice hard conversations before you have them

一人社長 Solo Boss

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

Tsumagoi Work&Camp 嬬恋牧場

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

kenji skills

Agent skills and slash commands for Claude Code, Cursor, Codex, and Gemini

kensaur.us

All apps from the same maker

All apps live under kensaur.us.


Available Tools

73 tools
activation_statusActivation cockpit statusA
Read-onlyIdempotent
Inspect

Return the unified activation posture — SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, and the next best action. Read this before guessing which onboarding step is blocking the user. Also available as the mushi://activation resource for resource-reader clients. Returns { sdkActive, reportsIngested, githubConnected, mcpConnected, qaStoriesCreated, nextBestAction }.

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

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already signal read-only, idempotent, and open-world hints, so the description does not need to restate safety. It adds value beyond the annotations by specifying the exact returned fields and mentioning the equivalent mushi://activation resource. No contradiction with annotations was found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, followed by usage cue and exact return shape. The natural-language list and the JSON key list overlap, but they serve different readers (human summary vs exact field names) without unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only status tool with one optional parameter and no output schema, the description covers the return contract, the usage moment, and an alternative protocol. It does not explain edge-state behavior (e.g., what fields look like before activation), but annotations and simplicity make the tool unlikely to cause incorrect invocations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already documents projectId as a defaulting optional UUID. The description does not add parameter-level meaning, but the high coverage keeps this at the baseline rather than lower.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Return the unified activation posture') and enumerates the exact components (SDK heartbeat, ingested reports, GitHub, MCP readiness, QA stories, next best action), so an agent can distinguish this activation-status tool from siblings like get_inventory or get_recent_reports. The 'next best action' phrase also signals what makes this tool unique.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to use the tool: 'Read this before guessing which onboarding step is blocking the user,' which gives a concrete decision point. It also notes an alternative access path (mushi://activation for resource-reader clients), but it does not spell out when to prefer sibling tools over this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_byok_keyAdd an API keyAInspect

Add and immediately validate a BYOK API key for anthropic | openai | 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.

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

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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

Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version). Returns { package, current, latest, outdated } and, when outdated, suggestedActions (Sentry-style, max 1) pointing at search_mushi_docs plus the mushi-sdk-upgrade skill. Read-only. Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK. Does not bump the pin — that stays a human/Dependabot change.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
latestNo
currentNo
packageYes
outdatedNo
suggestedActionsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark it read-only and idempotent, and the description reinforces this with 'Read-only' and the explicit side-effect boundary 'Does not bump the pin.' It also discloses the response shape including the conditional suggestedActions, which adds useful behavioral context beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence carries information: purpose, endpoint, response, conditionality of suggestions, read-only guarantee, and usage triggers. It is front-loaded with the core action and remains compact without redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity read-only check with two optional parameters and an output schema, the description is complete. It covers what the tool compares, when to use it, what it returns, and the boundary that it never mutates the dependency pin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with clear descriptions for 'current' and 'package', so the description does not need to add parameter details. It does not materially extend the parameter semantics, which matches the baseline 3 for fully covered schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Compare a published @mushi-mushi/* package version against the catalog (GET /v1/sdk/latest-version)'. It is immediately distinguishable from sibling tools by focusing on SDK version drift, and explicitly notes it does not bump the pin, separating it from mutating fix tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions: 'Use when Dependabot or mushi upgrade --check reports a drift, or before dispatching a fix that assumes a current SDK.' It also states a clear boundary: 'Does not bump the pin — that stays a human/Dependabot change,' telling the agent when the tool is not the right action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diagnose_setupUnified setup diagnoseA
Read-onlyIdempotent
Inspect

Diagnose Mushi setup health and return the single best next action. mode=full (default) runs both SDK-ingest and fix-dispatch preflight checks; mode=ingest runs ingest checks only (project exists, active API key, SDK heartbeat, at least one report); mode=dispatch runs dispatch readiness only (GitHub connected, codebase indexed, LLM key present, autofix enabled). Returns { ready, steps: [{ label, complete, required, hint }], nextAction }. Read-only. The one setup-diagnosis entry point — use this instead of separate connection/ingest checks.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
modeYes
readyYes
ingestNo
summaryYes
dispatchNo
connectionNo
nextActionNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true. The description adds 'Read-only' (consistent with annotations) and discloses the exact return shape ({ ready, steps: [{...}], nextAction }), providing context beyond the annotations. No contradiction found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact but packs in the purpose, mode breakdown, return format, and a routing note. It is front-loaded with the core purpose and uses semicolons to list mode specifics efficiently. No filler sentences, though it could be slightly tighter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 2 parameters, a rich output schema, and annotations covering safety, the description covers all necessary calling context: mode options, default behavior, return structure, and a clear routing rule. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining mode defaults ('full (default) runs both...'), the projectId default ('defaults to configured project'), and the alias ('project_id' is accepted too'), which are not fully spelled out in the schema. This extra nuance elevates it slightly above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Diagnose'), a resource ('Mushi setup health'), and a concrete outcome ('return the single best next action'). It also explicitly positions itself as 'The one setup-diagnosis entry point — use this instead of separate connection/ingest checks,' which differentiates it from siblings like get_inventory or get_two_way_comms_health.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit mode-based usage: full, ingest, and dispatch, each with its own set of checks. It also names an alternative ('use this instead of separate connection/ingest checks') and clarifies when this tool should be selected, leaving no ambiguity about when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_inventoryInventory diffA
Read-onlyIdempotent
Inspect

Diff two ingested inventory commits (fromSha to toSha): added/removed nodes and edges. Returns { added, removed, changed }. Requires inventory_v2. Read-only. Use before merging a PR that touches inventory.yaml to see what changed; use get_inventory for the current snapshot.

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description's 'Read-only' is redundant but consistent. It adds genuine value by stating the prerequisite ('Requires inventory_v2') and the exact return shape ('{ added, removed, changed }'), which is critical since there is no output schema. These details go beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, no filler. The core purpose and return format are front-loaded, followed by usage context and sibling routing. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a diff tool with no output schema, the description adequately covers the return shape, prerequisite, and usage context. It could elaborate on edge cases (e.g., what 'changed' encompasses or error conditions), but given the tool's simplicity and the annotations covering safety, this is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for all parameters, so the description need not re-explain them. It mentions fromSha and toSha in the narrative but adds no semantic detail beyond the schema's descriptions. The baseline of 3 applies because the schema carries the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('diff') and resource ('inventory commits') with a clear scope (fromSha to toSha, added/removed nodes/edges). Explicitly differentiates from sibling get_inventory by calling out the current snapshot alternative. Unambiguous and immediately actionable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('before merging a PR that touches inventory.yaml') and names the alternative tool (get_inventory) with its distinct purpose. No ambiguity about when this tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

dispatch_fixDispatch Mushi fix agentAInspect

Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
agentNoWhich agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent.
reportIdYesReport UUID to fix (`report_id` is accepted too.)
projectIdNoProject UUID — defaults to the configured project. (`project_id` is accepted too.)
targetRepoIdNoOptional 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.
idempotencyKeyNoOptional RFC 4122 UUID. Resend the same key to safely retry without dispatching a duplicate fix job (Idempotency-Key IETF draft).
inventoryActionNodeIdNoOptional inventory Action node UUID for spec-traceability (§2.10). When provided, the fix-worker embeds the expected_outcome contract in the LLM prompt and runs validateAgainstSpec before opening the PR.

Output Schema

ParametersJSON Schema
NameRequiredDescription
fixIdYes
statusYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a Mushi fix agent 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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
findingIdYesGate finding id (the id field of a finding in list_gate_findings, get_radar, get_code_health…)

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already 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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

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

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already 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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 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.

Purpose5/5

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.

Usage Guidelines4/5

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

Return the other components/pages a bug group touches, via knowledge-graph traversal from the report node. Returns { nodes: [{ id, label, type }], edges }. Read-only. Use before dispatch_fix to scope a change safely; use get_knowledge_graph to traverse from an arbitrary seed, or analyze_codebase_impact for file-level import impact.

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesGraph node UUID

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the bar for additional disclosure is lower. The description adds value by explaining the traversal origin ('from the report node') and the exact return shape ('{ nodes: [{ id, label, type }], edges }'), which is especially useful since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded. The first sentence states purpose and return format, the second provides usage timing and alternatives. There is no filler or redundant restating of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with strong annotations, the description covers purpose, return shape, intended usage, and alternates. It is complete enough for an agent to decide when to invoke it and what to expect in the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers nodeId as 'Graph node UUID', so baseline is 3. The description adds meaning by indicating the traversal starts from a report node, which clarifies what kind of UUID should be supplied. This is a useful supplement to the schema, though it does not give detailed instructions on locating the nodeId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Return') and resource ('other components/pages a bug group touches'), and clarifies the mechanism ('knowledge-graph traversal from the report node'). It also distinguishes itself from sibling tools by naming get_knowledge_graph and analyze_codebase_impact as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use the tool: 'Use before dispatch_fix to scope a change safely.' It also names alternatives with their distinguishing conditions: get_knowledge_graph for arbitrary seeds and analyze_codebase_impact for file-level import impact. This gives an agent clear decision criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_design_devianceDesign devianceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoFindings to return, 1–200 (default 25).
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare 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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('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 actionsA
Read-onlyIdempotent
Inspect

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.

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

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOnly tokens of this DTCG $type (color, dimension, fontFamily, …).
groupNoOnly tokens in this group (first path segment, e.g. color, space, radius).
directionNoA named token set (directions/<name>/) instead of the active one.
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Return) and resource (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.

Usage Guidelines5/5

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

Bundle everything an agent needs to fix one bug in a single call: a paste-ready fixPrompt (plain-English diagnosis + reproduction + suggested fix + relevant code + blast radius), plus report detail, repro steps, component, root cause, ontology tags, and the inventory action (with its expected_outcome contract) the report is filed against, 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.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Return the ordered lifecycle of one fix attempt: dispatched, started, branch, commit, PR opened, CI, completed/failed, with timestamps and the PR URL. Returns { events: [{ ts, stage, detail }] }. Read-only. Use to debug "why did this fix fail?" after dispatch_fix; use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread.

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description redundantly says 'Read-only.' It adds useful behavioral context beyond the annotations by describing the ordered stage lifecycle and the returned event structure. It does not contradict the annotations, and the safety profile is adequately covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the main purpose, and efficiently provides output shape plus usage guidance. The only minor waste is the standalone 'Read-only.' sentence, which merely repeats the readOnlyHint annotation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only single-fix-attempt tool with only two parameters, the description covers what an agent needs: the exact operation, the output shape, when to call it, and which sibling tools to use instead. No output schema exists, but the description provides the return shape directly, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents fixId and projectId, including accepted aliases. The description adds no new parameter-level semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Return'), a specific resource ('one fix attempt'), and the exact scope ('ordered lifecycle... dispatched, started, branch, commit, PR opened, CI, completed/failed'). It also distinguishes itself from get_report_timeline by explicitly limiting scope to a single fix attempt rather than the whole report thread.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is explicit when-to-use guidance ('Use to debug "why did this fix fail?" after dispatch_fix') and named alternatives with their purposes ('use refresh_ci to re-poll GitHub CI, or get_report_timeline for the whole report thread'). This fully routes an agent to the correct tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_graph_neighborhoodGraph neighborhoodA
Read-onlyIdempotent
Inspect

Return the BFS neighborhood around one graph node by id or label: { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4). Read-only. Tuned for "what touches this action?"; use get_knowledge_graph to traverse from a component seed, or get_graph_node for a single node's row.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotence, and the description goes further by disclosing BFS traversal, a depth budget with default and max, and the returned node/edge structure. It doesn't over-explain beyond what an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, with the core output and depth behavior front-loaded before routing guidance. Every phrase adds either operational or selection value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition covers what it returns, how traversal depth works, when to use it, and which siblings handle adjacent cases. With an output schema and rich annotations present, nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces that seed can be by id or label and mentions depth default/max, but those details are already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Return the BFS neighborhood around one graph node by id or label') and gives the exact return shape. It also explicitly positions itself against siblings like get_knowledge_graph and get_graph_node, so it's easy to tell apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit use-case signal ('Tuned for "what touches this action?"') and names two alternatives with their distinct seeding conditions. This leaves no ambiguity about when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_graph_nodeGraph node detailA
Read-onlyIdempotent
Inspect

Fetch one knowledge-graph node row by id. Returns { node: { id, node_type, label, metadata } } including the v2 derived status on Action nodes (ok | stale | broken). Read-only. Use to inspect a single node's status; use get_graph_neighborhood to see what connects to it.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, and idempotent behavior, so the description only needs to add extra context. It adds the return shape and, notably, the v2 derived status on Action nodes (ok | stale | broken), which is useful behavioral information beyond the annotations. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler. The action is front-loaded, the return shape is compact, and the sibling distinction is placed at the end. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the single required parameter, a rich output schema, and annotations that already convey the safety profile, the description provides all the operational context an agent needs. It also routes to the relevant sibling tool, making the definition complete for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already fully documents nodeId as a UUID graph_nodes.id. The description merely repeats 'by id' and adds no additional parameter semantics beyond what the schema provides, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Fetch'), a specific resource ('knowledge-graph node row'), and the lookup key ('by id'). It distinguishes itself from get_graph_neighborhood by clarifying this tool returns a single node's details rather than connections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to use this tool to inspect a single node's status and directs the agent to get_graph_neighborhood for connectivity queries. This gives clear when-to-use and alternative guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_inventoryInventory snapshotA
Read-onlyIdempotent
Inspect

Return the current inventory.yaml snapshot for a project: latest ingest, validation errors, and a per-action status summary. Returns { snapshot, validationErrors, actions: [{ id, status }] }. Requires the inventory_v2 plan. Read-only. Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description reinforces this with 'Read-only.' The description adds a non-obvious prerequisite ('Requires the inventory_v2 plan') and documents the return shape, which is especially valuable because there is no output schema. It does not detail all failure modes, but the annotation coverage lowers the burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences front-load the core behavior, then add return shape, prerequisite, and sibling routing without waste. The structure makes the tool immediately scannable and actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity tool with one optional parameteramen and no output schema, the description provides the return structure, distinguishes from relevant siblings, and states the prerequisite. An agent has enough information to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage: projectId is fully described, including its default behavior and accepted alias. The description adds no new parameter-specific meaning, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Return the current inventory.yaml snapshot' and gives the exact response shape. It also differentiates itself from sibling tools by naming diff_inventory and list_gate_findings and contrasting their purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit selection guidance: 'Use for the full current state; use diff_inventory to compare two commits, or list_gate_findings for the latest gate results.' It also states the prerequisite 'Requires the inventory_v2 plan,' which tells the agent when the tool is applicable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_knowledge_graphKnowledge graph traversalA
Read-onlyIdempotent
Inspect

Traverse the knowledge graph from a seed component or page. Returns { nodes: [{ id, label, node_type }], edges: [{ source_node_id, target_node_id, edge_type }] } within a depth budget (default 2, max 4 hops). Read-only. Use to see how a component connects to the rest of the app; use get_blast_radius for a bug's impact area, or get_graph_neighborhood for a tighter BFS around one node.

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

Output Schema

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces the read-only nature while adding behavioral context beyond annotations: the traversal respects a depth budget (default 2, max4 hops) and returns a specific nodes/edges structure. It does not contradict any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short,front-loaded with purpose and output, and contains no fluff. The only slight redundancy is stating 'Read-only' when the annotations already declare readOnlyHint, and the return shape is already expressed by the output schema, but overall the structure is effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only traversal tool with only one required parameter and a rich output schema, the description covers the key behavioral constraints (depth default/max), the intended usage, and the sibling differentiation. Nothing essential for an agent to correctly select and invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with seed and depth already documented. The description loosely reinforces these concepts by calling the seed a 'component or page' and mentioning the depth budget, but it does not add meaningful semantic details beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: 'Traverse the knowledge graph from a seed component or page.' It also names the return shape (nodes and edges) and explicitly differentiates from sibling tools by pointing to get_blast_radius and get_graph_neighborhood, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool: 'Use to see how a component connects to the rest of the app.' It also names alternatives and their specific use cases: get_blast_radius for a bug's impact area and get_graph_neighborhood for a tighter BFS around one node.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mushi_docRead a Mushi docs pageA
Read-onlyIdempotent
Inspect

Fetch one official Mushi docs page as Markdown, by a url from search_mushi_docs or a route such as "/quickstart/mcp". Returns { title, url, markdown, truncated }; markdown is capped at 8,000 characters and says where to read the rest. Only indexed docs pages resolve. Read-only; works without an API key. Use after search_mushi_docs when an excerpt is not enough.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
urlYes
titleYes
markdownYes
truncatedYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds substantial behavioral context: the return shape ({ title, url, markdown, truncated }), the 8,000-character cap with a pointer to read more, the requirement that pages be indexed, and the note that no API key is needed. These details go beyond the annotations and are not contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with the core purpose and return format. Every sentence adds value: the input source, the return structure, the truncation behavior, the indexing caveat, and the usage timing. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with a detailed output schema and annotations covering safety, the description covers all necessary aspects: input source, output format, size limits, prerequites (indexed pages), authentication (no API key), and when to use. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (the page parameter is described as 'A url from search_mushi_docs, or a docs route such as \"/quickstart/mcp\"'). The description adds a concrete example route and reinforces the two accepted input forms, which slightly enriches the schema but is largely redundant. Since coverage is high, baseline is 3, but the example and explicit mention of the search source push it to 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb+resource: 'Fetch one official Mushi docs page as Markdown'. It also distinguishes from siblings by mentioning the source (url from search_mushi_docs) and the trigger condition ('Use after search_mushi_docs when an excerpt is not enough'). This makes the tool's purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Use after search_mushi_docs when an excerpt is not enough' directly names the sibling and the condition for selection. Also states the constraint 'Only indexed docs pages resolve', giving the agent a clear precondition. This is more than enough to route the agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portfolioPortfolio — every app at onceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
organizationIdNoOrganization UUID — defaults to the key owner's only organization when omitted

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoproject (default) or organization
projectIdNoProject UUID — defaults to the server-configured project (scope project) (`project_id` is accepted too.)
organizationIdNoOrganization UUID — defaults to the key owner's only organization (scope organization)

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

List recent bug reports for a project, newest first. Returns { reports: [{ id, status, category, severity, summary, component, created_at, processing_error }], total }; includeRaw=true returns every list column instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Optional filters: status (new|classified|grouped|fixing|fixed|verified|reopened|dismissed|…), category (bug|slow|visual|confusing|other), severity (critical|high|medium|low), limit (default 20, max 100). Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax reports to return (default 20, max 100)
statusNoFilter by status. "new" also matches queued rows; "classified" and "fixed" include legacy aliases.
categoryNoFilter by category.
severityNoFilter by severity.
projectIdNoProject UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.)
includeRawNoReturn every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
reportsYes

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Although annotations already declare readOnlyHint=true, idempotentHint=true, the description adds important behavioral context: it promises newest-first ordering, discloses that includeRaw=true changes the returned columns, and states that reporter identifiers are never returned. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose and return shape, followed by filters and routing guidance. It earns its length because it packs meaningful details (never returns reporter IDs, includeRaw behavior, limit defaults), but a sentence or two could be trimmed since some filter details duplicate the schema enums.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering read-only/idempotent safety, the description still supplies what an agent needs: ordering, optional filters, limit bounds, includeRaw semantics, the never-returned reporter data, and routing to siblings. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters thoroughly, including enums and aliases. The description itself repeats some filter details (status/category/severity enums, limit defaults) and adds the note that reporter identifiers are never returned—useful but not a major compensation need. Baseline 3 is exceeded slightly because the description reinforces the key filter semantics and the default/max limit, but it also largely duplicates the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List recent bug reports for a project, newest first'), specifies the return shape, and distinguishes itself from siblings by naming alternatives (get_report_detail, search_reports). The scope (project, newest first) is clear, and the presence of filters reinforces its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use to survey open reports; for one report use get_report_detail, to find a bug by text use search_reports.' This provides clear when-to-use guidance and names alternatives, which is exactly what the dimension asks for.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recipe_changeRecipe change statusA
Read-onlyIdempotent
Inspect

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.

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

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare 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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

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

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds 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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
elementYesgates (mushi.recipe.json budgets), env (.env.example) or routes (the inventory file)
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
organizationIdNoOrganization UUID — defaults to the key owner's only organization when omitted

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
overlayNoAlso place the open bug reports and code findings on each part of the diagram
projectIdNoProject UUID (defaults to configured project) (`project_id` is accepted too.)

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refNoBranch, tag or commit SHA (default: the repo default branch)
pathNoScope to one folder, e.g. "apps/web/src"
excludeNoGlob patterns to leave out, e.g. ["tests/"]
includeNoGlob patterns a file must match, e.g. ["src/**/*.ts", "*.md"]
reportIdNoScope to one bug: the report's files come first, then the rest of the repo by priority (`report_id` is accepted too.)
projectIdNoProject UUID (defaults to configured project) (`project_id` is accepted too.)
budgetTokensNoEstimated token budget for the whole digest (default 50,000)

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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

Fetch the full record for one bug report by id: description, console logs, network requests, screenshot URL, classification (stage 1/2), fix history, the paste-ready fix packet and the inventory action it is filed against. Returns { report } with the documented fields; includeRaw=true returns every column the detail route has instead. Reporter identifiers (end-user id, reporter token hash, session id, display name) are never returned. Read-only. Use when you have a reportId and need everything about it; for evidence only use get_report_evidence, for the activity thread use get_report_timeline, for a one-call fix bundle use get_fix_context.

ParametersJSON Schema
NameRequiredDescriptionDefault
reportIdYesThe report UUID (`report_id` is accepted too.)
projectIdNoProject UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)
includeRawNoReturn every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint, and the description adds valuable behavioral context: reporter identifiers are never returned, includeRaw=true returns every column instead, and the response is wrapped in { report }. These details go well beyond what the annotations convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every sentence earns its place: purpose, content list, response shape, privacy note, read-only statement, usage scenario, and sibling alternatives. It is dense but not bloated, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Combined with the full input schema, output schema, and annotations, this description covers what is returned, what is redacted, the alternative includeRaw mode, and when to choose sibling tools. Nothing critical is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and each parameter has a description including accepted aliases. The tool description mentions includeRaw's effect but does not add significant new parameter semantics beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states a specific verb 'Fetch' with a specific resource 'the full record for one bug report by id' and enumerates its contents. It distinguishes itself from siblings by naming which tool to use for evidence, timeline, and fix bundle alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use when you have a reportId and need everything about it' and gives conditional routing to get_report_evidence, get_report_timeline, and get_fix_context. This is textbook when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_report_evidenceBug report evidenceA
Read-onlyIdempotent
Inspect

Return the full evidence package for a single bug report covering all three observability pillars: (1) LOGS — console_logs (error/warn/info/debug entries with timestamps), breadcrumbs (SDK ring buffer: navigation, clicks, network, lifecycle events with category/level), repro_timeline (merged SDK event stream: route/click/request/log/screen), and the reporter's own comments thread; (2) TRACES — network_requests (SDK-captured fetch/XHR with method/status/duration/traceId), backend_spans (server-side spans joined by W3C trace_id: name/duration_ms/parentSpanId/status), and Sentry trace correlation IDs (sentry_trace_id, sentry_event_id) for deeplinks; (3) METRICS — performance_metrics (Web Vitals snapshot: LCP/CLS/INP/TTFB/FCP + INP attribution + page timing + connection info), anomalies (statistical provenance when auto-filed by CI metric regression: baseline_mean/std, score in σ, threshold); plus screenshot_url, browser environment (user agent, URL, viewport, SDK version), and tags. Reporter identifiers (session id, end-user id) are never returned. This is the same data an engineer would collect for a root-cause investigation. Faster than calling get_report_detail + report timeline separately.

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

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds valuable behavioral disclosure beyond those hints: reporter identifiers (session id, end-user id) are never returned, and the evidence package is explicitly scoped to a single bug report. This is meaningful context about what the tool will and will not surface.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence earns its place: it needs the detail because there is no output schema and the return payload spans many categories. The content is front-loaded with the core purpose, then organized by pillar with numbered subsections, making it easy for an agent to scan. The final comparison to get_report_detail plus report timeline is a useful, non-redundant closing note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the full burden of explaining the return value, and it does so thoroughly: it lists logs, traces, metrics, screenshot, browser environment, tags, and explicitly states what is excluded. It also gives the relationship to sibling tools and the efficiency benefit. An agent has enough information to call the tool correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the reportId parameter is documented as 'Report UUID. (`report_id` is accepted too.)'. The description does not add much beyond this, though it reinforces that the parameter selects a single bug report. Since the schema already carries the parameter meaning, a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Return the full evidence package for a single bug report.' It enumerates exactly which data is included across logs, traces, and metrics, and explicitly distinguishes itself from get_report_detail and get_report_timeline. This makes it immediately clear what this tool does and how it relates to siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool: it returns the data an engineer would collect for root-cause investigation, and it is faster than calling get_report_detail and report timeline separately. It names alternatives and positions this tool as their combined, faster replacement, but it does not explicitly state when-not-to-use it or compare it with more decision-oriented siblings like get_fix_context or suggest_fix.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_report_timelineUnified report timelineA
Read-onlyIdempotent
Inspect

Return the ordered activity timeline for one report (oldest to newest), merging reporter comments, fix events, QA runs, skill-pipeline steps, and Ask Mushi turns into one lane. Returns { events: [{ ts, kind, actor, summary }] }. Read-only. Use to see what happened end-to-end on a report thread; use get_report_detail for the static record or get_fix_timeline to debug one fix attempt.

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already supply readOnlyHint, openWorldHint, and idempotentHint. The description adds value by stating the ordering (oldest to newest), the merging behavior across multiple event streams, and the exact return shape. It does not mention potential rate limits or additional access constraints, but for a read-only getter this is sufficient context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences: purpose, return shape, and usage guidance. 'Read-only.' is redundant with the readOnlyHint annotation, which is a minor waste. Otherwise every sentence earns its place and the structure is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description includes a concrete return shape, names the sibling tools for contrast, and clarifies ordering and merge scope. With only one parameter and annotations covering safety/idempotency, nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter description already explains that reportId is the report UUID and accepts report_id. The tool description adds no extra parameter-level semantics beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Return') and resource ('ordered activity timeline for one report'), enumerates the merged event kinds, and explicitly distinguishes itself from get_report_detail and get_fix_timeline. An agent can unambiguously identify what this tool does and when to use it over siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: use for an end-to-end view of a report thread, with named alternatives get_report_detail for the static record and get_fix_timeline for debugging a single fix attempt. This is a model of when-to-use/when-not-to-use direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_similar_bugsSimilar bugsA
Read-onlyIdempotent
Inspect

Find existing bugs similar to a component, page, or description via pgvector nearest-neighbour search (same backend as search_reports, tuned for "have we seen this before?"). Returns ranked { reports: [{ id, summary, similarity }] }. Read-only. Use to dedupe before filing or group regressions; use search_reports for general free-text search.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds useful behavioral context beyond those: it explains the retrieval technique (pgvector nearest-neighbour), the tuning intent, and the ranked return shape. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler: purpose is front-loaded, return format is summarized, and usage/alternative guidance closes it out. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read-only tool with an output schema, the description covers what it does, what it returns, when to use it, and how it differs from search_reports. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the schema already documents query as 'Component name, page path, or bug description' and limit with default/max. The description mostly restates this information without adding new parameter semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Find existing bugs similar to...') and names the underlying mechanism (pgvector nearest-neighbour search). It also distinguishes itself from the sibling search_reports by noting it is 'tuned for "have we seen this before?"'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit usage guidance is provided: 'Use to dedupe before filing or group regressions; use search_reports for general free-text search.' This tells the agent exactly when to choose this tool versus the relevant alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_store_reviewsStore reviews as reportsA
Read-onlyIdempotent
Inspect

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.

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

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Return the 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.

Usage Guidelines2/5

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

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.

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

TDQS

A3.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

Summarize SDK ↔ admin two-way reporter health for a host app: last SDK heartbeat, app version/platform last seen, unread reporter messages, recent reporter replies, and pending QA/TDD follow-ups. Use after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds behavioral context by listing what the summary includes and the verification purpose (confirming two-way delivery), which helps the agent set expectations about output content beyond the generic annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. The first sentence front-loads the core purpose and deliverables; the second provides the actionable usage context. Every phrase earns its place, and the key scope ('two-way') is stated immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and no output schema, the description carries the burden of explaining what the result contains—it does so by naming all key fields. It also supplies the integration scenario and verification goal, which is sufficient for an agent to correctly invoke and use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and the input schema confirms this with 100% coverage. Per calibration, a baseline of 4 applies for zero-parameter tools. The description adds no unnecessary parameter guidance, which is appropriate here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Summarize') and resource ('SDK ↔ admin two-way reporter health for a host app'), then enumerates the exact data points covered. This makes it clearly distinguishable from siblings like get_recent_reports or reply_to_reporter, which focus on one side of the communication flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it: 'after wiring @mushi-mushi/web in a Vite/Capacitor app to confirm reports land in the console and admin/MCP replies reach the in-app widget.' This gives a clear temporal and functional context, though it does not name alternatives or explicitly say when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_sentry_issuesImport Sentry issuesA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many issues a query imports (1-10, default 5)
queryNoSentry search query within the configured Sentry project (default is:unresolved). Not with issueIds.
cursorNonextCursor from the previous import, to fetch the next page of a backlog. Search mode only.
issueIdsNoSentry issue ids or short ids (e.g. "4501", "WEB-12"), at most 10
projectIdNoProject UUID. Defaults to configured project. (`project_id` is accepted too.)
sinceDaysNoOnly issues seen in the last N days (1-90). Search mode only.
sentryProjectNoWhich of the project's Sentry projects to search (default: the primary one). Search mode only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYesOne entry per requested or matched issue
failedYesIssues that could not be imported
linkedYesReport ids that already existed for these issues
createdYesReport ids created by this import
indexingYesWhether stack-frame files were queued for codebase indexing
nextCursorNoPass back as cursor to import the next page; null when the backlog is done
sentryProjectNoThe Sentry project a search ran in (null for issueIds)
sentryProjectsNoThis project's Sentry projects, primary first

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

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

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ("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_connectorsConnectorsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
organizationIdNoOrganization UUID — defaults to the key owner's only organization when omitted

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, … }], findings: [{ severity, rule_id, message, file_path, node_id, … }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | 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.

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

Output Schema

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

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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

List promoted learning rules ("lessons") for the current project, highest-frequency first. Returns { lessons: [{ id, rule_text, severity, frequency, anti_pattern, … }] }. Read-only. Use to browse the full catalog of encoded heuristics; use query_lessons to retrieve only lessons relevant to a specific diff or PR within a token budget.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
lessonsYesPromoted lesson rows ordered by frequency

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, and open-world behavior, and the description reinforces 'Read-only'. Beyond that, it adds behavioral context about 'promoted' lessons and highest-frequency-first ordering. The return shape is mentioned but the output schema already covers it, so this is useful but not critical extra disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences deliver the purpose, output shape, read-only trait, and usage alternative with zero filler. The most decision-relevant information (what it lists and how it is ordered) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema, annotations, and fully documented parameters, nothing essential is missing. The description also supplies the key sibling-routing information, making it complete for an agent to select and call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so limit, severity, and projectId are already fully documented. The description adds minimal parameter-level meaning beyond confirming the 'current project' default, which is consistent with projectId. It does not need to compensate for schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (List), a specific resource (promoted learning rules/lessons for the current project), and a concrete behavior (highest-frequency first). It also distinguishes itself from query_lessons by describing the full-catalog browsing purpose, making it easy to tell apart from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use this tool ('browse the full catalog of encoded heuristics') and when not to, naming query_lessons as the alternative for diff/PR-specific retrieval within a token budget. This gives clear routing guidance with no inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_portfolio_findingsPortfolio findings — fix onceA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
organizationIdNoOrganization UUID — defaults to the key owner's only organization when omitted

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 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.

Purpose5/5

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.

Usage Guidelines4/5

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

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

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

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Squash-merge the GitHub PR for a fix attempt, mark the linked report fixed, and notify the reporter. Re-readies the PR first if it is still a draft. Returns { merged, reportStatus }. Write; destructive and irreversible from Mushi's side — once GitHub merges into the target repo's default branch there is no unmerge endpoint, only a manual revert PR outside this tool. Idempotent — re-running an already-merged attempt is a safe no-op. Prerequisite: CI green (check with refresh_ci); confirm the diff and CI status with the user before calling on a PR you have not reviewed. Use to ship a fix opened by dispatch_fix; use transition_status to change state without merging.

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

Output Schema

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

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already say destructiveHint=true and idempotentHint=true, but the description goes further by explaining that the action is irreversible from Mushi's side, that GitHub has no unmerge endpoint, that a revert would require a manual PR, and that re-running on an already-merged attempt is a safe no-op. This substantially enriches the annotation signal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: outcome, return shape, destructiveness, idempotence, prerequisite, and sibling routing. It is front-loaded with the core action and return value before safety context, and no filler or redundant restatement appears.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, annotations covering safety, and a description covering irreversibility, idempotence, prerequisites, and alternatives, an agent has everything needed to decide whether and when to call this tool. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents fixId and mergeMethod, including the accepted alias fix_id and the default merge method. The description adds little parameter-level detail beyond aligning with the squash default, which is acceptable given the high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: squash-merge the GitHub PR for a fix attempt, then mark the report fixed and notify the reporter. It also names sibling tools dispatch_fix and transition_status, so an agent can distinguish shipping a fix from dispatching one or changing status without merging.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: 'Use to ship a fix opened by dispatch_fix.' It also states the alternative ('use transition_status to change state without merging') and a hard prerequisite: CI must be green, checked via refresh_ci, and the agent must confirm the diff and CI status with the user before merging an unreviewed PR.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
changesYes
confirmNotrue opens one draft PR per repo; omitted or false is a dry run
elementYesWhich part of the recipe the edit belongs to
organizationIdNoOrganization UUID — defaults to the key owner's only organization

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
editsYes
titleNo
confirmNotrue opens the draft PR; omitted or false is a dry run
elementYesWhich part of the recipe the edit belongs to
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter 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.

Purpose5/5

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.

Usage Guidelines4/5

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

Retrieve the learning rules ("lessons") most relevant to a given code diff or PR context, packed within a token budget. Uses bi-encoder retrieval + severity-weighted scoring; pass the diff/description as diffText and a maxTokens budget (default 3000). Returns ranked { lessons: [{ title, rule, severity }] }. Read-only. Use before writing a fix or opening a PR; use list_lessons to browse all lessons unfiltered.

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is well covered. The description adds non-obvious behavior: bi-encoder retrieval, severity-weighted scoring, and token-budget packing, which are valuable beyond annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences front-load purpose, then mechanics, then usage guidance. Every sentence earns its place with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a read-only retrieval tool: it states the return shape ({ lessons: [...] }), usage context, and distinguishes from sibling list_lessons. With full schema coverage and safety annotations, no critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description mentions diffText and maxTokens defaults but those details already exist in the schema; no new parameter meaning is added beyond what the schema descriptors provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('retrieve'), resource ('learning rules/lessons'), and context ('code diff or PR'). The description explicitly contrasts with list_lessons, naming what it is not and making sibling differentiation immediate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance: 'Use before writing a fix or opening a PR'. It also names the alternative list_lessons for browsing all lessons unfiltered, providing a clear decision boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refresh_ciRefresh fix CI statusA
Idempotent
Inspect

Re-poll GitHub for the latest check-run status of a fix attempt's PR and persist it on the fix_attempt row (does not merge or mutate GitHub). Returns { check_run_status, check_run_conclusion, check_run_updated_at }. Write; idempotent. Use right before merge_fix to confirm CI is green; use get_fix_timeline for the full attempt lifecycle.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds behavioral value by explaining that the write is a local persistence on the fix_attempt row and explicitly denies any external GitHub mutation, which is important context beyond the annotation booleans.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no wasted words. It front-loads the main behavior, then states side effects, return value, and usage guidance, making it easy to scan and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, idempotent write operation with rich annotations, an output schema, and explicit sibling routing, the description covers everything needed to invoke it correctly. It communicates the write target, the external side-effect boundary, the return shape, and the recommended usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and schema description coverage is 100%, so the schema fully documents fixId, including the accepted alias fix_id. The description reinforces that the parameter refers to the fix attempt whose PR check-runs should be re-polled, but adds no new semantic detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action and resource: re-poll GitHub for a fix attempt's PR check-run status and persist it on the fix_attempt row. It also explicitly differentiates itself from related tools by clarifying it does not merge or mutate GitHub, making it easy to distinguish from merge_fix and get_fix_timeline.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage context: use it right before merge_fix to confirm CI is green, and use get_fix_timeline when the full attempt lifecycle is needed. It also lists an exclusion, stating it does not merge or mutate GitHub, which prevents misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

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

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNorelease (default) sends it; discard drops it
messageIdYesHeld message id from list_reporter_outbox
bodyOverrideNoReplacement text to send instead

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents 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.

Purpose5/5

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.

Usage Guidelines4/5

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

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

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

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds that it removes 'including its Vault secret', providing context on what gets destroyed beyond the annotation. It also states 'Permanently remove', reinforcing the irreversibility. This adds value beyond annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One concise sentence with high information density. It front-loads the destructive and idempotent nature, and the scope. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the schema fully describes parameters, annotations cover safety, and no output schema exists, the description adequately covers what the tool does and its consequences. It doesn't mention prerequisites (e.g., authentication) but those are implied by 'authenticated project'. It is complete for a destructive mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description doesn't add meaning beyond the schema, except that 'keyId' is a pooled BYOK key UUID from list_byok_keys (already in schema). Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('remove'), a precise resource ('pooled BYOK credential by key id'), and the scope ('from the authenticated project'). It clearly distinguishes from siblings like add_byok_key and test_byok_key by naming the operation and the destructive nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly labels the operation as destructive and idempotent, and mentions it removes a BYOK credential. However, it does not explicitly state when not to use it (e.g., when a key is still in use) or name alternatives. The clear destructive label provides sufficient guidance for an agent to avoid misuse, but not full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reopen_reportReopen report (operator)A
Idempotent
Inspect

Move a previously fixed/verified/dismissed report back to the reopened state for regression review, recording an operator note. Returns { report } with status=reopened. Write; idempotent — reopening an already-reopened report is a no-op. Use when a reporter says "still broken" after a fix shipped; use transition_status for any other state change.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
reportYesUpdated report row with status=reopened

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavior beyond annotations: 'Write; idempotent — reopening an already-reopened report is a no-op' and discloses return shape ({ report } with status=reopened). These details extend the idempotentHint and readOnlyHint annotations rather than contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero redundancy: the first states action and return, the second covers idempotency and usage guidance. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering safety/idempotency, the description supplies the trigger, the alternative, the affected states, the return, and the idempotency behavior. Nothing an agent needs for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description confirms reportId as UUID and note as operator note, but adds no format or constraint details beyond the schema. The 'previously fixed/verified/dismissed' context implicitly constrains the report state, but that is resource-level context, not parameter-level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action and resource: 'Move a previously fixed/verified/dismissed report back to the reopened state for regression review.' Explicitly names the sibling tool 'transition_status' for any other state change, making differentiation immediate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit trigger condition ('when a reporter says "still broken" after a fix shipped') and an explicit alternative ('use transition_status for any other state change'). This is exactly the when/when-not guidance needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reply_to_reporterReply to a reporterAInspect

Send a visible message to the end-user who filed a bug report. The reply appears in the in-app Mushi widget as an admin comment and creates an unread notification badge so the reporter sees it immediately. Use this to answer questions, request reproduction steps, or confirm a fix — without leaving the Cursor IDE.

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

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-read-only and non-destructive behavior. The description adds behavioral detail: the reply is visible, appears as an admin comment in the in-app widget, and creates an unread notification badge. This goes beyond the annotations and helps the agent understand the side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences. The first states the action and its visible effect; the second gives concrete usage scenarios. No redundant words, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with fully documented parameters and no output schema, the description covers the purpose, behavior, and usage. It could mention prerequisites (e.g., whether the report must be in a certain state), but that is minor and not critical for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for all three parameters, each with clear explanations. The description does not add extra parameter-level meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('Send a visible message to the end-user who filed a bug report') and resource, and distinguishes itself from sibling tools that handle report state (transition_status, reopen_report) or retrieval (get_report_detail). The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit use cases ('answer questions, request reproduction steps, or confirm a fix') and notes the benefit ('without leaving the Cursor IDE'). It doesn't explicitly state when not to use it or name alternatives, but the context is clear enough for an agent to select it over other report-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesFor example set_rollout or promote_track
reasonNoWhy, shown to the approver
payloadYesThe exact action input; the approval binds its hash
projectIdNo(`project_id` is accepted too.)
connectorIdYesConnector instance id (list_connectors)
organizationIdNoOrganization UUID — defaults to the key owner's only organization

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
questionYesThe question, shown to the reporter verbatim
reportIdYesReport id to ask about (`report_id` is accepted too.)
authorNameNoDisplay name for the sender (default: "Developer")

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single 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.

Purpose5/5

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.

Usage Guidelines4/5

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

Answer a natural-language question about your project data by generating and running a read-only SQL query (no privileged schemas, rate-limited to 60/hour). Returns { sql, rows }. Use for ad-hoc analytics ("which components had the most critical bugs this week?"); use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.

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

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds non-obvious behavioral context beyond those: no privileged schemas, a 60/hour rate limit, and a return shape of { sql, rows }. This helps the agent anticipate operational and safety constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each earning its place. The first defines the operation, constraints, and return format; the second gives usage context and routes to alternatives. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the low complexity, strong annotations, and absence of an output schema, the description is complete: it communicates purpose, constraints, return shape, rate limit, and alternative tools. An agent has enough information to decide whether and how to invoke this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single required parameter is fully described with an example. The description reinforces the natural-language style and adds an example use case, but it does not add meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: answer a natural-language question by generating and running a read-only SQL query over project data. It clearly distinguishes itself from siblings by framing itself for ad-hoc analytics rather than report lookups or documentation searches.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use for ad-hoc analytics' and names the alternatives: 'use get_recent_reports/search_reports for plain report lookups, or search_mushi_docs for documentation questions.' This gives an agent clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

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

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite having no output schema, the description 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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

Search the official Mushi documentation (guides, MCP setup, inventory, QA, skills) by keyword — titles, section headings and summaries are indexed. Returns ranked { results: [{ title, url, excerpt, score }] }. Read-only; works without an API key. Use before guessing API shapes, tool names, or RPC names, then get_mushi_doc to read a page; use run_nl_query for questions about your own project data, not the docs.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
resultsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint=true and idempotentHint=true, and the description adds meaningful context beyond them: 'works without an API key', the indexing scope ('titles, section headings and summaries'), and the ranked result format. No contradiction with annotations; the added details improve the agent's expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and every sentence earns its place—scope, returned shape, auth/read-only note, and sibling routing. There is no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two parameters, an output schema, and strong annotations, the description covers everything an agent needs: what is searched, the return shape, auth requirements, and how to chain with get_mushi_doc or avoid using it for project data. No critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (query, limit) are already described in the input schema. The description adds only minor semantic value ('by keyword'), so a baseline 3 is appropriate since the schema already carries the parameter definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Search the official Mushi documentation' by keyword, and names the indexed content areas (guides, MCP setup, inventory, QA, skills). This clearly distinguishes it from siblings like get_mushi_doc (fetch a page) and search_reports (search bug reports).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to use it ('before guessing API shapes, tool names, or RPC names'), what to do next ('then get_mushi_doc to read a page'), and when not to ('use run_nl_query for questions about your own project data'). This is exemplary sibling routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_reportsSearch reportsA
Read-onlyIdempotent
Inspect

Search reports by meaning and keyword (pgvector similarity server-side; falls back to summary/description substring if embeddings are unavailable). Returns ranked { results: [{ id, summary, similarity }] }. Read-only. Use to find reports by free text ("checkout flakiness"); use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultsYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent hints. The description adds real behavioral context beyond those: server-side pgvector similarity, a fallback to summary/description substring matching when embeddings are unavailable, and the ranked result shape. This is more than minimal, though it does not discuss rate limits or auth—minor given the tool's read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tightly constructed sentences front-load the mechanism and result format, then move to usage guidance. Every sentence earns its place; there is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema and 100% parameter schema coverage, the description still adds the essential behavioral twist (fallback) and explicit sibling routing. Nothing an agent needs to correctly invoke this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already documents query, limit, and threshold including defaults. The description reinforces that the query is free text or component path but adds no new parameter-specific detail beyond the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Search reports by meaning and keyword') and explicitly names sibling tools (get_similar_bugs, get_recent_reports) with contrasting use cases. An agent can immediately distinguish this from related search/list tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance ('Use to find reports by free text') and when-to-use-alternatives guidance ('use get_similar_bugs to dedupe a known component/bug, or get_recent_reports to list without a query'). This fully answers the routing question.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_design_settingsSet design score actionsA
Idempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
failCiNotrue: `mushi recipe check --push` fails CI above the threshold
autofixNofalse turns the design auto-fix off; an API key cannot turn it on
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)
thresholdNo0–100; the actions fire when the score is above it

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledYesfalse turns intake off; true keeps it on (only the console can turn it on)
maxRatingNoReviews at or under this many stars are filed (1–5)
projectIdNoProject UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
prUrlNoGitHub pull request URL, if a PR was opened (`pr_url` is accepted too.)
branchYesGit branch name where the fix was implemented
summaryYesOne-line human summary of what the fix changed
reportIdYesReport UUID to attach this external fix attempt to (`report_id` is accepted too.)
filesChangedYesRepo-relative paths modified by the fix
linesChangedYesTotal lines added + removed across filesChanged
idempotencyKeyNoOptional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one.

Output Schema

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

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals internal behavior beyond annotations: it creates a fix_attempt row, patches it to completed, links it to the report, and returns a fixAttemptId. It explicitly flags the write nature and non-idempotence, and explains the idempotency key mechanism and its default derivation. This goes well beyond the annotation hints and gives the agent a realistic model of side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose, and packs essential usage guidance and behavioral context into a compact space. No filler or redundant phrasing; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters and a required output, the description covers the invocation trigger, the side effects, the return value, idempotency caveats, and sibling alternatives. Combined with a fully described schema and an output schema, an agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with detailed descriptions for every parameter, including the nuanced idempotencyKey behavior. The description merely lists field names without adding new semantic meaning; it reinforces the overall purpose but does not clarify any parameter beyond what the schema already provides. Baseline 3 applies since the schema carries the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb ('Record') and resource ('fix outcome from an external agent'), lists the exact fields involved (branch, PR URL, files changed, lines added/removed), and immediately distinguishes it from sibling tools by naming dispatch_fix and merge_fix as alternatives. This leaves no ambiguity about what the tool does and how it differs from related operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit condition for use: 'Use after you opened a PR outside Mushi.' It then states clear alternatives: 'use dispatch_fix to have Mushi open the PR instead, or merge_fix once CI is green.' It also adds a critical usage warning about idempotency ('call once per PR'), which is exactly the kind of guidance an agent needs to avoid mistakes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

suggest_fixSuggested fix (from triage)A
Read-onlyIdempotent
Inspect

Return the Stage-2 suggested-fix slice for one report: root cause, suggested fix, repro steps, summary, and component — faster than get_report_detail when you only need the human-readable hint. Returns { reportId, rootCause, suggestedFix, reproductionSteps, summary, component }. Read-only; reads the existing classification (run triage_issue first if unclassified). Use for a quick "what should we try?"; use get_fix_context for the full paste-ready bundle.

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

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey readOnlyHint, idempotentHint, and openWorldHint, and the description reinforces safety with 'Read-only' while adding useful behavioral context: it reads existing classification, is faster than get_report_detail, and requires prior triage for unclassified reports. It does not discuss error conditions, but the annotations carry much of the safety burden and the added precondition context is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences cover purpose, output shape, read-only safety, precondition, speed comparison, and alternative routing with zero filler. The most decision-relevant information is front-loaded: what the tool returns and when to choose it.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with both an output schema and strong annotations, the description covers everything an agent needs to invoke it correctly: return shape, precondition, sibling differentiation, and use case. There is no apparent missing context that would lead to incorrect invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already fully documents reportId as a report UUID, and the tool description itself does not add much beyond the schema's own description. Schema coverage is 100%, so the baseline of 3 applies; the only slight addition is the field list returned, not a semantic augmentation of the parameter itself.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Return the Stage-2 suggested-fix slice for one report') and enumerates the exact fields returned, including rootCause, suggestedFix, reproductionSteps, summary, and component. It also distinguishes itself from sibling tools by naming get_report_detail and get_fix_context, so an agent can clearly tell when this tool is the right one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance ('when you only need the human-readable hint', 'for a quick "what should we try?"') and when-not-to-use guidance by routing to get_fix_context for a full paste-ready bundle. It also states a clear precondition: run triage_issue first if the report is unclassified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_byok_keyTest an API keyA
Idempotent
Inspect

Re-test one pooled BYOK credential by key id. A successful provider probe activates the key; auth, quota, and network failures keep it out of the runtime pool. Returns the sanitized validation result and updated key metadata. Write; idempotent.

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

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses meaningful behavior: a successful provider probe activates the key, while auth, quota, and network failures keep it out of the runtime pool. It also states the return value is a sanitized validation result plus updated metadata, which is useful context. There is no contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core action in the first sentence. The trailing 'Write; idempotent' duplicates annotation flags and adds a small amount of redundancy, but it does not significantly detract from the overall clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two simple parameters and no output schema, the description fully covers what an agent needs to call the tool correctly: the action, the key ID targeting, success/failure behavior, and the return value. No essential contextual information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents both keyId and projectId with 100% coverage, so the description is not required to add much. It only refers to 'by key id', which mirrors the schema's keyId description and adds no new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with 'Re-test one pooled BYOK credential by key id', giving a specific verb, resource, and scope. It clearly distinguishes this from sibling tools like add_byok_key, remove_byok_key, and list_byok_keys by focusing on the testing/activation action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Re-test one pooled BYOK credential' implies the tool is for existing pooled keys, and the outcome descriptions offer behavioral context. However, it never explicitly states when to prefer this over siblings such as add_byok_key or activation_status, and it provides no exclusionary or alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

test_gen_from_reportGenerate Playwright test from reportAInspect

Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { 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.

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

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Move a report to a new workflow state, enforcing the same transition rules as the admin UI. Valid targets: classified, grouped, fixing, fixed, verified, reopened, dismissed. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNoReason for the transition (audit trail)
statusYesTarget status (resolved is stored as fixed)
reportIdYesReport UUID (`report_id` is accepted too.)
closedReasonNoWhen dismissing: what the reporter is told (spam closes silently)
reporterMessageNoOptional note posted to the reporter verbatim

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

Read-only combined tool: merges report detail, the reporter thread, similar bugs (matched on the report summary), the fix context (paste-ready fix prompt, repro steps, root cause), the blast radius of the inventory action the report is filed against, and recent pipeline warnings into a single structured review packet. Returns the packet plus prioritised recommended_actions, partial_errors for any source that failed, and notes for any source that does not apply (e.g. no blast radius when the report is not anchored to an inventory action). Equivalent to a Sentry "Analyze with Seer" flow grounded in user-felt reports. Pass reportId to kick off review. Call this before dispatch_fix.

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

Output Schema

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

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavior beyond that: it discloses that the tool merges multiple sources, returns recommended_actions, reports partial_errors for failed sources, and includes notes for non-applicable sources. This gives an agent an accurate mental model of what actually happens when the tool runs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than a simple one-liner but is information-dense and front-loaded with the core purpose. The Sentry 'Analyze with Seer' analogy is helpful but slightly optional; otherwise each clause earns its place given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, annotations, and presence of an output schema, the description is complete: it covers what sources are merged, what the returned packet contains, how failures/non-applicable sources are surfaced, and the intended call order before dispatch_fix. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents reportId, projectId, and includeLogs. The description only adds 'Pass reportId to kick off review', which restates what the schema already conveys, so it does not go beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb and resource: a 'read-only combined tool' that 'merges' six named sources into one 'structured review packet'. This clearly distinguishes it from the individual get_* siblings it aggregates, and the ordering hint 'Call this before dispatch_fix' anchors its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit sequencing guidance ('Call this before dispatch_fix') and strongly implies the use case: a combined review packet with recommended actions when analyzing a user-felt report. However, it does not explicitly say when to prefer this over calling the individual get_* tools, or explicitly list when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

triage_next_stepsWhat should I work on now?A
Read-onlyIdempotent
Inspect

Prioritised "do this next" list for the project: blocked auto-fixes first (with the unblock action), then 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".

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
stepsYes
summaryYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already 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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

Queue the Sonnet-as-Judge to grade recent fix quality across accessible projects. Returns { dispatched: number } — one judge-batch job per project; scores land asynchronously in judge_results (read back with run_nl_query). Write; consumes LLM budget. Idempotent within a short window. Use before shipping to vet fix quality; use get_fix_timeline to inspect a single attempt instead.

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

Output Schema

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

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true. The description adds valuable context: it's a write operation that consumes LLM budget, idempotent only 'within a short window', and results land asynchronously in judge_results. This goes beyond the annotations by clarifying the asynchronous nature and budget consumption, though it does not detail failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, front-loading the core action and then layering return type, side effects, idempotency, and usage guidance. It is dense but every sentence earns its place, though it could be slightly tightened without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values are covered. The description includes how to read results (via run_nl_query), mentions the asynchronous nature, and gives usage context. It lacks error handling or prerequisite details, but given the annotations and simplicity of the tool, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters have meaningful descriptions ('Max reports to judge', 'Restrict to one project'). The tool description adds no additional parameter guidance beyond what the schema provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Queue', the resource 'Sonnet-as-Judge', and the purpose 'to grade recent fix quality across accessible projects'. It also differentiates from the sibling get_fix_timeline by naming it as an alternative for single-attempt inspection. This is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use it ('Use before shipping to vet fix quality') and when not to ('use get_fix_timeline to inspect a single attempt instead'). This provides clear decision rules without requiring the agent to infer context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

use_mushiMushi — where to startA
Read-onlyIdempotent
Inspect

CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use. Pass your intent as a short natural-language phrase ("fix the top bug", "check what I should work on", "run QA tests", "set up Mushi", …). Returns: (1) a curated list of the 5–12 tool names most relevant to that intent, (2) a one-paragraph orientation to the Mushi project and dashboard state, and (3) the single recommended first tool to call. Only tools this connection exposes are recommended; relevant tools hidden by the active feature groups are named with how to enable them. Avoids loading the full tool catalog into context when only a small subset is needed. Read-only; does not call any downstream tools itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
intentNoWhat you are trying to accomplish with Mushi, e.g. "fix the top bug", "check project health", "run QA tests", "set up Mushi". Leave blank for a general orientation.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it explicitly says 'Read-only; does not call any downstream tools itself,' which is a meaningful guarantee for an agent deciding whether to invoke it. It also discloses that hidden tools are named with enablement instructions, which is a useful behavioral trait not visible in the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the most critical instruction ('CALL THIS FIRST'), then the return contract, then the scope constraint, then the safety note. Every sentence earns its place: the examples are compact, the return format is enumerated, and there is zero filler. It is appropriately sized for a tool that needs to orient an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only orientation tool with one optional parameter, no output schema, and no nested objects, the description is complete. It explains what the tool returns (three enumerated items), how to use it (intent phrase or blank), what it does not do (no downstream calls), and how it handles hidden tools. An agent has everything needed to invoke it correctly without further context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents the single 'intent' parameter well. The description adds value by giving concrete example values ('fix the top bug', 'check what I should work on', 'run QA tests', 'set up Mushi') and clarifying that leaving it blank yields a general orientation. This goes beyond the schema's examples and clarifies the blank case, which is genuinely useful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('CALL THIS FIRST'), a clear resource (Mushi project orientation), and a precise scope: it returns a curated list of 5–12 relevant tools, a one-paragraph orientation, and a single recommended first tool. It also explicitly distinguishes itself from the 40+ sibling tools by being the entry point when unsure which tool to use, so an agent can tell it apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: 'CALL THIS FIRST if you are new to this Mushi project or unsure which tool to use.' It also provides concrete example intents and states what it avoids (loading the full tool catalog), which implies when not to use it (when you already know the exact tool). This is strong routing guidance relative to the large sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 33 tool updatesv0.1.14
    • Changedadd_byok_key1 field changed
      • changedInput schema / properties / provider / enum
        Previous value: -[
        -  "anthropic",
        -  "openai",
        -  "firecrawl",
        -  "browserbase",
        -  "cursor"
        -]New value: +[
        +  "anthropic",
        +  "openai",
        +  "openrouter",
        +  "firecrawl",
        +  "browserbase",
        +  "cursor",
        +  "supabase"
        +]
    • Changeddispatch_fix1 field changed
      • addedInput schema / properties / targetRepoId
        Added 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"
        +}
    • Addedexplain_finding
    • Addedget_app_recipe
    • Addedget_auto_release_status
    • Addedget_design_deviance
    • Addedget_design_settings
    • Addedget_design_tokens
    • Changedget_fix_context2 fields changed
      • addedOutput schema / properties / recipe
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "report",
        -  "fixPrompt",
        -  "reproductionSteps",
        -  "component",
        -  "rootCause",
        -  "bugOntologyTags",
        -  "inventoryAction"
        -]New value: +[
        +  "report",
        +  "fixPrompt",
        +  "reproductionSteps",
        +  "component",
        +  "rootCause",
        +  "bugOntologyTags",
        +  "inventoryAction",
        +  "recipe"
        +]
    • Addedget_portfolio
    • Addedget_radar
    • Addedget_recipe_change
    • Addedget_recipe_drift
    • Addedget_recipe_sources
    • Addedget_release_calendar
    • Addedget_repo_diagram
    • Addedget_repo_digest
    • Addedget_store_reviews
    • Addedget_store_status
    • Changedimport_sentry_issues6 fields changed
      • addedInput schema / properties / cursor
        Added 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"
        +}
      • addedInput schema / properties / sentryProject
        Added 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"
        +}
      • addedInput schema / properties / sinceDays
        Added value: +{
        +  "description": "Only issues seen in the last N days (1-90). Search mode only.",
        +  "maximum": 90,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextCursor
        Added value: +{
        +  "description": "Pass back as cursor to import the next page; null when the backlog is done",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / sentryProject
        Added value: +{
        +  "description": "The Sentry project a search ran in (null for issueIds)",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / sentryProjects
        Added value: +{
        +  "description": "This project's Sentry projects, primary first",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
    • Addedlist_connectors
    • Changedlist_gate_findings1 field changed
      • changedInput schema / properties / gate / enum
        Previous 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"
        +]
    • Addedlist_portfolio_findings
    • Addedpropose_portfolio_change
    • Addedpropose_recipe_change
    • Addedpull_store_reviews
    • Addedrefresh_recipe
    • Addedrequest_connector_action
    • Addedrun_design_deviance
    • Addedrun_radar
    • Addedrun_store_review
    • Addedset_design_settings
    • Addedset_store_review_intake
  2. 5 tool updatesv0.1.13
    • Addedimport_sentry_issues
    • Addedlist_reporter_outbox
    • Addedrelease_reporter_update
    • Addedrequest_reporter_info
    • Changedtransition_status2 fields changed
      • addedInput schema / properties / closedReason
        Added value: +{
        +  "description": "When dismissing: what the reporter is told (spam closes silently)",
        +  "enum": [
        +    "duplicate",
        +    "not_reproducible",
        +    "wont_fix",
        +    "working_as_intended",
        +    "spam"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / reporterMessage
        Added value: +{
        +  "description": "Optional note posted to the reporter verbatim",
        +  "maxLength": 10000,
        +  "type": "string"
        +}
  3. 32 tool updatesv0.1.12
    • Changedactivation_status2 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID (defaults to the configured project).",
        -  "type": "string"
        -}
    • Changedadd_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changeddiagnose_setup3 fields changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Alias for project_id."New value: +"Project UUID for dispatch checks (defaults to configured project). (`project_id` is accepted too.)"
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID for dispatch checks (defaults to configured project).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / mode / enum
        Added value: +[
        +  "full",
        +  "ingest",
        +  "dispatch"
        +]
    • Changeddiff_inventory1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
    • Changeddispatch_fix4 fields changed
      • changedInput schema / properties / agent / description
        Previous value: -"Override the agent adapter"New value: +"Which agent runs the fix. Omit for the project default (auto); cursor_cloud and github_cloud_agent dispatch a cloud agent."
      • changedInput schema / properties / agent / enum
        Previous value: -[
        -  "claude_code",
        -  "codex",
        -  "rest_worker",
        -  "mcp"
        -]New value: +[
        +  "auto",
        +  "claude_code",
        +  "codex",
        +  "cursor_cloud",
        +  "github_cloud_agent",
        +  "rest_worker",
        +  "rest_fix_worker",
        +  "llm",
        +  "mcp"
        +]
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — defaults to the configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to fix"New value: +"Report UUID to fix (`report_id` is accepted too.)"
    • Changedget_fix_context15 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID to fix"New value: +"The report UUID to fix (`report_id` is accepted too.)"
      • addedOutput schema / properties / bugOntologyTags / description
        Added value: +"Bug ontology tags, or null"
      • addedOutput schema / properties / component / description
        Added value: +"Component or page the bug was attributed to"
      • addedOutput schema / properties / component / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / fixPrompt / description
        Added value: +"Paste-ready fix prompt composed server-side, or null"
      • addedOutput schema / properties / inventoryAction
        Added value: +{
        +  "description": "The inventory action (with its expected_outcome contract) the report is filed against, or null"
        +}
      • addedOutput schema / properties / report / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / report / properties
        Added value: +{
        +  "breadcrumbs": {},
        +  "category": {
        +    "description": "bug | slow | visual | confusing | other",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "child_report_ids": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "component": {
        +    "description": "Component or page the bug was attributed to",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "console_logs": {
        +    "description": "Console entries captured with the report"
        +  },
        +  "created_at": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "description": {
        +    "description": "What the reporter wrote (untrusted text)",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "environment": {
        +    "description": "Browser/OS/viewport the SDK captured"
        +  },
        +  "fix_attempts": {
        +    "description": "Latest fix attempts, newest first",
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "id": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "id"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "fix_packet": {
        +    "description": "Paste-ready fix prompt composed server-side"
        +  },
        +  "id": {
        +    "description": "Report UUID",
        +    "type": "string"
        +  },
        +  "inventory_action": {
        +    "description": "Inventory action the report is filed against, when resolved"
        +  },
        +  "network_logs": {
        +    "description": "Network requests captured with the report"
        +  },
        +  "project_id": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "reproduction_steps": {},
        +  "screenshot_url": {
        +    "description": "Signed screenshot URL",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "severity": {
        +    "description": "critical | high | medium | low",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "stage1_classification": {
        +    "description": "Stage-1 (fast) classification"
        +  },
        +  "stage2_analysis": {
        +    "description": "Stage-2 analysis: rootCause, suggestedFix, …"
        +  },
        +  "status": {
        +    "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "summary": {
        +    "description": "One-line summary written by the classifier",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "title": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / report / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / report / type
        Added value: +"object"
      • addedOutput schema / properties / reproductionSteps / description
        Added value: +"Reproduction steps recorded on the report ([] if none)"
      • addedOutput schema / properties / rootCause / description
        Added value: +"Stage-2 root cause, or null before Stage 2 runs"
      • changedOutput schema / required
        Previous value: -[
        -  "report",
        -  "fixPrompt",
        -  "reproductionSteps",
        -  "component",
        -  "rootCause",
        -  "bugOntologyTags"
        -]New value: +[
        +  "report",
        +  "fixPrompt",
        +  "reproductionSteps",
        +  "component",
        +  "rootCause",
        +  "bugOntologyTags",
        +  "inventoryAction"
        +]
    • Changedget_fix_timeline3 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"fix_attempt UUID"New value: +"fix_attempt UUID (or the dispatch id dispatch_fix returned) (`fix_id` is accepted too.)"
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
    • Changedget_inventory1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to the server-configured project when omitted"New value: +"Project UUID — defaults to the server-configured project when omitted (`project_id` is accepted too.)"
    • Addedget_mushi_doc
    • Changedget_recent_reports13 fields changed
      • changedInput schema / properties / category / description
        Previous value: -"Filter by category: bug, slow, visual, confusing, other"New value: +"Filter by category."
      • addedInput schema / properties / category / enum
        Added value: +[
        +  "bug",
        +  "slow",
        +  "visual",
        +  "confusing",
        +  "other"
        +]
      • addedInput schema / properties / includeRaw
        Added value: +{
        +  "description": "Return every column the list route has (breadcrumbs, environment, tags, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — defaults to the server-configured project. Useful when your key spans several projects; the error you get without it lists their ids. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — defaults to the server-configured project. Useful when you have multiple projects and want to query a specific one by its ID. Get IDs by calling list_projects or get_account_overview first.",
        -  "type": "string"
        -}
      • changedInput schema / properties / severity / description
        Previous value: -"Filter by severity: critical, high, medium, low"New value: +"Filter by severity."
      • addedInput schema / properties / severity / enum
        Added value: +[
        +  "critical",
        +  "high",
        +  "medium",
        +  "low"
        +]
      • changedInput schema / properties / status / description
        Previous value: -"Filter by status: new, classified, grouped, fixing, fixed, dismissed"New value: +"Filter by status. \"new\" also matches queued rows; \"classified\" and \"fixed\" include legacy aliases."
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "new",
        +  "pending",
        +  "submitted",
        +  "queued",
        +  "classified",
        +  "grouped",
        +  "fixing",
        +  "fixed",
        +  "dismissed",
        +  "triaged",
        +  "in_progress",
        +  "resolved",
        +  "verified",
        +  "reopened"
        +]
      • addedOutput schema / properties / reports / items / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / reports / items / properties
        Added value: +{
        +  "category": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "component": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "created_at": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "id": {
        +    "type": "string"
        +  },
        +  "severity": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "status": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "summary": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / reports / items / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / reports / items / type
        Added value: +"object"
    • Changedget_report_detail8 fields changed
      • addedInput schema / properties / includeRaw
        Added value: +{
        +  "description": "Return every column the detail route has (LLM invocation log, storage paths, custom metadata, …) instead of the documented fields. Reporter identifiers are removed either way. (`include_raw` is accepted too.)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — required for org-scoped keys with multiple projects. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — required for org-scoped keys with multiple projects.",
        -  "type": "string"
        -}
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
      • addedOutput schema / properties / report / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / report / properties
        Added value: +{
        +  "breadcrumbs": {},
        +  "category": {
        +    "description": "bug | slow | visual | confusing | other",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "child_report_ids": {
        +    "items": {
        +      "type": "string"
        +    },
        +    "type": "array"
        +  },
        +  "component": {
        +    "description": "Component or page the bug was attributed to",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "console_logs": {
        +    "description": "Console entries captured with the report"
        +  },
        +  "created_at": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "description": {
        +    "description": "What the reporter wrote (untrusted text)",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "environment": {
        +    "description": "Browser/OS/viewport the SDK captured"
        +  },
        +  "fix_attempts": {
        +    "description": "Latest fix attempts, newest first",
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "id": {
        +          "type": "string"
        +        },
        +        "status": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "required": [
        +        "id"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  "fix_packet": {
        +    "description": "Paste-ready fix prompt composed server-side"
        +  },
        +  "id": {
        +    "description": "Report UUID",
        +    "type": "string"
        +  },
        +  "inventory_action": {
        +    "description": "Inventory action the report is filed against, when resolved"
        +  },
        +  "network_logs": {
        +    "description": "Network requests captured with the report"
        +  },
        +  "project_id": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "reproduction_steps": {},
        +  "screenshot_url": {
        +    "description": "Signed screenshot URL",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "severity": {
        +    "description": "critical | high | medium | low",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "stage1_classification": {
        +    "description": "Stage-1 (fast) classification"
        +  },
        +  "stage2_analysis": {
        +    "description": "Stage-2 analysis: rootCause, suggestedFix, …"
        +  },
        +  "status": {
        +    "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "summary": {
        +    "description": "One-line summary written by the classifier",
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  },
        +  "title": {
        +    "type": [
        +      "string",
        +      "null"
        +    ]
        +  }
        +}
      • addedOutput schema / properties / report / required
        Added value: +[
        +  "id"
        +]
      • addedOutput schema / properties / report / type
        Added value: +"object"
    • Changedget_report_evidence3 fields changed
      • addedInput schema / properties / reportId
        Added value: +{
        +  "description": "Report UUID. (`report_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / report_id
        Removed value: -{
        -  "description": "Report UUID.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "report_id"
        -]New value: +[
        +  "reportId"
        +]
    • Changedget_report_timeline1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"The report UUID (`report_id` is accepted too.)"
    • Changedlist_byok_keys1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedlist_gate_findings5 fields changed
      • changedInput schema / properties / gate / description
        Previous value: -"Filter to one gate id: dead-handler | mock-leak | crawl | status-claim"New value: +"Only runs of this gate (and their findings)."
      • addedInput schema / properties / gate / enum
        Added value: +[
        +  "dead_handler",
        +  "mock_leak",
        +  "api_contract",
        +  "crawl",
        +  "status_claim",
        +  "spec_drift",
        +  "orphan_endpoint",
        +  "unknown_call",
        +  "schema_drift",
        +  "code_health"
        +]
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
      • changedInput schema / properties / severity / description
        Previous value: -"Minimum severity to include: low | medium | high | critical"New value: +"Only findings with exactly this severity."
      • addedInput schema / properties / severity / enum
        Added value: +[
        +  "info",
        +  "warn",
        +  "error"
        +]
    • Changedlist_lessons2 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID — defaults to configured project (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID — defaults to configured project",
        -  "type": "string"
        -}
    • Changedmerge_fix3 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID whose GitHub PR should be squash-merged"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged (`fix_id` is accepted too.)"
      • addedOutput schema / properties / justMerged
        Added value: +{
        +  "description": "True when this call performed the merge",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / sha
        Added value: +{
        +  "description": "Merge commit SHA, when GitHub reported one",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
    • Changedquery_lessons9 fields changed
      • addedInput schema / properties / diffText
        Added value: +{
        +  "description": "The PR diff, code snippet, or description of the change being made. (`diff_text` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / diff_text
        Removed value: -{
        -  "description": "The PR diff, code snippet, or description of the change being made.",
        -  "type": "string"
        -}
      • addedInput schema / properties / maxTokens
        Added value: +{
        +  "description": "Maximum tokens for returned lessons context (default 3000, max 8000). (`max_tokens` is accepted too.)",
        +  "type": "number"
        +}
      • removedInput schema / properties / max_tokens
        Removed value: -{
        -  "description": "Maximum tokens for returned lessons context (default 3000, max 8000).",
        -  "type": "number"
        -}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID. Defaults to configured project.",
        -  "type": "string"
        -}
      • addedInput schema / properties / topK
        Added value: +{
        +  "description": "Max number of lessons to return (default 15, max 50). (`top_k` is accepted too.)",
        +  "type": "number"
        +}
      • removedInput schema / properties / top_k
        Removed value: -{
        -  "description": "Max number of lessons to return (default 15, max 50).",
        -  "type": "number"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "diff_text"
        -]New value: +[
        +  "diffText"
        +]
    • Changedrefresh_ci1 field changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID whose PR check-runs should be re-polled"New value: +"Fix attempt UUID whose PR check-runs should be re-polled (`fix_id` is accepted too.)"
    • Changedremove_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedreopen_report1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to move back to reopened status"New value: +"Report UUID to move back to reopened status (`report_id` is accepted too.)"
    • Changedreply_to_reporter1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report id to reply to"New value: +"Report id to reply to (`report_id` is accepted too.)"
    • Changedsearch_mushi_docs3 fields changed
      • removedOutput schema / properties / results / items / properties / path
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / results / items / properties / url
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "title",
        -  "path",
        -  "excerpt",
        -  "score"
        -]New value: +[
        +  "title",
        +  "url",
        +  "excerpt",
        +  "score"
        +]
    • Removedsetup_repo_for_mushi
    • Changedsubmit_fix_result2 fields changed
      • changedInput schema / properties / prUrl / description
        Previous value: -"GitHub pull request URL, if a PR was opened"New value: +"GitHub pull request URL, if a PR was opened (`pr_url` is accepted too.)"
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to attach this external fix attempt to"New value: +"Report UUID to attach this external fix attempt to (`report_id` is accepted too.)"
    • Changedsuggest_fix1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to read the Stage-2 suggested-fix slice for"New value: +"Report UUID to read the Stage-2 suggested-fix slice for (`report_id` is accepted too.)"
    • Changedtest_byok_key1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project id"New value: +"Project id (`project_id` is accepted too.)"
    • Changedtest_gen_from_report2 fields changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Project UUID — defaults to configured project"New value: +"Project UUID — defaults to configured project (`project_id` is accepted too.)"
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID to turn into a Playwright PR"New value: +"Report UUID to turn into a Playwright PR (`report_id` is accepted too.)"
    • Changedtransition_status1 field changed
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID"New value: +"Report UUID (`report_id` is accepted too.)"
    • Changedtriage_issue35 fields changed
      • addedInput schema / properties / includeLogs
        Added value: +{
        +  "description": "Include recent pipeline logs in triage packet (default: true). (`include_logs` is accepted too.)",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / include_logs
        Removed value: -{
        -  "description": "Include recent pipeline logs in triage packet (default: true).",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID. Defaults to configured project. (`project_id` is accepted too.)",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID. Defaults to configured project.",
        -  "type": "string"
        -}
      • addedInput schema / properties / reportId
        Added value: +{
        +  "description": "Report UUID to triage. (`report_id` is accepted too.)",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
      • removedInput schema / properties / report_id
        Removed value: -{
        -  "description": "Report UUID to triage.",
        -  "format": "uuid",
        -  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "report_id"
        -]New value: +[
        +  "reportId"
        +]
      • changedOutput schema / properties / blast_radius / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "affected": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / blast_radius / description
        Added value: +"Downstream nodes of the inventory action the report is filed against, or null"
      • addedOutput schema / properties / category / description
        Added value: +"bug | slow | visual | confusing | other, or unknown"
      • addedOutput schema / properties / category / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / fix_context / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "bugOntologyTags": {
        +        "description": "Bug ontology tags, or null"
        +      },
        +      "component": {
        +        "description": "Component or page the bug was attributed to",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "fixPrompt": {
        +        "description": "Paste-ready fix prompt composed server-side, or null"
        +      },
        +      "reproductionSteps": {
        +        "description": "Reproduction steps recorded on the report ([] if none)"
        +      },
        +      "rootCause": {
        +        "description": "Stage-2 root cause, or null before Stage 2 runs"
        +      }
        +    },
        +    "required": [
        +      "fixPrompt",
        +      "reproductionSteps",
        +      "component",
        +      "rootCause",
        +      "bugOntologyTags"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / fix_context / description
        Added value: +"Fix-context slice, as get_fix_context returns it"
      • addedOutput schema / properties / notes
        Added value: +{
        +  "description": "Sources that do not apply to this report, and why",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / partial_errors
        Added value: +{
        +  "description": "Sources that failed, as \"source: message\"",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / recent_logs / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "entries": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / recent_logs / description
        Added value: +"Recent warn+ pipeline log entries for the project, or null"
      • addedOutput schema / properties / recommended_actions / description
        Added value: +"What to do next, most important first"
      • addedOutput schema / properties / recommended_actions / items / additionalProperties
        Added value: +false
      • addedOutput schema / properties / recommended_actions / items / properties
        Added value: +{
        +  "action": {
        +    "type": "string"
        +  },
        +  "args": {
        +    "additionalProperties": {},
        +    "description": "Arguments for that tool",
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  "reason": {
        +    "type": "string"
        +  },
        +  "tool": {
        +    "description": "Tool to call next",
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / recommended_actions / items / required
        Added value: +[
        +  "action",
        +  "reason"
        +]
      • addedOutput schema / properties / recommended_actions / items / type
        Added value: +"object"
      • addedOutput schema / properties / report / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "breadcrumbs": {},
        +      "category": {
        +        "description": "bug | slow | visual | confusing | other",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "child_report_ids": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "component": {
        +        "description": "Component or page the bug was attributed to",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "console_logs": {
        +        "description": "Console entries captured with the report"
        +      },
        +      "created_at": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "description": {
        +        "description": "What the reporter wrote (untrusted text)",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "environment": {
        +        "description": "Browser/OS/viewport the SDK captured"
        +      },
        +      "fix_attempts": {
        +        "description": "Latest fix attempts, newest first",
        +        "items": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "id": {
        +              "type": "string"
        +            },
        +            "status": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "id"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "fix_packet": {
        +        "description": "Paste-ready fix prompt composed server-side"
        +      },
        +      "id": {
        +        "description": "Report UUID",
        +        "type": "string"
        +      },
        +      "inventory_action": {
        +        "description": "Inventory action the report is filed against, when resolved"
        +      },
        +      "network_logs": {
        +        "description": "Network requests captured with the report"
        +      },
        +      "project_id": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "reproduction_steps": {},
        +      "screenshot_url": {
        +        "description": "Signed screenshot URL",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "severity": {
        +        "description": "critical | high | medium | low",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "stage1_classification": {
        +        "description": "Stage-1 (fast) classification"
        +      },
        +      "stage2_analysis": {
        +        "description": "Stage-2 analysis: rootCause, suggestedFix, …"
        +      },
        +      "status": {
        +        "description": "Workflow status, e.g. new, classified, fixing, fixed, verified, reopened",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "summary": {
        +        "description": "One-line summary written by the classifier",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "title": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "id"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "error": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "error"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedOutput schema / properties / report / description
        Added value: +"The report (documented fields, no reporter identifiers), or the error reading it"
      • addedOutput schema / properties / report_id / description
        Added value: +"The triaged report UUID"
      • changedOutput schema / properties / reporter_thread / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {},
        +    "properties": {
        +      "report_id": {
        +        "type": "string"
        +      },
        +      "timeline": {
        +        "items": {},
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / reporter_thread / description
        Added value: +"The unified report timeline (comments, fixes, QA), or null"
      • addedOutput schema / properties / severity / description
        Added value: +"critical | high | medium | low, or unknown when the report could not be read"
      • addedOutput schema / properties / severity / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / similar_bugs / anyOf
        Previous value: -[
        -  {},
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "category": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "description": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "reportGroupId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "reportId": {
        +          "type": "string"
        +        },
        +        "similarity": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "reportId",
        +        "similarity"
        +      ],
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedOutput schema / properties / similar_bugs / description
        Added value: +"Up to five nearest reports by summary, excluding this one; null when not searched"
      • addedOutput schema / properties / status / description
        Added value: +"Workflow status, or unknown"
      • addedOutput schema / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / triage_summary / description
        Added value: +"One-line summary"
      • changedOutput schema / required
        Previous value: -[
        -  "report_id",
        -  "severity",
        -  "category",
        -  "status",
        -  "report",
        -  "reporter_thread",
        -  "similar_bugs",
        -  "fix_context",
        -  "blast_radius",
        -  "recent_logs",
        -  "recommended_actions",
        -  "triage_summary"
        -]New value: +[
        +  "report_id",
        +  "severity",
        +  "category",
        +  "status",
        +  "partial_errors",
        +  "notes",
        +  "report",
        +  "reporter_thread",
        +  "similar_bugs",
        +  "fix_context",
        +  "blast_radius",
        +  "recent_logs",
        +  "recommended_actions",
        +  "triage_summary"
        +]
    • Changedtriage_next_steps2 fields changed
      • addedInput schema / properties / projectId
        Added value: +{
        +  "description": "Project UUID (defaults to the configured project). (`project_id` is accepted too.)",
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
      • removedInput schema / properties / project_id
        Removed value: -{
        -  "description": "Project UUID (defaults to the configured project).",
        -  "format": "uuid",
        -  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -  "type": "string"
        -}
    • Changedtrigger_judge1 field changed
      • changedInput schema / properties / projectId / description
        Previous value: -"Restrict to one project when the API key owns multiple"New value: +"Restrict to one project when the API key owns multiple (`project_id` is accepted too.)"
  4. 41 tool updatesv0.1.10
    • Changedactivation_status1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedadd_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedcheck_sdk_version
    • Changeddiagnose_setup2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddiff_inventory1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddispatch_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_blast_radius1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_fix_context2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_fix_timeline1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_graph_neighborhood2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_graph_node2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_inventory1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_knowledge_graph2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_recent_reports2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_detail2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_evidence1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_report_timeline1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_similar_bugs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedget_two_way_comms_health1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_byok_keys1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_gate_findings2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_lessons2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedmerge_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedquery_lessons1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrefresh_ci8 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • removedOutput schema / properties / check_run_conclusion / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_conclusion / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / check_run_status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / check_run_updated_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / check_run_updated_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedremove_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreopen_report2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedreply_to_reporter1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrun_nl_query1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_mushi_docs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsearch_reports2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsetup_repo_for_mushi1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsubmit_fix_result2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedsuggest_fix2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtest_byok_key1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtest_gen_from_report1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtransition_status1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtriage_issue2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtriage_next_steps2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtrigger_judge2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeduse_mushi1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  5. 4 tool updatesv0.1.9
    • Changedsubmit_fix_result1 field changed
      • changedInput schema / properties / idempotencyKey / description
        Previous value: -"Optional UUID — resend the same key to safely retry without creating duplicate fix rows"New value: +"Optional UUID — resend the same key to safely retry without creating duplicate fix rows. Omit it and a stable key is derived from reportId + branch + prUrl, so a retried submission carries the identical key instead of a fresh random one."
    • Changedsuggest_fix1 field changed
      • addedOutput schema / properties / note
        Added value: +{
        +  "description": "Present when no Stage-2 analysis exists — explains why and what to call instead",
        +  "type": "string"
        +}
    • Changedtransition_status2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"Target status"New value: +"Target status (resolved is stored as fixed)"
      • changedInput schema / properties / status / enum
        Previous value: -[
        -  "pending",
        -  "classified",
        -  "grouped",
        -  "fixing",
        -  "fixed",
        -  "resolved",
        -  "verified",
        -  "reopened",
        -  "dismissed"
        -]New value: +[
        +  "pending",
        +  "classified",
        +  "triaged",
        +  "in_progress",
        +  "grouped",
        +  "fixing",
        +  "fixed",
        +  "resolved",
        +  "verified",
        +  "reopened",
        +  "dismissed"
        +]
    • Addedtriage_next_steps
  6. 5 tool updatesv0.1.8
    • Addedadd_byok_key
    • Addedlist_byok_keys
    • Addedremove_byok_key
    • Addedtest_byok_key
    • Addeduse_mushi
  7. 60 tool updatesv0.1.2
    • Addedactivation_status
    • Removedadd_byok_key
    • Removedanalyze_codebase_impact
    • Removedanalyze_wiki_knowledge
    • Removedapprove_qa_story
    • Removedask_codebase
    • Removedaward_bonus_points
    • Removedcheckin_pipeline_step
    • Removeddiagnose_connection
    • Changeddiagnose_setup1 field changed
      • addedOutput schema / properties / connection
        Added value: +{}
    • Addeddiff_inventory
    • Removedfix_suggest
    • Removedgenerate_tdd_from_story
    • Removedget_account_overview
    • Removedget_activation_status
    • Removedget_backend_health
    • Removedget_codebase_domains
    • Removedget_codebase_tour
    • Removedget_file_summary
    • Addedget_graph_neighborhood
    • Addedget_graph_node
    • Addedget_inventory
    • Changedget_knowledge_graph3 fields changed
      • changedInput schema / properties / depth / description
        Previous value: -"Traversal depth (default 2, max 4)"New value: +"BFS hops outward from seed — clamped to 4 in the handler (default 2)"
      • changedInput schema / properties / seed / description
        Previous value: -"Starting node id or label"New value: +"Starting graph node id or human-readable label to traverse from"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "edges": {
        +      "description": "Edges connecting the returned nodes",
        +      "items": {},
        +      "type": "array"
        +    },
        +    "nodes": {
        +      "description": "Graph nodes within the depth budget",
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "nodes",
        +    "edges"
        +  ],
        +  "type": "object"
        +}
    • Removedget_map_run_status
    • Removedget_pipeline_logs
    • Removedget_pipeline_run
    • Removedget_project_context
    • Removedget_qa_story_run
    • Removedget_reporter_thread
    • Removedget_skill
    • Removedget_usage
    • Removedgraph_neighborhood
    • Removedgraph_node_status
    • Removedimprove_qa_story
    • Removedingest_setup_check
    • Removedinventory_diff
    • Removedinventory_findings
    • Removedinventory_get
    • Removedlist_byok_keys
    • Addedlist_gate_findings
    • Changedlist_lessons4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max number of lessons to return (default 50, max 200)."New value: +"Max lessons to return (default 50, max 200)"
      • changedInput schema / properties / project_id / description
        Previous value: -"Project UUID. Defaults to configured project."New value: +"Project UUID — defaults to configured project"
      • changedInput schema / properties / severity / description
        Previous value: -"Filter by severity level."New value: +"Filter to one severity level"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "lessons": {
        +      "description": "Promoted lesson rows ordered by frequency",
        +      "items": {},
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "lessons"
        +  ],
        +  "type": "object"
        +}
    • Removedlist_pending_review_stories
    • Removedlist_projects
    • Removedlist_qa_story_runs
    • Removedlist_skills
    • Removedlist_top_contributors
    • Removedmap_user_stories
    • Changedmerge_fix3 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose GitHub PR should be squash-merged"
      • changedInput schema / properties / mergeMethod / description
        Previous value: -"GitHub merge method"New value: +"GitHub merge method (default squash)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "alreadyMerged": {
        +      "description": "True when the PR was already merged (idempotent no-op)",
        +      "type": "boolean"
        +    },
        +    "merged": {
        +      "description": "True when GitHub accepted the merge in this call",
        +      "type": "boolean"
        +    },
        +    "reportId": {
        +      "description": "Report UUID linked to this fix attempt",
        +      "type": "string"
        +    },
        +    "reportStatus": {
        +      "description": "Report workflow status after merge bookkeeping",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "reportId",
        +    "reportStatus"
        +  ],
        +  "type": "object"
        +}
    • Changedrefresh_ci2 fields changed
      • changedInput schema / properties / fixId / description
        Previous value: -"Fix attempt UUID"New value: +"Fix attempt UUID whose PR check-runs should be re-polled"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "check_run_conclusion": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "success | failure | neutral | null while pending"
        +    },
        +    "check_run_status": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "GitHub check run status after refresh"
        +    },
        +    "check_run_updated_at": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "ISO timestamp when CI status was last persisted"
        +    }
        +  },
        +  "required": [
        +    "check_run_status",
        +    "check_run_conclusion",
        +    "check_run_updated_at"
        +  ],
        +  "type": "object"
        +}
    • Changedreopen_report3 fields changed
      • changedInput schema / properties / note / description
        Previous value: -"Triage note"New value: +"Operator note recorded on the reopen transition"
      • changedInput schema / properties / reportId / description
        Previous value: -"Report UUID"New value: +"Report UUID to move back to reopened status"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "report": {
        +      "description": "Updated report row with status=reopened"
        +    }
        +  },
        +  "required": [
        +    "report"
        +  ],
        +  "type": "object"
        +}
    • Removedrun_fullstack_audit
    • Removedrun_qa_story
    • Removedsearch_codebase
    • Removedset_tier
    • Removedsetup_check
    • Removedstart_skill_pipeline
    • Changedsubmit_fix_result7 fields changed
      • changedInput schema / properties / branch / description
        Previous value: -"Git branch name"New value: +"Git branch name where the fix was implemented"
      • changedInput schema / properties / filesChanged / description
        Previous value: -"Files modified"New value: +"Repo-relative paths modified by the fix"
      • changedInput schema / properties / linesChanged / description
        Previous value: -"Total lines changed"New value: +"Total lines added + removed across filesChanged"
      • changedInput schema / properties / prUrl / description
        Previous value: -"GitHub PR URL"New value: +"GitHub pull request URL, if a PR was opened"
      • changedInput schema / properties / reportId / description
        Previous value: -"The report UUID"New value: +"Report UUID to attach this external fix attempt to"
      • changedInput schema / properties / summary / description
        Previous value: -"Fix summary"New value: +"One-line human summary of what the fix changed"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "fixId": {
        +      "description": "UUID of the new fix_attempt row",
        +      "type": "string"
        +    },
        +    "ok": {
        +      "description": "True when the fix_attempt row was created and marked completed",
        +      "type": "boolean"
        +    }
        +  },
        +  "required": [
        +    "ok",
        +    "fixId"
        +  ],
        +  "type": "object"
        +}
    • Addedsuggest_fix
    • Removedtest_notification_channel
    • Changedtrigger_judge1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "dispatched": {
        +      "description": "Number of judge-batch jobs dispatched (one per accessible project)",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "dispatched"
        +  ],
        +  "type": "object"
        +}
  8. 2 tool updatesv0.1.1
    • Changeddispatch_fix2 fields changed
      • addedInput schema / properties / reportId / format
        Added value: +"uuid"
      • addedInput schema / properties / reportId / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    • Changedtriage_issue2 fields changed
      • addedInput schema / properties / report_id / format
        Added value: +"uuid"
      • addedInput schema / properties / report_id / pattern
        Added value: +"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
  9. 72 tool updatesv0.1.0
    • First observedadd_byok_key
    • First observedanalyze_codebase_impact
    • First observedanalyze_wiki_knowledge
    • First observedapprove_qa_story
    • First observedask_codebase
    • First observedaward_bonus_points
    • First observedcheckin_pipeline_step
    • First observeddiagnose_connection
    • First observeddiagnose_setup
    • First observeddispatch_fix
    • First observedfix_suggest
    • First observedgenerate_tdd_from_story
    • First observedget_account_overview
    • First observedget_activation_status
    • First observedget_backend_health
    • First observedget_blast_radius
    • First observedget_codebase_domains
    • First observedget_codebase_tour
    • First observedget_file_summary
    • First observedget_fix_context
    • First observedget_fix_timeline
    • First observedget_knowledge_graph
    • First observedget_map_run_status
    • First observedget_pipeline_logs
    • First observedget_pipeline_run
    • First observedget_project_context
    • First observedget_qa_story_run
    • First observedget_recent_reports
    • First observedget_report_detail
    • First observedget_report_evidence
    • First observedget_report_timeline
    • First observedget_reporter_thread
    • First observedget_similar_bugs
    • First observedget_skill
    • First observedget_two_way_comms_health
    • First observedget_usage
    • First observedgraph_neighborhood
    • First observedgraph_node_status
    • First observedimprove_qa_story
    • First observedingest_setup_check
    • First observedinventory_diff
    • First observedinventory_findings
    • First observedinventory_get
    • First observedlist_byok_keys
    • First observedlist_lessons
    • First observedlist_pending_review_stories
    • First observedlist_projects
    • First observedlist_qa_story_runs
    • First observedlist_skills
    • First observedlist_top_contributors
    • First observedmap_user_stories
    • First observedmerge_fix
    • First observedquery_lessons
    • First observedrefresh_ci
    • First observedreopen_report
    • First observedreply_to_reporter
    • First observedrun_fullstack_audit
    • First observedrun_nl_query
    • First observedrun_qa_story
    • First observedsearch_codebase
    • First observedsearch_mushi_docs
    • First observedsearch_reports
    • First observedset_tier
    • First observedsetup_check
    • First observedsetup_repo_for_mushi
    • First observedstart_skill_pipeline
    • First observedsubmit_fix_result
    • First observedtest_gen_from_report
    • First observedtest_notification_channel
    • First observedtransition_status
    • First observedtriage_issue
    • First observedtrigger_judge

TDQS

A3.8/5.0

Scored across 73 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count1/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    A remote Model Context Protocol server acting as middleware to the Sentry API, allowing AI assistants like Claude to access Sentry data and functionality through natural language interfaces.
    7
    39 npm
    930
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Open source contribution manager — tracks PRs across repos, discovers contributable issues, diagnoses CI failures, and drafts maintainer responses. 21 MCP tools, 5 resources, 3 prompts. Ships as CLI, MCP server, and Claude Code plugin.
    20
    18
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP 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.
    5
    8 npm
    MIT