european-parliament-mcp-server
v1.2.19
Published
Model Context Protocol server for European Parliament open data
Maintainers
Readme
📊 Quality Metrics & Documentation
📋 Overview
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.
🎯 Key Features
- 🔌 Full MCP Implementation: 62 tools (8 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
🌍 Hack23 Political Intelligence Ecosystem
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.
🎯 Vision: AI-Powered Democratic Transparency
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.
🧭 The Ecosystem at a Glance
%%{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/>62 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:#fffThis 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.
🗂️ Portfolio Comparison Matrix
🇪🇺 EU Parliament Monitor — euparliamentmonitor.com
European Parliament Political Intelligence Platform — 🧠 Political intelligence · 🔍 Radical transparency · 🗳️ Democratic accountability · 🤖 AI-generated news in 14 languages
🗳️ Riksdagsmonitor — riksdagsmonitor.com
Swedish Political Intelligence Platform — 🕵️ Political intelligence · 🔍 Democratic transparency · 🤖 AI-generated news · 📊 50+ years of evidence
🕵️ Citizen Intelligence Agency (CIA)
Political transparency platform — Java/Spring data backbone behind Riksdagsmonitor's historical evidence layer
🌍 Shared Across the Portfolio
| 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 |
🔗 Hack23 Portfolio Quick Links
- 🌐 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 · founder James Pether Sörling, CISSP, CISM
- 🤖 AI-readable wikis — DeepWiki: European-Parliament-MCP-Server · DeepWiki: euparliamentmonitor · DeepWiki: riksdagsmonitor · DeepWiki: cia
🔐 Security & Compliance
🚀 Quick Start
Run with npx (No Installation Required)
npx -y european-parliament-mcp-serverPrerequisites
- Node.js 25.x or higher
- npm 10.x or higher
Installation
Option 1: Install from npm (Recommended)
# Install the package globally
npm install -g european-parliament-mcp-server
# Or install as a dependency in your project
npm install european-parliament-mcp-serverOption 2: Install from source
# 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 testUsage with MCP Client
Claude Desktop Configuration (npm install)
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"
}
}
}
}Claude Desktop Configuration (source install)
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"
}
}
}
}VS Code Extension
Configure in .vscode/mcp.json:
{
"servers": {
"european-parliament": {
"type": "stdio",
"command": "npx",
"args": ["-y", "european-parliament-mcp-server"]
}
}
}Cursor IDE Configuration
Add to ~/.cursor/mcp.json (or project-level .cursor/mcp.json):
{
"mcpServers": {
"european-parliament": {
"command": "npx",
"args": ["european-parliament-mcp-server"],
"env": {}
}
}
}Custom Timeout Configuration
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.
📚 Documentation
🌐 Documentation Portal
📖 Complete Documentation Site - Live documentation portal with:
- 📖 API Reference (HTML) - TypeDoc generated API documentation with search, hierarchy navigation, and full type information
- 📖 API Reference (Markdown) - SEO-friendly Markdown API documentation
- 📊 Coverage Reports - Test coverage analysis
- ✅ Test Reports - Unit and E2E test results
- 🔐 Build Attestations - SLSA Level 3 provenance
- 📦 SBOM - Software Bill of Materials
- 🗺️ Sitemap - Auto-generated sitemap for search engines
💡 Note: Documentation is automatically generated and committed with each release via
npm run docs:build
Generated API Documentation
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)Core Documentation
- API Usage Guide - Complete tool documentation with examples
- Architecture Diagrams - C4 model diagrams and data flows
- Troubleshooting Guide - Common issues and solutions
- Developer Guide - Development workflow and contributing
- Deployment Guide - Claude Desktop, VS Code, Docker setup
- Performance Guide - Optimization strategies
- Documentation as Code Guide - How documentation is generated
Additional Documentation
- ARCHITECTURE.md - Complete architecture and design documentation
- SECURITY.md - Security policy and vulnerability disclosure
- SECURITY_HEADERS.md - API security headers implementation
- docs/SBOM.md - Software Bill of Materials documentation
- CONTRIBUTING.md - Contribution guidelines
- CODE_OF_CONDUCT.md - Community code of conduct
- .github/copilot-instructions.md - Development guidelines for GitHub Copilot
- .github/agents/README.md - Custom GitHub Copilot agents
- .github/skills/README.md - Reusable skill patterns
🏗️ Architecture Overview
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:#fffData 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.
🔌 MCP Tools (62 Total)
62 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.
🗺️ Political Intelligence Coverage Map
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🎯 OSINT Intelligence Workflow
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🕵️ OSINT Intelligence Tools (15)
| 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 |
📊 Advanced Analysis Tools (4)
| 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 |
👤 MEP Tools (7)
| 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} |
🏛️ Plenary & Meeting Tools (9)
| 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 |
🏢 Committee Tools (2)
| 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} |
📄 Document Tools (7)
| 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} |
⚖️ Legislative Procedure Tools (4)
| 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} |
📡 Feed Tools (13)
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): Accept
timeframe(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_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 |
🔧 Server Diagnostics (1)
| 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 →
Common Use Cases
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 →
📝 MCP Prompts
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? |
📦 MCP Resources
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 |
🗺️ Global Political MCP Servers & OSINT Coverage
The European Parliament MCP Server is part of a growing ecosystem o
