Ask an AI assistant to plan a week of production and you get a plan that looks right. Then you check it: one machine runs two jobs at once, a machine that is down for maintenance still has work on it, and the order that mattered most is late. A language model cannot prove a plan works. It only writes text that looks like one.
Constraint solvers are good at exactly this math. They are just not something you talk to. So I built a small open-source MCP server that joins the two: you talk to your assistant, and the assistant hands the plan to a real solver.
Repo: ArchiPlan-io/production-scheduling-mcp (MIT)
What it does
The server has two tools:
-
solve_scheduletakes machines (with optional down times) and orders (steps in order, each with a duration and the machines that can do it, plus a due time and a priority). It runs Google OR-Tools CP-SAT and returns a plan per machine, which orders are late and why, machine use, and a Mermaid Gantt chart. -
get_examplereturns a sample shop so you can try it at once.
The solver puts each step on one eligible machine, never overlaps two jobs on a machine, keeps work out of down times, and keeps steps in order. It first reduces priority-weighted lateness, then the total finish time.
It runs locally over stdio. No account, no API key.
Example
The sample shop has 5 machines and 10 orders, and CNC-2 is down for three hours.
You: Schedule the sample shop and protect the urgent pump's due date.
Assistant: The urgent pump finishes at 11:30, before its 13:00 due time. Housing A is late by 1 hour. Reason: "Assembly-1 was busy with Urgent pump until 2026-01-05 11:30 before this step."
The whole plan finishes in 8.0 hours. The late reason is the useful part: it names the machine that caused the delay, so you know what to change. The Gantt chart is in the README.
Set up in one minute
You only need uv. uvx fetches the package and Python.
Claude Code:
claude mcp add --transport stdio production-scheduling -- uvx production-scheduling-mcp
Claude Desktop (claude_desktop_config.json) or Cursor (.cursor/mcp.json):
{"mcpServers": {"production-scheduling": {"command": "uvx", "args": ["production-scheduling-mcp"]}}}
It is also on PyPI and in the official MCP Registry as io.github.ArchiPlan-io/production-scheduling-mcp.
Things to ask
- "Schedule these orders to meet due dates. Prioritize the urgent pump."
- "Which orders will be late, and what machine caused the delay?"
- "What if CNC-2 is down Wednesday morning?"
There is no separate what-if tool. The assistant changes the down time in the input and calls the solver again. This is where the pairing works well: the model handles the conversation and the edits, the solver handles the proof.
Input
Times are decimal hours from the plan start:
{
"start": "2026-01-05T08:00",
"machines": [{"name": "CNC-1"}, {"name": "CNC-2", "down_times": [[3, 6]]}],
"orders": [{"name": "Urgent pump", "due_hour": 5, "priority": 10,
"steps": [{"hours": 1.5, "machines": ["CNC-1", "CNC-2"]},
{"hours": 2, "machines": ["Assembly-1"]}]}]
}
Limits
This is for small and medium shops. Solve time is capped at about ten seconds. It does not model shifts, labor, inventory or setup times. Check the result against your own shop rules.
If you need larger plans, saved plans or team use, that is what we build at ArchiPlan.
Feedback and issues are welcome on GitHub.
Top comments (0)