MCP server for data
An MCP server for data: let AI agents publish tables you can open
The rows.page MCP server gives AI agents 6 tools to publish tables of up to 16 MB inline or 100 MB from a public URL, free with no signup, at https://rows.page/mcp. You get a link where you can filter, run SQL and compare versions.
No file handy? Open CO2 emissions by country and year (50k rows, 14 MB).
What does the rows.page MCP server do?
Model Context Protocol (MCP) is an open standard that lets AI assistants call external tools. The rows.page server runs at https://rows.page/mcp over Streamable HTTP (JSON-RPC over POST) and is listed in the official MCP registry as page.rows/rows.
When your agent calls push with CSV, TSV, JSON or JSONL text, or with a public file URL, rows.page returns a https://rows.page/<id> link. The link opens the data in a browser table where you can filter, sort, run DuckDB SQL against the data table and check each column's histogram and distinct count. With pin_finding, the agent saves the view it found (a filter, sort, column list or SQL query) on the dataset, so you open straight to it.
Which tools does the rows.page MCP server have?
The server has six tools. Most work without an account, while the ones that change a dataset need its owner token or the account that owns it.
| Tool | What it does | Needs an API key |
|---|---|---|
push | Publishes CSV, TSV, JSON or JSONL sent inline (up to 16 MB), or a CSV, TSV, JSON, JSONL or Parquet file from a public url, and returns the link | No |
pin_finding | Saves a view (filter, sort, columns or SQL) on a dataset you own | No, but needs the rpt_ owner token or the owning account |
get_dataset | Returns a dataset's details, its last 20 versions and 20 preview rows | No, except for private datasets |
list_datasets | Lists the datasets on your account | Yes, an rpk_ key |
delete_dataset | Deletes a dataset you own | No, but needs the rpt_ owner token or the owning account |
get_limits | Returns your plan and its limits, or the limits without an account | No |
The reply to a new push includes an rpt_ owner token. Your agent needs it later to pin findings, push new versions or delete the dataset.
How to add the MCP server to Claude Code, Claude Desktop and Cursor
For Claude Code, run:
claude mcp add --transport http rows https://rows.page/mcpClaude Desktop connects through the mcp-remote bridge. Add it to claude_desktop_config.json and restart the app:
{"mcpServers": {"rows": {"command": "npx", "args": ["mcp-remote", "https://rows.page/mcp"]}}}For Cursor, add the server URL to mcp.json:
{"mcpServers": {"rows": {"url": "https://rows.page/mcp"}}}This works without an account, and pushed links then expire after 7 days. To push into your account instead, sign in with Google on rows.page (the $0 Free plan works) and create an rpk_ API key, up to 20 per account. Send it as Authorization: Bearer rpk_... or add ?apiKey=rpk_... to the server URL.
How an agent publishes a table, pins a finding and pushes updates
- The agent runs a query or a script, then calls
pushwith the result as CSV or JSONL, or with a publicurlfor files over 16 MB. - It gets back the link, an owner link and the
rpt_token, then callspin_findingwith that token and a query such asSELECT * FROM data WHERE price > 20 ORDER BY __rid. It can also pass up to 20findingswith the push itself. - You open the link on the pinned view and can export it to CSV, JSON, JSONL, Parquet or Markdown (Markdown keeps the first 1,000 rows).
- On the next run, the agent calls
pushwithdatasetandtoken, or with the samekeyname and an API key, to add v2 to the same link. - If the data has not changed, the reply says
unchanged: trueand no new version is added.
When the previous version is 64 MB or less, the dataset page shows a banner like "+N new, N gone, N changed vs vN". Rows are matched on the id_column the agent passes with push, or on a column you pick in the banner.
MCP rate limits, size limits and plans
- 60 requests per minute per IP address. Above that, the server answers HTTP 429.
- Pushes have their own limit of 10 per minute without an API key.
- Inline data: the whole request is capped at 16 MB, and a bigger one gets HTTP 413.
urlpushes: up to 100 MB, fetched by rows.page, and the remote server must respond within 30 seconds.- Without an account: 50 pushes and 1 GB per IP address per UTC day, up to 20 versions per link, and links expire after 7 days.
- Free ($0): 10 hosted datasets that don't expire, last 3 versions visible.
- Pro ($12 per month): 100 datasets, 90 days of versions, private datasets.
- Max ($39 per month): 1,000 datasets, 1 year of versions, private datasets.
MCP pushes stay at 100 MB on every plan. Pro and Max upload bigger files, up to 500 MB and 2 GB, through multipart uploads at POST /api/v1/uploads.
Can the rows.page MCP server read local files?
No. The server runs on rows.page, so it only sees what your agent sends. An agent on your machine, like Claude Code or Cursor, reads the file with its own file tools and sends up to 16 MB inline. For bigger files up to 100 MB, run curl -T data.csv https://rows.page in a terminal.
If you only want an agent to query local files without publishing a link, a local filesystem or SQLite MCP server fits better, though you lose the browser table and the link to send a teammate.
Convert other formats before pushing. rows.page reads CSV, TSV, JSON, JSONL and Parquet, and does not read Excel, XML, YAML, PDF, SQLite, Avro, ORC, fixed-width text or zip files.
rows.page limits and prices
| What | Limit or price |
|---|---|
| Open a file in your browser | Files up to 1.5 GB, $0, no account, nothing uploaded |
| Share a link without an account | $0, files up to 100 MB, link deleted 7 days after creation |
| Free account | $0, 10 datasets kept, last 3 versions |
| Pro | $12/month, 100 datasets, files up to 500 MB, private links |
| Max | $39/month, 1,000 datasets, files up to 2 GB, private links |
Questions
Do I need an account or API key to use the rows.page MCP server?
No. Without an account, your agent can push, read public datasets and check limits, and it can pin findings or delete a dataset with the owner token from the push. Those datasets expire after 7 days. You need an rpk_ API key for list_datasets and to push straight into your account.
Why does the MCP push tool stop at 16 MB?
Inline data travels inside the JSON-RPC request, and rows.page caps that request at 16 MB (16,777,216 bytes), with HTTP 413 above it. For files up to 100 MB, pass a public url to push or run curl -T data.csv https://rows.page. Pro and Max upload up to 500 MB and 2 GB through multipart uploads at POST /api/v1/uploads.
Can the MCP server push Excel .xlsx files?
No. rows.page does not read .xlsx or .xls files, and a pushed Excel file gets "This looks like an Excel or zip file. Export it as CSV and push again." Have your agent convert the sheet to CSV, JSON, JSONL or Parquet first.
How do version diffs work when an agent pushes an update?
When the previous version is 64 MB or less, the dataset page compares the two and shows "+N new, N gone, N changed vs vN". Rows are matched on the id_column passed with the push, or on a column picked in the banner. Without a unique key column, changes show as new and gone.
Can other tools read the data after an agent publishes it?
Yes. A public dataset serves its raw file at https://rows.page/<id>/raw.<ext>, or https://rows.page/<id>/v<n>/raw.<ext> for a fixed version, with access-control-allow-origin: *. GET https://rows.page/api/v1/datasets/<id> returns a JSON preview of up to 200 rows (256 KB).