Modgov议会数据服务

一个提供英国地方议会数据的MCP服务器,包括议员信息、委员会详情、会议安排、选举结果和教区议会数据。

  • by jadu
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 jadu/modgov-mcp-server

使用说明

Modgov MCP服务器

一个全面的模型上下文协议(MCP)服务器,提供对modgov议会API的访问,用于检索英国地方议会的议员信息、委员会详细信息、会议日程、选举结果和教区议会数据。

目录

快速开始

先决条件

  • Node.js (18+版本)
  • Docker&Docker编写 (用于生产部署)

构建与运行

  1. 克隆和构建:

    git clone <repository-url>
    cd modgov-mcp-server
    npm install
    npm run build
    
  2. 使用STDIO传输运行:

    node dist/index.js
    
  3. 使用HTTP传输运行:

    MCP_TRANSPORT=http node dist/index.js
    # Server available at: http://localhost:3003/mcp
    
  4. MCP检验员测试:

    npx @modelcontextprotocol/inspector node dist/index.js
    

Docker部署

对于生产部署,请使用Docker:

# Build and run
make build && make up

# Server available at: http://localhost:3003/mcp
# Health check: http://localhost:3003/health

特性

  • 100%成功率:9/9端点功能齐全,具有自动服务器错误解决方法
  • API全面覆盖:所有主要的ModGov端点(议员、委员会、会议、选举等)
  • 多站点支持:在3个英国议会网站(利奇菲尔德、柯克利斯、利物浦)进行了测试
  • 服务器错误处理:WSDL与实际服务器差异的自动解决方法
  • 灵活查询:访问议会数据的多种方式(按选区、委员会、日期等)
  • 速率限制:内置速率限制(每个域每秒1个请求)以防止API滥用
  • 错误处理:强大的错误处理,带有有意义的错误消息
  • 理事会查询:智能模糊匹配,按名称或地区查找议会

🚨 关键服务器错误解决方法

存在重大差异 在官方WSDL文档和实际的ModGov服务器实现之间。此MCP服务器自动处理以下问题:

参数要求不匹配

WSDL中标记为“可选”的许多参数是 实际需要 按服务器:

端点 WSDL显示可选 实际必需
GetMeetings sFromDate, sToDate ✅ 必需
GetAllMeetingsByDate lCommitteeId, bIsAscendingDateOrder ✅ 必需
GetCalendarEvents bGlobalCalendar, lUserId ✅ 必需
GetWebCastMeetings lCommitteeId, sFromDate, sToDate ✅ 必需
GetElectionResults lElectionId ✅ 必需
GetMpOrMepsAndWards bIsMPs ✅ 必需

应用了自动解决方案

MCP服务器透明地应用这些修复程序:

  • 缺少日期:默认为当前年份范围(YYYY-01-01 到 YYYY-12-31)
  • 缺少委员会ID:默认内阁(138)
  • 缺少布尔标志:提供合理的默认值(true 用于全球日历等)
  • 缺少用户ID:公共访问默认为0

测试结果

理事会 工作终点 成功率
利奇菲尔德DC 9/9 100%
科克里斯 9/9 100%
利物浦 9/9 100%

所有测试的站点都显示相同的服务器错误,并且都会自动处理。

🧪 测试

测试结构

tests/
├── integration/        # End-to-end integration tests
├── debugging/         # Debug and investigation scripts
├── utils/            # Utility test scripts
└── README.md         # Test documentation

运行测试

单元测试(在Docker中)

# Run Jest unit tests in Docker container
make test

# Or use Docker Compose directly
docker-compose run --rm modgov-mcp-server npm test

集成测试(在Docker中)

# Test all 9 endpoints end-to-end in Docker
docker-compose run --rm modgov-mcp-server npm run test:integration

调试测试(在Docker中)

# Investigate endpoint compatibility across sites
docker-compose run --rm modgov-mcp-server npm run test:debug

# Verify parameter handling
docker-compose run --rm modgov-mcp-server npm run test:params

