MCP server for Rowsmith: fake test data (CSV, JSON, SQL) from a schema, invalid values with reasons, and a payment sandbox that never moves money. Free, no key.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Documented (README)
- !Install pipes a remote script into a shell (curl | sh)
claude mcp add rowsmith-mcp -- uvx rowsmith-mcp{
"mcpServers": {
"rowsmith-mcp": {
"command": "uvx",
"args": ["rowsmith-mcp"]
}
}
}Resumen de MCP Servers
# rowsmith-mcp
An MCP server for **Rowsmith**: 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:
```json
{"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:
```sh
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.
## 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`; or `tables` instead, for related tables in one call (see below) |
| `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 1370 tokens
(5477 characters); 5 tools, about 1978 tokens (7910 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
```json
{
"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:
```json
{ "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 } ] }
```
Related tables in one call: pass `tables` instead of `columns` (it calls `POST /v1/dataset`). A column
`{"name": "customer_id", "type": "ref", "table": "customers", "column": "id"}` takes its values from the primary key
generated for an earlier table in the same call, so the keys agree; refs resolve only inside the request and nothing
is stored. `format` is `sql` (CREATE TABLE and INSERTs written in the dialect common to PostgreSQL and SQLite 3.23 or later; the tests execute it in SQLite, not in PostgreSQL) or `json`; at most
10 tables and 500 rows in total. The result adds `Rows sha256 per table`, the same for the SQL and the JSON form of
one request, and the reproduce curl pins the dataset version too. Example call (the tool's arguments):
```json
{"seed":42,"format":"sql","tables":[{"name":"customers","rows":3,"columns":[{"name":"id","type":"uuid"},{"name":"email","type":"email"}]},{"name":"orders","rows":5,"columns":[{"name":"id","type":"sequence"},{"name":"customer_id","type":"ref","table":"customers","column":"id"},{"name":"total","type":"decimal","min":5,"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).
```yaml
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`:
```json
[{ "name": "order_id", "type": "sequence", "prefix": "ord_", "pad": 4 },
{ "name": "email", "type": "email" },
{ "name": "total_usd", "type": "decimLo que la gente pregunta sobre rowsmith-mcp
¿Qué es meiorz/rowsmith-mcp?
+
meiorz/rowsmith-mcp es mcp servers para el ecosistema de Claude AI. MCP server for Rowsmith: fake test data (CSV, JSON, SQL) from a schema, invalid values with reasons, and a payment sandbox that never moves money. Free, no key. Tiene 0 estrellas en GitHub y su última actualización registrada es del 2026-10-19.
¿Cómo se instala rowsmith-mcp?
+
Puedes instalar rowsmith-mcp clonando el repositorio (https://github.com/meiorz/rowsmith-mcp) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar meiorz/rowsmith-mcp?
+
Nuestro agente de seguridad ha analizado meiorz/rowsmith-mcp y le ha asignado un Trust Score de 79/100 (tier: Trusted). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene meiorz/rowsmith-mcp?
+
meiorz/rowsmith-mcp es mantenido por meiorz. La última actividad registrada en GitHub es del 2026-10-19, con 0 issues abiertos.
¿Hay alternativas a rowsmith-mcp?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega rowsmith-mcp en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/meiorz-rowsmith-mcp)<a href="https://claudewave.com/repo/meiorz-rowsmith-mcp"><img src="https://claudewave.com/api/badge/meiorz-rowsmith-mcp" alt="Featured on ClaudeWave: meiorz/rowsmith-mcp" width="320" height="64" /></a>Más MCP Servers
Reverse engineer anything with agents, from app behavior down to native binaries.
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ A Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev