MiniZinc约束求解服务

提供MiniZinc约束编程能力的MCP服务器,支持模型求解、验证及多种传输协议。

  • by V-Sekai-fire
  • Elixir
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 V-Sekai-fire/minizinc-mcp

使用说明

MiniZinc MCP服务器

提供MiniZinc约束编程功能的模型上下文协议(MCP)服务器。

特性

  • 使用HiGHS求解器求解MiniZinc模型(带浮动支持的LP/MIP)
  • 验证MiniZinc模型的语法和类型错误,而无需解决
  • 支持MZN(模型)和DZN(数据)内容作为字符串
  • 自动标准库包含(例如。, alldifferent.mzn)当模型中不存在时
  • 全面的输出格式:解析DZN格式进行变量提取,从显式输出语句中传递output_text
  • 通过STDIO或HTTP传输支持JSON-RPC 2.0协议
  • 服务器发送事件(SSE)支持流式响应

快速开始

先决条件

  • 灵丹妙药1.18+
  • MiniZinc已安装并可在PATH中使用

备注MiniZinc会自动安装在Docker镜像中。

安装

git clone <repository-url>
cd minizinc-mcp
mix deps.get
mix compile

用法

STDIO传输(默认)

对于当地发展:

mix mcp.server

或使用release:

./_build/prod/rel/minizinc_mcp/bin/minizinc_mcp start

HTTP传输

对于web部署(例如Smithery):

PORT=8081 MIX_ENV=prod ./_build/prod/rel/minizinc_mcp/bin/minizinc_mcp start

终点:

  • POST / -JSON-RPC 2.0 MCP请求
  • GET /sse -服务器发送流媒体事件
  • GET /health -健康检查

码头工人

docker build -t minizinc-mcp .
docker run -d -p 8081:8081 --name minizinc-mcp minizinc-mcp

工具

服务器提供以下MCP工具:

minizinc_solve

使用HiGHS求解器(带浮动支撑的LP/MIP)求解MiniZinc模型。

参数

  • model_content (字符串,必填):MiniZinc模型内容(.mzn)为字符串
  • data_content (string,可选):DZN数据内容为字符串(例如。, "n = 8;").必须是有效的DZN格式。已解析并包含在响应中 input_data 现场。
  • timeout (整数,可选):可选超时(毫秒)(默认值:30000,即30秒)。允许的最大值为30000毫秒(30秒);超过此值的上限为30秒。
  • auto_include_stdlib (boolean,可选):自动包含标准MiniZinc库(例如。, alldifferent.mzn)如果不存在(默认值: true)
Output Format Details

这 minizinc_solve 该工具以JSON格式返回解决方案,格式如下:

  • DZN格式解析:当MiniZinc提供DZN格式输出时(模型没有显式 output 变量被解析并作为结构化数据返回(例如。, {"x": 10, "y": [1, 2, 3]})
  • 输出文本传递:当模型包括显式 output 语句,输出文本在 output_text 字段(例如。, {"output_text": "x = 10\n"})
  • 两种格式:当DZN和显式输出都可用时,它们都包含在响应中
  • 输入数据:何时 data_content 解析后的DZN数据包含在 input_data 领域
  • 状态:解决方案状态(例如。, "SATISFIED", "OPTIMAL_SOLUTION", "UNSATISFIABLE")可用时包括在内

响应始终在MCP内容字段中以JSON字符串的形式返回。

Standard Library Support

这 minizinc_solve 该工具自动包括常见的MiniZinc标准库(例如。, alldifferent.mzn) 如果它们尚未出现在模型中(当 auto_include_stdlib 是 true).这意味着您可以使用 标准功能,如 all_different 无需添加显式 include 声明。

Solve Tool Examples

工作室:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "minizinc_solve",
    "arguments": {
      "model_content": "var int: x; constraint x > 0; solve satisfy;"
    }
  }
}

HTTP:

curl -X POST http://localhost:8081/ \
  -H "Content-Type: application/json" \
  -H "mcp-protocol-version: 2025-06-18" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "minizinc_solve", "arguments": {"model_content": "var int: x; constraint x > 0; solve satisfy;"}}}'

数据内容:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "minizinc_solve",
    "arguments": {
      "model_content": "var int: n; array[1..n] of var int: x; constraint all_different(x); solve satisfy;",
      "data_content": "n = 8;",
      "timeout": 30000
    }
  }
}

minizinc_validate

通过检查语法和类型检查来验证MiniZinc模型,而无需求解。在尝试解决模型之前,对调试模型很有用。

参数

  • model_content (字符串,必填):MiniZinc模型内容(.mzn)为字符串
  • data_content (string,可选):DZN数据内容为字符串(例如。, "n = 8;").必须是有效的DZN格式。
  • auto_include_stdlib (boolean,可选):自动包含标准MiniZinc库(例如。, alldifferent.mzn)如果不存在(默认值: true)

响应格式

返回一个JSON对象:

  • valid (boolean):模型是否有效
  • errors (array):错误消息列表(如果有的话)
  • warnings (array):警告消息列表(如果有的话)
  • message (string):人类可读消息(有效时)
  • raw_output (string):原始MiniZinc验证输出(无效时)
Validate Tool Examples

验证有效模型:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "minizinc_validate",
    "arguments": {
      "model_content": "var int: x; constraint x > 0; solve satisfy;"
    }
  }
}

对有效型号的响应:

{
  "valid": true,
  "errors": [],
  "warnings": [],
  "message": "Model is valid"
}

验证有语法错误的模型:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "minizinc_validate",
    "arguments": {
      "model_content": "var int: x; constraint x > 0 solve satisfy;"
    }
  }
}

对无效模型的响应:

{
  "valid": false,
  "errors": [
    "Error: syntax error, unexpected solve, expecting ';'"
  ],
  "warnings": [],
  "raw_output": "..."
}

配置

环境变量:

  • PORT -HTTP服务器端口(默认值:8081)
  • HOST -HTTP服务器主机(默认值: 0.0.0.0 如果设置了端口,否则 localhost)
  • MIX_ENV -环境(prod, dev, test)
  • ELIXIR_ERL_OPTIONS -Erlang选项(设置为 "+fnu" 对于UTF-8)
  • MCP_SSE_ENABLED -启用/禁用服务器发送事件(默认值: true,设置为 "false" 禁用)

服务器仅使用HTTP流(没有stdio传输)。

故障排除

未找到MiniZinc:确保MiniZinc已安装并在PATH中可用。对于Docker,MiniZinc包含在镜像中。

端口已在使用中:更改 PORT 环境变量或停止冲突的服务。

编译错误:运行 mix deps.get && mix clean && mix compile.

调试模式:使用 MIX_ENV=dev mix mcp.server 用于详细日志记录。

版本

当前版本: 1.0.0-dev2 (参见 mix.exs 最新版本)

需求

  • 灵丹妙药1.18+
  • Erlang/OTP 26+
  • MiniZinc 2.9.3+已安装并在PATH中可用(或使用包含MiniZinc的Docker镜像)
Development

建筑

mix deps.get
mix compile

测试

mix test

建筑发布

MIX_ENV=prod mix release

本地运行

对于STDIO传输(默认):

mix mcp.server
PORT=8081 mix run --no-halt

许可证

MIT许可证-有关详细信息,请参阅License.md。

版权

版权所有(c)2025年至今K.S.Ernest(iFire)Lee