Skip to main content
Glama

origami_upload_csv

Create an Origami TABLE from a CSV — the ingest verb POST /workspaces/{id}/documents, JSON with the file base64-encoded (never multipart). WRITE.

mode="table" (default): the CSV becomes a NEW table in workspace_id, its header row = the input columns. mode="append" is REFUSED: Origami does not bind the CSV header to the table's columns and creates new ones on every call — rows go into an existing table with origami_rows(op="upsert", table_id=…, match_columns=[…]), which checks the column slugs. dry_run=True parses the CSV and returns {dry_run: true, would_upload: {filename, mode, columns, rows, preview}} (first rows) without uploading. The real call returns the per-file results[] (an entry may be kind: "error"); the new table then appears in origami_tables(op="list", workspace_id=…).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "workspace_id": "<workspace_id>",
      "filename": "<filename>",
      "csv_text": "<csv_text>"
    },
    "name": "origami_upload_csv"
  }
}

Input Schema

NameRequiredDescriptionDefault
_orgNoOrg (id) de CET APPEL. `oto_list_orgs()`.
modeNo"table" (new table, default); "append" is refused (see above).table
_groupNoÉquipe (id) de CET APPEL, sous son org parente.
_run_idNoOBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas.
dry_runNopreview the parsed CSV, upload nothing.
_projectNoProjet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`.
csv_textYesthe CSV content, header row first, UTF-8.
filenameYesname ending in `.csv` (e.g. "grossistes-fr.csv").
table_idNoonly named back in the refusal of mode="append".
_instanceNoInstance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`.
workspace_idYestarget workspace (`origami_workspaces`).

Schema Changelog

Changes observed during successful MCP inspections.

No schema history has been recorded yet.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it declares this is a WRITE, specifies JSON with base64-encoded content rather than multipart, explains the destructive-ish side effect of repeated calls in append mode, and describes both the dry_run payload and the per-file results[] with possible kind:"error" entries. It stops short of permissions, size limits, or rate limits, so not a perfect 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the WRITE marker, then ordered by mode, preview, and return shape. Dense with backticked identifiers and somewhat prose-heavy, but nearly every sentence carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter mutation tool with no output schema, the description supplies the return shapes an agent needs (dry_run preview object, results[] with error entries) and points to origami_tables for verification. Remaining gaps are the scoping/auth parameters and any constraints on CSV size or encoding failures, which the schema partially covers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds genuine meaning: why mode="append" exists only to be refused, what dry_run actually returns (parsed columns, rows, preview), and that table_id is only echoed back in the append refusal. It does not explain the _org/_group/_run_id/_project scoping parameters, leaving that to the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create an Origami TABLE from a CSV") plus the exact underlying endpoint and payload encoding, and explicitly distinguishes it from the sibling upload path (origami_rows upsert for appending). An agent can tell instantly what this tool produces and how it differs from origami_rows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (mode="table" creating a new table in workspace_id), explicit when-not (mode="append" is REFUSED, with the reason: header isn't bound and duplicate columns are created), and names the alternative with its arguments — origami_rows(op="upsert", table_id=…, match_columns=[…]). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources