Documentation menu
Agents

Available tools

Tools for parcels, zoning, permits, cases, jurisdictions and usage.

The Placestack MCP server gives AI assistants such as Claude, ChatGPT and Cursor access to parcels, zoning, permits and zoning cases.

Tools

whoamiCheck this connection
get_usageCheck credit balance and usage
find_requestList requests
find_eventList events
find_jurisdictionFind jurisdictions
get_jurisdictionLook up a jurisdiction
find_parcelFind parcels
get_parcelLook up a parcel
resolve_parcel_batchLook up a list of addresses or numbers
find_zoningFind zoning
get_zoningLook up a zoning district
find_permitFind permits
get_permitLook up a permit
find_caseFind zoning and development cases
get_caseLook up a zoning or development case
find_listFind saved lists
find_list_itemList a saved list's items
create_listCreate a list
update_listRename a list
add_list_itemAdd places to a list
update_list_itemUpdate a list item
remove_list_itemRemove a place from a list

whoami

Returns the organization, plan, scopes and credit balance of this connection, and whether it is a person or an API key.

Call it first when a call is refused, to see which scope or credit is missing. Free.

Takes no arguments.

Returns

The response of GET /v1/me.

get_usage

Returns the organization's credit balance, the credits its plan includes each period, and spending by day and by operation.

Check it before a large or repeated request. Free.

Arguments

daysHow far back to count.

Returns

The response of GET /usage.

find_request

Lists the organization's requests to the /v1 routes, newest first, with who made each one, what it cost and its status.

Use it to see what a charge was for or why a call failed. The totals in get_usage add up these requests. Not available to a connection made with an API key. Free.

Arguments

request_idA request id, from the request-id response header. Only that request.
routeRoute templates, such as /v1/parcel or /v1/parcel/{parcel_id}. Only requests to these.
keyAn API key id. Only requests made with that key.
userA user id. Only requests that user made, directly or through an OAuth client.
clientAn OAuth client id. Only requests that came through it.
actor_methodHow the request authenticated: session, api_key, oauth or mcp.
errorTrue for requests answered with a status of 400 or more, false for the rest.
min_occurredArrived at or after this instant, in ISO 8601.
max_occurredArrived before this instant, in ISO 8601.
sizeHow many to return.
cursorThe previous answer's next_cursor, for the next page.

Returns

The response of GET /usage/request.

find_event

Lists permits and cases filed on the places of the organization's watched lists, newest first, as events.

Each event's data holds the permit or case id; get_permit or get_case returns the record. Free.

Arguments

typeOnly events of these types: permit.created or case.created.
min_createdCreated at or after this instant, in ISO 8601.
sizeHow many to return.
cursorThe previous answer's next_cursor, for the next page.

Returns

The response of GET /v1/event.

find_jurisdiction

Finds jurisdictions that contain a point, match a Census code, or fit a filter such as state, county, name or type. Free.

Each result has its id, its fips (the Census GEOID with its level named), its identifiers, within (the jurisdictions that contain it), and coverage. coverage.parcel and coverage.zoning each give a count, or null when there is no data. A count includes every jurisdiction inside, so a state's is the total across its counties. To check whether a county is covered, find it and read its coverage. A county's statistics.parcel gives its parcel count, median market value, lot size, year built and sale price, sales in the last year, and parcels by land use.

Arguments

latLatitude of a point, in WGS 84. With lon, the jurisdictions whose boundary contains the point.
lonLongitude of the point, in WGS 84.
fipsA US Census GEOID: 37, 37183 or 3755000. The jurisdiction with that code.
stateA US state, as NC or 37. The jurisdictions within it.
countyA US county, as 37183, or 183 with state. The jurisdictions within it.
qA name, or the start of one. Best match first.
tierOne of region, subregion or local.
typeThe local word for the kind: county, city, town, village, township.
withinA jurisdiction id. The jurisdictions inside it.
includegeometry, to add each jurisdiction's boundary as GeoJSON. Large; leave it out unless the shape is the question.
sizeHow many to return.
cursorThe previous answer's next_cursor, for the next page.
totalTrue adds total, the count of every match, to the first page.

