Connect your AI
Add Typesheet as a connector and your assistant gets somewhere to put messy tabular data that will not accept it until it is clean. It works over the Model Context Protocol, so the same setup covers Claude, ChatGPT, Cursor, Zed, and anything else that speaks MCP. Setup takes about a minute.
1. Add the connector
Point your client at the remote MCP server. There are no API keys to copy or rotate. The first connection opens a browser to sign in to Typesheet once (the same login as the app), then it's live on your behalf.
https://typesheet.com/mcpDesktop & web clients (Claude, ChatGPT, …)
Open your client's connector settings, typically Settings → Connectors → Add custom connector (or MCP servers), and paste the URL above.
Command-line clients
Most CLIs take the remote URL in one command. For Claude Code:
claude mcp add --transport http typesheet https://typesheet.com/mcpCursor, Zed, Continue, and others accept a remote MCP URL the same way. Point them at https://typesheet.com/mcp and the tools auto-register on connection.
2. Send it your data
Paste a table, attach a CSV, or point at a PDF price list, then say where it should land:
Put these into my New hires sheet.The assistant maps the columns, imports the rows, and reports exactly which cells failed and why. It fixes the ones it can defend from the source, and gives you a review URL for the judgment calls. When you ask for the data back, it can only hand you records that passed.
The tools
list_typesheets(): your typed schemas, their fields, and their import links.create_typesheet(name, fields, description?): define a new one. Fields are typed (text, number, date, email, url, boolean, enum) with required and unique rules.import_rows(typesheet, columns, rows, source_name?): the intake. Columns are matched by meaning, every cell is coerced and validated, and the response is an issue report plus a review URL.set_cells(import_id, cells): fix specific cells and re-validate. Corrections to rejected values are remembered, so the next file with the same mistake arrives already fixed.drop_rows(import_id, rows): drop junk lines, test rows, or subtotals out of validation and the export.export_records(import_id): the clean, typed records. Refuses while any issue remains.
Why the refusal matters
An assistant can always claim data is clean. It cannot make export_records return while a cell is still invalid: the check runs on our server, in the same deterministic engine the review grid runs, and it does not consult the model. That is the guarantee you are buying, and it is the reason this is worth a tool call rather than a prompt. The longer version of this argument, including what you can audit after a model has edited a sheet, is on its own page.
The tools are also deliberately write-mostly. An import link and an import report tell you about the rows you just sent; nothing exposes what the sheet already holds.
Building your own agent
If you are writing the agent yourself, or the sender should not need an account at all, use an import link instead of a connection. Turn one on from a sheet's Share menu; the unguessable key in the URL is the credential, it only writes, and you can rotate it any time.
curl -X POST https://typesheet.com/api/import/<key>/imports \
-H "Content-Type: application/json" \
-d '{
"source_name": "vendor-prices.csv",
"columns": ["SKU", "Product", "Unit price"],
"rows": [["NW-1001", "Wool overcoat", "$480.00"]]
}'The response carries the issue report and a per-submission edit token. Fix cells with a PATCH to the same import; finalizing returns 409 while anything is still invalid. The same Share menu will also copy a written brief you can paste into any assistant, so a sender's AI can do the whole exchange without ever seeing these docs.
Limits
- Crawl
/llms.txtfor a map of useful URLs. - Imports are metered per plan (rows per import and imports per month). See pricing.
429responses includeRetry-After; respect it.