Skip to main content
Glama

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)

  1. Add Rowsmith to Claude Desktop, Cursor or another MCP client:

    {"mcpServers":{"rowsmith":{"command":"npx","args":["-y","rowsmith-mcp"]}}}
  2. Ask: "Generate 20 orders with a fixed seed as CSV"

  3. 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

generate_test_data

columns (1-50) or schema (a JSON Schema object, or {openapi, component}), optional rows (1-500), seed, format (csv, json, sql), table, output_path, overwrite, chaos

list_column_types

the supported column types and their options

invalid_values

invalid-on-purpose TEST DATA values with the reason each is invalid: kind (email, card, address, unicode, iban, ssn, all), count, seed, fields, chaos

sandbox_create (listed only when the service advertises the sandbox)

create a payment sandbox (TEST DATA; deleted 1 hour after creation): optional seed

sandbox_payments (listed only when the service advertises the sandbox)

sandbox_id, action (charge, refund, list, get, reset), amount, currency, card, charge, reference, limit, fields, chaos

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 test

with 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 tools
generate_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoNumber of rows, 1 to 500 (default 100)
seedNoSeed; the same schema and seed give identical output for the same generator version (default 1)
chaosNoDeliberate misbehaviour for testing error handling
tableNoTable name, used in SQL output (default data)
formatNoOutput format (default csv)
schemaNoInstead of columns: a JSON Schema object, or {openapi: <document>, component: <name>}
columnsNoThe table's columns, 1 to 50
overwriteNoReplace output_path if it already exists (default false)
output_pathNoWrite 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoDefault all
seedNo
chaosNoDeliberate misbehaviour for testing error handling
countNoDefault 10
fieldsNoComma-separated fields to keep, e.g. value,reason

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/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. "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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
seedNo

TDQS

A4.1/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 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.

Conciseness5/5

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.

Completeness4/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 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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cardNoCharge: a card number from Stripe's published testing list, e.g. 4242424242424242; decline numbers: invalid_values kind card
chaosNoDeliberate misbehaviour for testing error handling
limitNo
actionYes
amountNoMinor units; charge, or partial refund
chargeNoCharge id, for refund and get
fieldsNoComma-separated fields to keep, e.g. value,reason
currencyNo
referenceNo
sandbox_idYes

TDQS

A4.1/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 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.4.0
    • First observedgenerate_test_data
    • First observedinvalid_values
    • First observedlist_column_types
    • First observedsandbox_create
    • First observedsandbox_payments

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness4/5

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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Generates 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.
    2
    17 npm
    MIT