A simple and performant Model Context Protocol framework for Python
This is a framework/example server with 19 tools spread across multiple example files. Definition quality varies significantly by tool. Strong points: all tools have descriptions and input schemas with typed parameters; many descriptions are adequate (100-200 chars). Weak points: (1) duplicate tool names ('search' appears twice, 'supabase_select_live' appears twice) signal composition issues and LLM confusion; (2) descriptions are generic and lack actionable context ('Ping the server' for ping tool does not guide when to use it); (3) no documented output schemas for any tool, LLMs cannot plan downstream calls; (4) parameters lack context constraints (e.g., 'operation' in calc_basic has no enum, forcing LLM to guess valid values); (5) error handling guidance is absent from all tool descriptions; (6) several tools (reset, delete_file, deploy) are high-risk but lack confirmation/dry-run guidance. The tool set mixes utility (math, echo) with auth examples (Supabase) and advanced patterns (elicitation), reflecting an example framework rather than a cohesive production service. Average tool description length ~120 chars, below the 194-char baseline for A+ tools. No tool has documented return types.
Add two numbers
Basic calculator (add, subtract)
Full calculator (add, subtract, multiply, divide)
Create a user account (collects info)
Create a task with priority
Delete a file (requires confirmation)
Deploy to environment (requires approval)
Duplicate tool names: 'search' defined twice (tools #6 and #8 with different descriptions) and 'supabase_select_live' defined twice (tools #15 and #16 identical). LLMs will not know which variant to invoke, leading to tool selection errors.
NO OUTPUT SCHEMAS DOCUMENTED for any of the 19 tools. Tool descriptions do not specify what fields or structure are returned. LLMs cannot plan multi-step workflows or extract required data for downstream tool calls. Every tool description must include 'Returns: <field list and types>'.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2025-06-18+ | v2 |
| 2026-03-09 | C | 60 | 1.25.0+ | v1 |
Echo a message
Greet someone
Ping the server
Power operation
Register a person
Admin: reset server state
Experimental semantic search
Search with typed output
Set log level
Query Supabase REST API directly using the configured secret key.
Execute a Supabase REST query using the configured service role key.
Execute a Supabase REST query using the configured service role key.
Unconstrained enum parameters: 'operation' in calc_basic and calc_full tools is a free-form string with no enum constraint. LLMs will guess at valid values ('add', '+', 'plus', 'addition') causing failures. Both should declare 'enum': ['add', 'subtract'] or ['add', 'subtract', 'multiply', 'divide'].
High-risk tools lack confirmation/dry-run mechanisms: 'reset' (IRREVERSIBLE), 'delete_file' (DESTRUCTIVE), and 'deploy' (IRREVERSIBLE) have descriptions mentioning confirmation but no schema-level support (no dry_run param, no confirmation_required field). Agents can invoke these without approval. Implement pattern:confirmation-request with explicit confirmation tools or multi-step approval.
Minimal tool descriptions: 'ping' (12 chars), 'echo' (12 chars), 'add' (12 chars) fall below the 20-char floor and do not guide LLM selection. Tool descriptions must answer: WHAT does it do? WHEN to use it? WHAT does it return? Example: 'add' should be 'Add two integers and return the sum. Use for arithmetic calculations requiring exact integer results.' (~80 chars).
Deprecated tool present: 'ping' tool (tool #7) is removed from the MCP 2026-07-28 spec. Servers should not expose this tool. Remove it entirely.
Generic verb naming reduces clarity: 'search' tool name lacks an object, should be 'search_documents', 'search_users', or domain-specific name. Generic 'search' conflicts with multiple similar tools and leaves LLM guessing scope.
No error handling guidance in any tool description. Tools like 'supabase_query' and 'create_account' do not document what errors can occur or how LLM should recover. Example: 'supabase_query' should state: 'If table not found, returns error with available tables. If auth fails, check that service role key is configured.'