Skip to main content
Glama
szeider
by szeider

MCP 솔버

MCP 호환 라이센스: MIT 파이썬 버전

대규모 언어 모델에 SAT, SMT 및 제약 조건 해결 기능을 제공하는 MCP(모델 컨텍스트 프로토콜) 서버입니다.


개요

MCP Solver는 모델 컨텍스트 프로토콜을 통해 SAT, SMT 및 제약 조건 해결을 LLM과 통합하여 AI 모델이 다음을 대화형으로 생성, 편집 및 해결할 수 있도록 합니다.

MCP Solver의 시스템 아키텍처와 이론적 기초에 대한 자세한 설명은 다음 연구 논문을 참조하세요: Stefan Szeider, "MCP-Solver: Integrating Language Models with Constraint Programming Systems" , arXiv:2501.00539, 2024.

Related MCP server: mcp-optimizer

사용 가능한 도구

다음 항목은 (MinZinc/Pysat/Z3) 코드의 일부를 의미하고, 모델은 인코딩을 의미합니다.

도구 이름

설명

clear_model

모델에서 모든 항목을 제거합니다.

add_item

특정 인덱스에 새 항목 추가

delete_item

인덱스에서 항목 삭제

replace_item

인덱스에서 항목 교체

get_model

번호가 매겨진 항목으로 현재 모델 콘텐츠 가져오기

solve_model

모델 풀기(시간 초과 매개변수 포함)


시스템 요구 사항

  • 파이썬과 프로젝트 매니저 uv

  • 파이썬 3.11+

  • 모드별 요구 사항: MiniZinc, PySAT, Python Z3(필수 패키지는 pip를 통해 설치됨)

  • 운영 체제: macOS, Windows, Linux(적절한 적응 포함)


설치

MCP Solver를 사용하려면 Python 3.11 이상, uv 패키지 관리자, 솔버별 종속성(MiniZinc, Z3 또는 PySAT)이 필요합니다.

Windows, macOS, Linux에 대한 자세한 설치 지침은 INSTALL.md를 참조하세요.

빠른 시작:

지엑스피1


사용 가능한 모드/백엔드 해결

MCP 솔버는 세 가지 고유한 운영 모드를 제공하며, 각 모드는 서로 다른 제약 조건 해결 백엔드와 통합됩니다. 각 모드는 특정 종속성을 필요로 하며, 다양한 유형의 문제를 해결하는 고유한 기능을 제공합니다.

미니징크 모드

MiniZinc 모드는 다음과 같은 기능을 통해 MiniZinc 제약 모델링 언어와의 통합을 제공합니다.

  • 글로벌 제약 조건을 포함한 풍부한 제약 조건 표현식

  • Chuffed 제약 조건 솔버와의 통합

  • 최적화 기능

  • get_solution 통해 솔루션 값에 액세스

종속성 : minizinc 패키지가 필요합니다( uv pip install -e ".[mzn]" )

구성 : MiniZinc 모드에서 실행하려면 다음을 사용하세요.

mcp-solver-mzn

PySAT 모드

PySAT 모드에서는 다음 기능을 통해 Python SAT 솔빙 툴킷과 상호 작용할 수 있습니다.

  • CNF(Conjunctive Normal Form)를 이용한 명제적 제약 모델링

  • 다양한 SAT 솔버(Glucose3, Glucose4, Lingeling 등)에 접근 가능

  • 기수 제약 조건(at_most_k, at_least_k, exact_k)

  • 부울 제약 조건 해결 지원

종속성 : python-sat 패키지가 필요합니다( uv pip install -e ".[pysat]" )

구성 : PySAT 모드에서 실행하려면 다음을 사용하세요.

mcp-solver-pysat

Z3 모드

Z3 모드는 다음 기능을 통해 Z3 SMT(Satisfiability Modulo Theories) 풀이 기능에 대한 액세스를 제공합니다.

  • 풍부한 유형 시스템: 부울, 정수, 실수, 비트 벡터, 배열

  • 양화사를 사용한 제약 조건 해결

  • 최적화 기능

  • 일반적인 모델링 패턴을 위한 템플릿 라이브러리

종속성 : z3-solver 패키지가 필요합니다( uv pip install -e ".[z3]" )

