osu-mcp has 11 well-named, read-only tools with consistent verb_noun naming (get_*, search_*). All tools have descriptions (avg ~80 chars, within baseline 34-392). Input schemas are present and use Zod with type constraints and enums. However, output schemas are NOT documented, responses are JSON-stringified without field-level documentation. Error handling is minimal (generic 'Error: {error}' messages with no recovery guidance). Parameter descriptions are adequate but lack format/constraint details (e.g., 'user' accepts username OR user ID but this is not stated). No tool annotations (readOnlyHint, etc.). Composition is sound, each tool has one responsibility, and tools chain naturally (e.g., get_user → get_user_scores). Baseline: avg tool description 194 chars; this server ~80 chars (below median but acceptable for domain-specific APIs).
Analyze a mania beatmap for pattern density, jacks, LN usage, hand balance, and other characteristics
Get information about a specific beatmap
Get the top scores on a beatmap
Get information about a beatmapset (collection of beatmaps)
Get global rankings for a game mode
Get regional/state rankings from osuworld (e.g. US-CA for California)
Get list of available regions/states for a country from osuworld
Output schemas not documented. Responses are JSON-stringified without field-level documentation. LLMs cannot plan downstream calls or extract specific fields reliably.
Error handling is generic ('Error: {error}') with no recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Get an osu! user's profile and statistics
Get a user's best, recent, or first-place scores
Get an osu! wiki page by locale and path
Search for beatmapsets by query
Parameter 'user' in get_user accepts both username and user ID but description does not clarify this dual-mode behavior. LLMs may pass invalid formats.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All tools are read-only but this is not machine-declared.
No pagination guidance in descriptions. search_beatmapsets and get_rankings may return large result sets but no limit/offset parameters are documented.