# MAIA documentation

> MAIA is a geospatial research engine. You define a research objective, MAIA's agent builds a spatial database to answer it, and every value in that database names its source.

Source: https://maia-analytics.com/docs

# Quickstart

What MAIA is, and one run from start to finish.

## What is MAIA?

MAIA is a geospatial research engine. You define a research objective in plain language, MAIA's agent builds a spatial database to answer it, and every researched value in that database names its source.

Updated: 2026-10-16. Source: https://maia-analytics.com/docs/quickstart/what-is-maia

### What MAIA does

Most questions about the physical world are "where" questions with conditions attached. Which roofs are large enough, owned by the right kind of company, and eligible for an incentive. Which parcels are zoned for the use, sized for the deal, and held by someone who might sell.

You ask one of them in plain language.

> **You ask:** Find large, single-tenant commercial buildings in Maricopa County with solar-ready roofs, verified ESG obligations, and available incentives

MAIA's agent searches its data and researches what the data does not hold. The result is a project: layers on a map, rows in a table, and a written answer. Every researched value carries its reasoning and its sources, so you can check it.

![A finished MAIA project. The chat on the left holds the written answer and the skill that ran. The map shows Maricopa County with the satellite basemap, and the table below lists the ten sites with their owners, roof areas, and companies.](https://maia-analytics.com/product-shots/docs/project-finished@2x.png)

A finished run: the answer in the chat, the layer on the map, and the same rows in the table.

The database is the product. The answer is a summary of it, and the database is the proof. Ask MAIA for a shareable report of the current results. It can be shared by link or downloaded as a PDF or web page.

![A table cell reading Excellent under the column Roof Solar Readiness, with its reasoning panel open below it. The panel reads Roof Solar Readiness = Excellent, then Reasoning: the building shows a very large, predominantly flat and contiguous white roof with broad unobstructed sections, only limited rooftop equipment and small vents, and no obvious solar panels, heavy shading, unusual geometry, or severe deterioration.](https://maia-analytics.com/product-shots/docs/reasoning-satellite@2x.png)

One researched cell, opened. The value is in the cell, and the reasoning is in the panel.

### How you work with it

Working with MAIA takes four steps. They are the same whether you use the web app or drive MAIA from an AI assistant such as Claude or ChatGPT.

| Step | What you do | Read more |
| --- | --- | --- |
| Define | State the research objective | [Define](https://maia-analytics.com/docs/using-maia/define) |
| Dispatch | Hand it to the agent, and answer what it asks | [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch) |
| Review | Check the answer against the database behind it | [Review](https://maia-analytics.com/docs/using-maia/review) |
| Compound | Save the method and run it again | [Compound](https://maia-analytics.com/docs/using-maia/compound) |

Three things to know before your first run:

- **A project can cover several counties.** Name the place, and MAIA finds the counties it covers. A project holds up to 200 counties. See [Limits](https://maia-analytics.com/docs/reference/limits).
- **Research spends credits.** Records are queried for nothing extra. Research on rows spends from your workspace's credits, and MAIA asks before a large run. See [Credits](https://maia-analytics.com/docs/billing/credits).
- **The people behind an owner are an enrichment.** MAIA finds them when you ask. See [Contacts](https://maia-analytics.com/docs/enrichments/contacts).

### What it is made of

MAIA has four parts: agents that do the work, data they can read, context they remember, and the workspace where the work lives. What the agents find that no dataset holds is an enrichment. Each part has its own page, starting at [Capabilities](https://maia-analytics.com/docs/capabilities/overview).

### Two ways in

| Where | How you reach it | Best for |
| --- | --- | --- |
| The web app | Sign in at [app.maia-analytics.com](https://app.maia-analytics.com) | Working on the map and in the table |
| The MCP connector | Add MAIA to Claude, ChatGPT, or another MCP client | Driving MAIA from the AI assistant you already use |

Both reach the same agent and the same projects. The connector's SQL tools never return licensed property data. See [Connect](https://maia-analytics.com/docs/mcp/connect) and [`query_project`](https://maia-analytics.com/docs/mcp/tools#query-project).

### When MAIA fits

Use MAIA when:

- Your question covers many parcels or buildings across a county.
- The answer depends on several conditions holding together.
- Part of the answer is in no database and has to be researched.
- You need to know who owns a place and how to reach them.
- You will ask the same question again in the next county.

Look elsewhere when:

- You have one known address and one known question.
- You need turn-by-turn directions or live traffic. MAIA computes drive, walk, and bike times, and it assumes free-flowing roads.
- You need a decision about a person's credit, insurance, employment, tenant screening, or housing eligibility. MAIA declines those uses. See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).

### Next

Follow one run from start to finish in [Your first run](https://maia-analytics.com/docs/quickstart/first-run).

## Your first run

A first run in MAIA is the same four steps as every run, once you have chosen a county: define the objective, dispatch it, review the result, and compound what worked. This page follows one run through all four.

Updated: 2026-10-15. Source: https://maia-analytics.com/docs/quickstart/first-run

### What you end with

The example on this page is the solar run that plays on the [home page](https://maia-analytics.com/#interactive-demo). A commercial solar team wants target accounts in Maricopa County, Arizona. This is where the run ends.

> **MAIA answers:** 10 sites qualify, representing 1.60 million square feet of roof and 5.59 MW of estimated solar capacity. All have verified ESG obligations and federal incentive eligibility; eight also sit in designated incentive areas.

![A finished MAIA project. The chat on the left holds the written answer and the skill that ran. The map shows Maricopa County with the satellite basemap, and the table below lists the ten sites with their owners, roof areas, and companies.](https://maia-analytics.com/product-shots/docs/project-finished@2x.png)

A finished run: the answer in the chat, the layer on the map, and the same rows in the table.

> **Note:** The figures on this page are real output from one run. They are not every qualifying building in the county, and your county, your conditions, and your results will differ.

### Before you start: choose a county

1. Sign in at [app.maia-analytics.com](https://app.maia-analytics.com).
2. Start a new project.
3. Name the place: a county, a city, or a ZIP code. MAIA finds the counties it covers and shows them on the map. Click a county on the map to add or remove it.

A project can cover several counties, up to 200. To add a county later, use the project's counties in the header, or ask MAIA in the chat.

> **Note:** On the Free plan, five counties are included. A workspace admin can add one more, free and for good: ask for a project in it, and MAIA adds it and says so. See [Your county of choice](https://maia-analytics.com/docs/billing/plans#county-of-choice).

![The new project screen. A map of the United States with every county shaded as in your plan, a legend reading In your plan and Not in your plan, and a list of counties to the right with a search box.](https://maia-analytics.com/product-shots/docs/county-picker@2x.png)

MAIA asks where first. Counties in your plan are shaded on the map and listed on the right.

### 1. Define the objective

Write what you want the way you would brief a colleague. Name the thing, the place, and the conditions that make it a fit.

> **You ask:** Find large, single-tenant commercial buildings in Maricopa County with solar-ready roofs, verified ESG obligations, and available incentives

This objective leaves "large" to MAIA, which picks a threshold and tells you which. When you have a number, give it. More on writing a good objective: [Define](https://maia-analytics.com/docs/using-maia/define).

### 2. Dispatch it

Press **Find**. MAIA names each action as it takes it. This run also followed a saved skill, so it showed the skill's plan and marked each phase as it finished. A first run has no skill yet, so you see the actions without the plan.

| Phase | What it found | What it read |
| --- | --- | --- |
| Find large commercial roofs | 10 shortlisted | Properties and building footprints |
| Verify a single operating tenant | 10 verified | Property records and company research |
| Read roof quality and estimate capacity | 5.59 MW total | Imagery and roof geometry |
| Verify ESG obligations and incentives | 8 in designated areas | Company disclosures and incentive programs |

MAIA stops and asks when a choice would change the result, or when the next step would spend credits you have not agreed to. When a choice would not change the result, MAIA picks a sensible default and tells you which one. You can stop a run at any point.

> **Note:** The first phase is a query of records. The other three are research, one row at a time, and each row spends credits. A run above your row limit stops on an approval card before it starts. See [What uses credits](https://maia-analytics.com/docs/billing/usage).

![The skill's plan in the chat: a checklist headed Ten-site ESG solar shortlist 5/5 with five phases, each crossed out with a check mark, and View activity (29) below it.](https://maia-analytics.com/product-shots/docs/chat-plan@2x.png)

A skill's plan in the chat. Each phase is checked off as it finishes.

More on questions and approvals: [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

### 3. Review the result

The answer arrives as a layer: ten sites on the map, and the same ten rows in the table. Beside it sits a second layer of the 12,081 buildings MAIA screened from the records, each marked with the signal it was missing.

Four of the ten rows:

| Site | Roof area | Est. capacity | Why now |
| --- | --- | --- | --- |
| Sonora Quest Laboratories | 257,875 sq ft | 902.6 kW | ESG, federal incentive, designated area |
| Honeywell Aerospace Global Headquarters | 255,771 sq ft | 895.2 kW | ESG, federal incentive, designated area |
| Phoenix Manufacturing | 145,099 sq ft | 507.8 kW | Good roof, ESG, federal incentive |
| Dircks Moving & Logistics | 107,548 sq ft | 376.4 kW | Excellent roof, ESG, federal incentive |

Why now is an enrichment: a column MAIA fills by research, one row at a time. Open any researched cell and choose **View reasoning** to see what stands behind that one value.

**Reasoning: Why now, for Dircks Moving & Logistics**

- Roof read: flat, unshaded membrane. Rated Excellent for solar.
- Estimated 376.4 kW from 107,548 sq ft of usable roof.
- ESG target and federal ITC eligibility verified in disclosures.

Sources: Maricopa County Assessor, NAIP imagery, Utility programs, Company disclosures.

![A table cell reading Excellent under the column Roof Solar Readiness, with its reasoning panel open below it. The panel reads Roof Solar Readiness = Excellent, then Reasoning: the building shows a very large, predominantly flat and contiguous white roof with broad unobstructed sections, only limited rooftop equipment and small vents, and no obvious solar panels, heavy shading, unusual geometry, or severe deterioration.](https://maia-analytics.com/product-shots/docs/reasoning-satellite@2x.png)

A researched cell from this project, opened with View reasoning.

Then ask the next question. The project keeps its state, so each question builds on the last.

> **You ask:** Is there a portfolio play?

> **MAIA answers:** Honeywell Aerospace US LLC owns two shortlisted sites with 1.31 MW of combined estimated capacity. Phoenix Children's Hospital also has two sites totaling 1.21 MW.

More on checking a result: [Review](https://maia-analytics.com/docs/using-maia/review).

### 4. Compound what worked

A run that worked is worth keeping.

- **Save the method as a skill.** A skill is not tied to a place, so the objective you wrote for Maricopa County runs in the next county.
- **Teach MAIA your context.** What you tell it about your business is saved as knowledge and used on every turn.
- **Take the table out.** Download it, or send a link. See [Export, share, or save the result](https://maia-analytics.com/docs/using-maia/review#export).

More on making work repeatable: [Compound](https://maia-analytics.com/docs/using-maia/compound).

# Using MAIA

The four steps of working with MAIA, one page each.

## Define

To define a research objective for MAIA, name the thing, the place, and the conditions, with numbers wherever you have them. The objective says what you want, and MAIA's agent works out how to get it.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/using-maia/define

### What an objective holds

An objective has three parts: the thing, the place, and the conditions. This one is from the solar run on the [home page](https://maia-analytics.com/#interactive-demo).

> **You ask:** Find large, single-tenant commercial buildings in Maricopa County with solar-ready roofs, verified ESG obligations, and available incentives

| Part | In this objective |
| --- | --- |
| The thing | Large, single-tenant commercial buildings |
| The place | Maricopa County |
| The conditions | Solar-ready roofs, verified ESG obligations, available incentives |

This is what that objective bought.

> **MAIA answers:** 10 sites qualify, representing 1.60 million square feet of roof and 5.59 MW of estimated solar capacity. All have verified ESG obligations and federal incentive eligibility; eight also sit in designated incentive areas.

Name the place in the objective: a county, a city, a ZIP code, or several of them. MAIA finds the counties they cover, and one project can hold them all. Inside those, the place can narrow further: a corridor, a distance from something. In an existing project, keep the place inside the project's selected counties, or ask MAIA to add a county.

### Say what, not how

MAIA does not have a thesis about your market. You do. The more of it you put in the objective, the less MAIA has to assume.

Leave the method out. You do not name a dataset or a tool. MAIA chooses the route, and it reaches for records before research. How it chooses is on the [Main agent](https://maia-analytics.com/docs/capabilities/main-agent) page.

> **Note:** Some conditions are answered from records, and some take research. "Zoned industrial" is a query, and it is fast. "Verified ESG obligations" is researched one row at a time, and every row spends credits. MAIA asks before it researches more rows than your row limit. See [What uses credits](https://maia-analytics.com/docs/billing/usage).

### Vague and specific

| Vague | Specific | What changed |
| --- | --- | --- |
| Good roofs for solar | Which nonprofits in the county own a building with a flat roof over 15,000 square feet? | Names the owner type, the roof form, and a size threshold |
| Industrial land for outdoor storage | Find industrial parcels between three and eight acres with building coverage under 20 percent where outdoor storage is permitted by right. | Sets an acreage band, a coverage limit, and a zoning test |
| Sites near substations | Find parcels between two and seven acres within a quarter mile of a substation, zoned industrial. | Turns "near" into a distance |
| Apartment owners to call | Find every 2 to 50 unit building in these San Gabriel Valley cities built before 2000 and not sold in the last two years. | Defines the building, its age, and how long the owner has held it |

### Requirements filter, preferences rank

MAIA treats the two differently, so say which is which.

| You write | MAIA reads it as | Effect |
| --- | --- | --- |
| "Must be over three acres" | A requirement | Places that fail are set aside |
| "Closer to the highway is better" | A preference | Places are ranked. None is removed for it |

A blank is not a failure. When a requirement needs a value and a row has none, MAIA sets the row aside as unknown rather than as a fail, and it tells you how many rows it set aside. A row set aside is not deleted. You can bring it back.

### What MAIA knows before you ask

Knowledge is what MAIA already knows about you: your buy box, your service territory, the terms your team uses. With that in place, an objective can be short.

MAIA fills some of this in for you. At signup it researches the organization behind your email domain and saves what it finds as background you can edit. See [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge).

### Five habits

- **Give numbers.** "Large" is an opinion. "Over 40,000 square feet" is a filter.
- **Say what rules a place out.** Owners you will not call, uses you cannot sit beside, flood zones you will not build in.
- **Say what must be certain.** MAIA reports what it could not confirm. Name the conditions you will not act on without proof.
- **One question per condition.** A condition that asks one thing becomes a column MAIA can check. A condition that asks three cannot be checked.
- **Change one thing and ask again.** The project keeps its state, so you never start over. See [Compound](https://maia-analytics.com/docs/using-maia/compound).

### In the app and over MCP

| Where | Where the objective goes |
| --- | --- |
| The web app | The box on a new project, then **Find**. In an existing project, the chat |
| MCP | The `request` of `create_project`, or the `message` of `send_message` |

Next: [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

## Dispatch

To dispatch an objective, you hand it to MAIA's agent and answer what it asks along the way. The agent shows what it is doing, and it stops for you only when a choice would change the result, spend credits you have not agreed to, or remove data.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/using-maia/dispatch

### Start a run

In the web app:

1. Start a new project, and write the objective in the box. Name the place in it. See [Define](https://maia-analytics.com/docs/using-maia/define).
2. Check the counties MAIA found for the place. Add or remove a county in the place list or on the map.
3. Send the request. MAIA names its first action within a few seconds.

In an existing project, write in the project's chat instead.

To start from a skill, type `/` in the chat and choose it. MAIA runs the saved method on this project.

| Where | A new project | An existing project |
| --- | --- | --- |
| The web app | Choose a county, write the objective, press **Find** | Write in the project's chat |
| MCP | `create_project` with the county and the `request` | `send_message` with the project and the `message` |

Over MCP both calls return at once with a run id, and `get_run` reports on the run. Pass a skill's name as `skill` to start from one. See [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals).

### What MAIA shows while it works

While MAIA works, the chat names each action as it takes it, such as searching the web or creating a layer. While the box is empty, the send button is a stop button, and a card appears whenever MAIA needs you. When a run follows a skill, MAIA shows the skill's plan and marks each phase as it finishes.

![The skill's plan in the chat: a checklist headed Ten-site ESG solar shortlist 5/5 with five phases, each crossed out with a check mark, and View activity (29) below it.](https://maia-analytics.com/product-shots/docs/chat-plan@2x.png)

A skill's plan in the chat. Each phase is checked off as it finishes.

A run takes from under a minute to several minutes.

![The chat with View activity (29) expanded. A bulleted list of actions in MAIA's own words: screening the full county for large, named buildings on owner-occupied parcels; finding 32 owner-user candidates and narrowing to 18; adding checks for single tenancy, ESG obligations, and satellite roof quality; then verifying and inspecting all 18.](https://maia-analytics.com/product-shots/docs/chat-activity@2x.png)

What MAIA shows while it works: the plan, then each action in its own words.

### When MAIA stops for you

MAIA asks before it acts in three cases only:

- **Your answer would change what MAIA looks for**, even in the first result.
- **The next step would spend credits** you have not agreed to.
- **Whether to set rows aside is a judgment call.**

Everything else it decides. A cutoff, a distance, or a category is a reversible choice, so MAIA picks a sensible default and tells you which one. You can change it afterward.

#### Questions

A question arrives as a short list of options or as a yes or no. Pick one, and the run continues.

#### Approvals

Some actions run only after you approve them. MAIA shows a card, and you choose **Approve** or **Decline**. Decline, and MAIA goes on without that step.

| Action | The card asks |
| --- | --- |
| Removing a layer | Delete layer? |
| Saving a method | Save skill? |
| Changing or removing a saved method | Update skill? or Delete skill? |
| Changing a column that already holds answers | Update enrichment? |
| Researching more rows than your row limit | Enrich this column? The card names the column and the row count, and it says the run spends credits |

> **Note:** Before a large run starts, MAIA checks your balance. A run the balance cannot cover is refused, and MAIA says how far short it is. From the table's **Enrich** menu, MAIA offers to run the rows you can afford instead. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

Over MCP the run reports `needs_input`. Your client answers a question with `respond`. It approves a step with `approve_step` only after you say yes, and your client asks you before each call. See [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals).

### Stop, queue, and leave

| You want to | In the app | Over MCP |
| --- | --- | --- |
| Stop a run | The send button is a stop button while the box is empty | `stop_run` |
| Add a request mid-run | Type it. It waits in a queue until the run ends. **Send now** stops the run and sends it | Wait for the run to end. A request sent during a run is refused |
| Leave | Close the project. The run and its enrichments keep going, and the answer is in the chat when you return | Call `get_run` later |

A stop is cooperative. MAIA keeps what it finished.

### Limits

- **One run per project at a time.** Several projects can run at once.
- **A run has a time limit.** Send a long job as several short requests.

Next: [Review](https://maia-analytics.com/docs/using-maia/review).

## Review

To review a result in MAIA, you check the answer against the database the agent built. Every column header states where the column came from, and every researched value opens to its reasoning and its sources.

Updated: 2026-10-16. Source: https://maia-analytics.com/docs/using-maia/review

### Review in five steps

Your run has finished, and the table is full. Before you export it or share it, check it in this order.

1. [Read the column headers](https://maia-analytics.com/docs/using-maia/review#headers). Each one says where its column came from.
2. [Open the researched values](https://maia-analytics.com/docs/using-maia/review#reasoning) you will act on. Read the reasoning and the sources.
3. [Find the Unavailable rows](https://maia-analytics.com/docs/using-maia/review#unavailable). Decide whether to run them again.
4. [Check the identity](https://maia-analytics.com/docs/using-maia/review#contacts) on every contact you plan to call.
5. [Export, share, or save](https://maia-analytics.com/docs/using-maia/review#export) the result.

![A finished MAIA project. The chat on the left holds the written answer and the skill that ran. The map shows Maricopa County with the satellite basemap, and the table below lists the ten sites with their owners, roof areas, and companies.](https://maia-analytics.com/product-shots/docs/project-finished@2x.png)

A finished run: the answer in the chat, the layer on the map, and the same rows in the table.

### Read the column header

Each column header carries an icon for where the column came from. Open the column's menu to read it in words, on the **Source** line.

| The source reads | The column is |
| --- | --- |
| Dataset | A field from MAIA's core data |
| Joined from | A field brought in from another dataset |
| Calculated by MAIA | A value MAIA derived from other columns |
| Imported data | A field from a file you uploaded |
| Enrichment | A value MAIA researched, row by row |
| Source unavailable | A column whose origin MAIA cannot name. Check its values yourself |

![A column menu open on the Property Owner column. It reads Source: Joined from: Property parcels, Data type: Text, and offers View Property parcels in the Data Catalog above Sort, Filter, and the other actions.](https://maia-analytics.com/product-shots/docs/column-menu-joined@2x.png)

Open a column's menu to read where it came from. This one is joined from the parcel records.

### Open a researched value

On an enrichment cell, choose **View reasoning**. MAIA shows the reasoning and its sources. The reasoning is one or two sentences, finding first.

![A table cell reading Excellent under the column Roof Solar Readiness, with its reasoning panel open below it. The panel reads Roof Solar Readiness = Excellent, then Reasoning: the building shows a very large, predominantly flat and contiguous white roof with broad unobstructed sections, only limited rooftop equipment and small vents, and no obvious solar panels, heavy shading, unusual geometry, or severe deterioration.](https://maia-analytics.com/product-shots/docs/reasoning-satellite@2x.png)

The reasoning behind one value. Every researched cell opens like this.

### What Unavailable means

**Unavailable** means MAIA researched the row and could not support an answer. The reasoning says what it checked.

| The cell is | It means |
| --- | --- |
| Blank, with an **Enrich** button | The row has not been researched yet |
| **Unavailable** | The row was researched, and nothing supported an answer |

> **Note:** **Unavailable** in a cell and **Source unavailable** in a header are different things. The first is about one row's answer. The second is about where a whole column came from.

MAIA does not try Unavailable rows again by itself. To run them again, open the column menu and choose **Re-run unavailable rows**. Running them again spends credits.

![The column menu open on an enrichment column named Owner Contact Info. It reads Source: Enrichment: Owner contact and 0 of 10 enriched. The Enrich item is highlighted and its submenu lists First 10 in list, First 100 in list, All in list, Custom, and Re-run unavailable rows.](https://maia-analytics.com/product-shots/docs/column-menu-enrich@2x.png)

The Enrich submenu on a researched column. Re-run unavailable rows is the last item.

![A table cell reading Unavailable under the column Owner Occupied, with its reasoning panel open below it. The panel reads Owner Occupied = Unavailable, then Reasoning: no parcel owner, mailing address, or occupant records were returned, and the name FedEx Ground alone cannot establish occupancy. Sources (2) sits at the bottom.](https://maia-analytics.com/product-shots/docs/reasoning-unavailable@2x.png)

An Unavailable cell, opened. The reasoning says what MAIA checked and why it could not answer.

### Check the identity on a contact

| Status | What it means |
| --- | --- |
| Corroborated identity | Two or more independent sources agree |
| Single-source identity | One source, with nothing else to confirm it |
| Identity conflict | The name disagrees with the owner on record, or with the person you asked for |

Treat every contact as a lead to verify. See [Contacts](https://maia-analytics.com/docs/enrichments/contacts).

### Gaps in the records

Records are incomplete in ways that mislead. MAIA follows fixed rules so that a gap never turns into a claim. Read a cell the same way.

- A blank is unknown. It is never zero, never false, and never vacant.
- An empty result for permits, rentals, or listings means none are loaded for that county. It does not mean none exist.
- The vacancy flag on a parcel records mail vacancy. It does not mean vacant land.
- A parcel with no building footprint is not therefore vacant.
- A sale price may be modeled. The record says so when it is.
- A listing is a snapshot with a date. It is not current availability.
- A zoning code is a district name. It is not a ruling on what you may build. What a code permits comes from the ordinance, so MAIA ties such a claim to a source it checked or marks it unverified.

More on each record is on [Core data](https://maia-analytics.com/docs/capabilities/core-data).

### What MAIA checks before you do

After it changes the data, MAIA checks its own result against the data before it answers, and it reports what it could not confirm.

MAIA waits for the research to finish before it quotes a value. More on this is on [Main agent](https://maia-analytics.com/docs/capabilities/main-agent).

### Export, share, or save the result

| To | Do this | Read more |
| --- | --- | --- |
| Take the table out | **Download CSV** or **Download Excel**. Downloads are turned on per workspace | [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing) |
| Show it to someone | Share the project with your workspace, or send a link | [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing) |
| Keep the people | Choose **Save to contacts** on a contact | [Contacts](https://maia-analytics.com/docs/enrichments/contacts) |

> **Note:** Include the reasoning and the sources when you download a table someone else will rely on. Without them, the file holds the values and nothing that backs them.

### Review over MCP

Over MCP you can check the shape of a result and read layer values with `project_schema` and `query_project`. Open the project for the full table, reasoning, and sources.

| You can | How |
| --- | --- |
| See a project's layers, columns, row counts, and views | `get_project` |
| Ask MAIA a question about the data | `send_message` |
| Read the rows, the reasoning, and the sources | Call `project_schema`, then `query_project`. Licensed property data is never returned; see [`query_project`](https://maia-analytics.com/docs/mcp/tools#query-project). Open the project link for the full table, reasoning, and sources |

Next: [Compound](https://maia-analytics.com/docs/using-maia/compound).

## Compound

To compound your work in MAIA, you save the method as a skill, teach MAIA your context as knowledge, and run the same objective in the next county. Each run then starts from what the last one learned.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/using-maia/compound

### Three ways work compounds

| You keep | As | It pays again |
| --- | --- | --- |
| The method | A skill | On the next run, in any county |
| Your context | Knowledge | On every turn |
| The result | A shared project | For everyone in your workspace |

### Save the method as a skill

A skill records a way of working: what it finds, the criteria and thresholds, the steps, and the output format. The next run starts from it instead of from a blank box.

Save one when:

- You will ask the same thing again, in another county or another quarter.
- The thresholds are settled, and you do not want to retype them.
- You corrected MAIA during the run, and you want the correction kept.

To save one:

1. Ask MAIA to save the method as a skill. MAIA writes the skill from the conversation and shows it on a **Save skill?** card.
2. Read the card. Check that the skill names no county, city, or project. A skill that names a place will not carry to the next county.
3. Choose **Approve**. MAIA never saves a skill silently.

You choose who can use it: you alone, or your whole workspace. Saving to the workspace needs the editor role. See [Skills](https://maia-analytics.com/docs/capabilities/skills).

### Run it in the next county

Add the next county to the project and run the same skill again, or start a new project there. A skill is not tied to a place, so nothing in it has to change.

| Where | How |
| --- | --- |
| The web app | Add the county from the project's counties in the header, or start a new project for it. Then type `/` in the chat, and choose the skill |
| MCP | `create_project` with the county and the skill's name as `skill`. For several counties, list the others in `additional_counties` |

> **Note:** A threshold on a column the next county does not hold returns nothing. Check the county's data before you run, or ask MAIA to profile it first.

### Teach MAIA your context

Knowledge is what MAIA reads before you ask. It holds who you are, the markets you work, and the criteria you buy on.

| Level | Who it serves |
| --- | --- |
| Project | One project |
| Personal | You, in every project |
| Workspace | Everyone in your workspace |

You do not have to write it all. When you state a lasting fact or a preference, MAIA saves it. What you state inside a project goes to that project's memory, so a fact that should hold everywhere belongs at the personal or workspace level. You can read and edit everything MAIA holds. See [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge).

### Share with your workspace

One person's method becomes the team's when each piece is shared at the workspace level.

1. Save the skill to the workspace, not to yourself.
2. Add the knowledge entry at the workspace level.
3. Open the project's **Share** dialog and set **Workspace members** to **Can view** or **Can edit**. A new project is private until you do.

See [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces).

### Over MCP

| To | Use |
| --- | --- |
| See the skills you and your workspace have | `list_skills` |
| Save one of your own skills | `save_skill` |
| Save a note MAIA reads in every project | `save_to_maia_memory` |
| Turn this conversation into a skill | The `create_skill` prompt |
| Give MAIA a profile of your work | The `teach_maia` prompt |
| Run a skill in a county | The `run_skill` prompt |

Both save tools tell your client to show you the draft and wait for your yes. Over MCP you can save your own skills only. Workspace skills are edited in the web app. See [Tools](https://maia-analytics.com/docs/mcp/tools) and [Prompts](https://maia-analytics.com/docs/mcp/prompts).

Next: start the next project at [Define](https://maia-analytics.com/docs/using-maia/define).

# Capabilities

A technical reference for MAIA's agents, the data they read, and what they remember.

## Capabilities overview

MAIA's capabilities fall into four layers: agents that do the work, data they can read, context they remember, and the workspace where the work lives. This page lists every capability, what it takes, and what it returns.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/overview

### Which capability for which need

| If you need | Use | Not |
| --- | --- | --- |
| Every parcel in a county that meets a set of conditions | Core data, through the main agent | Web research, which spends more credits and is never used for facts the data holds |
| A fact no dataset holds, for every row | An enrichment. Each row spends credits | A question in chat, which answers once |
| A fact you can see from above | Computer vision | Web research |
| Who to call | Contacts | A search on the owner's name |
| What is owed on a property | Mortgages and liens, when enabled for your workspace | Web research |
| Your own records on the map | File upload, or staff-enabled Database sync for a live source | Retyping them into chat |
| A county or city layer MAIA does not hold | Data discovery, during a run | File upload, unless you already have the file |
| The same method run in the next county | Skills | Writing the objective again |
| How far a drive, walk, or bike ride is | Core data, through the main agent. Ask for a radius and MAIA measures straight-line distance instead | Nothing else in MAIA |
| A shareable project report | Ask MAIA for a report | A live view of changing data. The report freezes the current results |

### Agents

Who does the work. See [Agents](https://maia-analytics.com/docs/capabilities/agents).

| Capability | Takes | Returns |
| --- | --- | --- |
| [Main agent](https://maia-analytics.com/docs/capabilities/main-agent) | A research objective | Layers on the map and in the table, and a written answer |
| [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents) | One row and one question | A typed value, its reasoning, and its sources |

### Data

What the agents can read. See [Data](https://maia-analytics.com/docs/capabilities/data).

| Capability | Takes | Returns |
| --- | --- | --- |
| [Core data](https://maia-analytics.com/docs/capabilities/core-data) | A query | Parcels, buildings, places, and the records around them |
| [Database sync](https://maia-analytics.com/docs/capabilities/database-sync) | Tables from your own database. Enterprise, enabled by MAIA staff | Tables matched to parcels and kept in sync |
| [File upload](https://maia-analytics.com/docs/capabilities/file-upload) | A spreadsheet or a map file | A layer or a table |
| [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery) | A question the core data cannot answer | A public GIS layer, clipped to the project's selected counties, with its usage terms |

### Context

What the agents remember. See [Context](https://maia-analytics.com/docs/capabilities/context).

| Capability | Takes | Returns |
| --- | --- | --- |
| [Skills](https://maia-analytics.com/docs/capabilities/skills) | A method that worked | A run you can repeat in any county |
| [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) | What you tell MAIA about your work, and what it learns at signup | Context on every turn |

### Workspace

Where the work lives. See [Workspace](https://maia-analytics.com/docs/capabilities/workspace).

| Capability | Takes | Returns |
| --- | --- | --- |
| [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces) | A team | Shared projects, skills, and knowledge |
| [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing) | A project, or one layer | A link anyone can open, or a CSV or Excel file |

### Enrichments

The agents build map layers from data, and they fill columns by research. A researched column is an enrichment, and each of its rows spends credits. The kinds are on [Enrichments](https://maia-analytics.com/docs/enrichments/overview).

| Enrichment | Takes | Returns |
| --- | --- | --- |
| [Computer vision](https://maia-analytics.com/docs/enrichments/computer-vision) | A parcel, a building, or a point, seen from above | A value read from imagery |
| [Contacts](https://maia-analytics.com/docs/enrichments/contacts) | An owner or a company | The people behind it, with evidence |
| [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) | A parcel | Its loans, liens, and foreclosure filings |
| [Property details](https://maia-analytics.com/docs/enrichments/property-details) | A parcel, a building, or a place | Owner occupancy and tenants |
| [Web research](https://maia-analytics.com/docs/enrichments/web-research) | A question | A sourced answer from the public web |

Every number is in [Limits](https://maia-analytics.com/docs/reference/limits).

## Agents

MAIA is a coordinated system of agents. One main agent takes your objective and directs the run. Sub-agents do the deep work on each row, in parallel, so the conversation never waits on the research.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/agents

### Two kinds of agent

| Agent | Works on | Does |
| --- | --- | --- |
| [Main agent](https://maia-analytics.com/docs/capabilities/main-agent) | The whole project | Reads your objective, chooses the data, builds the layers, and answers you |
| [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents) | One row each | Research one question about one place, hundreds at a time |

You talk to the main agent. Sub-agents are its research tool, and you see their work as cells filling in.

### How a run goes

1. You define an objective and dispatch it.
2. The main agent queries the data and builds a layer of candidates.
3. Where the data holds no answer, it defines a column that asks for one.
4. It tests the column on a few rows and corrects it if the answers are wrong.
5. Sub-agents research the rest, one row each. Each row spends credits, and a run above your row limit stops on an approval card first.
6. The main agent reads the finished values, checks the result, and answers.

Step 4 is why a badly worded question costs a few rows, not ten thousand. A column that sub-agents fill is an [enrichment](https://maia-analytics.com/docs/enrichments/overview).

![The chat with View activity expanded. MAIA's actions read, in part: I found 32 owner-user candidates. I'm narrowing to 18 strong candidates, then testing them in one batch to produce ten true matches.](https://maia-analytics.com/product-shots/docs/chat-activity@2x.png)

The main agent reports its test and its count before it runs the rest.

### What each one leaves behind

| Agent | Leaves | Where |
| --- | --- | --- |
| Main agent | Layers, columns, views, and a written answer | The map, the table, and the chat |
| Sub-agents | A value, its reasoning, and its sources, per cell | The table, under **View reasoning** |

While a run is in progress, a blank cell is not yet researched, and **Unavailable** is researched with no supported answer. Checking a result is covered on [Review](https://maia-analytics.com/docs/using-maia/review).

![The Layers menu on the map, listing ten layers the main agent created during the project, five of them visible, with a New layer option at the bottom.](https://maia-analytics.com/product-shots/docs/layers-list@2x.png)

What the main agent leaves behind: the layers it built, listed on the map.

### Limits

- **One run per project at a time.** Several projects can run at once.

### In this section

- [Main agent](https://maia-analytics.com/docs/capabilities/main-agent.md): MAIA's main agent takes a research objective and returns layers on the map and in the table, with a written answer. It answers from the data first, researches only what the data cannot answer, and checks the result before it reports.
- [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents.md): MAIA is a coordinated system of agents. The main agent runs the conversation, and when a question needs research on every row, it hands the tasks to a sub-agent. Hundreds run at once, in the background, and none of them holds up the main agent.

## Main agent

MAIA's main agent takes a research objective and returns layers on the map and in the table, with a written answer. It answers from the data first, researches only what the data cannot answer, and checks the result before it reports.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/main-agent

### What it is for

The main agent answers your question from the project's data first, and researches only what the data cannot answer. When the answer is a set of places, they land on the map and in the table. The chat holds the summary, not the rows.

![The chat after a run. MAIA's answer reads: Created Top 10 Owner-User ESG Solar Sites. Validation confirms: 10 owner-occupied sites, 10 verified single-tenant buildings, 10 operators with documented public ESG obligations, 10 satellite-inspected roofs rated Good or Excellent, combined estimated capacity 5,591 kW, and 8 of 10 within designated incentive areas. Below it, the skill's plan and View activity.](https://maia-analytics.com/product-shots/docs/chat-answer@2x.png)

The main agent's answer at the end of a run: what it built, what it checked, and what it found.

### One run, step by step

1. **Read.** It reads the project's state: the layers, their columns, the current view, and your selection.
2. **Explore.** It checks what the data holds before it commits to a route.
3. **Act.** It queries, builds layers, and defines columns. Actions that do not depend on each other run in parallel.
4. **Verify.** It checks its own result against the data. See [How it verifies](https://maia-analytics.com/docs/capabilities/main-agent#verify).
5. **Answer.** It reports what it built, what it assumed, and what it could not confirm.

### Records first, research last

The main agent reads what the project holds and MAIA's own data before it researches anything, and it never searches the web for a fact the data holds. Research, through [sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents), is the slowest route and the one that spends the most credits.

When the data holds no answer, it defines a column that asks for one, tests it on a few rows, and runs the rest. That column is an [enrichment](https://maia-analytics.com/docs/enrichments/overview). Every row spends credits, and a run above your row limit stops on an approval card first. You can run the same enrichment yourself, on the rows you pick. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### The rules it keeps

These hold however a request is phrased.

| Rule | What it means |
| --- | --- |
| Null means unknown | A missing value is not zero, not false, and not vacant |
| Requirements filter, preferences rank | A preference orders the list. It never removes a place |
| Check the records before filtering on them | It reads what a county's records contain before it uses a field as a test |
| Zoning is a district name, not an entitlement | What a code permits comes from the ordinance, not the data |
| Done means stop | Once the objective is met, it adds no extra layers or columns |
| Source data is read-only | It writes to the project's own layers, never to the data beneath them |
| Rows are set aside, not deleted | A removal is an exclusion you can reverse |
| Some uses are declined | See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses) |

### How it verifies

After it changes the data, the main agent checks its result against the data before it answers, and it reports what it could not confirm. When a check fails for a reason it can fix, it corrects the work and tries again. It does not quote a value from a run still in progress.

### Questions and approvals

It asks only when a choice would change the result, spend credits you have not agreed to, or set rows aside on a judgment call. Some actions always wait for your approval. Both are covered on [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

### Long conversations

In a long conversation, MAIA keeps what matters: what you asked for, the decisions made, and the state of the data. Details from early in the chat can fade, so restate the objective if the run has drifted, or save the method as a [skill](https://maia-analytics.com/docs/capabilities/skills) first. Now and then MAIA asks you to start a new chat. The project's data is untouched either way.

### Limits

- **A run keeps going when you leave.** It runs on MAIA's servers. Closing the project or the browser does not stop it.
- **One run per project at a time.** Several projects can run at once.
- **A run has a time limit.** Send a long job as several short requests.
- **A stop keeps what MAIA finished.**
- **A large result goes to a layer**, where you see all of it. The chat holds the summary.

Every limit is on [Limits](https://maia-analytics.com/docs/reference/limits).

## Sub-agents

MAIA is a coordinated system of agents. The main agent runs the conversation, and when a question needs research on every row, it hands the tasks to a sub-agent. Hundreds run at once, in the background, and none of them holds up the main agent.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/sub-agents

### One conversation, many researchers

You talk to one agent. Behind it is a system. When your objective needs a fact the data does not hold, for every place on a list, the main agent does not research the list itself. It writes the question once, hands the tasks to a sub-agent, and goes on with the conversation.

Sub-agents are the main agent's research tool. Each takes one row and one question, goes as deep as that row needs, and returns an answer with the evidence for it. Hundreds run at once, and their work lands in the table as it finishes.

### Built for the job

MAIA gives each sub-agent the row, the question, and tools for the job: reading records, researching the web, or inspecting overhead imagery. Its instructions define the answer format and when to return a value or mark it unavailable. The main agent tests the method on a small batch before running it across the table.

### What gets delegated

Anything that has to be found out about one place at a time.

| The question | What the sub-agent does |
| --- | --- |
| Is this roof ready for solar? | Reads the overhead image of that roof |
| Does the owner occupy this building? | Compares the owner with the occupant, in the records and on the web |
| Who runs this business, and how do I reach them? | Resolves the entity and finds the person |
| Has this company published an ESG commitment? | Searches the web and reads what it finds |

The main agent phrases the question, tests it on a few rows, and corrects it before it dispatches the rest. The kinds of question MAIA can research are on [Enrichments](https://maia-analytics.com/docs/enrichments/overview).

### What comes back

Every sub-agent returns the same three things, in one cell.

- **A value**, typed as yes or no, a number, a category, a link, or text.
- **The reasoning**, in one or two sentences that lead with the finding.
- **The sources** the answer rests on.

When a sub-agent finds nothing it can support, it says what it checked and returns no value. The cell reads **Unavailable**. It never fills the gap with a guess.

![Four enrichment columns side by side: Owner Residential Mailing Address, Single Tenant Facility, Public ESG Commitment, and Roof Solar Readiness. Cells read Enrich, Unavailable, True, False, and Excellent.](https://maia-analytics.com/product-shots/docs/table-mixed-cells@2x.png)

Four questions, answered row by row. Unavailable is where nothing supported an answer. Owner residential mailing research requires MAIA staff to enable it for your workspace.

### Nothing waits on them

Sub-agents run on MAIA's servers, in parallel, and the main agent does not block on them. While rows fill in you can keep talking to it, open the map, or close the project and come back. The rows are still there, and so is the answer.

The one thing that waits is the main agent's answer. It reads the finished cells and checks the result before it quotes a value. See [Main agent](https://maia-analytics.com/docs/capabilities/main-agent).

### What MAIA checks

An answer from web research is screened before it is saved. One with no research behind it is rejected: the cell reads **Unavailable** and the row is not charged. An honest "could not determine" passes. The screen is for research that was never done, not for answers you would disagree with.

### Limits

- **No automatic retry.** A run skips Unavailable rows. Run them again with **Re-run unavailable rows** in the column menu, which spends credits.
- **Each question has a research budget.** A sub-agent stops when it reaches it, so a hard row comes back Unavailable rather than running on.

### Related

- [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment) covers how a run is sized and how you start one.
- [Enrichments](https://maia-analytics.com/docs/enrichments/overview) covers what a researched column is.

## Data

Data is what MAIA's agents can read. There are three kinds: the core data MAIA holds, the data you bring, and public data MAIA finds during a run. Every column built from them names where it came from.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/data

### The three kinds of data

| Kind | What it is | Read more |
| --- | --- | --- |
| Ours | Parcels, buildings, businesses, flood zones, census data, and more, already loaded. Not every dataset is loaded in every county | [Core data](https://maia-analytics.com/docs/capabilities/core-data) |
| Yours, kept in sync | Tables from your own database, copied daily. Enterprise plans only, enabled by MAIA staff and set up by a workspace admin | [Database sync](https://maia-analytics.com/docs/capabilities/database-sync) |
| Yours, uploaded | A spreadsheet or a map file you hand over | [File upload](https://maia-analytics.com/docs/capabilities/file-upload) |
| The world's | Public GIS layers that MAIA finds and loads during a run | [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery) |

All four routes end up in the same place: layers or tables in the project, joined on parcels wherever the rows have a location.

> **You ask:** Map our stores and every competitor. Find high-demand trade areas beyond their coverage.

That one objective draws on two kinds. The stores come from a file you uploaded. The competitors and the demand come from core data.

### How the agent chooses

MAIA's agent reaches for data in a fixed order and stops at the first source that answers: the project's own data, then core data, then a public GIS layer, then research row by row. Records are read in seconds. Research takes longer, each row spends credits, and a run above your row limit stops for your approval. See [Main agent](https://maia-analytics.com/docs/capabilities/main-agent) and [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

### How a column names its origin

Every column header in the table says where the column came from: Dataset, Joined from, Calculated by MAIA, Imported data, Enrichment, or Source unavailable. The full list is on [Review](https://maia-analytics.com/docs/using-maia/review#headers). "Dataset" and "Joined from" link to the dataset's page in the product's data catalog.

### Rules that hold for every kind

- **Layers stay inside the project's selected counties.** A project can cover several counties. When you add a county, a layer keeps the rows it has until you ask MAIA to rebuild it.
- **Source data is read-only.** The agent writes only to the layers it builds.
- **Coverage varies by county.** The **Data catalog**, under your account menu, shows what each county holds.
- **A blank is unknown.** MAIA never reads a missing value as zero, as absent, or as vacant.

Every limit, with its number, is on the [Limits](https://maia-analytics.com/docs/reference/limits) page.

### In this section

- [Core data](https://maia-analytics.com/docs/capabilities/core-data.md): MAIA's core data takes a question about a county and returns rows from the datasets MAIA already holds: parcels, buildings, businesses, environmental records, census data, and more, joined on one spatial model.
- [Database sync](https://maia-analytics.com/docs/capabilities/database-sync.md): When enabled by MAIA staff for an Enterprise workspace, MAIA's database sync takes tables from your own database and returns them inside your workspace, matched to parcels and refreshed every day.
- [File upload](https://maia-analytics.com/docs/capabilities/file-upload.md): MAIA's file upload takes a spreadsheet or a map file and returns a layer matched to parcels, a layer of your own shapes, or a table.
- [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery.md): MAIA's data discovery takes a question that core data cannot answer and returns a public GIS layer, found during the run, clipped to the project's selected counties, and saved with its source and usage terms.

## Core data

MAIA's core data takes a question about a county and returns rows from the datasets MAIA already holds: parcels, buildings, businesses, environmental records, census data, and more, joined on one spatial model.

Updated: 2026-10-15. Source: https://maia-analytics.com/docs/capabilities/core-data

### What it answers

Any question the loaded datasets answer on their own. MAIA filters and joins them into a layer, and no research runs. Use it at Define, to decide whether the records can answer your objective before you write it.

> **You ask:** Find parcels between two and seven acres within a quarter mile of a substation, zoned industrial.

### What you get

MAIA holds the records that describe a place and what is around it: parcels and their ownership, buildings and businesses, flood and environmental records, census demographics, boundaries, land use, schools, roads and the electric grid, permits, and incentive zones. Every dataset is included in every plan.

The full catalog lives inside the product, on the data catalog, where each dataset is listed with its source, its coverage, and its date. It is always expanding, and it is kept in one place so that it stays current. The website does not repeat it.

![The Data catalog page inside MAIA. A list of dataset families on the left, from Parcels & buildings to Tax incentives. On the right, Property parcels with its source, a description, a badge reading Records in 3,144 of your 3,144 counties, and three questions you can ask.](https://maia-analytics.com/product-shots/docs/data-catalog@2x.png)

The data catalog, under your account menu. Each dataset shows its source, its coverage in your counties, and what you can ask of it.

A parcel record carries ownership and mailing address, land use and the zoning code as the county publishes it, assessed and market values, tax amount and delinquency, lot size and dimensions, last sale, and structure details.

> **Note:** Depth varies by county. Some counties publish a boundary and a parcel number and nothing more. Check what your county holds in the catalog before you define an objective that depends on a field.

### How the data fits together

- **Everything joins on the parcel.** Buildings, businesses, permits, listings, and census geography all attach to the parcels they sit on, so one question can reach across all of them.
- **Distance is straight-line unless you ask for travel.** "Within a mile" is measured as the crow flies. "Within a ten-minute drive", walk, or bike ride is routed over the road network, with both ends inside the project's selected counties. Times assume free-flowing roads.
- **The agent queries the data. It never changes it.** Source data is read-only, and the agent writes only to the layers it creates.

### Freshness

Each dataset carries a date. Read it before you rely on a value. A listing is a snapshot with a date, not current availability. Census data belongs to a release. A traffic count belongs to a year.

### Recorded and modeled values

| Value | Kind | How to read it |
| --- | --- | --- |
| Sale price from the public record | Recorded | The price as recorded |
| Sale price marked as an estimate | Modeled | An estimate. MAIA says so when it quotes one |
| Elevation, slope, corner lot | Calculated by MAIA | Computed from terrain and road data |
| Zoning | Recorded | The zoning on record. It is not a ruling on what you may build |
| Vacant | Recorded | Mail vacancy as reported. It does not mean vacant land |

### Limits

- **A project holds up to 200 counties.** Counties with a very large number of parcels make queries slower, and MAIA tells you when you add them. See [Limits](https://maia-analytics.com/docs/reference/limits).
- **A query has a time limit.** MAIA gives each query the time its work needs. One that runs too long is stopped, and MAIA narrows it.
- **250,000 features per layer.** Above that, MAIA asks you to narrow the objective.
- **Parcels are not always polygons.** In a county with no parcel boundaries, a parcel is an address point. Adjacency and containment cannot be computed there, and area is blank. A parcel with no building footprint is not therefore vacant.
- **Sparse datasets are not complete.** For permits and listings, an empty result means the data is not loaded there. It does not mean zero.

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | State the objective in chat. The layer lands on the map and in the table |
| MCP | Put the objective in the `request` of `create_project`. `get_project` lists the layers, columns, and row counts. To read rows, open the project link |

### Related

- [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery) finds a public layer when core data does not hold the answer.
- [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) adds the debt on a parcel.
- [Limits](https://maia-analytics.com/docs/reference/limits) lists every number in one place.

## Database sync

When enabled by MAIA staff for an Enterprise workspace, MAIA's database sync takes tables from your own database and returns them inside your workspace, matched to parcels and refreshed every day.

Availability: Enterprise. Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/database-sync

### What it answers

Questions that need your records beside MAIA's: your customers, your sites, your jobs.

> **You ask:** Which of our customers' portfolios have buildings we haven't served?

### What you get

Each table you choose becomes a table in your workspace. MAIA adds the parcel each row belongs to, so the agent can join your rows to everything else. The sync runs every day, and each sync replaces the table whole, so a project never reads a half-updated copy.

MAIA connects to four kinds of database:

- PostgreSQL
- MySQL
- Microsoft SQL Server
- Snowflake

### Connect a database

MAIA staff turn the feature on for your workspace. After that, a workspace admin sets it up. Other members see "Only workspace admins can connect a database."

1. Open the account menu and choose **Data connections**, then **Connect a database**.
2. Name the connection and pick the database type.
3. Sign in on the form MAIA opens. The form belongs to MAIA's replication provider, which holds your login and runs the schedule. MAIA keeps only the provider's connection identifiers. When sign-in succeeds, MAIA lists the tables it can see.
4. Choose the tables to sync. A table over 50,000 rows is skipped, and the connection reads **Needs attention**.
5. Choose **Save and start syncing**. The first sync starts at once.

> **Note:** Address matching works only inside the counties your workspace holds. A national customer list will mostly land "not on the map" until those counties are in your plan. Rows with a geometry or coordinates are placed anywhere.

### How rows are placed

MAIA detects where each table's rows are. It tries three things in order, and you map nothing by hand.

| Order | MAIA looks for | Rows are placed by |
| --- | --- | --- |
| 1 | A geometry column in WKT, WKB, or GeoJSON | The shape itself |
| 2 | Latitude and longitude columns | The parcel the point falls in |
| 3 | An address column | A match against MAIA's own address and parcel data |

An address counts as matched only when exactly one parcel fits. The connection card reports the share of rows **Matched to parcels**. A table with no location still syncs. It is available as a table and is marked "No location found; not on the map".

### Schedule and controls

The sync runs every day at 02:00 in the time zone of the admin who connected it. The schedule cannot be changed in the app. An admin can **Sync now**, **Pause**, **Resume**, and **Disconnect** from the connection card.

### What the agent sees

For each synced table, the agent is told the source, how the rows were placed, the last sync time, and the match rate. It is warned when a connection is failing. In a project, it is told to keep to the rows inside that project's selected counties.

### What disconnect deletes

Disconnect removes the connection and the synced tables from your workspace at once. Any copy MAIA still holds is deleted afterward. MAIA keeps a record that the connection existed.

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Set up and manage the connection under **Data connections** |
| MCP | Connections are managed in the web app. Once synced, the agent uses the tables in any request |

### Related

- [File upload](https://maia-analytics.com/docs/capabilities/file-upload) brings in a single file, with no connection to keep.

## File upload

MAIA's file upload takes a spreadsheet or a map file and returns a layer matched to parcels, a layer of your own shapes, or a table.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/file-upload

### What it answers

Questions that start from a list you already have.

> **You ask:** Map these conference attendees to their property portfolios. Who should I call about solar?

### What you get

Your rows on the map, joined to the parcels they name, with a count of the rows that did not match.

MAIA suggests one of three ways to bring the file in. You can pick another.

| Route | The file holds | You get |
| --- | --- | --- |
| **Match to parcels** | Addresses | Your rows joined to parcels |
| **Add as map layer** | Shapes or coordinates | A layer of your own features |
| **Add as table** | Rows with no location | A table the agent can read and join |

Accepted formats are CSV, TSV, Excel, Parquet, GeoJSON, KML, KMZ, GeoPackage, and zipped Shapefile. The details are on the [File formats](https://maia-analytics.com/docs/reference/file-formats) page.

### Upload a file

1. Choose **Upload file** from the chat menu or the project's management page, and pick one file. A Shapefile goes in as one zip that holds its `.prj`.
2. Accept the route MAIA suggests, or pick another. Rows outside the project's selected counties are skipped. A new project from a file covers one county, so upload a list that spans counties into a project that already covers them, or split it by county.
3. Choose what to keep. **Matched parcels** keeps only the rows that matched. **All rows** keeps everything, and unmatched rows show in the table with no location on the map.

> **Note:** A file with more rows than the limit does not fail. Choose **Import first rows** to bring in the rows that fit. The limits are 10,000 rows for a layer or a table, and 1,000 rows for address matching.

### How MAIA reads the file

MAIA decides the route from the file itself. No model is involved, so the same file gets the same offer every time.

- A column is read as an address when its header and its first rows look like addresses. If your address column is not offered, check both.
- Geometry is read from latitude and longitude columns, WKT, GeoJSON, or a map format.

### How matching works

MAIA judges each address one part at a time: house number, street name, and street type. A row is matched only when one parcel fits it outright. When the address is empty, outside the project's selected counties, not in the data, or fits several parcels, MAIA leaves the row unmatched rather than guess. There is no review step, so check the count of unmatched rows when the import finishes, and keep **All rows** if you want to see which ones they were.

### Limits

| Limit | Value |
| --- | --- |
| File size | 25 MB |
| Size after unpacking | 200 MB |
| Rows, as a map layer or a table | 10,000 |
| Rows, for address matching | 1,000 |
| Files per upload | One |

- **Shapes outside the project's selected counties are skipped.** MAIA reports how many.
- **Owner occupancy does not run on an uploaded layer.** Match the list to parcels first, and the other enrichments run on the matched rows. See [Property details](https://maia-analytics.com/docs/enrichments/property-details).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Choose **Upload file** from the chat menu or the project's management page |
| MCP | Attach the file in your client and say which project or county it goes to. See [Upload a file from Claude or ChatGPT](https://maia-analytics.com/docs/mcp/upload-a-file) |

### Related

- [Database sync](https://maia-analytics.com/docs/capabilities/database-sync) keeps a table current without a new upload.
- [Contacts](https://maia-analytics.com/docs/enrichments/contacts) finds the people behind the owners in your list.

## Data discovery

MAIA's data discovery takes a question that core data cannot answer and returns a public GIS layer, found during the run, clipped to the project's selected counties, and saved with its source and usage terms.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/capabilities/data-discovery

### What it answers

Questions about things a local government maps and MAIA does not hold: a planned road, a utility service area, a zoning overlay. MAIA reaches for discovery only when core data does not answer. See [Data](https://maia-analytics.com/docs/capabilities/data).

> **You ask:** Find retail-zoned corner lots near newly approved roads.

### What you get

A new layer in the project, holding the public layer's features inside your project's selected counties. Open the layer to read its description. It records five things.

| Field | What it holds |
| --- | --- |
| Source | The publisher and the address of the service |
| Area | The selected counties the layer was clipped to |
| Subset | The filter applied, in plain language, when there is one |
| Source choice | Why the agent picked this layer over the others |
| Usage terms | The license the publisher states |

> **Note:** Read the usage terms before you export or publish a discovered layer. The agent skips a layer whose license restricts your use, but the terms are the publisher's, and they travel with the layer so that you can read them yourself.

### How it works

1. **Search.** The agent searches public GIS catalogs for layers that cover the project's selected counties.
2. **Inspect.** For each candidate, the agent reads the publisher, the fields, the number of features in the selected counties, the last edit date, and the license.
3. **Choose.** The agent picks the candidate that answers the question.
4. **Fetch.** MAIA pulls the features, clips them to the selected county boundaries, and saves the layer. A feature that crosses the boundary is cut at it.

Discovery happens inside a run, and the run spends credits like any other. See [What uses credits](https://maia-analytics.com/docs/billing/usage).

### Refresh a layer

Ask MAIA to refresh the layer. It pulls the features again from the same source with the same filter, so the layer is as current as its publisher.

### Limits

- **Over 10,000 features, the fetch is narrowed by an attribute**, such as one zoning class, so the layer fits. MAIA tells you which filter it applied.
- **The project needs a county.** Discovery clips to the project's selected counties.
- **Public GIS services only.** MAIA reads layers that a publisher serves publicly. It does not read open data portals of other kinds, and some services cannot be fetched.
- **A discovered layer is as current as its publisher.** The last edit date is in the description.

| Limit | Value |
| --- | --- |
| Features per fetch | 10,000 |

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | State the objective in chat. MAIA reports the layer it found and why it chose it |
| MCP | State the objective in the `request` of `create_project` or the `message` of `send_message`. The agent can find and add a public layer in the same run |

### Related

- [Core data](https://maia-analytics.com/docs/capabilities/core-data) is what MAIA checks first.
- [Web research](https://maia-analytics.com/docs/enrichments/web-research) answers what no layer holds.

## Context

Context is what MAIA remembers between runs. Skills hold your method, and knowledge holds what MAIA should know about you and your work.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/context

### Why it matters

Context is what makes [Compound](https://maia-analytics.com/docs/using-maia/compound) work. A skill carries your method to the next county. Knowledge carries your context to the next project. A run starts better when MAIA already knows how you work and who you are.

### Two kinds of context

Those are two different things, and MAIA stores them apart.

| Ask | Skills | Knowledge |
| --- | --- | --- |
| Holds | A method: criteria, thresholds, steps, and output format | Context: your business, your markets, your terms |
| Answers | How do we do this? | Who is asking? |
| Loaded | When a run needs it | The core file on every turn, other entries when a run needs them |
| Tied to a place | No. A skill runs in any county, so it must not name one | Project knowledge is. It ends with the project |
| Read more | [Skills](https://maia-analytics.com/docs/capabilities/skills) | [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) |

### Scopes side by side

Both are scoped. The scope decides who can see an entry and where MAIA uses it.

| Scope | Skills | Knowledge |
| --- | --- | --- |
| Personal | Private to you, in every project | Private to you, in every project |
| Workspace | Everyone in the workspace can run it | Everyone in the workspace, on every turn |
| Project | None | Project memory, which lives and ends with the project |
| System | MAIA's ready-made skills, which are read-only | None |

### How context reaches a run

Only the core knowledge files load on every turn, one per scope. Everything else waits until a run asks for it: MAIA sees one line per skill, a name and a description, and loads a skill's full instructions only when a run calls for it. That keeps a run focused on the question in front of it.

Three things follow:

- **What you put in a core file costs attention on every run.** Keep it to what is true of all your work.
- **A skill that names a county or city will not carry to the next county.** Leave the place out.
- **MAIA saves a lasting fact to knowledge on its own** when you state one. Read what it holds from time to time.

### In the app and over MCP

Both kinds live under your account, on the **Knowledge & skills** tab. A project's own memory is on the project's **Project memory** tab. Over MCP, `list_skills` and `save_skill` handle skills, and `save_to_maia_memory` writes knowledge. The `teach_maia` prompt fills in a profile of your work. See [Tools](https://maia-analytics.com/docs/mcp/tools) and [Prompts](https://maia-analytics.com/docs/mcp/prompts).

### In this section

- [Skills](https://maia-analytics.com/docs/capabilities/skills.md): A MAIA skill takes a method you have worked out and returns a run you can repeat. It records the criteria, the steps, and the output format, and it runs in any county.
- [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge.md): MAIA's knowledge takes what you tell it about your business and returns it as context on every turn. It is filled in automatically, open to inspection, and yours to edit.

## Skills

A MAIA skill takes a method you have worked out and returns a run you can repeat. It records the criteria, the steps, and the output format, and it runs in any county.

Updated: 2026-10-01. Source: https://maia-analytics.com/docs/capabilities/skills

### What it answers

You worked out a filter that finds the right sites. A skill saves it, so the next run starts from your method and not from a blank box.

A skill is not tied to a place. The method you wrote for one county runs in the next.

### Scopes

| Scope | Who sees it | Who can change it |
| --- | --- | --- |
| Personal | You | You |
| Workspace | Everyone in the workspace | Editors and admins |
| System | Everyone | No one. These are MAIA's ready-made skills |

A ready-made skill is read-only. To change one, customize a copy. MAIA then proposes your copy to you instead of the original, and the original stays in the list for everyone else.

### Types

| Type | What it does |
| --- | --- |
| Workflow | Runs end to end, starting from an empty project |
| Enrichment | Adds a value worked out from the columns a row already has |
| Agent column | Builds one column that sub-agents research |

Over MCP the type is the `kind` parameter of `save_skill`. A workflow can appear in the starter gallery on the new-project screen.

### Three ways to start one

| Way | How |
| --- | --- |
| You pick it | Type `/` in the chat and choose a skill |
| MAIA proposes it | MAIA offers a matching skill on a card. It runs only when you choose **Run** |
| Over MCP | Pass `skill` to `create_project` or `send_message`, or use the `run_skill` prompt |

### What a run looks like

A skill with several phases runs as a plan. MAIA shows the phases as a checklist and marks each one pending, in progress, completed, or skipped. A plan holds up to 50 phases.

![The skill's plan in the chat: a checklist headed Ten-site ESG solar shortlist 5/5 with five phases, each crossed out with a check mark, and View activity (29) below it.](https://maia-analytics.com/product-shots/docs/chat-plan@2x.png)

A skill's plan in the chat. Each phase is checked off as it finishes.

### What a skill contains

Every skill has a name, a description, and a body. Over MCP the body is the `instructions` parameter.

| Part | What it is for | Limit |
| --- | --- | --- |
| Name | The words you would say to run it | 120 characters |
| Description | What the skill does and when to use it. A vague description means MAIA never proposes the skill | 400 characters |
| Body | The instructions for the run | 32,000 characters |

The body has a recommended layout in four parts. It is guidance, and a skill that does not fit it is still valid.

| Section | What goes in it |
| --- | --- |
| What it finds | One or two sentences of intent |
| Criteria and thresholds | Every number you might change later, named |
| Steps | The order of work |
| Output format | The columns you want, with one example |

### How MAIA reads a skill

MAIA does not read every skill on every turn. It sees one line per skill: the name and the description. When a run calls for a skill, MAIA loads the full instructions.

Two things follow from that.

- **The description does the routing.** It is all MAIA sees before it loads the skill. Say what the skill does and when to use it.
- **Loading is not running.** MAIA can read a skill to answer a question about it without starting a run.

### Save, change, or share a skill

MAIA can write a skill for you from the work in a conversation. It never saves one silently.

1. Ask for it in the chat, in your own words.

> **You ask:** Save this as a workspace skill called Industrial infill filter.

1. Read the card MAIA shows. Check that the skill names no county, city, or project, and that its description says when to use it.
2. Choose **Approve**. Saving, updating, and deleting a skill each need your approval on a card.

To change a skill later, ask MAIA in the chat or edit it under your account, on the **Knowledge & skills** tab. That is also where you move a personal skill to the workspace.

Three things to know before you save:

- **Saving with an existing name replaces your skill of that name.**
- **A workspace skill is visible to everyone in the workspace.** Save to yourself first if the method is still changing.
- **MAIA saves, changes, or deletes one skill per message.** To do two, ask twice.

### Limits

- **No hard-coded places.** A skill must not name a county, a city, or a project. It reads the place from the project it runs in.
- **It must survive missing data.** Records vary by county. Write the skill to check which columns a county has before it filters on one.
- **Workspace skills need the editor role.** A viewer cannot change them.
- **Over MCP, `save_skill` writes your personal skills only.** Workspace skills are edited in the web app.

### Related

- [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) holds the context a skill should not repeat.
- [Compound](https://maia-analytics.com/docs/using-maia/compound) explains when to turn a run into a skill.
- [Prompts](https://maia-analytics.com/docs/mcp/prompts) lists the ready-made MCP prompts, including `create_skill`.

## Knowledge

MAIA's knowledge takes what you tell it about your business and returns it as context on every turn. It is filled in automatically, open to inspection, and yours to edit.

Updated: 2026-10-01. Source: https://maia-analytics.com/docs/capabilities/knowledge

### What it answers

Without knowledge, every project starts with the same introduction: what your company does, which markets you work, what a good site means to you. Knowledge holds that once, and MAIA reads it before you ask.

### Levels

| Level | Who sees it | Where MAIA uses it |
| --- | --- | --- |
| Project | Everyone who can open the project | That project only. It ends with the project, so move anything lasting to a higher level |
| Personal | You | Every project you work in |
| Workspace | Everyone in the workspace | Every project in the workspace |

When two levels disagree, the narrower one wins. Project knowledge outranks personal knowledge, and personal knowledge outranks workspace knowledge. In the app, project knowledge is the project's **Project memory** tab.

### The core file and the rest

Each level has one core file and any number of other entries.

| Kind | When MAIA reads it | Limit |
| --- | --- | --- |
| Core file | In full, on every turn | 100,000 characters |
| Other entries | When a run calls for one | 8,000 characters each |

In the web app, the core file carries an **Always on** badge. Keep it to what is always true of your work. MAIA reads it on every turn, so everything in it costs attention. Put the rest in other entries.

MAIA reads knowledge as background, not as commands. A saved preference shapes the work. It does not override what you ask for in the chat.

### How it fills in

Knowledge starts before you write a word of it.

- **At signup.** MAIA researches the organization behind your work email domain and writes a short profile into the workspace core file. A personal email domain is skipped. The profile never includes people or contact details. Read it and change what is wrong.
- **As you work.** When you state a lasting fact or a preference, MAIA saves it without asking and tells you where it put it. What it learns inside a project goes to that project's memory. Read what MAIA has saved from time to time, and delete an entry you do not want kept.
- **When you write it.** Add an entry yourself at any time.

MAIA does not save secrets, such as passwords or keys.

### Add an entry

1. Open your account and choose **Knowledge & skills**. For a project's own memory, open the project's **Project memory** tab instead.
2. Choose the level: personal or workspace. Viewers can read workspace entries. Editors and admins can change them.
3. Give the entry a title, and answer **What should MAIA know?**

An entry written by hand might read like this.

> **Note:** **Buy box.** Industrial parcels in Maricopa County, Arizona, between two and seven acres, zoned industrial. Exclude parcels owned by a public agency.

### Writing to it over MCP

Claude, or another MCP client, can write knowledge for you.

| Tool or prompt | What it does |
| --- | --- |
| `save_to_maia_memory` | Adds a titled section to your core file, or replaces the section with the same title |
| `teach_maia` | Drafts a short profile of your work and saves it |

Both tell your client to show you the note and save it only after you say yes. Read the draft before you agree. `teach_maia` leaves out personal details that are not about your work.

### What to put in it

Put in:

- Your buy box and your thresholds.
- Your service territory.
- The terms your team uses.
- Owners or uses you always exclude.

Leave out:

- Anything that belongs to one run. Put that in the question.
- A method with steps. Save that as a [skill](https://maia-analytics.com/docs/capabilities/skills).
- Passwords, keys, and other secrets.
- Personal details about people.

### Related

- [Skills](https://maia-analytics.com/docs/capabilities/skills) hold method, where knowledge holds context.
- [Define](https://maia-analytics.com/docs/using-maia/define) explains what belongs in the objective itself.
- [Data and privacy](https://maia-analytics.com/docs/reference/data-and-privacy) explains how MAIA handles what you tell it.
- [Limits](https://maia-analytics.com/docs/reference/limits) lists every number in one place.

## Workspace

A workspace is where work in MAIA lives. It holds your team, your projects, and what MAIA has learned about your business, and each project's owner decides who else can see it.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/workspace

### How the pieces relate

A workspace holds people, credits, and projects. A project holds the layers, the views, the chat, and its own memory. Personal and workspace skills and knowledge sit beside the projects, so what you save at those levels is there in the next project. Project memory stays with its project.

Sharing works in two ranges: inside the workspace and outside it. Inside, you set a project's access level and your colleagues open it as themselves. Outside, you send a link, and the viewer sees the map and the table without the researched values or the contacts.

### What is shared and what stays private

A workspace shares by choice. A project starts private, and you open it up.

| Thing | Who can see it |
| --- | --- |
| A project | Only you, until you set its access to **Can view** or **Can edit** |
| Project memory | Everyone who can open the project |
| A workspace skill | Everyone in the workspace |
| A personal skill | Only you |
| Workspace knowledge | Everyone in the workspace. MAIA reads it in their conversations too |
| Personal knowledge | Only you |
| Favorites | Only you |
| Credits | Everyone in the workspace. Any member's chat and enrichments spend from the one balance |
| A shared link | Anyone who has it, until it expires or you revoke it. A gated link asks for a work email first |

> **Note:** Credits are one balance. A colleague's enrichment run spends the credits you bought. See [Credits](https://maia-analytics.com/docs/billing/credits).

### Where to find it

| You want | Read |
| --- | --- |
| Your team in the same projects, skills, and knowledge | [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces) |
| A project in the hands of someone outside your team | [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing) |
| A table you can take into another tool | [Export](https://maia-analytics.com/docs/capabilities/sharing-and-publishing#export) |

In the app, the workspace's name and members are under your account, on the **Workspace** tab. A project's access level is set from its **Share** dialog. Over MCP, `list_projects` returns the projects you can open.

### Isolation

Each workspace is isolated. Your layers, uploads, and synced tables live in a database instance that belongs to your workspace alone, and the agent's queries run there with access to that project only. Projects, chat, skills, and knowledge are stored per workspace, and every read is scoped to yours. One workspace cannot read another's. More on how your data is handled: [Data and privacy](https://maia-analytics.com/docs/reference/data-and-privacy).

### Related

- [Skills](https://maia-analytics.com/docs/capabilities/skills) and [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) are what a workspace shares besides projects.
- [Compound](https://maia-analytics.com/docs/using-maia/compound) covers when to share a method with your team.

### In this section

- [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces.md): A shared workspace in MAIA puts a team in the same projects, skills, and knowledge. Each project starts private, and its owner decides whether the workspace can view it or edit it.
- [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing.md): MAIA's sharing takes a project and returns a link you can send to anyone, with or without a MAIA account. Export takes a layer and returns a spreadsheet.

## Shared workspaces

A shared workspace in MAIA puts a team in the same projects, skills, and knowledge. Each project starts private, and its owner decides whether the workspace can view it or edit it.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/shared-workspaces

### What it answers

Research done alone gets done twice. A shared workspace lets a colleague open your project, run your skill, and work from the context MAIA already has about your business.

### Roles

Every member has one role. To see roles, open your account, then the **Workspace** tab. MAIA sets roles when it adds members, and it adds them on request: there is no invite button, so ask [support](mailto:support@maia-analytics.com) to add a colleague.

| Role | What it can do |
| --- | --- |
| Admin | Workspace settings, such as a database connection, on top of an editor's or a viewer's rights |
| Editor | Edit any project set to **Can edit**, and change workspace skills and knowledge |
| Viewer | Open projects set to **Can view** or **Can edit**. Cannot edit either |

A role is about projects, skills, and knowledge. It does not gate spending: any member can buy credits, and any member's runs spend from the workspace's balance. See [Buy credits and auto-reload](https://maia-analytics.com/docs/billing/buy-credits).

### Open a project to the workspace

A project has one of three access levels. A new project starts at **No access**, which the projects page shows as Private.

| Level | Who can open it | Who can edit it |
| --- | --- | --- |
| No access | Only you | Only you |
| Can view | Everyone in the workspace | Only you |
| Can edit | Everyone in the workspace | Editors and admins in the workspace |

To change the level:

1. Open the project's menu and choose **Share**.
2. Choose **Workspace members**.
3. Under **Project access**, pick **Can view** or **Can edit**, and choose **Save**. The project appears on the **Workspace** tab of the projects page for everyone in the workspace.

> **Note:** Before you choose **Can edit**: a project has one chat, and MAIA answers one request at a time, so two people cannot dispatch work in it at once. A colleague's runs spend the workspace's credits. Everyone who can open the project can also read its project memory.

![The Share with workspace dialog. Under Project access, a dropdown lists No access, Can view, and Can edit, each with a one-line description of who can open and edit the project.](https://maia-analytics.com/product-shots/docs/share-access-levels@2x.png)

The three access levels, from the project's Share dialog.

A project set to **Can view** has no chat for anyone but its owner. Colleagues read it. They cannot dispatch work in it.

### What the workspace shares

| Shared | How it is used |
| --- | --- |
| Workspace skills | Anyone in the workspace can run them. Editors and admins can change them |
| Workspace knowledge | MAIA reads it in every member's conversations |
| Credits | Chat and enrichments spend from one workspace balance |
| Projects set to **Can view** or **Can edit** | They appear on the **Workspace** tab of the projects page |

### What stays with you

| Stays with you | Why |
| --- | --- |
| Favorites | The rows you star are your own shortlist |
| Personal skills | A method you have not chosen to share |
| Personal knowledge | Context about you, not about the company |
| Private projects | Work you have not opened to the workspace |

To share a personal skill, save it to the workspace. See [Skills](https://maia-analytics.com/docs/capabilities/skills).

### Isolation

Each workspace is isolated. Your layers, uploads, and synced tables live in a database instance that belongs to your workspace alone, and the agent's queries run there with access to that project only. Projects, chat, skills, and knowledge are stored per workspace, and every read is scoped to yours. See [Data and privacy](https://maia-analytics.com/docs/reference/data-and-privacy).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Open **Share** on a project and choose an access level |
| MCP | `list_projects` returns the projects you can open, including those shared with you. `send_message` works only on a project you can edit. Access levels are set in the web app |

### Related

- [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing) covers people outside the workspace.
- [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) explains the three levels of what MAIA remembers.

## Sharing and publishing

MAIA's sharing takes a project and returns a link you can send to anyone, with or without a MAIA account. Export takes a layer and returns a spreadsheet.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/capabilities/sharing-and-publishing

### What it answers

A finished project has two ways out. A link lets someone look at the map and the table. An export lets you take the rows into another tool.

### Two kinds of link

The kind of link depends on what the project holds. You do not choose it.

| The project has | The link is | What the viewer does first |
| --- | --- | --- |
| A parcel layer | Gated. The viewer table below applies | Enters a work email and accepts the access terms |
| No parcel layer | Open and read-only. The viewer sees the map and your shapes, and no table | Nothing |

### Share a gated link

1. Open the project's menu and choose **Share**.
2. Choose **Public**.
3. Turn on **Public sharing**.
4. Pick when the link expires: 7, 14, or 30 days.
5. Send the link. The viewer enters a work email, accepts the access terms, and the project opens.

![The project's menu, opened from the three dots at the top right of the project. It lists Share, Contacts, Project settings, and Delete project.](https://maia-analytics.com/product-shots/docs/project-menu@2x.png)

Share is the first item in the project's menu.

> **Note:** Gmail and similar personal addresses are refused unless you turn on the setting that allows them for this link. Before a viewer accepts the terms, they see parcel outlines and nothing else. A viewer's session ends after 24 hours, and they enter their email again.

You see who has opened the link under **Viewers**, and you can download that list.

![The Share this project dialog. Under Who can access, two rows: Public, share with web link, and Workspace members, each reading No access with an arrow to open it.](https://maia-analytics.com/product-shots/docs/share-dialog@2x.png)

The Share dialog. Public is the link for people outside the workspace.

### What a viewer sees

| A viewer sees | A viewer does not see |
| --- | --- |
| The map | Enrichments, including their reasoning and sources |
| The table | Contacts |
| Views and filters | Mailing addresses |
| The parcel columns MAIA allows in a link | Any way to export |
| The conversation, read-only | A chat box. A viewer cannot dispatch work |

A link shows less than the project. That is deliberate. Researched values and contact data stay inside your workspace.

### Revoke a link

Turn off **Public sharing** and the link stops working at once, for everyone who has it. To change a link's settings, revoke it and create a new one. The old link does not carry over.

### Export

Export is turned on per workspace. If you do not see **Download CSV** or **Download Excel**, ask [support](mailto:support@maia-analytics.com) to turn it on.

Export writes a layer as the table shows it, filters applied. A filtered view exports fewer rows than the layer holds.

1. Open the table's options menu and choose **Download CSV** or **Download Excel**.
2. Choose whether to include the reasoning and the sources behind each researched value. Include both when someone else will rely on the file.
3. Choose which contact fields to write.
4. Download. A table over 10,000 rows is refused, so filter it first.

![The table's options menu open, listing Download CSV and Download Excel.](https://maia-analytics.com/product-shots/docs/table-options@2x.png)

Download CSV or Download Excel from the table's options menu.

Saved contacts export on their own, as CSV, from the **Contacts** page.

### Limits

- **10,000 rows per export.**
- **Restricted uses still apply** to anything you export. See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).
- **A link expires in 7, 14, or 30 days.** Every number is on [Limits](https://maia-analytics.com/docs/reference/limits).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | **Share**, in the project's menu, for links. The table's options menu for export |
| MCP | Every answer carries a link to the project in MAIA. Links for outside viewers, and exports, are made in the web app |

### Related

- [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces) covers sharing with your own team.
- [Review](https://maia-analytics.com/docs/using-maia/review) covers what to check before you send a result out.

# Enrichments

Columns MAIA fills by research: what they return, who starts them, and each kind.

## Enrichments

An enrichment is a column MAIA fills by research, one row at a time. It takes a question and a set of rows and returns a value for every row, with the reasoning and the sources behind it.

Updated: 2026-09-29. Source: https://maia-analytics.com/docs/enrichments/overview

### What an enrichment is

An enrichment is a column with a question attached. MAIA asks the question of each row and researches the answer for that row alone.

A filter reads a value the data already holds. An enrichment finds a value the data does not hold.

![The column menu open on an enrichment column named Owner Contact Info, beside a filled column of Enrich buttons. Its description reads Finds parcel owner contact information including name and contact details. Below that, Source: Enrichment: Owner contact, Data type: Contact, and 0 of 10 enriched.](https://maia-analytics.com/product-shots/docs/column-menu-enrich@2x.png)

A researched column's menu names its question, its kind, its type, and how many rows have run.

| Part | What it is |
| --- | --- |
| The question | What the column asks, in plain words |
| The type | Yes or no, a number, a category, a link, or text |
| The kind | The kind of research that answers it. See [Kinds of enrichment](https://maia-analytics.com/docs/enrichments/overview#kinds) |
| The rows | The layer it runs on, in whole or in part |

### What a researched cell holds

Every researched cell holds the same three things.

| Part | What it holds |
| --- | --- |
| Value | The answer, in the column's type |
| Reasoning | One or two sentences, finding first |
| Sources | The records, pages, or images the answer rests on |

![A table cell reading Excellent under the column Roof Solar Readiness, with its reasoning panel open below it. The panel reads Roof Solar Readiness = Excellent, then Reasoning: the building shows a very large, predominantly flat and contiguous white roof with broad unobstructed sections, only limited rooftop equipment and small vents, and no obvious solar panels, heavy shading, unusual geometry, or severe deterioration.](https://maia-analytics.com/product-shots/docs/reasoning-satellite@2x.png)

One researched cell, opened. The value is in the cell, and the reasoning is in the panel.

When MAIA finds nothing it can support, the cell reads **Unavailable** and the reasoning says what was checked. MAIA does not fill the gap with a guess.

![A table cell reading Unavailable under the column Owner Occupied, with its reasoning panel open below it. The panel reads Owner Occupied = Unavailable, then Reasoning: no parcel owner, mailing address, or occupant records were returned, and the name FedEx Ground alone cannot establish occupancy. Sources (2) sits at the bottom.](https://maia-analytics.com/product-shots/docs/reasoning-unavailable@2x.png)

An Unavailable cell, opened. MAIA says what it checked instead of guessing.

### Kinds of enrichment

You name what you want to know, and MAIA picks the kind that answers it.

| You want | MAIA uses |
| --- | --- |
| A fact visible from above, such as roof type or paving | [Computer vision](https://maia-analytics.com/docs/enrichments/computer-vision) |
| The person behind an owner, and how to reach them | [Contacts](https://maia-analytics.com/docs/enrichments/contacts) |
| Loans, liens, and foreclosure filings on a parcel | [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) |
| Whether the owner occupies the building, or who the tenants are | [Property details](https://maia-analytics.com/docs/enrichments/property-details) |
| Anything else that is on the public web | [Web research](https://maia-analytics.com/docs/enrichments/web-research) |
| A value worked out from the row's own columns | Row data only. No web search is involved |

[Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents) research every kind but one, one sub-agent per row. Mortgages and liens is a records lookup, so the same parcel returns the same profile every time.

> **Note:** One kind has a limit on where it runs. Owner occupancy does not run on a layer you uploaded.

### Who starts it

An enrichment starts in one of two ways: the main agent starts it, or you do.

| Started by | Where | Who chooses the rows |
| --- | --- | --- |
| The main agent | Chat. You state what you want to know | The agent. It tests on a few rows before it runs the rest |
| You | The table or the map | You, from one cell to the whole list |

Either way, the research is the same and so is the cell. The steps for both are on [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### How a column is designed

MAIA designs every column by these rules, whether you or the agent wrote the question.

- **One question per column.** Two questions make two columns.
- **The simplest type that answers.** In order: yes or no, a number, a category, a link, text.
- **A rubric for judgment calls.** "Rate this roof for solar" becomes a scale with stated criteria, so every row is judged alike.
- **Two catch-alls on every category column.** `no_match` for a row identified with confidence that fits none of the categories. `unknown` for a row that cannot be determined.

### What it costs

Every row you enrich spends credits from your workspace's balance, the same balance that chat spends. The amount depends on the research each row takes.

Filter the table before you run, and you pay only for the rows you care about. See [What uses credits](https://maia-analytics.com/docs/billing/usage).

### Limits

- **An enrichment answers per row.** A question about the whole layer belongs in chat.
- **A value is evidence, not a verdict.** Read the reasoning and open the sources on the rows you will act on. See [Review](https://maia-analytics.com/docs/using-maia/review).
- **MAIA does not run Unavailable rows again by itself.** An ordinary run skips them. Open the column's **Enrich** menu and choose **Re-run unavailable rows**.

## Run an enrichment

An enrichment runs when MAIA's main agent starts it or when you do. The agent tests a new column on a few rows before it runs the rest. You choose the rows yourself, from one cell to the whole list.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/enrichments/run-an-enrichment

### What you end with

A column in which every row you chose holds a value, its reasoning, and its sources, or reads **Unavailable** where nothing supported an answer.

![A table of ten rows. The Property Owner column is filled with company names, and the two enrichment columns beside it, Owner Occupied and Owner Contact Info, show an Enrich button in every cell.](https://maia-analytics.com/product-shots/docs/table-enrich-buttons@2x.png)

A researched column before it runs. Each empty cell offers an Enrich button.

An enrichment starts in one of two ways, and the research is the same either way. See [Enrichments](https://maia-analytics.com/docs/enrichments/overview).

### When the agent runs it

You state what you want to know. The main agent defines the column, picks the kind, and decides how many rows to attempt.

#### It tests before it scales

Before it runs, the agent says how many rows it will try and why.

| Scope | Rows | The question it answers |
| --- | --- | --- |
| Probe | One | Does this column work at all? |
| Sample | A few | Are these the answers you wanted? |
| Full layer | Every row still without an answer | Run it on everything |

A new column's first run is a probe or a sample. The agent judges the sample itself, corrects the column if it needs to, and samples again before it runs the full layer. A badly worded question costs a few rows, not ten thousand. Read the sample rows yourself before you approve the full run.

- A sample is the first eligible rows in order. It is not random.
- You can name the rows instead. A handful of named rows run directly.

![The chat with View activity expanded. MAIA's actions read, in part: I found 32 owner-user candidates. I'm narrowing to 18 strong corporate, healthcare, manufacturing, and nonprofit operators, then testing them in one batch to produce ten true matches.](https://maia-analytics.com/product-shots/docs/chat-activity@2x.png)

The agent says how many rows it will try and why, before it runs the rest.

#### It asks before a large run

A run above your row limit stops on an approval card. The card names the column and the row count, and says that the run spends credits. You choose **Approve** or **Decline**. You set the row limit on your profile page, under **Auto-enrich**. Set it to 0 to be asked every time. The workspace sets a default for everyone who has not set their own.

![The Auto-enrich preference on the Profile tab. It reads: Rows MAIA may enrich while it answers you, before it checks with you first. Rows count once for each column, so 5 rows in 2 columns is 10. Use 0 to be asked every time. A field holds 10.](https://maia-analytics.com/product-shots/docs/profile-auto-enrich@2x.png)

Your row limit is the Auto-enrich setting on your profile. Rows count once per column.

The approval card is described on [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

### When you run it

#### Add the column

1. Choose **Add enrichment** above the table.
2. Type the name of the column you want to see, such as Owner contact info. MAIA configures the column from the name.
3. Wait for the column's **Enrich** menu to open. It is ready when it does.

![The New enrichment popover, opened from the Enrichment button above the table. It reads: Type the name of the new column you want to see, and we'll automatically create it, above a field labelled Enter enrichment name.](https://maia-analytics.com/product-shots/docs/add-enrichment@2x.png)

Add enrichment asks for the column's name. MAIA configures the rest.

#### Run the column

1. Filter and sort the table first. The **Enrich** menu runs the list as you see it, in the order you see it, so filter first and you enrich only the rows you care about.
2. Open the column's menu and choose **Enrich**.
3. Pick how many rows.

| Option | What runs |
| --- | --- |
| First 10 in list | The first ten rows the column has not tried yet |
| First 100 in list | The first hundred |
| All in list | Every row the column has not tried yet |
| Custom | A count you type |
| Re-run unavailable rows | Only the rows that came back Unavailable |

> **Note:** **All in list** on an unfiltered table runs the whole layer, and every row spends credits. MAIA asks you to confirm a large batch before it starts, and one batch has a maximum size. Above it, MAIA runs the first rows and leaves the rest for the next batch.

![The column menu open on an enrichment column named Owner Contact Info. The Enrich item is highlighted and its submenu lists First 10 in list, First 100 in list, All in list, Custom, and Re-run unavailable rows.](https://maia-analytics.com/product-shots/docs/column-menu-enrich@2x.png)

The Enrich menu and its five options.

#### Run one row

Choose **Enrich** in an empty cell to research that row alone. The same button appears on the place's panel on the map, where **Enrich all values** runs every column the place is still missing.

Choose **Retry** on a filled cell to research it again. The row spends credits again, and the new value replaces the old one. If the re-run fails, the old value stays.

![A place's panel on the map, headed FedEx Ground, with its menu open. The menu lists Enrich all values (2) and Add note.](https://maia-analytics.com/product-shots/docs/place-panel-menu@2x.png)

A place's panel on the map. Enrich all values runs every column the place is still missing.

### Three controls on how many rows run

| Control | Who it applies to | What happens |
| --- | --- | --- |
| Your row limit | The agent | Above it, the agent stops on an approval card before it researches |
| The large-batch confirmation | You | Above it, MAIA asks you to confirm before the batch starts |
| The batch maximum | You | One batch runs at most this many rows. Run the column again for the rest |

### Rows that are never run twice

A run skips any row that already has a value, came back Unavailable, is in flight, or was edited by you. A sample followed by a full run covers only what the sample did not.

Change the question and every row is eligible again. Change only the column's name and nothing runs again.

### While it runs

Rows run in parallel as background jobs. They fill in as they finish, and they keep running after you close the project. To stop a run in progress, stop it from the chat. See [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).

### When credits run short

MAIA checks your balance before a run starts. When the balance covers only part of the run, MAIA offers to run the rows you can afford. See [Out of credits](https://maia-analytics.com/docs/billing/out-of-credits).

### Limits

- **No automatic retry.** Use **Re-run unavailable rows**.
- **Your edits are kept.** A run never overwrites a cell you changed by hand.

## Computer vision

MAIA's computer vision takes a parcel, a building, or a point and returns a value read from overhead imagery, with the reasoning behind it.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/enrichments/computer-vision

### What it answers

Some facts are in no record. They are only in the picture: what covers the yard, what sits on the roof, how many cars the lot holds. Computer vision reads them, one place at a time.

> **You ask:** Grade each yard from imagery: paved, gravel, or dirt, fenced or open, class A, B, or C.

| Kind of question | Examples |
| --- | --- |
| Count | Parking spaces, solar panels, pools |
| Condition | Vegetation, paving, building condition |
| Type | Roof type |

### What you get

| Part | What it holds |
| --- | --- |
| Value | The answer, typed as yes or no, a number, a category, or text |
| Reasoning | One or two sentences on what the image shows |
| Sources | Web pages, when the column also searched the web. The image itself is not listed |

When MAIA cannot find the feature in the image, the cell reads **Unavailable** and the reasoning says what it looked for.

![A table cell reading Excellent under the column Roof Solar Readiness, with its reasoning panel open below it. The panel reads Roof Solar Readiness = Excellent, then Reasoning: the building shows a very large, predominantly flat and contiguous white roof with broad unobstructed sections, only limited rooftop equipment and small vents, and no obvious solar panels, heavy shading, unusual geometry, or severe deterioration.](https://maia-analytics.com/product-shots/docs/reasoning-satellite@2x.png)

A satellite cell, opened. The reasoning says what the image shows.

### How it works

MAIA looks at one place at a time, in an overhead image of that place, and answers your question about it. For a parcel or a building, it judges what is inside the boundary, so the warehouse next door does not leak into the answer. For a point, it judges the place around the point.

Three things to know before you rely on a value:

- **A count is an estimate.** Trees, shadows, and image age all cost accuracy. Verify the rows you will act on.
- **The image has a date.** A feature built or removed since the capture will not show.
- **A point takes in its neighbours.** The area around a point can include the lot next door, so a count for a point can include what is not yours. Small features on a very large parcel can go unseen.

### Two ways to run it

| Way | Scope | When to use it |
| --- | --- | --- |
| As a column | Every row in a layer | You want the same visual fact for each place |
| As a single look | One feature | You ask in chat what one place looks like from above |

A column reads imagery only when MAIA built it to. It makes that choice when it builds the column. The column's source line reads **Enrichment**, like any researched column. If a visual question came back Unavailable on every row, ask MAIA to rebuild the column with imagery.

### Limits

- **Overhead imagery only.** MAIA reads satellite and aerial images. It does not read street-level imagery.
- **The image is not shown in chat.** MAIA sees the image. You see the value and the reasoning. To look for yourself, switch the map to the satellite basemap.
- **The capture date is not always known.** When the source does not report one, the reasoning carries no date.
- **Each row spends credits.** Filter the table first. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Ask for it in chat, or choose **Add enrichment** above the table |
| MCP | Ask for it in the `request` of `create_project`, or in a `send_message` |

### Related

- [Web research](https://maia-analytics.com/docs/enrichments/web-research) answers what the image cannot show.
- [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents) explains how a column runs across every row.
- [Review](https://maia-analytics.com/docs/using-maia/review) explains how to check a researched value.

## Contacts

MAIA's contacts enrichment resolves the entity behind a parcel, a building, or a business, then finds the persona you asked for inside it: the owner behind an LLC, or a specific role at the business. Each contact comes with contact details and the evidence for the match.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/enrichments/contacts

### What it answers

A parcel is not a person. The record names an LLC, a trust, or a company, and you need someone who can say yes. Contacts is the tool for that step. On every row it does two things in order.

| Step | What MAIA does | Example |
| --- | --- | --- |
| Resolve the entity | Works out who is really behind the name on the row, through an LLC, a trust, or a company | The deed names a holding LLC. Behind it is the investment firm that formed it |
| Find the persona | Finds the person you asked for inside that entity | The managing member of the LLC, or the head of facilities at the business |

A persona is any target person. The owner behind an LLC is one. So is a specific role at a business, or a specific role within the LLC. You choose the persona; the row supplies the entity.

> **Note:** Each row spends credits. Filter the table to the owners you will call before you run. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

#### The owner behind the entity

When you name no role, this is the persona MAIA looks for: the person who controls the owner of record.

> **You ask:** Find every 2 to 50 unit multifamily building in these San Gabriel Valley cities, and for each owner give me the person behind the LLC and contact information for each of them.

#### A role at a business

On a business row, the entity is the business at the site, not the landlord who owns the parcel under it. Name the role you want there.

> **You ask:** For each distribution center on this list, find the head of facilities or operations, with a work email and a phone number.

#### A role within the owner

Name a role inside the owning entity, and MAIA looks for that person rather than the owner in general.

> **You ask:** For each building, find the facilities director or the managing member, with a phone number and an email.

#### Say who you want

| You ask for | MAIA looks for |
| --- | --- |
| The owner, or nothing | The person who controls the entity on the deed |
| The decision maker | An owner, a principal, or an executive |
| The facilities director | That title, or the nearest one in the entity |
| Someone in real estate | The person whose role covers property, leasing, or expansion |

MAIA aims for one primary contact per row, and for two or three people when the owner is an entity and you asked for no one in particular.

### What you get

A list of contacts per row. Each contact can carry these fields.

| Group | Fields |
| --- | --- |
| Person | Name, job title, role, and seniority |
| Company | Name, website, size, industry, and location |
| Reach | Work email, personal email, phone, and mobile phone |
| Profiles | LinkedIn and other public profiles |
| Evidence | Identity status, the basis for it, and the sources |

Personal email and mobile phone are personal data. How you use them is on you. See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).

### Identity evidence

Every contact states how well its identity is supported. Treat every contact as a lead to verify.

| Status | What it requires |
| --- | --- |
| Corroborated identity | Two or more independent sources agree |
| Single-source identity | One source, with nothing else to confirm it |
| Identity conflict | The name disagrees with the owner on record, or with the person you asked for |

Each contact also records where its phone and email came from: property records, published sources, or both.

### What MAIA drops

MAIA removes values that look like contact details and are not.

- Catch-all addresses, such as `info@`, `sales@`, and `noreply@`
- Masked or placeholder emails and phone numbers
- Any contact with no person's name

### Working the list

1. Open a contact in its cell and choose **Save to contacts**.
2. Open the project's **Contacts** page. Every saved contact is there, with the parcels it is linked to.
3. Mark each one **Not contacted**, **Contacted**, or **Contact failed**, and add notes as you go.
4. Download the list as CSV when you need it in another tool. Downloads are turned on per workspace.

> **Note:** The rules on calls, texts, and email that apply to you still apply. MAIA finds the person. Reaching them is your call.

### Limits

- **The research is bounded, and no source resolves every owner.** Each row gets a fixed amount of research, and a row with no contact found reads **Unavailable**. To try them again, choose **Re-run unavailable rows** in the column's **Enrich** menu.
- **Contacts never leave through a shared link.** Contact columns are excluded from every link. See [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing).
- **Restricted uses apply.** Finding an owner to call about a property is fine. MAIA declines any request to use contact data for a decision about a person's credit, insurance, employment, tenant screening, or housing eligibility.

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Ask for it in chat, or choose **Add enrichment** above the table. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment) |
| MCP | Ask for it in the `request` of `create_project`, or in a `send_message` |

### Related

- [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) tells you what the owner owes.
- [Property details](https://maia-analytics.com/docs/enrichments/property-details) tells you whether the owner uses the building.

## Mortgages and liens

MAIA's mortgages and liens lookup takes a parcel and returns its debt profile: open loans with their due dates and lenders, involuntary liens, and foreclosure filings.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/enrichments/mortgages-and-liens

> **Note:** This lookup must be enabled for your workspace. If it is unavailable, contact MAIA staff.

### What it answers

A parcel record tells you what a property is. This lookup tells you what is owed on it, to whom, and when that debt comes due.

> **You ask:** Which owners in this layer have a loan that comes due in the next 18 months?

> **Note:** Each row spends credits. Filter the table to the parcels you care about before you run. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### What you get

One profile per parcel, shown in the table as a single cell that opens to the full record. The cell's headline is **Free & clear** when the record shows no debt, the amount owed when it shows loans, a lien count when it shows liens and no loans, or **Liens unreported** when the record did not state a count. The cell opens like any researched cell, with a one-line reasoning and **Property records** as its source. A parcel the lookup cannot match reads **Unavailable**, and the reasoning says so.

| Group | Fields | Recorded or modeled |
| --- | --- | --- |
| Position | Free & clear, open lien count, total balance owed | Recorded |
| Open loans | Amount, lender, recording date, due date, term, loan type, financing type | Recorded |
| Flags per loan | Whether the lender is private, and whether the loan is a home equity line of credit | Recorded |
| Estimates per loan | Current balance, interest rate, payment amount | Modeled |
| Valuation | Estimated value, equity percent, loan to value, confidence score, as-of date | Modeled |
| Foreclosure | Status, recording date, auction date, unpaid balance, past-due amount, current lender | Recorded |
| Involuntary liens | Lien type, document type, recording date. Covers tax liens, judgments, and mechanic's liens | Recorded |

A recorded value is a fact from the public record. A modeled value is an estimate. Treat it as a starting point, and read its as-of date before you quote a balance.

> **Note:** Two readings mislead if you take them at face value. **Liens unreported** means the record did not state a lien count. It does not mean zero. **Free & clear** rests on the county's recorder coverage. Where there is none, a property with debt and a property without look the same, so check the profile's evidence flags: whether a last sale, a mortgage history, or any lien is on record.

### How it works

This enrichment is a records lookup. No agent is involved, so the same parcel returns the same profile.

1. MAIA keys each row by its parcel number and county. Public records are filed by parcel number, so the match is exact.
2. A row with no parcel number is keyed by its street address instead. The address needs a street and a state, plus a city or a ZIP code.
3. A matched lookup returns the whole profile at once.
4. An unmatched lookup returns no value. If the parcel number finds nothing, MAIA does not try the address instead. Running the row again returns the same result unless its parcel number or address has changed.

### Limits

- **Needs a parcel number or a street address.** A row with neither is skipped.
- **Restricted uses apply.** Mortgage research on property is fine. MAIA declines any request to use it for a decision about a person's credit, insurance, employment, tenant screening, or housing eligibility. See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Ask for it in chat, or choose **Add enrichment** above the table. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment) |
| MCP | Ask for it in the `request` of `create_project`, or in a `send_message` |

### Related

- [Contacts](https://maia-analytics.com/docs/enrichments/contacts) finds the person behind the owner.
- [Core data](https://maia-analytics.com/docs/capabilities/core-data) holds the sale history the profile sits beside.

## Property details

MAIA's property details take a parcel, a building, or a place and return who uses it. They answer two questions for every row, whether the owner occupies the property and who the tenants are, each with its reasoning and sources.

Updated: 2026-09-29. Source: https://maia-analytics.com/docs/enrichments/property-details

### What it answers

Ownership records name who owns a building. They do not say who is inside it. That changes who you call and what you offer them.

Use property details when you dispatch a run, to add a column that answers one of two questions.

| Detail | The question it answers | Returns |
| --- | --- | --- |
| Owner occupancy | Does the owner use the property? | Yes or no, with reasoning |
| Tenant info | Who occupies it, and on what terms? | A list of tenants with lease details |

What is owed on a property is a separate enrichment. See [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens).

> **You ask:** Find owner-occupied, for-profit buildings with public ESG commitments and strong solar incentives.

> **Note:** Each row spends credits. Filter the table first, or run the first ten rows and read them before you run the rest. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### Owner occupancy

A property is owner-occupied when its owner is one of the users of the building.

| Property | Owner-occupied when |
| --- | --- |
| Residential | The owner lives there as a primary residence |
| Commercial or industrial | The owner, or a company under the same control, runs its own business there |
| Mixed use | The owner uses part of the building and leases the rest |

The cell reads yes, no, or **Unavailable**. Unavailable is not a no. It means MAIA could not support either answer.

MAIA researches each row in three steps.

1. It gathers the parcel, building, and place records for the row's location.
2. It compares the owner with the occupant: the mailing address against the property address, the names, and the type of entity.
3. If the records do not show whether owner and occupant are the same, it searches the web.

The reasoning names the evidence, such as a matching company name and the absence of leasing language.

> **Note:** Owner occupancy runs on layers built from MAIA's core parcel, building, or place data. It does not run on a layer you uploaded.

![A table cell reading Unavailable under the column Owner Occupied, with its reasoning panel open below it. The panel reads Owner Occupied = Unavailable, then Reasoning: no parcel owner, mailing address, or occupant records were returned, and the name FedEx Ground alone cannot establish occupancy. Sources (2) sits at the bottom.](https://maia-analytics.com/product-shots/docs/reasoning-unavailable@2x.png)

An Unavailable owner occupancy cell. The reasoning names what MAIA checked.

### Tenant info

MAIA researches the public web for the current occupants and returns every tenant it finds, one entry each.

| Field | What it holds |
| --- | --- |
| Tenant | The legal name or the primary occupant |
| Lease dates | Start and end of the current term |
| Lease length | Worked out from the lease dates |
| Months remaining | Worked out from the lease dates |
| In-place rent | Base rent per square foot, per year |
| Expense structure | Triple net, modified gross, full service gross, industrial gross, or other |
| Escalation | Fixed percent, CPI, hybrid, or none |
| Occupancy status | Leased, vacant, owner-occupied, partially leased, or unknown |
| Tenant count | How many tenants share the building |

Three things to know before you rely on a tenant entry:

- **Expect gaps in lease terms.** A private lease leaves little trace. Many rows return a tenant name and no rent. MAIA reads company filings, listing materials, press releases, and planning records, and it returns what those state.
- **Sources age.** A listing or a press release describes one date. Check the date on the source before you act.
- **Some uses are declined.** MAIA declines any request to use it for a decision about a person's credit, insurance, employment, tenant screening, or housing eligibility. See [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).

### Limits

- **Owner occupancy and tenant info are research, so either can be wrong.** Open the cell and read the reasoning before you act on it.
- **Unavailable rows are not run again for you.** Use **Re-run unavailable rows** in the column's **Enrich** menu.

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Ask for it in chat, or choose **Add enrichment** above the table. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment) |
| MCP | Ask for it in the `request` of `create_project`, or in a `send_message` |

### Related

- [Contacts](https://maia-analytics.com/docs/enrichments/contacts) finds the person to call.
- [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) tells you what is owed.
- [Core data](https://maia-analytics.com/docs/capabilities/core-data) holds the ownership and mailing records this research starts from.

## Web research

MAIA's web research takes a question the data cannot answer and returns an answer from the public web, with links to the pages it rests on.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/enrichments/web-research

### What it answers

Core data holds what is recorded. The web holds what is published: an ordinance, a company's commitments, a program's rules.

> **You ask:** Which candidates allow BESS by right, and what setbacks apply in that municipality?

> **Note:** An ordinance is written per municipality, not per parcel. Run a question like this on the shortlist, not on every parcel in the county. As a column on 5,000 parcels, the same research runs 5,000 times and every row spends credits. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### What you get

| Part | What it holds |
| --- | --- |
| Value | The answer, typed as yes or no, a number, a category, a link, or text |
| Reasoning | One or two sentences that lead with the finding |
| Sources | The pages the answer rests on, with links |

When the research finds nothing it can support, the cell reads **Unavailable** and the reasoning says what was checked. A web answer with no research behind it is also rejected and reads Unavailable. See [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents).

### What it is for

MAIA reaches for the web last, after the project's own data, core data, and public GIS layers. A record is faster and spends fewer credits.

| Use web research for | Not for |
| --- | --- |
| What an ordinance permits | A parcel's acreage, owner, or zoning code |
| What a company has published | Anything already in a column of the project |
| A program's rules and deadlines | A fact MAIA's core data holds |
| A public page | A page behind a login or a paywall. It cannot be a source |

> **Note:** A zoning code is the name of a district. It is not a ruling on what you may build. MAIA says what a code allows only after it has read the ordinance. Without that, it marks the claim unverified rather than answering from memory. See [Gaps in the records](https://maia-analytics.com/docs/using-maia/review#gaps-in-the-records).

### Two ways to run it

| Agent | What it can do | When |
| --- | --- | --- |
| Main agent | Search the web | In chat, to answer a question about the project |
| Sub-agents | Search the web | Row by row, to fill a researched column |

### Limits

- **No browser session.** MAIA reads pages. It does not click, fill in forms, or step through a site.
- **No logins and no paywalls.** MAIA reads public pages only.
- **Some pages cannot be read.** A page MAIA cannot open is not a source.
- **Research is bounded.** Each row gets a fixed amount of research. A question that needs a day of digging will come back thin.
- **A PDF attached to chat is context, not research.** Where PDF attachments are turned on, MAIA reads the file as context for the conversation. It adds no rows. See [File formats](https://maia-analytics.com/docs/reference/file-formats).

### In the app and over MCP

| Where | How |
| --- | --- |
| The web app | Ask in chat, or choose **Add enrichment** above the table |
| MCP | Ask in the `request` of `create_project`, or in a `send_message` |

### Related

- [Sub-agents](https://maia-analytics.com/docs/capabilities/sub-agents) explains what a web sub-agent can use and how its answers are judged.
- [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery) finds public GIS layers, which MAIA tries before it researches.
- [Review](https://maia-analytics.com/docs/using-maia/review) explains how to check a source.

# MCP

Connect Claude, ChatGPT, or another MCP client to MAIA, and drive the agent from there.

## Connect MAIA to Claude or ChatGPT

MAIA's MCP connector is a remote MCP server that lets Claude, ChatGPT, and other MCP clients hand research to MAIA's agent. You connect once, sign in with your MAIA account, and dispatch work from the client you already use.

Updated: 2026-10-16. Source: https://maia-analytics.com/docs/mcp/connect

### What you end with

Your client lists MAIA's tools, and a request like this one comes back with a county code.

> **You ask:** Use MAIA to find Boulder County, Colorado.

The client calls `find_county` and shows the county's name and its five-digit `county_fips`. If it does, you are connected. Any US county works for this check, including one outside your plan. Finding a county does not add it to your plan.

### What the connector is

MCP is an open protocol that lets an AI client call tools on a server. MAIA's connector is such a server, at `https://api.maia-analytics.com/mcp` over HTTP. Through it, your client can start a project, send a request, follow the run, answer MAIA's questions, and read the result.

The connector reaches the same agent and the same projects as the web app. A project you start from your client opens in MAIA. One you start in MAIA is there for your client. Work over MCP spends credits as it does in the app. Its SQL tools never return licensed property data, such as owner names and values. See [`query_project`](https://maia-analytics.com/docs/mcp/tools#query-project).

### Who can connect

You need a MAIA account. If the consent page refuses your sign-in, contact [support](mailto:support@maia-analytics.com).

### Set up your client

#### Claude

Connect MAIA from Claude's Connectors Directory. This works for Claude on the web, the desktop app, and mobile.

1. Open [MAIA in Claude](https://claude.ai/directory/maia), or open **Customize**, then **Connectors**, and search for `MAIA`.
2. Choose **Connect to Claude**.
3. Sign in with your MAIA account. MAIA's consent page opens.
4. Choose **Allow**. Claude lists MAIA's tools.
5. In a chat, name MAIA in your message, such as "Use MAIA to find...". If Claude does not use MAIA, select the plus button in the composer, open **Connectors**, and check that MAIA is turned on.

> **Note:** On a Claude Team or Enterprise plan, an owner adds MAIA for the organization first, from **Organization settings**, then **Connectors**. After that, each member connects their own account. On a Team plan, a member who cannot add connectors sees **Request** in place of the connect button. **Request** asks the owners to add MAIA.

If you cannot use the directory listing, add MAIA as a custom connector instead.

1. Open **Customize**, then **Connectors**.
2. Choose **Add**, then **Add custom connector**.
3. Enter `https://api.maia-analytics.com/mcp`.
4. Sign in with your MAIA account, and choose **Allow**.

#### ChatGPT

Install MAIA from ChatGPT's plugin directory.

1. Open [MAIA in ChatGPT](https://chatgpt.com/plugins/plugin_asdk_app_6abf3cf2cc348191add64681d2d468ed), or search for `MAIA` in [ChatGPT Plugins](https://chatgpt.com/plugins).
2. Choose **Install plugin**.
3. Sign in with your MAIA account.
4. Choose **Allow**. ChatGPT adds MAIA.
5. In a chat, name MAIA in your message, such as "Use MAIA to find...". You can also choose MAIA from the plus menu in the composer.

> **Note:** On a ChatGPT Business or Enterprise plan, an admin may need to allow MAIA for the workspace first.

If your workspace does not allow directory apps, connect MAIA in Developer mode instead. Developer mode is on Plus, Pro, Business, Enterprise, and Education plans, on the web.

1. Open **Settings**, then **Security and login**, and turn on **Developer mode**.
2. Go to [ChatGPT Plugins](https://chatgpt.com/plugins) and select the plus button to create an app. The plus button creates an app only after Developer mode is on.
3. Name it `MAIA`, enter `https://api.maia-analytics.com/mcp` as the MCP server URL, and set **Authentication** to **OAuth**.
4. Choose **Create**, then sign in with your MAIA account and choose **Allow**.
5. In a chat, choose **Developer mode** from the plus menu in the composer, and select MAIA.

#### Claude Code

Add the server:

```bash
claude mcp add --transport http maia https://api.maia-analytics.com/mcp
```

By default it is added to the current project only. Add `--scope user` to use it from every project. Then sign in:

1. Run `/mcp` in Claude Code and pick `maia`.
2. Your browser opens MAIA's consent page. Sign in with your MAIA account.
3. Choose **Allow**. MAIA's tools appear in Claude Code once sign-in finishes, and not before.

#### Other clients

Any client that supports remote MCP servers over HTTP with OAuth can connect, including developer tools such as Codex, Cursor, VS Code, and Gemini CLI. Give it the address `https://api.maia-analytics.com/mcp`. The client opens MAIA's consent page when it first needs access.

Many of these tools read an `mcpServers` block like this one. Check your tool's docs for the exact key.

```json
{
  "mcpServers": {
    "maia": {
      "url": "https://api.maia-analytics.com/mcp"
    }
  }
}
```

### Let MAIA's tools run without asking

Your client may ask you before each MAIA tool call. A run calls `get_run` many times, so set MAIA's tools to always allow. Keep `approve_step` on ask. It approves the steps that spend credits or delete a layer, and the prompt shows you what the step does. See [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals).

### How sign-in works

The connector uses OAuth. You sign in to MAIA in your browser, and MAIA hands your client a token. Your client never sees your password.

- **The connector acts as you.** It can see the projects you can see, and nothing more.
- **Consent is per client.** Each client you connect asks for it.
- **You must have accepted MAIA's current terms.** If you have not, the consent page shows them first. Accept them, then choose **Allow**.

### Troubleshooting

| What you see | Likely cause | What to do |
| --- | --- | --- |
| The consent page refuses you | Your workspace does not have access to the connector | Contact [support](mailto:support@maia-analytics.com) |
| Tools do not appear in Claude Code | The server was not added, or sign-in did not finish | Run `claude mcp list`, then `/mcp` and sign in again |
| Tool calls are refused after working before | Your access changed, or the grant was revoked | Sign in again from your client. If the consent page refuses you, contact [support](mailto:support@maia-analytics.com) |
| `find_county` finds nothing | The name matches no US county | Add the state, or use the five-digit county code. When your plan has 20 or fewer counties, your client lists them. Pick one |
| MAIA does not add a county outside your plan | Your Free workspace already has its county of choice, or you are not a workspace admin | Upgrade to Pro, or ask your admin. See [Your county of choice](https://maia-analytics.com/docs/billing/plans#county-of-choice) |

### Next

- [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals) follows a run from start to finish.
- [Upload a file](https://maia-analytics.com/docs/mcp/upload-a-file) brings a file you attach in the chat into a project.
- [Tools](https://maia-analytics.com/docs/mcp/tools) lists every tool and its parameters.
- [Prompts](https://maia-analytics.com/docs/mcp/prompts) lists the ready-made requests.

## 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.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/mcp/upload-a-file

### 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 project's selected counties
- 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](https://maia-analytics.com/docs/mcp/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.

| The file | How it reaches MAIA | What you need |
| --- | --- | --- |
| CSV or GeoJSON, up to 100,000 characters | Your client reads the rows and passes them to MAIA in a tool call | Nothing more, in any client |
| Any other format, or a larger file | Your client sends the file to a one-use upload link | A 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.

Rows outside the project's selected counties are skipped. A new project made from a file covers one county. For a list that spans counties, bring it into a project that already covers them, or split it by county.

### 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.

| The file holds | You get |
| --- | --- |
| Street addresses | Your rows matched to parcels |
| Coordinates or shapes | A map layer of your own features |
| Anything else | A table the agent can read and join |

How MAIA reads a file and matches its addresses is on the [File upload](https://maia-analytics.com/docs/capabilities/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.

| Limit | Value |
| --- | --- |
| Rows passed in a tool call | 100,000 characters of CSV or GeoJSON |
| File size, through an upload link | 25 MB |
| Rows, matched to parcels by address | 1,000 |
| Rows, as a map layer or a table | 10,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](https://maia-analytics.com/docs/reference/file-formats) and [Limits](https://maia-analytics.com/docs/reference/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

| What you see | Likely cause | What to do |
| --- | --- | --- |
| Claude says the upload was blocked | The file went to an upload link, and `api.maia-analytics.com` is not an allowed domain | [Allow MAIA's domain](https://maia-analytics.com/docs/mcp/upload-a-file#allow-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 code | Code execution is off, and the file needs an upload link | Turn it on under **Settings**, then **Capabilities** |
| The file is too large to pass in the chat | It holds more than 100,000 characters | Split it into smaller files, or use a client that can send a file to an upload link |
| Fewer rows than in the file | Rows outside the project's selected counties were skipped | Check the skipped count and the target project's selected counties. Use a project that covers the rows' counties, or split the file by county |
| Addresses left unmatched | MAIA found no single parcel for them | See [How matching works](https://maia-analytics.com/docs/capabilities/file-upload#how-matching-works) |
| The link has expired | More than 10 minutes passed, or the link was used | Ask your client to start the upload again |

### Tools

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

| Tool | What it does |
| --- | --- |
| [`import_rows`](https://maia-analytics.com/docs/mcp/tools#import-rows) | Imports rows passed as CSV or GeoJSON text into a project, or into a new project in a county |
| [`get_upload_link`](https://maia-analytics.com/docs/mcp/tools#get-upload-link) | Gets a one-use upload link for a project, or for a new project in a county |
| [`get_import`](https://maia-analytics.com/docs/mcp/tools#get-import) | Reports an address import: its progress, then the matched and unmatched rows |

### Related

- [File upload](https://maia-analytics.com/docs/capabilities/file-upload) covers uploads in the web app.
- [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals) covers what to ask MAIA once your rows are in.

## MCP tools

MAIA's MCP connector exposes twenty-two tools. With them an MCP client can find a place or a county, start a project, bring in a file, send a request to MAIA's agent, query a project's data, share a project, follow the run, answer its questions, ask you to approve its steps, and save skills and memory.

Updated: 2026-10-25. Source: https://maia-analytics.com/docs/mcp/tools

This inventory follows the published connector release. The tools listed by your connected client are authoritative for your workspace. When `search_docs` is offered by your connector, ask your assistant to use it for questions about MAIA capabilities, the data MAIA has and where, setup, pricing, and integrations. It returns matching published documentation and data catalog entries with source links and workspace availability restrictions. Otherwise, use `maia_guide` and the [MAIA docs](https://maia-analytics.com/docs/quickstart/what-is-maia).

### Every tool at a glance

| Tool | What it does | Changes data |
| --- | --- | --- |
| [`find_county`](https://maia-analytics.com/docs/mcp/tools#find-county) | Finds US counties by name, and whether you can build projects in them, plus cities and towns of that name | No |
| [`find_places`](https://maia-analytics.com/docs/mcp/tools#find-places) | Finds the counties of US cities, neighborhoods, ZIP codes, metros, and regions, and whether you can build projects in them | No |
| [`create_project`](https://maia-analytics.com/docs/mcp/tools#create-project) | Creates a project in one county or several, in named places, or in an area you draw, and starts MAIA on a request or a skill | Yes |
| [`import_rows`](https://maia-analytics.com/docs/mcp/tools#import-rows) | Imports rows passed as CSV or GeoJSON text into a project, or into a new project in a county | Yes |
| [`get_upload_link`](https://maia-analytics.com/docs/mcp/tools#get-upload-link) | Gets a one-use link to bring a file into a project, or into a new project in a county | Yes |
| [`get_import`](https://maia-analytics.com/docs/mcp/tools#get-import) | Reports an address import: rows matched, rows not matched and why, or why it failed | No |
| [`send_message`](https://maia-analytics.com/docs/mcp/tools#send-message) | Sends another request, or runs a skill, on an existing project | Yes |
| [`get_run`](https://maia-analytics.com/docs/mcp/tools#get-run) | Reports a run: progress, then the answer, a question, work stopped at the time limit, or an error | No |
| [`respond`](https://maia-analytics.com/docs/mcp/tools#respond) | Answers MAIA's question, or declines its approval | Yes |
| [`approve_step`](https://maia-analytics.com/docs/mcp/tools#approve-step) | Approves the step MAIA is waiting on, after you say yes | Yes |
| [`stop_run`](https://maia-analytics.com/docs/mcp/tools#stop-run) | Stops the current run. Work saved before the stop stays in the project | Yes |
| [`list_projects`](https://maia-analytics.com/docs/mcp/tools#list-projects) | Lists the projects you can see, most recently updated first | No |
| [`get_project`](https://maia-analytics.com/docs/mcp/tools#get-project) | Describes a project: layers, columns, row counts, and views | No |
| [`project_schema`](https://maia-analytics.com/docs/mcp/tools#project-schema) | Lists the tables and columns `query_project` can read in a project | No |
| [`query_project`](https://maia-analytics.com/docs/mcp/tools#query-project) | Runs one read-only SQL query over a project's layers and returns its rows. A query over parcel data spends your workspace's parcel export budget | Yes |
| [`set_project_sharing`](https://maia-analytics.com/docs/mcp/tools#set-project-sharing) | Sets which teammates can open a project you own, or turns its public link off | Yes |
| [`share_project_publicly`](https://maia-analytics.com/docs/mcp/tools#share-project-publicly) | Turns on a public link to a project you own, after you say yes | Yes |
| [`maia_guide`](https://maia-analytics.com/docs/mcp/tools#maia-guide) | Returns what MAIA does, requests that work well, and its limits | No |
| [`search_docs`](https://maia-analytics.com/docs/mcp/tools#search-docs) | Searches MAIA's published docs and data catalog for capabilities, the data MAIA has and where, setup, pricing, and integrations | No |
| [`list_skills`](https://maia-analytics.com/docs/mcp/tools#list-skills) | Lists your skills and your workspace's skills | No |
| [`save_skill`](https://maia-analytics.com/docs/mcp/tools#save-skill) | Saves one of your own skills | Yes |
| [`save_to_maia_memory`](https://maia-analytics.com/docs/mcp/tools#save-to-maia-memory) | Saves a titled note to your MAIA memory | Yes |

Three more tools exist only for the [in-chat project view](https://maia-analytics.com/docs/mcp/project-view). Your client does not call them.

#### `maia_guide`

No parameters. Returns a short guide written for your client to read before it uses MAIA.

#### `search_docs`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `query` | string, up to 500 characters | Yes | A product question or feature/setup keywords |

Returns up to five matching sections from MAIA's published docs and from the data catalog in MAIA's web app, with page titles, section headings, source links, and your workspace's availability restrictions. Each dataset in the catalog is one section, with its coverage and a link to its catalog page. Use it for questions about capabilities, the data MAIA has and where, setup, pricing, and integrations. Cite the source links and respect the availability restrictions. A feature described in the docs may still need MAIA staff to enable it for your workspace.

If no section matches, try a feature name or a more specific question. No match does not mean MAIA cannot do it. If the docs cannot be fetched and no unexpired cached copy is available, the tool returns an error. It never returns the whole documentation set.

### Starting work

#### `find_county`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `query` | string | Yes | County, city, or town name, optionally with state, such as "Maricopa, AZ" or "Boulder, CO" |

Returns each matching US county with its `county_fips` and `name`. A county your workspace cannot use is flagged `unavailable`, and `create_project` says why. A county outside your plan that your workspace can still add as its free county of choice is flagged `can_be_county_of_choice` instead. `create_project` adds it when you ask for a project in it. Your client should never pick one you did not name. 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. When no county or place matches, it suggests trying a county or city name with its state, or a 5-digit county code. An empty query is refused.

It also returns up to five cities and towns of that name as `places`, each with its `place_id`, `name`, and the county codes it lies in, main county first. Pass a `place_id` to `create_project` as `place` for a project that covers that city or town instead of its whole counties.

```json
{ "county_fips": "04013", "name": "Maricopa County, AZ" }
```

Pass `county_fips` on as a string. As a number it loses its leading zero.

#### `find_places`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `query` | `{"anyOf":[{"maxLength":200,"minLength":1,"type":"string"},{"items":{"maxLength":200,"minLength":1,"type":"string"},"maxItems":200,"minItems":1,"type":"array"}]}` | Yes | A city, neighborhood, ZIP code, metro, or region. For several places, a list with one place per item, with its state where known |

Looks places up with the same place search as MAIA's web app, and creates nothing. It does not search for businesses. Returns the counties the places lie in that your plan covers as `counties`, and the others as `unavailable_counties`, each with its `county_fips`, `name`, and `state`. Names that matched nothing come back as `unmatched_places`. `county_limit` and `outline_limit` give the most counties and city or neighborhood outlines one project can hold, and `within_county_limit` and `within_outline_limit` say whether these places fit. `next_step` says what to do next.

When a name could mean more than one place, it returns `ambiguous`: the name, and each place it could be with its state, population, and counties. The lookup stops at that name. Your client asks you which you mean, then looks up your choice as labeled. When two places share a label, the label adds the county. An empty query is refused.

To build over these places, your client passes the same names to `create_project` as `places`, so cities and neighborhoods keep their outlines. To cover their whole counties instead, it passes the county codes as `county_fips` and `additional_counties`. To learn whether an unavailable county can be your county of choice, use `find_county`.

#### `create_project`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `county_fips` | string, 5 digits | Unless `places` or `area` is set | The county code from `find_county` or `find_places` |
| `request` | string | Unless `skill` is set | What to build, in plain language |
| `skill` | string | No | The name of a skill from `list_skills` for MAIA to run |
| `request_id` | string, up to 128 characters | No | An id your client chooses before the call. A retry with the same id and the same parameters returns the original project, run, and notices instead of starting again |
| `additional_counties` | list of string, up to 199 items | No | More county codes from `find_county`, for one project over several counties. The project keeps them in the order given |
| `place` | string, 7 digits | No | A `place_id` from `find_county`. The project covers that city or town in `county_fips` and in any `additional_counties` it lies in, instead of those whole counties. Other `additional_counties` are kept whole |
| `workspace_access` | `private`, `workspace_read`, or `workspace_write` | No | Which teammates in your MAIA workspace can open the project: none, all of them to view, or your workspace's writers to edit and the others to view. Your client asks you whether teammates may edit when you have not said |
| `places` | list of string, 1 to 200 items, each up to 200 characters | No | Cities, neighborhoods, ZIP codes, metros, or regions, one per item with its state where known, as given to `find_places`. The project covers them instead of whole counties. Given alone, without `county_fips`, `additional_counties`, `place`, or `area` |
| `area` | GeoJSON object | No | A drawn outline for the project: a `Polygon` or `MultiPolygon` with `[longitude, latitude]` coordinates in WGS84. Not with `places` or `place` |

For a project over several counties, pass the first county as `county_fips` and the others as `additional_counties`. Give each county once. A `place` is refused unless it came from `find_county` with `county_fips` among its counties. `additional_counties` and `place` need `county_fips`, and a call with none of `county_fips`, `places`, and `area` is refused.

With `places`, every name must resolve before MAIA makes the project: a name that matches nothing or could mean more than one place, places over the county or outline limit, or a county your plan cannot take is refused, with the reason, and makes no project. Cities and neighborhoods keep their outlines. When MAIA cannot find a place's outline, the project covers its whole counties and `notice` says so. ZIP codes, metros, and regions cover their whole counties.

With `area`, the project takes each county that overlaps at least 1% of the area or 1% of the county, largest overlap first. With county codes as well, the project keeps those counties, and each must meet the same overlap rule. An area that touches no county, has coordinates out of range, has a ring that is not closed or has fewer than 4 positions, or is too complex is refused before any project is made. Each ring's last position must repeat its first. When an area touches no county, the refusal reminds your client that positions are `[longitude, latitude]` and that the area must be in the United States.

The project starts private unless `workspace_access` says otherwise. Workspace access is refused when your workspace has no other members. A public link is separate, and never set at creation: turn one on later with [`set_project_sharing`](https://maia-analytics.com/docs/mcp/tools#set-project-sharing) and [`share_project_publicly`](https://maia-analytics.com/docs/mcp/tools#share-project-publicly). A retry with the same `request_id` and different parameters, such as a different `workspace_access`, is refused, and starts no new work.

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](https://maia-analytics.com/docs/mcp/runs-and-approvals). When there is something to tell you about the new project, such as that its counties are large enough to make queries slower, the report carries it as `notice`.

When your plan cannot take a county, or MAIA has no data for it, `create_project` makes no project. Its result says why, and what you can do, as `not_created` in place of a project.

A free self-serve workspace can add one county outside its plan, once and for good, as its county of choice. After that, only a plan upgrade opens more counties. When you ask for a project in a county flagged `can_be_county_of_choice`, and you are a workspace admin, `create_project` adds the county to your workspace and creates the project in the same call. The result's `county_of_choice_added` says so. The choice cannot be changed later.

#### `send_message`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project to work on |
| `message` | string | Unless `skill` is set | The next request |
| `skill` | string | No | The name of a skill to run on this project |
| `request_id` | string, up to 128 characters | No | An id your client chooses before the call. After an error or a lost response, a retry with the same id and the same parameters returns the original outcome, run, and notices instead of doing the work again. Use a new id for new work |

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 until `get_run` no longer reports `running`. A new request cancels a question or approval MAIA is waiting on: the earlier run's status becomes `cancelled`, and its pending step is not done. So when none of a question's options fits, a new request answers it in your own words. To pick an option or decide an approval, use [`respond`](https://maia-analytics.com/docs/mcp/tools#respond) or [`approve_step`](https://maia-analytics.com/docs/mcp/tools#approve-step) instead.

To add counties to the project, name them in `message`. The run's answer names the counties added, or why they were refused. Adding counties widens the project's area. It does not refill the project's existing layers.

### Bringing in a file

The steps, from your side, are on [Upload a file](https://maia-analytics.com/docs/mcp/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` | string, up to 100,000 characters | Yes | The rows as CSV text with a header row, or as GeoJSON text |
| `file_format` | `csv` or `geojson` | No | The format of `content`. Defaults to `csv` |
| `project_id` | string | Unless `county_fips` is set | A project you can edit, to add the rows to |
| `county_fips` | string, 5 digits | Unless `project_id` is set | The county code from `find_county`. The import creates a new project there |
| `layer_name` | string, up to 40 characters | No | The new layer's name, shown as its label in the layer list. Address matching can reuse a layer for the same properties instead. A new project built from addresses names its layer itself |
| `truncate` | boolean | No | `true` imports only the first rows when there are more than the row limit. Defaults to `false`. Your client asks you first |
| `match_addresses` | boolean | Yes | `true` matches property addresses to parcels or places. `false` makes rows with coordinates or shapes a map layer, and any other rows a table |
| `address_mapping` | object | No | The columns that hold the property address, by their exact names: `street`, the street or full address, and optionally `house_number`, `unit`, `city`, `state`, and `zip`. Leave it out to let MAIA pick them, and when `match_addresses` is `false` |

Your client chooses whether to match addresses. When it does not pass `address_mapping`, MAIA picks the address columns. When the columns leave it unsure, no import starts: your client asks you which column holds the street or full address, and which hold the unit, city, state, and ZIP, then sends your answer as `address_mapping`. Other columns stay in the layer as data. A column name in `address_mapping` that is not in the rows is refused, with the names that are. Address matching needs a project with a county.

Returns the same response as an upload to a link: the project and, for address matching, 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` | string | Unless `county_fips` is set | A project you can edit, to add the file to |
| `county_fips` | string, 5 digits | Unless `project_id` is set | The county code from `find_county`. The upload creates a new project there |
| `layer_name` | string, up to 40 characters | No | The new layer's name, shown as its label in the layer list. Defaults to the file name. Address matching can reuse a layer for the same properties instead. A new project built from addresses names its layer itself |
| `truncate` | boolean | No | `true` imports only the first rows of a file over the row limit. Defaults to `false`. Your client asks you first |
| `match_addresses` | boolean | Yes | `true` matches property addresses to parcels or places. `false` makes a file with coordinates or shapes a map layer, and any other file a table |
| `address_mapping` | object | No | The columns of the file that hold the property address, by their exact names: `street`, the street or full address, and optionally `house_number`, `unit`, `city`, `state`, and `zip`. Leave it out to let MAIA pick them, and when `match_addresses` is `false` |

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 address matching, an `import_id` to follow with `get_import`. MAIA picks the address columns as it does for `import_rows`, and when it is unsure, the upload starts no import and your client asks you which columns hold the address. The upload refuses a column name in `address_mapping` that is not in the file, and address matching in a project without a county. When the column names make the link too long, use shorter ones.

#### `get_import`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `import_id` | string | Yes | The `import_id` from the upload's response |
| `wait_seconds` | integer, 0 to 30 | No | How 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. A failed import that gives no failure reason added no rows, and the reasons rows were not matched explain why. When some rows lie in counties outside the project, `county_note` names those counties and says whether your workspace can open them, and the upload's response gives the same note. Those rows are not matched. To match them in a county your workspace can open, your client asks you first, then asks MAIA with `send_message` to add the county, and imports the file again. A file sent to a link needs a new link from `get_upload_link`. Only an address import needs it: a map layer or a table is in the project when the upload returns. When the import finishes, `get_project` shows the layers it made or added to.

### Following a run

When your client supports MCP tasks, `create_project`, `send_message`, `respond`, `approve_step`, and an address import with `import_rows` can return a task instead of a run report or an upload response. Your client then follows the task itself, and does not need `get_run` or `get_import`. A run that is still going is `working`, with its current step. A run that ends, or fails, is `completed` with the report `get_run` gives. A run that was stopped, or whose step a newer request set aside, is `cancelled`. An import task is `completed` with the report `get_import` gives. A result with something to tell you, such as a `notice`, a step set aside, or an import cut to the row limit, comes back as an ordinary result instead. Cancelling a task stops its run, or cancels its import.

When your client can also show a form, an approval MAIA is waiting on comes to you as a form to accept or decline, and the task follows the run that continues after your answer. Its final result starts with what MAIA said before it asked. Without forms, the approval comes back as a `get_run` report, and your client answers it with `approve_step` or `respond`. A question always comes back as a report for your client to answer with `respond`. Clients without tasks see no change.

#### `get_run`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project the run belongs to |
| `run_id` | string | No | The run id from `create_project`, `send_message`, or `respond`. Omitted, the project's current or latest run |
| `wait_seconds` | integer, 0 to 30 | No | How 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](https://maia-analytics.com/docs/mcp/runs-and-approvals). A run whose pending question or approval a newer request set aside reports `cancelled`.

A run stops at 60 minutes. A run that reaches the limit reports `incomplete`, with what MAIA wrote so far. It may have saved some of its work: check the project, then ask MAIA to continue with `send_message`. The report's `changed_layers` lists the layers the run is confirmed to have created, changed, or deleted. The list may leave out saved changes, so an empty list does not prove nothing changed. Check the project before you ask for the same edits again.

After `stop_run`, pass the `run_id` it returned. `running` means the run has not finished stopping yet. A final `stopped` confirms it stopped.

#### `respond`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project that is waiting |
| `choice` | string | For a question | The id or the label of the option to pick |
| `decline` | boolean | To decline an approval | `true` declines the step. Defaults to `false` |
| `note` | string, up to 2,000 characters | No | Why you declined. MAIA reads it with the decline |
| `request_id` | string, up to 128 characters | No | An id your client chooses before the call. After an error or a lost response, a retry with the same id and the same parameters returns the original outcome, run, and notices instead of doing the work again. Use a new id for new work |

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. A `choice` that matches an option's id picks that option. A label that more than one option shares is refused, with each of those options' ids. A `choice` that is not an option is refused, with the options listed as id and label. `respond` takes no answer in your own words: when no option fits, send the answer with [`send_message`](https://maia-analytics.com/docs/mcp/tools#send-message). `respond` never approves a step. To approve, use [`approve_step`](https://maia-analytics.com/docs/mcp/tools#approve-step).

```json
{ "project_id": "3f6c1a2e-0000-0000-0000-000000000000", "choice": "a" }
```

```json
{ "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` | string | Yes | The project that is waiting |
| `approval_id` | string | Yes | The `approval_id` of the pending approval from `get_run` |
| `summary` | string | Yes | The `summary` of the pending approval from `get_run`, unchanged |
| `note` | string, up to 2,000 characters | No | A note MAIA reads with the approval |
| `request_id` | string, up to 128 characters | No | An id your client chooses before the call. After an error or a lost response, a retry with the same id and the same parameters returns the original outcome, run, and notices instead of doing the work again. Use a new id for new work |

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.

```json
{
  "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` | string | Yes | The project whose run to stop |

Requests a stop. It returns whether a run was in progress and, if so, its `run_id`, but not that the run has stopped. A stop is not instant. MAIA halts at the next safe point. Check the project for the work it saved before the stop. Follow the `run_id` with `get_run` until the run is no longer `running`, and go by its final status: the run may finish before the stop takes effect. Calling it twice is safe.

### Reading projects

#### `list_projects`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `limit` | integer, 1 to 100 | No | How 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` | string | Yes | The project to describe |

Returns the project's current counties, in project order, and its layers, each with its kind, row count, and column names. It also returns the views, and whether a run is in progress. For a project you own, it returns its sharing too, in the same form `set_project_sharing` returns. It does not return rows. To read them, use `project_schema` and `query_project`, or open the project link.

#### `project_schema`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project to read |

Returns the relations and columns that `query_project` can read, with a handbook on how to query them. Your client calls it once before its first query. It does not list licensed property data: see [`query_project`](#query-project). A column marked `own data` holds MAIA's own records, names the counties it has values in, and can say what it holds. A parcel layer with MAIA's own sale records also has a `__sales` relation: one row for each recorded sale of the layer's parcels.

#### `query_project`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project to read |
| `sql` | string, up to 10,000 characters | Yes | One read-only `SELECT` over the relations from `project_schema` |

The query changes no data in the project. A query over a layer that may hold parcel data spends your workspace's parcel export budget, so `query_project` is marked as changing data. Returns at most 1,000 rows and 512 KiB, whatever `LIMIT` the query sets. `total_rows` is how many rows the query returned, and `truncated` says whether a cap cut the result, so aggregate in SQL instead of paging rows out. Shared county tables are not available here. MAIA's own county records reach the query only as the `own data` columns and `__sales` relations that `project_schema` lists.

MAIA licenses some property data from partners for use inside MAIA. `project_schema` and `query_project` never return it: owner names, mailing and site addresses, parcel numbers, use codes, lot size, values, taxes, sale and building details, or any column derived from them. In some counties, MAIA serves its own records for some of these columns, listed as `own data`. Those are not the licensed values. An `own data` value is empty outside the counties it lists, for a parcel MAIA has no record for, and before MAIA has loaded its records. An empty value there does not mean the record is empty. To work with the licensed values, ask MAIA's agent with `send_message`, which filters and researches inside MAIA, or sign in to MAIA to see them in the project.

When the connector's contact details setting is turned off for your workspace, `project_schema` and `query_project` also withhold phone numbers and emails from licensed property records in contact enrichments, along with any phone number or email in those enrichments' reasoning and sources, and the handbook says so. Contact details MAIA found through other research still appear. To see the withheld ones, open the project in MAIA.

### Sharing a project

A project starts private. Only its owner can change its sharing through the connector, even where MAIA lets a workspace writer manage the public link. An example project's sharing cannot be changed.

#### `set_project_sharing`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project to share, from `create_project` or `list_projects` |
| `workspace_access` | `private`, `workspace_read`, or `workspace_write` | Unless `public_link` is set | Which teammates in your MAIA workspace can open the project: none, all of them to view, or your workspace's writers to edit and the others to view. Your client asks you whether teammates may edit when you have not said |
| `public_link` | boolean | Unless `workspace_access` is set | `false` turns the public link off, and its URL stops working for good. `true` keeps an existing link |

Returns the project's sharing: its `workspace_access`, and its `public_link` with the `url`, the `access`, and when it expires, or `null` when there is none. Workspace access is refused when your workspace has no other members, so invite teammates in MAIA first.

`set_project_sharing` never turns a public link on. With `public_link` set to `true` and no link yet, it changes nothing and returns a summary of what the link would open, for `share_project_publicly`.

> **Note:** `set_project_sharing` is marked destructive, so your client asks you before each call.

#### `share_project_publicly`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `project_id` | string | Yes | The project to share, from `create_project` or `list_projects` |
| `summary` | string | Yes | The summary `set_project_sharing` gave for the link, unchanged |

Turns on a public link that anyone can open, inside or outside your organization. Your client shows you the summary and calls this tool only after you say yes. `summary` must match exactly. When it no longer describes what the link would do, for example because the project's layers changed, nothing is changed and the refusal gives the new summary.

The link opens the project's map, layers, and chat. The project's layers decide which kind it is:

- **`gated`**: viewers give a work email and accept MAIA's terms to see parcel details. The link expires in 14 days.
- **`geometry_only`**: viewers do not sign in, and parcel details stay hidden. The link works until it is turned off.

Returns the project's sharing, with the link's `url` to give the people who should see it. If the project already has a link, it returns that one. To turn a link off, use `set_project_sharing` with `public_link` set to `false`.

> **Note:** `share_project_publicly` is marked destructive, so your client asks you before each call. The request shows the `summary`, so you see who can open the project and what they see.

### Skills and memory

#### `list_skills`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `name` | string | No | A 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` | string, up to 120 characters | Yes | The skill's name. Saving the same name replaces your skill |
| `description` | string, up to 400 characters | Yes | What the skill does and when MAIA should use it |
| `instructions` | string, up to 32,000 characters | Yes | The method itself |
| `kind` | `workflow`, `enrichment`, or `agent_column` | No | A new skill defaults to `workflow`. An existing skill keeps its kind |

Saves a personal skill. Workspace skills are edited in MAIA. See [Skills](https://maia-analytics.com/docs/capabilities/skills).

#### `save_to_maia_memory`

| Parameter | Type | Required | Meaning |
| --- | --- | --- | --- |
| `title` | string, up to 120 characters | Yes | A short section name. Saving the same title replaces that section |
| `content` | string, up to 8,000 characters | Yes | The note |

MAIA reads this memory in every project. It is part of your personal knowledge. See [Knowledge](https://maia-analytics.com/docs/capabilities/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

- **Up to 200 counties per project.** Counties with a very large number of parcels make queries slower: `create_project` returns a `notice` that says so. `import_rows` and `get_upload_link` start a new project in one county only. To add a county to a project, ask MAIA with `send_message`.
- **Up to 20 city or neighborhood outlines per project.** `places` can name at most 20 distinct cities and neighborhoods that keep their outlines. A neighborhood drawn in several pieces counts each piece. ZIP codes, metros, and regions do not count toward this. For more places, name fewer, or cover their whole counties with the county codes from `find_places`.
- **SQL reads only the project's own layers.** `query_project` cannot read shared county tables, and it returns at most 1,000 rows. A query over a layer that may hold parcel data spends your workspace's parcel export budget. MAIA's own county records appear only as the `own data` columns and `__sales` relations `project_schema` lists. Licensed property data is never returned. See [`query_project`](#query-project). For other questions about the data, ask MAIA's agent with `send_message`.
- **Runs stop at 60 minutes.** A run that reaches the limit reports `incomplete`. Check the project for saved work, then ask MAIA to continue with `send_message`.

## MCP prompts

MAIA's MCP connector ships five prompts, which are ready-made requests that tell your client which tools to call and in what order. In Claude Code they appear as slash commands.

Updated: 2026-10-01. Source: https://maia-analytics.com/docs/mcp/prompts

### What a prompt is

A tool does one thing. A prompt is a short script for your client: it names the goal, the tools to use, and the point at which to stop and ask you. You fill in the arguments and the client does the rest.

Every prompt tells your client to bring MAIA's questions to you, and to show you a skill or a note before it saves one. How closely a client follows that is up to the client, so read what it shows you before you say yes.

### Run a prompt

In Claude Code, type `/` and pick the prompt from the list. It appears with the connector's name in front of it. Give the arguments after the command, in the order the tables below list them. Not every client shows prompts. The tools work without them.

### The five prompts

| Prompt | What it does | Arguments |
| --- | --- | --- |
| `build_dataset` | Starts a new project and sees it through to a finished dataset | `county`, `request` |
| `review_project` | Checks what an existing project contains and what may be missing | `project` |
| `run_skill` | Runs one of your skills in a county, as a new project | `skill`, `county` |
| `create_skill` | Turns a repeatable way of working into a skill | `workflow` |
| `teach_maia` | Gives MAIA a short profile of your work | None |

### `build_dataset`

| Argument | Meaning | Example |
| --- | --- | --- |
| `county` | The county to work in | Boulder, CO |
| `request` | What to find | vacant parcels over 5 acres |

1. The client finds the county with `find_county`.
2. It starts the project with `create_project` and follows the run with `get_run`.
3. It brings every question to you before it calls `respond`. It approves a step with `approve_step` only after you say yes. Approving research above your row limit spends credits.
4. When the run ends, it summarizes what MAIA built and gives you the project link.

### `review_project`

| Argument | Meaning |
| --- | --- |
| `project` | The project's name |

The client finds the project with `list_projects`, describes its layers and views with `get_project`, and reports what the dataset covers, which values look wrong or missing, and what to add next. It starts no run. To check values and their reasoning yourself, open the project link. See [Review](https://maia-analytics.com/docs/using-maia/review).

### `run_skill`

| Argument | Meaning | Example |
| --- | --- | --- |
| `skill` | The skill's name | Industrial infill filter |
| `county` | The county to run it in | Boulder, CO |

The client checks the name with `list_skills`, finds the county, and calls `create_project` with the skill. It runs your skills and your workspace's, not MAIA's ready-made ones. This is how a method you wrote for one county reaches the next. A threshold on a column the new county does not hold returns nothing, so ask MAIA to profile the county first when in doubt. See [Compound](https://maia-analytics.com/docs/using-maia/compound).

### `create_skill`

| Argument | Meaning |
| --- | --- |
| `workflow` | What the skill should do. Write "this conversation" to capture the work done in the current one |

The client calls `list_skills` first, so it improves a skill you already have instead of making a copy. It drafts the skill the way MAIA writes one: no county, city, or project named, and every threshold spelled out. It shows you the name, the description, and the instructions, and it calls `save_skill` only after you agree. Saving with an existing name replaces that skill. See [Skills](https://maia-analytics.com/docs/capabilities/skills).

### `teach_maia`

No arguments. The client writes a short work profile from what it knows about you: your role and company, the markets and counties you work in, the property types you look for, your criteria with their numbers, and the data you usually need.

It leaves out anything personal that is not about the work, and it asks about gaps instead of guessing. It shows you the profile, changes it until you approve, and then calls `save_to_maia_memory` with the title "Work profile". Running it again replaces that section.

### Limits

- **Skills saved this way are personal.** Workspace skills are edited in MAIA.
- **Not every client shows prompts.** The tools work without them.

### Related

- [Tools](https://maia-analytics.com/docs/mcp/tools) documents each tool a prompt calls.
- [Skills](https://maia-analytics.com/docs/capabilities/skills) and [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) explain what `create_skill` and `teach_maia` write.

## Runs and approvals over MCP

A run is one request worked by MAIA's agent. Over MCP, your client starts a run and gets back a run report, which holds progress while MAIA works, a question when MAIA needs your decision, and the answer with a link to the project at the end.

Updated: 2026-10-01. Source: https://maia-analytics.com/docs/mcp/runs-and-approvals

### What a finished run looks like

A run ends with a report like this one. `message` holds MAIA's answer, and `project_url` opens the map and the table.

```json
{
  "project_id": "3f6c1a2e-0000-0000-0000-000000000000",
  "project_url": "https://app.maia-analytics.com/project/3f6c1a2e-0000-0000-0000-000000000000",
  "run_id": "8d41b7c0-0000-0000-0000-000000000000",
  "status": "complete",
  "current_step": null,
  "steps": ["Searched parcels", "Created a layer", "Checked the result"],
  "message": "I found the parcels that match and added them as a layer.",
  "pending_input": null,
  "error": null
}
```

### The life of a run

1. **Start.** Your client calls `create_project` or `send_message`. MAIA starts at once and returns a project id and a run id.
2. **Follow.** Your client calls `get_run`, and the report shows progress. Set `wait_seconds`, up to 45, to hold the call open until the run ends.
3. **Answer, if asked.** When MAIA needs a decision, the status is `needs_input`. Your client brings the question to you and sends your answer with `respond`. For an approval you agree to, it calls `approve_step`. The run continues.
4. **Read.** When the run ends, the report carries MAIA's answer and a link to the project.

A run takes from under a minute to several minutes.

### The run report

`create_project`, `send_message`, `get_run`, `respond`, and `approve_step` all return the same report.

| Field | What it holds |
| --- | --- |
| `project_id` | The project the run belongs to |
| `project_url` | The link to the project in MAIA |
| `run_id` | The run's id |
| `status` | Where the run stands. See [Statuses](https://maia-analytics.com/docs/mcp/runs-and-approvals#statuses) |
| `current_step` | What MAIA is doing now |
| `steps` | The run's most recent steps, oldest first. The last one is in progress |
| `message` | MAIA's answer, once there is one |
| `pending_input` | What MAIA is waiting on, when the status is `needs_input` |
| `error` | What went wrong, when the run failed |

### Statuses

| Status | Meaning | What your client does |
| --- | --- | --- |
| `running` | MAIA is working | Calls `get_run` again |
| `needs_input` | MAIA is waiting on a question or an approval | Brings it to you. Calls `respond` with your answer or your decline, or `approve_step` when you approve |
| `complete` | The run ended with an answer | Reads `message` and gives you `project_url` |
| `failed` | The run ended with an error, or reached its time limit | Reads `error` and tells you what went wrong. What MAIA finished is saved, and a new request is safe to send |
| `stopped` | The run was stopped | Opens `project_url` to show what MAIA kept |
| `idle` | No run has started on the project | Starts one |

### Questions and approvals

> **Note:** A question from MAIA is a question for you, not for your client. The connector's prompts tell the client to bring every question to you before it calls `respond`, and every approval to you before it calls `approve_step`.

`pending_input` has a `kind`, and the kind decides how to answer.

| Kind | MAIA is asking | Your client answers with |
| --- | --- | --- |
| `question` | For a choice, from a list of options | `respond` with `choice` set to the option's id or label |
| `approval` | For permission to run a step | `approve_step` with the `approval_id` and the `summary`, unchanged, once you say yes. To decline, `respond` with `decline` set to `true` and an optional `note` |

A question looks like this.

```json
{
  "kind": "question",
  "prompt": "Which size should I screen for?",
  "options": [
    { "id": "a", "label": "Over 5 acres" },
    { "id": "b", "label": "Over 10 acres" }
  ]
}
```

An approval looks like this. `summary` says what the step does and what it uses.

```json
{
  "kind": "approval",
  "prompt": "MAIA needs approval before it runs this step.",
  "action": "Enriching owner contacts",
  "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."
}
```

Four things to know before you answer:

- **MAIA asks a question only when the answer would change the result.** Everything else it decides, and it tells you which default it chose.
- **Every approval the web app asks for reaches your client.** The list is on [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch). For a run above your row limit, the summary names the column, the row count, and the credits. Approving spends credits.
- **Only `approve_step` approves a step, and your client asks you first.** Your client must send the `approval_id` and the `summary` exactly as `get_run` gave them, or MAIA refuses the call. Your client asks you before each `approve_step` call. If you set the tool to "always allow" in your client, it no longer asks.
- **Decline with `respond` and MAIA does not run the step.** Set `decline` to `true`. The run goes on without the step, and a `note` tells MAIA why.

### A worked sequence

> **You ask:** Find vacant industrial parcels over 5 acres in Maricopa County, Arizona.

1. `find_county` with `query` "Maricopa, AZ". It returns the county's five-digit code.
2. `create_project` with that code and the `request` "vacant industrial parcels over 5 acres". It returns a project id, a run id, and the status `running`.
3. `get_run` with the project id. The status is still `running`, and `steps` shows what MAIA has done.
4. `get_run` again. The status is `needs_input`, and `pending_input` holds a question with its options.
5. `respond` with the `choice` you picked. The run continues.
6. `get_run` again. The status is `needs_input` again, and `pending_input` holds an approval. Your client shows you its `summary`.
7. You say yes. Your client asks you to confirm the `approve_step` call, then sends the `approval_id` and the `summary` unchanged. The run continues.
8. `get_run` again. The status is `complete`. `message` holds MAIA's answer, and `project_url` opens the map and the table.
9. `send_message` with the next request, such as "find contact details for these owners". A new run starts on the same project. Wait for `complete` first. MAIA refuses a new request while a run is in progress.

### Stopping a run

`stop_run` stops the current run on a project. A stop is not instant. MAIA halts at the next safe point and keeps what it has finished. Calling `stop_run` when nothing is running does no harm.

### Retrying safely

Pass a `request_id` to `create_project`. A repeated call with the same id returns the same project and the same run, and does not start a second one.

`request_id` protects `create_project` only. The other tools do not take one. See [Tools](https://maia-analytics.com/docs/mcp/tools).

### Limits

- **One run per project at a time.** MAIA refuses a new request on a project until its current run ends.
- **Several projects at once.** Runs on different projects do not wait for each other.
- **Approvals cannot be skipped.** A step that needs approval waits for it, over MCP as in the app.
- **Runs have a time limit.** Send a long request as several short ones.

### Related

- [Tools](https://maia-analytics.com/docs/mcp/tools) lists each tool's parameters.
- [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch) covers questions and approvals in the web app.

## In-chat project view

MAIA's project view is a card that shows a project inside the chat of an MCP client. It shows the run, the answer, a map, and the first rows of the table, without leaving the conversation.

Updated: 2026-10-08. Source: https://maia-analytics.com/docs/mcp/project-view

### What it is

In Claude on the web and in the desktop app, in ChatGPT, and in any client that supports MCP Apps, MAIA shows a project card beside the result of `create_project` and `send_message`. A client that does not support MCP Apps ignores the card and reads the tools' text. Nothing is lost. The tools return the same report either way.

### What the card shows

| Part | What it holds |
| --- | --- |
| Run status | Whether MAIA is working, waiting on you, or done |
| Steps | What MAIA is doing, with the same labels the web app shows |
| Answer | What MAIA wrote when the run finished |
| Questions and approvals | What MAIA is waiting on, with the choices. A choice, an approval, or a decline you make in the card goes straight to MAIA |
| Map | The first 25 rows, drawn on a map |
| Table | The first 25 rows, as the project's default view shows them |
| Request box | Where you type the next request. A request sent during a run is refused, so wait for the run to end |

The card refreshes on its own as the run moves.

### What it does not show

The card is a window, not the whole project.

- **It shows the first 25 rows only.** Open the project link for the full table.
- **It shows the default view.** Other views, filters, and column settings are in the web app.
- **It does not replace review.** To read the reasoning and sources behind a value, open the project. See [Review](https://maia-analytics.com/docs/using-maia/review).

### Asking about the data

The card shows rows. It does not answer questions about them. For a question about the data, ask MAIA's agent with `send_message`.

> **You ask:** Which zoning codes are in this layer?

### Limits

- **The card has three tools of its own** for reading a snapshot of the project, reading the run's status, and following the run. Your client never calls them, and they do not appear in its tool list. See [Tools](https://maia-analytics.com/docs/mcp/tools).
- **One run per project at a time.** MAIA refuses a new request on the project until the run ends.
- **Approvals still apply.** A step that needs your approval stops and waits, in the card as in the app. See [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals).

### Related

- [Tools](https://maia-analytics.com/docs/mcp/tools) documents `create_project` and `send_message`.
- [Connect](https://maia-analytics.com/docs/mcp/connect) covers setup.

# Billing

Plans, credits, what spends them, and what happens when they run out.

## Plans

MAIA has three plans: Free, Pro, and Enterprise. A plan belongs to a workspace, not to a person. It sets the credits the workspace receives each month and the counties it can open.

Updated: 2026-10-15. Source: https://maia-analytics.com/docs/billing/plans

### The three plans

|  | Free | Pro | Enterprise |
| --- | --- | --- | --- |
| Price | $0 | $499 a month | Contact us |
| Credits | $10 at signup, then refilled to $5 each month | $500 every month | Custom |
| Counties | Six: five included and one you choose | Every county MAIA covers | Custom |
| Seats |  | Unlimited | Custom |
| Database sync | No | No | Enabled by MAIA staff |

Your plan shows under your account, on the **Plan & credits** tab.

### What every plan includes

- **Every dataset MAIA holds.** No dataset costs extra, and there is no separate data subscription.
- **Chat and enrichments.** Both spend from the same credits.
- **One plan and one balance for the whole workspace.** No prices per seat and no balances per person. Any member can change the plan or buy credits.
- **The option to buy credits.** Any plan can buy credits and turn on auto-reload. See [Buy credits and auto-reload](https://maia-analytics.com/docs/billing/buy-credits).

### Free

- **$10 in credits at signup.**
- **Refilled to $5 each month.** On the reset date, monthly credits below $5 are raised to $5. Credits at or above $5 are left as they are, so the refill never stacks.
- **Six counties.** The new-project map shades the five included counties. The sixth is your [county of choice](#county-of-choice). Buying credits does not open more counties. Pro does.

> **Note:** Start with $10, spend $7, and $3 is left: on the reset date it becomes $5. Spend $2 instead, and the $8 left stays $8.

#### Your county of choice

A Free workspace can add one county outside its plan, free and for good. There is no separate step.

- **Ask for it.** A workspace admin asks for a project in a county outside the plan, or asks MAIA in a project's chat to add one. MAIA adds the county and says so. This works the same in the web app and through the [Claude or ChatGPT connector](https://maia-analytics.com/docs/mcp/connect).
- **Name one county.** If a request names two or more counties outside the plan, MAIA asks you to pick one. It never picks for you.
- **Admins only.** A request from another member does not add it. MAIA tells them to ask their admin.
- **After that, Pro.** Other counties outside the plan need Pro, which opens every county MAIA covers. Any member can upgrade on the **Plan & credits** tab. See [Upgrade to Pro](https://maia-analytics.com/docs/billing/manage-your-plan#upgrade-to-pro).
- **You cannot change it yourself.** If MAIA added a county you did not mean, email [support@maia-analytics.com](mailto:support@maia-analytics.com). Support can change it.

### Pro

- **$499 a month for the whole workspace**, with unlimited seats.
- **$500 in credits every month.** What is left at the reset date does not roll over.
- **Every county MAIA covers.**

Upgrading from Free keeps the workspace as it is. Pro's monthly credits replace whatever remained of the Free plan's credits, and checkout says so before you pay. Credits you bought are kept. See [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan).

### Enterprise

Enterprise sets credits and counties by agreement. It adds [Database sync](https://maia-analytics.com/docs/capabilities/database-sync) when enabled by MAIA staff, which connects your database to MAIA and keeps it in sync.

If your workspace has its own agreement with MAIA, that agreement sets your terms and takes precedence over this section. To ask about Enterprise, or to check which terms apply to you, email [support@maia-analytics.com](mailto:support@maia-analytics.com).

### Related

- [Credits](https://maia-analytics.com/docs/billing/credits) explains the balance a plan fills.

## Credits

Credits are a dollar balance that a MAIA workspace spends on research. A workspace can hold three kinds: monthly credits from its plan, promotional credits from MAIA, and credits it purchased.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/billing/credits

### Credits are dollars

A credit balance is an amount of money, written with a dollar sign: $500 in credits. There is no other unit, and nothing to convert.

### Three kinds of credits

| Kind | Where it comes from | When it expires |
| --- | --- | --- |
| Monthly credits, on Pro | Your plan grants them each month | At the reset date. What is left does not roll over |
| Monthly credits, on Free | Refilled to $5 each month | They do not expire. What is above $5 at the reset date stays |
| Promotional credits | MAIA adds them to a Pro workspace's period | They do not expire. Cancelling the plan removes them |
| Purchased credits | You buy them | Never |

The amounts are on [Plans](https://maia-analytics.com/docs/billing/plans).

### The order credits are spent

MAIA spends them in this order:

1. Monthly credits
2. Promotional credits
3. Purchased credits

The credits that reset are used first, so the credits you paid for keep their value longest.

> **Note:** A workspace holds $120 in monthly credits and $200 purchased. A run that spends $200 takes all $120, then $80 of the purchased credits, leaving $120.

### One balance for the workspace

Every member spends from the same balance, and so do chat and enrichments. A workspace has no separate balance for a person, a project, or a kind of work. Credits stay with the workspace that holds them and cannot be moved to another.

### When your plan changes

| Event | What happens to your credits |
| --- | --- |
| You upgrade from Free to Pro | Pro's monthly credits replace what remained of Free's. Purchased credits are kept. See [Plans](https://maia-analytics.com/docs/billing/plans) |
| You cancel Pro | Purchased credits can be spent until the paid period ends. After that they are kept, and wait until paid access resumes. See [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan) |
| You run out | New work stops until credits are added. See [Out of credits](https://maia-analytics.com/docs/billing/out-of-credits) |

### Where to see your balance

Open your account and choose **Plan & credits**. Every member of the workspace can read it.

| What you see | How it is shown |
| --- | --- |
| Monthly credits | The share remaining, as a percentage, with the date they reset. Promotional credits are counted in |
| Purchased credits | A dollar amount |
| Plan | Its price, its status, and the date it renews |

The account menu shows the same balance, so you can check it without leaving your project. When less than a fifth is left, the meter turns amber and says so.

### Related

- [What uses credits](https://maia-analytics.com/docs/billing/usage) explains what spends the balance.
- [Buy credits and auto-reload](https://maia-analytics.com/docs/billing/buy-credits) explains how to add to it.

## What uses credits

Two kinds of work spend credits in MAIA: what the main agent does in chat, and enrichments. Both spend from the same workspace balance, and the amount follows the research done.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/billing/usage

### What spends credits

| Work | Spends credits |
| --- | --- |
| A message to the main agent | Yes |
| An enrichment the agent runs | Yes |
| An enrichment you run from the table or the map | Yes |
| **Retry** on a cell, or **Re-run unavailable rows** on a column | Yes. The row is researched again |
| A colleague's runs in a project shared with you | Yes. One workspace, one balance |
| A run started over MCP | Yes. It is the same agent and the same balance |
| Opening a project, moving the map, filtering and sorting the table | No |

### What sets the amount

MAIA charges for the research a task takes. A question the data already answers spends the least. Three things move the amount above that.

- **How much the agent reads and reasons.** A question answered from one query spends less than one that takes many steps.
- **The lookups it makes.** Web searches, contact lookups, and mortgage records each add to the amount.
- **How many rows.** An enrichment does its research once per row.

Two rows in the same column can spend different amounts, because one took more research than the other. As a guide, from least to most per row: [Web research](https://maia-analytics.com/docs/enrichments/web-research) and [Computer vision](https://maia-analytics.com/docs/enrichments/computer-vision), then tenant info in [Property details](https://maia-analytics.com/docs/enrichments/property-details), then [Contacts](https://maia-analytics.com/docs/enrichments/contacts). [Mortgages and liens](https://maia-analytics.com/docs/enrichments/mortgages-and-liens) is a records lookup, priced per lookup.

The main agent takes the cheapest route that answers. It reads what the project holds, then queries core data, and researches only when neither answers. See [Main agent](https://maia-analytics.com/docs/capabilities/main-agent).

### Before a run starts

Two checks stand between you and a large bill.

- **Your row limit.** A run above it stops on an approval card that names the column and the row count. Approving spends credits. The card is shown on [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch).
- **Your balance.** MAIA estimates what an enrichment will take and checks the estimate against your balance. When the balance covers only part of an enrichment, MAIA offers to run the rows you can afford. See [Out of credits](https://maia-analytics.com/docs/billing/out-of-credits).

The main agent also tests a new column on a few rows before it runs the rest, so a badly worded question spends little.

### What you are charged

You are charged for the work done, not for the estimate.

| Case | Charged |
| --- | --- |
| A row that returns a value | Yes |
| A row that comes back Unavailable | Yes, when the research ran and found nothing it could support. No, when the reasoning shows the row stopped on an error |
| A row you run again with **Retry** or **Re-run unavailable rows** | Yes, again |
| A step that fails on an error, MAIA's or a provider's | No |
| A failed attempt that succeeds on a retry | The attempt that succeeded, not the one that failed |

### A run finishes once it starts

MAIA does not cut work off partway through a result. The run that takes your balance to $0 finishes, and new work waits until the balance is above $0 again. You can stop a run yourself from the chat, and MAIA keeps what it finished. See [Out of credits](https://maia-analytics.com/docs/billing/out-of-credits).

### How to spend less

- **Filter before you enrich.** The **Enrich** menu runs the list as you see it, and **All in list** on an unfiltered table runs the whole layer.
- **Sample first.** Choose **First 10 in list**, read the rows, and fix the question before the full run.
- **Ask the data first.** A fact the records hold spends less than the same fact researched on the web.
- **Save the method.** A [skill](https://maia-analytics.com/docs/capabilities/skills) repeats a run without the exploring that found it.

### Related

- [Credits](https://maia-analytics.com/docs/billing/credits) explains the balance.
- [Enrichments](https://maia-analytics.com/docs/enrichments/overview) explains what a researched column is.

## Buy credits and auto-reload

Any MAIA workspace can buy credits, on any plan. Purchased credits never expire. Auto-reload buys credits for you when the balance drops below a threshold, up to a monthly limit you set.

Updated: 2026-09-29. Source: https://maia-analytics.com/docs/billing/buy-credits

### What you end up with

Your balance goes up by the amount you paid. Purchased credits show as a dollar amount on the **Plan & credits** tab, and they never expire.

### Buy credits

> **Note:** Check which workspace you are in before you pay. Purchased credits stay with the workspace that bought them and cannot be moved to another.

1. Open your account and choose **Plan & credits**.
2. Pick $100, $250, or $1,000, or enter a custom amount of $5 or more.
3. Pay. MAIA opens checkout. A card you have used before is already filled in.
4. Wait for the payment to be confirmed. Your balance then updates in every open tab. You do not need to reload the page.

Three things to know before you pay:

- **Any member can buy.** Billing has no admin role.
- **Your bank may ask for verification.** No charge is made until you confirm. MAIA shows a notice, and you choose **Confirm payment** there.
- **A paid plan must be in good standing.** While a Pro plan is past due, unpaid, or ended, MAIA does not sell credits, and the purchased credits you hold wait until paid access resumes. See [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan).

Purchased credits are spent after your monthly and promotional credits. See [Credits](https://maia-analytics.com/docs/billing/credits).

### Turn on auto-reload

Auto-reload buys credits when your balance reaches a threshold. It is off until you turn it on, and it works on every plan, Free included. It charges the card from your last purchase, so buy credits once before you turn it on.

> **Note:** Auto-reload charges your saved card without asking each time. The monthly limit is what caps it, so set one you are comfortable with.

1. Open your account and choose **Plan & credits**.
2. Choose the amount to buy each time: $100, $250, or $1,000.
3. Set the threshold. MAIA buys when your whole balance is at or below it, counting monthly, promotional, and purchased credits together.
4. Set the monthly limit. It is the most auto-reload may charge your card in one billing period, up to the ceiling shown beside the field. It must be at least the amount, or MAIA will not turn auto-reload on.
5. Turn auto-reload on. MAIA saves the settings and starts watching the balance.

To turn it off, switch it off on the same tab. MAIA keeps your settings for next time.

#### An example

> **Note:** Amount $100, threshold $20, monthly limit $300. Your balance falls to $20, so MAIA charges your card $100 and the balance is $120. After three charges in one billing period, auto-reload has reached its limit. It waits for the reset date.

### When auto-reload stops

Auto-reload stops charging in these cases. The **Plan & credits** tab says which one applies.

| Case | What to do |
| --- | --- |
| The last charge was declined | Update your card |
| Your bank asked for verification | Choose **Confirm payment** |
| No card is saved | Add one |
| The monthly limit is below the amount | Raise the limit or lower the amount |
| The monthly limit is reached | Wait for the reset date, or raise the limit |
| A plan payment is overdue | Pay the open invoice. Auto-reload resumes once it is paid |
| You cancelled a paid plan | Nothing, unless you reactivate. Auto-reload then resumes with your saved settings |

### Receipts

Choose **Manage billing** on the **Plan & credits** tab. Cards and receipts are covered on [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan).

### Limits

- **You pay first.** Work spends credits you already hold. MAIA never bills you afterward.
- **The monthly limit has a ceiling.** MAIA shows it beside the field.

### Related

- [Credits](https://maia-analytics.com/docs/billing/credits) explains the order credits are spent in.
- [Out of credits](https://maia-analytics.com/docs/billing/out-of-credits) explains what happens at $0.

## Out of credits

A MAIA workspace is out of credits when its balance reaches $0. New work stops, running work finishes, and everything already built stays available. New work can start again once credits are added.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/billing/out-of-credits

### What happens at $0

| What | At $0 |
| --- | --- |
| New chat messages | Not sent |
| New enrichments | Do not start |
| Work already running | Finishes, even if it takes the balance below $0. The shortfall comes out of the next credits added |
| Projects, layers, tables, and skills | Stay available. Nothing is removed |

The chat box tells you when you are out of credits. On the Free plan it also shows the date your monthly credits reset. Over MCP, a run refused at $0 returns the same message to your client.

### Three ways back

| Route | Where | How long it takes |
| --- | --- | --- |
| [Buy credits](https://maia-analytics.com/docs/billing/buy-credits) | Your account, then **Plan & credits** | As soon as the payment is confirmed |
| [Upgrade from Free to Pro](https://maia-analytics.com/docs/billing/manage-your-plan#upgrade-to-pro) | The same tab, or the notice in the chat box | As soon as the payment is confirmed |
| Wait for your monthly credits | The reset date is on the **Plan & credits** tab | Until the reset date |

The balance updates in every open tab once payment is confirmed.

> **Note:** Two cases where buying credits is not the way back. While a Pro plan is past due, unpaid, or ended, MAIA does not sell credits, and the purchased credits you hold wait until paid access resumes. See [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan). And if auto-reload was on and you still reached $0, auto-reload has stopped for a reason the **Plan & credits** tab names. See [When auto-reload stops](https://maia-analytics.com/docs/billing/buy-credits#when-auto-reload-stops).

### Stopped work does not restart on its own

MAIA never runs stopped work again on its own. You choose when to continue.

| What stopped | What to do |
| --- | --- |
| A chat message | It is still in the chat box. Send it |
| An enrichment | Start it again. Rows that already hold a value are skipped, and so are rows that came back Unavailable |

### When a run needs more than you have

A balance above $0 can still be too small for a large enrichment. Chat messages are not estimated; any balance above $0 sends one.

| Your balance covers | What happens |
| --- | --- |
| Part of the run | MAIA offers to run the rows you can afford. The other rows are left as they are |
| None of the run | The run does not start. Smaller work can still go ahead |

### When the plan is the problem

Out of credits is about the balance. A plan that has not been paid is a different state, and it also stops new work. See [Manage your plan](https://maia-analytics.com/docs/billing/manage-your-plan).

### Related

- [Credits](https://maia-analytics.com/docs/billing/credits) explains when monthly credits reset.
- [What uses credits](https://maia-analytics.com/docs/billing/usage) explains how to spend less.

## Manage your plan

A MAIA workspace manages its plan from the Plan & credits tab of its account: upgrade to Pro, change a card, read receipts, recover from a failed payment, cancel, and reactivate. Any member can do so.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/billing/manage-your-plan

### Where to find it

Open your account and choose **Plan & credits**. The tab shows the plan, its price, its status, and the date it renews.

Any member of the workspace can read the tab and act on it. Billing has no admin role, so any member can upgrade, buy credits, or cancel, and each of those applies to the whole workspace.

### Upgrade to Pro

Start the upgrade from the **Plan & credits** tab, or from the notice MAIA shows when you run out of credits. Check which workspace you are in first. Payment is taken at checkout.

- **The workspace stays the same.** Projects, data, members, and history are kept.
- **Free's monthly credits end when you subscribe.** Pro's monthly credits are added at once, and again each month. Checkout says so before you pay.
- **Purchased credits are kept.** Only the Free plan's monthly credits are replaced.
- **Pro starts when the payment is confirmed**, not when checkout closes.

### Cards and receipts

On Pro, choose **Manage billing** on the **Plan & credits** tab to change your card, add a billing address, and read your payments and receipts.

### Plan status

| Status | What it means | Can you work? |
| --- | --- | --- |
| Active | The plan is paid | Yes |
| Payment retrying | A renewal payment did not go through, and MAIA is retrying it | Yes |
| Paid work paused | The retries ran out | No. Pay the open invoice from **Manage billing** |
| Ended | The plan was cancelled and its paid period is over | No, until you reactivate |

### When a payment fails

MAIA shows a warning on every page and retries the payment for about a week. Work continues during the retry period, and auto-reload waits until the plan is paid.

1. Choose **Manage billing** on the **Plan & credits** tab and update your card. The warning clears when a payment goes through.
2. If the retries ran out and work has paused, pay the open invoice from **Manage billing**. Work resumes where you left it. A message that could not be sent is still in the chat box. Send it again.

### Cancel

Choose **Cancel subscription** on the **Plan & credits** tab. MAIA tells you what you keep before you confirm. Cancelling applies to the whole workspace, and any member can do it.

| What | After you cancel |
| --- | --- |
| Paid access | Continues until the end of the period you paid for |
| Purchased credits | Spendable until the paid period ends. After that they are kept, and wait until paid access resumes |
| Monthly credits | End with the period |
| Auto-reload | Stops charging at once |
| Projects and data | Kept |

### Reactivate

Reactivate from the same tab. Purchased credits you held are there when paid access resumes, and auto-reload resumes with the settings you saved.

### Limits

- **Pro is billed monthly.** There is no annual plan.

### Related

- [Plans](https://maia-analytics.com/docs/billing/plans) compares Free, Pro, and Enterprise.
- [Buy credits and auto-reload](https://maia-analytics.com/docs/billing/buy-credits) covers adding credits without changing plan.

# Reference

Limits, file formats, restricted uses, and answers to common questions.

## Limits

MAIA's limits in one place: how large a file, a layer, a sync, an enrichment batch, or an export can be, how long a query can run, and what MAIA does not do.

Updated: 2026-10-15. Source: https://maia-analytics.com/docs/reference/limits

### Projects and runs

| Limit | Value | At the limit |
| --- | --- | --- |
| Counties per project | 200 | Start a separate project for the rest. Counties with a very large number of parcels are allowed, and MAIA says that queries will be slower. A workspace that reads its counties from its own database keeps one county per project |
| Runs per project at a time | 1 | A new request waits, or is refused over MCP, until the run ends |
| Projects running at once | Several |  |
| Length of a run | Time-limited | Send a long job as several short requests. An enrichment already running is not cut off |

See [Dispatch](https://maia-analytics.com/docs/using-maia/dispatch) and [Runs and approvals](https://maia-analytics.com/docs/mcp/runs-and-approvals).

### Queries and layers

| Limit | Value | At the limit |
| --- | --- | --- |
| Features per layer | 250,000 | MAIA asks you to narrow the objective |

See [Core data](https://maia-analytics.com/docs/capabilities/core-data).

### Your data

| Limit | Value | At the limit |
| --- | --- | --- |
| File upload, size | 25 MB per file, 200 MB once unpacked |  |
| File upload, rows added as a layer or a table | 10,000 | MAIA offers **Import first rows** |
| File upload, rows matched to parcels by address | 1,000 | MAIA offers **Import first rows** |
| Files per upload | 1 | Upload again for the next file |
| PDF attached to chat | 10 MB |  |
| Database sync, rows per table | 50,000 | The table is skipped, and the connection reads **Needs attention** |
| Addresses pasted into a new project | 10 | Upload a file instead |
| Addresses pasted into chat | 25 | Upload a file instead |

See [File upload](https://maia-analytics.com/docs/capabilities/file-upload), [File formats](https://maia-analytics.com/docs/reference/file-formats), and [Database sync](https://maia-analytics.com/docs/capabilities/database-sync).

### Data discovery

| Limit | Value | At the limit |
| --- | --- | --- |
| Features per fetch | 10,000 | The fetch is narrowed by an attribute, and MAIA names the filter |

See [Data discovery](https://maia-analytics.com/docs/capabilities/data-discovery).

### Export and sharing

| Limit | Value | At the limit |
| --- | --- | --- |
| Rows per export | 10,000 | The download is refused. Filter the view, then download |
| Characters per exported cell | 32,000 |  |
| Life of a gated link | 7, 14, or 30 days | The link stops working. Create a new one |
| Life of a viewer's session | 24 hours | The viewer enters their email again |

See [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing).

### Enrichments and credits

| Limit | Value | At the limit |
| --- | --- | --- |
| Rows the agent researches without asking | Your row limit, the **Auto-enrich** setting on your profile. 0 asks every time, and the workspace default goes up to 5,000 | The run stops on an approval card |
| Rows in one batch you start | A maximum applies | MAIA runs the first rows and leaves the rest for the next batch |
| Smallest custom purchase of credits | $5 |  |
| Auto-reload, monthly limit | You set it, up to a ceiling shown beside the field | Auto-reload waits for the reset date |

See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment) and [Buy credits and auto-reload](https://maia-analytics.com/docs/billing/buy-credits).

### Skills and knowledge

| Limit | Value | At the limit |
| --- | --- | --- |
| Skill name | 120 characters |  |
| Skill description | 400 characters |  |
| Skill body | 32,000 characters |  |
| Phases in a skill's plan | 50 |  |
| Knowledge, core file | 100,000 characters |  |
| Knowledge, any other entry | 8,000 characters |  |

See [Skills](https://maia-analytics.com/docs/capabilities/skills) and [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge).

### MCP

| Limit | Value | At the limit |
| --- | --- | --- |
| Longest wait in one `get_run` call | 45 seconds | The call returns the run still running. Call again |
| Projects returned by `list_projects` | 100 |  |
| Life of an upload link from `get_upload_link` | 10 minutes, one file | Ask for a new link |

See [Tools](https://maia-analytics.com/docs/mcp/tools).

### What MAIA does not do

| MAIA does not | What it does instead |
| --- | --- |
| Give turn-by-turn directions or live traffic | Computes drive, walk, and bike times and distances on free-flowing roads, with both ends inside the project's selected counties |
| Provide a general charting tool | Produces maps and tables, and creates shareable project reports |
| Read street-level imagery | Reads overhead imagery only |
| Run a browser session | Searches the web and reads pages. It does not sign in, click, or fill forms |

The uses MAIA declines are on [Restricted uses](https://maia-analytics.com/docs/reference/restricted-uses).

## File formats

MAIA reads spreadsheets and map files on upload, reads a PDF attached to chat, and writes CSV and Excel on export. This page lists each format, what it holds, and the rules that apply to it.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/reference/file-formats

### Spreadsheets MAIA reads

| Format | Extension | Notes |
| --- | --- | --- |
| CSV | `.csv` | Location comes from an address column, latitude and longitude columns, or a WKT or GeoJSON column |
| TSV | `.tsv`, `.tab` | As CSV |
| Excel | `.xlsx`, `.xlsm` | As CSV |
| Parquet | `.parquet` | As CSV |

### Map files MAIA reads

| Format | Extension | Notes |
| --- | --- | --- |
| GeoJSON | `.geojson`, `.json` |  |
| KML | `.kml` |  |
| KMZ | `.kmz` | A zipped KML. The size after unpacking counts |
| GeoPackage | `.gpkg` |  |
| Shapefile | `.zip` | One zip that holds the `.prj`. The size after unpacking counts |

### Rules on upload

- **A Shapefile is one zip that holds its `.prj`.** Loose files are rejected, and so is a zip with no `.prj`, since MAIA cannot know the coordinate system.
- **Any coordinate system works if the file names it.** MAIA reprojects every shape to WGS84.
- **One file per upload.** To bring in two files, upload twice.
- **A file over a row limit does not fail.** MAIA offers **Import first rows**.

A valid Shapefile zip holds these four files, with one name:

```
sites.shp
sites.shx
sites.dbf
sites.prj
```

| Limit | Value |
| --- | --- |
| File size | 25 MB |
| Size after unpacking | 200 MB |
| Rows, added as a layer or a table | 10,000 |
| Rows, matched to parcels by address | 1,000 |

How MAIA classifies a file and matches its rows is on the [File upload](https://maia-analytics.com/docs/capabilities/file-upload) page.

### PDFs in chat

Where PDF attachments are turned on, you can attach a PDF to a chat message. MAIA reads it as context for the conversation. It is not imported as data.

| Limit | Value |
| --- | --- |
| File size | 10 MB |
| Encrypted PDFs | Not accepted |

### Formats MAIA writes

Export is turned on per workspace. If you do not see **Download CSV** or **Download Excel**, ask [support](mailto:support@maia-analytics.com) to turn it on.

| Format | Extension | In the app |
| --- | --- | --- |
| CSV | `.csv` | **Download CSV** from the table's options menu |
| Excel | `.xlsx` | **Download Excel** from the table's options menu |
| CSV of saved contacts | `.csv` | **Download CSV** on the project's **Contacts** page |

An export holds the layer as the table shows it, with its filters applied. A filtered view exports fewer rows than the layer holds.

| Option | What it adds |
| --- | --- |
| **Include reasoning** | A reasoning column beside each researched column |
| **Include sources** | A source column beside each researched column |
| Contact fields | The contact fields you choose, such as work email or mobile phone |

### Rules on export

| Limit | Value |
| --- | --- |
| Rows per export | 10,000 |
| Characters per cell | 32,000 |

- **MAIA does not export map formats.** There is no GeoJSON, KML, or Shapefile export.
- **Shared links carry no export.** A viewer of a shared project cannot download it. See [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing).

## Restricted uses

MAIA is for geospatial research. MAIA declines any request to use it for a decision about a person's credit, insurance, employment, tenant screening, or housing eligibility.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/reference/restricted-uses

### What MAIA declines

MAIA declines any request, however it is worded, to use MAIA, its data, or its capabilities for a decision about a person in any of these areas:

- Credit
- Insurance
- Employment
- Tenant screening
- Housing eligibility

MAIA declines before it runs any tool, and it offers no workaround. The rule holds in chat, inside a [saved skill](https://maia-analytics.com/docs/capabilities/skills), and over MCP, and it applies to anything you export from MAIA.

### What MAIA is for

MAIA is for research on property, markets, and the organizations that own them. For example:

| Research | Example |
| --- | --- |
| Property | Which parcels are zoned for the use and sized for the deal |
| Market | Where demand is growing and supply is thin |
| Mortgage | Which owners have a loan that comes due soon |
| Occupancy | Who occupies a building |
| Contact | Who owns a property, and how to reach them about it |

### Contact data

You are responsible for how you reach the people MAIA finds, including the rules on calls, texts, and email that apply to you. Contact and mailing-address columns never leave through a shared link. See [Contacts](https://maia-analytics.com/docs/enrichments/contacts) and [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing).

### The governing terms

Your use of MAIA is governed by the [Customer Terms and Conditions](https://maia-analytics.com/terms) and the [Privacy Policy](https://maia-analytics.com/privacy).

## Data and privacy

MAIA keeps each workspace's data separate, encrypts it in transit and at rest, and does not train its models on your inputs.

Updated: 2026-09-30. Source: https://maia-analytics.com/docs/reference/data-and-privacy

### Your own data

What you put into MAIA stays in your workspace, and each source has its own way out.

| Source | What MAIA keeps | How it leaves |
| --- | --- | --- |
| [File upload](https://maia-analytics.com/docs/capabilities/file-upload) | The rows you imported, in your workspace | Delete the layer or the table |
| [Database sync](https://maia-analytics.com/docs/capabilities/database-sync) | The tables you chose to sync. Your database login is held by MAIA's replication provider, not by MAIA | Disconnect removes the synced tables at once, from every project. Any remaining copy is deleted afterward |
| [Knowledge](https://maia-analytics.com/docs/capabilities/knowledge) | What you told MAIA, and what it noted from your conversations | You can read and delete every entry |
| Chat | Your conversations with the agent, in each project | Delete the project |

### How workspaces are kept apart

- Each workspace is isolated. Your layers, uploads, and synced tables live in a database instance that belongs to your workspace alone, and the agent's queries run there with access to that project only. Projects, chat, skills, and knowledge are stored per workspace, and every read is scoped to yours.
- A project is private until its owner opens it to the workspace or sends a link.

### What stays private to you

Favorites, personal skills, and personal knowledge belong to you, not to your workspace. See [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces).

### What we commit to

| Principle | What it means |
| --- | --- |
| You own your data | Your account information belongs to you. To delete it or get a copy, send a privacy request |
| We do not sell data | We never sell your personal data to advertisers or data brokers |
| We protect your data | Your data is encrypted in transit and at rest, with access controls and monitoring |
| We do not train on your data | We improve MAIA using anonymized, aggregated data and the feedback you choose to send, never the projects, files, or messages you put in MAIA |
| We respect your rights | California users have rights under the California Privacy Rights Act (CPRA) to access, delete, and correct. All users can send a privacy request |

The full statement is on the [data principles](https://maia-analytics.com/data) page and in the [Privacy Policy](https://maia-analytics.com/privacy).

### Privacy requests

1. Email [support@maia-analytics.com](mailto:support@maia-analytics.com) from the address on your account.
2. Say whether you want a copy of your data, a correction, or deletion.

## Frequently asked questions

Short answers about what MAIA covers, what data it includes, how it is priced, and how it handles your data. Each answer stands on its own.

Updated: 2026-10-16. Source: https://maia-analytics.com/docs/reference/faq

### Does MAIA cover my market?

The Free plan opens five counties, plus one [county of choice](https://maia-analytics.com/docs/billing/plans#county-of-choice) that a workspace admin adds by asking for a project in it. Pro opens every county MAIA covers. Data depth varies by county, and the catalog in the app shows what each county holds. See [Plans](https://maia-analytics.com/docs/billing/plans) and [Core data](https://maia-analytics.com/docs/capabilities/core-data).

![The new project screen. A map of the United States with every county shaded as in your plan, a legend reading In your plan and Not in your plan, and a list of counties to the right with a search box.](https://maia-analytics.com/product-shots/docs/county-picker@2x.png)

The county picker marks the counties your plan opens.

### What data does MAIA include?

Every dataset MAIA holds is included in every plan: parcels and ownership, buildings and businesses, demographics, roads and the electric grid, flood and environmental records, schools, permits, and incentive zones, plus overhead imagery for computer vision. There is no data subscription underneath the plan. See [Core data](https://maia-analytics.com/docs/capabilities/core-data).

### How is MAIA different from a GIS or a data vendor?

A GIS gives you tools and expects you to bring the data and the method. A data vendor sells you records and leaves the analysis to you. MAIA holds the data, runs the research, and shows its sources. You bring the objective.

### How is MAIA priced?

MAIA is priced by the research you run, not by the number of people on your team. The Free plan costs nothing. Pro is $499 a month and includes $500 in credits every month, with unlimited seats. Chat and enrichments spend from one credit balance. See [Plans](https://maia-analytics.com/docs/billing/plans).

### Can MAIA find the person behind an LLC?

Yes. MAIA traces LLCs, trusts, and companies to people, using property records, state filings, the organization's own website, and professional profiles. Each contact shows how well its identity is supported. Filter the list to the owners you will call before you run it. See [Contacts](https://maia-analytics.com/docs/enrichments/contacts).

### Can I use my own data in MAIA?

Yes. Upload a spreadsheet or a map file, and MAIA matches the rows to parcels or adds them as a layer. One file at a time, up to 10,000 rows, or 1,000 rows matched by address. Enterprise workspaces can also connect a database and keep it in sync. See [File upload](https://maia-analytics.com/docs/capabilities/file-upload) and [Database sync](https://maia-analytics.com/docs/capabilities/database-sync).

### Can I use MAIA from Claude, ChatGPT, or another AI assistant?

Yes. It works with Claude, ChatGPT, and other MCP clients, and it reaches the same agent and projects as the web app. Licensed property data, such as owner names and values, is never returned by the connector's SQL tools; sign in to MAIA to see it. See [`query_project`](https://maia-analytics.com/docs/mcp/tools#query-project). In Claude, connect [MAIA from the Connectors Directory](https://claude.ai/directory/maia). In ChatGPT, install [MAIA from the plugin directory](https://chatgpt.com/plugins/plugin_asdk_app_6abf3cf2cc348191add64681d2d468ed). See [Connect](https://maia-analytics.com/docs/mcp/connect).

### Does MAIA train on my data?

No. We improve MAIA using anonymized, aggregated data and the feedback you choose to send, never the projects, files, or messages you put in MAIA. See [Data and privacy](https://maia-analytics.com/docs/reference/data-and-privacy).

### What happens when MAIA cannot find an answer?

The cell reads **Unavailable**, and the reasoning says what MAIA checked. MAIA does not fill the gap with a guess.

### Does MAIA test an enrichment before it runs on everything?

When the agent starts a column, yes. It runs one row or a small sample first, reads the results, and corrects the column before it runs the rest. When you start a run from the **Enrich** menu, you choose the count. See [Run an enrichment](https://maia-analytics.com/docs/enrichments/run-an-enrichment).

### Can my team work in the same MAIA project?

Yes. Set a project's access for your workspace to **Can view** or **Can edit**. A new project starts private. A project set to **Can edit** has one chat, so one person dispatches at a time, and a colleague's runs spend the workspace's credits. You can also send a link to someone outside the workspace. See [Shared workspaces](https://maia-analytics.com/docs/capabilities/shared-workspaces) and [Sharing and publishing](https://maia-analytics.com/docs/capabilities/sharing-and-publishing).

### Can MAIA run a long job while I do something else?

Yes. Work in MAIA runs on its own servers, not in your browser tab. The main agent's run continues after you close the project, and so does every enrichment: rows fill in as they finish, and the answer is waiting in the chat when you come back. Work still spends credits while you are away. To stop a run, stop it from the project's chat.

### Does MAIA compute drive times?

Yes. Ask for the drive, walk, or bike time or distance between places, for the places within a travel-time budget, or for the area reachable within one, and MAIA routes over the road network. Times assume free-flowing traffic and show as hours and minutes. Distances show in miles. Both ends must lie inside the project's selected counties, and the route in between may leave them. Ask for a radius, or "as the crow flies", and MAIA measures straight-line distance instead. When MAIA cannot route, because a place is too far from any road or no route exists, it says so rather than answering with nothing.

### How do I get help with MAIA?

Email [support@maia-analytics.com](mailto:support@maia-analytics.com). Include the project name and the question you asked.
