Who owns any Tennessee parcel: owner search, ownership and sale history across 2.8M parcels.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Start here. Describes what data exists: totals, every loaded county with parcel and ownership-record counts, how much ownership history each county has, which fields each county populates, data sources, bulk download files, query tips and usage terms.
This tool takes no arguments.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http tn-property https://tnpropertysearch.app/mcp
Start here. Describes what data exists: totals, every loaded county with parcel and ownership-record counts, how much ownership history each county has, which fields each county populates, data sources, bulk download files, query tips and usage terms.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Everything known about one parcel: full parcel record, every ownership record (current and former, with acquisition dates, prices and deed references/links where the county provides them), sale history for Hamilton, and the county Register of Deeds website. Look up by pin, or by apn plus county.
| Argument | Type | Description |
|---|---|---|
| apn | string | Assessor parcel number. |
| pin | string | Parcel id as returned by other tools. |
| county | string | County, to disambiguate apn. |
| include_geometry | boolean | Include the boundary rings ([lon,lat] pairs). |
{
"type": "object",
"required": [],
"properties": {
"apn": {
"type": "string",
"description": "Assessor parcel number."
},
"pin": {
"type": "string",
"description": "Parcel id as returned by other tools."
},
"county": {
"type": "string",
"description": "County, to disambiguate apn."
},
"include_geometry": {
"type": "boolean",
"description": "Include the boundary rings ([lon,lat] pairs)."
}
},
"additionalProperties": false
}Every property an owner (by owner_key) or a mailing address has ever been recorded on, newest first, with whether they still own it, when they acquired it and the recorded price. Includes summary counts. Searching by mailing address groups LLCs and trusts that share a mailbox.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Records per page, 1–1000 (default 200). |
| county | string | Limit to county(ies). |
| cursor | string | next_cursor from the previous page, to fetch the next page. |
| mailing | string | Exact mailing address as stored (from a property or owner record). |
| owner_key | string | owner_key from search_owners (an exact name also works; it is normalized). |
| current_only | boolean | Only properties still owned. |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Records per page, 1–1000 (default 200)."
},
"county": {
"type": "string",
"description": "Limit to county(ies)."
},
"cursor": {
"type": "string",
"description": "next_cursor from the previous page, to fetch the next page."
},
"mailing": {
"type": "string",
"description": "Exact mailing address as stored (from a property or owner record)."
},
"owner_key": {
"type": "string",
"description": "owner_key from search_owners (an exact name also works; it is normalized)."
},
"current_only": {
"type": "boolean",
"description": "Only properties still owned."
}
},
"additionalProperties": false
}Which parcel contains a latitude/longitude. Uses the actual parcel boundary, not the nearest centroid.
| Argument | Type | Description |
|---|---|---|
| lat* | number | Latitude. |
| lon* | number | Longitude. |
{
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude."
},
"lon": {
"type": "number",
"description": "Longitude."
}
},
"additionalProperties": false
}Parcel counts, total/average/median appraised value and total acres grouped by county, city, zip, land_use, zoning, owner, mailing or subdivision, statewide or for one county. Use it for 'largest owners in Davidson' or 'value by land use'.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Groups to return, 1–500 (default 25). |
| county | string | One county (default: statewide). |
| group_by | string | Field to group on. |
{
"type": "object",
"required": [],
"properties": {
"limit": {
"type": "integer",
"description": "Groups to return, 1–500 (default 25)."
},
"county": {
"type": "string",
"description": "One county (default: statewide)."
},
"group_by": {
"enum": [
"county",
"city",
"zip",
"land_use",
"zoning",
"owner",
"mailing",
"subdivision"
],
"type": "string",
"description": "Field to group on."
}
},
"additionalProperties": false
}Changes the update jobs detected, newest first: owner_change (with old and new owners), new_parcel, and retired (parcel no longer listed by the county). Filter by county, kind, owner name, date or area.
| Argument | Type | Description |
|---|---|---|
| bbox | string | Bounding box 'west,south,east,north'. |
| kind | string | Kind(s), comma-separated: owner_change, new_parcel, retired. |
| near | string | Center point 'lat,lon', e.g. '36.1627,-86.7816'. |
| limit | integer | Results per page, 1–200 (default varies by tool). |
| owner | string | Old or new owner name words. |
| since | string | Detected on or after (YYYY-MM-DD). |
| until | string | Detected on or before (YYYY-MM-DD). |
| county | string | County(ies). |
| cursor | string | next_cursor from the previous page, to fetch the next page. |
Re-read up to 5 parcels from their official county/state source right now (and, for Davidson, the full owner history), then return what changed. Use when last_checked is too old for the question, or the user says a record is out of date.
| Argument | Type | Description |
|---|---|---|
| pins* | string | Parcel pin(s), comma-separated (max 5). |
{
"type": "object",
"required": [
"pins"
],
"properties": {
"pins": {
"type": "string",
"description": "Parcel pin(s), comma-separated (max 5)."
}
},
"additionalProperties": false
}Find people and companies by name across current AND former ownership records. Each result has an owner_key, how many properties they have ever owned and own now, their counties and first/last acquisition dates. Pass an owner_key to owner_portfolio for the full list.
| Argument | Type | Description |
|---|---|---|
| name* | string | Name words in any order, e.g. 'john smith' or 'ryman hospitality'. |
| limit | integer | Owners to return, 1–100 (default 20). |
| county | string | Limit to county(ies). |
| current_only | boolean | Only owners who currently hold property. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Name words in any order, e.g. 'john smith' or 'ryman hospitality'."
},
"limit": {
"type": "integer",
"description": "Owners to return, 1–100 (default 20)."
},
"county": {
"type": "string",
"description": "Limit to county(ies)."
},
"current_only": {
"type": "boolean",
"description": "Only owners who currently hold property."
}
},
"additionalProperties": false
}Ownership records (one row per owner per parcel) for an owner, owner_key, mailing address or pin, or every transfer recorded in one county over up to 3 calendar months. Filter by price, current vs former, and address; sort by date or price. Use it for questions like 'who bought in Davidson in March 2024 over $1M'.
| Argument | Type | Description |
|---|---|---|
| pin | string | Parcel pin(s), comma-separated. |
| sort | string | date_desc (default), date_asc, price_desc. |
| limit | integer | Results per page, 1–200 (default varies by tool). |
| owner | string | Owner name words. |
| county | string | County (one, for date searches). |
| cursor | string | next_cursor from the previous page, to fetch the next page. |
| address | string | Property address words (filters the other results). |
| current | boolean | true = current owners only, false = former owners only. |
| date_to |
Find parcels by address words, current owner name, or location (near a point or inside a small box), optionally limited to a county, city or ZIP. Returns pin, address, owner, county, location and a link to the parcel in the map app. Paginate with next_cursor.
| Argument | Type | Description |
|---|---|---|
| q | string | Free text matched against the address, or the current owner name. |
| zip | string | ZIP code(s), comma-separated. |
| bbox | string | Bounding box 'west,south,east,north' in degrees (under about 5 km across). |
| city | string | City name (populated mainly in Davidson). |
| near | string | Center point 'lat,lon', e.g. '36.1627,-86.7816'. |
| sort | string | relevance (default with text), distance (default with near), address. |
| limit | integer | Results per page, 1–200 (default varies by tool). |
| owner | string | Current owner name words, e.g. 'bailey trust'. For former owners use search_owners. |
| county |
How fresh the data is: when each county was last checked, the most recent update runs with their status and counts, what is in progress, and the schedule.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.
| radius_m |
| number |
| Radius in meters around `near` (default 500). |
{
"type": "object",
"required": [],
"properties": {
"bbox": {
"type": "string",
"description": "Bounding box 'west,south,east,north'."
},
"kind": {
"type": "string",
"description": "Kind(s), comma-separated: owner_change, new_parcel, retired."
},
"near": {
"type": "string",
"description": "Center point 'lat,lon', e.g. '36.1627,-86.7816'."
},
"limit": {
"type": "integer",
"description": "Results per page, 1–200 (default varies by tool)."
},
"owner": {
"type": "string",
"description": "Old or new owner name words."
},
"since": {
"type": "string",
"description": "Detected on or after (YYYY-MM-DD)."
},
"until": {
"type": "string",
"description": "Detected on or before (YYYY-MM-DD)."
},
"county": {
"type": "string",
"description": "County(ies)."
},
"cursor": {
"type": "string",
"description": "next_cursor from the previous page, to fetch the next page."
},
"radius_m": {
"type": "number",
"description": "Radius in meters around `near` (default 500)."
}
},
"additionalProperties": false
}| string |
| Acquired on or before, YYYY-MM-DD. |
| mailing | string | Exact mailing address. |
| date_from | string | Acquired on or after, YYYY-MM-DD. |
| max_price | number | Maximum recorded price. |
| min_price | number | Minimum recorded price. |
| owner_key | string | Exact owner_key. |
{
"type": "object",
"required": [],
"properties": {
"pin": {
"type": "string",
"description": "Parcel pin(s), comma-separated."
},
"sort": {
"enum": [
"date_desc",
"date_asc",
"price_desc"
],
"type": "string",
"description": "date_desc (default), date_asc, price_desc."
},
"limit": {
"type": "integer",
"description": "Results per page, 1–200 (default varies by tool)."
},
"owner": {
"type": "string",
"description": "Owner name words."
},
"county": {
"type": "string",
"description": "County (one, for date searches)."
},
"cursor": {
"type": "string",
"description": "next_cursor from the previous page, to fetch the next page."
},
"address": {
"type": "string",
"description": "Property address words (filters the other results)."
},
"current": {
"type": "boolean",
"description": "true = current owners only, false = former owners only."
},
"date_to": {
"type": "string",
"description": "Acquired on or before, YYYY-MM-DD."
},
"mailing": {
"type": "string",
"description": "Exact mailing address."
},
"date_from": {
"type": "string",
"description": "Acquired on or after, YYYY-MM-DD."
},
"max_price": {
"type": "number",
"description": "Maximum recorded price."
},
"min_price": {
"type": "number",
"description": "Minimum recorded price."
},
"owner_key": {
"type": "string",
"description": "Exact owner_key."
}
},
"additionalProperties": false
}| string |
| County name, or several comma-separated, e.g. 'Davidson,Williamson'. |
| cursor | string | next_cursor from the previous page, to fetch the next page. |
| address | string | Property address words, any order, e.g. '1313 gallatin'. |
| radius_m | number | Radius in meters around `near` (default 500, max 2000). |
{
"type": "object",
"required": [],
"properties": {
"q": {
"type": "string",
"description": "Free text matched against the address, or the current owner name."
},
"zip": {
"type": "string",
"description": "ZIP code(s), comma-separated."
},
"bbox": {
"type": "string",
"description": "Bounding box 'west,south,east,north' in degrees (under about 5 km across)."
},
"city": {
"type": "string",
"description": "City name (populated mainly in Davidson)."
},
"near": {
"type": "string",
"description": "Center point 'lat,lon', e.g. '36.1627,-86.7816'."
},
"sort": {
"enum": [
"relevance",
"address",
"distance"
],
"type": "string",
"description": "relevance (default with text), distance (default with near), address."
},
"limit": {
"type": "integer",
"description": "Results per page, 1–200 (default varies by tool)."
},
"owner": {
"type": "string",
"description": "Current owner name words, e.g. 'bailey trust'. For former owners use search_owners."
},
"county": {
"type": "string",
"description": "County name, or several comma-separated, e.g. 'Davidson,Williamson'."
},
"cursor": {
"type": "string",
"description": "next_cursor from the previous page, to fetch the next page."
},
"address": {
"type": "string",
"description": "Property address words, any order, e.g. '1313 gallatin'."
},
"radius_m": {
"type": "number",
"description": "Radius in meters around `near` (default 500, max 2000)."
}
},
"additionalProperties": false
}