io.github.cyanheads/eu-parliament-mcp-server
Track European Parliament procedures, MEPs, votes, documents, speeches, and questions.
ماذا يمكنك أن تفعل مع io.github.cyanheads/eu-parliament-mcp-server؟
- 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 operation deadline covering acquisition and queue waits
- Complete-roster name filtering and separate paging for procedure evidence, membership history, decision summaries, and voters
- Source URLs, actual language labels, normalized filters, exact totals when available, and continuation guidance
- Missing fields retain their uncertainty; published zero values, absent arrays, and historical affiliations remain distinct
- Matching data on
content[]andstructuredContent, with usable source links and typed error reasons
التثبيت
أضف هذا إلى إعدادات MCP في عميلك (Claude Desktop: claude_desktop_config.json، وCursor: .cursor/mcp.json، ويستخدم VS Code وغيره الصيغة نفسها «mcpServers»).
claude mcp add --transport http eu-parliament-mcp-server 'https://eu-parliament.caseyjhand.com/mcp'
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "http",
"url": "https://eu-parliament.caseyjhand.com/mcp"
}
}
}
@cyanheads/eu-parliament-mcp-serverclaude mcp add eu-parliament-mcp-server -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/eu-parliament-mcp-server@0.1.2
{
"mcpServers": {
"eu-parliament-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/eu-parliament-mcp-server@0.1.2"
],
"env": {
"MCP_LOG_LEVEL": "info"
}
}
}
}
متغيرات البيئة
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
@cyanheads/eu-parliament-mcp-serverclaude mcp add eu-parliament-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/eu-parliament-mcp-server@0.1.2
{
"mcpServers": {
"eu-parliament-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/eu-parliament-mcp-server@0.1.2"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info"
}
}
}
}
متغيرات البيئة
MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
التوثيق
مأخوذ من ملف README للمشروع على GitHub ويُحدَّث أسبوعيًا. تفتح الروابط على GitHub.
المحتويات
@cyanheads/eu-parliament-mcp-server
Track European Parliament procedures, MEPs, votes, documents, speeches, and questions via MCP. STDIO or Streamable HTTP.
9 Tools
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 or a local Streamable HTTP server. No API key is required.
Tools
| Tool | Description |
|---|---|
euparl_list_reference | Discover filter codes, identifier formats, coverage, committees, and political groups |
euparl_list_procedures | List procedure references by type |
euparl_get_procedure | Read procedure identity, stage, events, participants, and document references |
euparl_search_documents | Search adopted texts, list committee/plenary documents, or retrieve any canonical document |
euparl_search_speeches | Search tenth-term speech activities and retrieve metadata and recording-document links |
euparl_search_meps | Find MEPs across a complete current or selected-term roster |
euparl_get_mep | Read member identity and published membership history |
euparl_get_plenary_votes | Discover sittings, inspect decisions, and page recorded or intended voters |
euparl_list_questions | List questions by year/type or retrieve a question and answer references |
Capability reference
All list tools accept offset (default 0), limit (default 20, accepted 1–1000, effective maximum 100 with notice), and language (default en, one of the 24 EU language codes). Follow page.next_offset; for local collections, also pass the returned page.snapshot. A snapshot_changed error requires restarting at offset 0 without a snapshot. Local snapshots detect changes on a fresh lookup; they do not retain historical data.
Localized text includes its actual source language; fallback is disclosed and text is never translated. Missing detail normally returns found: false; empty lists succeed with guidance. Rich decision lookup uses decision_not_found instead.
euparl_list_reference tool
- Required
topic:committees,political_groups,procedure_types,document_types,question_types,activity_types,mep_filters,identifiers, orcoverage - Committees and political groups are live corporate bodies; organization identifiers do not imply accepted filter codes. Reference pages need no snapshot
euparl_list_procedures tool
- Optional
process_typefromeuparl_list_reference; no keyword, year, committee, or stage filter - Sparse 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 URI section: "overview"returns scalar metadata and collection counts;events,participants, anddocumentspage one collection using snapshots- Historical participant groups stay historical. Follow document IDs with
euparl_search_documentsin get mode
euparl_search_documents tool
mode: "search"defaults tosource: "adopted_texts"; only that family acceptstext,title, sitting dates, andrelated_process_id. Adopted texts accept year and term; committee accepts term, plenary accepts yearwork_typeuses family-specific codes fromeuparl_list_reference. Committee/plenary discovery has no keyword filtermode: "get"requiresdocument_idand rejects source, search filters, and nondefault paging. IDs from procedures, speeches, votes, questions, and answers all use this same lookup- Detail includes metadata, procedure/parent references, and every source-file link in the selected language. Follow
parent_document_idswhen a subdivision lacks files; document bodies are not downloaded or extracted
euparl_search_speeches tool
- Search by
text,title,person_id,activity_type, or sitting-date range; coverage is limited to parliamentary term 10 mode: "get"requiresspeech_idand rejects search filters and nondefault paging- Returns 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_filters name_containsmatches every normalized token across the complete roster before paging, ignoring case, diacritics, and punctuation- Results 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 URI- Default
section: "overview"returns identity andmembership_count;section: "memberships"pages published history with snapshots - Missing membership end dates do not establish current membership
euparl_get_plenary_votes tool
mode: "sittings"requiresyear; defaultdecisionsrequiressitting_idand pages compact summaries. Sitting IDs accept a realYYYY-MM-DDdate,MTG-PL-form, known event prefix, or public URImode: "decision"requires sitting and decision IDs and returns one rich record with whole labels, commentary, and document references; it rejects paging and snapshotsmode: "voters"also requiresposition:favor,against,abstention,intended_favor,intended_against, orintended_abstention. Decisions and voter positions page independently with snapshotsresolve_names: trueis voters-only and requiresroster_term(0–10); unresolved IDs remain in output. Names come from that published term roster, with no voting-date affiliations- Published tallies remain separate from voter-array counts.
available: falsemeans an array was absent; published empty arrays haveavailable: true. Intended corrections never replace recorded votes
euparl_list_questions tool
- Default
mode: "list"acceptsyearandwork_type; no keyword, author, or addressee search mode: "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 searches the full citation year and requires one exact match- Get 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 operation deadline covering acquisition and queue waits
- Complete-roster name filtering and separate paging for procedure evidence, membership history, decision summaries, and voters
Agent-friendly output:
- Source URLs, actual language labels, normalized filters, exact totals when available, and continuation guidance
- Missing fields retain their uncertainty; published zero values, absent arrays, and historical affiliations remain distinct
- Matching data on
content[]andstructuredContent, with usable source links and typed error reasons
Data source: European Parliament Open Data, licensed under CC BY 4.0. This server normalizes identifiers and record structure. Parliament records do not establish enacted-law completeness or a member's lifetime voting history.
Getting started
Self-Hosted / Local
Add the following to your MCP client configuration file.
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/eu-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/eu-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/eu-parliament-mcp-server:latest"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- No API key or upstream account is required.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/eu-parliament-mcp-server.git
- Navigate into the directory:
cd eu-parliament-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env to override framework settings as needed
Configuration
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_HOST | HTTP listen host. | 127.0.0.1 |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry. | false |
No server-specific environment variables are required. See .env.example for common framework overrides.
Running the server
Local 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:stdio - Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
| Directory | Purpose |
|---|---|
src/mcp-server/tools/definitions | Nine read-only tool definitions (*.tool.ts). |
src/mcp-server/tools/utils | Shared schemas, lossless rendering, and enrichment. |
src/services/eu-parliament | JSON-LD client, edge schemas, reference codes, normalization, and domain workflows. |
tests/ | Unit and integration tests, mirroring the src/ structure. |
docs/ | 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 logic - Use
ctx.logfor logging,ctx.statefor storage - Register new tools and resources in the
createApp()arrays insrc/index.ts - Wrap 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 test
License
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
الأسئلة الشائعة
ما هو io.github.cyanheads/eu-parliament-mcp-server؟
Track European Parliament procedures, MEPs, votes, documents, speeches, and questions.
كيف أثبّت io.github.cyanheads/eu-parliament-mcp-server؟
يعمل كخادم بعيد. في Claude Code: claude mcp add --transport http eu-parliament-mcp-server 'https://eu-parliament.caseyjhand.com/mcp'. وفي العملاء الآخرين، الصق إعداد JSON من هذه الصفحة في إعدادات MCP الخاصة بهم.
هل يحتاج io.github.cyanheads/eu-parliament-mcp-server إلى مفتاح API؟
لا يذكر إدراجه في السجل أي مفتاح أو سر إلزامي. قد تتطلب بعض الميزات حسابًا لدى الخدمة التي يتصل بها.
هل io.github.cyanheads/eu-parliament-mcp-server مفتوح المصدر؟
نعم. شيفرته متاحة على GitHub بترخيص Apache-2.0.
من يصون io.github.cyanheads/eu-parliament-mcp-server؟
ينشره cyanheads. يدرجه AI.tn لكنه لا يصونه ولا يوصي به.
من سجل MCP الرسمي. الإدراج ليس توصية: راجع شيفرة الخادم وصلاحياته قبل منحه الوصول إلى بياناتك.