Enterprise-grade MCP server with approval workflows, audit logging, multi-database support, and REST API integration for controlled tool execution
Server has 4 tools with basic schemas and descriptions, but significant gaps prevent production use. All tools have descriptions (10-100 chars, mostly adequate), and input schemas are present with type definitions. However, output schemas are completely undocumented, LLMs cannot plan downstream calls or extract results. Error handling is minimal; no recovery guidance. SQL tools lack critical security details (e.g., what happens on injection attempts). call_api lacks response structure documentation. No tool annotations (readOnlyHint, destructiveHint). Naming is clear (verb_noun pattern), but parameter descriptions are sparse. Average tool score: 42/100.
Make HTTP requests to whitelisted external APIs with domain validation
Get column definitions and metadata for a specific table
Execute a read-only SQL SELECT query against a database with optional limit parameter
List all tables in a database schema with row counts
No output schemas documented for any tool. LLMs cannot infer result structure, forcing them to guess field names and types. This breaks tool chaining and wastes tokens on clarification.
execute_query lacks error guidance. SQL parsing validation exists (_is_read_only_statement), but errors are not documented. LLMs don't know what to do if a query fails, retry, reformulate, or ask user?
call_api response truncation (MAX_RESPONSE_BYTES=100k) is not documented in the tool description. LLMs may not realize responses are capped and could misinterpret truncated JSON or HTML.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). All 4 tools are read-only, but this is not declared in the tool definition, LLMs must infer safety from descriptions alone.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Parameter descriptions are minimal. 'db_name' is described as 'Optional database name from registered_databases table', LLMs don't know if they should pass a name, ID, or connection string, or how to discover valid values.