구성 : Z3 모드에서 실행하려면 다음을 사용하세요.

mcp-solver-z3

MCP 테스트 클라이언트

MCP 솔버에는 ReAct 에이전트 프레임워크를 기반으로 개발, 실험 및 진단을 위한 MCP 클라이언트가 포함되어 있습니다. 이 클라이언트는 LLM과 MCP 서버 간의 중개자 역할을 하며, 자연어 문제 진술을 정형 제약 조건 프로그래밍 솔루션으로 변환하는 과정을 용이하게 합니다.

설치

# Install client dependencies
uv pip install -e ".[client]"

# Verify client installation and configuration
uv run test-setup-client

클라이언트는 LLM 제공업체의 API 키를 요구합니다. Anthropic(기본 LLM은 Claude Sonnet 3.7)의 경우 ANTHROPIC_API_KEY 환경 변수를 설정하세요. 이 변수는 사용자 환경에서 설정하거나 프로젝트 루트의 .env 파일에 포함할 수 있습니다.

용법

클라이언트는 각 솔버 백엔드에 대해 특수 명령을 제공합니다.

# MiniZinc mode
uv run run-test mzn --problem <path/to/problem.md>

# PySAT mode
uv run run-test pysat --problem <path/to/problem.md>

# Z3 mode
uv run run-test z3 --problem <path/to/problem.md>

예시

예제 1: 주조 문제(MiniZinc)

이는 조지 존슨(George Johnson)의 사례에 근거합니다(NYT, 1999년 7월 13일).

사용자

연극 연출가가 자신의 순진한 배우 알바레즈나 조카인 배우 코헨을 작품에 캐스팅해야 한다고 느낀다고 가정해 보겠습니다. 하지만 알바레즈는 자신의 전 애인인 코헨 씨와 함께하는 연극에 출연하지 않고, 새로운 연인인 배우 데븐포트도 캐스팅해야 한다고 요구합니다. 자신의 호의에 보답해야 할 제작자는 배우 브라니슬랍스키에게 배역을 맡기겠다고 고집합니다. 하지만 브라니슬랍스키 씨는 알바레즈나 데븐포트 씨와 함께하는 어떤 연극에도 출연하지 않을 것입니다. 연출가는 그 연극을 캐스팅할 수 있을까요?

시스템: clear_model

Model cleared

시스템: add_item (다중)

var bool: alvarez;
var bool: cohen;
var bool: branislavsky;
var bool: davenport;
constraint alvarez \/ cohen;                          % Must cast either Alvarez or Cohen
constraint not (alvarez /\ cohen);                    % Alvarez won't work with Cohen
constraint alvarez -> davenport;                      % If Alvarez is cast, Davenport must be cast
constraint branislavsky;                              % Branislavsky must be cast
constraint not (branislavsky /\ alvarez);             % Branislavsky won't work with Alvarez
constraint not (branislavsky /\ davenport);           % Branislavsky won't work with Davenport
solve satisfy;

시스템: solve_model

{'status': 'SAT', 'solution': Solution(alvarez=False, cohen=True, branislavsky=True, davenport=False, _checker=''), 'solve_time': 0.0}

해결책(코헨과 브라니슬랍스키는 출연시키지만 알바레즈와 데븐포트는 출연시키지 않음)은 모든 제약 조건을 충족합니다.

예제 2: N-퀸 문제(MiniZinc)

사용자

nxn 체스판에 n개의 퀸을 놓을 수 있는지 확인해 보세요. n=10, 20, 30, 40으로 놓고 풀이 시간을 비교해 보세요.

시스템: clear_model

Model cleared

시스템: add_item (다중)

int: n = 10;
array[1..n] of var 1..n: queens;
constraint alldifferent(queens);
constraint alldifferent([queens[i] + i | i in 1..n]);
constraint alldifferent([queens[i] - i | i in 1..n]);
solve satisfy;

시스템: solve_model (n 값을 변경하여 n=10, 20, 30, 40)

시간 비교를 풀어보세요: n=10: 0.001sn=20: 0.005sn=30: 0.040sn=40: 0.043s

