关于 eu-parliament-mcp-server
eu-parliament-mcp-server 通过 MCP 提供欧洲议会开放记录,包括程序、议员、投票、文件、演讲和质询。适用于研究议会活动的用户,支持关联来源记录及分页结果。
主要功能
- 01发现程序及其相关证据
- 02搜索文件、演讲和质询
- 03查找议员及已发布的成员历史
- 04查看全体会议决定和投票者记录
- 05通过来源链接和标识符分页获取结果
适用场景
- 01跟踪立法程序及其相关文件
- 02查询议员已发布的成员历史
- 03查看全体会议决定和投票立场
- 04查找议会演讲或质询
MCP 相关
向 MCP 客户端提供九种只读的欧洲议会数据工具。服务支持 stdio 或 Streamable HTTP,从欧洲议会开放数据 API 获取记录,无需 API 密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://eu-parliament.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-eu-parliament https://eu-parliament.caseyjhand.com/mcp{"mcpServers":{"cyanheads-eu-parliament":{"type":"http","url":"https://eu-parliament.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-eu-parliament":{"type":"http","url":"https://eu-parliament.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-eu-parliament":{"type":"http","url":"https://eu-parliament.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-eu-parliament":{"serverUrl":"https://eu-parliament.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
9| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 请求的完整项目数;默认值为 20,组织的有效上限为 20,其他主题为 100,并会显示提示。 |
| topic | enum | 是 | 参考主题;organizations 要求 organization_ids,其他主题不接受该参数。committees | political_groups | organizations | procedure_types | document_types | question_types | activity_types | mep_filters | identifiers | coverage |
| offset | integer | 否 | 从零开始的集合偏移量;默认值为 0。 |
| language | string | 否 | 支持的 EU ISO-639-1 语言,不区分大小写;默认值为 en;不会翻译源文本。 |
| organization_ids | array | 否 | 仅 organizations 必须提供非空列表;保留顺序和重复项,每页最多查询 20 个。 |
详细介绍
@cyanheads/eu-parliament-mcp-server
通过 MCP 跟踪欧洲议会的程序、欧洲议会议员、投票、文件、演讲和质询。支持 STDIO 或 Streamable HTTP。
概览
欧洲议会记录来自开放数据 API:探索立法程序、追踪相关证据、查找欧洲议会议员、查看全体会议的决定和投票者,以及获取文件、演讲和质询的元数据。可作为 stdio 进程或本地 Streamable HTTP 服务运行。无需 API 密钥。
工具
| 工具 | 说明 |
|---|---|
euparl_list_reference | 查找筛选代码、标识符格式、数据覆盖范围、委员会和政治团体 |
euparl_list_procedures | 按类型列出程序参考信息 |
euparl_get_procedure | 查看程序标识、阶段、事件、参与者和文件参考信息 |
euparl_search_documents | 搜索已通过的文本、列出委员会/全体会议文件,或获取任意规范文件 |
euparl_search_speeches | 搜索第十届任期的演讲活动,并获取元数据和录音文件链接 |
euparl_search_meps | 在完整的现任或指定任期名单中查找欧洲议会议员 |
euparl_get_mep | 查看议员身份信息和已发布的任职历史 |
euparl_get_plenary_votes | 查找会议、查看决定,并分页获取记录在案或预期的投票者 |
euparl_list_questions | 按年份/类型列出质询,或获取质询及答复参考信息 |
能力参考
所有列表工具都接受 offset(默认值为 0)、limit(默认值为 20,接受范围为 1–1000,实际最大值为 100,并会显示提示)和 language(默认值为 en,须为 24 个欧盟语言代码之一)。请遵循 page.next_offset;对于本地集合,还需传入返回的 page.snapshot。snapshot_changed 错误要求从偏移量 0 开始重新查询,且不传入快照。本地快照会在重新查询时检测变更;不会保留历史数据。
本地化文本会标明其实际来源语言;如使用回退语言,也会予以说明,且文本不会被翻译。缺少详情时通常返回 found: false;空列表会成功返回并附带指引。丰富决策查询则会返回 decision_not_found。
euparl_list_reference 工具
- 必填参数
topic:committees、political_groups、procedure_types、document_types、question_types、activity_types、mep_filters、identifiers或coverage - 委员会和政治团体是现行的法人机构;组织标识符不代表可用的筛选代码。参考页面无需快照
euparl_list_procedures 工具
- 可选参数
process_type,取值来自euparl_list_reference;不支持关键字、年份、委员会或阶段筛选 - 稀疏记录包含
procedure_id、来源 URL 和可用的参考信息/类型;使用euparl_get_procedure获取标题、阶段和参与者
euparl_get_procedure 工具
- 必填参数
procedure_id接受YYYY-NNNN、YYYY/NNNN(TYPE)、可选字母后缀、已知路径前缀或完整的公开程序 URI section: "overview"返回标量元数据和集合计数;events、participants和documents可使用快照对一个集合分页- 历史参与者群组会保留其历史状态。请在 get 模式下使用
euparl_search_documents查询文档 ID
euparl_search_documents 工具
mode: "search"默认使用source: "adopted_texts";只有该类别接受text、title、会议日期和related_process_id。已通过文本接受年份和届次;委员会类接受届次,全体会议类接受年份work_type使用euparl_list_reference中按类别划分的代码。委员会/全体会议检索不支持关键字筛选mode: "get"必须提供document_id,且不接受来源、搜索筛选条件和非默认分页参数。程序、演讲、投票、问题和答复中的 ID 均使用此查询- 详情包含元数据、程序/上级引用,以及所选语言下的所有来源文件链接。若某个细分文档没有文件,请沿
parent_document_ids查询;不会下载或提取文档正文
euparl_search_speeches 工具
- 可按
text、title、person_id、activity_type或会议日期范围搜索;覆盖范围仅限议会第 10 届任期 mode: "get"必须提供speech_id,且不接受搜索筛选条件和非默认分页参数- 返回活动元数据和参与者,不含演讲稿。请通过文档 get 查询
document_ids,并沿任何上级引用查找来源文件
euparl_search_meps 工具
- 省略
term时选择当前在任的议员;明确指定term时选择第 0–10 届的已发布名册。可选的国家、政治团体和性别代码取自mep_filters name_contains会在分页前,对完整名册中的所有规范化词元进行匹配,并忽略大小写、变音符号和标点- 结果使用快照继续分页。国家/团体信息描述所选名册的上下文,而非投票日期时的党派归属
euparl_get_mep 工具
mep_id接受十进制人员 ID、person/前缀或完整的公开人员 URI- 默认的
section: "overview"返回身份信息和membership_count;section: "memberships"使用快照对已发布的任职历史分页 - 未提供成员资格结束日期并不能证明其目前仍具成员资格
euparl_get_plenary_votes 工具
mode: "sittings"需要year;默认的decisions模式需要sitting_id,并分页返回精简摘要。开会 ID 可使用真实的YYYY-MM-DD日期、MTG-PL-格式、已知事件前缀或公开 URImode: "decision"需要开会 ID 和决议 ID,并返回一条完整记录,包含完整标签、说明和文档引用;该模式不支持分页和快照mode: "voters"还需要position:favor、against、abstention、intended_favor、intended_against或intended_abstention。决议和投票者位置分别分页,并支持快照resolve_names: true仅适用于投票者模式,且需要roster_term(0–10);无法解析的 ID 仍会保留在输出中。姓名来自该届已公布的名册,不包含投票日期时的隶属关系- 已公布的计票结果与投票者数组中的计数分别保留。
available: false表示数组缺失;已公布的空数组则为available: true。拟议更正不会替代记录在案的投票
euparl_list_questions 工具
- 默认的
mode: "list"接受year和work_type;不支持按关键词、作者或收件人搜索 mode: "get"需要question_id:可使用规范工作 ID、已知文档前缀/公开 URI,或人工引用格式(如E-000001/2025,也支持 P/O 前缀)。可选的term可直接解析引用;若省略,则会搜索引用年份内的所有记录,并要求只有一个精确匹配项- Get 模式不接受列表筛选条件和非默认分页设置。详情会返回元数据、源文件和已公布的答复引用;
answers为空并不能证明该问题尚未得到答复
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可替换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
欧洲议会专属功能:
- 无需密钥即可访问议会的公开 JSON-LD 记录,并通过规范标识符关联发现结果、详情和来源证据
- 共享请求节流、有限重试,以及一个覆盖数据获取和队列等待的 40 秒操作时限
- 完整名册姓名筛选;程序证据、成员资格历史、决议摘要和投票者数据分别分页
便于 Agent 使用的输出:
- 来源 URL、实际语言标签、规范化筛选条件、可用时提供的精确总数,以及后续操作指引
- 缺失字段会保留其不确定性;已公布的零值、缺失数组和历史隶属关系均分别呈现
content[]和structuredContent中包含匹配的数据,并提供可用的来源链接和类型化错误原因
数据来源:European Parliament Open Data,依据 CC BY 4.0 许可。本服务会规范化标识符和记录结构。议会记录并不能证明已制定法律信息完整无缺,也不能证明某位成员的终身投票历史完整无缺。
开始使用
自托管/本地部署
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/eu-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/eu-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 Docker:
{
"mcpServers": {
"eu-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/eu-parliament-mcp-server:latest"]
}
}
}
使用 Streamable HTTP 时,设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
先决条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥或上游账户。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/eu-parliament-mcp-server.git
- 进入目录:
cd eu-parliament-mcp-server
- 安装依赖项:
bun install
- 配置环境:
cp .env.example .env
# edit .env to override framework settings as needed
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_HOST | HTTP 监听主机。 | 127.0.0.1 |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证方式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
LOGS_DIR | 日志文件目录(仅 Node.js)。 | <app-root>/logs |
STORAGE_PROVIDER_TYPE | 存储后端:in-memory、filesystem、supabase、cloudflare-kv/r2/d1。 | in-memory |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
无需设置特定于服务的环境变量。常见的框架覆盖项请参阅 .env.example。
运行服务
本地开发
-
构建并运行生产版本:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
项目结构
| 目录 | 用途 |
|---|---|
src/mcp-server/tools/definitions | 九个只读工具定义(*.tool.ts)。 |
src/mcp-server/tools/utils | 共享模式、无损渲染和数据增强。 |
src/services/eu-parliament | JSON-LD 客户端、边缘模式、参考代码、规范化和领域工作流。 |
tests/ | 单元测试和集成测试,结构与 src/ 相对应。 |
docs/ | 设计约定和生成的项目目录树。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要说明:
- 处理器抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录日志,使用ctx.state存储数据 - 在
src/index.ts的createApp()数组中注册新工具和资源 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出模式;切勿伪造缺失字段
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
本项目采用 Apache 2.0 许可证。详情请参阅 LICENSE 文件。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。