测试结果

  • ✅ 100%成功率:9/9个端点正常工作
  • ✅ 服务器错误解决方法:自动处理所有WSDL差异
  • ✅ 跨站点兼容性:在3个议会网站上进行了测试

📚 文档

OpenAPI/Swagger规范

  • 文件: modgov-openapi-spec.yaml
  • 状态: ✅ 完整且权威
  • 覆盖:所有9个受支持的端点都有真实世界的示例
  • 特性:
    • 明确记录服务器错误解决方法
    • 请求/响应示例
    • 参数验证规则
    • 跨站点兼容性说明

开发人员资源

  • 稳健性报告: MCP_ROBUSTNESS_REPORT.md -测试和性能细节
  • 测试文档: tests/README.md -完整的测试套件指南
  • 实现说明:服务器错误解决方法和最佳实践(见上文部分)

安装

原生Node.js(推荐用于开发)

# Clone and install
git clone <repository-url>
cd modgov-mcp-server
npm install
npm run build

# Run with STDIO transport (default)
node dist/index.js

# Run with HTTP transport
MCP_TRANSPORT=http node dist/index.js

Docker(推荐用于生产环境)

# Using Makefile (recommended)
make build && make up

# Or using Docker Compose directly
docker-compose up --build

可用的生成命令:

  • make build -塑造生产形象
  • make up -开始生产容器
  • make test -在容器中运行测试
  • make logs -查看容器日志
  • make clean -删除容器和图像
  • make shell -打开容器中的shell进行调试

MCP传输选项

Modgov MCP服务器支持STDIO和HTTP传输:

STDIO传输(默认)

非常适合开发和MCP客户端集成:

# Start with STDIO transport
node dist/index.js

# Test with MCP Inspector
npx @modelcontextprotocol/inspector node dist/index.js

STDIO传输特性:

  • 默认传输模式
  • 交互式stdin/stdout通信
  • 非常适合MCP客户端(Claude Desktop、Cursor等)
  • 客户端断开连接后终止

HTTP传输(流式传输)

非常适合web服务和API集成:

# Start with HTTP transport
MCP_TRANSPORT=http node dist/index.js

# Or with custom port
MCP_TRANSPORT=http MCP_PORT=3005 node dist/index.js

HTTP传输端点:

  • MCP协议: http://localhost:3003/mcp
  • 健康检查: http://localhost:3003/health

HTTP传输特性:

  • 作为持久web服务器运行
  • 基于HTTP的RESTful MCP协议
  • 支持流式响应
  • 内置健康监测

MCP检查员

使用官方MCP检查器测试您的服务器:

# For STDIO transport (default)
npx @modelcontextprotocol/inspector node dist/index.js

# For HTTP transport
npx @modelcontextprotocol/inspector http://localhost:3003/mcp

检查员提供:

  • ✅ 交互式工具测试
  • ✅ 协议验证
  • ✅ 请求/响应调试
  • ✅ 模式验证

用法

Docker(生产)

使用HTTP传输进行生产

# Build and run production container
make build && make up

# Or using Docker Compose directly
docker-compose up --build modgov-mcp-server

当容器启动时,服务器在端口3003上以HTTP模式自动启动。

HTTP API终结点

MCP服务器在Docker中运行,并在端口3003上公开这些端点:

MCP协议端点

POST http://localhost:3003/mcp
Content-Type: application/json

# Example request
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_councillors",
    "arguments": {
      "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL"
    }
  }
}

健康检查端点

GET http://localhost:3003/health

# Response
{
  "status": "healthy",
  "timestamp": "2025-01-11T10:20:30.000Z",
  "server": "modgov-mcp-server",
  "version": "1.0.0",
  "transport": "streamable-http"
}

Docker日志

MCP服务器包括在Docker中运行时所有工具调用的全面日志记录:

# View real-time logs
docker logs modgov-mcp-server --follow

# View recent logs
docker logs modgov-mcp-server --tail 20

日志输出示例:

