A Next.js MCP host that owns the agent loop: it picks tools across multiple MCP servers, calls them, feeds results back to Claude, and shows every step. Demonstrates multi-server tool namespacing, agent loop implementation, and streaming tool execution.
Four tools with complete schemas and strong descriptions (avg 180 chars, well above 10-char minimum). All parameters typed and described. Naming follows verb_noun convention (current_time, calculate, word_count, secret_code). No critical security issues, all tools are READ_ONLY. Schemas properly structured with enums (calculate.op), constraints (word_count.maxLength=20000), and defaults (current_time.timezone='UTC'). Main gap: no output schemas documented, no error handling guidance, no pagination/limits for list-like operations. Tool descriptions are LLM-optimized and include WHEN-to-use context, meeting pattern:tool-description baseline.
Do exact arithmetic on two numbers: add, subtract, multiply, divide, power, or remainder. Use this for any calculation where being off by one matters — money, counts, measurements — rather than doing the arithmetic in your head.
Get the current date and time, optionally in a specific timezone. Use this whenever the answer depends on what time it is right now — scheduling, 'how long until', 'what day is it', or anything time-sensitive. A language model has no clock and will guess wrongly without this.
Scramble or unscramble text with the Atbash cipher, which mirrors the alphabet so A becomes Z, B becomes Y, and so on. Atbash is its own inverse, so the same call both encodes and decodes. Use this when someone asks specifically for Atbash or a mirror cipher.
Count the words, characters, and sentences in a piece of text. Use this whenever an exact count matters — checking a length limit, or answering 'how many words is this'. Counting by eye is unreliable.
No output schemas documented. LLMs cannot plan downstream tool calls or extract structured results without knowing return field types and names.
No error handling guidance. Tool descriptions do not explain what happens on invalid input (e.g., invalid timezone, division by zero, malformed text). LLMs cannot self-correct without actionable error messages.
secret_code naming is vague. 'secret_code' does not clearly indicate the action (encode/decode/cipher). Better: 'encode_atbash' or 'cipher_atbash' to signal intent before reading description.
word_count description mentions 'words, characters, and sentences' but schema only shows 'text' input. Output structure (which fields returned?) is undocumented, forcing LLMs to guess.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
calculate.op enum is well-defined, but description lacks guidance on edge cases: division by zero, power overflow, remainder with zero divisor. LLMs will attempt these without knowing expected behavior.