MCP server for natural language queries against CDS db-layer entities. Targets raw db/schema.cds entities via cds.run() with real SQL JOINs — bring your own LLM (Anthropic, OpenAI, or any OpenAI-compatible endpoint).
Two tools with well-structured schemas and comprehensive descriptions. natural_language_query has excellent parameter documentation (question, allowed_entities, blocked_columns, max_rows, offset) with type constraints and clear purpose. list_entities is minimal but functional. Both tools are READ_ONLY and properly scoped. Descriptions exceed 100 chars and explain WHAT/WHEN/WHY. However, output schemas are not explicitly documented in the tool definitions, only input schemas are visible. Error handling guidance is present in descriptions but not formalized in error response patterns. Tool composition is sound (discovery → query pattern). No security issues detected (no secrets in params, server-side config injection via env vars).
List all queryable CDS db-layer entities, their columns, and available associations. Use this to explore the schema before querying.
Query CDS db-layer entities using natural language. Targets raw db/schema.cds entities via cds.run() — NOT OData service entities. Uses CDS association path expressions for real SQL JOINs (scales to billions of rows). Returns an array of matching rows. Note: bypasses CAP service-layer authorization — ensure MCP_ALLOWED_ENTITIES is set for production.
Output schemas not documented. natural_language_query returns 'array of matching rows' but structure of row objects is not specified. list_entities returns entities/columns/associations but exact field names and types are absent from tool definition.
list_entities has minimal description (under 100 chars). Does not explain when to call it relative to natural_language_query, what structure it reveals, or how to use results for query planning.
Error handling is mentioned in descriptions ('bypasses CAP service-layer authorization') but no formal error response patterns or recovery guidance documented. LLM cannot distinguish retryable vs fatal errors.
natural_language_query description includes security caveat about MCP_ALLOWED_ENTITIES but does not explain what happens if query violates restrictions (error? silent filtering?). Ambiguous error behavior.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
max_rows parameter has hard cap of 10000 but description does not explain server-side MCP_MAX_ROWS override behavior or what happens if LLM requests more. Undocumented parameter dependency.