Moltline Optimize

com.moltlinestudio由 moltlinestudio.com 发布官方发布者v1.2.0更新于 Nov 9, 2026

Vehicle routing, 3-D packing, cutting stock, rostering and knapsack with OR-Tools. 7 of 11 free.

发布方自己的服务:Moltline Business Suite

已验证Streamable HTTP可网页运行效率与工作流数据与分析

概览

AI 生成的概览

Moltline Optimize 是一个托管的 OR-Tools 求解服务,提供车辆路径、三维装箱、下料、排班和背包选择。

可以做什么
  • 根据距离矩阵规划单车路径,以及最多 200 个站点的带容量和时间窗的车队路径
  • 由坐标生成直线(大圆)距离矩阵
  • 按旋转、重量和支撑规则把箱子装入容器或托盘,支持小规模和大规模
  • 为棒材、管材生成最省料的单维下料方案,为板材生成带锯缝和纹理限制的二维裁切排版
  • 在可用性、技能、工时上限和休息间隔约束下把员工分配到班次
  • 在容量限制下挑选物品,求解前校验问题,并用通俗语言解释结果
适用场景
适合需要助手给出具体物流或运营方案的场景,例如配送路线、托盘装载、材料下料清单、员工排班或受限物品选择,并希望得到求解器计算的结果而非估算。
运行要求
远程 Streamable HTTP 端点 mcp.moltlinestudio.com;支持 HTTP 的客户端无需安装。免费工具无需账号或凭据。高级工具需要 Moltline 许可证,通过 X-Moltline-License 请求头发送(stdio 桥接中为 MOLTLINE_LICENSE)。需要网络访问。
安装前请注意
有四个工具属于高级功能,需要购买许可证,其余免费。提交的问题和矩阵会发送到第三方托管服务。免费层为匿名访问,请勿提交机密运营数据。stdio 桥接是供不支持 HTTP 的客户端使用的独立 Python 3.9+ 脚本。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Moltline Optimize,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/com.moltlinestudio%2Foptimize/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "moltline-optimize": {
      "type": "http",
      "url": "https://mcp.moltlinestudio.com/optimize"
    }
  }
}

README

moltline-mcp

A thin, dependency-free stdio bridge to Moltline Studio's fleet of 22 hosted MCP servers.

Most modern MCP clients can connect to the fleet directly over Streamable HTTP, no install needed (see Direct connection below). This bridge exists for clients that only speak the stdio transport: it proxies newline-delimited JSON-RPC between your client and the hosted server, verbatim, with no telemetry and no dependencies beyond the Python 3.9+ standard library.

  • 160 tools across 22 servers; 110 are free.
  • Free tier: no registration, no account, no credentials. Connect and call tools immediately.
  • Premium tools are unlocked with a Moltline license. Set MOLTLINE_LICENSE in your MCP client's environment; the bridge sends it as the X-Moltline-License header and never writes it to argv, URLs or logs. See auth.md.
  • Independently checked by MCPize on the direct endpoints (scans of 5–6 September 2026: 6 A+, 15 A, 1 B+; scores 89–98). All 22 servers score 100 on clarity, 100 on reliability and 100 on trust, 95 on protocol and 87 on safety; the one finding raised on every server is that the free tier accepts anonymous access (which is the point of it), and the spread between servers sits in MCPize's "Market" dimension (a crowded category). Each server's MCPize listing links its own public result.

Find it on: Smithery · MCPize · Glama · Clawmart · MCP Registry

The fleet

ServerToolsWhat it does
catalog10Search 138 agent skills and personas by plain-language job; preview any product.
codereview7Risk-scan a diff, flag AI-generated-code tells, find secrets, report complexity.
govern8Audit an MCP config or SKILL.md for over-broad scope and prompt-injection risk.
timeops5Business days, meeting overlap, recurrence expansion, deadline and SLA math.
data7Paste-your-data analytics: CSV profiling, A/B tests, correlation, growth, cohorts.
humanizer5Find AI-isms with evidence, fingerprint a writing voice, measure burstiness.
business830 finance, bookkeeping, legal-ops and SMB operations persona-skill products.
creator820 blogging, brand-voice, copywriting, video and social persona-skill products.
educator78 curriculum, classroom, accommodations and exam-prep persona-skill products.
outbound87 outreach, sequencing, deliverability, call-coaching and CRM-hygiene products.
personal920 inbox, calendar, travel, meals and family-logistics persona-skill products.
research87 research navigation, thesis, note-taking and citation persona-skill products.
skillmd-lint6Lint a SKILL.md for frontmatter, structure, secrets and size. All tools free.
merchant6Commerce arithmetic: processor fees, charge-to-net, invoice totals, proration.
shipping6Dimensional weight, parcel fit, landed cost, freight class, rate cards.
shopify6Check a product CSV, URL handles, variant matrices and metafield keys.
dropship6Dropshipping unit economics: margin, lead time, SKU mapping, price ladders.
recall6A portable knowledge-graph memory you pass in and get back. No database.
vision6Image header probing, bbox conversion, resize plans, color and detection math.
regclock9Incident-reporting deadlines from the legal text (EU CRA, NIS2, DORA, GDPR, UK GDPR, HIPAA, SEC 8-K), cited.
taxlots8Crypto cost basis: parse exchange CSVs, lint, match transfers, FIFO/LIFO/HIFO lots, Form 8949 rows, 1099-DA diff.
optimize11OR-Tools routing, 3-D packing, 1-D/2-D cutting, knapsack and shift rostering with stated limits.

