Test assistent MCP server
A local, knowledge-backed MCP server that gives agents 8 tools to advise on and generate test cases — it never executes tests itself.
Catalog knowledge:
catalog_techniqueslists 7 classic techniques (BVA, equivalence partitioning, decision table, pairwise, state transition, use case, error guessing);catalog_heuristicslists 6 heuristics (SFDPOT, FEW HICCUPPS, RCRCRC, quality criteria catalog, bug heuristics, test tours).Generate test cases:
generate_test_cases(technique, inputs)produces concrete testcases for BVA, equivalence partitioning and pairwise testing.Property-based data:
generate_with_property(spec)returns boundary + random data for int, float, string, date and boolean with constraints and optional seed reproducibility.Boundary discovery:
generate_boundary_cases(spec)auto-derives edge cases for int/float/string/date (e.g. empty, unicode, injection strings).Constrained random rows:
generate_random(spec)builds multi-field test rows, optionally seeded for repeatability.Advice:
advise_technique(description)keyword-matches a testing context to suitable techniques and heuristics.Checklists:
checklist_for(context)returns an item list, e.g. RCRCRC for regression.Extensible without code: all knowledge lives as JSON in
knowledge/techniquesandknowledge/heuristics; new files are picked up automatically.
Test Assistant MCP Server
Een MCP-server (Model Context Protocol) voor OpenCode die klassieke testtechnieken en testheuristieken als tools beschikbaar stelt aan agenten, ondersteund door een lokale, zelfstandige kennisbasis.
De server is tool-based: hij adviseert en genereert testcases, maar voert zelf geen tests uit. Het is de agent (bijv. OpenCode) die de keuzes maakt en de technieken toepast op het systeem dat wordt getest.
Functionaliteit / Wat het doet
De server ontsluit twee soorten kennis:
Testtechnieken (7): Boundary Value Analysis, Equivalence Partitioning, Decision Table, Pairwise Testing, State Transition, Use Case Testing, Error Guessing.
Testheuristieken (6): SFDPOT, FEW HICCUPPS, RCRCRC, Quality Criteria Catalog, Bug Heuristics, Test Tours.
Een agent kan hieruit:
technieken en heuristieken catalogiseren;
testcases genereren voor alle 7 technieken (BVA, EP, decision table, pairwise, state transition, use case, error guessing);
ruwe testdata genereren: random rijen of property-based (boundary + random + invalid, seed-reproduceerbaar);
advies vragen over welke techniek/heuristiek past bij een omschreven context;
een concrete checklist ontvangen (bijv. RCRCRC voor regressietesten).
Al deze kennis leeft als JSON in de map knowledge/ en wordt gelezen door de server — uitbreiden kan zonder code te wijzigen.
Related MCP server: @testneo/mcp-server
Tools
Tool | Parameters | Beschrijving |
| — | Lijst alle klassieke testtechnieken op. |
| — | Lijst alle testheuristieken op. |
|
| Genereert testcases voor één klassieke techniek: BVA, Equivalence Partitioning, Decision Table, Pairwise, State Transition, Use Case, Error Guessing. Geeft alleen testcases terug. |
|
| Genereert ruwe testdata: |
|
| Beveelt op basis van sleutelwoorden technieken en heuristieken aan voor een omschreven context. |
|
| Levert een aanbevolen test-checklist op (items) voor een context, bijv. RCRCRC voor regressie. |
Input-schema's zijn Pydantic discriminated-union-schemas (één input-object met technique- resp. strategy-discriminator); ongeldige technieken/strategies worden door schema-validatie afgewezen.
Voorbeelden van gebruik
catalog_techniques()→ catalogus van alle 7 technieken.catalog_heuristics()→ catalogus van alle 6 heuristieken.generate_test_cases({"technique": "Boundary Value Analysis", "field": "age", "min": 0, "max": 150})→ BVA-testcases rond de grenzen-1, 0, 1, 149, 150, 151.generate_test_cases({"technique": "Decision Table", "conditions": ["pays"], "actions": ["ship"], "rules": [{"when": {"pays": "yes"}, "then": ["ship"]}]})→ één case per regel.generate_test_data({"strategy": "property", "field": "age", "type": "integer", "constraints": {"min": 0, "max": 150}, "count": 10})→ boundary + random + invalid.generate_test_data({"strategy": "random", "fields": [{"field": "name", "type": "string"}, {"field": "age", "type": "integer", "constraints": {"min": 0, "max": 120}}], "count": 5, "seed": 42})→ 5 reproduceerbare testrijen.advise_technique("regression after a bug fix")→ beveelt o.a. RCRCRC aan.checklist_for("regression")→ RCRCRC-checklist met items.
Installatie
Vereisten
Python 3.11 (gebruik
/usr/bin/python3.11, niet een ouderpython3).venv-ondersteuning en
pip.
Via Smithery (aanbevolen)
npx -y smithery mcp add djsteavy/test-assistent-mcp-serverDit installeert de server via de Smithery registry. De server draait lokaal als stdio-proces.
Via GitHub clone
# 1. Kloon of ga naar de repo
git clone git@github.com:Cerios-TechLab/test-assistent-mcp-server.git
cd test-assistent-mcp-server
# 2. Maak een virtuele omgeving aan (Python 3.11)
/usr/bin/python3.11 -m venv .venv
# 3. Installeer het pakket (incl. dev-tools voor tests)
.venv/bin/pip install -e '.[dev]'De enige runtime-afhankelijkheid is mcp>=1.29.0,<2 (pinned wegens FastMCP API-wijziging in 2.x); pytest is een dev-afhankelijkheid.
Smithery registry
De server is gepubliceerd op Smithery: https://smithery.ai/servers/djsteavy/test-assistent-mcp-server
De distributie loopt als MCPB-bundel (in mcpb/, gepacked naar .mcpb). Elke push naar main publiceert opnieuw via de workflow .github/workflows/smithery-deploy.yml (scripts/smithery-deploy.py, vereist SMITHERY_API_KEY-secret). Tool-schema's staan los van de MCPB-manifest in server-card.json, omdat de MCPB-spec geen inputSchema op tools toestaat maar Smithery ze in de deploy-payload verwacht.
Daarnaast houdt .github/workflows/glama-build-and-release-gate.yml de Glama-listing groen: Glama synct automatisch vanuit GitHub, en deze workflow bouwt de Dockerfile, draait de tests en een MCP-tools/list-smoketest zodat Glama's build (die de server in eigen sandbox bouwt) nooit faalt. De Dockerfile is een stdio-server; Glama injecteert zelf de transport-shim.
Werking
Starten (stdio)
De server werkt over stdio en wordt één-op-één gestart per MCP-client:
.venv/bin/python server/testassist_mcp_server.pyBij het starten:
Wordt de kennisbasis geladen vanuit de embedded
server/knowledge/map (optioneel overridbaar viaTESTASSIST_KNOWLEDGE_DIR).Worden de 6 tools geregistreerd op de FastMCP-server.
Wacht de server op JSON-RPC-berichten over stdin en antwoordt over stdout.
Registeren in OpenCode
Voeg onder mcp in ~/.config/opencode/opencode.json toe:
"testassist": {
"type": "local",
"command": ["/root/testassist-mcp/.venv/bin/python", "/root/testassist-mcp/server/testassist_mcp_server.py"],
"enabled": true
}Nadat de opencode-servers opnieuw zijn gestart (bijv. systemctl restart opencode-serve-4096 opencode-web-4098), hebben OpenCode-agenten de tools tot hun beschikking.
Manual verificatie van de server
Omdat MCP-stdio eerst een initialize-handshake vereist vóór tools/list, test je de tool-listing als volgt:
{ printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"0"}}}'; printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}'; printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'; } | timeout 15 .venv/bin/python server/testassist_mcp_server.pyJe verwacht een JSON-antwoord waarvan result.tools 6 tools bevat (catalog_techniques, catalog_heuristics, generate_test_cases, generate_test_data, advise_technique, checklist_for) met non-empty descriptions.
Kennisbasis
Kennis leeft in knowledge/ als JSON, één bestand per techniek of heuristiek:
knowledge/
├── techniques/ # boundary_value_analysis.json, equivalence_partitioning.json, decision_table.json, ...
└── heuristics/ # sfdpot.json, few_hiccupps.json, rcrcrc.json, ...Elk bestand bevat gestructureerde velden. Techniekbestanden gebruiken name, description, when_to_use, steps en example; heuristiekbestanden gebruiken name, source, category, when_to_use, letters en example. Bij de heuristieken is letters een geordende lijst van {"letter": ..., "description": ...}-objecten, zodat mnemonics met herhaalde letters (zoals RCRCRC en FEW HICCUPPS) volledig behouden blijven.
Uitbreiden: voeg een nieuw JSON-bestand toe in de juiste map en de server biedt het automatisch aan — geen code-wijziging nodig.
Valideren en samenstellen kan met het harvest-script (print een index en is handig als sanity-check):
.venv/bin/python scripts/harvest.pyDit eindigt met exit-code 0 bij een geldige kennisbasis en met een fout bij een ongeldige.
Testen
.venv/bin/python -m pytestProjectstructuur
test-assistent-mcp-server/
├── server/
│ ├── knowledge_base.py # laadt en ontsluit de JSON-kennisbasis
│ ├── schemas.py # Pydantic discriminated-union input-schema's
│ ├── generators.py # pure testcase-generatie voor alle 7 technieken
│ ├── generate.py # property-based testdata engine (boundary, random, seed)
│ ├── advisor.py # keyword-gebaseerde advise/checklist-logica
│ └── testassist_mcp_server.py # FastMCP stdio-server die de 6 tools wiret
├── knowledge/
│ ├── techniques/ # 7 techniekbestanden (JSON)
│ └── heuristics/ # 6 heuristiekbestanden (JSON)
├── mcpb/ # Smithery MCPB distributie-bundle
│ ├── manifest.json # MCPB v0.4 manifest
│ └── server/ # kopie van server/ + knowledge/ voor distributie
├── scripts/
│ └── harvest.py # valideert kennisbasis en print index
└── tests/ # pytest-suite (42 tests)Available Tools
6 toolsadvise_techniqueC
Recommend techniques and heuristics for a described testing context via keyword analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| description | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It reveals the 'keyword analysis' mechanism, but does not mention limitations, what kind of descriptions work well, or how recommendations are produced beyond keyword matching. No contradiction with annotations exists because none were provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler and front-loads the core action. It is concise, though it sacrifices detail that could have been included without bloating the text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the basic purpose is present, but the definition lacks usage guidance and parameter semantics. An agent would still need to infer what kind of description to provide and when to choose advise_technique over sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%: the only parameter, 'description', has just a title and no schema description. The tool description mentions 'described testing context' but fails to specify expected content, format, length, or examples, so it does not compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Recommend'), resource ('techniques and heuristics'), and context ('described testing context via keyword analysis'). It is clear in what it does, though it does not explicitly differentiate itself from sibling tools like catalog_techniques or catalog_heuristics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus siblings. The phrase 'for a described testing context' implies a use case, but there are no explicit conditions, exclusions, or alternatives such as catalog_techniques for browsing all techniques.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_heuristicsA
List all test heuristics (SFDPOT, FEW HICCUPPS, RCRCRC, quality criteria catalog, bug heuristics, test tours).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the burden of behavioral disclosure, and it clearly signals a read-only enumeration operation rather than a mutation. It names the exact categories the agent can expect, which is meaningful context; output formatting details are reasonably delegated to the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The entire description is one compact, front-loaded sentence that leads with the verb and resource before packing the taxonomy into parentheses. Every part earns its place, and there is no redundancy with the empty input schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter catalog operation with an output schema present, the description is nearly complete: it tells an agent what the tool does and what content domains are covered. The only real gap is the lack of explicit routing versus the sibling catalog_techniques tool, which is a minor completeness issue.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the baseline is 4; there are no parameters whose meaning the description must clarify. The parenthetical heuristic categories add useful context about what the tool will return, even though no invocation arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List all') on a clearly defined resource ('test heuristics') and enumerates the heuristic families included (SFDPOT, FEW HICCUPPS, RCRCRC, quality criteria catalog, bug heuristics, test tours). It is clear and unambiguous, though it does not explicitly differentiate itself from the similarly named sibling catalog_techniques.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is the go-to tool when an agent needs the full catalog of test heuristics, and the parenthetical examples clarify scope. However, it gives no explicit guidance about when to choose this over catalog_techniques, generate_test_cases, or the other sibling tools, and it offers no exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_techniquesA
List all classic test techniques (BVA, equivalence partitioning, decision table, pairwise, state transition, use case, error guessing).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly indicates the tool returns a list of specific classic test techniques and names them, making the output scope transparent. It does not mention whether descriptions or examples accompany the names, but the presence of an output schema partially covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that front-loads the action and resource, then provides a helpful parenthetical enumeration. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless catalog tool, the description is complete: it specifies the exact scope of the catalog, and an output schema exists to define the return shape. No critical contextual information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document beyond the schema. Baseline for zero parameters is 4; the description adds no unnecessary parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('List') and a concrete resource ('all classic test techniques'), and enumerates exactly which techniques are included. This makes it easy for an agent to distinguish catalog_techniques from the sibling catalog_heuristics, since the resource is test techniques rather than heuristics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to use it over siblings such as catalog_heuristics or generate_test_cases. There are no explicit conditions, exclusions, or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
checklist_forB
Produce a recommended test checklist (items) for a context, e.g. RCRCRC for regression.
| Name | Required | Description | Default |
|---|---|---|---|
| context | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It indicates the output is 'recommended', implying heuristic or non-exhaustive content, but does not describe determinism, generation process, or any side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the verb and deliverable. The example is compact and every word earns its place; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and an output schema, so baseline requirements are modest. However, the cryptic RCRCRC example, absence of behavioral details, and lack of sibling differentiation make the description less complete than it could be.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only names 'context' with no description, so the description must compensate. It adds a concrete example ('RCRCRC for regression'), giving some meaning, but leaves allowed formats, scope, and valid context values vague.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Produce') and a concrete deliverable ('recommended test checklist (items)'), scoped to a context. The example 'RCRCRC for regression' clarifies the intended use, though it does not explicitly differentiate from sibling tools like generate_test_cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to prefer this tool over siblings such as generate_test_cases, catalog_techniques, or catalog_heuristics. The phrase 'for a context' implies a use case but does not state selection criteria, exclusions, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_test_casesA
Generate concrete test cases using a classic test technique (Boundary Value Analysis, Equivalence Partitioning, Decision Table, Pairwise Testing, State Transition, Use Case Testing, Error Guessing). Each call targets exactly one technique. For raw typed test data (random rows or property-based), use generate_test_data instead.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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 discloses the meaningful behavioral constraint that exactly one technique is processed per call, but says nothing about determinism, validation failures, error behavior on malformed specs, or side effects. The presence of an output schema removes the need to describe return values, which keeps this at a moderate score rather than low.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and the technique enumeration, with the sibling routing last. The parenthetical technique list is dense but earns its place because those strings are the discriminator values; no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a polymorphic one-parameter tool with a rich output schema, the description covers purpose, the one-technique-per-call rule, and the main sibling alternative, so return values need not be explained. It stops short of explaining how the union input is selected per technique or what happens on an unrecognized/invalid spec, leaving gaps for a tool whose input is a discriminated union.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Top-level schema description coverage is reported at 0%, so the description must compensate, and it partially does by naming all seven technique values that the discriminator accepts. However, it gives no guidance on the per-technique payload shape (which fields each variant requires), so an agent must still read the $defs to build a valid call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Generate concrete test cases") and enumerates the seven supported techniques, which maps directly onto the schema's discriminator constants. It also names the sibling it is not (generate_test_data), so an agent can separate these two tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes one case: "For raw typed test data (random rows or property-based), use generate_test_data instead." It also states the constraint that each call targets exactly one technique. Missing only guidance against the other siblings, notably advise_technique, which an agent could easily confuse with this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_test_dataA
Generate raw test data (values), not technique-driven test cases. strategy='random' produces N seeded rows across multiple fields; strategy='property' produces boundary + random + invalid values for a single typed field. For classic techniques with expected outcomes, use generate_test_cases.
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the load, and it does disclose real behavioral distinctions: output is raw values rather than cases with expected outcomes, property mode emits boundary + random + invalid values, and random mode is seeded. It stops short of stating whether generation has any side effects or determinism guarantees beyond 'seeded', which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each doing distinct work: what it produces, per-strategy behavior, and the sibling redirect. The core identity and the exclusion are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Given one required input with two discriminated variants, the description covers both modes and the alternative tool, leaving nothing an agent needs before calling it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported schema description coverage is 0% at the top level, so the description must explain the input shape, and it does by describing the two strategy modes and what each produces. Field-level details (constraints, count cap, include_invalid) are left to the nested schema, which documents them adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Generate raw test data (values)') and immediately contrasts it with what it is not ('not technique-driven test cases'). It names the sibling generate_test_cases, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: strategy='random' for N rows across multiple fields, strategy='property' for boundary/random/invalid values on a single typed field, and 'For classic techniques with expected outcomes, use generate_test_cases.' Both the when and the when-not/alternative are stated.
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.
5 tool updates
v1.1.0- Removed
generate_boundary_cases - Removed
generate_random - Changed
generate_test_cases5 fields changed- added
Input schema / $defsAdded value: +{ + "BoundaryValueSpec": { + "properties": { + "field": { + "description": "Field name", + "title": "Field", + "type": "string" + }, + "max": { + "description": "Inclusive upper boundary", + "title": "Max", + "type": "integer" + }, + "min": { + "description": "Inclusive lower boundary", + "title": "Min", + "type": "integer" + }, + "technique": { + "const": "Boundary Value Analysis", + "description": "Generate test cases around and beyond the min/max range edges", + "title": "Technique", + "type": "string" + } + }, + "required": [ + "technique", + "field", + "min", + "max" + ], + "title": "BoundaryValueSpec", + "type": "object" + }, + "DecisionTableSpec": { + "properties": { + "actions": { + "description": "Action names", + "items": { + "type": "string" + }, + "title": "Actions", + "type": "array" + }, + "conditions": { + "description": "Condition names", + "items": { + "type": "string" + }, + "title": "Conditions", + "type": "array" + }, + "rules": { + "description": "Rules, each {'when': {cond: value}, 'then': [action, ...]}", + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Rules", + "type": "array" + }, + "technique": { + "const": "Decision Table", + "description": "Decision table with condition-action rules; one test case per rule", + "title": "Technique", + "type": "string" + } + }, + "required": [ + "technique", + "conditions", + "actions" + ], + "title": "DecisionTableSpec", + "type": "object" + }, + "EquivalenceSpec": { + "properties": { + "field": { + "description": "Field name", + "title": "Field", + "type": "string" + }, + "invalid": { + "description": "Values expected to be rejected", + "items": {}, + "title": "Invalid", + "type": "array" + }, + "technique": { + "const": "Equivalence Partitioning", + "description": "One test case per explicit valid and invalid value", + "title": "Technique", + "type": "string" + }, + "valid": { + "description": "Values expected to be accepted", + "items": {}, + "title": "Valid", + "type": "array" + } + }, + "required": [ + "technique", + "field", + "valid", + "invalid" + ], + "title": "EquivalenceSpec", + "type": "object" + }, + "ErrorGuessingSpec": { + "properties": { + "field": { + "description": "Field name", + "title": "Field", + "type": "string" + }, + "input": { + "description": "A representative valid value", + "title": "Input" + }, + "pitfalls": { + "description": "Known error-prone values to try", + "items": {}, + "title": "Pitfalls", + "type": "array" + }, + "technique": { + "const": "Error Guessing", + "description": "Negative test cases from known error-prone pitfalls", + "title": "Technique", + "type": "string" + } + }, + "required": [ + "technique", + "field", + "input", + "pitfalls" + ], + "title": "ErrorGuessingSpec", + "type": "object" + }, + "PairwiseSpec": { + "properties": { + "technique": { + "const": "Pairwise Testing", + "description": "All-pairs covering set of parameter combinations", + "title": "Technique", + "type": "string" + }, + "values": { + "additionalProperties": { + "items": {}, + "type": "array" + }, + "description": "Map of parameter name to list of values to combine", + "title": "Values", + "type": "object" + } + }, + "required": [ + "technique", + "values" + ], + "title": "PairwiseSpec", + "type": "object" + }, + "StateTransitionSpec": { + "properties": { + "events": { + "description": "Possible events", + "items": { + "type": "string" + }, + "title": "Events", + "type": "array" + }, + "states": { + "description": "Possible states", + "items": { + "type": "string" + }, + "title": "States", + "type": "array" + }, + "technique": { + "const": "State Transition", + "description": "State-event transitions; one test case per transition", + "title": "Technique", + "type": "string" + }, + "transitions": { + "description": "Transitions, each {'state': s, 'event': e, 'next': n}", + "items": { + "additionalProperties": true, + "type": "object" + }, + "title": "Transitions", + "type": "array" + } + }, + "required": [ + "technique", + "states", + "events" + ], + "title": "StateTransitionSpec", + "type": "object" + }, + "UseCaseSpec": { + "properties": { + "expected": { + "description": "Expected outcomes per step (parallel to steps)", + "items": { + "type": "string" + }, + "title": "Expected", + "type": "array" + }, + "name": { + "description": "Use case name", + "title": "Name", + "type": "string" + }, + "steps": { + "description": "Ordered steps of the use case", + "items": { + "type": "string" + }, + "title": "Steps", + "type": "array" + }, + "technique": { + "const": "Use Case Testing", + "description": "End-to-end use case steps; one test case per step", + "title": "Technique", + "type": "string" + } + }, + "required": [ + "technique", + "name", + "steps" + ], + "title": "UseCaseSpec", + "type": "object" + } +} - added
Input schema / properties / inputAdded value: +{ + "discriminator": { + "mapping": { + "Boundary Value Analysis": "#/$defs/BoundaryValueSpec", + "Decision Table": "#/$defs/DecisionTableSpec", + "Equivalence Partitioning": "#/$defs/EquivalenceSpec", + "Error Guessing": "#/$defs/ErrorGuessingSpec", + "Pairwise Testing": "#/$defs/PairwiseSpec", + "State Transition": "#/$defs/StateTransitionSpec", + "Use Case Testing": "#/$defs/UseCaseSpec" + }, + "propertyName": "technique" + }, + "oneOf": [ + { + "$ref": "#/$defs/BoundaryValueSpec" + }, + { + "$ref": "#/$defs/EquivalenceSpec" + }, + { + "$ref": "#/$defs/DecisionTableSpec" + }, + { + "$ref": "#/$defs/PairwiseSpec" + }, + { + "$ref": "#/$defs/StateTransitionSpec" + }, + { + "$ref": "#/$defs/UseCaseSpec" + }, + { + "$ref": "#/$defs/ErrorGuessingSpec" + } + ], + "title": "Input" +} - removed
Input schema / properties / inputsRemoved value: -{ - "additionalProperties": true, - "title": "Inputs", - "type": "object" -} - removed
Input schema / properties / techniqueRemoved value: -{ - "title": "Technique", - "type": "string" -} - changed
Input schema / requiredPrevious value: -[ - "technique", - "inputs" -]New value: +[ + "input" +]
- Added
generate_test_data - Removed
generate_with_property
8 tool updates
v0.1.0- First observed
advise_technique - First observed
catalog_heuristics - First observed
catalog_techniques - First observed
checklist_for - First observed
generate_boundary_cases - First observed
generate_random - First observed
generate_test_cases - First observed
generate_with_property
TDQS
Scored across 6 tools
generate_test_cases and generate_test_data are the most confusable pair, but their descriptions explicitly delineate them (technique-driven cases vs raw values). The catalog_* pair and the advise/checklist pair are distinct in purpose, though advise_technique and checklist_for both operate on a described context, which creates mild overlap.
Five of six tools follow a clean verb_noun pattern (generate_test_cases, generate_test_data, advise_technique, catalog_heuristics, catalog_techniques). checklist_for breaks the pattern with a noun+preposition form, but it is still readable and clearly named.
Six tools is well within the ideal 3-15 range and each has a clear, non-redundant role in the testing workflow. No tool feels padded or superfluous.
The surface covers generation (cases and data), technique/heuristic catalogs, advisory, and checklists, forming a coherent lifecycle for a test-assistant domain. Minor gaps exist (e.g., no export/format or test-execution helper), but agents can work around them.
Maintenance
Related MCP Connectors
An MCP server that provides access to Testiny projects, test cases and test runs
Official MCP server for Qase — manage test cases, runs, suites, defects via AI tools.
MCP server for Support & Service Management
MCP server for building and testing AI agents with multi-model experimentation and insights.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceThis MCP server provides a tool to generate manual test cases in Markdown or CSV format from documentation files and custom rules. It supports text and PDF inputs and can leverage LLM sampling to automate the creation of detailed test scenarios.-
- AlicenseCqualityCmaintenanceMCP server for TestNeo quality workflows, enabling test generation, execution, and analysis through MCP-compatible IDE clients.486 npmGPL 3.0
- AlicenseNot gradedqualityDmaintenanceAn MCP server that automates Playwright-based UI and API testing, supporting test case generation from requirements or API specs, and execution with detailed reports.5 npm1MIT
- AlicenseBqualityBmaintenanceAn MCP server for TestRail that prepares everything needed to generate test cases from Jira tickets, Confluence pages, or free-form specs and pushes them back to TestRail.312MIT