🛠️  Tool called: get_councillors_by_ward
📍 Parameters: site_url=https://democracy.lichfielddc.gov.uk/mgWebService.asmx
✅ Tool completed: get_councillors_by_ward (1280ms)

🛠️  Tool called: get_committees
📍 Parameters: site_url=https://democracy.lichfielddc.gov.uk/mgWebService.asmx
✅ Tool completed: get_committees (320ms)

每个工具调用日志:

  • 🔧 工具启动 带有表情符号和工具名称
  • 📍 参数 传递给工具
  • ✅ 完成 执行时间(毫秒)

MCP服务器运行在 http://localhost:3003/mcp 并支持用于测试所有注册工具的完整MCP协议。

港口冲突解决方案: 如果遇到端口冲突:

# Stop all containers
make down

# Or manually kill processes on ports 3003, 6274, 6277
lsof -ti:3003,6274,6277 | xargs kill -9 2>/dev/null || true

停止服务器:

# Stop the Docker container
make down

# Or use Docker Compose directly
docker-compose down

故障排除:

  • 检查容器日志: make logs
  • 验证容器是否正在运行: docker ps
  • 测试健康终点: curl http://localhost:3003/health

可用工具

MCP服务器公开 18工具 查询modgov议会API并查找议会:

✅ 议员信息(无需解决方案)

  • get_councillors_by_ward -按选区组织所有议员,并附上照片和政治派别
  • get_councillors_by_ward_id -获取议员的特定选区ID
  • get_councillors_by_postcode -获取特定邮政编码的议员
  • get_councillor_details -获取全面的议员资料,包括手术时间和联系方式

✅ 治理和委员会(应用自动解决方案)

  • get_committees -召集所有委员会(内阁、议会、规划等)
  • get_meetings -获取具有自动日期范围默认值的会议⚙️
  • get_meeting -按ID获取特定会议的详细信息
  • get_all_meetings_by_date -获取具有委员会默认值的特定日期的会议⚙️

✅ 事件和日历(应用自动解决方案)

  • get_calendar_events -通过自动参数处理获取日历事件⚙️

✅ 地方政府结构(无需解决方案)

  • get_parish_councils -获取教区议会及其信息

✅ 选举与民主(应用自动解决方案)

  • get_election_results -使用所需的选举ID获取选举结果⚙️

✅ 数字服务(应用自动解决方案)

  • get_webcast_meetings -获取带有日期和委员会默认值的网络直播会议⚙️
  • get_mp_or_meps_and_wards -通过布尔标志处理获取MP/MEP信息⚙️
  • get_mp_or_mep_and_wards_by_postcode -获取特定邮政编码的MP/MEP信息⚙️

✅ 理事会发现与管理

  • find_council -使用模糊匹配按名称查找议会
  • search_councils -搜索具有信任阈值的议会
  • get_council_by_region -获取特定地区的所有议会
  • get_server_diagnostics -获取服务器诊断信息

⚙️ 应用了自动服务器错误解决方法 | ✅ 所有工具均已测试并正常工作

工具使用示例

所有工具都需要 site_url 指向理事会modgov API端点的参数。

议员信息

按选区获取所有议员:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL"
}

为特定选区寻找议员:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL",
  "ward_id": 1
}

通过邮政编码获取议员信息:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL",
  "postcode": "WS14 9AB"
}

治理与委员会

召集所有委员会:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL"
}

为特定委员会安排会议:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL",
  "committee_id": 1
}

按ID获取特定会议:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL",
  "meeting_id": 123
}

地方政府结构

联系教区议会:

{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL"
}

## Response Format

The tool returns JSON data with the following structure:

