A design-partner trial driving the hosted MCP server from an agent client
could not get a CSV in at all. upload_csv took the file as a tool argument or
read it from the machine the server runs on; no customer runs the server, and
an agent does not emit megabytes as tokens.
The bytes now move by reference, in three steps. request_upload(name, object_role, data_origin, size_bytes) mints a pending import and returns a
one-time upload URL, its token, an expiry and a ready-to-run curl -T line.
The agent’s own shell sends the file to that URL, which since 2026-09-24 is a
Cloud Storage resumable session rather than our API, so the ceiling is memory
rather than the platform’s 32 MiB request limit that the first version ran
into. finalize_upload(import_id) reads the stored object, runs the same
ingestion every other door runs (parse, fingerprint, de-identify, store), and
returns the column metadata and the workspace connection_id in the shape
upload_csv already returned. It is idempotent: it ingests nothing on a
second call.
For an agent with no shell, upload_csv(source_url=...) pulls the file
server-side. The token is spent atomically before a byte is read, and every
upload-slot mint is rate-limited.