Skip to content

MCP

Upload a file from Claude or ChatGPT

MAIA's MCP connector takes a file you attach in Claude, ChatGPT, or another MCP client, and brings its rows into a MAIA project. MAIA matches the rows to parcels or adds them as a map layer or a table, the same way an upload in the web app does.

What you end with#

You attach a file in the chat and say where its rows go.

You ask

Bring the places in this file into a new MAIA project in San Francisco County.

Your client does the rest. There is no MAIA page to open. When the import finishes, your client reports:

  • the link to the project
  • how many rows MAIA imported
  • how many rows it skipped because they are outside the county
  • for addresses, how many rows matched a parcel and how many did not

Before you start#

You need the MAIA connector connected and signed in. See Connect. For a CSV or GeoJSON file, MAIA needs no other setting.

Your client sends the file in one of two ways. MAIA picks the way from the file.

CSV or GeoJSON, up to 100,000 charactersHow it reaches MAIAYour client reads the rows and passes them to MAIA in a tool callWhat you needNothing more, in any client
Any other format, or a larger fileHow it reaches MAIAYour client sends the file to a one-use upload linkWhat you needA client that can send a file over HTTPS to api.maia-analytics.com

Claude Code can send a file to an upload link with no setup. Claude on the web and in the desktop app can, after you allow MAIA's domain once, as below. ChatGPT cannot, so in ChatGPT bring in a CSV or GeoJSON file, or save the file as CSV first.

Allow MAIA's domain in Claude#

You need this step only for a file that goes to an upload link. Claude sends that file from its code sandbox. By default, the sandbox reaches only package-manager domains, so Claude cannot reach MAIA until you allow it.

On a Pro or Max plan:

  1. Open Settings, then Capabilities.
  2. Under Code execution and file creation, make sure code execution is on, and keep Allow network egress on.
  3. Under Additional allowed domains, enter api.maia-analytics.com and choose Add.

Note

On a Claude Team or Enterprise plan, a workspace admin adds api.maia-analytics.com to the organization's allowed domains. Code execution must be on.

If you skip this step, the upload is blocked. Claude tells you which domain to allow and where. Add it, and Claude can try again with the same link.

Bring a file in#

  1. Attach the file in the chat.
  2. Say where the rows go: a project you can edit, or a new project in a county you name.
  3. Wait for the report. Address rows are matched in the background, and your client checks on them until they finish.

A project covers one county. Rows outside that county are skipped, so split a list that spans counties and bring each part into its own project.

What MAIA does with the file#

MAIA picks the route from the file itself, the same way it does for an upload in the web app.

Street addressesYou getYour rows matched to parcels
Coordinates or shapesYou getA map layer of your own features
Anything elseYou getA table the agent can read and join

How MAIA reads a file and matches its addresses is on the File upload page.

Formats and limits#

Through an upload link, the formats and the limits are the same as for an upload in the web app: CSV, TSV, Excel (.xlsx), Parquet, GeoJSON, KML, KMZ, GeoPackage, and zipped Shapefile. Rows passed in a tool call must be CSV or GeoJSON text, up to 100,000 characters.

Rows passed in a tool callValue100,000 characters of CSV or GeoJSON
File size, through an upload linkValue25 MB
Rows, matched to parcels by addressValue1,000
Rows, as a map layer or a tableValue10,000

A file with more rows than the limit does not fail. Your client can ask MAIA to import only the first rows that fit. See File formats and Limits.

How the upload works#

  • Rows in a tool call. Your client reads the attached file and passes its rows to MAIA as text. They go through the same import as a file upload. Each call imports once, into the project or the county your client names.
  • An upload link. Your client asks MAIA for a link, then sends the file to it from its own code environment. The file does not pass through the chat's tool calls. A link works once, expires after 10 minutes, and works only for you, for the project or the county it was made for.

Troubleshooting#

Claude says the upload was blockedLikely causeThe file went to an upload link, and api.maia-analytics.com is not an allowed domainWhat to doAllow MAIA's domain, then ask Claude to try again. For a CSV, you can also ask Claude to pass the rows in the chat instead
Claude cannot run codeLikely causeCode execution is off, and the file needs an upload linkWhat to doTurn it on under Settings, then Capabilities
The file is too large to pass in the chatLikely causeIt holds more than 100,000 charactersWhat to doSplit it into smaller files, or use a client that can send a file to an upload link
Fewer rows than in the fileLikely causeRows outside the project's county were skippedWhat to doCheck the skipped count in the report, and bring those rows into a project in their own county
Addresses left unmatchedLikely causeMAIA found no single parcel for themWhat to doSee How matching works
The link has expiredLikely causeMore than 10 minutes passed, or the link was usedWhat to doAsk your client to start the upload again

Tools#

Three tools carry an upload. Your client calls them for you.

[import_rows](/docs/mcp/tools#import-rows)What it doesImports rows passed as CSV or GeoJSON text into a project, or into a new project in a county
[get_upload_link](/docs/mcp/tools#get-upload-link)What it doesGets a one-use upload link for a project, or for a new project in a county
[get_import](/docs/mcp/tools#get-import)What it doesReports an address import: its progress, then the matched and unmatched rows