테스트된 모든 보드 크기에 대한 솔루션이 존재합니다. 시간 복잡도는 비선형적으로 증가하지만 n=40까지는 관리 가능한 수준입니다.

예제 3: 순회 판매원 문제(MiniZinc)

사용자

비엔나에 거주하는 한 판매원이 오스트리아 각 주의 주도를 한 번씩 방문하는 다가오는 여행을 계획해야 합니다. 최단 경로를 찾는 데 도움을 주세요. 거리(km): 1=비엔나, 2=장크트푈텐, 3=아이젠슈타트, 4=린츠, 5=그라츠, 6=클라겐푸르트, 7=잘츠부르크, 8=인스브루크, 9=브레겐츠

[사용자 메시지에 제공된 거리 행렬 표]

시스템: add_item (다중)

include "globals.mzn";
int: n = 9;
array[1..n,1..n] of int: dist = [|0,65,60,184,195,319,299,478,631|65,0,125,119,130,254,234,413,566|60,125,0,184,157,281,261,440,593|184,119,184,0,208,252,136,315,468|195,130,157,208,0,136,280,459,629|319,254,281,252,136,0,217,391,566|299,234,261,136,280,217,0,188,343|478,413,440,315,459,391,188,0,157|631,566,593,468,629,566,343,157,0|];
array[1..n] of var 1..n: succ;
var int: total_dist = sum(i in 1..n)(dist[i,succ[i]]);
constraint circuit(succ);
solve minimize total_dist;

시스템: solve_model

{'status': 'SAT', 'solution': Solution(objective=1564, succ=[2, 4, 1, 7, 3, 5, 9, 6, 8], _checker=''), 'solve_time': 0.002}

최적의 경로: 비엔나 → 장크트 푈텐 → 린츠 → 잘츠부르크 → 브레겐츠 → 인스부르크 → 클라겐푸르트 → 그라츠 → 아이젠슈타트 → 비엔나, 총 거리 1,564km.

피드백

이 양식을 통해 작성자에게 피드백을 제공할 수 있습니다.

부인 성명

이 MCP 솔버는 프로토타입 단계이므로 주의해서 사용해야 합니다. 사용자는 자유롭게 실험해 볼 수 있지만, 중요한 환경에서 사용하는 경우 모든 위험은 사용자에게 있습니다.


특허

이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여되었습니다. 자세한 내용은 라이선스 파일을 참조하세요.


Available Tools

6 tools
python_execA

Execute Python code in the persistent solving kernel.

Runs in the kernel set up by select_backend unless kernel_id overrides it. State persists across calls (variables, imports). Raise timeout (seconds, max 300) for long solver runs.

NameRequiredDescriptionDefault
codeYes
timeoutNo
kernel_idNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations, so the description carries the full burden. It usefully discloses that state (variables, imports) persists across calls and that timeout caps at 300 seconds, but says nothing about error behavior, sandboxing, or how execution output is captured/returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short lines, purpose front-loaded, with each remaining sentence adding a distinct operational fact (kernel source, state persistence, timeout cap). No filler or restated name text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description never describes what an execution returns (stdout, errors, result value), which is a meaningful gap for a code-execution tool. Kernel selection, persistence, and timeout behavior are covered, so the definition is workable but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for two of three params: kernel_id is explained as overriding the kernel established by select_backend, and timeout is defined in seconds with a max of 300. The 'code' param is left implicit but is self-evident from the tool purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Execute Python code') and adds the key qualifier that it runs in the persistent solving kernel, which differentiates it from a one-shot execution. It references select_backend for kernel setup, but never contrasts itself with submit_code, so sibling distinction is only partial.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives implied usage guidance: raise the timeout for long solver runs, and rely on state persisting across calls. However, it never says when to prefer this over submit_code or when to instead use python_interrupt/python_reset, so the caller must infer routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

python_interruptB

Interrupt running code in the solving kernel (state is preserved).

NameRequiredDescriptionDefault
kernel_idNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does disclose one meaningful trait — that state is preserved rather than discarded — but says nothing about what happens if nothing is running, whether interruption is cooperative, permissions, or the result of the call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the verb and effect lead the reader immediately. It is efficient, though it is arguably too terse for the behavioral gaps it leaves.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema and no annotations, the description covers purpose and one behavioral note. It omits how to target a specific kernel and what the caller observes after interrupting, leaving the agent to guess at invocation details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

One parameter (kernel_id, nullable, default null) has 0% schema description coverage, and the description adds no meaning: it never explains what kernel_id identifies, that it is optional, or what the default targets. The 'solving kernel' phrasing hints at a default target but is not tied to the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('interrupt') and resource ('running code in the solving kernel'), plus a scope qualifier ('state is preserved') that separates it from python_reset. It does not name siblings explicitly, so the differentiation is inferable rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the verb: call it when running code needs to be stopped without losing kernel state. There is no explicit guidance on when to prefer this over python_reset, nor any prerequisite or condition (e.g., only valid while execution is in flight).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

python_resetA

Create a new kernel (no kernel_id) or reset one (with kernel_id).

Prefer select_backend, which installs the right solver packages for you. The kernel created or reset here becomes the target of bare python_exec calls.

NameRequiredDescriptionDefault
packagesNo
kernel_idNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It usefully discloses that the created or reset kernel becomes the target of bare python_exec calls, but it does not mention that resetting may discard existing kernel state, nor does it explain the packages parameter's effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no wasted text. The main behavior is front-loaded, followed by the alternative tool guidance and the downstream effect on python_exec.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, state-changing tool with no annotations, no output schema, and 0% schema description coverage, the description is incomplete. It covers purpose and one parameter but leaves packages undocumented and does not describe reset side effects or state loss.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for both parameters. It explains kernel_id's effect well by describing create-without vs reset-with, but it completely omits the packages parameter, leaving half the parameters undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource, and it clearly distinguishes the two modes: no kernel_id creates a new kernel, while a provided kernel_id resets one. It also names the related sibling tool select_backend, so the tool's role is immediately identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to prefer select_backend when solver packages are needed, which is useful routing guidance. The create-vs-reset condition is also clear, though the description does not explicitly state when not to use python_reset or what prerequisites exist.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

python_statusC

Check kernel state: active kernels, defined variables, packages.

NameRequiredDescriptionDefault
kernel_idNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. 'Check' implies a read-only operation, but it does not explicitly state that it is non-destructive, nor does it describe side effects, authorization needs, or rate limits. It only lists what is inspected, which is minimal behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. It efficiently conveys the core purpose in one clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple no-required-parameter tool with no output schema, the description gives an outline of what is returned (kernels, variables, packages). However, it omits usage context and parameter semantics, leaving gaps an agent must infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage and the description never mentions the optional kernel_id parameter. It does not explain what the parameter does, when to supply it, or what the default behavior is when omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Check' and resource 'kernel state', and enumerates the inspected items (active kernels, variables, packages). It is clear but does not differentiate this tool from siblings like python_exec or python_interrupt.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is given. The description does not say when to prefer this over python_exec or python_interrupt, nor does it state any prerequisites like requiring an active kernel.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_backendA

Start solving a constraint problem: call this FIRST, once per problem.

Sets up a persistent IPython kernel preloaded with the backend's solver library and helper functions, and returns the modeling instructions for that backend. Calling it again recycles the kernel for a new problem (previous session state is cleared).

Backends:

  • pysat: Boolean satisfiability — feasibility, combinatorial search

  • maxsat: weighted optimization over Boolean constraints

  • z3: SMT — integers/reals/bitvectors, proofs, program verification

  • cpmpy: finite-domain constraint programming — scheduling, assignment, puzzles

  • clingo: Answer Set Programming — logic rules, defaults, reachability

  • didp: dynamic programming (state-space search) — routing, sequencing, packing

Unsure which backend fits? Read the resource mcp-solver://guide first.

Then iterate with python_exec (write, run, verify against the problem statement), and finish by calling submit_code with the final, verified, self-contained program. UNSAT / "no solution exists" is a valid outcome.

