@cyanheads/eu-parliament-mcp-server
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Public Hosted Server: https://eu-parliament.caseyjhand.com/mcp
Overview
European Parliament records from the Open Data API: discover legislative procedures, follow their evidence, find MEPs, inspect plenary decisions and voters, and retrieve document, speech, and question metadata. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above. No API key is required.
Tools
Tool | Description |
| Discover filter codes, identifier formats, coverage, committees, and political groups; resolve organization IDs |
| List procedure references by type |
| Read procedure identity, stage, events, participants, and document references |
| Search adopted texts, list committee/plenary documents, or retrieve any canonical document |
| Search ninth- or tenth-term speech activities and retrieve metadata and recording-document links |
| Find MEPs across a complete current or selected-term roster |
| Read member identity and published membership history |
| Discover sittings, inspect decisions, and page recorded or intended voters |
| List questions by year/type or retrieve a question and answer references |
Related MCP server: congressgov-mcp-server
Capability reference
euparl_list_reference tool
Required
topic:committees,political_groups,organizations,procedure_types,document_types,question_types,activity_types,mep_filters,identifiers, orcoveragecommitteesandpolitical_groupspage Parliament's corporate-body records, historical bodies included; their organization IDs are not filter codes. Published full names and dates are included when availableorganizationsrequiresorganization_ids: decimal IDs,org/prefixes, or exact public organization URIs. Results retain input order and duplicates with per-itemfound; repeat the same IDs withpage.next_offsetfor continuation. At most 20 IDs are looked up per call; reference pages need no snapshot
euparl_list_procedures tool
Optional
process_typefromeuparl_list_reference; no keyword, year, committee, or stage filterSparse rows carry
procedure_id, source URL, and available reference/type; retrieve titles, stages, and participants witheuparl_get_procedure
euparl_get_procedure tool
Required
procedure_idacceptsYYYY-NNNN,YYYY/NNNN(TYPE), an optional letter suffix, the known path prefix, or the exact public procedure URIsection: "overview"returns scalar metadata and collection counts;events,participants, anddocumentspage one collection using snapshotsHistorical participant groups stay historical. Follow document IDs with
euparl_search_documentsin get mode
euparl_search_documents tool
mode: "search"defaults tosource: "adopted_texts", the only family withtext,title, sitting-date, andrelated_process_idfilters; adopted texts takeyearandterm,committeetakesterm,plenarytakesyear.work_typecodes are family-specificmode: "get"takes adocument_idfrom any tool (procedures, speeches, votes, questions, answers) and rejects search filters and pagingDetail returns metadata, procedure and
parent_document_idsreferences, publishedadopted_document_idsandbased_on_document_ids, optionalpublic_register_ref, and every source-file link in the selected language; bodies are linked, not extracted. A published relation does not guarantee its target is available upstream
euparl_search_speeches tool
Search by
text,title,person_id,activity_type, or sitting-date range; optionaltermselects 9 or 10, defaulting to 10mode: "get"requiresspeech_idand rejects search filters and nondefault pagingReturns activity metadata and participants, not transcripts. Follow
document_idsthrough document get and any parent references to source files
euparl_search_meps tool
Omitted
termselects members in office today; explicittermselects a published roster from terms 0–10. Optional country, political-group, and gender codes come frommep_filtersEquivalent query spellings include
EPP,Greens/EFA,GUE/NGL,Patriots, and historical countryGB→UK; published historical group identities remain intactname_containsmatches every normalized token across the complete roster before paging, ignoring case, diacritics, and punctuationResults use snapshot continuation. Country/group describe the selected roster context, not voting-date affiliation
euparl_get_mep tool
mep_idaccepts a decimal person ID,person/prefix, or exact public person URIDefault
section: "overview"returns identity andmembership_count;section: "memberships"pages published history with snapshotsMissing membership end dates do not establish current membership
Resolve supported membership organization IDs through
euparl_list_referencewithtopic: "organizations"
euparl_get_plenary_votes tool
mode: "sittings"takesyear; defaultdecisionstakessitting_id(aYYYY-MM-DDdate orMTG-PL-ID) and pages summaries with labels, tallies, and distinct decided-on/recording document IDs. Optionaldocument_idfilters either relation by exact ID or hyphen-boundary descendant before paging; a procedure event's vote date can select the sittingdecisionaddsdecision_idand returns one rich record with commentary (an ID absent from the sitting failsdecision_not_found). Optionalmep_idreturns separate recorded/intended positions and publication availability without a roster lookup; an empty match does not prove absence from the votemode: "voters"addsposition:favor,against,abstention, or theintended_*corrections, which never replace recorded votes.available: falsemeans the array was not published; a published empty array hasavailable: trueresolve_names: truerequiresroster_term(0–10) and joins names from that term's roster only; unresolved IDs stay in the output
euparl_list_questions tool
Default
mode: "list"acceptsyearandwork_type; no keyword, author, or addressee searchmode: "get"requiresquestion_id: a canonical work ID, known document prefix/public URI, or human citation such asE-000001/2025(also P/O prefixes). Optionaltermresolves a citation directly; omission checks the corresponding mandate, including both candidates in election years, and requires one exact matchGet rejects list filters and nondefault paging. Detail returns metadata, source files, and published answer references; empty
answersdoes not prove the question is unanswered
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
European Parliament-specific:
Keyless access to Parliament's public JSON-LD records, with canonical identifiers linking discovery, detail, and source evidence
Shared request pacing, bounded retries, and one 40-second deadline per call covering every upstream request and queue wait
Shared paging on every list tool:
offset,limit(default 20, effective maximum 100; larger requests up to 1000 are normalized with a notice), andlanguage(defaulten, any of the 24 EU languages). Rosters, procedure sections, memberships, decisions, and voters are acquired whole, then paged locally with apage.snapshotthat continuation must pass back;snapshot_changedmeans restart at offset 0Procedure, speech, and adopted-text searches expose a 10,000-result window. Narrow supported filters when the window ends; a capped upstream total is disclosed as a lower bound, and
has_morecan remain true without a reachablenext_offset
Agent-friendly output:
Provenance on every response: source URLs, the actual language of each text (fallback disclosed, never translated), normalized filter echo, and continuation guidance
Missing data stays distinguishable: detail misses return
found: false, empty lists succeed with guidance, and published zeros, unpublished arrays, and historical affiliations are never conflatedTyped error reasons with recovery hints, and the same data on
content[]andstructuredContent
Data source: European Parliament Open Data, licensed under CC BY 4.0. This server normalizes identifiers and record structure.
Getting started
Connect to the hosted instance, no install:
claude mcp add --transport http eu-parliament-mcp-server https://eu-parliament.caseyjhand.com/mcpOr run it locally:
claude mcp add eu-parliament-mcp-server -- npx -y @cyanheads/eu-parliament-mcp-serverFor other clients, add this to the MCP config file:
{
"mcpServers": {
"eu-parliament-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/eu-parliament-mcp-server"]
}
}
}For Docker or a source build, see Running the server.
Configuration
Variable | Description | Default |
| Transport: |
|
| HTTP listen host. |
|
| HTTP server port. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
No server-specific environment variables are required. See .env.example for common framework overrides.
Running the server
Requires Bun v1.4.0 or higher (or Node.js v24+). No API key or upstream account is required.
git clone https://github.com/cyanheads/eu-parliament-mcp-server.git
cd eu-parliament-mcp-server && bun install
cp .env.example .envLocal development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/eu-parliament-mcp-server:latestThe image defaults to HTTP transport, stateless sessions, and logs to /var/log/eu-parliament-mcp-server. For stdio clients, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/eu-parliament-mcp-server:latest"]. Build locally with docker build -t eu-parliament-mcp-server .; OpenTelemetry peers install by default, or use --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
| Nine read-only tool definitions ( |
| Shared schemas, lossless rendering, and enrichment. |
| JSON-LD client, edge schemas, reference codes, normalization, and domain workflows. |
| Unit and integration tests, mirroring the |
| Design contracts and generated project tree. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.statefor storageRegister new tools and resources in the
createApp()arrays insrc/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
This server cannot be deployed
Maintenance
Related MCP Connectors
Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.
Query SEC EDGAR filings, XBRL financials, and company data via MCP. STDIO or Streamable HTTP.
Search MPs and Lords, fetch profiles, synopses, and Westminster constituencies
Official EUR-Lex, UK, US, and gazette search, metadata fetch, and change-only watches.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to European Parliament open data, enabling queries about MEPs, plenary documents, and session calendar.381 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables access to U.S. congressional data including bills, laws, members, committees, votes, nominations, CRS reports, and the Congressional Record through MCP, with stdio and Streamable HTTP support.381 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables tracking of Canadian federal parliamentary records by searching bills, members, House divisions, and indexed Hansard speeches, then retrieving detailed dossiers, profiles, tallies, and full speech text from official public sources. Runs over STDIO or Streamable HTTP with no API key required.589 npm1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables searching and retrieving Swedish Riksdag open data — parliamentary documents, committee reports, consolidated SFS statutes, speeches, main votes, and member records — through seven tools, with paginated full text and continuation support. Runs keyless over STDIO or Streamable HTTP and includes dated reference tables for document types, committees, parties, constituencies, and sessions.616 npm1Apache 2.0