# Typesheet > Typesheet is typed data intake. A sheet is a contract about what one row must be: named fields with real types (text, number, date, email, url, boolean, enum), plus required and unique rules. Messy spreadsheets thrown at it (by the owner, by anyone holding an import link, or by an agent) come back mapped, coerced, and validated cell by cell, and nothing exports until every cell passes. It is not a spreadsheet tool: there are no formulas and no views, and the data's home stays wherever it already is. ## Start here - [Full reference](https://typesheet.com/llms-full.txt): everything below, expanded, in one Markdown file. Fetch this instead of crawling the pages. - [Docs](https://typesheet.com/docs): what a sheet is and how intake works - [Connect your AI](https://typesheet.com/docs/connect): the MCP server and the import-link API - [For AI agents](https://typesheet.com/agents): why an assistant handling tabular data needs a validator it does not control, and what this one enforces - [Pricing](https://typesheet.com/pricing): plans, and what an import counts as - [Templates](https://typesheet.com/templates): ready-made typed sheets, each one creatable in a click - [Fixes](https://typesheet.com/fixes): why spreadsheets break on the way in (dates rewritten by Excel, SKUs in scientific notation, dropped leading zeros, decimal commas read as thousands separators, accented characters turned to mojibake, dates that do not exist, accounting negatives in parentheses, duplicate codes, prices that will not sum) and what to do about each, tool or no tool. Every one of these is reproduced in full in the reference file above. - [Compare](https://typesheet.com/compare): Typesheet against embedded CSV importers (Flatfile, OneSchema, Dromo, nuvo, CSVBox) and against document parsers, including where each of those is the better choice - [Security](https://typesheet.com/security): where data lives, and what we do not claim - [Sample sheet](https://typesheet.com/sheets/sample): the live review grid, no account ## Connect over MCP (the primary integration) `POST https://typesheet.com/mcp`: Model Context Protocol server (JSON-RPC 2.0, OAuth). The first connection opens a browser to sign in; after that, tools run as the signed-in user. ```bash claude mcp add --transport http typesheet https://typesheet.com/mcp ``` Tools: - `list_typesheets`: the user's typed schemas, their fields, and their import links. - `create_typesheet`: define a schema from what the data means, not just its headers. - `import_rows`: the intake. Columns are matched by meaning and every cell is coerced and validated; returns an issue report plus a review URL for the human. - `set_cells`: fix specific cells and re-validate. Only fix what the source data defends; send the user the review URL for judgment calls. - `drop_rows`: drop junk lines, test rows, and subtotals out of validation and the export. - `export_records`: the clean, typed records. REFUSES while any issue remains. The refusal is enforced on the server by the same deterministic engine the review grid runs, so no amount of model confidence gets dirty data out. ## Import links (no account needed) A sheet's owner can mint an import link. The unguessable key in the URL is the credential; it only ever writes, and it never reveals what the sheet already holds. Treat a key like a secret and never publish it. ```bash curl -X POST https://typesheet.com/api/import//imports \ -H "Content-Type: application/json" \ -d '{"columns":["Name","Email"],"rows":[["Maya Chen","maya@northwind.co"]]}' ``` The response carries the issue report and a per-submission edit token. `PATCH` the same import to fix cells; finalizing returns `409` while anything is still invalid. ## Quick recipe When a user hands you tabular data (a pasted table, a CSV, a PDF price list): call `list_typesheets` to find the sheet it belongs to (or `create_typesheet` if none fits), `import_rows` to put it in, then read the issue report. Fix what you can defend with `set_cells`, drop what is not a record, and hand the user the review URL for anything requiring their judgment. Do not report the data as clean until `export_records` returns it.