An MCP server implementing a scratchpad for LLM inner monologue
Single tool with adequate naming but critical deficiencies in schema structure and parameter documentation. The tool name 'inner-monologue' lacks a clear action verb (should be 'process_thought' or 'record_monologue'). While the tool description is detailed (395 chars, within 10-1024 range), the INPUT PARAMETER 'thought' has minimal description ('A line of reasoning, mental check, intuition breakdown, or problem-solving step to be considered internally') that barely disambiguates the expected format. The schema registration shows `inputSchema: { thought: z.string() }` but this is not proper JSON Schema format with type declarations, it's a Zod object that may not translate to standard JSON Schema fields. No output schema is documented, leaving LLMs unaware of what the tool returns. The response from formatInnerMonologueResponse() returns `{content: [{type: 'text', text: string}]}`, but this contract is never declared in the tool definition. No error handling guidance, no validation constraints (e.g., min/max length for thought), no retry semantics. The tool is conceptually sound but underspecified for production LLM integration.
This tool serves as a silent workspace for internal reasoning. It simulates the inner monologue of a language model, allowing structured thoughts to be processed without affecting external output or triggering any actions. Use this tool when reflecting, analyzing, verifying, comparing, or planning. It does not fetch data or produce visible results directly, but supports deeper understanding and controlled thought flow. Args: thought: A line of reasoning, mental check, intuition breakdown, or problem-solving step to be considered internally. Behavior: The thought is evaluated privately, with no immediate response to the user. Useful for breaking down complex logic, evaluating potential outcomes, or mentally iterating through alternatives before committing to a response. <example> { "thought": "Why does this bug keep appearing even after I fixed the logic? I walked through the control flow twice, and everything looks correct on paper. Did I miss a condition? Maybe there's a path where a flag isn't being reset properly. Or perhaps one of the edge cases I assumed wouldn't happen is actually happening under a specific load. Maybe there's a race condition somewhere. Could two threads be touching the same variable without proper synchronization? I should check for shared state access and see if any part of this runs asynchronously. Also, maybe I'm relying too heavily on logs that aren't giving the full picture. It might help to add more logging around the entry and exit points of that function and watch for timing anomalies." } </example> <example> { "thought": "To solve this equation, I need to isolate the variable on one side. The equation is 3x + 5 = 20. First, subtract 5 from both sides, then divide by 3. That gives x = 5." } </example>
Tool name lacks action verb; 'inner-monologue' is a noun phrase, not verb_noun pattern. Should be 'process_thought', 'record_monologue', or 'reflect_internally'.
Input parameter 'thought' has no formal type/format constraints documented. Description does not specify length limits, character restrictions, or format requirements (plain text vs. structured). LLMs cannot infer valid input bounds.
Output schema is not documented. Tool returns {content: [{type: 'text', text: string}]}, but this contract is invisible to LLMs. They cannot plan downstream actions or extract structured fields.
Input schema uses Zod object notation (`inputSchema: { thought: z.string() }`) rather than proper JSON Schema with explicit type, description, and constraints fields. May not translate cleanly to JSON Schema in MCP protocol.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 43 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 44 | - | v1 |
No error handling guidance. Tool offers no explanation of failure modes, retry semantics, or what to do if input is malformed.
Tool description includes lengthy example objects in text form, violating the guidance against embedding example values in descriptions. LLMs may reuse these examples literally rather than adapting to context.