MCP server exposing Israeli Knesset parliamentary data including members, bills, committees, votes, laws, and cross-entity search capabilities
This Knesset Data API MCP server demonstrates solid engineering with well-structured tool definitions, comprehensive parameter schemas, and thoughtful descriptions. All 12 tools are clearly registered with input schemas and descriptions. The naming convention is consistent (verb_noun: search_*, get_*), and parameter descriptions are generally detailed. However, output schemas are not explicitly documented in the source code (only inferred from return types), and error handling lacks recovery guidance. The server uses fastmcp with Streamable HTTP transport and stateless mode, showing good protocol awareness. Pagination is properly supported across search tools with page/page_size parameters. Main gaps: (1) output schemas not formally specified in tool definitions, (2) no tool annotations (readOnlyHint/destructiveHint), (3) error responses likely lack actionable recovery guidance, (4) no documented dependency hints between related tools.
Get detailed information about a specific bill including initiators, documents, stages, and related laws
Get detailed information about a specific committee including members, sessions, and agenda items
Get detailed information about a specific law including related bills and secondary laws
Get detailed information about a specific Knesset member including roles, positions, committees, and related data
Get server metadata including current Knesset number, last data sync time, and available enumeration values for filters
Get detailed information about a specific vote including individual member voting records
Cross-entity search across bills, members, committees, votes, laws, and other entities with a single query
Output schemas not formally documented in tool definitions. While input schemas are complete with types and descriptions, the return value structure is not documented for LLMs. Pattern:tool-description requires documenting what the tool returns so agents can plan downstream calls and extract correct fields.
Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are absent. All 12 tools are read-only, which should be explicitly declared via readOnlyHint=true in tool metadata. This helps LLMs reason about safety and side effects. Per spec 2026-07-28, tool annotations are a current best practice for clarity.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 69 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 59 | - | v1 |
Search bills by name, status, initiators, and dates with fuzzy matching
Search Knesset committees by name, type, and dates
Search Israeli laws by name, status, and dates
Search Knesset members by name, role, committee, party, and dates
Search plenum votes by subject, title, member voting pattern, and dates
Error handling lacks actionable recovery guidance. The source code shows rate limiting and response size validation (_validate_size, RateLimitMiddleware) but no evidence of structured error responses that guide LLM recovery. Pattern:recovery-guide requires errors to suggest next steps (e.g., 'Try search_bills() first' when a get_bill_details fails with 404).
Dependency hints missing between related tools. For example, search_across and individual search_* tools have an implied workflow, but descriptions do not document when to prefer one over the other. Pattern:tool-chain requires that tool descriptions include hints like 'Call search_bills() first if you only know a partial name' to guide multi-step planning.
Enum values are queried dynamically at startup (enum_sql in _query_startup_metadata) but not exposed in tool parameter schemas as formal enum constraints. The actual valid values exist (status, role_type) but the tool definition likely relies on free-form strings. Pattern:constrained-input requires declaring enums so LLMs pick from valid options without hallucinating.