Returns

The response of GET /v1/jurisdiction.

get_jurisdiction

Retrieves a jurisdiction by its jur_ id, with its fips, identifiers, within (the jurisdictions that contain it), coverage and statistics. Free.

coverage.parcel and coverage.zoning each give a count, or null when there is no data. A count includes every jurisdiction inside. A jurisdiction can have parcels without zoning, or zoning without parcels. statistics.parcel gives a county's median market value, lot size, year built and sale price, its sales in the last year and its parcels by land use, computed daily; it is null for anything but a county with parcels. To search by Census code or name, use find_jurisdiction.

Arguments

jurisdiction_idThe jurisdiction's id. Required.
includegeometry, to add the boundary as GeoJSON. Large; leave it out unless the shape is the question.

Returns

The response of GET /v1/jurisdiction/{jurisdiction_id}.

find_parcel

Finds parcels by address, parcel number or point, lists the parcels in an area, or filters parcels within a county.

Each parcel has its number and identifiers, jurisdiction, area, addresses, owners, latest assessment, buildings, sales and legal description, plus match, which says how it was found. An address that fits several parcels returns each of them, and a point on a condo lot returns every parcel on it. Send one locator at a time. A list needs a jurisdiction, fips, area or filter. To see how many parcels a list holds, call with size=1 and total=true.

An address, parcel number or point costs one credit, however many parcels it returns. A search costs 1 credit per 20 results.

Arguments

addressA street address, with its city or postal code where known. The parcels it names, best match first, each with a match.
apnA parcel number, as published. Requires jurisdiction or fips.
latLatitude of a point, in WGS 84. With lon, the parcel whose shape holds the point; with radius too, the parcels around it, nearest first.
lonLongitude of the point, in WGS 84.
radiusRadius around the point, in meters. At most 25,000.
bboxA bounding box as west,south,east,north in WGS 84. The parcels whose shape touches it.
jurisdictionA jur_ id. Parcels it assesses or that lie within it.
fipsA US Census GEOID, 2 digits for a state or 5 for a county: 48, 48453.
ownerAn owner's name, or words from it.
localityThe city, town or village the address sits in. A parcel with no address never matches.
postal_codeThe address's postal code. A parcel with no address never matches.
useThe assessor's use code, as published.
class_codeThe assessor's property class code, as published.
land_useStandard land uses, matched on the use or the property class: a category (residential, commercial, industrial, agricultural, vacant, institutional, open_space, utility, mixed, exempt, mineral_rights), which also matches its kinds, or one kind, such as residential.single_family or vacant.commercial. Works across counties.
min_acresMeasured area of at least this many acres. A parcel with no measured area never matches.
max_acresMeasured area of at most this many acres. A parcel with no measured area never matches.
min_market_valueLatest total market value of at least this much. A parcel with no assessed value never matches.
max_market_valueLatest total market value of at most this much. A parcel with no assessed value never matches.
min_year_builtMain building built in or after this year. A parcel with no building never matches.
max_year_builtMain building built in or before this year. A parcel with no building never matches.
min_building_areaGross building area of at least this many square feet. A parcel with no building never matches.
max_building_areaGross building area of at most this many square feet. A parcel with no building never matches.
min_sale_priceLatest sale price of at least this much. A parcel with no recorded sale never matches.
max_sale_priceLatest sale price of at most this much. A parcel with no recorded sale never matches.
min_sale_dateLatest sale on or after this date, as YYYY-MM-DD. A parcel with no recorded sale never matches.
max_sale_dateLatest sale on or before this date, as YYYY-MM-DD. A parcel with no recorded sale never matches.
sortHow to order the page: acres, building_area, market_value, sale_date, sale_price or year_built, prefixed with - for descending. Not accepted with address or owner.
includegeometry, to add each parcel's boundary as GeoJSON. Large; leave it out unless the shape is the question.
sizeHow many to return, between 1 and 200. 1 credit per 20 results.
cursorThe previous answer's next_cursor, for the next page.
totalTrue adds total, the count of every match, to the first page.

