An MCP server whose search tool takes an OpenPredicate filter as its input schema. Demonstrates how OpenPredicate integrates with MCP tools for JSON-encoded, SQL-flavored predicates.
OpenPredicate MCP Server demonstrates strong definition quality with one well-designed tool. The search_pets tool has a descriptive name, a comprehensive description (245 chars), and a properly structured input schema with inline filter schema and documented limit parameter. The tool description clearly explains what it does, when to use it, and what to expect. However, the server provides no documented output schema, no error handling guidance, and no tool annotations (readOnlyHint, destructiveHint). The filter schema validation is implemented server-side with error reporting, but the response format is not formally documented for the LLM. The tool is READ_ONLY by declaration but lacks proper schema annotations. With only one tool, strengths are concentrated but scope is minimal.
Search the pet collection. The `filter` argument is a predicate over a pet record; its schema describes every operator and every queryable field, including which values each field accepts. Returns the matching records. An invalid filter comes back as an error naming the offending clause, which is enough to correct it and retry.
No documented output schema. The tool returns 'matching records' but the LLM has no formal specification of field names, types, or structure. This violates pattern:tool (schema documentation) and forces LLMs to infer structure from examples.
Missing tool annotations. The tool is READ_ONLY and idempotent (search never modifies state), but inputSchema lacks readOnlyHint or idempotentHint annotations. Current spec (2026-07-28) defines these annotations; omitting them prevents clients from understanding tool semantics.
Error handling lacks recovery guidance. The code detects invalid filters and reports pointer + problem type, but server.mjs does not show LLM-facing error response format. Per pattern:recovery-guide, errors should tell the LLM what to do next (e.g., 'Invalid field: try these queryable paths instead').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2025-06-18+ | v2 |
Limit parameter lacks guidance on default behavior. The limit defaults to 20 with max 50, but the description does not explain pagination strategy, whether results are truncated, or how to request the next page.