An MCP server written in Dart that provides tools for web scraping, dice rolling, browser automation, avatar control, and various utility functions
Brat MCP has 17 tools with explicit schemas and descriptions visible in source. However, quality is inconsistent. Avatar tools (1-8) have enum-constrained parameters and basic descriptions, but descriptions are terse (10-50 chars, below the 50-200 char baseline for LLM optimization). Utility tools (9-17) have better descriptions (100-300 chars) but lack output schema documentation. Critical gaps: no error recovery guidance, no parameter validation rules stated, no output schemas documented for any tool, and descriptions lack WHEN/WHY context. Tool naming is verb-noun compliant but generic (e.g., 'avatar_set_*' repeats 'set' across 6 tools, risking LLM confusion). The 'restart_llama' tool is a destructive operation with no confirmation pattern or permission gate. Overall, definitions are functional but fall short of production-grade quality.
Remove pieces of clothing
Set your avatars animation try to use this to be expressive
Set the camera view of your avatar
Wear pieces of clothing, use this if there are clothes that suit a question youve been ask or an action youre doing
Set your avatars facial expression try to use this atleast once per turn
Set the hair colour of your avatar
Set your hair style
Avatar tool descriptions are under 50 characters and lack WHEN/WHY context. LLMs cannot determine when to call 'avatar_set_expression' vs 'avatar_set_animation' without richer guidance.
No output schemas documented for any tool. LLMs cannot plan downstream calls or extract structured data. E.g., 'roll_dice' returns text but should document result structure (total, rolls, modifiers).
'restart_llama' is a destructive operation with no confirmation pattern, permission gate, or dry-run capability. Agents could accidentally restart the server.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2026-07-28+ | v2 |
Spawn particles over your avatar
Get the current date and time in the format day/month/year - hour:minute
Download and display an image, assistant can see this image if they have vision capabilities
Fetch and extract readable text from a webpage via HTTP GET. Use this as the first choice for reading web pages. its faster and lighter than puppeteer. Not suitable for JavaScript-heavy pages or sites requiring interaction.
Extract readable text from a single webpage using a browser. Useful for single page reads where JavaScript is required and you dont need to interact with the page. Prefer http_get_text where possible as its faster. For multistep tasks searches, purchases, form flows, use puppeteer_session_* tools instead.
Get a random, number, supports min and max
Restart the llama server. Run this if the user asks you to kill yourself or kys.
Roll dice using dice notation. Maths Ops: +, -, x, *, ×, /, ÷ Dice Ops: dl - Drop lowest roll, dh - Drop highest roll, kh - Keep highest roll, kl - Keep lowest roll, ! - Roll again if not below highest.
Sleep for a period of time, useful to wait before continuing output or before anotehr tool call.You could use this multiple times in a turn to simulate loop.Sleeps longer than 45 seconds will fail so may need multiple calls
Search the web using DuckDuckGo. Use this to find URLs and links to relevant content. If bot detection kicks in do not keep retrying with different queries they will fail. Switch to a different tool instead.
Parameter validation rules not stated in descriptions. E.g., 'random_number' accepts min/max but no bounds documented; 'sleep_timer' caps at 45s but this is buried in description text, not a schema constraint.
Error handling lacks recovery guidance. E.g., 'avatar_set_expression' catches exceptions and returns stack traces; LLMs cannot self-correct from 'Failed to parse expression'.