Model Context Protocol Server for European Parliament Open Data
🇪🇺 EU parliamentary intelligence for AI agents · 🕵️ 15 OSINT analytics tools · 🏛️ Full EP API v2 coverage · 🛡️ ISMS-aligned · 🔒 GDPR-by-design · 📦 SLSA Level 3
The canonical TypeScript MCP bridge between the European Parliament Open Data Portal and any MCP-aware AI client — Claude Desktop, VS Code, Cursor, GitHub Copilot. Powers the
EU Parliament MonitorAI newsroom and is a sister project to
Riksdagsmonitorin the
Hack23political-intelligence portfolio.
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.
- 🔌 Full MCP Implementation: 63 tools (9 core + 3 advanced + 15 OSINT + 8 Phase 4 + 15 Phase 5 + 13 feed), 9 Resources, and 7 Prompts - 🏛️ Complete EP API v2 Coverage: All European Parliament Open Data API endpoints covered - 🕵️ OSINT Intelligence: MEP influence scoring, coalition analysis, anomaly detection - 🔒 Security First: ISMS-compliant, GDPR-ready, SLSA Level 3 provenance - 🚀 High Performance: <200ms API responses, intelligent caching, rate limiting - 📊 Type Safety: TypeScript strict mode + Zod runtime validation - 🧪 Well-Tested: 80%+ code coverage, 1130+ unit tests, 71 E2E test cases - 📚 Complete Documentation: Architecture, TypeDoc API (HTML + Markdown), security guidelines
Runtime: Node.js 26.x** Primary compiler**: TypeScript 7 RC via thetypescript-7
alias (node_modules/typescript-7/bin/tsc
)Compatibility layer:@typescript/typescript6
remains available so existing 6.x-based tooling can continue usingtsc6
and the TypeScript 6 APICore platform:@modelcontextprotocol/sdk
1.29.0,zod
4.4.3,vitest
4.1.10
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.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#6366f1","primaryTextColor":"#fff","primaryBorderColor":"#4f46e5","lineColor":"#94a3b8","secondaryColor":"#003399","tertiaryColor":"#00338d","background":"#0f172a"}}}%%
graph LR
subgraph SOURCES["📡 Primary Open-Data Sources"]
EP["🇪🇺 European Parliament<br/>Open Data Portal v2<br/><i>data.europarl.europa.eu</i>"]
RD["🇸🇪 Riksdagen Open Data<br/><i>data.riksdagen.se</i>"]
REG["🇸🇪 Regeringskansliet<br/><i>regeringen.se</i>"]
IMF["💰 IMF / World Bank<br/><i>economic context</i>"]
end
subgraph MCP["🔌 MCP Servers"]
EPMCP["<b>European-Parliament-<br/>MCP-Server</b><br/>63 tools · 9 resources<br/>7 prompts · TS strict<br/><i>(this repository)</i>"]
RRMCP["riksdag-regering MCP<br/>32+ tools"]
end
subgraph PRODUCTS["📰 AI-Driven Public Platforms"]
EUPM["🏛️ <b>EU Parliament Monitor</b><br/>euparliamentmonitor.com<br/>8 unified gh-aw workflows<br/>51-artifact analysis<br/>14 languages"]
RM["🗳️ <b>Riksdagsmonitor</b><br/>riksdagsmonitor.com<br/>11 agentic workflows<br/>91 skills · 14 languages<br/>Tidö coalition tracker"]
CIA["🕵️ <b>Citizen Intelligence<br/>Agency (CIA)</b><br/>Java/Spring backend<br/>15 subsystems · 1971–2024<br/>3.5M votes · 109K docs"]
end
subgraph CITIZENS["👥 Citizens · Journalists · Researchers · NGOs"]
AUDIENCE["AI assistants · Dashboards · 14-language news · Intelligence briefings"]
end
EP --> EPMCP
RD --> RRMCP
REG --> RRMCP
EPMCP --> EUPM
RRMCP --> RM
RM <-->|"15 CIA subsystems<br/>nightly sync"| CIA
IMF -.->|"economic context"| EUPM
IMF -.->|"economic context"| RM
EUPM --> AUDIENCE
RM --> AUDIENCE
CIA --> AUDIENCE
EPMCP -.->|"AI assistants<br/>Claude · Cursor · VS Code"| AUDIENCE
style EPMCP fill:#6366f1,stroke:#4f46e5,color:#fff,stroke-width:3px
style EP fill:#003399,stroke:#ffcc00,color:#fff
style RD fill:#00338d,stroke:#fecc00,color:#fff
style REG fill:#00338d,stroke:#fecc00,color:#fff
style EUPM fill:#003399,stroke:#ffcc00,color:#fff
style RM fill:#00338d,stroke:#fecc00,color:#fff
style CIA fill:#1b5e20,stroke:#43a047,color:#fff
style AUDIENCE fill:#7b1fa2,stroke:#9c27b0,color:#fff
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.
| Project | Scope | Audience | Links |
|---|---|---|---|
| 🇪🇺 European-Parliament-MCP-Server(this repo) | |||
| EU Parliament data layer for AI agents62 MCP tools · 9 resources · 7 prompts · OSINT analyticsSource: | |||
| Developers · AI assistants · Journalists · Researchers | |||
| 📦 | |||
| npm |
💻
EU Parliament Monitor 8 unified gh-aw workflows · 51-artifact analysis pipelineSource: this MCP server (60+ tools) + IMF + World Bankeuparliamentmonitor.com🧠
GitHubRiksdagsmonitor 11 agentic workflows · 91 skills · 50+ years of evidence (1971–2024) · Tidö coalition fragility trackerSource:riksdag-regering
MCP (32+ tools) + SCB + IMF + World Bank + CIA exportsriksdagsmonitor.com🧠
GitHubCitizen Intelligence Agency(CIA)349 current MPs · 2,494 historical politicians · 3.5M+ votes · 109k+ documents · 45-rule risk engine** Source:**data.riksdagen.se
direct + Valmyndigheten + ESVhack23.github.io/cia💻
European Parliament Political Intelligence Platform—🧠 Political intelligence · 🔍 Radical transparency · 🗳️ Democratic accountability · 🤖 AI-generated news in 14 languages
| |
EU Parliament Monitor turns the EP's own open data into auditable political intelligence — and publishes it as readable news in 14 languages, every day, fully sourced. An AI-driven newsroom that monitors plenary sessions, committee work, motions, propositions, urgency files and the forward calendar; produces Economist-style analytical articles backed by 51 structured analysis artifacts per run; and exposes every methodology, template and analysis tree publicly so any reader, journalist or NGO can verify the analysis behind the prose.
Powered by this repository — consumes the European-Parliament-MCP-Server (60+ EP data tools) plus IMF + World Bank for economic context, with built-in fallback to the EP Open Data Portal /api/v2/decision
endpoint when MCP returns empty voting payloads.
- 📰
9 unified— 8 article types (gh-aw(GitHub Agentic Workflows) pipelines
breaking
,week-ahead
,month-ahead
,week-in-review
,month-in-review
,committee-reports
,motions
,propositions
) running Stages A → E in a single 45-minute session, plusnews-translate
for 14-language flush translation - 📚
17 published methodologies + 52 analysis templates + 19 tradecraft references— ICD-203 Key Judgments · Admiralty source grades · WEP probability bands · ACH · 5-framework political-threat model · 6-dimension threat landscape · electoral domain methodology (361-seat threshold) · IMF/World Bank indicator mappings - 🌍
14 languages— EN · SV · DA · NO · FI · DE · FR · ES · NL · AR (RTL) · HE (RTL) · JA · KO · ZH — every page rendered with WCAG 2.1 AA accessibility, JSON-LDNewsArticle.isBasedOn
provenance linking back to source artifacts, andhreflang
alternates on every page - 🛡️
Deterministic aggregator— agents author analysis Markdown only; TypeScript renders HTML deterministically (no AI-authored HTML, no template-prose leakage, fully reproducible) - 📦
npm package— published witheuparliamentmonitor
npm provenanceand SLSA Level 3 build attestations
Swedish Political Intelligence Platform—🕵️ Political intelligence · 🔍 Democratic transparency · 🤖 AI-generated news · 📊 50+ years of evidence
| |
Riksdagsmonitor monitors Sweden's Riksdag (Parliament), the Government (Regeringskansliet) and public agencies (Myndigheter) with structured intelligence techniques — ACH, SWOT, PESTLE, STRIDE, political-risk scoring and OSINT/INTOP tradecraft — applied to 349 current MPs, 2,494 historical politicians (1971–2024), 3.5M+ votes and 109,000+ parliamentary documents.
An autonomous AI newsroom — 11 agentic workflows, Claude Opus, zero human editors — turns this evidence into publication-ready intelligence articles in 14 languages, every day. Front-loads the live Tidö Agreement coalition status (176/349 seats, fragility indicators, CIA risk alerts) and dives into 40 years of election-cycle intelligence (1994–2034), party performance (1990–2026, 8 parties), 15 committee networks, seasonal Z-score anomaly detection, ministry risk and a 45-rule × 349-MP live risk heat map.
-
📰 11 agentic workflows— committee reports · propositions · motions · interpellations · week-ahead · month-ahead · real-time monitor · evening analysis · weekly review · monthly review · translate (Mon–Fri + weekend cycles, all on UTC schedules) - 🧠 91 skills across 12 categories+** 24 Copilot agents**(14 personas + 9 workflow specialists + shared developer instructions) — full catalog atSKILLS.md/AGENTS.md - 📚 11 published methodologies + 23 templates(8 core T1–T8 + 15 extended/Tier-C) — AI-Driven Analysis Guide · OSINT Tradecraft Standards · Political Risk · Political SWOT · Political Threat Framework · Electoral Domain · Synthesis · Strategic Extensions (scenario / wildcard / long-horizon) · Style Guide - 📊 5 flagship Chart.js / D3.js dashboards+CIA Intelligence Dashboard— Seasonal Activity (2002–2025 · Z-score anomaly) · 349-MP Politician Dashboard · Pre-Election Monitor · Party Performance (1990–2026) · Anomaly & Early Warning - 🌍 14 languages— EN · SV · DA · NO · FI · DE · FR · ES · NL · AR (RTL) · HE (RTL) · JA · KO · ZH — daily refresh at 03:00 CET, WCAG 2.1 AA, CSP-hardened with Subresource Integrity (SRI) on all bundled assets - 📦 npm package— Theme System · Chart Factory · Resilient Data · 12 dashboard modules · CIA intelligence modules — published with SLSA build provenance
riksdagsmonitor -
🛡️ OpenSSF Best Practices Project #12069· Risk level 🟢 LOW (5.52 / 10.0 — 99.7 % risk reduction) · ISO 27001:2022 · NIST CSF 2.0 · CIS Controls v8.1 · GDPR Art. 9(2)(e/g) for political opinions
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 | |
ISMSHack23 ISMS-PUBLIC— fully documented information-security management system- 🌐
Live platforms—euparliamentmonitor.com·riksdagsmonitor.com·hack23.github.io/cia·hack23.com - 🧠
Political Intelligence Hubs—EU Parliament·Riksdag - 📂
Source repositories—European-Parliament-MCP-Server·euparliamentmonitor·riksdagsmonitor·cia·ISMS-PUBLIC - 📦
npm packages—·european-parliament-mcp-server
·euparliamentmonitor
riksdagsmonitor
- 📰 Blog & company—Hack23 blog·LinkedIn — Hack23 AB· founderJames Pether Sörling, CISSP, CISM - 🤖 AI-readable wikis—DeepWiki: European-Parliament-MCP-Server·DeepWiki: euparliamentmonitor·DeepWiki: riksdagsmonitor·DeepWiki: cia
npx -y european-parliament-mcp-server
- Node.js 26.x or higher
- npm 10.x or higher
npm install -g european-parliament-mcp-server
npm install european-parliament-mcp-server
git clone https://github.com/Hack23/European-Parliament-MCP-Server.git
cd European-Parliament-MCP-Server
npm install
npm run build
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:Theprocedures/feed
andevents/feed
endpoints automatically use an extended 120 s timeout because these EP API endpoints are significantly slower than others. If you experience timeouts withone-month
timeframes, consider using year-based queries (e.g.,get_procedures({ year: 2026 })
) as a faster alternative.
** 📖 Complete Documentation Site** - Live documentation portal with:
- 📖
- TypeDoc generated API documentation with search, hierarchy navigation, and full type informationAPI Reference (HTML) - 📖
- SEO-friendly Markdown API documentationAPI Reference (Markdown) - 📊
- Test coverage analysisCoverage Reports - ✅
- Unit and E2E test resultsTest Reports - 🔐 Build Attestations- SLSA Level 3 provenance - 📦 SBOM- Software Bill of Materials - 🗺️
- Auto-generated sitemap for search enginesSitemap
💡
Note: Documentation is automatically generated and committed with each release vianpm 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)
-
Complete tool documentation with examplesAPI Usage Guide- C4 model diagrams and data flows** Architecture Diagrams**- Common issues and solutions** Troubleshooting Guide**- Development workflow and contributing** Developer Guide**- Claude Desktop, VS Code, Docker setup** Deployment Guide**- Optimization strategies** Performance Guide**- How documentation is generated** Documentation as Code Guide**
-
Complete architecture and design documentationARCHITECTURE.md- Security policy and vulnerability disclosure** SECURITY.md**- API security headers implementation** SECURITY_HEADERS.md**- Software Bill of Materials documentation** docs/SBOM.md**- Contribution guidelines** CONTRIBUTING.md**- Community code of conduct** CODE_OF_CONDUCT.md**- Development guidelines for GitHub Copilot**.github/copilot-instructions.md**- Custom GitHub Copilot agents**.github/agents/README.md**- Reusable skill patterns**.github/skills/README.md**
graph TB
Client[MCP Client<br/>Claude / VS Code / Cursor] -->|MCP Protocol stdio| Server[EP MCP Server<br/>TypeScript/Node.js]
subgraph "MCP Server (src/)"
direction TB
Tools["🔧 61 Tools<br/>getMEPs · analyzeCoalition<br/>assessMepInfluence · …"]
Resources["📦 9 Resources<br/>ep://meps/\{mepId\}<br/>ep://procedures/\{procedureId\} · …"]
Prompts["💬 7 Prompts<br/>mep_briefing<br/>coalition_analysis · …"]
end
Server --> Tools
Server --> Resources
Server --> Prompts
subgraph "Infrastructure"
Cache["LRU Cache<br/>500 entries · 15 min TTL"]
RateLimiter[Rate Limiter<br/>100 req/min]
AuditLog[Audit Logger<br/>GDPR Article 30]
end
Tools --> EPClient["EuropeanParliamentClient<br/>Facade → 8 sub-clients"]
Resources --> EPClient
EPClient --> Cache
EPClient --> RateLimiter
EPClient --> AuditLog
EPClient -->|HTTPS/TLS 1.3| EPAPI[European Parliament<br/>Open Data API v2<br/>data.europarl.europa.eu]
style Server fill:#4caf50,stroke:#2e7d32,color:#fff
style EPClient fill:#2196f3,stroke:#1565c0,color:#fff
style EPAPI fill:#9c27b0,stroke:#6a1b9a,color:#fff
style Cache fill:#ff9800,stroke:#e65100,color:#fff
style RateLimiter fill:#f44336,stroke:#b71c1c,color:#fff
style AuditLog fill:#607d8b,stroke:#37474f,color:#fff
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.
graph TB
subgraph OSINT["🕵️ OSINT Intelligence — 15 Tools"]
direction LR
subgraph MEP["MEP Profiling"]
A1["assess_mep_influence"]
A2["comparative_intelligence"]
A3["network_analysis"]
A4["track_mep_attendance"]
end
subgraph COALITION["Coalition Dynamics"]
B1["analyze_coalition_dynamics"]
B2["compare_political_groups"]
B3["detect_voting_anomalies"]
B4["sentiment_tracker"]
end
subgraph STRATEGY["Strategic Warning"]
C1["early_warning_system"]
C2["generate_political_landscape"]
C3["correlate_intelligence"]
end
subgraph LEG_INTEL["Legislative Intelligence"]
D1["analyze_legislative_effectiveness"]
D2["monitor_legislative_pipeline"]
D3["analyze_committee_activity"]
D4["analyze_country_delegation"]
end
end
subgraph ANALYTICS["📊 Advanced Analysis — 4 Tools"]
E1["analyze_voting_patterns"]
E2["track_legislation"]
E3["generate_report"]
E4["get_all_generated_stats"]
end
subgraph DATA["📦 Core EP Data — 30 Tools"]
F1["👤 MEP Tools (7)"]
F2["🏛️ Plenary & Meeting (9)"]
F3["📄 Document Tools (7)"]
F4["⚖️ Legislative (4)"]
F5["🏢 Committee (2)"]
F6["🔧 Diagnostics (1)"]
end
subgraph FEEDS["📡 Real-Time Feeds — 13 Tools"]
G1["13 change monitoring endpoints"]
end
OSINT -->|"enriched by"| ANALYTICS
ANALYTICS -->|"queries"| DATA
DATA -->|"monitors"| FEEDS
style OSINT fill:#d32f2f,stroke:#b71c1c,color:#fff,stroke-width:2px
style ANALYTICS fill:#1565c0,stroke:#0d47a1,color:#fff,stroke-width:2px
style DATA fill:#2e7d32,stroke:#1b5e20,color:#fff,stroke-width:2px
style FEEDS fill:#ff8f00,stroke:#e65100,color:#000,stroke-width:2px
style MEP fill:#e53935,stroke:#c62828,color:#fff,stroke-width:2px
style COALITION fill:#e53935,stroke:#c62828,color:#fff,stroke-width:2px
style STRATEGY fill:#e53935,stroke:#c62828,color:#fff,stroke-width:2px
style LEG_INTEL fill:#e53935,stroke:#c62828,color:#fff,stroke-width:2px
graph LR
subgraph COLLECT["1️⃣ Collect"]
direction TB
C1["get_meps"]
C2["get_plenary_sessions"]
C3["get_voting_records"]
C4["get_procedures"]
C5["13 feed tools"]
end
subgraph ANALYZE["2️⃣ Analyze"]
direction TB
AN1["analyze_voting_patterns"]
AN2["track_legislation"]
AN3["generate_report"]
AN4["get_all_generated_stats"]
end
subgraph ENRICH["3️⃣ Enrich"]
direction TB
E1["assess_mep_influence"]
E2["analyze_coalition_dynamics"]
E3["detect_voting_anomalies"]
E4["network_analysis"]
E5["analyze_legislative_effectiveness"]
end
subgraph FUSE["4️⃣ Fuse & Alert"]
direction TB
F1["correlate_intelligence"]
F2["early_warning_system"]
F3["generate_political_landscape"]
F4["comparative_intelligence"]
F5["sentiment_tracker"]
end
COLLECT -->|"raw data"| ANALYZE
ANALYZE -->|"structured"| ENRICH
ENRICH -->|"intelligence"| FUSE
style COLLECT fill:#2e7d32,stroke:#1b5e20,color:#fff,stroke-width:2px
style ANALYZE fill:#1565c0,stroke:#0d47a1,color:#fff,stroke-width:2px
style ENRICH fill:#9c27b0,stroke:#7b1fa2,color:#fff,stroke-width:2px
style FUSE fill:#d32f2f,stroke:#b71c1c,color:#fff,stroke-width:2px
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
correlate_intelligence |
assess_mep_influence
detect_voting_anomalies
analyze_coalition_dynamics
early_warning_system
comparative_intelligence
network_analysis
sentiment_tracker
generate_political_landscape
compare_political_groups
analyze_legislative_effectiveness
monitor_legislative_pipeline
analyze_committee_activity
track_mep_attendance
analyze_country_delegation
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
get_all_generated_stats |
30 OSINT-derived intelligence metricsincluding 3-axis political compassanalyze_voting_patterns
track_legislation
generate_report
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_meps |
GET /meps
get_mep_details
GET /meps/{id}
get_current_meps
GET /meps/show-current
get_incoming_meps
GET /meps/show-incoming
get_outgoing_meps
GET /meps/show-outgoing
get_homonym_meps
GET /meps/show-homonyms
get_mep_declarations
GET /meps-declarations
, GET /meps-declarations/{id}
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_plenary_sessions |
GET /meetings
, GET /meetings/{id}
get_voting_records
GET /meetings/{id}/vote-results
get_speeches
GET /speeches
, GET /speeches/{id}
get_events
GET /events
, GET /events/{id}
get_meeting_activities
GET /meetings/{id}/activities
get_meeting_decisions
GET /meetings/{id}/decisions
get_meeting_foreseen_activities
GET /meetings/{id}/foreseen-activities
get_meeting_plenary_session_documents
GET /meetings/{id}/plenary-session-documents
get_meeting_plenary_session_document_items
GET /meetings/{id}/plenary-session-document-items
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_committee_info |
GET /corporate-bodies
, GET /corporate-bodies/show-current
get_committee_documents
GET /committee-documents
, GET /committee-documents/{id}
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
search_documents |
GET /documents
, GET /documents/{id}
get_adopted_texts
GET /adopted-texts
, GET /adopted-texts/{id}
get_plenary_documents
GET /plenary-documents
, GET /plenary-documents/{id}
get_plenary_session_documents
GET /plenary-session-documents
, GET /plenary-session-documents/{id}
get_plenary_session_document_items
GET /plenary-session-documents-items
get_external_documents
GET /external-documents
, GET /external-documents/{id}
get_parliamentary_questions
GET /parliamentary-questions
, GET /parliamentary-questions/{id}
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_procedures |
GET /procedures
, GET /procedures/{id}
get_procedure_events
GET /procedures/{id}/events
get_procedure_event_by_id
GET /procedures/{id}/events/{event-id}
get_controlled_vocabularies
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:
Configurable-window(6 tools): Accepttimeframe
(today
,one-day
,one-week
,one-month
,custom
) + optionalstartDate
Fixed-window(7 tools): No parameters — return updates from a server-defined default window (typically one month)
Key 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_feed
andget_procedures_feed
always 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
timeframe
iscustom
,startDate
(YYYY-MM-DD) is required
Configurable-window feeds:
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_meps_feed |
GET /meps/feed
get_events_feed
GET /events/feed
get_procedures_feed
GET /procedures/feed
get_adopted_texts_feed
GET /adopted-texts/feed
get_mep_declarations_feed
GET /meps-declarations/feed
get_external_documents_feed
GET /external-documents/feed
Fixed-window feeds (no parameters):
| Tool | Description | Key Parameters | EP API Endpoint |
|---|---|---|---|
get_documents_feed |
(none)GET /documents/feed
get_plenary_documents_feed
(none)GET /plenary-documents/feed
get_committee_documents_feed
(none)GET /committee-documents/feed
get_plenary_session_documents_feed
(none)GET /plenary-session-documents/feed
get_parliamentary_questions_feed
(none)GET /parliamentary-questions/feed
get_corporate_bodies_feed
(none)GET /corporate-bodies/feed
get_controlled_vocabularies_feed
(none)GET /controlled-vocabularies/feed
| Tool | Description | Key Parameters | Output |
|---|---|---|---|
get_server_health |
(none)📖 ** 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 |
63 tools(15 OSINT)** United States**Congress.gov API MCP Server** United States**CongressMCP** United States**Congress.gov MCP** United Kingdom**Parliament MCP** Sweden**Riksdag & Regering MCPriksdagsmonitor.com)NetherlandsOpenTK MCP** Poland**Parliament of Poland MCP** Poland**Sejm MCP** Israel**Knesset MCP Server** Brazil**Senado BR MCP| Country | Server | Data Source | Coverage | |---|---|---|---| 🇺🇸 United States | |
United StatesOpen Census MCP** United States**Data.gov MCP Server** United States**CMS Data.gov MCP** United States**SEC EDGAR MCP** United States**NPS MCP** Sweden**SCB MCP Server** Sweden**Skolverket MCP** France**data.gouv.fr MCP** France**Data Gouv MCP Server** United Kingdom**Planning Data MCP** United Kingdom**Property Prices MCP** Netherlands**CBS Open Data MCP** Israel**Data.gov.il MCP** Israel**DataGov Israel MCP** Israel**Israel Statistics MCP** Israel**BudgetKey MCP** Turkey**Mevzuat MCP** Hong Kong**HK Data.gov.hk MCP** Malaysia**Data.gov.my MCP** India**Data.gov.in MCP** Singapore**Gahmen MCP Server** Singapore**Singapore Data MCPs** Australia**ABS MCP Server| Scope | Server | Platform | Coverage | |---|---|---|---| 🌐 Global (CKAN) | |
Global (Socrata)OpenGov MCP Server| 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 capabilitiesof any political MCP server, with63 specialized toolsincluding 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 |
API:https://data.europarl.europa.eu/api/v2/** Documentation**:https://data.europarl.europa.eu/en/developer-corner** Format**: JSON-LD, RDF/XML, Turtle** License**: European Parliament Open Data License
This project aligns with Hack23 AB's Information Security Management System (ISMS):
-
✅ ISO 27001:2022- Information security management - ✅ NIST CSF 2.0- Cybersecurity framework - ✅ CIS Controls v8.1- Security best practices - ✅ GDPR- EU data protection compliance
-
🔐 Authentication: API key + OAuth 2.0 (planned) - 🛡️ Input Validation: Zod schemas for all inputs - ⚡ Rate Limiting: 100 requests per minute - 🔒 Security Headers: CSP, HSTS, X-Frame-Options, etc. - 📝 Audit Logging: All data access logged - 🔍 Vulnerability Scanning: CodeQL, Dependabot, OSSF Scorecard
This project achieves SLSA Level 3 compliance:
-
✅ Build Provenance- Cryptographic proof of build integrity - ✅ Attestations- All artifacts cryptographically signed - ✅ Verification-
gh attestation verify <artifact> --owner Hack23 --repo European-Parliament-MCP-Server -
✅ npm Provenance- Published with provenance for package integrity - ✅ SBOM- SPDX-format Software Bill of Materials - ✅ Dependency Review- Automated vulnerability scanning - ✅ License Compliance- Only MIT, Apache-2.0, BSD, ISC allowed
See ATTESTATIONS.md for verification instructions and security benefits.
Per Hack23 Open Source Policy:
| Property | Value |
|---|---|
| CRA Classification | |
ConfidentialityIntegrityAvailability See CRA-ASSESSMENT.md for the full EU Cyber Resilience Act conformity assessment.
npm install
npm run dev
npm run type-check
npm run lint
npm run format
npm test
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
-
Detailed analysis of JSDoc documentation coverage across all source filesJSDoc Coverage Report- Quick reference guide for writing comprehensive JSDoc commentsJSDoc Quick Reference- Executive summary of documentation status and prioritiesJSDoc Coverage Summary- Visual representation of documentation coverage with charts and graphsJSDoc Coverage Visualization
-
System architecture and design patternsArchitecture Documentation- Data structures and type definitionsData Model- Guide for using the MCP server APIAPI Usage Guide- 📊 Comprehensive Mermaid visualization of all EP statistics (2004–2026), political compass, coalition dynamics, and OSINT intelligence metrics — all years validated against EP API v2EP Political Landscape
-
Test coverage statistics and analysisTest Coverage Report- Development setup and guidelinesDeveloper Guide- Performance optimization strategiesPerformance Guide
-
Vulnerability reporting and security practicesSecurity Policy- Security controls and architectureSecurity Architecture- Secure coding standardsSecure Development Policy- Open source compliance guidelinesOpen Source Policy
-
Production deployment instructionsDeployment Guide- Common issues and solutionsTroubleshooting Guide- Package publishing workflowNPM Publishing Guide
npm test
EP_INTEGRATION_TESTS=true npm run test:integration
EP_INTEGRATION_TESTS=true EP_SAVE_FIXTURES=true npm run test:integration
npm run test:e2e
npm run test:coverage
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).
npm run lint
npm run lint:fix
npm run knip
npm audit
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:
const stats = epClient.getCacheStats();
console.log(`Cache hit rate: ${stats.hitRate}%`)