eu-parliament-mcp-server
Server Details
Track European Parliament procedures, MEPs, votes, documents, speeches, and questions.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/eu-parliament-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/eu-parliament-mcp-server
TDQS
Scored across 9 tools
Each tool has a distinct primary resource/action: MEPs, plenary votes, procedures, questions, reference lookups, documents, and speeches. The get/list/search split is clear, though the multi-mode tools (especially euparl_get_plenary_votes and euparl_search_documents) and the shared euparl_list_reference utility create some surface overlap.
All nine tools consistently use the euparl_ prefix followed by a snake_case verb_noun pattern. The verbs are predictable and reflect the intended operation type.
Nine tools is well scoped for a read-only EU Parliament API covering multiple resource families. Each tool earns its place without excessive fragmentation.
The surface covers the core read-only domain: MEPs, plenary votes, procedures, questions, documents, speeches, and reference data. Gaps are minor, such as no dedicated committee or plenary agenda tool, but most workflows can be assembled from existing tools.
Available Tools
9 toolseuparl_get_mepRead a member and membership historyARead-onlyIdempotentInspect
Read an MEP identity or membership history including published committee, delegation, and political-group records. Default section overview returns identity and membership_count; section memberships pages full membership records. Missing end dates do not establish current membership. Continue memberships with page.next_offset and snapshot; restart at offset 0 without snapshot after snapshot_changed. Missing detail succeeds with found false; discover IDs with euparl_search_meps.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| mep_id | Yes | Decimal person ID, person/ prefix, or exact https://data.europarl.europa.eu/person/ URI. | |
| offset | No | Zero-based collection offset; default 0. | |
| section | No | Default overview returns identity and membership count; memberships returns the selected history page. | overview |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| snapshot | No | Returned membership snapshot; required for membership offset above 0, optional at offset 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| name | No | Published full name. |
| page | No | Membership continuation metadata; absent on overview or missing detail. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether Parliament published member detail. |
| shown | No | Whole items shown on this partial page. |
| mep_id | No | Normalized decimal person identifier. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| section | No | Identity overview or separately paged membership history. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| given_name | No | Published given name. |
| source_url | No | Public member source URL. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| citizenship | No | Published citizenship; distinct from country of representation. |
| family_name | No | Published family name. |
| memberships | No | Selected membership history page; present only on a found memberships response. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
| place_of_birth | No | Published place of birth, never inferred from citizenship. |
| membership_count | No | Parsed membership count on a found overview; absent relations do not prove no membership history. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses that missing end dates do not imply current membership, that a missing detail returns success with found=false, and how snapshot_changed invalidates pagination state. These are non-obvious semantics an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and section behavior, then pagination, then failure/discovery semantics — a sensible order with no filler. Some sentences are very compressed (e.g. 'Missing detail succeeds with found false'), which slightly taxes parsing without wasting space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return shapes need not be explained, and the description still covers the operationally risky parts: mode selection, pagination continuation and invalidation, and the found=false failure mode. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning: the section switch between overview and memberships, and the coupling of snapshot to offset (required above 0, restart at 0 without snapshot after snapshot_changed). It does not restate limit/language syntax, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (read MEP identity or membership history) and enumerates exactly what is covered: committee, delegation, and political-group records. It also distinguishes itself from the sibling lookup tool by pointing to euparl_search_meps for ID discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly routes between the two modes (default overview for identity/count, memberships for the paged history) and names euparl_search_meps as the way to obtain an ID. It lacks an explicit 'when not to use this' clause, but the alternatives and conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_get_plenary_votesExplore plenary sittings, decisions, and votersARead-onlyIdempotentInspect
Discover sittings with mode sittings and year; default decisions pages compact summaries with labels and separate decided-on and recording document relations for sitting_id. Optional document_id filters decisions before paging by exact document identity or hyphen-boundary descendant. Mode decision requires decision_id and returns one rich record with reference text and commentary; it rejects nondefault paging and snapshot. Optional decision-only mep_id returns independent recorded and intended positions with publication availability, without a roster lookup; empty positions do not prove absence from the vote. Mode voters requires decision_id and one position, paging recorded and intended voters independently. Missing arrays succeed with available false; published empty arrays have available true. Optional resolve_names requires explicit roster_term and joins only published names from that complete term roster, never voting-date affiliations or current-roster substitutes. Some IDs may remain unresolved. Continue local decisions or voters with page.next_offset and snapshot; restart at offset 0 without snapshot after snapshot_changed. Missing sitting decisions succeed empty; absent selected decision fails decision_not_found.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default decisions returns compact summaries; sittings discovers by year, decision returns one rich record, voters pages one position. | decisions |
| year | No | Four-digit year, required only for sittings and forbidden in other modes. | |
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| mep_id | No | Decision-only member lookup: canonical numeric ID, person/ prefix or exact public person URI. Uses published arrays without a roster join; empty positions do not prove absence from the vote. | |
| offset | No | Zero-based collection offset; default 0. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| position | No | Required only for voters: favor, against, abstention, intended_favor, intended_against, or intended_abstention. | |
| snapshot | No | Returned decisions or voter-position snapshot; required for local offset above 0, optional at offset 0; forbidden for sittings and decision. | |
| sitting_id | No | Required outside sittings: real YYYY-MM-DD date, MTG-PL-YYYY-MM-DD, known event prefix, or exact public event URI. | |
| decision_id | No | Required for decision and voters: exact returned canonical decision ID, known eli/dl/event/ prefix, or exact public event URI; forbidden for sittings and decisions. | |
| document_id | No | Decisions-only document filter: canonical ID, eli/dl/doc/ prefix or exact public URI. Matches decided-on or recording relations by exact ID or hyphen-boundary descendant before paging. | |
| roster_term | No | Explicit parliamentary term 0–10 containing the sitting; required with resolve_names true, forbidden otherwise. No term is inferred from dates. | |
| resolve_names | No | Default false retains IDs only; true is voters-only and requires roster_term for complete names-only roster resolution. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| mode | No | Sitting discovery, compact decision page, one rich decision, or one voter-position page. |
| page | No | Selected sitting, compact decision, or voter-position page; absent for a rich decision. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| voters | No | Independent page for one recorded or intended position, preserving published ID order. |
| decision | No | Complete selected rich decision, present only in decision mode. |
| position | No | Selected recorded or intended position in voters mode. |
| sittings | No | Sitting discovery page, present only in sittings mode. |
| available | No | Whether the selected source array was published, including a published empty array. |
| decisions | No | Compact whole-decision page with selected-language labels and separate decided-on and recording document relations. |
| truncated | No | True when this page returns only part of the selected collection. |
| sitting_id | No | Normalized selected sitting identifier; absent in sitting discovery. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| decision_id | No | Normalized selected decision identifier; present in decision and voters modes. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
| voter_resolution | No | Names-only provenance and complete-position resolution counts; names do not prove spelling or affiliation on the voting date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/idempotent; the description adds substantive behavior well beyond that: available=false vs available=true semantics for missing vs published-empty arrays, snapshot_changed handling, decision_not_found on absent decisions, and that IDs may remain unresolved. This is exactly the safety and state-contract context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
There is almost no wasted clause, but the entire definition is one dense semicolon-chained run with no sentence or bullet structure, and it leads with the non-default sittings mode before revealing that decisions is the default. Content density is justified; readability is not.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, four-mode tool this is unusually complete: input requirements per mode, paging/snapshot lifecycle, error outcomes (decision_not_found, snapshot_changed), and availability semantics are all covered, and an output schema exists so return shape need not be restated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description still adds meaning beyond the schema: mep_id returning independent recorded and intended positions 'without a roster lookup' and the caveat that empty positions do not prove absence from the vote, plus document_id descendant matching before paging. The resolve_names/roster_term relationship is reinforced rather than newly explained, keeping it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resources precisely (sittings, decisions, voters) and specifies a verb per mode, and it is clearly the plenary-vote tool among siblings like euparl_get_mep and euparl_search_documents. It never explicitly states what it is not or names a sibling, and it opens with the least-common mode (sittings) in a way that can momentarily obscure that 'decisions' is the default.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use per mode: 'Mode decision requires decision_id', 'Mode voters requires decision_id and one position', 'sittings with mode sittings and year'. It also states hard exclusions (rejects nondefault paging and snapshot for decision mode) and the resume strategy (page.next_offset with snapshot, restart at 0 after snapshot_changed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_get_procedureRead a parliamentary procedureARead-onlyIdempotentInspect
Read a procedure title, stage, events, participants, or linked parliamentary documents. Default section overview returns scalar fields and collection counts; events, participants, and documents page one selected collection. Continue with page.next_offset and the returned snapshot; restart at offset 0 without snapshot if the collection changes. Historical participation groups remain historical. Missing detail succeeds with found false; discover references with euparl_list_procedures. Linked documents can be read with euparl_search_documents mode get; files are linked, not parsed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| offset | No | Zero-based collection offset; default 0. | |
| section | No | Default overview returns scalars and counts; choose a collection for complete paged items. | overview |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| snapshot | No | Previous collection snapshot; required for local offset above 0, optional at offset 0. | |
| procedure_id | Yes | Procedure YYYY-NNNN or YYYY/NNNN, optional letter suffix and (TYPE), known eli/dl/proc/ prefix or exact public procedure URI. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| page | No | Selected collection continuation; absent on overview or missing detail. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Whether Parliament published procedure detail. |
| shown | No | Whole items shown on this partial page. |
| stage | No | Published current procedure stage. |
| title | No | Published procedure title in the actual selected language. |
| events | No | Selected event page, present only for the events section. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| section | No | Procedure retrieval section. |
| available | No | Whether the selected source array was published, including a published empty array. |
| documents | No | Selected deduplicated linked-document page, present only for documents. |
| reference | No | Exact published procedure reference. |
| truncated | No | True when this page returns only part of the selected collection. |
| source_url | No | Public procedure source URL. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| participants | No | Selected historical participation page, present only for participants. |
| procedure_id | No | Normalized canonical procedure identifier. |
| process_type | No | Published procedure type. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
| available_sections | No | Section counts on a found overview only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations it discloses the paging contract and snapshot coupling, that missing detail returns found false rather than erroring, that historical participation groups stay historical, and that linked files are linked rather than parsed. These are non-obvious behaviors an agent could not infer from annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then paging, then error/alternative handling – a logical order for a six-parameter read tool. The semicolon-chained, telegraphic phrasing (e.g. "Historical participation groups remain historical") is compact but occasionally terse enough to slow parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs: sectioning, paging invariants, missing-detail behavior, and sibling routing. Return shape need not be described because an output schema exists, and the readOnly annotations already carry the safety profile.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds real meaning: the snapshot/offset relationship across a single selected collection and the overview-versus-section tradeoff between scalars and complete paged items. It does not explain the local-versus-returned page limits or the language fallback beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the exact sub-resources readable (title, stage, events, participants, documents), mapping directly onto the section enum. It also names the sibling it is not (euparl_list_procedures for discovery), so an agent can choose between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains the default overview versus selecting a collection section, how to continue paging (page.next_offset plus the returned snapshot), and the reset rule (offset 0 without snapshot when the collection changes). It also routes to euparl_list_procedures for reference discovery and euparl_search_documents mode get for linked documents.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_list_proceduresList parliamentary proceduresARead-onlyIdempotentInspect
List procedure references by procedure type. Titles, stages, and participants require euparl_get_procedure with a returned procedure_id. Use euparl_list_reference topic procedure_types for supported process_type codes. No keyword, year, committee, or stage filter is available. Search exposes at most 10000 results; continue with page.next_offset when present, otherwise narrow process_type.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| offset | No | Zero-based collection offset; default 0. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| process_type | No | Optional procedure-type code from euparl_list_reference topic procedure_types; case-insensitive and whitespace-trimmed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| page | No | Whole-item page metadata. |
| error | No | Present when the call failed. Absent on success. |
| items | No | Whole sparse procedure records on this page. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world behavior, so the bar is lower, and the description still adds real operational context: a 10000-result exposure cap plus 'continue with page.next_offset when present, otherwise narrow process_type'. That is a concrete pagination and narrowing strategy an agent could not infer from the annotations. It stops short of describing record shape, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each load-bearing, with the core purpose front-loaded and pagination last. Slightly dense telegraphic phrasing ('Search exposes...') but no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered list tool with a 100%-documented schema, an output schema, and safety annotations already in place, the description covers the remaining gaps an agent needs: what is returned, how to get detail, how to resolve codes, what filters are unavailable, and how to page past the cap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so limit, offset, language, and process_type are already fully documented, including the 100 effective maximum. The description reinforces process_type's dependency on the reference lookup and rules out filter parameters that do not exist, but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list procedure references) and immediately scopes it: it returns references only, not titles/stages/participants. It explicitly names euparl_get_procedure as the tool that yields the richer record, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use euparl_get_procedure with a returned procedure_id for detail, and euparl_list_reference topic procedure_types for valid codes. It also lists what this tool cannot do (no keyword, year, committee, or stage filter), which prevents wasted calls more effectively than a positive description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_list_questionsList parliamentary questionsARead-onlyIdempotentInspect
List parliamentary questions by year and work_type or retrieve metadata, source-file links and published answers with mode get and question_id. Human citations such as E-000001/2025 retain their full year; omission of term checks canonical candidates for every overlapping parliamentary term and requires one verified match. Supply term to disambiguate; canonical IDs resolve directly. Use euparl_list_reference topic question_types for work_type codes. No keyword, author or addressee search is available. Empty answers means no answer relation was published in this response. Get rejects list filters and nondefault paging; continue lists with page.next_offset.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default list discovers questions; get requires question_id and forbids year and work_type. | list |
| term | No | Get-only term 0–10 to disambiguate a human citation; must agree with a canonical ID. Omit to verify candidates for every term overlapping the citation year. | |
| year | No | List-only four-digit question year. | |
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| offset | No | Zero-based collection offset; default 0. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| work_type | No | List-only question code from euparl_list_reference topic question_types; case-insensitive and whitespace-trimmed. | |
| question_id | No | Get-only canonical E-{term}-{year}-{six-digit-sequence}, known document prefix/public URI, or human E-NNNNNN/YYYY citation; corresponding P/O prefixes are accepted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| mode | No | Executed question retrieval mode. |
| page | No | List continuation metadata; absent in get mode. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Get-only result; false only after complete citation resolution or missing published detail. |
| items | No | Whole sparse records on a list page; absent in get mode. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| question | No | Question detail present only when a published record is found. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish read-only/idempotent/open-world behavior, and the description adds substantial context beyond that: get rejects list filters and nondefault paging, empty answers mean no answer relation was published, term omission triggers candidate verification and requires exactly one match, and canonical IDs resolve directly. These are precisely the operational quirks an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the main capabilities and then layers constraints without wasted words. It is dense and mostly earns its sentences, though the single-paragraph format makes some mode-specific rules harder to scan than a short bulleted split would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema and rich annotations, the description covers the remaining gaps: dual-mode behavior, pagination continuation, disambiguation rules, supported work_type lookup, and the absence of keyword/author search. Nothing essential for calling this 8-parameter, two-mode tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter in detail. The description adds some workflow nuance (human citation format, term disambiguation, page.next_offset) but does not add much parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (parliamentary questions), the two operations (list by year/work_type, get by question_id), and the extra payloads available in get mode (metadata, source-file links, published answers). It also explicitly rules out keyword/author/addressee search, which distinguishes it from search-oriented siblings without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit mode selection rules: default list discovers questions; get requires question_id and forbids year/work_type. It routes the agent to euparl_list_reference for work_type codes and explains how to continue pagination with page.next_offset. It also covers the term-disambiguation workflow and when to supply term versus omitting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_list_referenceList parliamentary reference dataARead-onlyIdempotentInspect
List parliamentary codes, identifier formats, historical committees and political groups, or coverage limitations. Choose organizations with organization_ids to resolve supported membership organization IDs into published names and dates; ordered per-item found false means no detail was published. Organization lookups page the supplied IDs with an effective maximum of 20 per call; repeat the same ID list with page.next_offset. Other topics retain historical coverage and an effective maximum of 100. These lists do not require snapshots; missing end dates do not establish current status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Whole items requested; default 20, effective maximum 20 for organizations or 100 for other topics, with notice. | |
| topic | Yes | Reference topic; organizations requires organization_ids, which other topics reject. | |
| offset | No | Zero-based collection offset; default 0. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| organization_ids | No | Required nonempty list only for organizations; order and duplicates retained, with at most 20 looked up per page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| page | No | Whole-item page metadata. |
| error | No | Present when the call failed. Absent on success. |
| items | No | Whole reference entries on this page. |
| shown | No | Whole items shown on this partial page. |
| topic | No | Requested reference topic. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, openWorld), and the description adds real behavioral detail on top: an effective page cap of 20 for organizations versus 100 for other topics, the repeat-with-page.next_offset paging recipe, the meaning of found=false on ordered items, and the caveat that absent end dates do not imply current status. The snapshot remark is opaque without prior context and is the one weak disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The resource enumeration is correctly front-loaded, but the remaining sentences are compressed to the point of ambiguity — 'Choose organizations with organization_ids' reads awkwardly and the closing 'do not require snapshots' clause is cryptic. Information density is high with little padding, yet parse effort is higher than it should be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description closes the remaining behavioral gaps: paging, per-topic caps, the organizations special case, and the interpretation of missing data. An agent can invoke this correctly from the definition alone, bar the unexplained snapshot reference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description mainly restates what the schema already declares (organization_ids required for organizations, 20-per-page cap, page.next_offset). It does add the operational note that the same ID list must be re-supplied across pages while order and duplicates are retained, but that is largely duplicative of the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('List') and enumerates the concrete resource families covered: codes, identifier formats, historical committees/political groups, coverage limitations. That is far more informative than the title, though it never names how it differs from the sibling get_/list_ tools that return actual parliamentary entities rather than reference data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear conditional rule — use the organizations topic together with organization_ids to resolve IDs into names and dates, and it implies other topics take no IDs. What is missing is any explicit statement of when an agent should reach for this reference tool instead of euparl_list_procedures or euparl_search_documents, so the routing guidance is contextual rather than comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_search_documentsSearch parliamentary documentsARead-onlyIdempotentInspect
Search adopted texts, committee documents, or plenary documents, then retrieve metadata and source-file links with mode get and document_id. Get accepts IDs from procedures, speeches, votes, questions and answers without a source family; parent_document_ids lead from subdivisions to parent files. Detail preserves adopted_document_ids, based_on_document_ids and public_register_ref; follow published document relations with mode get, while preserving ordinary missing-record and upstream-error outcomes for unavailable targets. Document relations never imply procedure links. Only adopted_texts supports text, title, sitting dates and related_process_id. Committee supports term but no year; plenary supports year but no term. Use euparl_list_reference topic document_types for family-specific work_type codes. Detail returns links, not extracted full text. Adopted texts expose at most 10000 search results; continue with page.next_offset when present, otherwise narrow supported filters.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default search discovers records; get requires document_id and rejects source and all search filters. | search |
| term | No | Parliamentary term 0–10; adopted_texts and committee search only. | |
| text | No | Adopted-texts-only keyword search in the requested language. | |
| year | No | Four-digit document year; adopted_texts and plenary search only. | |
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| title | No | Adopted-texts-only title search in the requested language. | |
| offset | No | Zero-based collection offset; default 0. | |
| source | No | Search-only family; omitted search defaults to adopted_texts. Omit entirely in get mode. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| work_type | No | Search-only family-specific code from euparl_list_reference topic document_types; case-insensitive and whitespace-trimmed. | |
| document_id | No | Get-only canonical work ID, eli/dl/doc/ prefix or exact public URI; no family restriction. | |
| sitting_date | No | Adopted-texts-only sitting date YYYY-MM-DD; start of range when sitting_date_end is supplied. | |
| sitting_date_end | No | Adopted-texts-only inclusive range end YYYY-MM-DD; requires sitting_date and must not precede it. | |
| related_process_id | No | Adopted-texts-only procedure reference YYYY-NNNN, YYYY/NNNN(TYPE), known prefix or public URI. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| mode | No | Executed retrieval mode. |
| page | No | Search continuation metadata; absent in get mode. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Get-only publication result; false for missing or empty detail. |
| items | No | Whole sparse records on a search page; absent in get mode. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| source | No | Effective family in search mode; absent in generic get. |
| document | No | Present only when get finds published detail. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnly/openWorld/idempotent annotations, the description discloses important behavior: get returns links rather than extracted full text, detail preserves specific ID fields, unrelated missing-record and upstream-error outcomes remain ordinary, and document relations never imply procedure links. It also states the 10,000-result cap and page.next_offset continuation rule.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loads purpose and mode behavior, and almost every sentence carries operational information. Some clauses are compressed to the point of being cryptic, notably the detail/relations sentence, but there is little obvious filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, two-mode tool with rich schema coverage, an output schema, and safety annotations, the description covers the essential decision points: mode choice, family-specific filters, work_type lookup, pagination limits, detail output nature, and non-procedure relation semantics. Remaining gaps are minor and largely covered by structured fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning beyond the schema: text/title/sitting_date/related_process_id are adopted-texts-only, committee supports term but not year, plenary supports year but not term, and get mode rejects source and all search filters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource set: searching adopted texts, committee documents, or plenary documents, and retrieving metadata/source links via get mode. It clearly separates search from get and names the document families, though it does not explicitly contrast itself with sibling tools such as euparl_search_speeches or euparl_get_procedure.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives strong mode guidance: search discovers records, get requires document_id and rejects source plus search filters. It also states which filters apply to which families (adopted_texts/committee/plenary) and points to euparl_list_reference for work_type codes, leaving only sibling-level alternatives implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_search_mepsFind members of the European ParliamentARead-onlyIdempotentInspect
Find MEPs by name, country, political group, gender, or parliamentary term. Omitted term selects members in office today; explicit term selects that published term roster. Name matching requires every normalized token after case, diacritic, and punctuation normalization over the complete roster before paging. Country and group describe roster context, never voting-date affiliation. Continue with page.next_offset and snapshot; restart at offset 0 without snapshot after snapshot_changed. Read identity and membership history with euparl_get_mep. Empty matches succeed with guidance.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | Parliamentary term 0–10; omitted selects members in office today. | |
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| gender | No | Supported gender code FEMALE, MALE, NAP, NKN, or NST, case-insensitive. | |
| offset | No | Zero-based collection offset; default 0. | |
| country | No | Supported ISO alpha-2 country code, case-insensitive; GB maps to historical UK and does not establish current membership. See euparl_list_reference topic mep_filters. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| snapshot | No | Returned roster snapshot; required for offset above 0, optional at offset 0. | |
| name_contains | No | All-token name filter over the complete selected roster; case, diacritics, and punctuation are normalized, without fuzzy scoring. | |
| political_group | No | Supported political group code, case-insensitive; accepts EPP, S&D, Verts/ALE, Greens/EFA, The Left, GUE/NGL, Renew, PfE, and Patriots aliases. Query aliases never rewrite historical organization identities. See euparl_list_reference topic mep_filters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| page | No | Whole-item page metadata. |
| error | No | Present when the call failed. Absent on success. |
| items | No | Complete member records on the selected local page. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses important operational behavior: snapshot-based paging, restart behavior after snapshot_changed, complete-roster name matching before paging, and empty-match success with guidance. It also clarifies that country and group are roster context, not voting-date affiliation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded and purpose-first, with no wasted filler. Each clause carries operational meaning relevant to a nine-parameter search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nine parameters, existing output schema, and safe read-only annotations, the description covers the remaining decision-relevant behavior: filtering scope, term semantics, pagination/snapshot handling, empty results, and when to use the detail sibling. Nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters and the baseline is 3. The description adds useful semantic context around term omission, name-token normalization, roster-context filtering, and snapshot continuation, though it does not add meaning for every parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a clear verb-resource pair, 'Find MEPs', and lists the supported filters, making the tool's purpose immediately identifiable. It also distinguishes the lookup role from the detail-oriented sibling by saying to read identity and membership history with euparl_get_mep.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains how term omission versus explicit term selection behaves, how name matching works, and how country/group filters should be interpreted. It also directs agents to the appropriate sibling for identity/history and gives a clear rule for pagination continuation versus restart after a snapshot change.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
euparl_search_speechesSearch parliamentary speechesARead-onlyIdempotentInspect
Search speech activities in parliamentary term 9 or 10, default 10, or retrieve one with mode get and speech_id. Text and title search return activity metadata, not transcripts. Follow document_ids with euparl_search_documents mode get and any returned parent_document_ids to source files. Use euparl_list_reference topic activity_types for activity_type codes. Get rejects search filters and nondefault paging. Search exposes at most 10000 results; continue with page.next_offset when present, otherwise narrow text, title, person_id, activity_type or sitting dates.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Default search discovers speech activities; get requires speech_id and rejects search filters. | search |
| term | No | Search-only parliamentary term 9 or 10; omitted search defaults to 10. Omit in get mode. | |
| text | No | Search-only keywords in the selected language; matching does not guarantee transcript output. | |
| limit | No | Whole items requested; default 20, effective maximum 100 with notice. | |
| title | No | Search-only published activity title keywords in the selected language. | |
| offset | No | Zero-based collection offset; default 0. | |
| language | No | Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated. | |
| person_id | No | Search-only numeric MEP identifier, person/ prefix or exact public person URI. | |
| speech_id | No | Get-only canonical activity ID, eli/dl/event/ prefix or exact public URI. | |
| sitting_date | No | Search-only sitting date YYYY-MM-DD; start date when a range end is supplied. | |
| activity_type | No | Search-only code from euparl_list_reference topic activity_types; case-insensitive and whitespace-trimmed. | |
| sitting_date_end | No | Search-only inclusive end date YYYY-MM-DD; requires sitting_date and cannot precede it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Effective whole-item page limit. |
| mode | No | Executed speech retrieval mode. |
| page | No | Search continuation metadata; absent in get mode. |
| error | No | Present when the call failed. Absent on success. |
| found | No | Get-only publication result; false for missing or empty detail. |
| items | No | Whole speech activity records on the search page; absent in get mode. |
| shown | No | Whole items shown on this partial page. |
| notice | No | Publication, language fallback, empty-result or continuation guidance. |
| speech | No | Published activity detail when get succeeds. |
| available | No | Whether the selected source array was published, including a published empty array. |
| truncated | No | True when this page returns only part of the selected collection. |
| totalCount | No | Exact count only when published or computed over a complete collection. |
| appliedFilters | No | Actual normalized retrieval scope and filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and open-world behavior. The description adds valuable context beyond that: it discloses that get mode rejects search filters and nondefault paging, that search exposes at most 10000 results, and that pagination should continue with page.next_offset when present. These are concrete behavioral traits an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and mode distinction. Every sentence carries useful information, though it is somewhat dense and could be slightly more concise. Overall structure is logical and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 12 parameters, two modes, pagination, and the existence of an output schema, the description covers everything an agent needs: mode behavior, defaults, result limits, how to continue pagination, and where to find related data (documents, reference codes). No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters in detail. The description mentions some parameter names (term, speech_id, text, title, person_id, activity_type, sitting_date) but adds little beyond what the schema provides. The inter-parameter constraints it mentions (e.g., get rejects search filters, sitting_date_end requires sitting_date) are also covered in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (search) and resource (speech activities), scopes it to parliamentary terms 9 or 10, and distinguishes it from sibling tools by naming euparl_search_documents and euparl_list_reference. It also clarifies that text and title search return activity metadata, not transcripts, which further differentiates from document search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly describes when to use search mode versus get mode with speech_id, and directs the agent to euparl_search_documents for source files and euparl_list_reference for activity_type codes. It also gives pagination guidance (continue with page.next_offset when present, otherwise narrow filters). No explicit exclusions are given, but the alternatives and conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
- First observed
euparl_get_mep - First observed
euparl_get_plenary_votes - First observed
euparl_get_procedure - First observed
euparl_list_procedures - First observed
euparl_list_questions - First observed
euparl_list_reference - First observed
euparl_search_documents - First observed
euparl_search_meps - First observed
euparl_search_speeches
Related MCP Connectors
European Parliament roll-call votes, MEP records and dossiers from official records.
Track Canadian federal bills, MPs, House votes, and Hansard speeches.
Monitor EU policy across both law-making institutions
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to European Parliament open data, enabling queries about MEPs, plenary documents, and session calendar.5 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables querying UK Parliament data including MPs, Lords, bills, Hansard debates, and divisions.6 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides live, source-linked transparency data on German MPs, including roll-call voting, side jobs, committee memberships, and election programs, via the Abgeordnetenwatch API. No API key required.AGPL 3.0
- AlicenseAqualityDmaintenanceProvides access to live UK Parliament data including bills, votes, MP profiles, and financial interests without requiring an API key. It enables users to track parliamentary rebellions, search petitions, and cross-reference voting records with declared financial interests.53 npm9MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.