使用函数式编程原则实现的Python抽象层,用于Z3定理证明器的功能,并通过模型上下文协议(MCP)服务器暴露这些功能。
该项目展示了如何使用函数式编程方法来解决复杂的约束满足问题并分析实体之间的关系。它利用了returns库进行函数式编程抽象,并通过一个MCP服务器暴露其功能。
z3_mcp/
├── core/ # 核心实现
│ ├── solver.py # 约束满足问题求解
│ └── relationships.py # 关系分析
├── models/ # 数据模型
│ ├── constraints.py # 约束问题模型
│ └── relationships.py # 关系分析模型
├── server/ # MCP服务器
│ └── main.py # 服务器实现
└── examples/ # 示例用法
└── main.py # 功能演示
此项目使用uv进行依赖管理。
# 克隆仓库
git clone https://github.com/javergar/z3_mcp.git
cd z3_mcp
# 安装依赖
uv pip install -e .
# 安装开发依赖(可选)
uv pip install -e ".[dev]"
项目包含几个示例,展示了Z3求解器的能力:
# 运行示例
python -m z3_poc.examples.main
示例包括:
启动MCP服务器以通过模型上下文协议暴露Z3功能:
# 运行服务器
python -m z3_poc.server.main
要在VSCode中通过Cline扩展使用Z3求解器MCP服务器与Claude,需要配置settings.json文件:
mcpServers对象添加以下内容:"z3-solver": {
"command": "uv",
"args": [
"--directory",
"/path/to/your/z3_poc",
"run",
"z3_poc/server/main.py"
],
"disabled": false,
"autoApprove": [
"simple_constraint_solver",
"simple_relationship_analyzer",
"solve_constraint_problem",
"analyze_relationships"
]
}
配置选项:
command:要运行的命令(使用uv进行Python环境管理)args:命令参数,包括项目的路径和服务器脚本disabled:设为false启用服务器autoApprove:无需显式批准即可使用的工具列表重启:更新设置后,重启VSCode或Claude桌面应用使更改生效。
配置完成后,Claude将能够通过MCP服务器访问Z3求解器的功能。
服务器提供以下工具:
solve_constraint_problem解决带有完整问题模型的约束满足问题。
# 示例输入
{
"problem": {
"variables": [
{"name": "x", "type": "integer"},
{"name": "y", "type": "integer"}
],
"constraints": [
{"expression": "x + y == 10"},
{"expression": "x >= 0"},
{"expression": "y >= 0"}
],
"description": "找到非负值x和y,使得它们之和等于10"
}
}
analyze_relationships分析带有完整关系查询模型的实体间的关系。
# 示例输入
{
"query": {
"relationships": [
{"person1": "Alice", "person2": "Bob", "relation": "sibling"},
{"person1": "Bob", "person2": "Charlie", "relation": "sibling"}
],
"query": "sibling(Alice, Charlie)"
}
}
simple_constraint_solver一个更简单的接口,用于解决约束问题,无需完整的Problem模型。
# 示例输入
{
"variables": [
{"name": "x", "type": "integer"},
{"name": "y", "type": "integer"}
],
"constraints": [
"x + y == 10",
"x <= 5",
"y <= 5"
],
"description": "找到x和y的值"
}
simple_relationship_analyzer一个更简单的接口,用于分析关系,无需完整的RelationshipQuery模型。
# 示例输入
{
"relationships": [
{"person1": "Bob", "person2": "Hanna", "relation": "sibling"},
{"person1": "Bob", "person2": "Claudia", "relation": "sibling"}
],
"query": "sibling(Hanna, Claudia)"
}
该项目展示了几个函数式编程原则:
returns.result.Result进行无异常的错误处理returns.maybe.Maybe处理可能为空的值Result.do()进行顺序操作analyze_relationships中do记号的例子:
expr = (
RelationshipResult(...)
for entities in create_entities(query.relationships)
for relations in create_relations(query.relationships)
for _ in add_relationship_assertions(solver, query.relationships, entities, relations)
for query_expr in parse_query(query.query, entities, relations)
for (result, explanation, is_satisfiable) in evaluate_query(solver, query_expr)
)
return Result.do(expr)
欢迎贡献!请随时提交Pull Request。
本项目采用MIT许可证——详情见LICENSE文件。