Returns

The response of GET /v1/parcel.

get_parcel

Retrieves a parcel by its prc_ id, with its identifiers, jurisdiction, area, addresses, owners, latest assessment, buildings, sales and legal description. One credit. Repeat requests within a day are free.

In a client that renders MCP Apps, the parcel appears as a card with its boundary over aerial imagery. To look up an address, parcel number or point, use find_parcel.

Arguments

parcel_idThe parcel's id. Required.
includegeometry, to add the boundary as GeoJSON.

Returns

The response of GET /v1/parcel/{parcel_id}.

resolve_parcel_batch

Looks up a list of addresses or parcel numbers in one call, such as a spreadsheet column.

Returns one entry per locator, in the order sent, with its status (matched, ambiguous, unmatched or invalid), how many parcels fit, and the best parcel with its match. One credit per locator matched. Locators that match nothing are free.

Arguments

itemUp to 500 locators, each one of: {address}, {apn, fips} or {apn, jurisdiction}, {lat, lon}, or {parcel}. Required.

Returns

The response of POST /v1/parcel/batch.

find_zoning

Finds the zoning at a place, or lists every zoning classification a jurisdiction defines.

A place (address, lat and lon, parcel or bbox) returns its base classification and any overlays, base first. A jurisdiction or fips returns every classification it defines, and code narrows that to one district.

allowances and standards are included only with include=allowance or include=standard, each entry with its citation. A use missing from allowances is not prohibited: unlisted_uses, always included, gives the ordinance's rule for unlisted uses.

One credit per place, however many classifications apply. A jurisdiction's full list is charged per page.

Arguments

addressA street address, with its city or postal code where known. Zoning is read at the center of the parcel it best matches.
latLatitude of a point, in WGS 84. Requires lon.
lonLongitude of the point, in WGS 84.
parcelA prc_ id. Zoning is read at the parcel's center.
bboxA bounding box as west,south,east,north in WGS 84. The classifications mapped inside it.
jurisdictionA jur_ id, for every classification it defines.
fipsA US Census GEOID, 2 digits for a state or 5 for a county: 08, 48453.
codeA district code such as R-1. Requires jurisdiction or fips.
kindbase or overlay.
useA use, as the ordinance names it. Only classifications whose allowances list it.
resultWith use, only the classifications whose answer for it is this.
legal_statusadopted, the default, or proposed for what a pending amendment would create.
includeComma-separated sections: allowance for what each use may do, standard for the dimensional standards, geometry for the areas covered. All large; ask for what the question needs.
sizeHow many to return.
cursorThe previous answer's next_cursor, for the next page.
totalTrue adds total, the count of every match, to the first page.

Returns

The response of GET /v1/zoning.

get_zoning

Retrieves a zoning classification by its zon_ id, with the jurisdiction and ordinance that adopted it and the dates it is in effect. One credit. Repeat requests within a day are free.

To find the zoning at a place, use find_zoning.

Arguments

zoning_idThe zoning classification's id. Required.
includeComma-separated sections: allowance, standard, geometry.

Returns

The response of GET /v1/zoning/{zoning_id}.

find_permit

Finds building and trade permits on a parcel, near a point, in an area or in a jurisdiction.

Needs one of parcel, lat and lon, bbox, jurisdiction or fips. Each permit has its number, type, status, parcels, addresses, parties, dates, declared value, fees and decision. A null decision means the permit is pending. The outcome is the permit's status, so a permit that was issued and has since expired shows Expired.

1 credit per 20 results. Repeat requests within a day are free.

Arguments

