Sejmofil Neo4j MCP 服务器
用于从Neo4j图数据库查询波兰议会数据的模型上下文协议服务器。
📚 书籍 快速入门指南 |
特点/功能
- 🔍(放大镜图标,通常表示搜索或查看细节) 语义搜索使用AI驱动的语义搜索并结合灵活的状态过滤功能查找立法文件
- 🔗 图探索探索数据库中任意节点之间的连接和关系
- 📊 表格/数据图表 过程跟踪检查立法进程的状态(进行中/已完成)
- 👥 代表“人们”或“人群”的意思。 MP(议员/会员等)活动查询国会议员的立法活动
- 🏛️ 可以翻译为“建筑”或具体指“神庙、宫殿等大型建筑”,根据上下文可能有所不同。在这里,作为一个表情符号,它通常用来表示与建筑或历史遗迹相关的概念。 俱乐部统计数据获取关于议会俱乐部(政党)的全面统计数据
- 🏷️(标签) 主题分析查找相似主题并获取统计数据
- 📝 详细信息获取关于印刷品、工艺和议员(或“多功能端口”,根据上下文MP可能的不同含义,此处提供两种可能的翻译)的全面详细信息
安装
选项1:使用uv(推荐用于开发)
# Install dependencies using uv
uv sync
# Or with pip
pip install -e .选项2:使用Docker(推荐用于生产环境)
# Build the Docker image
docker build -t sejmofil-neo4j-mcp .
# Or use docker-compose
docker-compose build请见 以获取详细的Docker使用说明。
配置
创建一个 .env 文件(从...复制 .env.example):
NEO4J_HOST=bolt+s://neo.msulawiak.pl:7687
NEO4J_USER=neo4j
NEO4J_PASSWORD=your_password
OPENAI_API_KEY=your_openai_key # Optional, for semantic search
EMBEDDINGS_MODEL=text-embedding-3-small
# API Key Authorization (optional but recommended)
API_KEY=your-secret-api-keyAPI密钥授权
服务器支持简单的API密钥授权:
- API_KEY一个用于授权的单一共享API密钥
- 如果未设置,则禁用授权(不建议在生产环境中使用)
示例:
# Set the API key
API_KEY=my-secret-key-12345
# All users use the same key运行服务器
使用 Docker(生产环境推荐)
# Using docker-compose (easiest)
docker-compose up
# Or run the container directly
docker run -it --rm \
-p 8000:8000 \
-e NEO4J_HOST=bolt+s://neo.msulawiak.pl:7687 \
-e NEO4J_USER=neo4j \
-e NEO4J_PASSWORD=your_password \
-e API_KEY=your-secret-key \
-v $(pwd)/logs:/app/logs \
sejmofil-neo4j-mcp:latest服务器使用SSE(服务器发送事件)传输协议,并监听8000端口。
使用MCP Inspector(推荐用于测试)
# Install MCP Inspector globally if you haven't
npx @modelcontextprotocol/inspector
# Run the server with inspector
uv run mcp dev sejmofil_mcp/server.py检查器将在您的浏览器中打开。请尝试以下示例工具调用:
// Example 1: Search active prints about taxes
{
"name": "search_prints",
"arguments": {
"query": "podatki",
"status": "active",
"limit": 5
}
}
// Example 2: Get print details
{
"name": "get_print_details",
"arguments": {
"print_number": "1"
}
}
// Example 3: Find MP by name
{
"name": "find_mp_by_name",
"arguments": {
"name": "Tusk"
}
}
// Example 4: Explore connections of a topic
{
"name": "explore_node",
"arguments": {
"node_type": "Topic",
"node_id": "Podatki",
"limit": 10
}
}
// Example 5: Get club statistics
{
"name": "get_club_statistics",
"arguments": {
"club_name": "PiS"
}
}直接运行
uv run python -m sejmofil_mcp测试
快速连接测试
uv run python test_connection.py测试嵌入(需要OPENAI_API_KEY)
uv run python test_embeddings.py测试所有工作流
uv run python test_workflows.py全面的调试测试
uv run python debug_queries.py可用工具
1. search_prints
按主题或关键词搜索议会印刷品(立法文件)。
参数:
query(字符串): 用波兰语搜索的查询词(例如,“podatki”(税)、“obrona”(防御)、“energia odnawialna”(可再生能源))limit(int): 要返回的最大结果数(默认:10,最大:50)status(字符串): 按状态过滤 - 'active'(当前处理中),'finished'(已发布/已撤回),或 'all'(默认:'all')
示例:
search_prints("podatki", status="active") - finds active tax-related prints
search_prints("obrona narodowa") - finds all defense prints
search_prints("energia", status="finished") - finds completed energy prints2. explore_node
探索数据库中任意节点的所有连接(邻居)。
参数:
node_type(str): 节点类型 - '人物', '打印', '主题', '流程', '俱乐部', '委员会'node_id(str): 节点标识符(人物:身份证号,打印件:打印件编号,主题:主题名称,流程:流程编号,俱乐部:俱乐部名称,委员会:委员会代码)limit(int): 每种关系类型显示的最大邻居数(默认:50)
示例:
explore_node("Person", "12345") - shows all connections for MP with ID 12345
explore_node("Print", "1234") - shows authors, topics, processes for print 1234
explore_node("Topic", "Podatki") - shows all prints related to tax topic
explore_node("Club", "PiS") - shows members and activity of PiS party3. get_print_details
获取特定打印件的全面信息。
参数:
print_number(str): 打印数字(例如,“1234”)
返回值: 完整的元数据、作者、主题、组织、当前阶段、评论
4. get_process_status
检查立法程序是正在进行中还是已经结束。
参数:
process_number(字符串): 进程编号
返回值: 状态(进行中/已完成)、当前阶段、所有带日期的阶段
5. find_mp_by_name
按姓名查找国会议员。
参数:
name(字符串):议员姓名或姓名部分
返回值: 包含俱乐部和角色信息的匹配议员名单
6. get_mp_activity
获取某位议员的立法活动信息。
参数:
person_id(int): 议员的身份证号(或议员编号)
返回值: 撰写的著作、发表的演讲、委员会成员身份
7. get_similar_topics
查找语义相似的主题。
参数:
topic_name(str): 主题名称limit(int): 最大结果数(默认:5)
返回值: 具有相似度评分的相似主题
8. get_topic_statistics
获取关于议会议题的统计数据。
参数:
topic_name(str): 主题名称
返回值: 总印数,活跃印数,完成印数
9. get_club_statistics
获取有关议会俱乐部(政党/团体)的全面统计数据。
参数:
club_name(str): 要获取统计数据的俱乐部名称(例如,'PiS','Platforma Obywatelska','Lewica')
返回值: 包括会员情况、立法活动、投票、发言以及委员会参与在内的统计数据
10. list_clubs
列出所有议会俱乐部(政治党派/团体)。
返回值: 按会员数量排序的所有俱乐部列表,包含会员总数及活跃会员信息
11. search_all
搜索所有实体类型。
参数:
query(字符串):波兰语的搜索查询limit(int): 每类结果数量(默认:10)
返回值: 符合查询条件的印花税票和议员(或:符合查询条件的印刷品和议员)
建筑学
sejmofil_mcp/
├── __init__.py # Package initialization
├── __main__.py # Entry point
├── server.py # MCP server with tool definitions
├── config.py # Configuration from environment
├── neo4j_client.py # Neo4j database client
├── embeddings.py # OpenAI embeddings service
├── models.py # Pydantic data models
└── queries.py # Cypher query service示例查询
搜索关于税收的印刷品(仅限活跃状态)
search_prints(query="podatki", status="active", limit=5)获取特定打印的详细信息
get_print_details(print_number="1234")探索一个话题的所有关联
explore_node(node_type="Topic", node_id="Podatki", limit=50)检查某个进程是否仍在运行
get_process_status(process_number="567")查找议员及其活动
# First find by name
mps = find_mp_by_name(name="Kowalski")
# Then get their activity
activity = get_mp_activity(person_id=mps[0].id)获取议会俱乐部的统计数据
get_club_statistics(club_name="PiS")列出所有议会俱乐部
list_clubs()数据库模式
服务器查询Neo4j数据库,其中包含以下主要实体:
- 打印 - 议会文件(druki sejmowe,直译为“议会印刷品”)
- 过程 - 立法程序
- 舞台 - 处理阶段
- 人 - 议会议员
- 俱乐部 - 议会俱乐部(政治党派/团体)
- 主题 - 主题类别
- 组织 - 机构
- 委员会 - 议会委员会
- 投票 - 票选记录
记录日志
日志写入位置为:
- 控制台(INFO 级别)
logs/sejmofil_mcp_{time}.log(调试级别,每日轮转)logs/debug_{time}.log(用于调试脚本)
与Claude桌面版的集成
添加到Claude桌面配置:
没有Docker
{
"mcpServers": {
"sejmofil": {
"command": "uv",
"args": [
"--directory",
"E:\\neo4j-mcp",
"run",
"python",
"-m",
"sejmofil_mcp"
],
"env": {
"API_KEY": "your-api-key-here"
}
}
}
}使用 Docker
{
"mcpServers": {
"sejmofil": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-p",
"8000:8000",
"-e",
"NEO4J_HOST=bolt+s://neo.msulawiak.pl:7687",
"-e",
"NEO4J_USER=neo4j",
"-e",
"NEO4J_PASSWORD=your_password",
"-e",
"API_KEY=your-api-key",
"sejmofil-neo4j-mcp:latest"
]
}
}
}许可证
麻省理工学院(MIT)
作者
为Sejmofil.pl打造
