Security-first library for building Model Context Protocol servers with database adapters and tool execution boundaries.
BytePro MCP Core demonstrates solid naming conventions and comprehensive security-focused descriptions, but suffers from incomplete schema visibility, missing parameter descriptions on some tools, and lack of explicit output schema documentation. Of 4 tools evaluated: list_tables and describe_table have minimal input requirements but lack documented output schemas; query_read has good parameter descriptions but no output schema defined; add_customer has the most detailed parameter schemas with validation constraints. The codebase shows strong security architecture (auditLog, capability enforcement, quota management) but this is implementation-level, tool definitions themselves lack the clarity expected for production LLM agents. No tool annotations (readOnlyHint, destructiveHint, idempotentHint) are present despite risk classifications being tracked internally.
Insert a new customer record into the Sakila database. Requires write capability (TOOL_INVOKE on add_customer). Blocked in read-only mode. Only operates on sakila.customer table. All inputs are validated and parameterized (SQL injection safe). Foreign key constraints are enforced by MySQL (address_id must exist).
Get detailed schema information for a specific table
List all available tables in the connected database
Execute a read-only SQL query against the database
Output schemas not documented for any tool. Tools return results but LLMs cannot plan downstream calls or extract field values without knowing the response structure.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are missing from all tool definitions. Risk classifications exist in code (READ_ONLY, WRITE) but are not exposed to the client via annotations.
Discovery tools (list_tables, describe_table) lack guidance on when to call them. No description explains that list_tables should be called first to see available tables before calling describe_table on a specific table.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 49 | - | v1 |
Parameter 'table' in describe_table is not constrained. No minimum/maximum length, no regex pattern, no enum of valid tables. This invites hallucinated table names from LLMs.
Error handling guidance missing from all tool descriptions. No hint to LLMs on how to recover from 'table not found' or 'query failed' errors. Users see raw errors from the executeToolBoundary code path.
add_customer is the only tool that modifies state (WRITE risk), but there is no mention of confirmation/dry-run capability. Agents should be warned this is irreversible.
query_read's 'params' parameter lacks specificity. Is it positional (array of values in order) or named (object)? Array of what type (strings, numbers, any)? Database driver (MySQL, PostgreSQL, MSSQL) affects parameterization syntax.