# European Parliament MCP Server – Political Intelligence for AI Agents

> Source: <https://github.com/Hack23/European-Parliament-MCP-Server>
> Published: 2026-07-14 06:29:46+00:00

**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 Monitor](https://euparliamentmonitor.com)AI newsroom and is a sister project to

[Riksdagsmonitor](https://riksdagsmonitor.com)in the

[Hack23](https://hack23.com)political-intelligence portfolio.

The **European Parliament MCP Server** implements the [Model Context Protocol (MCP)](https://spec.modelcontextprotocol.io/) 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 the`typescript-7`

alias (`node_modules/typescript-7/bin/tsc`

)**Compatibility layer**:`@typescript/typescript6`

remains available so existing 6.x-based tooling can continue using`tsc6`

and the TypeScript 6 API**Core platform**:`@modelcontextprotocol/sdk`

1.29.0,`zod`

4.4.3,`vitest`

4.1.10

This MCP server is the **EU data backbone** of [Hack23](https://hack23.com/)'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](https://github.com/Hack23/ISMS-PUBLIC) 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 |

💻

[GitHub](https://github.com/Hack23/European-Parliament-MCP-Server)

**EU Parliament Monitor** 8 unified gh-aw workflows · 51-artifact analysis pipeline**Source:** this MCP server (60+ tools) + IMF + World Bank**euparliamentmonitor.com**🧠

[Intelligence Hub](https://euparliamentmonitor.com/political-intelligence.html)📚

[API Reference](https://euparliamentmonitor.com/docs/api/)💻

[GitHub](https://github.com/Hack23/euparliamentmonitor)**Riksdagsmonitor** 11 agentic workflows · 91 skills · 50+ years of evidence (1971–2024) · Tidö coalition fragility tracker**Source:**`riksdag-regering`

MCP (32+ tools) + SCB + IMF + World Bank + CIA exports**riksdagsmonitor.com**🧠

[Intelligence](https://riksdagsmonitor.com/political-intelligence.html)📰

[AI Newsroom](https://riksdagsmonitor.com/news/index.html)📊

[Dashboard](https://riksdagsmonitor.com/dashboard/index.html)💻

[GitHub](https://github.com/Hack23/riksdagsmonitor)**Citizen 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 + ESV**hack23.github.io/cia**💻

[GitHub](https://github.com/Hack23/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](https://github.com/githubnext/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, plus`news-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-LD`NewsArticle.isBasedOn`

provenance linking back to source artifacts, and`hreflang`

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 with`euparliamentmonitor`

[npm provenance](https://docs.npmjs.com/generating-provenance-statements)and 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 at[SKILLS.md](https://github.com/Hack23/riksdagsmonitor/blob/main/SKILLS.md)/[AGENTS.md](https://github.com/Hack23/riksdagsmonitor/blob/main/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](https://riksdagsmonitor.com/dashboard/index.html)— 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 Loader · 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 |
|

**ISMS**[Hack23 ISMS-PUBLIC](https://github.com/Hack23/ISMS-PUBLIC)— fully documented information-security management system- 🌐
**Live platforms**—[euparliamentmonitor.com](https://euparliamentmonitor.com)·[riksdagsmonitor.com](https://riksdagsmonitor.com)·[hack23.github.io/cia](https://hack23.github.io/cia/)·[hack23.com](https://hack23.com) - 🧠
**Political Intelligence Hubs**—[EU Parliament](https://euparliamentmonitor.com/political-intelligence.html)·[Riksdag](https://riksdagsmonitor.com/political-intelligence.html) - 📂
**Source repositories**—[European-Parliament-MCP-Server](https://github.com/Hack23/European-Parliament-MCP-Server)·[euparliamentmonitor](https://github.com/Hack23/euparliamentmonitor)·[riksdagsmonitor](https://github.com/Hack23/riksdagsmonitor)·[cia](https://github.com/Hack23/cia)·[ISMS-PUBLIC](https://github.com/Hack23/ISMS-PUBLIC) - 📦
**npm packages**—·`european-parliament-mcp-server`

·`euparliamentmonitor`

`riksdagsmonitor`

- 📰
**Blog & company**—[Hack23 blog](https://hack23.com/blog.html)·[LinkedIn — Hack23 AB](https://www.linkedin.com/company/hack23/)· founder[James Pether Sörling, CISSP, CISM](https://www.linkedin.com/in/jamessorling/) - 🤖
**AI-readable wikis**—[DeepWiki: European-Parliament-MCP-Server](https://deepwiki.com/Hack23/European-Parliament-MCP-Server)·[DeepWiki: euparliamentmonitor](https://deepwiki.com/Hack23/euparliamentmonitor)·[DeepWiki: riksdagsmonitor](https://deepwiki.com/Hack23/riksdagsmonitor)·[DeepWiki: cia](https://deepwiki.com/Hack23/cia)

```
npx -y european-parliament-mcp-server
```

- Node.js 26.x or higher
- npm 10.x or higher

```
# 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/feed`

and`events/feed`

endpoints automatically use an extended 120 s timeout because these EP API endpoints are significantly slower than others. If you experience timeouts with`one-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 information[API Reference (HTML)](https://hack23.github.io/European-Parliament-MCP-Server/api/) - 📖
- SEO-friendly Markdown API documentation[API Reference (Markdown)](https://hack23.github.io/European-Parliament-MCP-Server/api-markdown/) - 📊
- Test coverage analysis[Coverage Reports](https://hack23.github.io/European-Parliament-MCP-Server/coverage/) - ✅
- Unit and E2E test results[Test Reports](https://hack23.github.io/European-Parliament-MCP-Server/test-results/) - 🔐
**Build Attestations**- SLSA Level 3 provenance - 📦
**SBOM**- Software Bill of Materials - 🗺️
- Auto-generated sitemap for search engines[Sitemap](https://hack23.github.io/European-Parliament-MCP-Server/api/sitemap.xml)

💡

Note: Documentation is automatically generated and committed with each release via`npm run docs:build`

The API documentation is generated using [TypeDoc](https://typedoc.org/) 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 examples**API 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 documentation**ARCHITECTURE.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**

``` php
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 metrics](/Hack23/European-Parliament-MCP-Server/blob/main/EP_POLITICAL_LANDSCAPE.md)including 3-axis political compass`analyze_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](/Hack23/European-Parliament-MCP-Server/blob/main/docs/ep-openapi-spec.json), feeds fall into two groups:

**Configurable-window**(6 tools): Accept`timeframe`

(`today`

,`one-day`

,`one-week`

,`one-month`

,`custom`

) + optional`startDate`

**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[]`

, and`dataQualityWarnings[]`

- Empty feeds (EP API 404 or error-in-body) are converted to empty
`data[]`

with a warning — not errors`get_events_feed`

and`get_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`

is`custom`

,`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 →](https://hack23.github.io/European-Parliament-MCP-Server/api-markdown/)**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 →](/Hack23/European-Parliament-MCP-Server/blob/main/API_USAGE_GUIDE.md#common-use-cases)

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](https://github.com/bsmi021/mcp-congress_gov_server)** United States**[CongressMCP](https://github.com/amurshak/congressMCP)** United States**[Congress.gov MCP](https://github.com/AshwinSundar/congress_gov_mcp)** United Kingdom**[Parliament MCP](https://github.com/i-dot-ai/parliament-mcp)** Sweden**[Riksdag & Regering MCP](https://github.com/isakskogstad/Riksdag-Regering-MCP)[riksdagsmonitor.com](https://riksdagsmonitor.com/))**Netherlands**[OpenTK MCP](https://github.com/r-huijts/opentk-mcp)** Poland**[Parliament of Poland MCP](https://github.com/pkolawa/parliament-poland-mcp-server)** Poland**[Sejm MCP](https://github.com/janisz/sejm-mcp)** Israel**[Knesset MCP Server](https://github.com/zohar/knesset-mcp)** Brazil**[Senado BR MCP](https://mcpservers.org/servers/sidneybissoli/senado-br-mcp)| Country | Server | Data Source | Coverage |
|---|---|---|---|
🇺🇸 United States |
|

**United States**[Open Census MCP](https://mcpservers.org/servers/brockwebb/open-census-mcp-server)** United States**[Data.gov MCP Server](https://github.com/melaodoidao/datagov-mcp-server)** United States**[CMS Data.gov MCP](https://github.com/clarifyhealth/cms-datagov-mcp-server)** United States**[SEC EDGAR MCP](https://github.com/stefanoamorelli/sec-edgar-mcp)** United States**[NPS MCP](https://github.com/amysatterlee/nps_mcp)** Sweden**[SCB MCP Server](https://mcpservers.org/servers/isakskogstad/scb-mcp)** Sweden**[Skolverket MCP](https://mcpservers.org/servers/ksaklfszf921/skolverket-mcp)** France**[data.gouv.fr MCP](https://github.com/datagouv/datagouv-mcp)** France**[Data Gouv MCP Server](https://mcpservers.org/servers/csonigo/datagouv-mcp-server)** United Kingdom**[Planning Data MCP](https://github.com/alizoli/planningdatagovuk-api)** United Kingdom**[Property Prices MCP](https://github.com/joemclo/property-prices-mcp)** Netherlands**[CBS Open Data MCP](https://github.com/dstotijn/mcp-cbs-cijfers-open-data)** Israel**[Data.gov.il MCP](https://github.com/DavidOsherProceed/data-gov-il-mcp)** Israel**[DataGov Israel MCP](https://github.com/aviveldan/datagov-mcp)** Israel**[Israel Statistics MCP](https://github.com/reuvenaor/israel-statistics-mcp)** Israel**[BudgetKey MCP](https://github.com/OpenBudget/budgetkey-mcp)** Turkey**[Mevzuat MCP](https://mcpservers.org/servers/MCP-Mirror/saidsurucu_mevzuat-mcp)** Hong Kong**[HK Data.gov.hk MCP](https://github.com/hkopenai/hk-datagovhk-mcp-server)** Malaysia**[Data.gov.my MCP](https://github.com/manfye/data-dosm-mcp-nodejs)** India**[Data.gov.in MCP](https://github.com/adwait-ai/mcp_data_gov_in)** Singapore**[Gahmen MCP Server](https://github.com/aniruddha-adhikary/gahmen-mcp)** Singapore**[Singapore Data MCPs](https://github.com/prezgamer/Singapore-Data-MCPs)** Australia**[ABS MCP Server](https://github.com/seansoreilly/mcp-server-abs)| Scope | Server | Platform | Coverage |
|---|---|---|---|
🌐 Global (CKAN) |
|

**Global (Socrata)**[OpenGov MCP Server](https://github.com/srobbin/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](https://data.europarl.europa.eu/en/developer-corner/opendata-api) 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/](https://data.europarl.europa.eu/api/v2/)** Documentation**:[https://data.europarl.europa.eu/en/developer-corner](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)](https://github.com/Hack23/ISMS-PUBLIC):

- ✅
**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](/Hack23/European-Parliament-MCP-Server/blob/main/docs/ATTESTATIONS.md) for verification instructions and security benefits.

Per [Hack23 Open Source Policy](https://github.com/Hack23/ISMS-PUBLIC/blob/main/Open_Source_Policy.md):

| Property | Value |
|---|---|
CRA Classification |
|

**Confidentiality****Integrity****Availability** See [ CRA-ASSESSMENT.md](/Hack23/European-Parliament-MCP-Server/blob/main/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
```

- Detailed analysis of JSDoc documentation coverage across all source files[JSDoc Coverage Report](/Hack23/European-Parliament-MCP-Server/blob/main/JSDOC_COVERAGE_REPORT.md)- Quick reference guide for writing comprehensive JSDoc comments[JSDoc Quick Reference](/Hack23/European-Parliament-MCP-Server/blob/main/docs/JSDOC_QUICK_REFERENCE.md)- Executive summary of documentation status and priorities[JSDoc Coverage Summary](/Hack23/European-Parliament-MCP-Server/blob/main/JSDOC_COVERAGE_SUMMARY.md)- Visual representation of documentation coverage with charts and graphs[JSDoc Coverage Visualization](/Hack23/European-Parliament-MCP-Server/blob/main/docs/JSDOC_COVERAGE_VISUALIZATION.md)

- System architecture and design patterns[Architecture Documentation](/Hack23/European-Parliament-MCP-Server/blob/main/ARCHITECTURE.md)- Data structures and type definitions[Data Model](/Hack23/European-Parliament-MCP-Server/blob/main/DATA_MODEL.md)- Guide for using the MCP server API[API Usage Guide](/Hack23/European-Parliament-MCP-Server/blob/main/API_USAGE_GUIDE.md)- 📊 Comprehensive Mermaid visualization of all EP statistics (2004–2026), political compass, coalition dynamics, and OSINT intelligence metrics — all years validated against EP API v2[EP Political Landscape](/Hack23/European-Parliament-MCP-Server/blob/main/EP_POLITICAL_LANDSCAPE.md)

- Test coverage statistics and analysis[Test Coverage Report](/Hack23/European-Parliament-MCP-Server/blob/main/TEST_COVERAGE_REPORT.md)- Development setup and guidelines[Developer Guide](/Hack23/European-Parliament-MCP-Server/blob/main/DEVELOPER_GUIDE.md)- Performance optimization strategies[Performance Guide](/Hack23/European-Parliament-MCP-Server/blob/main/PERFORMANCE_GUIDE.md)

- Vulnerability reporting and security practices[Security Policy](/Hack23/European-Parliament-MCP-Server/blob/main/SECURITY.md)- Security controls and architecture[Security Architecture](/Hack23/European-Parliament-MCP-Server/blob/main/SECURITY_ARCHITECTURE.md)- Secure coding standards[Secure Development Policy](/Hack23/European-Parliament-MCP-Server/blob/main/Secure_Development_Policy.md)- Open source compliance guidelines[Open Source Policy](/Hack23/European-Parliament-MCP-Server/blob/main/Open_Source_Policy.md)

- Production deployment instructions[Deployment Guide](/Hack23/European-Parliament-MCP-Server/blob/main/DEPLOYMENT_GUIDE.md)- Common issues and solutions[Troubleshooting Guide](#troubleshooting)- Package publishing workflow[NPM Publishing Guide](/Hack23/European-Parliament-MCP-Server/blob/main/NPM_PUBLISHING.md)

```
# 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](/Hack23/European-Parliament-MCP-Server/blob/main/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

# Optional: keep Mermaid diagrams readable while editing
# (Mermaid validation is not currently enforced in CI)
```

**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}%`)
```


