# io.github.cyanheads/eu-parliament-mcp-server (remote · eu-parliament.caseyjhand.com)

Track European Parliament procedures, MEPs, votes, documents, speeches, and questions.

- Trust score: 74/100 (medium)
- Change this week: +1
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `eu-parliament.caseyjhand.com`: 74/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament.md), [page](https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament)
- npm · `@cyanheads/eu-parliament-mcp-server`: 39/100, [markdown](https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/cyanheads-eu-parliament-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/cyanheads-eu-parliament-mcp-server)

## Channel facts

- Endpoint: `https://eu-parliament.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.2.2`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 70/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4685 tokens (~468/item across 10 items; 9 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability check failed: schema churn in the 10 days we've observed: 0 tool removals, 9 breaking changes, 0 auth/transport breaks, 0 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 9 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the io.github.cyanheads/eu-parliament-mcp-server server?

io.github.cyanheads/eu-parliament-mcp-server is a hosted endpoint at https://eu-parliament.caseyjhand.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http cyanheads-eu-parliament-mcp-server 'https://eu-parliament.caseyjhand.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "cyanheads-eu-parliament-mcp-server": {
      "url": "https://eu-parliament.caseyjhand.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "cyanheads-eu-parliament-mcp-server": {
      "type": "http",
      "url": "https://eu-parliament.caseyjhand.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.cyanheads-eu-parliament-mcp-server]
url = "https://eu-parliament.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-eu-parliament-mcp-server": {
      "type": "remote",
      "url": "https://eu-parliament.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-eu-parliament-mcp-server --url 'https://eu-parliament.caseyjhand.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-eu-parliament-mcp-server:
    url: "https://eu-parliament.caseyjhand.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "cyanheads-eu-parliament-mcp-server": {
      "Transport": "http",
      "Url": "https://eu-parliament.caseyjhand.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add cyanheads-eu-parliament-mcp-server -t streamable-http -u 'https://eu-parliament.caseyjhand.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-eu-parliament-mcp-server": {
      "type": "http",
      "url": "https://eu-parliament.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 74, 0)

- [security] Tool “euparl_get_plenary_votes” rewrote its description, which is the text the model reads
- [security] Tool “euparl_search_speeches” rewrote its description, which is the text the model reads
- [security] Tool “euparl_search_documents” rewrote its description, which is the text the model reads
- [security] Tool “euparl_list_reference” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 420 → 468
- [functional] Server version: 0.2.1 → 0.2.2
- [cosmetic] “euparl_get_plenary_votes” added an optional parameter “label_contains”
- [cosmetic] “euparl_get_mep” reworded the description of “limit”
- [cosmetic] “euparl_get_plenary_votes” reworded the description of “limit”
- [cosmetic] “euparl_get_plenary_votes” reworded the description of “mep_id”
- [cosmetic] “euparl_search_speeches” reworded the description of “limit”
- [cosmetic] “euparl_search_meps” reworded the description of “limit”
- [cosmetic] “euparl_search_documents” reworded the description of “limit”
- [cosmetic] “euparl_list_reference” reworded the description of “limit”
- [cosmetic] “euparl_list_questions” reworded the description of “question_id”
- [cosmetic] “euparl_list_questions” reworded the description of “limit”
- [cosmetic] “euparl_list_procedures” reworded the description of “limit”
- [cosmetic] “euparl_get_procedure” reworded the description of “limit”

### 2026-11-03 (score 74, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “euparl_get_plenary_votes” rewrote its description, which is the text the model reads
- [security] Tool “euparl_list_reference” rewrote its description, which is the text the model reads
- [security] Tool “euparl_list_procedures” rewrote its description, which is the text the model reads
- [security] Tool “euparl_search_documents” rewrote its description, which is the text the model reads
- [functional] Server version: 0.2.0 → 0.2.1
- [cosmetic] “euparl_get_plenary_votes” added an optional parameter “vote_item_id”
- [cosmetic] “euparl_list_procedures” added an optional parameter “snapshot”
- [cosmetic] “euparl_get_plenary_votes” reworded the description of “document_id”

### 2026-11-01 (score 74, 0)

- [security regression] Stability: 0.17 → fail
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “euparl_list_reference” rewrote its description, which is the text the model reads
- [security] Tool “euparl_search_meps” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 3507 → 3882
- [functional regression] “euparl_get_plenary_votes” changed the type of “limit”: integer → number
- [functional regression] “euparl_get_procedure” changed the type of “limit”: integer → number
- [functional regression] “euparl_list_procedures” changed the type of “limit”: integer → number
- [functional regression] “euparl_list_questions” changed the type of “limit”: integer → number
- [functional regression] “euparl_list_reference” changed the type of “limit”: integer → number
- [functional regression] “euparl_search_documents” changed the type of “limit”: integer → number
- [functional regression] “euparl_search_meps” changed the type of “limit”: integer → number
- [functional regression] “euparl_search_speeches” changed the type of “limit”: integer → number
- [functional regression] “euparl_get_mep” changed the type of “limit”: integer → number
- [functional] First check of Schema quality: 100
- [functional] New resource “eu-parliament-guide”
- [functional] Server version: 0.1.2 → 0.2.0
- [cosmetic] “euparl_search_meps” added an optional parameter “mandate_date”
- [cosmetic] “euparl_search_meps” reworded the description of “limit”
- [cosmetic] “euparl_get_plenary_votes” reworded the description of “limit”
- [cosmetic] “euparl_get_procedure” reworded the description of “limit”
- [cosmetic] “euparl_list_procedures” reworded the description of “limit”
- [cosmetic] “euparl_list_questions” reworded the description of “limit”
- [cosmetic] “euparl_list_questions” reworded the description of “question_id”
- [cosmetic] “euparl_list_reference” reworded the description of “limit”
- [cosmetic] “euparl_search_documents” reworded the description of “limit”
- [cosmetic] “euparl_search_meps” reworded the description of “country”
- [cosmetic] “euparl_search_meps” reworded the description of “name_contains”
- [cosmetic] “euparl_search_meps” reworded the description of “political_group”
- [cosmetic] “euparl_search_meps” reworded the description of “term”
- [cosmetic] “euparl_search_speeches” reworded the description of “limit”
- [cosmetic] “euparl_get_mep” reworded the description of “limit”

### 2026-10-31 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-27 (score 72, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-26 (score 71)

First indexed and scored.

## MCP tools (9)

### `euparl_list_reference` (~349 tokens)

List parliamentary reference data

List parliamentary codes, identifier formats, historical committees and political groups, or coverage limitations. Choose organizations with organization_ids to resolve the organization IDs other tools return, decimal (org/5154) or code (org/IMCO, org/S-D, org/ep-9), into published names and dates; ordered per-item found false means no detail was published, as for a code in the wrong case. Organization lookups page the supplied IDs with an effective maximum of 20 per call; repeat the same ID list with page.next_offset. Live committees and political groups retain historical coverage and an acquisition bound of 1000 per page; static reference topics return the requested count or remaining entries without an output-size cap. These lists do not require snapshots; missing end dates do not establish current status.

Input parameters:

- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Bounded-mode acquisition limits: 1000 reference entries o…
- `offset` (integer): Zero-based collection offset; default 0.
- `organization_ids` (array): Required nonempty list only for organizations; order and duplicates retained, with at most 20 looked up per page.
- `topic` (string, required): Reference topic; organizations requires organization_ids, which other topics reject.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `error` (object): Present when the call failed. Absent on success.
- `items` (array): Whole reference entries on this page.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Whole-item page metadata.
- `shown` (integer): Whole items shown on this partial page.
- `topic` (string): Requested reference topic.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_list_procedures` (~334 tokens)

List parliamentary procedures

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. With process_type, every procedure of that type is listed in procedure_id order: continue with page.next_offset, passing the returned page.snapshot to detect a changed set. Without process_type, at most 10000 results are reachable and Parliament serves pages from two orderings, so pages can repeat or omit procedures; continue with page.next_offset when present, and set process_type for a complete walk.

Input parameters:

- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Bounded-mode acquisition limits: 1000 procedures. Larger…
- `offset` (integer): Zero-based collection offset; default 0.
- `process_type` (string): Optional procedure-type code from euparl_list_reference topic procedure_types; case-insensitive and whitespace-trimmed.
- `snapshot` (string): Returned page.snapshot of a process_type listing; optional at every offset, and a set that changed since fails snapshot_changed. Rejected without process_type.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `error` (object): Present when the call failed. Absent on success.
- `items` (array): Whole sparse procedure records on this page.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Whole-item page metadata.
- `shown` (integer): Whole items shown on this partial page.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_get_procedure` (~304 tokens)

Read a parliamentary procedure

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.

Input parameters:

- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Values above the safe-integer range normalize to 90071992…
- `offset` (integer): Zero-based collection offset; default 0.
- `procedure_id` (string, required): Procedure YYYY-NNNN or YYYY/NNNN, optional letter suffix and (TYPE), known eli/dl/proc/ prefix or exact public procedure URI.
- `section` (string): Default overview returns scalars and counts; choose a collection for complete paged items.
- `snapshot` (string): Previous collection snapshot; required for local offset above 0, optional at offset 0.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `available_sections` (array): Section counts on a found overview only.
- `cap` (integer): Effective whole-item page limit.
- `documents` (array): Selected deduplicated linked-document page sorted by document_id; present only for documents.
- `error` (object): Present when the call failed. Absent on success.
- `events` (array): Selected event page in date order, undated events last and ties by id; present only for the events section.
- `found` (boolean): Whether Parliament published procedure detail.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Selected collection continuation; absent on overview or missing detail.
- `participants` (array): Selected historical participation page in date order, undated participations last and ties by id; present only for participants.
- `procedure_id` (string): Normalized canonical procedure identifier.
- `process_type` (string): Published procedure type.
- `reference` (string): Exact published procedure reference.
- `section` (string): Procedure retrieval section.
- `shown` (integer): Whole items shown on this partial page.
- `source_url` (string): Public procedure source URL.
- `stage` (string): Published current procedure stage.
- `title` (object): Published procedure title in the actual selected language.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_search_documents` (~642 tokens)

Search parliamentary documents

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. Detail procedure_ids also read the procedure an adopted text, plenary or committee document publishes on its family record; adopted and based-on 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. Non-keyword adopted texts use doc-id:asc and aligned 100-row upstream pages independently of caller limit. Keyword searches retain relevance order and can repeat or omit records across pages. Adopted texts expose at most 10000 search results; continue with page.next_offset when present, otherwise narrow supported filters.

Input parameters:

- `document_id` (string): Get-only canonical work ID, eli/dl/doc/ prefix or exact public URI; no family restriction.
- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Bounded-mode acquisition limits: 1000 documents, 10000 adopted texts, or 1000 keyword adopted texts. Larger bounded-mode limits normalize with a notice. Values abov…
- `mode` (string): Default search discovers records; get requires document_id and rejects source and all search filters.
- `offset` (integer): Zero-based collection offset; default 0.
- `related_process_id` (string): Adopted-texts-only procedure reference YYYY-NNNN, YYYY/NNNN(TYPE), known prefix or public URI.
- `sitting_date` (string): Adopted-texts-only sitting date YYYY-MM-DD; start of range when sitting_date_end is supplied.
- `sitting_date_end` (string): Adopted-texts-only inclusive range end YYYY-MM-DD; requires sitting_date and must not precede it.
- `source` (string): Search-only family; omitted search defaults to adopted_texts. Omit entirely in get mode.
- `term` (integer): Parliamentary term 0–10; adopted_texts and committee search only.
- `text` (string): Adopted-texts-only keyword search in the requested language.
- `title` (string): Adopted-texts-only title search in the requested language.
- `work_type` (string): Search-only family-specific code from euparl_list_reference topic document_types; case-insensitive and whitespace-trimmed.
- `year` (integer): Four-digit document year; adopted_texts and plenary search only.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `document` (object): Present only when get finds published detail.
- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): Get-only publication result; false for missing or empty detail.
- `items` (array): Whole sparse records on a search page; absent in get mode.
- `mode` (string): Executed retrieval mode.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Search continuation metadata; absent in get mode.
- `shown` (integer): Whole items shown on this partial page.
- `source` (string): Effective family in search mode; absent in generic get.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_search_speeches` (~487 tokens)

Search parliamentary speeches

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. Non-keyword lists use sitting-date:asc,numbering:asc and aligned 100-row upstream pages independently of caller limit. Keyword searches retain relevance order and can repeat or omit records across pages. Search exposes at most 10000 results; continue with page.next_offset when present, otherwise narrow text, title, person_id, activity_type or sitting dates.

Input parameters:

- `activity_type` (string): Search-only code from euparl_list_reference topic activity_types; case-insensitive and whitespace-trimmed.
- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Bounded-mode acquisition limits: 10000 speeches or 1000 keyword speeches. Larger bounded-mode limits normalize with a notice. Values above the safe-integer range no…
- `mode` (string): Default search discovers speech activities; get requires speech_id and rejects search filters.
- `offset` (integer): Zero-based collection offset; default 0.
- `person_id` (string): Search-only numeric MEP identifier, person/ prefix or exact public person URI.
- `sitting_date` (string): Search-only sitting date YYYY-MM-DD; start date when a range end is supplied.
- `sitting_date_end` (string): Search-only inclusive end date YYYY-MM-DD; requires sitting_date and cannot precede it.
- `speech_id` (string): Get-only canonical activity ID, eli/dl/event/ prefix or exact public URI.
- `term`: Search-only parliamentary term 9 or 10; omitted search defaults to 10. Omit in get mode.
- `text` (string): Search-only keywords in the selected language; matching does not guarantee transcript output.
- `title` (string): Search-only published activity title keywords in the selected language.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): Get-only publication result; false for missing or empty detail.
- `items` (array): Whole speech activity records on the search page; absent in get mode.
- `mode` (string): Executed speech retrieval mode.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Search continuation metadata; absent in get mode.
- `shown` (integer): Whole items shown on this partial page.
- `speech` (object): Published activity detail when get succeeds.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_search_meps` (~563 tokens)

Find members of the European Parliament

Find MEPs by name, country, political group, gender, parliamentary term, or mandate date. Omitting term and mandate_date selects members in office today; term selects that published term roster; mandate_date selects members seated on that date. Name matching requires every normalized token after case, diacritic, and punctuation normalization over the complete roster before paging. Country and group are published for the selected roster, never inferred for another date. 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.

Input parameters:

- `country` (string): Supported ISO alpha-2 country code, case-insensitive. United Kingdom members are published as GB (UK accepted), on historical rosters only. See euparl_list_reference topic mep_filters.
- `gender` (string): Supported gender code FEMALE, MALE, NAP, NKN, or NST, case-insensitive.
- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Values above the safe-integer range normalize to 90071992…
- `mandate_date` (string): Members holding a seat on this YYYY-MM-DD date, not after today (UTC); exclusive with term. Country and group are matched and returned as published on that date. A term's first sitting day can return…
- `name_contains` (string): All-token name filter over the complete selected roster; case, diacritics, and punctuation are normalized, without fuzzy scoring. Must keep at least one letter or digit.
- `offset` (integer): Zero-based collection offset; default 0.
- `political_group` (string): 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 ide…
- `snapshot` (string): Returned roster snapshot; required for offset above 0, optional at offset 0.
- `term` (integer): Parliamentary term 0–10, exclusive with mandate_date; omitting both selects members in office today.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `error` (object): Present when the call failed. Absent on success.
- `items` (array): Complete member records on the selected local page.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Whole-item page metadata.
- `shown` (integer): Whole items shown on this partial page.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_get_mep` (~272 tokens)

Read a member and membership history

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.

Input parameters:

- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Values above the safe-integer range normalize to 90071992…
- `mep_id` (string, required): Decimal person ID, person/ prefix, or exact https://data.europarl.europa.eu/person/ URI.
- `offset` (integer): Zero-based collection offset; default 0.
- `section` (string): Default overview returns identity and membership count; memberships returns the selected history page.
- `snapshot` (string): Returned membership snapshot; required for membership offset above 0, optional at offset 0.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `citizenship` (string): Published citizenship; distinct from country of representation.
- `error` (object): Present when the call failed. Absent on success.
- `family_name` (string): Published family name.
- `found` (boolean): Whether Parliament published member detail.
- `given_name` (string): Published given name.
- `membership_count` (integer): Parsed membership count on a found overview; absent relations do not prove no membership history.
- `memberships` (array): Selected membership history page; present only on a found memberships response.
- `mep_id` (string): Normalized decimal person identifier.
- `name` (string): Published full name.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Membership continuation metadata; absent on overview or missing detail.
- `place_of_birth` (string): Published place of birth, never inferred from citizenship.
- `section` (string): Identity overview or separately paged membership history.
- `shown` (integer): Whole items shown on this partial page.
- `source_url` (string): Public member source URL.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

### `euparl_get_plenary_votes` (~896 tokens)

Explore plenary sittings, decisions, and voters

Discover sittings with mode sittings and year; default decisions pages compact summaries with labels, separate decided-on, part-of and recording document relations, and vote items for sitting_id. Decisions and voters return the requested whole-item count or remaining rows without an output-size cap. Optional decisions-only label_contains selects a literal selected-language label substring, ignoring case, repeated whitespace and dash style without altering published text or establishing a final vote. Optional document_id filters decisions before paging by exact document identity or hyphen-boundary descendant; optional vote_item_id, such as a procedure's PLENARY_VOTE_RESULTS event, selects every decision of that vote item. Mode decision requires decision_id and returns one rich record with reference text and commentary; it rejects nondefault paging and snapshot. Optional decisions or decision 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.

Input parameters:

- `decision_id` (string): 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` (string): Decisions-only document filter: canonical ID, eli/dl/doc/ prefix or exact public URI. Matches decided-on, part-of or recording relations by exact ID or hyphen-boundary descendant before paging.
- `label_contains` (string): Decisions-only literal substring of the selected-language label, ignoring case, repeated whitespace and dash style; combines with document_id and vote_item_id before paging. Matching text does not es…
- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Whole-acquired local collections return the requested count or remaining rows, without an output-size cap. Bounded-mode acquisition limits: 1000 sittings. Larger bo…
- `mep_id` (string): Decisions or decision 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.
- `mode` (string): Default decisions returns compact summaries; sittings discovers by year, decision returns one rich record, voters pages one position.
- `offset` (integer): Zero-based collection offset; default 0.
- `position` (string): Required only for voters: favor, against, abstention, intended_favor, intended_against, or intended_abstention.
- `resolve_names` (boolean): Default false retains IDs only; true is voters-only and requires roster_term for complete names-only roster resolution.
- `roster_term` (integer): Explicit parliamentary term 0–10 containing the sitting; required with resolve_names true, forbidden otherwise. No term is inferred from dates.
- `sitting_id` (string): Required outside sittings: real YYYY-MM-DD date, MTG-PL-YYYY-MM-DD, known event prefix, or exact public event URI.
- `snapshot` (string): Returned decisions or voter-position snapshot; required for local offset above 0, optional at offset 0; forbidden for sittings and decision.
- `vote_item_id` (string): Decisions-only vote item filter: canonical MTG-PL-YYYY-MM-DD-VOT-ITM- ID, eli/dl/event/ prefix or exact public event URI, such as a procedure's PLENARY_VOTE_RESULTS event or a returned vote_item_ids…
- `year` (integer): Four-digit year, required only for sittings and forbidden in other modes.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `decision` (object): Complete selected rich decision, present only in decision mode.
- `decision_id` (string): Normalized selected decision identifier; present in decision and voters modes.
- `decisions` (array): Compact whole-decision page with selected-language labels, separate decided-on, part-of and recording document relations, and vote items.
- `error` (object): Present when the call failed. Absent on success.
- `mode` (string): Sitting discovery, compact decision page, one rich decision, or one voter-position page.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): Selected sitting, compact decision, or voter-position page; absent for a rich decision. Local pages retain the requested count or remaining rows without a character budget; next_offset resumes at the…
- `position` (string): Selected recorded or intended position in voters mode.
- `shown` (integer): Whole items shown on this partial page.
- `sitting_id` (string): Normalized selected sitting identifier; absent in sitting discovery.
- `sittings` (array): Sitting discovery page, present only in sittings mode.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.
- `voter_resolution` (object): Names-only provenance and complete-position resolution counts; names do not prove spelling or affiliation on the voting date.
- `voters` (array): Independent page for one recorded or intended position, preserving published ID order.

### `euparl_list_questions` (~398 tokens)

List parliamentary questions

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.

Input parameters:

- `language` (string): Supported EU ISO-639-1 language, case-insensitive; default en; source text is never translated.
- `limit` (number): Whole items requested; default 20. Bounded-mode acquisition limits: 1000 questions. Larger bounded-mode limits normalize with a notice. Values above the safe-integer range normalize to 90071992547409…
- `mode` (string): Default list discovers questions; get requires question_id and forbids year and work_type.
- `offset` (integer): Zero-based collection offset; default 0.
- `question_id` (string): Get-only canonical E-{term}-{year}-{sequence}, known document prefix/public URI, or human E-sequence/YYYY citation; E/P/O/G/K prefixes are case-insensitive and one-to-six-digit sequences are padded t…
- `term` (integer): 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.
- `work_type` (string): List-only question code from euparl_list_reference topic question_types; case-insensitive and whitespace-trimmed.
- `year` (integer): List-only four-digit question year.

Output parameters:

- `appliedFilters` (object): Actual normalized retrieval scope and filters.
- `available` (boolean): Whether the selected source array was published, including a published empty array.
- `cap` (integer): Effective whole-item page limit.
- `error` (object): Present when the call failed. Absent on success.
- `found` (boolean): Get-only result; false only after complete citation resolution or missing published detail.
- `items` (array): Whole sparse records on a list page; absent in get mode.
- `mode` (string): Executed question retrieval mode.
- `notice` (string): Publication, language fallback, empty-result or continuation guidance.
- `page` (object): List continuation metadata; absent in get mode.
- `question` (object): Question detail present only when a published record is found.
- `shown` (integer): Whole items shown on this partial page.
- `totalCount` (integer): Exact count only when published or computed over a complete collection.
- `truncated` (boolean): True when this page returns only part of the selected collection.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament#diagnostics

## Score history

- 2026-11-05: 74
- 2026-11-04: 74
- 2026-11-03: 74
- 2026-11-02: 74
- 2026-11-01: 74
- 2026-10-31: 74
- 2026-10-30: 73
- 2026-10-29: 73
- 2026-10-28: 72
- 2026-10-27: 72
- 2026-10-26: 71

## Common questions

### What is the io.github.cyanheads/eu-parliament-mcp-server server?

io.github.cyanheads/eu-parliament-mcp-server is listed in the public MCP registry as io.github.cyanheads/eu-parliament-mcp-server. Track European Parliament procedures, MEPs, votes, documents, speeches, and questions. This page covers its hosted endpoint (https://eu-parliament.caseyjhand.com/mcp).

### Is the io.github.cyanheads/eu-parliament-mcp-server server safe to use?

io.github.cyanheads/eu-parliament-mcp-server scores 74 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.cyanheads/eu-parliament-mcp-server server expose?

io.github.cyanheads/eu-parliament-mcp-server exposes 9 tools: euparl_list_reference, euparl_list_procedures, euparl_get_procedure, euparl_search_documents, euparl_search_speeches, and 4 more. Their descriptions and schemas cost roughly 4,245 tokens of context every time the server is loaded.

### Does the io.github.cyanheads/eu-parliament-mcp-server server require authentication?

No. We connected to io.github.cyanheads/eu-parliament-mcp-server without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the io.github.cyanheads/eu-parliament-mcp-server server still maintained?

io.github.cyanheads/eu-parliament-mcp-server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://eu-parliament.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/eu-parliament-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-eu-parliament-mcp-server/eu-parliament