parcelA prc_ id. The permits that concern it.
latLatitude of a point, in WGS 84. With lon, the permits located within radius.
lonLongitude of the point, in WGS 84.
radiusRadius around the point, in meters. At most 25,000. Defaults to 1,000.
bboxA bounding box as west,south,east,north in WGS 84. The permits located inside it.
jurisdictionA jur_ id. The permits it issues or that lie within it.
fipsA US Census GEOID, 2 digits for a state or 5 for a county: 37, 37183.
typePermit type code, as published.
statusStatus code, as published.
outcomeDecision outcome code, as published.
decidedTrue for permits issued or refused, false for pending ones.
partyA name on the permit, such as a contractor or owner, or words from it.
qWords from the description of the work. Best match first.
min_appliedApplied for on or after this date, as YYYY-MM-DD.
max_appliedApplied for on or before this date, as YYYY-MM-DD.
min_decidedDecided on or after this date, as YYYY-MM-DD.
max_decidedDecided on or before this date, as YYYY-MM-DD.
min_valuationDeclared value of at least this much. A permit with no declared value never matches.
max_valuationDeclared value of at most this much. A permit with no declared value never matches.
sortHow to order the page: applied, decided, issued or valuation, prefixed with - for descending. Not accepted with q.
sizeHow many to return, between 1 and 200. 1 credit per 20 results.
cursorThe previous answer's next_cursor, for the next page.
totalTrue adds total, the count of every match, to the first page.

Returns

The response of GET /v1/permit.

get_permit

Retrieves a permit by its pmt_ id, with its parcels, addresses, parties, dates, declared value, fees and decision. One credit. Repeat requests within a day are free.

A null decision means the permit is pending. To find permits on a parcel or at a place, use find_permit.

Arguments

permit_idThe permit's id. Required.

Returns

The response of GET /v1/permit/{permit_id}.

find_case

Finds zoning and development cases (rezonings, variances, special uses, subdivisions and site plans) on a parcel, near a point, in an area or in a jurisdiction.

Needs one of parcel, lat and lon, bbox, jurisdiction or fips. Each case has its number, type, status, parcels, addresses, parties, dates, decision and conditions, and the zoning it concerns: for a rezoning, the from and to districts. A null decision means the case is pending. A case can be closed with no decision published.

1 credit per 20 results. Repeat requests within a day are free.

Arguments

parcelA prc_ id. The cases that concern it.
latLatitude of a point, in WGS 84. With lon, the cases located within radius.
lonLongitude of the point, in WGS 84.
radiusRadius around the point, in meters. At most 25,000. Defaults to 1,000.
bboxA bounding box as west,south,east,north in WGS 84. The cases located inside it.
jurisdictionA jur_ id. The cases filed with it or that lie within it.
fipsA US Census GEOID, 2 digits for a state or 5 for a county: 37, 37183.
typeCase type code, as published.
statusStatus code, as published.
outcomeDecision outcome code, as published.
decidedTrue for cases with a decision, false for pending ones.
partyA name on the case, such as an applicant or owner, or words from it.
qWords from the description of the request. Best match first.
min_appliedFiled on or after this date, as YYYY-MM-DD.
max_appliedFiled on or before this date, as YYYY-MM-DD.
min_decidedDecided on or after this date, as YYYY-MM-DD.
max_decidedDecided on or before this date, as YYYY-MM-DD.
sortHow to order the page: applied or decided, prefixed with - for descending. Not accepted with q.
sizeHow many to return, between 1 and 200. 1 credit per 20 results.
cursorThe previous answer's next_cursor, for the next page.
totalTrue adds total, the count of every match, to the first page.

Returns

The response of GET /v1/case.

get_case

Retrieves a case by its cas_ id, with its parcels, addresses, parties, dates, decision, conditions and zoning. One credit. Repeat requests within a day are free.

A null decision means the case is pending. To find cases on a parcel or at a place, use find_case.

Arguments

case_idThe case's id. Required.

Returns

The response of GET /v1/case/{case_id}.

find_list

Lists the organization's saved lists of places, most recently updated first, each with its name and item_count. Free.

With parcel, only the lists that hold it, to see whether a parcel is already saved. To read what a list holds, use find_list_item.

Arguments

parcelA prc_ id. Only lists with a site that includes it.

Returns

The response of GET /v1/list.

find_list_item

Lists every item on a saved list, most recently added first, with its kind, name, status, notes and who added it. Free.

An item is a site (one or more parcels), a city or county, a ZIP code or a drawn area, and a city, county, ZIP code or area can carry parcel filters. A site keeps the address, parcel numbers and acres it had when saved: retrieve each parcel with get_parcel for its current record.

