关于 sweden-parliament-mcp-server
这是面向查询瑞典议会记录的 MCP 服务,数据来自瑞典议会开放数据。可检索议会文件、演讲、投票、议员及 SFS 法规,并支持 stdio 和 Streamable HTTP。
主要功能
- 01检索议会文件与 SFS 法规
- 02读取文件文本及决议信息
- 03按会期和议员检索演讲
- 04查询报告及议员投票
- 05检索议员与任职记录
适用场景
- 01查找特定委员会或会期的议会文件
- 02阅读议会辩论中的发言内容
- 03核对报告决议及党团投票数
- 04查询议员的历史任职记录
MCP 相关
向 MCP 客户端提供 7 个只读工具,用于检索瑞典议会文件、法规、演讲、投票和议员数据。支持 stdio 与 Streamable HTTP。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://sweden-parliament.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-sweden-parliament https://sweden-parliament.caseyjhand.com/mcp{"mcpServers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-sweden-parliament":{"type":"http","url":"https://sweden-parliament.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-sweden-parliament":{"serverUrl":"https://sweden-parliament.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
7| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 请求的条目数;超过 100 的值会被限制为 100,并附带提示。 |
| topic | enum | 是 | 要浏览的词汇或指南主题。document_types | committees | parties | constituencies | speech_types | sessions | identifiers | coverage |
| offset | integer | 否 | 从 0 开始的本地条目偏移量。 |
详细介绍
@cyanheads/sweden-parliament-mcp-server
通过 MCP 搜索瑞典议会文件、演讲、投票、议员和法规。支持 STDIO 或 Streamable HTTP。
概述
瑞典议会记录来自 Riksdagen Open Data。查找提案和委员会报告,追踪已公布的决议和主要投票,阅读演讲,查看议员任职情况,并检索整合后的 SFS 法规。可作为 stdio 进程或本地 Streamable HTTP 服务运行;无需 API 密钥。
来源:瑞典议会。本独立服务并非由 Sveriges riksdag 运营或认可。瑞典语标题、标签、决议和文本均保留来源原文;仅在来源提供英语标签时显示英文标签。
工具
| 工具 | 说明 |
|---|---|
riksdag_list_reference | 浏览官方文件类型、委员会、政党、选区、会期,以及标识符和数据覆盖范围说明 |
riksdag_search_documents | 按词语、类型、会期、委员会、政党或日期搜索议会文件和整合后的 SFS 法规 |
riksdag_get_document | 查看发布元数据、决议、保留意见、活动、链接和分页文本 |
riksdag_search_speeches | 按辩论标题、议员或政党查找某一会期内的演讲;通过 get 模式检索全文 |
riksdag_get_votes | 查看报告决议及按政党汇总的主要投票数,或某位议员在某一会期的主要投票记录 |
riksdag_search_members | 按姓名、政党、选区和来源服务分类查找登记条目 |
riksdag_get_member | 查看精确的议员 IID 及其已公布的任职历史 |
功能参考
riksdag_list_reference 工具
topic:document_types、committees、parties、constituencies、speech_types、sessions、identifiers或coverage- 带日期的离线快照,包含瑞典语标签、可用的来源英文标签、来源链接和
referenceVerifiedAt;文件子类型与父代码保持分开,会期目录可能滞后于当前会期 - 使用
offset分页;limit默认为 20,最大为 100,并提供totalCount和完整的nextCall参数
riksdag_search_documents 工具
- 可选参数:
query、documentType、session、committee、party、dateFrom和dateTo;日期格式为YYYY-MM-DD,并接受代码或精确的参考标签 - 远程
page从 1 开始;pageSize默认为 10,最大为 50。返回每条已获取的记录,并保留来源排序;提供可用的totalCount和nextCall - 合并法规请使用
documentType: "sfs";缓慢的全文搜索请使用session或documentType缩小范围
riksdag_get_document 工具
- 必填
documentId,取自搜索结果;也可使用明确无歧义的 SFS 标识符,例如1974:152;找不到记录时返回found: false - 省略
sections时,返回元数据、完整大纲和第一页文本;可选择metadata、decisions、reservations、activities、properties、attachments、references、text或source_html - 文本和 HTML 使用 Unicode 码点偏移量(
textOffset/htmlOffset);长度默认为 1,000,并遵循显式指定的textLength/htmlLength值。数组分区使用sectionOffset/sectionLimit(默认为 20,最大值为 100) - 使用
nextTextCall、nextHtmlCall或各sectionPages[].nextCall获取后续内容,并保留revision;记录变更时会返回revision_changed。附件仅提供链接,不会下载文件 - SFS
versionKind: "consolidated"表示已发布的合并文本,其中可能包含未来生效的条款;它不是颁布时版本,也不是特定时间点的法律版本
riksdag_search_speeches 工具
mode: "search"(默认值)要求提供session;可选的memberId、party和speechType: "all" | "speech"可缩小选择范围,其中speech会排除答复headingContains会匹配标题和副标题中的所有词元,不区分大小写和变音符号;不会搜索演讲正文- 使用本地
offset分页;limit默认为 5,最大为 20。textCount默认为 1,最大为 5;设为 0 时仅返回元数据 mode: "get"要求提供从搜索结果中复制的检索用speechId,而不是sourceSpeechId。get 模式不接受搜索筛选条件。textOffset和可选的textLength用于读取已发布的完整正文,并通过nextTextCall获取后续内容;默认文本页为 1,000 个码点textState的值为included、not_requested、unavailable或failed;暂时性内容加载失败会附带恢复详情。在搜索或文本续传时保留revision
riksdag_get_votes 工具
- 必填
mode和session;mode: "report"接受report(议案编号或 session:designation)或报告的documentId;mode: "member"要求提供memberId,并允许提供party - report 模式返回权威决议和完整的党派分组。选择一个
point,或使用pointOffset/pointLimit(默认为 5,最大值为 10);member 模式使用offset/limit(默认为 20,最大值为 500) - 仅包含已发布的主表决,不包含每一轮投票。
rollCallState的值为available、acclamation、not_published或unknown;只有存在明确的决议证据时才能判定为鼓掌通过,不能仅凭投票记录为空来判定 - 缺失的汇总计数仍视为未知;来源中额外的投票标签会保留在
otherVotes中。使用nextCall获取剩余的完整议题或议员记录,并保留revision
riksdag_search_members 工具
- 可选参数
nameContains会忽略大小写和变音符号,匹配所有词元;party和constituency接受代码或完全匹配的参考标签 sitting: "all" | "serving" | "not_serving"默认值为all;此参数筛选源数据中的任职分类,并非已验证的在会或当选成员身份。结果可能包含历史条目和部长;分类未知的条目仍会包含在all中- 使用本地
offset分页;limit默认值为 20,且上限为 100。返回candidateCount、筛选后的精确totalCount、revision和nextCall memberId中的前导零必须保留。部分欧洲议会条目没有 IID,会返回detailAvailable: false;其sourceRecordId是不同的标识符,不能用于riksdag_get_member
riksdag_get_member 工具
- 必须提供从搜索结果中获得的数字字符串
memberId,包括前导零;找不到条目时会返回found: false并提供指引 - 按来源顺序提供已发布的登记册元数据和任职信息;
assignmentOffset/assignmentLimit默认值分别为 0 / 20,实际应用的上限为 100 assignmentTotal、nextCall和revision支持完整遍历。任职日期保留来源精度,不能据此确定历史在会状态;不包含联系方式和照片
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及支持可选 OpenTelemetry 跟踪的结构化日志记录。
Riksdag 专属功能:
- 无需密钥即可访问官方文件、演讲、投票和成员端点,以及带日期的官方参考表
- 文件文本支持规范 Markdown 或 SFS 源文本,并可单独选择原始 HTML
- 共享上游并发控制、限制公共响应缓存,并为排队、重试和文本填充共用一个 55 秒的时限
- 历史覆盖范围因记录类型而异;演讲和投票数据始于 1993/94 年,较早的投票数据存在缺失
面向 Agent 的输出:
- 在
content[]和structuredContent中提供来源归属、检索时间、实际筛选条件和来源警告 - 为行、章节和文本提供完整的续传调用,并在本地续传时检查版本;变化中的远程文件搜索并非冻结快照
- 明确表示未找到、文本不可用、数量未知和来源任职分类;候选项数量达到上限时会报错
candidate_limit_reached,而不会返回不完整的遍历结果
开始使用
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/sweden-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/sweden-parliament-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或使用 Docker:
{
"mcpServers": {
"sweden-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/sweden-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+)。
- Riksdagen Open Data 无需 API 密钥或账户。
安装
- 克隆代码库:
git clone https://github.com/cyanheads/sweden-parliament-mcp-server.git
- 进入目录:
cd sweden-parliament-mcp-server
- 安装依赖:
bun install
- 配置环境:
cp .env.example .env
# edit .env for optional transport, authentication, or logging overrides
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
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/index.ts | 注册七个工具、初始化服务,并选择无状态 HTTP 会话。 |
src/mcp-server/tools/definitions | 七个只读工具定义;没有资源或提示词。 |
src/services/riksdag | Riksdagen 端点解析、参考表、传输、缓存、文本转换和续传。 |
tests/ | 单元测试和集成测试,结构与 src/ 对应。 |
完整文件树请参阅 docs/tree.md。
开发指南
开发指南和架构规则请参阅 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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。