联邦议院MCP服务器
  ](https://nodejs.org)
生产准备就绪 模型上下文协议(MCP) 提供访问德国联邦议院议会文件系统(DIP API)的服务器。
公共实例
公共实例可在以下网址获得:
https://bundestagapi.moritz-waechter.de/mcp您可以直接在MCP客户端配置中使用它,而无需运行自己的服务器。
目录
特性
核心能力
- 搜索印刷品 -查找法案、动议、质询和其他印刷文件
- 搜索Plenarprotokolle -查找全体会议记录
- 搜索Vorgaenge -通过议会跟踪立法程序
- 搜索人员 -查找议员及其信息
- 搜索Aktivitaeten -查找议会活动(演讲、提问)
- 全文检索 -获取完整的文档文本
- 语义搜索 -使用Qdrant+Mistral嵌入的人工智能搜索
- 语音搜索 -使用混合向量/关键字搜索在辩论中查找具体陈述
- 文档部分搜索 -在文档部分(文章、问题等)内搜索
- NLP分析 -提取演讲内容,分析语调,分类话题,比较各方
生产准备就绪
- 优雅地关闭 -SIGTERM/SIGINT上的干净会话终止
- 使用回退重试 -具有指数回退和抖动的自动重试
- 速率限制 -令牌桶速率限制器保护上游API
- 断路器 -快速故障模式,防止级联故障
- 响应缓存 -三层缓存(API、实体、元数据)
可观测性
- 普罗米修斯指标 -
/metrics/prometheus监控端点 - 深度健康检查 -
/health/deep验证DIP API连接 - 结构化日志记录 -带类别和级别的JSON日志
MCP协议
- 33工具 -搜索、检索、语义搜索、语音搜索和NLP分析
- 8提示 -常见研究任务的指导工作流程
- 12资源 -静态和动态资源模板
- 双模式 -支持有状态(Claude、Cursor)和无状态(ChatGPT)客户端
快速开始
先决条件
- Node.js 18+
- DIP API密钥(提供公共测试密钥)
安装
git clone https://github.com/Movm/bundestag-mcp.git
cd bundestag-mcp
npm install配置
创建 .env 文件(或副本 .env.example):
# Public test key valid until 05/2026
DIP_API_KEY=OSOegLs.PR2lwJ1dwCeje9vTj7FPOt3hvpYKtwKkhw
# Optional
PORT=3000
PUBLIC_URL=
LOG_LEVEL=INFO注: 对于生产,请从以下位置请求您自己的API密钥: parlamentsdokumentation@bundestag.de跑
# Production
npm start
# Development (auto-reload)
npm run dev服务器将在以下时间启动 http://localhost:3000.
MCP工具
文档工具
| 工具 | 说明 |
|---|---|
bundestag_search_drucksachen | Search printed documents (法案、申请、请求) |
bundestag_get_drucksache | 按ID获取特定文档(可选全文) |
bundestag_search_drucksachen_text | 文档内容中的全文搜索 |
协议工具
| 工具 | 说明 |
|---|---|
bundestag_search_plenarprotokolle | 搜索全体会议记录 |
bundestag_get_plenarprotokoll | 通过ID获取特定协议(可选全文) |
bundestag_search_plenarprotokolle_text | 成绩单内容中的全文搜索 |
程序工具
| 工具 | 说明 |
|---|---|
bundestag_search_vorgaenge | 搜索议会程序 |
bundestag_get_vorgang | 按ID获取具体程序 |
bundestag_search_vorgangspositionen | 搜索进行位置/步骤(跟踪账单进度) |
人员和活动工具
| 工具 | 说明 |
|---|---|
bundestag_search_personen | 搜索议员和其他人 |
bundestag_get_person | 按ID获取人员详细信息 |
bundestag_search_aktivitaeten | 搜索议会活动 |
bundestag_get_aktivitaet | 按ID获取特定活动 |
语义搜索工具
| 工具 | 说明 |
|---|---|
bundestag_semantic_search | 基于人工智能的所有文档语义搜索 |
bundestag_semantic_search_status | 显示语义搜索系统状态 |
bundestag_trigger_indexing | 手动触发文档索引 |
语音搜索工具
| 工具 | 说明 |
|---|---|
bundestag_search_speeches | 通过议会演讲进行语义/混合搜索 |
bundestag_trigger_protocol_indexing | 触发器协议分块和索引 |
bundestag_reindex_protocols | 强制对所有协议进行全面重新索引 |
bundestag_protocol_search_status | 显示协议搜索系统状态 |
文档部分搜索工具
| 工具 | 说明 |
|---|---|
bundestag_search_document_sections | 通过文档部分进行语义搜索 |
bundestag_trigger_document_indexing | 触发文档块索引 |
bundestag_document_search_status | 显示文档块搜索状态 |
NLP分析工具
这些工具使用Python FastAPI服务和spaCy的德语模型进行自然语言处理。
| 工具 | 说明 |
|---|---|
bundestag_extract_speeches | 将协议文本解析为包含演讲者、政党和类型的个人演讲 |
bundestag_analyze_text | 分析德语文本中的词频(名词、形容词、动词) |
bundestag_analyze_tone | 沟通风格分析(攻击性、协作性、解决方案重点) |
bundestag_classify_topics | 按政治主题(移民、气候、经济等)对文本进行分类 |
bundestag_analysis_health | 检查NLP分析服务是否可用 |
bundestag_speaker_profile | 根据演讲者的演讲为其生成全面的个人资料 |
bundestag_compare_parties | 根据议会演讲比较政党 |
实用工具
| 工具 | 说明 |
|---|---|
bundestag_estimate_size | 在获取以管理上下文窗口之前检查文档/协议大小 |
bundestag_cache_stats | 显示缓存统计信息 |
get_client_config | 生成MCP客户端配置 |
通用参数
| 参数 | 说明 |
|---|---|
query | 标题全文搜索 |
wahlperiode | 选举期(例如,2021-2025年为20年) |
datum_start / datum_end | 日期范围筛选器(YYYY-MM-DD) |
limit | 每页结果数(1-100,默认值10) |
cursor | 来自上一个响应的分页光标 |
includeFullText | 获取完整文档文本 |
useCache | 是否使用缓存结果(默认值:true) |
MCP提示
议会共同研究任务的指导工作流程:
| 提示 | 描述 |
|---|---|
search-legislation | 使用语义搜索和回退策略引导搜索法案和立法 |
track-proceeding | 使用立法术语表和时间表跟踪议会程序 |
mp-activity-report | 综合MP报告,通过修辞分析 bundestag_speaker_profile |
analyze-debate | 通过党派比较分析全会辩论 bundestag_compare_parties |
compare-factions | 使用跨党派分析比较某一主题的党派修辞 |
find-statements | 从具有后备策略的政客那里找到具体的引语/声明 |
topic-trends | 分析主题讨论如何随时间演变(跨越Wahlperioden/年) |
speaker-deep-dive | 政治家的全面修辞与政策分析 |
MCP资源
静态资源
| URI | 描述 |
|---|---|
bundestag://system-prompt | AI使用说明,包括工具选择指南和上下文管理 |
bundestag://info | 服务器功能和工具列表 |
bundestag://wahlperioden 选举期(Electoral Period) | |
bundestag://drucksachetypen | 文件类型(法案、申请等) |
bundestag://factions | 有正式名称、别名、肤色和职位的议会派系 |
资源模板
| URI模式 | 描述 |
|---|---|
bundestag://drucksache/{id} | 按ID获取文档 |
bundestag://drucksache/{id}/text | 获取文档全文 |
bundestag://plenarprotokoll/{id} | 按ID获取协议 |
bundestag://plenarprotokoll/{id}/text | 获取协议全文 |
bundestag://vorgang/{id} | 按ID获取进程 |
bundestag://person/{id} | 按ID取人 |
bundestag://aktivitaet/{id} | 按ID获取活动 |
客户端配置
提示: 使用公共实例https://bundestagapi.moritz-waechter.de/mcp或者自己跑步http://localhost:3000/mcp
克劳德桌面版
添加 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"bundestag": {
"url": "https://bundestagapi.moritz-waechter.de/mcp"
}
}
}光标
添加 .cursor/mcp.json:
{
"mcpServers": {
"bundestag": {
"url": "https://bundestagapi.moritz-waechter.de/mcp"
}
}
}VS代码(GitHub副本)
添加到设置:
{
"mcp.servers": {
"bundestag": {
"type": "http",
"url": "https://bundestagapi.moritz-waechter.de/mcp"
}
}
}ChatGPT
服务器作为连接器与ChatGPT完全兼容。使用公共实例或部署自己的实例。
- 启用开发人员模式 在ChatGPT中:
- 首选 设置→ 应用程序和连接器→ 高级设置 - 启用开发人员模式
- 添加连接器:
- 首选 设置→ 连接器→ 创建 - 使用URL: https://bundestagapi.moritz-waechter.de/mcp - 将其命名为“联邦议院”并提供描述
- 在聊天中使用:
- 点击 + 新聊天中的按钮 - 从中选择连接器 更多 菜单 - 询问德国议会文件!
API终点
| 端点 | 描述 |
|---|---|
POST /mcp | MCP协议端点 |
GET /mcp | 会话的SSE流 |
DELETE /mcp | 结束会话 |
GET /health | 基本健康检查 |
GET /health/deep | 深度健康检查(验证DIP API) |
GET /metrics | JSON统计 |
GET /metrics/prometheus | Prometheus格式度量 |
GET /.well-known/mcp.json | 自动发现 |
GET /config/:client | 客户端特定配置 |
GET /info | 服务器信息 |
码头工人
# Build
docker build -t bundestag-mcp .
# Run
docker run -p 3000:3000 \
-e DIP_API_KEY=your-api-key \
bundestag-mcpDocker Compose
version: '3.8'
services:
bundestag-mcp:
build: .
ports:
- "3000:3000"
environment:
- DIP_API_KEY=${DIP_API_KEY}
- LOG_LEVEL=INFO
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3发展
运行测试
# Run tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage项目结构
src/
├── index.js # Express server, MCP setup, endpoints
├── config.js # Environment configuration
├── api/
│ └── bundestag.js # DIP API client with retry logic
├── jobs/
│ └── indexer.js # Background document/protocol indexer
├── services/
│ ├── analysisService.js # HTTP client for Python NLP service
│ ├── embeddingService.js # Mistral embeddings
│ ├── qdrantService.js # Vector database operations
│ ├── protokollParser.js # Protocol speech extraction
│ └── drucksacheParser.js # Document section parsing
├── tools/
│ ├── search.js # 15 search/entity tools (incl. estimate_size)
│ ├── analysis.js # 7 NLP analysis tools
│ ├── semanticSearch.js # 10 semantic search tools
│ └── clientConfig.js # Client configuration tool
├── prompts/
│ └── index.js # MCP Prompts
├── resources/
│ ├── info.js # Static resources
│ └── templates.js # Resource templates
└── utils/
├── cache.js # Three-layer caching
├── logger.js # Structured logging
├── retry.js # Exponential backoff
├── rateLimiter.js # Token bucket rate limiter
├── circuitBreaker.js # Circuit breaker pattern
├── metrics.js # Prometheus metrics
└── textNormalization.js # German text handling建筑
弹性模式
Request → Rate Limiter → Circuit Breaker → Retry Logic → DIP API
↓ ↓ ↓
(throttle) (fast-fail) (backoff)- 速率限制器:代币桶算法防止了DIP API的泛滥
- 断路器:在连续故障后打开,在停机期间快速故障
- 重试逻辑:瞬态故障时具有抖动的指数回退
缓存策略
| 层 | TTL | 最大条目 | 用例 |
|---|---|---|---|
| API响应 | 5分钟 | 500 | 搜索结果 |
| 实体 | 15分钟 | 200 | 单个文档 |
| 元数据 | 24小时 | 50小时 | Wahlperioden,文档类型 |
语义搜索
该服务器支持使用Qdrant向量数据库和Mistral嵌入的人工智能语义搜索。这使得即使在确切的关键字不匹配的情况下,也能找到概念上相关的文档。
运作原理
- 文献检索:后台索引器从DIP API获取文档,并使用Mistral AI生成嵌入
- 向量存储:嵌入内容存储在Qdrant中,具有丰富的元数据用于过滤
- 语义查询:用户查询被嵌入,并使用余弦相似度与文档向量进行匹配
三个搜索集合
| 收藏 | 描述 |
|---|---|
bundestag-docs | Document-level search (印刷品、活动、人员) |
bundestag-protocol-chunks | 从Plenarprotokolle进行语音水平搜索 |
bundestag-document-chunks | Drucksachen的部门级搜索(文章、问题等) |
特性
- 多语言:用英语搜索,查找德语文档(例如“可再生能源”→ “能源”)
- 混合搜索:将向量相似性与关键字增强相结合,以提高精度
- 丰富的过滤:按文档类型、实体类型、Wahlperiode、Sachgebiet、倡议、派系、日期范围过滤
- 语音搜索:按演讲者、政党、演讲类型或政府官员查找具体陈述
- 文档部分搜索:在文档中查找特定段落、问题或文章
- 增量索引:用途
f.aktualisiert.start用于初始索引后的高效更新
配置
添加到您的 .env 文件:
# Semantic Search (Qdrant + Mistral)
QDRANT_ENABLED=true
QDRANT_URL=http://qdrant:6333
QDRANT_API_KEY=your-qdrant-api-key # Optional: API key for Qdrant authentication
MISTRAL_API_KEY=your-mistral-api-key
# Background Indexer
INDEXER_ENABLED=true
INDEXER_INTERVAL_MINUTES=15
INDEXER_WAHLPERIODEN=19,20小贴士:使用生成安全的API密钥 openssl rand -hex 32使用Qdrant编写Docker
services:
bundestag-mcp:
build: .
environment:
- QDRANT_ENABLED=true
- QDRANT_URL=http://qdrant:6333
- QDRANT_API_KEY=${QDRANT_API_KEY}
- MISTRAL_API_KEY=${MISTRAL_API_KEY}
- INDEXER_ENABLED=true
depends_on:
- qdrant
qdrant:
image: qdrant/qdrant:latest
ports:
- "6333:6333"
volumes:
- qdrant_data:/qdrant/storage
environment:
- QDRANT__SERVICE__API_KEY=${QDRANT_API_KEY}
volumes:
qdrant_data:语义搜索参数
| 参数 | 说明 |
|---|---|
query | 自然语言搜索查询 |
limit | 最大结果(1-50) |
docTypes | 筛选器: drucksache, vorgang, aktivitaet, person |
entityTypes | 筛选器: Gesetzentwurf, Kleine Anfrage, Rede等等。 |
wahlperiode | 选举期(19、20) |
sachgebiet | 主题领域 |
initiative | 发起派系(基民盟/基社盟、社民党等) |
fraktion | 议会小组 |
dateFrom / dateTo | 日期范围(YYYY-MM-DD) |
scoreThreshold | 最小相似度(0-1,默认0.3) |
语音搜索参数
| 参数 | 说明 |
|---|---|
query | 自然语言搜索查询 |
limit | 最大结果(1-50) |
speaker | 按说话者姓名筛选(例如“Friedrich Merz”) |
speakerParty | 按党派筛选(例如“CDU/CSU”、“SPD”) |
speakerState | 按州筛选Bundesrat(例如“拜仁”) |
top | 按议程项目筛选(例如,“TOP 1”) |
wahlperiode | 选举期 |
herausgeber | 出版商: BT (联邦议院)或 BR (联邦参议院) |
speechType | 类型: rede, befragung, fragestunde_antwort, kurzbeitrag |
isGovernment | 筛选政府官员(部长、国务秘书) |
category | 类别: rede (正式发言)或 wortbeitrag (捐款) |
searchMode | semantic (纯矢量)或 hybrid (矢量+关键字增强) |
keywordBoost | 混合模式下关键字匹配的增强因子(0-2,默认值0.5) |
requiredKeywords | 必须出现在文本中的关键字 |
excludeKeywords | 不得出现在文本中的关键字 |
文档节搜索参数
| 参数 | 说明 |
|---|---|
query | 自然语言搜索查询 |
limit | 最大结果(1-50) |
drucksachetyp | 筛选器: Gesetzentwurf, Kleine Anfrage, Antrag等等。 |
chunkType | 截面类型: problem, loesung, artikel, question等等。 |
wahlperiode | 选举期 |
urheber | 作者/发起人(例如“联邦执政党”、“基民盟/基社盟”) |
dateFrom / dateTo | 日期范围(YYYY-MM-DD) |
scoreThreshold | 最小相似度(0-1,默认0.3) |
NLP分析服务
该服务器包括可选的NLP分析功能,由使用spaCy德语模型的Python FastAPI服务提供支持。
特性
- 语音提取:将Plenarprotokolle解析为带有演讲者、政党和类型的个人演讲
- 分析:提取名词、形容词和动词,并用频率计数进行词形变化
- 音调分析:12个沟通风格指标,包括攻击性、协作性和解决方案重点
- 主题分类:检测13个政策领域(移民、气候、经济等)的重点
- 讲者简介:生成包含统计数据、词汇和沟通风格的综合档案
- 政党比较:根据演讲的语调排名和主题焦点对各方进行比较
音调指标
| 度量 | 描述 |
|---|---|
affirmative | 阳性形容词与批判性形容词之比(0-100) |
aggression | 攻击性语言强度(0-100) |
labeling | “其他”语言用法(0-100) |
solution_focus | 解决方案与问题导向动词(0-100) |
collaboration | 协作与对抗(0-100) |
demand_intensity | 要求性语言 (0-100) |
authority | 义务与可能性模型(0-100) |
future_orientation | 向前看与向后看(0-100) |
主题类别
移民, 气候, 经济, 社会政策, 安全, 健康, 欧洲, 数字, 教育, 金融,Justice(司法)、Labor(工作)、Mobility(流动性)
配置
分析服务作为单独的Python容器运行。添加到您的 .env:
ANALYSIS_SERVICE_URL=http://analysis:8000Docker编写与分析
services:
bundestag-mcp:
build: .
environment:
- ANALYSIS_SERVICE_URL=http://analysis:8000
depends_on:
- analysis
analysis:
image: ghcr.io/movm/bundestag-analysis:latest
expose:
- "8000"备注:spaCy型号的分析服务需要~1GB RAM,需要~30秒才能启动。
DIP API
此服务器使用德国联邦议院官方DIP API:
- 文档: https://dip.bundestag.de/
- API文件: https://dip.bundestag.api.bund.dev/
- GitHub: https://github.com/bundesAPI/dip-bundestag-api
贡献
欢迎投稿!请随时提交拉取请求。
- 克隆该仓库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 运行测试(
npm test) - 提交您的更改(
git commit -m 'feat: Add amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