Machine-readable discovery: api-catalog · per-server card at https://mcp.moltlinestudio.com/<server>/.well-known/mcp/server-card.json · fleet health.

Direct connection (preferred)

If your MCP client supports Streamable HTTP (Claude Desktop, Claude Code, Cursor, and most current clients do), point it straight at the hosted endpoint (nothing to install):

json
{  "mcpServers": {    "moltline-timeops": {      "type": "http",      "url": "https://mcp.moltlinestudio.com/timeops"    }  }}

Swap timeops for any slug in the table above.

The stdio bridge (for stdio-only clients)

Install

Run directly (recommended): the bridge is a single stdlib-only file, so a clone is all you need:

bash
git clone https://github.com/GarphenGate/moltline-mcp.gitpython3 moltline-mcp/moltline_mcp.py timeops   # any of the 22 slugs; default: catalog

Docker: see Docker below if you prefer a container.

A PyPI package is planned; until then, use the methods above.

Client configuration

Point your MCP client at the script with an absolute path:

json
{  "mcpServers": {    "moltline-timeops": {      "command": "python3",      "args": ["/absolute/path/to/moltline-mcp/moltline_mcp.py", "timeops"]    }  }}

Or run it through Docker (after docker build -t moltline-mcp .):

json
{  "mcpServers": {    "moltline-timeops": {      "command": "docker",      "args": ["run", "-i", "--rm", "moltline-mcp", "timeops"]    }  }}

CLI

text
python3 moltline_mcp.py [server] [--timeout SECONDS] [--list] [--version]
  • server: one of the 22 slugs (default catalog); anything else fails fast with the valid list.
  • --timeout: per-request timeout in seconds (default 300, or env MOLTLINE_TIMEOUT).
  • --list: print the server slugs and exit.
  • Env MOLTLINE_BASE_URL: override the fleet base URL (for testing).
  • Env MOLTLINE_LICENSE: your Moltline license, sent as the X-Moltline-License header to unlock premium tools. Omit it and the bridge runs free-tier only.
  • Env MOLTLINE_DEBUG=1: diagnostic logging on stderr (stdout stays protocol-clean). The license is never logged; debug output reports only whether one is configured.

Docker

The bridge also runs containerized (stdio in, network egress to the fleet required):

bash
docker build -t moltline-mcp .docker run -i --rm moltline-mcp timeops   # any of the 22 slugs; default: catalog

See Client configuration for the matching mcpServers entry.

How it works

One process per server connection. Each JSON-RPC message read from stdin is POSTed to https://mcp.moltlinestudio.com/<server>; JSON and SSE-framed responses are relayed back to stdout as newline-delimited JSON. The bridge tracks the server-assigned Mcp-Session-Id and echoes the negotiated MCP-Protocol-Version, per the Streamable HTTP transport spec. It never inspects, stores, or reports your traffic.

Tests

The bridge ships with an offline test suite - no network, no dependencies:

bash
python -m unittest -v

Twenty-two tests cover the parts that actually break in a transport bridge: newline-delimited framing, SSE event splitting (multiple events, multi-line data: payloads, a trailing event with no blank line, comments and named events), session-id capture and reuse, protocol-version negotiation on initialize only, and error relay - a JSON-RPC error document is passed through verbatim, anything else becomes a well-formed -32603. CI runs them on Python 3.9, 3.12 and 3.13, plus a Docker build and container smoke test.

Access and licensing

  • Free tier: anonymous. No registration or credentials; all free tools work immediately.
  • Premium: unlocked with a Moltline license purchased (human-in-the-loop) at moltlinestudio.com. Set MOLTLINE_LICENSE in the environment and the bridge forwards it as the X-Moltline-License request header. It is deliberately not a command-line flag: argv is world-readable through ps. It is never placed in a URL and never logged. Details: auth.md.

Links

License

MIT © 2026 Moltline Studio

来源:README.md,提交 bbf91e4

工具

11

route_plan

Route Plan