NameRequiredDescriptionDefault
solverYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and delivers: persistent kernel lifetime, that re-invocation clears previous session state, that it returns modeling instructions, and that UNSAT is a legitimate terminal outcome. These are exactly the behavioral traits an agent needs and that the schema does not express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded imperative first sentence, then setup behavior, then the backend list, then the workflow tail. The bulleted backend table is dense with information and every line earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, but the description says what is returned (modeling instructions) and sketches the full three-stage workflow ending in submit_code. For a single-parameter entry-point tool, an agent has everything required to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single 'solver' parameter has no enum, so the description must supply the value domain — and it does, enumerating all six backends with a one-line semantic gloss each (e.g. 'z3: SMT — integers/reals/bitvectors, proofs, program verification'). It does not explicitly state that these strings are the accepted values of the solver argument, so the mapping is inferred rather than stated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Start solving a constraint problem' and sets up a persistent IPython kernel preloaded with the backend solver library. It explicitly positions itself against siblings by naming the full workflow (python_exec to iterate, submit_code to finish), so an agent can place it without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('call this FIRST, once per problem'), re-use semantics ('Calling it again recycles the kernel for a new problem'), an escape hatch for uncertainty ('Unsure which backend fits? Read the resource mcp-solver://guide first'), and the follow-on tools. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_codeA

Submit the final, verified, self-contained solver program.

Call ONCE at the end, only after executing the program via python_exec and passing your verification. The code is syntax-checked; on success it is stored and linked as a resource (the server keeps the last 50).

NameRequiredDescriptionDefault
codeYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses validation behavior (syntax-checked), the failure path, and what happens on success (stored and linked as a resource, server retains the last 50). It omits whether resubmission overwrites a prior submission and what an error response looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and artifact, then the timing constraint, then the side effect. No filler and nothing repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter submission tool with no annotations and no output schema, the description covers purpose, timing, validation, and persistence/retention. Remaining gaps (retry semantics, error format) are minor given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the schema itself only says 'code: string', so the description has to define the payload; it does so by specifying the code must be the final, verified, self-contained solver program. It stops short of stating language/format constraints, but the payload's required qualities are communicated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (submit) plus the exact resource (the final, verified, self-contained solver program), which is distinct from the sibling execution/status tools. It does not explicitly name which sibling it is contrasted with, but the artifact it accepts is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit timing ('Call ONCE at the end'), an explicit prerequisite ('only after executing the program via python_exec and passing your verification'), and names the sibling tool involved. An agent cannot mistake when this should fire.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv4.1.0
    • First observedpython_exec
    • First observedpython_interrupt
    • First observedpython_reset
    • First observedpython_status
    • First observedselect_backend
    • First observedsubmit_code

TDQS

A3.6/5.0

Scored across 6 tools

Disambiguation4/5

Most tools are clearly distinct: python_status, python_interrupt, python_exec, and submit_code each have a unique role. The only mild overlap is between select_backend and python_reset (both create/configure kernels), but descriptions explicitly steer users to prefer select_backend, resolving the ambiguity.

Naming Consistency3/5

Four tools share a consistent python_<action> prefix (python_status, python_interrupt, python_exec, python_reset), but select_backend and submit_code break this pattern with a verb_noun convention. Two coexisting conventions make it mixed but still readable.

Tool Count5/5

Six tools is well-scoped for a constraint-solving workflow: backend setup, execution, kernel management, and final submission. Each tool earns its place with no redundancy.

Completeness4/5

The lifecycle (select_backend -> python_exec iterate -> submit_code, with status/interrupt/reset for kernel control) is well covered. Minor gaps: no tool to list or retrieve previously submitted solutions (only a resource mention), but core workflows are complete.

Maintenance

ActivityMaintained
ResponsivenessWithin a week

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP-ORTools integrates Google's OR-Tools constraint programming solver with Large Language Models through the MCP, enabling AI models to: Submit and validate constraint models Set model parameters Solve constraint satisfaction and optimization problems Retrieve and analyze solution
    21
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables solving Constraint Satisfaction Problems (CSP) like N-Queens, graph coloring, and Sudoku, as well as Linear Programming optimization problems through both MCP tools and HTTP API endpoints.
    2
    MIT
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    An MCP server that enables Large Language Models to interactively create, edit, and solve constraint models using backends like MiniZinc, Z3, PySAT, and Clingo. It bridges natural language with symbolic reasoning for solving complex logical, SAT, SMT, and optimization problems.
    MIT