规划工作流服务

一个独立的MCP服务器,用于处理人类参与的规划工作流,支持域和任务的更新、合并以及PDDL生成。

  • by adam-neto
  • Python
  • 混合部署
  • 更新于
在 GitHub 查看 adam-neto/l2p_mcp

使用说明

l2p mcp

封装外部确定性部分的独立MCP服务器 l2p 用于人在环规划工作流的软件包。

此仓库假设MCP客户端已经具有模型访问权限。模型只需要决定更改是属于域还是任务,然后使用工具docstring格式化更新。之后,服务器接管:它解析更新,将其合并到当前的计划状态中,在需要时推断需求,并生成更新的PDDL工件。

文件

server/

  • server.py 定义MCP工具,配置HTTP传输默认值,并启动服务器
  • server_helpers.py 包含MCP工具使用的解析、合并和规范化逻辑
  • Dockerfile 构建Docker镜像,以便将MCP服务器作为本地服务运行
  • docker-compose.yml 定义在上公开MCP服务器的本地Docker Compose服务 localhost:8002
  • .dockerignore 通过排除缓存和本地开发文件来保持Docker构建上下文较小

tests/

  • test_offline.py 用于解析、合并、生成和错误处理的直接单元测试
  • test_mcp_offline.py 端到端MCP测试,对服务器进行临时测试 stdio 使用活动Python解释器的客户端

刀具表面

服务器公开了两个高级MCP工具:

  • update_domain
  • update_task

什么 update_domain 是否

update_domain 根据模型编写的文本创建或更新域状态。它支持:

  • ### TYPES
  • ### CONSTANTS
  • ### New Predicates
  • ### FUNCTIONS
  • 使用以下方式进行零、一或多个操作更新:
    • ### Action Parameters
    • ### Action Preconditions
    • ### Action Effects
    • 可选的 ## NEXT ACTION 分隔符

该工具可以:

  • 在没有之前的情况下从空域开始 domain 被提供
  • 在以下情况下合并到现有域 domain 被提供
  • 推断 :requirements
  • 在以下情况下生成最终域PDDL domain_name 被提供

对于多动作更新,动作名称可以来自:

  • 每个操作块前放置的文本
  • action_name 以列表形式传递

什么 update_task 是否

update_task 根据模型编写的文本创建或更新任务/问题状态。它支持:

  • ### OBJECTS
  • ### INITIAL
  • ### GOAL

每个部分可以包含零个、一个或多个条目。该工具可以:

  • 在没有先前任务的情况下从空任务开始 task 被提供
  • 在以下情况下合并到现有任务中 task 被提供
  • 替换以下字段 goal 和 replace_fields
  • 在以下情况下生成最终问题PDDL domain_name 和 problem_name 提供

任务生成要求合并的任务包含:

  • objects
  • initial
  • goal

预期工作流程

  1. 用户要求更改计划
  2. 客户端模型选择 update_domain 或 update_task
  3. 模型使用所选工具docstring中记录的格式写入更新
  4. MCP服务器解析更新,将其合并到当前的结构化状态中,并在有足够的信息时返回更新的PDDL

这使服务器保持无状态,同时仍支持增量编辑。客户端只能更新目标、一个动作、几个动作、几个谓词或任何其他部分片段,而无需重新启动整个公式化过程。

测试

使用以下命令从根目录运行直接和MCP集成测试:

python3 -m unittest -v tests.test_offline tests.test_mcp_offline

当前的测试套件包括:

  • 域创建和更新
  • 任务创建和更新
  • 多动作解析与合并
  • 空动作部分
  • 类型层次结构解析
  • 基于文件的更新输入
  • MCP工具调用
  • 域和任务错误路径

码头工人

此仓库支持通过流式HTTP将MCP服务器作为长期本地Docker服务运行。Docker文件位于 server/ 目录。

容器配置为:

  • 使用 streamable-http
  • 倾听 0.0.0.0:8002 集装箱内
  • 暴露MCP端点 /mcp
  • 自动重新启动 unless-stopped

使用以下命令从repo根目录运行Docker化服务器:

docker compose -f server/docker-compose.yml up -d --build

这将在后台启动容器。运行后,MCP端点可在以下位置使用:

http://localhost:8002/mcp

有用的命令:

  • docker compose -f server/docker-compose.yml logs -f
  • docker compose -f server/docker-compose.yml ps
  • docker compose -f server/docker-compose.yml restart
  • docker compose -f server/docker-compose.yml down

为了使容器在重新启动后返回,请确保Docker Desktop配置为在登录时自动启动。

需求

  • 口译员在哪里 l2p 已安装
  • mcp
  • python3 在当前环境下

跑

python3 server/server.py

默认情况下,这将启动服务器 streamable-http 日期:

http://127.0.0.1:8002/mcp

要覆盖主机端口或路径,请执行以下操作:

MCP_TRANSPORT=streamable-http MCP_HOST=127.0.0.1 MCP_PORT=8002 python3 server/server.py

强迫老年人 stdio 对于想要直接生成进程的客户端的传输:

MCP_TRANSPORT=stdio python3 server/server.py

MCP客户端配置示例

{
  "mcpServers": {
    "l2p": {
      "command": "python3",
      "args": ["/absolute/path/to/server/server.py"],
      "env": {
        "MCP_TRANSPORT": "stdio"
      }
    }
  }
}

如果您的MCP客户端支持HTTP传输,请将其指向 http://localhost:8002/mcp 当Docker容器正在运行时,或者 http://127.0.0.1:8002/mcp 当您直接运行服务器时。