openconstraint-mcp@0.3.1
CAUTION· not startedPublisher claims: "Local-first MCP server for constraint solving with MiniZinc and OR-Tools CP-SAT" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
- no credential variables read in the code
- Where it talks to
- no vendor host named in the code
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it under the guard. Not started: dependency install failed; the server itself was not observed. The code names no credential variable; the guard pins the network to what the honeypot saw and logs every call.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-13 and scored it 78/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: README directs the reader to a committed installer. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 2 scenarios · 0 deviationsStatic findings
Security posture: timeout + output cap + process-tree kill is a **robustness**Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."a conservative per-child timeout/kill overhead — exceeds a fixed cap; "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.rejected up front rather than spawning a child only to kill it immediately.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.`setup-win64.exe` run silently (`setup.exe /S /D=<runtime>`) into the managedFix: Pin versions and sources; vendor anything fetched at install time.# intermediate result block survive a timeout kill (see the partialFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell."execution contract, output cap, timeout, and tree-kill as "Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Track ``proc`` until it finishes; if teardown already ran, kill it now.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.The shared timeout / output-cap / process-tree-kill run loop, used by everyFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.an output-cap tree-kill with no MUS in the capped transcript (the kill'sFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(cmd, capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Shared process-group launch and tree-kill primitives.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(cmd, capture_output=True, text=True, check=False)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.# while a cap tree-kill surfaces as `error` (deliberate fail-closed: theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# (a second kill here would double the teardown grace for anFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.``cancel_requested``. The kill runs outside the lock so a slow tree-killFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.proc = subprocess.Popen(command, stdout=sink, stderr=subprocess.STDOUT, text=True)Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.return subprocess.Popen(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.terminates outside the lock so a slow tree-kill cannot block a worker threadFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# transient tree-kill error, and the job registry's cancel hook canFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# orphaned solver children — so the tree kill must run FIRST, not as a post-waitFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.``(script_timeout_ms + tree-kill grace) + (checker_timeout_ms + tree-kill grace)``,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.result = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.tree-kill run loop and returns the raw process result; protocol parsing is theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.A hard server kill bypasses this — acceptable for a local, non-persistent v1.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.completed = subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out."""Best-effort kill of the installer process *tree*.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.subprocess.run(Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for openconstraint-mcp@0.3.1 as of 17 h ago. This is the package itself, not its dependencies.
What would make this Verified
2 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- README directs the reader to a committed installer≈ +9 on the totalPin versions and sources; vendor anything fetched at install time.
- Unclaimed publisher≈ +8 on the totalClaim openconstraint: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Python subprocess execution detected≈ +2 on the totalBuild commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.