MCP server that exposes tools for classifying health inspection violations against the FDA Food Code and searching regulation PDFs stored in a Google Cloud Storage bucket.
Montana Food Code server has 4 tools with clear action verbs (list_, classify_, lookup_, search_) and reasonable descriptions (100-200 chars). However, critical gaps undermine production readiness: (1) All tools lack explicit input schemas in the visible code, parameters are documented in docstrings but not registered as JSON Schema objects with type/description pairs. (2) Output schemas are completely undocumented, callers cannot predict response structure. (3) Error handling is minimal; tools return free-text strings rather than structured errors with recovery guidance. (4) No pagination support despite search_regulations claiming 'up to 5 results', no limit/offset params. (5) Parameter descriptions exist but lack format constraints (e.g., code format '3-501.16' is mentioned in description but not enforced). Naming is solid (verb_noun pattern), but schema and output documentation are missing entirely.
Classify a health inspection violation by risk level and category. Uses the built-in FDA Food Code table — works even without PDFs loaded.
List regulation PDFs currently stored in the GCS bucket.
Look up a specific violation code in the regulation PDFs, with built-in table fallback. Searches GCS-hosted PDFs for the exact code text, then falls back to the built-in FDA Food Code classification table if no PDF match is found.
Full-text search across all regulation PDFs in the GCS bucket. Returns up to 5 matching page excerpts. Requires PDFs to be present in the bucket.
No input schemas visible in code. Tools use Python function signatures with docstring annotations, but FastMCP registration does not show explicit JSON Schema objects with type/description for each parameter.
Output schemas completely undocumented. All tools return free-text strings (e.g., 'return "..."'). LLMs cannot predict response structure, field names, or types. Violates pattern:response-shaper and pattern:tool.
Error handling returns unstructured text without recovery guidance. E.g., 'Could not classify code' does not tell LLM whether to retry, ask user, or try a different tool. Violates pattern:recovery-guide.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 43 | 2026-07-28+ | v2 |
search_regulations claims 'up to 5 results' but has no limit/offset parameters. Cannot paginate large result sets. Violates pattern:paginated-result.
Parameter format constraints mentioned in descriptions but not enforced. E.g., 'code' param described as '3-501.16' format but no regex/pattern validation. LLMs may pass invalid codes. Violates pattern:constrained-input.