Order up to 12 stops into the shortest single-vehicle route on your distance matrix. FREE. Typical input {"stops": [{"id": "depot"}, {"id": "A"}, {"id": "B"}], "matrix": [[0, 5, 9], [5, 0, 4], [9, 4, 0]]} returns {"routes": [{"vehicle": 0, "stops": [...], "distance": 18.0}], "total_distance": 18.0, "solver_status": "FEASIBLE", "note": "..."}. The matrix is in your units (km, minutes, cost) and must be square with the depot at index 0 unless depot says otherwise; optional demand per stop with vehicle_capacity turns it into a capacity check. Use for one driver's day or a courier's loop. Not for several vehicles or time windows: use route_plan_fleet. Not a map service: bring your own distances or call distance_matrix_haversine for straight-line values. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "stops must be a list of stop objects, depot first"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数depotstops必填matrix必填time_limit_svehicle_capacity

route_plan_fleet

Route Plan Fleet

Capacitated, time-windowed routing for a fleet over up to 200 stops. PREMIUM (license). Typical input {"stops": [{"id": "depot", "window": [480, 1080]}, {"id": "A", "demand": 3, "window": [540, 720], "service_min": 10}, ...], "matrix": [[...]], "vehicles": [{"id": "van1", "capacity": 10}, {"id": "van2", "capacity": 8, "max_distance": 120}]} returns {"routes": [{"vehicle": "van1", "stops": [{"id": "A", "arrive_min": 545, ...}], "distance": 42.5, "load": 9}], "unserved": [], "solver_status": "FEASIBLE"}. Windows and service times are minutes from the start of the day; travel time comes from time_matrix (minutes) or, if absent, the distance matrix read as minutes. Set drop_penalty to allow stops to be left unserved at that cost instead of returning INFEASIBLE. Use for daily dispatch. Not a map service; bring your own matrices. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "stops must be a list of stop objects, depot first"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数depotstops必填matrix必填vehicles必填time_matrixdrop_penaltytime_limit_s

distance_matrix_haversine

Distance Matrix Haversine

Straight-line (great-circle) distance matrix from coordinates. FREE. Typical input {"points": [{"id": "depot", "lat": 51.5, "lon": -0.12}, {"id": "A", "lat": 51.52, "lon": -0.1}]} returns {"matrix": [[0, 2.6], [2.6, 0]], "unit": "km", "kind": "straight-line (haversine), not road distance"}. Use when you have no road matrix and a straight-line approximation is acceptable, or to sanity-check one. Not road routing: real driving distances are longer and the difference is not uniform. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "points must be a list of at least two <value> objects"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数unitpoints必填

pack_bins

Pack Bins

Place up to 20 boxes into containers or pallets with rotation, weight and support rules. FREE. Typical input {"items": [{"id": "A", "l": 60, "w": 40, "h": 30, "weight": 12, "qty": 4}], "containers": [{"id": "pallet", "l": 120, "w": 80, "h": 150, "max_weight": 500, "qty": 2}]} returns {"containers_used": 1, "containers": [{"placements": [{"id": "A", "x": 0, "y": 0, "z": 0, "l": 60, "w": 40, "h": 30}, ...], "volume_fill_pct": 20.0}], "unplaced": []}. rotation per item: any, upright (rotate around the vertical axis only) or fixed; fragile items carry nothing; rules.min_support (default 0.6) is the share of a box's base that must rest on the floor or on boxes below. Use to decide pallet or carton count before booking freight. Not proven optimal: it is a first-fit-decreasing heuristic, reported as such. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数items必填rulescontainers必填

pack_bins_large

Pack Bins Large

Same packer as pack_bins for up to 300 item units and 200 containers. PREMIUM (license). Typical input {"items": [{"id": "SKU1", "l": 40, "w": 30, "h": 20, "weight": 5, "qty": 120}, ...], "containers": [{"id": "euro-pallet", "l": 120, "w": 80, "h": 180, "max_weight": 800, "qty": 10}]} returns the same shape as pack_bins: containers with placements, fill percentages, weights and any unplaced units. Use for order consolidation and load planning. Not proven optimal (first-fit decreasing on extreme points, reported as such). Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"}. Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数items必填rulescontainers必填

cutting_stock_1d

Cutting Stock 1D

Least-waste cut plan for bars, pipes or boards from stock lengths, with saw kerf. FREE. Typical input {"stock": [{"length": 6000, "cost": 30}], "parts": [{"length": 2200, "qty": 3}, {"length": 1500, "qty": 4}], "kerf": 3} returns {"bars": [{"stock_length": 6000, "cuts": [2200, 2200, 1500], "waste": 94}], "bars_used": 3, "waste_pct": 4.2, "solver_status": "OPTIMAL"}. Minimises total stock cost (or count when no cost); CP-SAT proves optimality when it finishes inside the time limit and otherwise returns the best plan found as FEASIBLE. Use for a cut list of up to 200 pieces. Not for sheets: use cutting_stock_2d. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "stock and parts must be non-empty lists (<value> and <value>)"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数kerfparts必填stock必填time_limit_s

cutting_stock_2d

Cutting Stock 2D

Guillotine cut layouts for rectangular parts from sheets, with kerf and grain. PREMIUM (license). Typical input {"sheets": [{"id": "ply", "l": 2440, "w": 1220, "qty": 5}], "parts": [{"id": "side", "l": 800, "w": 400, "qty": 6}], "kerf": 3} returns {"sheets_used": 1, "layouts": [{"sheet": "ply", "placements": [{"id": "side", "x": 0, "y": 0, "l": 800, "w": 400, "rotated": false}], "fill_pct": 64.5, "offcuts": [...]}], "unplaced": []}. Every cut is a guillotine cut (edge to edge): the sheet is ripped into strips and each strip cross-cut, which is what a panel saw does; grain true forbids rotating parts unless a part sets rotate true. Use for cabinet, sign and sheet-metal cut lists. Not proven optimal: a best-fit shelf heuristic, reported as such. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "sheets and parts must be non-empty lists (<value> and <value>)"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数kerfgrainparts必填sheets必填

roster_shifts

Roster Shifts

Assign staff to shifts under availability, skills, hour caps and rest gaps. PREMIUM (license). Typical input {"staff": [{"id": "ana", "skills": ["till"], "max_hours": 40, "unavailable": ["sat-am"]}, ...], "shifts": [{"id": "sat-am", "start": "2026-09-12T08:00", "end": "2026-09-12T14:00", "required": 2, "skill": "till"}, ...], "rules": {"min_rest_hours": 11, "max_consecutive_days": 6}} returns {"assignments": [{"shift": "sat-am", "staff": ["ana", "ben"]}], "unfilled": [{"shift": "sun-pm", "short": 1}], "hours": {"ana": 30.0}, "solver_status": "OPTIMAL"}. The objective fills as many required slots as possible, then spreads hours evenly, then honours preferences (staff.prefer / staff.avoid shift ids). Use for weekly rotas of up to 60 staff and 150 shifts. Not a determination of labour-law compliance: the rules are the ones you pass. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "staff and shifts must be non-empty lists"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数rulesstaff必填shifts必填time_limit_s

knapsack_select

Knapsack Select

Choose the items that maximise value under one or more capacity limits. FREE. Typical input {"items": [{"id": "a", "value": 60, "weight": 10, "cost": 120}, {"id": "b", "value": 100, "weight": 20, "cost": 300}], "limits": {"weight": 25, "cost": 400}} returns {"selected": ["a"], "value": 60, "used": {"weight": 10, "cost": 120}, "slack": {"weight": 15, "cost": 280}, "solver_status": "OPTIMAL"}. Any numeric item field named in limits is a constrained resource; qty lets an item be taken several times. Use for budgets, cargo, campaign or feature selection. Not for dependencies between items. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "items must be a non-empty list of <value>"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数items必填limits必填time_limit_s

validate_problem

Validate Problem

Check a problem's shape and obvious feasibility before spending solver time. FREE. Typical input {"type": "route", "problem": {"stops": [...], "matrix": [[...]], "vehicles": [...]}} returns {"ok": false, "issues": ["total demand 34 exceeds total capacity 30"], "size": {"stops": 14, "vehicles": 2}, "tier_hint": "route_plan_fleet (licence) - more than 12 stops"}. Types: route, pack, cut1d, cut2d, roster, knapsack; the problem object uses the same fields as the matching tool. Use first when an agent has assembled the problem from other data. Not a solve: it never calls the solver. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "type must be one of <value>"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数type必填problem必填

explain_solution

Explain Solution

Plain-language summary of a solution from this server and the constraints that bind. FREE. Typical input {"solution": <result of route_plan_fleet>} returns {"summary": "2 vehicles serve 14 stops over 96.4 km; 1 stop unserved", "binding_constraints": ["van2 is at 100% of capacity", "stop C arrives at the end of its window"], "status": "FEASIBLE"}. It recognises results from route_plan, route_plan_fleet, pack_bins, cutting_stock_1d, cutting_stock_2d, roster_shifts and knapsack_select by their fields. Use to turn solver output into a message for a dispatcher or a shop floor. Not a re-solve. Errors: on invalid, missing, or malformed input this tool never raises a protocol error — it returns {"error": "<what is wrong and how to fix it>"} (for example {"error": "solution must be the result object returned by a solve tool on this server"}). Every call is read-only and idempotent, so after correcting the input it is always safe to retry.

输入参数solution必填

版本历史

1
  1. v1.2.0最新Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

其他 Moltlinestudio 集成