Koskamo

Tennessee Property Search MCP

An official MCP server operated by Tennessee Property Search that provides access to property records for 90 Tennessee counties. It enables agents to search for parcels by address or owner, retrieve detailed ownership and sale history, check recent changes, and access property statistics without requiring authentication.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Tennessee Property Search MCP logo, by Tennessee Property SearchVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Tennessee Property Search
MCP endpoint (Streamable HTTP)
https://tnpropertysearch.app/mcp
Vendor documentation

What its tools do

11 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

Can change data (1)

11 of 11 have a description · 11 of 11 declare behavior hints · 9 of 9 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to tnpropertysearch.app ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for property parcels by address or owner name
  • Retrieve detailed ownership and sale history for a specific parcel
  • Find recent property ownership changes in a county
  • Get property statistics grouped by county or zoning

Source and maintenance

Vendor evidenceRegistry 2.0.0

Protocol and capabilities

Server
tn-property 2.0.0
MCP protocol negotiated in check
2025-06-18
Tools
11 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Tennessee property records: parcels, current owners and ownership history. Call dataset_info first to see coverage and which counties have former-owner history. Typical flows: address -> search_properties -> get_property; person or company -> search_owners -> owner_portfolio; point on a map -> property_at; market questions -> property_stats or search_ownership_records; what changed lately -> recent_changes. If a record's last_checked matters, refresh_property re-reads it from the county source. Each property includes app_url, a link that opens it in the map app for the user.

Tools

11 advertised

dataset_info — Dataset overview
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

dataset_info input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
dataset_info annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_properties — Search properties
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_properties input schema
{
  "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
}
search_properties annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
get_property — Property details and owner history
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_property input schema
{
  "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
}
get_property annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
property_at — Property at a point
Advertised by the server during the last successful anonymous check.
Advertised read-only

Which parcel contains a latitude/longitude. Uses the actual parcel boundary, not the nearest centroid.

property_at input schema
{
  "type": "object",
  "required": [
    "lat",
    "lon"
  ],
  "properties": {
    "lat": {
      "type": "number",
      "description": "Latitude."
    },
    "lon": {
      "type": "number",
      "description": "Longitude."
    }
  },
  "additionalProperties": false
}
property_at annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_owners — Find owners by name
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_owners input schema
{
  "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
}
search_owners annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
owner_portfolio — All properties for an owner
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

owner_portfolio input schema
{
  "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
}
owner_portfolio annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
search_ownership_records — Search ownership records / transfers
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

search_ownership_records input schema
{
  "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
}
search_ownership_records annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
property_stats — Aggregate statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

property_stats input schema
{
  "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
}
property_stats annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
refresh_property — Refresh properties from the source
Advertised by the server during the last successful anonymous check.
Open-world

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.

refresh_property input schema
{
  "type": "object",
  "required": [
    "pins"
  ],
  "properties": {
    "pins": {
      "type": "string",
      "description": "Parcel pin(s), comma-separated (max 5)."
    }
  },
  "additionalProperties": false
}
refresh_property annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
recent_changes — Recently detected changes
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

recent_changes input schema
{
  "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
}
recent_changes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}
update_status — Data freshness and update jobs
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

update_status input schema
{
  "type": "object",
  "required": [],
  "properties": {},
  "additionalProperties": false
}
update_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
357 ms
95th percentile latency
357 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 357 ms · metadata changed · 11 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http tennessee-property-search-mcp https://tnpropertysearch.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add tennessee-property-search-mcp --url https://tnpropertysearch.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable tennessee-property-search-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "tennessee-property-search-mcp": {
      "url": "https://tnpropertysearch.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "tennessee-property-search-mcp": {
      "type": "streamableHttp",
      "url": "https://tnpropertysearch.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start tennessee-property-search-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "tennessee-property-search-mcp": {
      "type": "http",
      "url": "https://tnpropertysearch.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http tennessee-property-search-mcp https://tnpropertysearch.app/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://tnpropertysearch.app/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "tennessee-property-search-mcp": {
      "serverUrl": "https://tnpropertysearch.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Tennessee Property Search MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Tennessee Property Search MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing