MCP
MCP tools
MAIA's MCP connector exposes sixteen tools. With them an MCP client can find a county, start a project, bring in a file, send a request to MAIA's agent, follow the run, answer its questions, ask you to approve its steps, and save skills and memory.
Every tool at a glance#
| Tool | What it does | Changes data |
|---|---|---|
[find_county](/docs/mcp/tools#find-county) | What it doesFinds counties you can build projects in, by name | Changes dataNo |
[create_project](/docs/mcp/tools#create-project) | What it doesCreates a project in a county and starts MAIA on a request or a skill | Changes dataYes |
[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 | Changes dataYes |
[get_upload_link](/docs/mcp/tools#get-upload-link) | What it doesGets a one-use link to bring a file into a project, or into a new project in a county | Changes dataYes |
[get_import](/docs/mcp/tools#get-import) | What it doesReports an address import: rows matched, rows not matched and why, or why it failed | Changes dataNo |
[send_message](/docs/mcp/tools#send-message) | What it doesSends another request, or runs a skill, on an existing project | Changes dataYes |
[get_run](/docs/mcp/tools#get-run) | What it doesReports a run: progress, then the answer, a question, or an error | Changes dataNo |
[respond](/docs/mcp/tools#respond) | What it doesAnswers MAIA's question, or declines its approval | Changes dataYes |
[approve_step](/docs/mcp/tools#approve-step) | What it doesApproves the step MAIA is waiting on, after you say yes | Changes dataYes |
[stop_run](/docs/mcp/tools#stop-run) | What it doesStops the current run. MAIA keeps what it finished | Changes dataYes |
[list_projects](/docs/mcp/tools#list-projects) | What it doesLists the projects you can see, most recently updated first | Changes dataNo |
[get_project](/docs/mcp/tools#get-project) | What it doesDescribes a project: layers, columns, row counts, and views | Changes dataNo |
[maia_guide](/docs/mcp/tools#maia-guide) | What it doesReturns what MAIA does, requests that work well, and its limits | Changes dataNo |
[list_skills](/docs/mcp/tools#list-skills) | What it doesLists your skills and your workspace's skills | Changes dataNo |
[save_skill](/docs/mcp/tools#save-skill) | What it doesSaves one of your own skills | Changes dataYes |
[save_to_maia_memory](/docs/mcp/tools#save-to-maia-memory) | What it doesSaves a titled note to your MAIA memory | Changes dataYes |
Three more tools exist only for the in-chat project view. Your client does not call them.
Every tool also accepts intent, an optional sentence of up to 500 characters on the goal of the call. MAIA records it with the call for its own logs. It does not change what the tool does. Leave out names, addresses, and anything private.
maia_guide#
No parameters beyond intent. Returns a short guide written for your client to read before it uses MAIA.
Starting work#
find_county#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
query | Typestring | RequiredYes | MeaningCounty name, optionally with state, such as "Maricopa, AZ" |
Returns each match with its county_fips and name. Only counties your workspace can use are returned. When nothing matches and your workspace can use 20 counties or fewer, it also returns all of them as available, so your client can offer you one.
{ "county_fips": "04013", "name": "Maricopa County, AZ" }Pass county_fips on as a string. As a number it loses its leading zero.
create_project#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
county_fips | Typestring, 5 digits | RequiredYes | MeaningThe county code from find_county |
request | Typestring | RequiredUnless skill is set | MeaningWhat to build, in plain language |
skill | Typestring | RequiredNo | MeaningThe name of a skill from list_skills for MAIA to run |
request_id | Typestring, up to 128 characters | RequiredNo | MeaningAn id of your choosing. A retry with the same id returns the same project and run |
Returns at once with a run report holding the project id and the run id. Follow the run with get_run. The report's fields are on Runs and approvals.
send_message#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project to work on |
message | Typestring | RequiredUnless skill is set | MeaningThe next request |
skill | Typestring | RequiredNo | MeaningThe name of a skill to run on this project |
Returns at once with a run report. Use it for questions about the data too. MAIA refuses a new request while a run is in progress on the project, so wait for complete first.
Bringing in a file#
The steps, from your side, are on Upload a file. Your client passes a CSV or GeoJSON file to import_rows, and sends a larger file, or another format, to a link from get_upload_link.
import_rows#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
content | Typestring, up to 100,000 characters | RequiredYes | MeaningThe rows as CSV text with a header row, or as GeoJSON text |
file_format | Typecsv or geojson | RequiredNo | MeaningThe format of content. Defaults to csv |
project_id | Typestring | RequiredUnless county_fips is set | MeaningA project you can edit, to add the rows to |
county_fips | Typestring, 5 digits | RequiredUnless project_id is set | MeaningThe county code from find_county. The import creates a new project there |
layer_name | Typestring, up to 255 characters | RequiredNo | MeaningThe new layer's name. A new project built from addresses names its layer itself |
truncate | Typeboolean | RequiredNo | Meaningtrue imports only the first rows when there are more than the row limit. Defaults to false. Your client asks you first |
Returns the same response as an upload to a link: the project and, for addresses, an import_id to follow with get_import. The rows go through the same import as a file upload.
get_upload_link#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredUnless county_fips is set | MeaningA project you can edit, to add the file to |
county_fips | Typestring, 5 digits | RequiredUnless project_id is set | MeaningThe county code from find_county. The upload creates a new project there |
layer_name | Typestring, up to 255 characters | RequiredNo | MeaningThe new layer's name. Defaults to the file name. A new project built from addresses names its layer itself |
truncate | Typeboolean | RequiredNo | Meaningtrue imports only the first rows of a file over the row limit. Defaults to false. Your client asks you first |
Returns a one-use link and the command that sends the file to it. The link expires after 10 minutes and works only for you. Your client sends the file from its own code environment, not through a tool call. The response to the upload names the project and, for addresses, an import_id to follow with get_import.
get_import#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
import_id | Typestring | RequiredYes | MeaningThe import_id from the upload's response |
wait_seconds | Typeinteger, 0 to 45 | RequiredNo | MeaningHow long to wait for the import to finish before answering. Defaults to 30 |
Returns the import's progress, then the rows matched to parcels and the rows not matched, with the reason for each. If the import failed, it says why. Only an address import needs it: a map layer or a table is in the project when the upload returns.
Following a run#
get_run#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project the run belongs to |
run_id | Typestring | RequiredNo | MeaningThe run id from create_project, send_message, or respond. Omitted, the project's current or latest run |
wait_seconds | Typeinteger, 0 to 45 | RequiredNo | MeaningHow long to wait for the run to finish before answering. Defaults to 30. Keep it under your client's own tool timeout |
Returns a run report. Its fields are described in Runs and approvals.
respond#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project that is waiting |
choice | Typestring | RequiredFor a question | MeaningThe id or the label of the option to pick |
decline | Typeboolean | RequiredTo decline an approval | Meaningtrue declines the step. Defaults to false |
note | Typestring, up to 2,000 characters | RequiredNo | MeaningWhy you declined. MAIA reads it with the decline |
Send choice for a question and decline for an approval. The report says which kind is pending. A call with the wrong one, or with nothing pending, is refused. respond never approves a step. To approve, use [approve_step](/docs/mcp/tools#approve-step).
{ "project_id": "3f6c1a2e-0000-0000-0000-000000000000", "choice": "a" }{ "project_id": "3f6c1a2e-0000-0000-0000-000000000000", "decline": true, "note": "Too many rows. Offer a smaller run." }Returns the run report. The run continues.
approve_step#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project that is waiting |
approval_id | Typestring | RequiredYes | MeaningThe approval_id of the pending approval from get_run |
summary | Typestring | RequiredYes | MeaningThe summary of the pending approval from get_run, unchanged |
note | Typestring, up to 2,000 characters | RequiredNo | MeaningA note MAIA reads with the approval |
Lets MAIA run the step it asked approval for. approval_id and summary must match the pending approval exactly. A call that does not match, or with no approval pending, is refused.
{
"project_id": "3f6c1a2e-0000-0000-0000-000000000000",
"approval_id": "toolu_01A2B3C4D5E6F7G8",
"summary": "Enrich 1,200 rows of Owner contacts on Parcels. That is past your 500-row limit per reply. This run uses 1,200 credits, and leaves 3,800."
}Returns the run report. The run continues.
Note
approve_step is marked destructive, so your client asks you before each call. The request shows the summary, so you see what the step does and what it uses. If you set the tool to "always allow" in your client, it no longer asks.
stop_run#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project whose run to stop |
Returns whether a run was in progress. A stop is not instant. MAIA halts at the next safe point and keeps what it finished. Calling it twice is safe.
Reading projects#
list_projects#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
limit | Typeinteger, 1 to 100 | RequiredNo | MeaningHow many to return. Defaults to 25 |
Each project comes with its id, name, status, last update, and a link to it in MAIA.
get_project#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
project_id | Typestring | RequiredYes | MeaningThe project to describe |
Returns the project's layers, each with its kind, row count, and column names. It also returns the views, and whether a run is in progress. It does not return rows. To read them, open the project link.
Skills and memory#
list_skills#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
name | Typestring | RequiredNo | MeaningA skill's name, to get its full instructions |
Without name, each skill comes back with its name, description, scope, and kind. The full instructions come back only for a skill asked for by name.
save_skill#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
name | Typestring, up to 120 characters | RequiredYes | MeaningThe skill's name. Saving the same name replaces your skill |
description | Typestring, up to 400 characters | RequiredYes | MeaningWhat the skill does and when MAIA should use it |
instructions | Typestring, up to 32,000 characters | RequiredYes | MeaningThe method itself |
kind | Typeworkflow, enrichment, or agent_column | RequiredNo | MeaningA new skill defaults to workflow. An existing skill keeps its kind |
Saves a personal skill. Workspace skills are edited in MAIA. See Skills.
save_to_maia_memory#
| Parameter | Type | Required | Meaning |
|---|---|---|---|
title | Typestring, up to 120 characters | RequiredYes | MeaningA short section name. Saving the same title replaces that section |
content | Typestring, up to 8,000 characters | RequiredYes | MeaningThe note |
MAIA reads this memory in every project. It is part of your personal knowledge. See Knowledge.
Note
Both save tools tell your client to show you the draft and get your yes first. Read the draft before you agree.
Limits#
- One county per project.
create_projecttakes one county code. - No tool reads rows directly. To ask about the data, send the question to MAIA's agent with
send_message, and open the project link for the full table.