GDPR-compliant, auditable MCP server for PostgreSQL with anonymisation layer, read-only enforcement, and immutable audit logging
Single tool 'query_anonymized_customer_data' has well-structured JSON Schema with proper type definitions, constraints (minLength, maxLength, pattern, min/max), and clear descriptions for all parameters. Tool description is comprehensive (180+ chars) and explains the anonymization guarantee and row-limit enforcement. However, output schema is not documented in the source, the tool description does not specify what fields are returned or their types. Parameter descriptions are strong (ISO codes, segment enums, limit enforcement), but the tool lacks error handling guidance (what happens on invalid region? database timeout?). No tool annotations (readOnlyHint, idempotentHint) despite READ_ONLY risk classification. Naming is clear and verb-forward ('query_'). Overall solid for a single-tool server, but missing output documentation and error recovery patterns.
Query anonymised customer data filtered by region and optional segment. Returns customer records with PII stripped and row count limited by server-side enforcement.
Output schema not documented. Tool description does not specify what fields are returned (e.g., customer_id, name, email, segment, region) or their types. LLMs cannot plan downstream operations or extract the right data without knowing the response structure.
No error handling guidance. Tool description does not explain what happens on invalid region code, database timeout, or permission denial. LLMs receive raw errors with no recovery path (e.g., 'connection refused' vs 'invalid region code, must be ISO 3166-1 alpha-2').
No tool annotations despite READ_ONLY risk classification. Tool should declare readOnlyHint=true and idempotentHint=true in MCP schema to signal safety to agents. Current implementation relies on implicit trust.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | <=2025-11-25 | v2 |
Segment parameter nullable=true but no guidance on behavior when null. Does null mean 'all segments' or 'no filter'? Description should clarify: 'Omit to return all segments.'
STDIO transport only. Server is not remotely accessible and cannot be used by hosted MCP clients (e.g., Claude.ai, Anthropic Workbench). Limits deployment to local/containerized environments only.