Arguments

list_idThe list's id. Required.
parcelA prc_ id. Only sites that include it.

Returns

The response of GET /v1/list/{list_id}/item.

create_list

Creates an empty saved list and returns it with its id. Add places to it with add_list_item. Free.

Arguments

nameThe list's name, up to 200 characters. Required.

Returns

The response of POST /v1/list.

update_list

Renames a saved list and returns it. Free.

Arguments

list_idThe list's id. Required.
nameThe list's new name, up to 200 characters. Required.

Returns

The response of PATCH /v1/list/{list_id}.

add_list_item

Adds sites, cities, counties, ZIP codes or areas to a saved list, and returns the items added.

A site is one or more parcels; find their ids with find_parcel or resolve_parcel_batch first. Each parcel saved in a site costs a credit, as a lookup. A place already on the list is returned as is and not added twice. On a watched list, new items count toward the organization's monitoring limits.

Arguments

list_idThe list's id. Required.
itemUp to 500 items. Each has a kind and what that kind needs: {kind: site, parcel: [prc_ ids]}, {kind: jurisdiction, jurisdiction: jur_ id}, {kind: postal_code, postal_code}, or {kind: area, geometry: a GeoJSON Polygon}. Any item may also have name, status (`new`, `reviewing`, `pursuing` or `passed`), notes and tags. A city, county, ZIP code or area may have a filter of find_parcel parameters: owner, land_use, and the min_ and max_ forms of acres, market_value, year_built, sale_price and sale_date. Required.

Returns

The response of POST /v1/list/{list_id}/item.

update_list_item

Updates a list item's name, status, notes, tags, parcels or filter, and returns the item.

Arguments left out are unchanged. Replacing a site's parcels costs a credit per parcel, as a lookup.

Arguments

list_idThe list's id. Required.
item_idThe item's id, from find_list_item. Required.
nameThe item's name. An empty string clears it.
statusOne of `new`, `reviewing`, `pursuing` or `passed`.
notesNotes. Replaces the current notes. An empty string clears them.
tagsThe complete set of tags. Replaces the current set. An empty list clears them.
parcelA site's complete set of prc_ ids. Replaces the current set.
filterA city, county, ZIP code or area's complete filter. Replaces the current one. An empty object clears it.

Returns

The response of PATCH /v1/list/{list_id}/item/{item_id}.

remove_list_item

Removes one item from a saved list. The list and its other items are unchanged. Free.

Arguments

list_idThe list's id. Required.
item_idThe item's id, from find_list_item. Required.

Returns

The response of DELETE /v1/list/{list_id}/item/{item_id}.

Prompts

Prompts are ready-made questions in your client’s slash menu. In Claude Code they are /placestack commands. In Claude Desktop they are in the connector’s menu. State, county, day range and radius arguments autocomplete.

Check coverage

county, state

Whether Placestack has parcels and zoning for one county, and how many of each.

Locate a point

latitude, longitude

The state, county and city at a point, with the data Placestack has for each.

Spending report

days

The organization's credit spend over a window, what is left, and whether it will last.

Property report

address

The county's record for one address: owner, size, value, building, last sale and legal description.

Find land

county, state, criteria

Parcels in one county that fit a size, use, value or owner, counted before they are listed.

Owner portfolio

owner, county, state

Every parcel one name holds in a county, with the total acreage and the owner's mailing address.

Batch lookup

items, state

A pasted list turned into parcel records, with what matched, what was ambiguous and what was not found.

Zoning for a site

address, use

What the zoning at one address allows, with the section of the code for each answer.

Where a use is allowed

use, county, state

The districts in one city or county that allow a use, separated from the ones that allow it only with conditions.

Nearby parcels

latitude, longitude, radius

The parcels within a distance of a point, nearest first, summarized by use and owner.

Skill

The server provides one resource, skill://placestack/SKILL.md, a guide for assistants on when to use Placestack, how to find parcels, what searches cost and how to read results. No setup is needed.