rowsmith-mcp
Provides a composite GitHub Action to generate fixture files in CI from a schema, with optional seed, rows, and format inputs, and reports the generator version used.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@rowsmith-mcpGenerate 20 fake orders as CSV with seed 42"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
rowsmith-mcp
An MCP server for Rowsmith: realistic fake test data (CSV, JSON or SQL INSERTs) generated from a table schema. It is a thin client of the public Rowsmith API, free and rate-limited.
Quickstart (60 seconds)
Add Rowsmith to Claude Desktop, Cursor or another MCP client:
{"mcpServers":{"rowsmith":{"command":"npx","args":["-y","rowsmith-mcp"]}}}Ask: "Generate 20 orders with a fixed seed as CSV"
Or call the API directly:
curl -s https://testdata-api.re-jam620.workers.dev/v1/generate -H 'content-type: application/json' \ -d '{"rows":20,"seed":42,"format":"csv","columns":[{"name":"order_id","type":"sequence","prefix":"ord_","pad":4},{"name":"email","type":"email"},{"name":"total_usd","type":"decimal","min":1,"max":500}]}' curl -s 'https://testdata-api.re-jam620.workers.dev/v1/invalid?kind=email&count=5&seed=42' ID=$(curl -s https://testdata-api.re-jam620.workers.dev/v1/sandbox -H 'content-type: application/json' -d '{"seed":42}' | sed -E 's/.*"id":"([^"]+)".*/\1/') curl -s https://testdata-api.re-jam620.workers.dev/v1/sandbox/$ID/charges -H 'content-type: application/json' \ -d '{"amount":1999,"currency":"usd","card":"4242424242424242"}'Python's standard-library urllib is blocked by Cloudflare before it reaches the API (403, error code 1010) when it sends its default User-Agent. Set your own, e.g.
User-Agent: my-tests/1.0. In our tests on 2026-10-18, requests, httpx, aiohttp, Node and curl worked with their defaults.
Free, rate-limited, no account, no API key.
The same schema and seed give byte-identical output for the same generator version.
An invalid-values catalogue with the reason each value is invalid.
A payment sandbox that never moves money: a sandbox and everything in it is deleted 1 hour after it is created. It accepts only card numbers from Stripe's published testing list and stores no free text you send.
Listed on the official MCP Registry as io.github.meiorz/rowsmith.
Related MCP server: mock-mcp
What the data is
No real person's data is used as input, and no record is derived from a real person. Emails, phone numbers, card numbers, SSN-shaped and IBAN-shaped values come only from reserved or invalid ranges.
The same schema and seed give byte-identical output for the same generator version (sent as
x-generator-version), so fixtures are reproducible.Send schemas only. Never send real data.
Tools
Tool | What it does |
|
|
| the supported column types and their options |
| invalid-on-purpose TEST DATA values with the reason each is invalid: |
| create a payment sandbox (TEST DATA; deleted 1 hour after creation): optional |
|
|
At startup the server reads /pricing.json once (30 s timeout, cached for the process) and lists the
two sandbox tools only if the service advertises /v1/sandbox there. If that request fails, the sandbox tools stay
hidden and the server's instructions and list_column_types output say why; restart to check again. Tool-definition size, measured as characters of
the tools/list JSON (names, titles, descriptions and input schemas) divided by 4: 3 tools, about 1241 tokens
(4962 characters); 5 tools, about 1849 tokens (7395 characters). Measure with node scripts/tool-tokens.js.
For more than about 50 rows, pass output_path: the server writes the file and returns a summary (rows, bytes,
sha256, the header line) instead of putting the data in the model's context. Files can only be written inside the
write root: the server's working directory by default, or ROWSMITH_OUT_DIR when set (which moves or narrows it).
Paths with .. segments or outside the root are refused, and an existing file is replaced only with
overwrite: true.
Instead of columns, generate_test_data takes schema: a JSON Schema object (type object with properties), such
as a Pydantic (model_json_schema()) or Zod export, or an OpenAPI component as {"openapi": <document>, "component": "Order"}. The service maps it to columns and names the properties it could not map (arrays, patterns
and other unsupported forms) at the end of the result; nothing is guessed. Before sending, the server removes
example, examples, default, const and x-* keys from the schema, so their values do not leave your machine
and are not in the reproduce curl; the service ignores them too. For an OpenAPI component, only the named component and the schemas it
references are sent. The mapping is described at
https://testdata-api.re-jam620.workers.dev/openapi.json.
The tools form a chain, and each description says which comes next: generate_test_data first (with
list_column_types for a type's options), then invalid_values for values your code should reject, then
sandbox_create and sandbox_payments for a payment flow when they are listed.
Every generate_test_data result ends with a reproduce line: the exact curl, with the seed the service used and
the generator version pinned, that regenerates the same bytes. Chaos options are left out of it. A pinned version is served as long as the service runs; a retired version answers 409. A version's output is not changed in place: a golden test checks its bytes on every build. Above the reproduce line, a result that returns
the data carries Output sha256 <hex>, the sha256 of the data's bytes (the service's X-Output-SHA256); with
output_path the summary's sha256 line is that value. Pin it in a golden manifest to detect drift (format:
https://testdata-api.re-jam620.workers.dev/llms.txt).
chaos makes the service misbehave on purpose, to test error handling: fail (e.g. "429@0.2"; also 500, 503),
latency_ms (at most 3000), empty_result, attempt. Outcomes are fixed by seed and attempt.
The payment sandbox is a fake card processor: it moves no money and contacts no payment provider. It accepts only
card numbers from Stripe's published testing list (4242424242424242 succeeds; invalid_values with kind card
lists the declining numbers and their codes), and refuses any other card-like number in any field. Every object is
marked "livemode": false, "sandbox": true and TEST DATA.
Column types: uuid, sequence, integer, decimal, boolean, enum, date, datetime, first_name,
last_name, full_name, email, phone, test_card, ssn_invalid, iban_invalid, text.
Use
{
"mcpServers": {
"rowsmith": {
"command": "npx",
"args": ["-y", "rowsmith-mcp"],
"env": { "ROWSMITH_OUT_DIR": "/path/to/your/project/fixtures" }
}
}
}ROWSMITH_OUT_DIR is optional. Without it, files can only be written inside the directory the server runs in; set
it to choose a specific folder, such as your project's fixtures directory.
Example call:
{ "rows": 3, "seed": 42, "format": "csv",
"columns": [ { "name": "order_id", "type": "sequence", "prefix": "ord_", "pad": 4 },
{ "name": "email", "type": "email" },
{ "name": "total_usd", "type": "decimal", "min": 1, "max": 500 } ] }GitHub Action: fixtures in CI
fixtures/action.yml is a composite action that writes a fixture file with one call to /v1/generate. Inputs:
schema (path to a JSON file holding a columns array or a full request), out (the file to write), and optional
seed, rows and format (csv, json or sql), which replace the file's values when given. On any answer other
than 200 the step fails with the service's error and its next step. Nothing is cached, and no key is needed.
Use the tag meiorz/rowsmith-mcp/fixtures@v0.2.3 (or @main to try the latest).
name: fixtures
on: [push]
jobs:
fixtures:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: meiorz/rowsmith-mcp/fixtures@v0.2.3
with:
schema: test/fixtures/orders.schema.json
seed: "42"
rows: "200"
format: csv
out: test/fixtures/orders.csv
- run: npm testwith test/fixtures/orders.schema.json:
[{ "name": "order_id", "type": "sequence", "prefix": "ord_", "pad": 4 },
{ "name": "email", "type": "email" },
{ "name": "total_usd", "type": "decimal", "min": 1, "max": 500 }]The same schema and seed give byte-identical output for the same generator version, so the file is the same on
every run until the generator version changes. The step's generator-version output reports the version used.
Each run counts against the daily limit of the runner's address. GitHub-hosted runners share addresses, so the limit can be reached by other users' runs.
Optional extra-header (since v0.2.3; not in v0.2.2) adds one request header, as Name: value in printable ASCII. It
is empty by default, which sends no extra header.
.github/workflows/canary.yml is our hourly uptime check: it sends the fixed canary request (the golden request,
exactly these body bytes) with x-rowsmith-canary: 1 and fails unless the answer's sha256 is
50db558e2e8c54353ac38a3125deb91642895db302eec334afeec2406537f821. The service treats a call as its canary only with
that header and that exact body; any other call with the header is an ordinary call. The workflow also probes
Python's urllib with its default User-Agent (an ordinary call, without the canary header) and writes the result
(blocked or passing) to the job summary, without failing the job.
Limits and terms
Up to 500 rows and 50 columns per call, with daily limits per caller; over a limit the tool returns the service's
429 message with the retry time. Calls time out after 30 s. The server holds no keys and writes nothing unless you
pass output_path. Calls go to https://testdata-api.re-jam620.workers.dev (override with ROWSMITH_URL).
The MIT licence covers this wrapper's code only. Use of the Rowsmith service stays under its terms of use, which bind whoever runs the agent.
Terms of use: https://testdata-api.re-jam620.workers.dev/terms · Data notice: https://testdata-api.re-jam620.workers.dev/privacy · Published by meiorz · Contact: business@meiorz.tech
Privacy, data and deletion requests: business@meiorz.tech only, never in a public issue.
Available Tools
5 toolsgenerate_test_dataGenerate test dataA
Generate realistic fake test data (CSV, JSON or SQL INSERTs) from a table schema. Use it first, when you need rows for fixtures, seed data or tests (list_column_types gives each type's options). Or pass schema (JSON Schema, e.g. a Pydantic or Zod export, or an OpenAPI component) instead of columns; unmappable fields are named. Next: invalid_values for values your code should reject, then sandbox_create and sandbox_payments to test a payment flow. Free and rate-limited: up to 500 rows and 50 columns per call. No real person's data is used as input and no record is derived from a real person; emails, phones, card numbers, SSN-shaped and IBAN-shaped values come only from reserved or invalid ranges. The same schema and seed give byte-identical output for the same generator version (sent as x-generator-version). For more than about 50 rows, pass output_path to write a file instead of returning the data. The result gives the output's sha256 and ends with a curl that regenerates the same bytes. Send schemas only, never real data.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | No | Number of rows, 1 to 500 (default 100) | |
| seed | No | Seed; the same schema and seed give identical output for the same generator version (default 1) | |
| chaos | No | Deliberate misbehaviour for testing error handling | |
| table | No | Table name, used in SQL output (default data) | |
| format | No | Output format (default csv) | |
| schema | No | Instead of columns: a JSON Schema object, or {openapi: <document>, component: <name>} | |
| columns | No | The table's columns, 1 to 50 | |
| overwrite | No | Replace output_path if it already exists (default false) | |
| output_path | No | Write the data to this file instead of returning it (use for more than about 50 rows). Must be inside the working directory, or inside ROWSMITH_OUT_DIR when set; no '..' segments |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden and does so richly: free with rate limits (500 rows/50 columns per call), determinism guarantee ('same schema and seed give byte-identical output for the same generator version'), the x-generator-version header, and the output_path threshold for large results. The data-provenance constraint ('Send schemas only, never real data') is exactly the kind of safety context an agent cannot get from the 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?
Front-loads purpose and the primary usage directive, then layers determinism, safety and output guidance. Dense but nearly every sentence carries a non-obvious fact; only the closing curl/sha256 sentence feels like it could be trimmed since it describes result shape.
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?
A 9-parameter tool with nested objects, no annotations and no output schema — the description compensates on every front: safety profile, rate limits, determinism, file-vs-return behavior, and even the shape of the result (sha256 + regenerating curl). An agent has everything needed to call it correctly on the first attempt.
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 description coverage is 100%, so baseline is 3. The description still adds meaning: it explains when to prefer schema over columns (Pydantic/Zod export, OpenAPI component), notes unmappable fields are named, and gives the practical threshold for output_path ('more than about 50 rows'). It stops short of explaining the chaos object or the columns type vocabulary, which stays in the schema.
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+resource with output formats ('Generate realistic fake test data (CSV, JSON or SQL INSERTs) from a table schema'). It differentiates from siblings by name — list_column_types for type options, invalid_values and the sandbox_* tools for downstream steps — so an agent can route without opening schemas.
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?
Explicit when-to-use ('Use it first, when you need rows for fixtures, seed data or tests') plus a named sequencing of alternatives: list_column_types for options, then invalid_values, then sandbox_create/sandbox_payments. Also gives an alternative input mode (schema instead of columns), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invalid_valuesInvalid test valuesA
Deliberately invalid TEST DATA values (malformed emails, declining or Luhn-invalid card numbers, malformed addresses, Unicode edge cases, invalid IBAN and SSN shapes), each with the reason it is invalid. Same seed, same output for the same catalogue version. Use it after generate_test_data, to test that your validation rejects bad input. Next: sandbox_create, then sandbox_payments, to test a payment flow.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Default all | |
| seed | No | ||
| chaos | No | Deliberate misbehaviour for testing error handling | |
| count | No | Default 10 | |
| fields | No | Comma-separated fields to keep, e.g. value,reason |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it does disclose two important traits beyond the schema: determinism ('Same seed, same output for the same catalogue version') and the output shape ('each with the reason it is invalid'). It does not state that the call is side-effect-free or whether any auth is needed, which leaves a small gap for a generation tool.
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, all front-loaded: purpose first, then the reason field, then determinism, then placement in the workflow. No sentence repeats the name or restates the 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?
With 5 parameters including a nested chaos object and no output schema, the description supplies purpose, determinism, and workflow position, which is most of what an agent needs. The chaos behaviour (failure injection, latency, empty results) is only discoverable in the schema, so the description is not fully self-sufficient for error-handling tests.
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 80%, so the baseline is 3; the description goes beyond it by naming the concrete value families behind the kind enum (email, card, address, unicode, iban, ssn) and by explaining that 'reason' accompanies each value via the fields filter example. The nested chaos object and its injection semantics are left entirely to the schema.
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 resource and a distinguishing modifier: 'Deliberately invalid TEST DATA values', enumerating the categories (malformed emails, Luhn-invalid cards, Unicode edge cases, IBAN/SSN shapes). This clearly separates it from the sibling generate_test_data, which produces valid data.
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 sequencing: 'Use it after generate_test_data, to test that your validation rejects bad input. Next: sandbox_create, then sandbox_payments, to test a payment flow.' Both the triggering condition and the downstream alternatives are named, so routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_column_typesList column typesA
List the supported column types and the options each accepts. Use it before generate_test_data when you need a type's options.
| Name | Required | Description | Default |
|---|---|---|---|
No 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. "List" implies a read-only lookup with no side effects, and it says the result contains types and their accepted options, but there is no disclosure of permissions, pagination, or return format. Adequate for a zero-argument read tool, yet thin on behavioral detail.
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?
Two short sentences, nothing redundant: the first says what is returned, the second says when to call it. Front-loaded and fully earned.
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 lookup with no output schema, the description tells the agent both the content (types and their options) and the calling context (before generate_test_data). Slightly more detail on the shape of the returned options would close the remaining gap, but nothing essential 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 takes zero parameters, so per the rubric this sits at baseline 4. The description does not need to explain argument semantics and adds no contradicting information.
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 ("List the supported column types and the options each accepts") and explicitly relates itself to the sibling generate_test_data, so an agent can separate this lookup tool from data-generation tools. It does not, however, clarify the domain scope of "column types" beyond the sibling reference.
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 an explicit trigger — "Use it before generate_test_data when you need a type's options" — naming both the alternative and the condition that selects this tool. No when-not guidance or mention of other siblings (invalid_values, sandbox_*), but the routing intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_createCreate payment sandboxA
Create a fake card-processor sandbox (TEST DATA, no money, no payment provider). Returns its sbx_ id. Deleted 1 hour after creation. Use it to start a payment test; next, call sandbox_payments with the returned id.
| Name | Required | Description | Default |
|---|---|---|---|
| seed | No |
TDQS
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 that the data is fake/no real payment provider, that it returns an sbx_ id, and crucially a lifecycle constraint ('Deleted 1 hour after creation'). Gaps remain around authorization requirements and whether the call is idempotent or rate-limited.
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?
Four short clauses, all front-loaded: what it creates, its fake nature, the returned id, the 1-hour TTL, and the next step. Zero 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?
No output schema exists, but the description names the return value (sbx_ id) and the TTL, covering what the agent needs to chain calls. The only meaningful omission is any explanation of the 'seed' parameter, which is left undocumented.
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 description coverage is 0% for the single 'seed' parameter, and the description never mentions it, so nothing explains what a seed controls (e.g., deterministic card/test data generation). The description fails to 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?
States a specific verb+resource ('Create a fake card-processor sandbox') and immediately frames its scope vs. real infrastructure ('TEST DATA, no money, no payment provider'). An agent can distinguish it from generate_test_data or sandbox_payments without opening any 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 clear sequencing: 'Use it to start a payment test; next, call sandbox_payments with the returned id,' which routes the agent to the correct sibling. It does not, however, state when NOT to use this tool or contrast it with the other siblings (generate_test_data, invalid_values).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sandbox_paymentsUse payment sandboxA
Charge, refund, list, get or reset in a payment sandbox. Accepts only card numbers from Stripe's published testing list; any other card-like number is refused. Declines return code and decline_code. Same seed and call order, same objects for the same sandbox version. Use it after sandbox_create, with that sandbox's id.
| Name | Required | Description | Default |
|---|---|---|---|
| card | No | Charge: a card number from Stripe's published testing list, e.g. 4242424242424242; decline numbers: invalid_values kind card | |
| chaos | No | Deliberate misbehaviour for testing error handling | |
| limit | No | ||
| action | Yes | ||
| amount | No | Minor units; charge, or partial refund | |
| charge | No | Charge id, for refund and get | |
| fields | No | Comma-separated fields to keep, e.g. value,reason | |
| currency | No | ||
| reference | No | ||
| sandbox_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and delivers unusually strong content: card-number acceptance restricted to Stripe's published test list, declines exposing both code and decline_code, and deterministic replay given the same seed and call order. The notable gap is that 'reset' is a clearly destructive operation and nothing warns about what it wipes or that it is irreversible.
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?
Five short sentences, front-loaded with the operation set and then layered with constraints in descending order of importance. Every sentence carries distinct information; none restates the title or the 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 10-parameter tool with a nested chaos object, no annotations, and no output schema, the description covers behavior and sequencing well but omits the chaos/testing-failure surface and any notion of result shape or pagination for list. An agent can invoke the common paths correctly but would be guessing on the testing and query-modifier parameters.
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?
At 50% schema coverage across 10 parameters, the description compensates partially: it explains the semantics of card and sandbox_id and ties each verb to the action enum. It says nothing about chaos (a nested object of deliberate misbehaviour), limit, fields, currency, reference, or amount, so several parameters remain documented only, or not at all, in the schema.
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 opening clause names the resource (payment sandbox) and enumerates every supported operation (charge, refund, list, get, reset), which maps directly onto the action enum. It is immediately distinguishable from siblings like sandbox_create and invalid_values, which are not sandbox-payment operations.
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?
It gives an explicit prerequisite and ordering rule: 'Use it after sandbox_create, with that sandbox's id.' That is concrete routing guidance. It stops short of stating when NOT to use it (e.g., against live payments, or when invalid_values / generate_test_data is the right sibling), so it is clear context without exclusions.
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
v0.4.0- First observed
generate_test_data - First observed
invalid_values - First observed
list_column_types - First observed
sandbox_create - First observed
sandbox_payments
TDQS
Scored across 5 tools
Each tool occupies a distinct stage of the workflow: introspection (list_column_types), valid data generation (generate_test_data), invalid-case generation (invalid_values), sandbox provisioning (sandbox_create), and payment operations (sandbox_payments). The only mild overlap is between generate_test_data and invalid_values, since both emit fabricated records, but the names and descriptions make the valid/invalid split clear. sandbox_payments bundles five actions (charge, refund, list, get, reset) into one tool, which is a slight boundary blur but not a cross-tool ambiguity.
All names use snake_case, but the ordering convention is mixed: most tools lead with a verb (list_column_types, generate_test_data), while the sandbox pair leads with a noun (sandbox_create, sandbox_payments) and invalid_values has no verb at all. It remains readable, but the pattern is not predictable enough to guess a tool name from its action.
Five tools is a tight, well-scoped surface for a test-data and payment-sandbox server, and each tool corresponds to a genuine step in the described workflow. Nothing feels padded or redundant.
The chain from schema inspection through data generation, invalid-value testing, sandbox creation, and payment simulation is essentially covered, including the documented 'next' hints. Minor gaps exist around sandbox lifecycle management (no explicit delete or list-sandboxes tool; cleanup is only implicit via the 1-hour expiry) and there is no standalone way to validate an arbitrary schema.
Related MCP Connectors
Generate realistic relational test data — 156 field types, 22 locales, JSON/CSV/SQL, free previews.
Format-true synthetic test data for 90 countries — IBANs, SWIFT/BIC, IDs, cards, all certified.
Generate realistic, FK-consistent synthetic test data for your databases from your AI assistant.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Related MCP Servers
- AlicenseAqualityCmaintenanceGenerate realistic relational test data with 156 field types, 22 locales, and foreign key integrity. One API call seeds your entire database.51MIT
- AlicenseAqualityCmaintenanceGenerates schema-compliant mock data from OpenAPI JSON Schema definitions using AI, enabling seamless testing without manual fixtures.619 npm9MIT
- FlicenseNot gradedqualityDmaintenanceGenerates realistic, context-aware synthetic data for AI agents to populate databases, mock APIs, and create test scenarios without exposing real PII.5 npm3-
- AlicenseAqualityDmaintenanceGenerates realistic, referentially-coherent test data (SQL INSERTs, JSON, or CSV) from your database schema, resolving foreign keys and respecting constraints. Paste CREATE TABLE DDL or a JSON schema and get ready-to-run seed data with valid relationships.217 npmMIT