```json
{
  "site_url": "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL",
  "total_wards": 25,
  "total_councillors": 47,
  "wards": [
    {
      "ward_name": "Alrewas and Fradley",
      "councillor_count": "3",
      "councillors": [
        {
          "id": "570",
          "name": "Councillor Sonia Claverley",
          "party": "The Conservative Party",
          "group": "Conservative Group",
          "district": "Lichfield District Council",
          "representing": "Lichfield District Council",
          "photos": {
            "small": "https://democracy.lichfielddc.gov.uk/UserData/0/7/5/Info00000570/smallpic.jpg",
            "large": "https://democracy.lichfielddc.gov.uk/UserData/0/7/5/Info00000570/bigpic.jpg"
          },
          "additional_info": "...",
          "key_posts": "..."
        }
      ]
    }
  ]
}

速率限制

服务器实现每个域每秒1个请求的速率限制,以防止滥用并遵守API限制。

错误处理

服务器提供全面的错误处理:

  • 网络错误:连接超时、DNS解析失败
  • API错误:响应无效,XML格式错误
  • 速率限制:使用指数回退自动重试
  • 验证错误:参数无效,缺少必填字段

发展

开发环境

所有开发都在Docker容器中进行:

# Start development environment with live code mounting
make dev

# This mounts your source code and provides hot reloading

运行测试

单元测试(在Docker中)

# Run Jest unit tests in development container
make test

# Or run tests in watch mode for development
docker-compose --profile dev exec modgov-mcp-dev npm run test:watch

集成测试(在Docker中)

使用真实的API调用测试完整的MCP服务器功能:

# Start development environment (Terminal 1)
make dev

# Run integration tests (Terminal 2)
docker-compose --profile dev exec modgov-mcp-dev npm run test:mcp

集成测试包括:

  • 健康终点验证
  • MCP协议合规性
  • 工具发现和执行
  • 理事会数据检索和验证

看 TEST_README.md 获取详细的测试文档。

建筑

构建过程在Docker容器中自动发生:

# Manual build in container
docker-compose --profile dev exec modgov-mcp-dev npm run build

停止开发环境

# Stop development containers
make down

这将停止所有开发容器并清理资源。

Docker配置

生产容器

生产容器针对部署进行了优化:

docker build -t modgov-mcp-server .
docker run -p 3003:3003 modgov-mcp-server

特征:

  • 多阶段构建,实现最小图像尺寸
  • 非root用户安全
  • 健康检查
  • 仅生产依赖性
  • 始终使用HTTP传输在端口3003上运行

测试Docker设置

验证你的Docker容器是否正常工作:

# Build and test
make build
make up

# Check health endpoint
curl http://localhost:3003/health

预期的健康反应:

{
  "status": "healthy",
  "timestamp": "2025-01-11T10:20:30.000Z",
  "server": "modgov-mcp-server",
  "version": "1.0.0",
  "transport": "streamable-http"
}

MCP服务器行为

重要提示: MCP服务器在Docker容器内以HTTP模式连续运行。这与stdio模式不同,在stdio模式下,服务器在每次请求后都会退出。

  • 服务器保持运行并侦听端口3003
  • 每个MCP请求都通过HTTP处理
  • 容器将显示为 running (未退出)
  • 使用 make logs 监视服务器输出

建筑

服务器由三个主要组件组成:

  1. ModgovClient:处理对modgov API的HTTP请求、XML解析和速率限制
  2. 摩登派青年:MCP服务器实现,包括工具注册和请求处理
  3. 类型定义:API响应和数据结构的TypeScript接口

支持的议会网站

服务器使用 任何支持modgov的议会网站。我们的数据库包括 44个经过验证的委员会 在英国所有地区。

完整的理事会数据库

议会 地区 类型 URL
巴斯和东北萨默塞特议会 西南部 统一管理局 https://democracy.bathnes.gov.uk/
布伦特伍德自治市议会 英格兰东部 自治市议会 https://brentwood.moderngov.co.uk/
布莱顿霍夫市议会 东南部 市议会 https://democracy.brighton-hove.gov.uk/
布里斯托尔市议会 西南部 市议会 https://democracy.bristol.gov.uk/
白金汉郡议会 英格兰东部 统一权威 https://buckinghamshire.moderngov.co.uk/
剑桥市议会 英格兰东部 市议会 https://democracy.cambridge.gov.uk/
卡迪夫议会 威尔士 统一管理局 https://cardiff.moderngov.co.uk/
奇切斯特区议会 东南 区议会 https://chichester.moderngov.co.uk/
林肯市议会 东米德兰兹 市议会 https://lincoln.moderngov.co.uk/
伍尔弗汉普顿市议会 西米德兰兹郡 大都会区 https://wolverhampton.moderngov.co.uk/
约克市议会 约克郡和亨伯市议会https://democracy.york.gov.uk/
考文垂市议会 西米德兰兹郡 市议会 https://edemocracy.coventry.gov.uk/
东汉普郡区议会 东南 区议会 https://easthants.moderngov.co.uk/
大伦敦管理局(GLA) 伦敦 联合管理局 https://gla.moderngov.co.uk/
黑斯廷斯自治市议会 东南 自治市议会 https://hastings.moderngov.co.uk/
利兹市议会 约克郡和亨伯市议会https://democracy.leeds.gov.uk/
莱斯特郡议会 东米德兰兹郡议会https://democracy.leics.gov.uk/
利奇菲尔德区议会 西米德兰兹郡 区议会 https://lichfield.moderngov.co.uk/
利物浦市议会 西北部 市议会 https://councillors.liverpool.gov.uk/
巴纳区 伦敦 伦敦自治市 https://barnet.moderngov.co.uk/
英国伦敦布伦特区 伦敦 伦敦自治市 https://democracy.brent.gov.uk/
自治市 伦敦 伦敦自治市 https://camden.moderngov.co.uk/
伦敦克罗伊登区 伦敦 伦敦自治市 https://croydon.moderngov.co.uk/
伦敦哈林盖区 伦敦 伦敦自治市 https://www.minutes.haringey.gov.uk/
伦敦哈罗区 伦敦 伦敦自治市 https://moderngov.harrow.gov.uk/
伦敦哈弗林区 伦敦 伦敦自治市 https://democracy.havering.gov.uk/
伦敦Hounslow区 伦敦 伦敦自治市 https://democraticservices.hounslow.gov.uk/
伊斯林顿伦敦自治市 伦敦 伦敦自治市 https://islington.moderngov.co.uk/
伦敦南华克区 伦敦 伦敦自治市 https://moderngov.southwark.gov.uk/
伦敦萨顿区 伦敦 伦敦自治市 https://moderngov.sutton.gov.uk/
陶尔哈姆莱茨区 伦敦 伦敦自治市 https://democracy.towerhamlets.gov.uk/
梅德韦委员会 东南部 统一管理局 https://democracy.medway.gov.uk/
纽卡斯尔市议会 东北 市议会 https://democracy.newcastle.gov.uk/
朴茨茅斯市议会 东南部 市议会 https://democracy.portsmouth.gov.uk/
泰晤士河畔金斯顿皇家自治市 伦敦 皇家自治市 https://kingston.moderngov.co.uk/
谢菲尔德市议会 约克郡和亨伯市议会https://democracy.sheffield.gov.uk/
南剑桥郡区议会 英格兰东部 区议会 https://scambs.moderngov.co.uk/
三江区议会 英格兰东部 区议会 https://moderngov.threerivers.gov.uk/
白马谷区议会 东南 区议会 https://democratic.whitehorsedc.gov.uk/
沃里克郡议会 西米德兰兹郡议会https://warwickshire.moderngov.co.uk/
沃特福德区议会 英格兰东部 自治市议会 https://watford.moderngov.co.uk/
英格兰西部联合管理局 西南部 联合管理局 https://westofengland-ca.moderngov.co.uk/
威勒尔委员会 西北 大都会区 https://wirral.moderngov.co.uk/
伍斯特郡议会 西米德兰兹郡议会https://worcestershire.moderngov.co.uk/

覆盖率统计

  • 理事会总数: 44
  • 覆盖区域:11(英国所有地区)
  • 议会类型:10种不同的权限类型
  • 测试站点:3(利奇菲尔德、柯克利斯、利物浦-100%成功率)

已验证的工作示例

理事会 URL 委员会ID 备注
利奇菲尔德区议会 https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL 内阁:138,议会:136,规划:135 主要试验场
柯克利斯议会 http://democracy.kirklees.gov.uk/mgWebService.asmx?WSDL 相同模式 相同行为
利物浦市议会 https://democracy.liverpool.gov.uk/mgWebService.asmx?WSDL 相同模式 相同行为
伦敦萨顿区 https://moderngov.sutton.gov.uk/mgWebService.asmx 完整的端点文档 全面的API测试

特别功能

  • 伦敦萨顿区:包括详细的端点文档,包括参数规范、响应格式和工作示例
  • 议会发现:内置模糊匹配功能,可按名称查找议会(find_council)
  • 区域搜索:查找特定地区的所有议会(get_council_by_region)
  • 信心评分:使用可配置的置信阈值进行搜索(search_councils)

议会发现

使用内置的议会查找工具:

# Find a specific council
curl -X POST http://localhost:3003/mcp \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/call", "params": {"name": "find_council", "arguments": {"council_name": "Leeds"}}}'

# Search councils by region
curl -X POST http://localhost:3003/mcp \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/call", "params": {"name": "get_council_by_region", "arguments": {"region": "West Midlands"}}}'

API发现

要发现特定议会网站的可用操作,您可以检查WSDL:

curl "https://democracy.lichfielddc.gov.uk/mgWebService.asmx?WSDL" | grep -i "council"

例子

看 examples/ 完整配置示例的目录:

  • 光标: examples/cursor-mcp.json
  • 克劳德桌面版: examples/claude-desktop-config.json
  • VS Code: examples/vscode-mcp.json
  • Docker生产: examples/docker-compose.production.yml
  • Nginx配置: examples/nginx.conf
  • 测试客户端: examples/test-mcp-client.js
  • 邮差收藏: examples/postman-collection.json
  • 环境配置: examples/env-example.txt

快速测试

使用提供的脚本测试您的设置:

./examples/test-setup.sh

配置说明

MCP服务器支持原生Node.js执行和Docker部署。选择与部署方法匹配的配置。

MCP客户端配置

选择与您的传输偏好相匹配的配置:

✅ HTTP传输(建议用于生产环境):

{
  "mcpServers": {
    "modgov-council": {
      "url": "http://localhost:3003/mcp",
      "headers": {
        "Content-Type": "application/json",
        "Accept": "application/json, text/event-stream"
      }
    }
  }
}

✅ STDIO运输(建议开发):

{
  "mcpServers": {
    "modgov-council": {
      "command": "node",
      "args": ["dist/index.js"],
      "cwd": "/path/to/modgov-mcp-server"
    }
  }
}

服务器要求:

对于HTTP传输:

  • 启动服务器: MCP_TRANSPORT=http node dist/index.js
  • 或者使用Docker: make build && make up
  • 服务器位于: http://localhost:3003/mcp
  • 健康检查: curl http://localhost:3003/health

对于STDIO传输:

  • 构建项目: npm run build
  • 客户端将生成: node dist/index.js
  • 不需要持久服务器

🎯 最佳实践

  1. 始终使用MCP服务器 -它自动处理所有服务器错误
  2. 不要只依赖WSDL -测试实际服务器行为
  3. 优雅地处理500个错误 -可能表示服务器错误,而不是客户端错误
  4. 使用合理的默认值 -MCP自动提供
  5. 跨多个站点进行测试 -行为是一致的,但要验证
  6. 使用议会发现工具 -轻松按名称或地区查找议会

🔧 错误处理示例

// The MCP server handles these automatically, but for direct API usage:
try {
  const result = await modgovClient.getMeetings(siteUrl, 138);
} catch (error) {
  if (error.message.includes('Missing parameter')) {
    // This indicates a server bug, not client error
    console.log('Server implementation bug detected - use MCP server instead');
  }
}

贡献

  1. 遵循TDD原则——先编写测试
  2. 在提交之前,确保所有测试都通过
  3. 添加具有全面测试覆盖率的新功能
  4. 针对任何API更改更新文档

许可证

麻省理工学院