by Hack23
Provides AI assistants with structured, type‑safe access to European Parliament open datasets—including MEP profiles, plenary sessions, committees, legislative documents, and parliamentary questions—through a secure Node.js server implementation.
It implements the Model Context Protocol to expose the full suite of European Parliament Open Data API v2 endpoints as typed MCP tools. The server aggregates, validates, caches, and rate‑limits requests, then returns clean JSON structures that can be consumed by Claude Desktop, VS Code, Cursor, GitHub Copilot, or any MCP‑aware client.
npx -y european-parliament-mcp-server
npx command. Example for Claude Desktop:
{
"mcpServers": {
"european-parliament": {
"command": "npx",
"args": ["-y", "european-parliament-mcp-server"],
"env": { "EP_API_KEY": "<YOUR_API_KEY>" }
}
}
}
get_meps, assess_mep_influence, analyze_coalition_dynamics). The server handles Zod validation, caching, and audit‑logging automatically.Q: Do I need an API key?
A: The European Parliament Open Data API is publicly accessible, but an EP_API_KEY can be supplied to increase rate limits or access optional endpoints.
Q: Can I run the server behind a firewall?
A: Yes. The server only makes outbound HTTPS calls to data.europarl.europa.eu; configure outbound proxy settings if required.
Q: How does caching work? A: Responses are cached in an in‑memory LRU store (500 entries, 15‑minute TTL). Identical requests hit the cache instantly.
Q: What languages are supported for client output? A: The server returns pure JSON; any language that can parse JSON can consume the data.
Q: Is the server compatible with other MCP servers? A: Absolutely. The same MCP client configuration can point to multiple servers (e.g., the Swedish Riksdag MCP server) for cross‑parliament analysis.
The European Parliament MCP Server implements the Model Context Protocol (MCP) to provide AI assistants, IDEs, and other MCP clients with structured access to European Parliament open datasets. Access information about MEPs, plenary sessions, committees, legislative documents, and parliamentary questions through a secure, type-safe TypeScript/Node.js implementation.
This MCP server is the EU data backbone of Hack23's mission to disrupt parliamentary journalism with AI-generated political intelligence and real-time accountability analysis — increasing democratic transparency through structured open-source intelligence (OSINT) tradecraft applied to public legislative data.
Hack23 AB builds open-source intelligence platforms that put rigorous, evidence-based political analysis in the hands of every citizen, journalist, researcher and policymaker. By combining MCP servers, agentic AI newsrooms, and open parliamentary data, we produce automated intelligence products — coalition analysis, voting-pattern decoding, MEP/MP influence scoring, legislative-pipeline forecasting — that previously required well-funded lobbying organisations or in-house policy units to generate.
"Democratising access to political intelligence — what used to require a team of analysts can now be done by any citizen with an AI assistant."
The portfolio is non-partisan, fully open-source (Apache-2.0), operated under the Hack23 ISMS with full ISO 27001:2022 / NIST CSF 2.0 / CIS Controls v8.1 alignment, GDPR-by-design, and architecturally engineered so it cannot be weaponised for partisan influence: equal treatment of all political groups, public-data only, no user accounts, no ads, no tracking.
This MCP server's role: the canonical, type-safe TypeScript bridge between the European Parliament Open Data Portal and any MCP-aware AI client (Claude Desktop, VS Code, Cursor, GitHub Copilot) — and the upstream data layer that powers the EU Parliament Monitor newsroom. Every tool is Zod-validated, audit-logged, GDPR-aware, and SLSA Level 3 attested.
euparliamentmonitor.comEuropean Parliament Political Intelligence Platform — 🧠 Political intelligence · 🔍 Radical transparency · 🗳️ Democratic accountability · 🤖 AI-generated news in 14 languages
riksdagsmonitor.comSwedish Political Intelligence Platform — 🕵️ Political intelligence · 🔍 Democratic transparency · 🤖 AI-generated news · 📊 50+ years of evidence
Political transparency platform — Java/Spring data backbone behind Riksdagsmonitor's historical evidence layer
| Dimension | Coverage |
|---|---|
| 🌐 Languages | 14 — English · Swedish · Danish · Norwegian · Finnish · German · French · Spanish · Dutch · Arabic (RTL) · Hebrew (RTL) · Japanese · Korean · Chinese |
| ♿ Accessibility | WCAG 2.1 AA · keyboard navigable · screen-reader optimised · 4.5:1 contrast · responsive 320 px → 1440 px+ |
| 🔒 Compliance | ISO 27001:2022 · NIST CSF 2.0 · CIS Controls v8.1 · GDPR · NIS2 · EU CRA |
| 🛡️ Supply chain | SHA-pinned GitHub Actions · step-security/harden-runner · Dependabot · CodeQL · Secret Scanning · SLSA Level 3 · SPDX SBOM |
| 📜 License | Apache License 2.0 across the entire portfolio |
| 🏢 Operator | Hack23 AB (Org.nr 559534-7807) — Swedish cybersecurity & open-source intelligence consultancy |
| 🛡️ ISMS | Hack23 ISMS-PUBLIC — fully documented information-security management system |
european-parliament-mcp-server · euparliamentmonitor · riksdagsmonitornpx -y european-parliament-mcp-server
# Install the package globally
npm install -g european-parliament-mcp-server
# Or install as a dependency in your project
npm install european-parliament-mcp-server
# Clone the repository
git clone https://github.com/Hack23/European-Parliament-MCP-Server.git
cd European-Parliament-MCP-Server
# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm test
Add to your claude_desktop_config.json:
{
"mcpServers": {
"european-parliament": {
"command": "npx",
"args": ["european-parliament-mcp-server"],
"env": {
"EP_API_KEY": "your-api-key-if-needed"
}
}
}
}
Add to your claude_desktop_config.json:
{
"mcpServers": {
"european-parliament": {
"command": "node",
"args": ["/path/to/European-Parliament-MCP-Server/dist/index.js"],
"env": {
"EP_API_KEY": "your-api-key-if-needed"
}
}
}
}
Configure in .vscode/mcp.json:
{
"servers": {
"european-parliament": {
"type": "stdio",
"command": "npx",
"args": ["-y", "european-parliament-mcp-server"]
}
}
}
Add to ~/.cursor/mcp.json (or project-level .cursor/mcp.json):
{
"mcpServers": {
"european-parliament": {
"command": "npx",
"args": ["european-parliament-mcp-server"],
"env": {}
}
}
}
Use --timeout <ms> to override the default 60 s request timeout. This is especially useful in copilot-mcp.json or other contexts where the env field may not reliably propagate:
{
"args": ["european-parliament-mcp-server", "--timeout", "90000"]
}
Precedence: --timeout CLI arg > EP_REQUEST_TIMEOUT_MS env var > default (60 000 ms).
Note: The
procedures/feedandevents/feedendpoints automatically use an extended 120 s timeout because these EP API endpoints are significantly slower than others. If you experience timeouts withone-monthtimeframes, consider using year-based queries (e.g.,get_procedures({ year: 2026 })) as a faster alternative.
📖 Complete Documentation Site - Live documentation portal with:
💡 Note: Documentation is automatically generated and committed with each release via
npm run docs:build
The API documentation is generated using TypeDoc with the following plugins:
| Plugin | Purpose |
|---|---|
| typedoc | Core HTML documentation generator |
| typedoc-plugin-markdown | Generates SEO-friendly Markdown alongside HTML |
| typedoc-plugin-mdn-links | Links TypeScript built-in types to MDN documentation |
| typedoc-plugin-zod | Renders Zod schema definitions as readable type documentation |
Generate documentation locally:
npm run docs # HTML API docs → docs/api/
npm run docs:md # Markdown API docs → docs/api-markdown/
npm run docs:build # Full documentation build (HTML + MD + coverage + test reports)
Data flow: MCP client sends a tool call → server validates input (Zod) → EP client checks cache → on miss, fetches from EP API (rate-limited) → response cached and returned as structured JSON. All personal data access is audit-logged per GDPR Article 30.
63 tools organized by capability — OSINT intelligence first, then analytical, data access, feed endpoints, and reference tools. Every tool includes Zod input validation, caching, and rate limiting.
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
correlate_intelligence |
Cross-tool OSINT correlation engine — fuses influence, anomaly, coalition, and network signals into unified intelligence alerts | mepIds (required), groups, sensitivityLevel | Correlated alerts with severity & confidence |
assess_mep_influence |
MEP influence scoring (5-dimension model) | mepId (required), dateFrom, dateTo, includeDetails | Influence scorecard |
detect_voting_anomalies |
Party defection & anomaly detection | mepId, groupId, sensitivityThreshold | Anomaly report |
analyze_coalition_dynamics |
Coalition cohesion & stress analysis | groupIds, dateFrom, minimumCohesion | Coalition metrics |
early_warning_system |
Detect emerging political shifts & coalition fractures | sensitivity, focusArea | Warnings with severity levels & stability score |
comparative_intelligence |
Cross-reference 2–10 MEP activities across dimensions | mepIds (required), dimensions | Ranked profiles, correlation matrix, cluster analysis |
network_analysis |
MEP relationship network via committee co-membership | mepId, analysisType, depth | Network map with centrality scores |
sentiment_tracker |
Political group institutional-positioning scores | groupId, timeframe | Positioning scores & polarization index |
generate_political_landscape |
Parliament-wide political landscape | dateFrom, dateTo | Landscape overview |
compare_political_groups |
Cross-group comparative analysis | groupIds (required), dimensions, dateFrom | Comparison matrix |
analyze_legislative_effectiveness |
MEP/committee legislative scoring | subjectType (required), subjectId (required), dateFrom | Effectiveness score |
monitor_legislative_pipeline |
Pipeline status & bottleneck detection | committee, status, limit | Pipeline status |
analyze_committee_activity |
Committee workload & engagement analysis | committeeId (required), dateFrom, dateTo | Activity report |
track_mep_attendance |
MEP attendance patterns & trends | mepId, country, groupId, dateFrom, dateTo, limit | Attendance report |
analyze_country_delegation |
Country delegation voting & composition | country (required), dateFrom, dateTo | Delegation analysis |
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
get_all_generated_stats |
Precomputed EP activity statistics (2004-2026) with rankings, predictions, political landscape, and 30 OSINT-derived intelligence metrics including 3-axis political compass | yearFrom, yearTo, category, includePredictions | Statistics object |
analyze_voting_patterns |
Analyze MEP voting behavior | mepId (required), dateFrom, compareWithGroup | Analysis object |
track_legislation |
Track legislative procedure | procedureId (required) | Procedure object |
generate_report |
Generate analytical reports | reportType (required), subjectId, dateFrom | Report object |
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_meps |
List MEPs with filters | country, group, committee, limit | GET /meps |
get_mep_details |
Detailed MEP information | id (required) | GET /meps/{id} |
get_current_meps |
Currently active MEPs with country & political group | limit, offset | GET /meps/show-current |
get_incoming_meps |
Newly arriving MEPs for current term | limit, offset | GET /meps/show-incoming |
get_outgoing_meps |
Departing MEPs for current term | limit, offset | GET /meps/show-outgoing |
get_homonym_meps |
MEPs with identical names (disambiguation) | limit, offset | GET /meps/show-homonyms |
get_mep_declarations |
MEP financial interest declarations | docId, year, limit | GET /meps-declarations, GET /meps-declarations/{id} |
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_plenary_sessions |
List plenary sessions/meetings, or single by eventId | dateFrom, dateTo, eventId, year, location | GET /meetings, GET /meetings/{id} |
get_voting_records |
Retrieve aggregate voting records (no per‑MEP positions) | sessionId, topic, dateFrom | GET /meetings/{id}/vote-results |
get_speeches |
Plenary speeches and debate contributions | speechId, year, dateFrom, dateTo, limit | GET /speeches, GET /speeches/{id} |
get_events |
EP events (hearings, conferences, seminars) | eventId, year, dateFrom, dateTo, limit | GET /events, GET /events/{id} |
get_meeting_activities |
Activities linked to a plenary sitting | sittingId (required), limit | GET /meetings/{id}/activities |
get_meeting_decisions |
Decisions made in a plenary sitting | sittingId (required), limit | GET /meetings/{id}/decisions |
get_meeting_foreseen_activities |
Planned agenda items for upcoming meetings | sittingId (required), limit | GET /meetings/{id}/foreseen-activities |
get_meeting_plenary_session_documents |
Plenary session documents linked to a specific sitting | sittingId (required), limit, offset | GET /meetings/{id}/plenary-session-documents |
get_meeting_plenary_session_document_items |
Agenda item documents for a specific plenary sitting | sittingId (required), limit, offset | GET /meetings/{id}/plenary-session-document-items |
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_committee_info |
Committee/corporate body info, or all current bodies | id, abbreviation, showCurrent | GET /corporate-bodies, GET /corporate-bodies/show-current |
get_committee_documents |
Committee documents and drafts | docId, year, limit | GET /committee-documents, GET /committee-documents/{id} |
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
search_documents |
Search documents or get single by docId | keyword, docId, documentType, dateFrom | GET /documents, GET /documents/{id} |
get_adopted_texts |
Adopted legislative texts and resolutions | docId, year, limit | GET /adopted-texts, GET /adopted-texts/{id} |
get_plenary_documents |
Plenary legislative documents | docId, year, limit | GET /plenary-documents, GET /plenary-documents/{id} |
get_plenary_session_documents |
Session agendas, minutes, voting lists | docId, limit | GET /plenary-session-documents, GET /plenary-session-documents/{id} |
get_plenary_session_document_items |
Individual items within session documents | limit, offset | GET /plenary-session-documents-items |
get_external_documents |
Non-EP documents (Council, Commission) | docId, year, limit | GET /external-documents, GET /external-documents/{id} |
get_parliamentary_questions |
Parliamentary Q&A, or single by docId | type, author, topic, docId | GET /parliamentary-questions, GET /parliamentary-questions/{id} |
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_procedures |
Legislative procedures, or single by processId | processId, year, limit | GET /procedures, GET /procedures/{id} |
get_procedure_events |
Timeline events for a legislative procedure | processId (required), limit | GET /procedures/{id}/events |
get_procedure_event_by_id |
Specific event linked to a legislative procedure | processId (required), eventId (required) | GET /procedures/{id}/events/{event-id} |
get_controlled_vocabularies |
Standardized classification terms | vocId, limit | GET /controlled-vocabularies, GET /controlled-vocabularies/{id} |
Real-time change feeds for monitoring recently updated data across all EP API categories. Per the EP OpenAPI spec, feeds fall into two groups:
timeframe (today, one-day, one-week, one-month, custom) + optional startDateKey behaviors:
- All feeds return JSON-LD with
data[],@context[], anddataQualityWarnings[]- Empty feeds (EP API 404 or error-in-body) are converted to empty
data[]with a warning — not errorsget_events_feedandget_procedures_feedalways use a minimum 120s timeout because these endpoints are consistently slow- Fixed-window feeds can be very slow (30–180 s) and often return error-in-body responses
- For configurable feeds, when
timeframeiscustom,startDate(YYYY-MM-DD) is required
Configurable-window feeds:
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_meps_feed |
Recently updated MEPs | timeframe, startDate | GET /meps/feed |
get_events_feed |
Recently updated events | timeframe, startDate, activityType | GET /events/feed |
get_procedures_feed |
Recently updated procedures | timeframe, startDate, processType | GET /procedures/feed |
get_adopted_texts_feed |
Recently updated adopted texts | timeframe, startDate, workType | GET /adopted-texts/feed |
get_mep_declarations_feed |
Recently updated MEP declarations | timeframe, startDate, workType | GET /meps-declarations/feed |
get_external_documents_feed |
Recently updated external documents | timeframe, startDate, workType | GET /external-documents/feed |
Fixed-window feeds (no parameters):
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_documents_feed |
Recently updated documents | (none) | GET /documents/feed |
get_plenary_documents_feed |
Recently updated plenary documents | (none) | GET /plenary-documents/feed |
get_committee_documents_feed |
Recently updated committee docs | (none) | GET /committee-documents/feed |
get_plenary_session_documents_feed |
Recently updated plenary session docs | (none) | GET /plenary-session-documents/feed |
get_parliamentary_questions_feed |
Recently updated questions | (none) | GET /parliamentary-questions/feed |
get_corporate_bodies_feed |
Recently updated corporate bodies | (none) | GET /corporate-bodies/feed |
get_controlled_vocabularies_feed |
Recently updated vocabularies | (none) | GET /controlled-vocabularies/feed |
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
get_server_health |
Server health and feed availability status (no upstream API calls) | (none) | Health object |
📖 Complete TypeDoc API documentation → · Markdown API docs →
Research a specific MEP:
1. Find MEP: get_meps → {country: "SE"}
2. Get details: get_mep_details → {id: "MEP-123"}
3. Analyze voting: analyze_voting_patterns → {mepId: "MEP-123"}
4. Generate report: generate_report → {reportType: "MEP_ACTIVITY", subjectId: "MEP-123"}
Track legislation:
1. Search documents: search_documents → {keywords: "climate change"}
2. Track procedure: track_legislation → {procedureId: "2024/0001(COD)"}
3. Get voting records: get_voting_records → {topic: "climate"}
Committee analysis:
1. Get committee: get_committee_info → {abbreviation: "ENVI"}
2. List members: get_meps → {committee: "ENVI"}
3. Generate report: generate_report → {reportType: "COMMITTEE_PERFORMANCE", subjectId: "COMM-ENVI"}
OSINT Intelligence analysis:
1. Score MEP influence: assess_mep_influence → {mepId: "MEP-123"}
2. Detect anomalies: detect_voting_anomalies → {mepId: "MEP-123"}
3. Analyze coalitions: analyze_coalition_dynamics → {groupIds: ["EPP", "S&D"]}
4. Compare groups: compare_political_groups → {groupIds: ["EPP", "S&D", "Renew"]}
5. Pipeline status: monitor_legislative_pipeline → {committee: "ENVI"}
6. Country delegation: analyze_country_delegation → {country: "SE"}
7. Political landscape: generate_political_landscape → {}
🎯 More use cases and examples →
Pre-built intelligence analysis prompt templates:
| Prompt | Description | Arguments |
|---|---|---|
mep_briefing |
Comprehensive MEP intelligence briefing | mepId (required), period? |
coalition_analysis |
Coalition dynamics and voting bloc analysis | policyArea?, period? |
legislative_tracking |
Legislative procedure tracking report | procedureId?, committee? |
political_group_comparison |
Multi-dimensional group comparison | groups? |
committee_activity_report |
Committee workload and engagement | committeeId (required) |
voting_pattern_analysis |
Voting pattern trend detection | topic?, mepId? |
country_delegation_analysis |
Country delegation composition and activity | country (required), period? |
Direct data access via EP resource URIs:
| Resource URI | Description |
|---|---|
ep://meps |
List of all current MEPs |
ep://meps/{mepId} |
Individual MEP profile |
ep://committees/{committeeId} |
Committee information |
ep://plenary-sessions |
Recent plenary sessions |
ep://votes/{sessionId} |
Voting records for a session |
ep://political-groups |
Political group listing |
ep://procedures/{procedureId} |
Legislative procedure details |
ep://plenary/{plenaryId} |
Single plenary session details |
ep://documents/{documentId} |
Legislative document details |
The European Parliament MCP Server is part of a growing ecosystem of political and government open data MCP servers enabling AI-powered OSINT analysis of democratic institutions worldwide. Below is the most comprehensive directory of political and government MCP servers available.
| Country | Server | Data Source | Coverage |
|---|---|---|---|
| 🇪🇺 European Union | European Parliament MCP Server | data.europarl.europa.eu | MEPs, votes, legislation, committees, questions — 63 tools (15 OSINT) |
| 🇺🇸 United States | Congress.gov API MCP Server | congress.gov | Bills, members, votes, committees (TypeScript, v3 API) |
| 🇺🇸 United States | CongressMCP | congress.gov | Real-time Congress data — bills, votes, members |
| 🇺🇸 United States | Congress.gov MCP | congress.gov | Unofficial Congress.gov API access |
| 🇬🇧 United Kingdom | Parliament MCP | parliament.uk | Hansard, members, debates, divisions |
| 🇸🇪 Sweden | Riksdag & Regering MCP | riksdagen.se | Swedish Parliament & Government data (used by riksdagsmonitor.com) |
| 🇳🇱 Netherlands | OpenTK MCP | tweedekamer.nl | Dutch Parliament (Tweede Kamer) documents |
| 🇵🇱 Poland | Parliament of Poland MCP | sejm.gov.pl | Members, votes, committees |
| 🇵🇱 Poland | Sejm MCP | api.sejm.gov.pl | Parliament data + legislation |
| 🇮🇱 Israel | Knesset MCP Server | knesset.gov.il | Knesset parliament API |
| 🇧🇷 Brazil | Senado BR MCP | senado.leg.br | Federal Senate — members, proposals, votes |
| Country | Server | Data Source | Coverage |
|---|---|---|---|
| 🇺🇸 United States | USA Spending MCP | usaspending.gov | Federal spending data |
| 🇺🇸 United States | Open Census MCP | census.gov | Demographics & statistics (natural language) |
| 🇺🇸 United States | Data.gov MCP Server | data.gov | Federal dataset catalog |
| 🇺🇸 United States | CMS Data.gov MCP | data.cms.gov | Healthcare data — search/filter/pagination |
| 🇺🇸 United States | SEC EDGAR MCP | sec.gov | SEC filings — annual reports, insider data |
| 🇺🇸 United States | NPS MCP | nps.gov | National Park Service API |
| 🇸🇪 Sweden | SCB MCP Server | scb.se | Official Swedish statistics |
| 🇸🇪 Sweden | Skolverket MCP | skolverket.se | Swedish National Agency for Education |
| 🇫🇷 France | data.gouv.fr MCP | data.gouv.fr | National open data platform |
| 🇫🇷 France | Data Gouv MCP Server | data.gouv.fr | Companies & organizations search |
| 🇬🇧 United Kingdom | Planning Data MCP | planning.data.gov.uk | Planning & land use data |
| 🇬🇧 United Kingdom | Property Prices MCP | landregistry.data.gov.uk | Housing price search |
| 🇳🇱 Netherlands | CBS Open Data MCP | cbs.nl | Dutch statistics bureau |
| 🇮🇱 Israel | Data.gov.il MCP | data.gov.il | National CKAN data portal |
| 🇮🇱 Israel | DataGov Israel MCP | data.gov.il | Alternative implementation + visualization |
| 🇮🇱 Israel | Israel Statistics MCP | cbs.gov.il | CPI & economic time series |
| 🇮🇱 Israel | BudgetKey MCP | open-budget.org.il | State budget, contracts, grants |
| 🇹🇷 Turkey | Mevzuat MCP | mevzuat.gov.tr | Legislation system — search/retrieve laws |
| 🇭🇰 Hong Kong | HK Data.gov.hk MCP | data.gov.hk | Hong Kong open data portal |
| 🇲🇾 Malaysia | Data.gov.my MCP | data.gov.my | National data portal |
| 🇮🇳 India | Data.gov.in MCP | data.gov.in | Semantic search + dataset access |
| 🇸🇬 Singapore | Gahmen MCP Server | data.gov.sg | Government datasets + CKAN search |
| 🇸🇬 Singapore | Singapore Data MCPs | data.gov.sg | Multiple servers (parking, health, datasets) |
| 🇦🇺 Australia | ABS MCP Server | abs.gov.au | Bureau of Statistics (SDMX-ML) |
| Scope | Server | Platform | Coverage |
|---|---|---|---|
| 🌐 Global (CKAN) | CKAN MCP Server | CKAN portals | Generic server for any CKAN-based open data portal |
| 🌐 Global (Socrata) | OpenGov MCP Server | Socrata portals | City/county/state/federal Socrata-powered portals |
| Capability | 🇪🇺 EU Parliament MCP | 🇺🇸 Congress.gov MCP | 🇬🇧 UK Parliament MCP | 🇸🇪 Riksdag MCP |
|---|---|---|---|---|
| Member profiling | ✅ 5-dimension influence model | ✅ Basic profiles | ✅ Basic profiles | ✅ Basic profiles |
| Voting analysis | ✅ Anomaly detection + patterns | ✅ Roll call votes | ✅ Division records | ✅ Vote records |
| Coalition dynamics | ✅ Cohesion & stress analysis | ❌ | ❌ | ❌ |
| Committee intelligence | ✅ Workload & engagement metrics | ✅ Committee data | ✅ Committee data | ❌ |
| Legislative pipeline | ✅ Bottleneck detection + forecasting | ✅ Bill tracking | ✅ Bill tracking | ✅ Bill tracking |
| Country delegation analysis | ✅ National cohesion metrics | N/A | N/A | N/A |
| Political landscape | ✅ Parliament-wide situational awareness | ❌ | ❌ | ❌ |
| Attendance tracking | ✅ Trend detection + engagement scoring | ❌ | ❌ | ❌ |
| GDPR compliance | ✅ Privacy-first design | N/A | N/A | ✅ |
| MCP prompts & resources | ✅ 7 prompts + 9 resources | ❌ | ❌ | ❌ |
| Tool count | 63 tools | ~5 tools | ~5 tools | ~4 tools |
💡 The European Parliament MCP Server offers the most comprehensive OSINT intelligence capabilities of any political MCP server, with 63 specialized tools including advanced analytics like coalition stress analysis, voting anomaly detection, cross-tool intelligence correlation, political landscape generation, and precomputed longitudinal statistics. It is the only political MCP server with built-in MCP prompts, resources, and a 5-dimension MEP influence scoring model.
All 55 European Parliament Open Data API v2 endpoints are fully covered — 41 core data endpoints, 13 feed endpoints, and 1 optional endpoint (/procedures/{id}/events/{event-id}):
| Category | Endpoints | MCP Tools |
|---|---|---|
| MEPs | /meps, /meps/{id}, /meps/show-current, /meps/show-incoming, /meps/show-outgoing, /meps/show-homonyms |
get_meps, get_mep_details, get_current_meps, get_incoming_meps, get_outgoing_meps, get_homonym_meps |
| MEP Documents | /meps-declarations, /meps-declarations/{id} |
get_mep_declarations |
| Corporate Bodies | /corporate-bodies, /corporate-bodies/{id}, /corporate-bodies/show-current |
get_committee_info |
| Events | /events, /events/{id} |
get_events |
| Meetings | /meetings, /meetings/{id}, /meetings/{id}/activities, /meetings/{id}/decisions, /meetings/{id}/foreseen-activities, /meetings/{id}/vote-results, /meetings/{id}/plenary-session-documents, /meetings/{id}/plenary-session-document-items |
get_plenary_sessions, get_meeting_activities, get_meeting_decisions, get_meeting_foreseen_activities, get_voting_records, get_meeting_plenary_session_documents, get_meeting_plenary_session_document_items |
| Speeches | /speeches, /speeches/{id} |
get_speeches |
| Procedures | /procedures, /procedures/{id}, /procedures/{id}/events, /procedures/{id}/events/{event-id} |
get_procedures, get_procedure_events, get_procedure_event_by_id |
| Documents | /documents, /documents/{id}, /adopted-texts, /adopted-texts/{id}, /committee-documents, /committee-documents/{id}, /plenary-documents, /plenary-documents/{id}, /plenary-session-documents, /plenary-session-documents/{id}, /plenary-session-documents-items |
search_documents, get_adopted_texts, get_committee_documents, get_plenary_documents, get_plenary_session_documents, get_plenary_session_document_items |
| Questions | /parliamentary-questions, /parliamentary-questions/{id} |
get_parliamentary_questions |
| External Documents | /external-documents, /external-documents/{id} |
get_external_documents |
| Vocabularies | /controlled-vocabularies, /controlled-vocabularies/{id} |
get_controlled_vocabularies |
| Feed Endpoints | /meps/feed, /events/feed, /procedures/feed, /adopted-texts/feed, /meps-declarations/feed, /documents/feed, /plenary-documents/feed, /committee-documents/feed, /plenary-session-documents/feed, /external-documents/feed, /parliamentary-questions/feed, /corporate-bodies/feed, /controlled-vocabularies/feed |
get_meps_feed, get_events_feed, get_procedures_feed, get_adopted_texts_feed, get_mep_declarations_feed, get_documents_feed, get_plenary_documents_feed, get_committee_documents_feed, get_plenary_session_documents_feed, get_external_documents_feed, get_parliamentary_questions_feed, get_corporate_bodies_feed, get_controlled_vocabularies_feed |
This project aligns with Hack23 AB's Information Security Management System (ISMS):
This project achieves SLSA Level 3 compliance:
gh attestation verify <artifact> --owner Hack23 --repo European-Parliament-MCP-ServerSee ATTESTATIONS.md for verification instructions and security benefits.
Per Hack23 Open Source Policy:
| Property | Value |
|---|---|
| CRA Classification | |
| Confidentiality | |
| Integrity | |
| Availability |
See CRA-ASSESSMENT.md for the full EU Cyber Resilience Act conformity assessment.
# Install dependencies
npm install
# Run in development mode with auto-reload
npm run dev
# Type checking
npm run type-check
# Linting
npm run lint
# Format code
npm run format
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
European-Parliament-MCP-Server/
├── src/ # Source code
│ ├── server.ts # MCP server entry point
│ ├── tools/ # MCP tool implementations
│ ├── resources/ # MCP resource handlers
│ ├── prompts/ # MCP prompt templates
│ ├── clients/ # European Parliament API client
│ ├── schemas/ # Zod validation schemas
│ ├── types/ # TypeScript type definitions
│ └── utils/ # Utility functions
├── tests/ # Test files
├── .github/ # GitHub configuration
│ ├── agents/ # Custom Copilot agents
│ ├── skills/ # Reusable skill patterns
│ └── workflows/ # CI/CD workflows
└── docs/ # Additional documentation
# Unit tests
npm test
# Integration tests (requires EP_INTEGRATION_TESTS=true)
EP_INTEGRATION_TESTS=true npm run test:integration
# Integration tests with fixture capture
EP_INTEGRATION_TESTS=true EP_SAVE_FIXTURES=true npm run test:integration
# E2E tests
npm run test:e2e
# Coverage report
npm run test:coverage
# Watch mode
npm run test:watch
Integration Testing: When EP_INTEGRATION_TESTS=true, the integration test suite validates 46 MCP tools against the real European Parliament API endpoints (see INTEGRATION_TESTING.md for the complete 62-tool coverage guide). All tools return real data — no mock or placeholder data is used. Live API tests are disabled by default to respect rate limits (100 req/min).
# Lint code
npm run lint
# Fix linting issues
npm run lint:fix
# Check for unused dependencies
npm run knip
# Security audit
npm audit
# License compliance
npm run test:licenses
Symptom: Requests return 429 Too Many Requests or slow down unexpectedly.
The European Parliament Open Data API enforces rate limits. The MCP server automatically applies a token-bucket rate limiter (100 requests per minute).
Solutions:
# Reduce concurrency — don't call multiple tools in parallel bursts
# Use the built-in cache — repeated identical requests are served from LRU cache
# Add a delay between bulk operations:
# e.g., call get_meps, wait 1 s, then call get_mep_details
# Check current cache stats (if using programmatic access):
const stats = epClient.getCacheStats();
console.log(`Cache hit rate: ${stats.hitRate}%`);
Symptom: ECONNREFUSED, ETIMEDOUT, or Network error from tools.
Solutions:
curl https://data.europarl.europa.eu/api/v2/meps?limit=1data.europarl.europa.eu:443Symptom: npm install fails, or node dist/index.js throws import errors.
Solutions:
# Ensure Node.js 26+ is installed
node --version # Must be >= 26.0.0
# Clear npm cache and reinstall
npm cache clean --force
rm -rf node_modules package-lock.json
npm install
# Rebuild TypeScript output
npm run build
# Verify the package starts correctly
node dist/index.js --version
Symptom: MCP client shows "server not found" or no tools listed.
Solutions:
command path in your MCP client config points to the correct binarynpx: ensure european-parliament-mcp-server is in your npm registrynode: use the absolute path to dist/index.jsSymptom: Integration tests fail with EP_INTEGRATION_TESTS must be set.
Integration tests are disabled by default to respect API rate limits.
# Enable integration tests explicitly:
EP_INTEGRATION_TESTS=true npm run test:integration
# Capture fresh fixtures for offline testing:
EP_INTEGRATION_TESTS=true EP_SAVE_FIXTURES=true npm run test:integration
Symptom: tsc reports type errors after pulling latest changes.
# Regenerate all types
npm run type-check
# Check for mismatched Node types
npm install # updates @types/node
# Ensure tsconfig is correct
cat tsconfig.json
We welcome contributions! Please see CONTRIBUTING.md for details on:
This repository includes custom agents and skills for GitHub Copilot:
We follow Semantic Versioning and use automated release management:
Version Types:
Automated Release Workflow:
Release Notes Include:
For detailed workflow documentation, see .github/WORKFLOWS.md.
📰 News is dead. Long live intelligence.
While the world's newsrooms race to replace journalists with GPT-powered headline factories — churning out "10 Things the EU Did Today" listicles at the speed of hallucination — we took a different path. Instead of automating the news ticker, we built a political intelligence platform that actually understands what the European Parliament does. Disrupted news generation produces noise; deep political intelligence produces signal. Any chatbot can summarize a press release. It takes 62 MCP tools, 15 OSINT analyzers, and a 5-dimension influence model to tell you which MEP quietly brokered the amendment that changed the directive that reshaped an industry — three months before the newspapers notice.
This is not a news bot. This is parliamentary intelligence infrastructure.
This repository is powered by a comprehensive AI-augmented development ecosystem — 14 specialized Copilot agents, 41 reusable skills, and 11 CI/CD workflows — working in concert to maintain, analyze, and evolve the most advanced political MCP server in existence.
From 62 MCP tools today to a transformative democratic intelligence platform serving all 195 parliamentary systems — powered by the relentless march of AI model generations.
Scenario: AGI or near-AGI systems become available through Amazon Bedrock or successor platforms
Assumptions: Anthropic Opus minor updates every ~2.3 months through 2037 (or until successor paradigm). Major version upgrades annually. Competitors (OpenAI, Google, Meta, EU sovereign AI) evaluated at each major release. Architecture must accommodate potential paradigm shifts (quantum AI, neuromorphic computing).
Baseline: 11 GitHub Actions workflows today. Projected growth includes AI-generated workflows, scheduled intelligence pipelines, multi-environment deployment chains, and automated OSINT processing — see FUTURE_WORKFLOWS.md for detailed expansion plans.
| Year | Total Workflows | AI Model | Key Capability | Tools |
|---|---|---|---|---|
| 2026 | 44–50 | Opus 4.6–4.9 | 🤖 Agentic news generation, AI-authored briefings | 46→55 |
| 2027 | 50–55 | Opus 5.x | 📈 Predictive analytics, coalition forecasting | 55→65 |
| 2028 | 55–65 | Opus 6.x | 🎥 Multi-modal content, video/speech analysis | 65→80 |
| 2029 | 65–75 | Opus 7.x | ⚡ Autonomous pipeline, self-optimizing CI/CD | 80→90 |
| 2030 | 75–85 | Opus 8.x | 🧠 Near-expert analysis, domain specialist AI | 90→100 |
| 2031–2033 | 85–100 | Opus 9–10.x / Pre-AGI | 🌍 Global coverage, all EU national parliaments | 100→120 |
| 2034–2037 | 100–120+ | AGI / Post-AGI | 🌐 Transformative platform, 195 parliaments | 120→200+ |
| Pillar | Description | Safeguard |
|---|---|---|
| 🤖 Autonomous Analysis | AGI-powered real-time political intelligence across all 195 parliamentary systems | Human analyst review for high-stakes assessments |
| 🌐 Universal Language | Every UN language supported natively with legal terminology precision | Multi-cultural fairness auditing at every release |
| 📊 Predictive Governance | Policy impact prediction before legislation is proposed | Confidence intervals and uncertainty quantification mandatory |
| ⚖️ Ethical AI Governance | Human oversight maintained regardless of AI capability level | ISMS-aligned escalation protocols, transparency reports |
| 🛡️ Democratic Safeguards | Platform architecture prevents weaponization or manipulation | Quarterly red-team exercises, sovereignty-first data policies |
For deep dives into specific evolution tracks, see:
| Document | Focus | Link |
|---|---|---|
| 📊 EP Political Landscape | OSINT intelligence dashboard (2004–2026) — seat composition, fragmentation, political compass, coalition dynamics, derived metrics; all years validated against EP API v2 | EP_POLITICAL_LANDSCAPE.md |
| 🧠 Future Mind Map | Capability expansion vision, AI analysis, OSINT evolution | FUTURE_MINDMAP.md |
| ⚙️ Future Workflows | CI/CD evolution, AI-augmented pipelines, 2027–2037 roadmap | FUTURE_WORKFLOWS.md |
| 🏛️ Future Architecture | Platform architecture evolution, AWS deployment, federation | FUTURE_ARCHITECTURE.md |
| 🛡️ Future Security | Security maturity roadmap, quantum-ready encryption | FUTURE_SECURITY_ARCHITECTURE.md |
| 📊 Future Data Model | Enhanced data structures, graph databases, temporal models | FUTURE_DATA_MODEL.md |
| 💼 Future SWOT | Strategic positioning, competitive analysis, market evolution | FUTURE_SWOT.md |
This project is licensed under the Apache License 2.0 - see LICENSE.md for details.
Please log in to share your review and rating for this MCP.
Explore related MCPs that share similar capabilities and solve comparable challenges
by modelcontextprotocol
A Model Context Protocol server for Git repository interaction and automation.
by zed-industries
A high‑performance, multiplayer code editor designed for speed and collaboration.
by modelcontextprotocol
Model Context Protocol Servers
by modelcontextprotocol
A Model Context Protocol server that provides time and timezone conversion capabilities.
by cline
An autonomous coding assistant that can create and edit files, execute terminal commands, and interact with a browser directly from your IDE, operating step‑by‑step with explicit user permission.
by upstash
Provides up-to-date, version‑specific library documentation and code examples directly inside LLM prompts, eliminating outdated information and hallucinated APIs.
by daytonaio
Provides a secure, elastic infrastructure that creates isolated sandboxes for running AI‑generated code with sub‑90 ms startup, unlimited persistence, and OCI/Docker compatibility.
by continuedev
Enables faster shipping of code by integrating continuous AI agents across IDEs, terminals, and CI pipelines, offering chat, edit, autocomplete, and customizable agent workflows.
by github
Connects AI tools directly to GitHub, enabling natural‑language interactions for repository browsing, issue and pull‑request management, CI/CD monitoring, code‑security analysis, and team collaboration.
{
"mcpServers": {
"european-parliament": {
"command": "npx",
"args": [
"-y",
"european-parliament-mcp-server"
],
"env": {
"EP_API_KEY": "<YOUR_API_KEY>"
}
}
}
}claude mcp add european-parliament npx -y european-parliament-mcp-server