MCP server bridging LLM clients to the Serotonin Lua runtime for Roblox
Critical gaps across all dimensions. Tool descriptions are present but minimal (10-60 chars, well below 50-200 char baseline for LLM optimization). Input schemas exist but lack depth: parameters have types and basic descriptions, but no enums, ranges, or format constraints. The 'eval' tool is particularly dangerous, it accepts arbitrary Lua code with only regex-based blacklist enforcement, no confirmation step, and minimal error guidance. Output schemas are undocumented. No error handling guidance for recovery. Tool naming is reasonable (verb-noun pattern) but composition is poor: 'inspect' and 'safe_inspect' are near-duplicates; 'dive' overlaps with 'inspect'. No pagination, no structured output documentation, no idempotency guarantees.
Recursively traverse and inspect Roblox object hierarchies with depth limits
Execute arbitrary Lua code in the Serotonin runtime with optional safe mode enforcement
Inspect a Roblox object and retrieve its properties and metadata
Safely inspect a Roblox object with blacklist enforcement
Dangerous 'eval' tool lacks confirmation and proper error guidance. Accepts arbitrary Lua code with only regex blacklist enforcement (easily bypassed). No dry-run, no confirmation step, no recovery guidance if code fails.
Duplicate/overlapping tools: 'inspect' and 'safe_inspect' are near-identical (both inspect Roblox objects). LLM cannot distinguish when to use each. 'dive' also overlaps with 'inspect' functionality.
Descriptions are too short (10-60 chars vs 50-200 char baseline). 'Inspect a Roblox object and retrieve its properties and metadata' (60 chars) lacks WHEN to use it, prerequisites, or what distinguishes it from safe_inspect. LLM cannot optimize tool selection.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 42 | <=2025-11-25 | v2 |
No output schema documentation. LLMs cannot plan downstream calls or extract required fields. What does 'inspect' return? A dict? A list? What fields?
Parameters lack constraints: 'max_depth' (integer) has no min/max bounds. LLM could pass 0, -1, or 10000. 'target' and 'root' accept free-form strings with no format guidance or examples of valid paths.