Find and check local U.S. businesses: open or closed, sourced phone and hours, and how to act.
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.
Days later, when the outcome is knowable: send your user's answers to the questions report_outcome gave you, by follow_up id. Closed options only, never personal details.
Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know.
Platforms only: your Truvon agent assertion (identity protocol §4, a JWS binding this report to your user's pairwise sub). Accepted only when this MCP request carries an OAuth DPoP access token; see /.well-known/truvon-agent-auth.
Cancelled jobs: did your user get it done elsewhere
The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http directory https://truvon.ai/mcp
Days later, when the outcome is knowable: send your user's answers to the questions report_outcome gave you, by follow_up id. Closed options only, never personal details.
| Argument | Type | Description |
|---|---|---|
| again | string | |
| model | string | Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know. |
| reason | string | |
| matched | string | |
| assertion | string | Platforms only: your Truvon agent assertion (identity protocol §4, a JWS binding this report to your user's pairwise sub). Accepted only when this MCP request carries an OAuth DPoP access token; see /.well-known/truvon-agent-auth. |
| completed | string | |
| different | array | |
| elsewhere | string | Cancelled jobs: did your user get it done elsewhere |
| follow_up* | string | |
| satisfied | integer | |
| connection | string | The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself. |
{
"type": "object",
"required": [
"follow_up"
],
"properties": {
"again": {
"enum": [
"yes",
"unsure",
"no"
],
"type": "string"
},
"model": {
"type": "string",
"description": "Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know."
},
"reason": {
"enum": [
"business_no_show",
"business_did_not_respond",
"not_available",
"cancelled_with_notice",
"customer_missed",
"price",
"found_another",
"changed_mind",
"other"
],
"type": "string"
},
"matched": {
"enum": [
"yes",
"mostly",
"no"
],
"type": "string"
},
"assertion": {
"type": "string",
"description": "Platforms only: your Truvon agent assertion (identity protocol §4, a JWS binding this report to your user's pairwise sub). Accepted only when this MCP request carries an OAuth DPoP access token; see /.well-known/truvon-agent-auth."
},
"completed": {
"enum": [
"yes",
"no",
"not_yet"
],
"type": "string"
},
"different": {
"type": "array",
"items": {
"enum": [
"price",
"hours",
"availability",
"location",
"service",
"other"
],
"type": "string"
}
},
"elsewhere": {
"enum": [
"yes",
"no"
],
"type": "string",
"description": "Cancelled jobs: did your user get it done elsewhere"
},
"follow_up": {
"type": "string"
},
"satisfied": {
"type": "integer",
"maximum": 5,
"minimum": 1
},
"connection": {
"type": "string",
"description": "The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself."
}
}
}Check up to 10 businesses you found elsewhere (maps, web, a link) before you give your user a phone or send them somewhere: open or closed with dated evidence, the phone its sources agree on, how to act. Send the name plus phone, website or address, and the town. With the need, you also get two listed businesses that fit it that you did not send. One not found is reported as not in Truvon.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| name | string | One business: its name (or use businesses) |
| need | string | Your user's need: the next step quotes the lines of each business's own pages that answer it, and may_have_missed lists the two best businesses for it that you did not send |
| phone | string | |
| place | string | Town, ST |
| address | string | The street address as you found it |
| website | string | |
| businesses | array | Several businesses to check at once, each with what you have; place, zip and need below apply to all |
When your app has not signed in to Truvon itself: get a link for your user to open and a connection code for you. One tap on the link (no account) and the reporting tools accept connection in this conversation. Searching needs none of this.
| Argument | Type | Description |
|---|---|---|
| client | string | Your assistant or product name, for Truvon's own records (optional; never shown to the person) |
{
"type": "object",
"properties": {
"client": {
"type": "string",
"description": "Your assistant or product name, for Truvon's own records (optional; never shown to the person)"
}
}
}Start here. Find businesses that fit a need near a place. Give the service in a few plain words ("furnace repair", "water heater leak"), not the user's sentence; timing goes in open_at. Each result says why it fits, its hours and whether it is open right now (by its stated hours at its local time; "open:" is whether it is in business), the phone, and how to act, and the response ends with your next step. Five results by default; ask for more with limit, and add max_minutes to stay close.
| Argument | Type | Description |
|---|---|---|
| lat | number | The user's latitude in decimal degrees, with lon: the most exact place to measure distance from |
| lon | number | The user's longitude in decimal degrees, with lat |
| zip | string | The user's 5-digit ZIP code, instead of place |
| need* | string | The service in a few plain words: "furnace repair", "water heater leak", "bbq catering for 12". Not the user's whole sentence: matching is by meaning and exact words, so symptoms and timing hide the service. Timing goes in open_at, requirements in the filters |
| limit | integer | How many results (default 5) |
| model | string | Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know. |
One business's full record by website domain: prices, offers, hours, every way to act, each fact with its source and date, and every source's value where they disagree. Open it for a finalist, and whenever a phone or address matters. A business that is not listed cannot be opened.
| Argument | Type | Description |
|---|---|---|
| domain* | string | The business's website domain, or its truvon_id (biz_…) from a result; the id is exact when a domain is listed in several markets. Never a name |
| format | string | |
| search_id | string | The search_id this listing came from, if any |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "The business's website domain, or its truvon_id (biz_…) from a result; the id is exact when a domain is listed in several markets. Never a name"
},
"format": {
"enum": [
"markdown",
"json"
],
"type": "string",
"default": "markdown"
},
"search_id": {
"type": "string",
"description": "The search_id this listing came from, if any"
}
}
}Every value one fact (phone, hours, address, name) has held, which source said it and when. Use it when a value matters and you want to judge how settled it is.
| Argument | Type | Description |
|---|---|---|
| field | string | The field, e.g. phone, address, hours, name; leave out for every field in short |
| format | string | |
| business* | string | The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported |
{
"type": "object",
"required": [
"business"
],
"properties": {
"field": {
"type": "string",
"description": "The field, e.g. phone, address, hours, name; leave out for every field in short"
},
"format": {
"enum": [
"markdown",
"json"
],
"type": "string",
"default": "markdown"
},
"business": {
"type": "string",
"description": "The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported"
}
}
}When your user returns asking about a job you arranged: its status and the business's updates, by the job id report_outcome gave you.
| Argument | Type | Description |
|---|---|---|
| job* | string | The job_id, job_… |
| connection | string | The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself. |
{
"type": "object",
"required": [
"job"
],
"properties": {
"job": {
"type": "string",
"description": "The job_id, job_…"
},
"connection": {
"type": "string",
"description": "The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself."
}
}
}The next page of a search, with the next_cursor the search returned; kept 24 hours. Narrowing the need usually beats paging.
| Argument | Type | Description |
|---|---|---|
| cursor* | string | next_cursor from the last find_local_businesses or more_results response |
{
"type": "object",
"required": [
"cursor"
],
"properties": {
"cursor": {
"type": "string",
"description": "next_cursor from the last find_local_businesses or more_results response"
}
}
}When a business told you something its record lacks ("yes, certified kosher"), record the question and its answer in its words, with the business's truvon_id.
| Argument | Type | Description |
|---|---|---|
| model | string | Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know. |
| answer* | string | What the business said, in its words as near as you can (up to 500 characters) |
| channel* | string | How you asked it |
| business* | string | The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported |
| question* | string | What you asked, in your words (up to 200 characters) |
| search_id | string | The search_id that led you to the business, if any |
| connection | string | The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself. |
A business that fits your user's need, that you found elsewhere (the web, a map), and Truvon does not list (check_places_results said so): send its name, its own website, phone, address and the town, with the need and the search_id. It is read and listed for every agent; the directory grows where agents found it thin.
| Argument | Type | Description |
|---|---|---|
| zip | string | |
| name* | string | The business's name as you found it |
| need | string | The need it fits, in the plain words you searched with |
| model | string | Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know. |
| phone | string | |
| place | string | Town, ST |
| address | string | Its street address as you found it |
| website | string | Its own website (never a directory, social or maps page); without one it is recorded but cannot be read |
| search_id | string |
After you have acted for your user (booked, ordered, called, got a quote): say what happened, with the search_id and the business's truvon_id. If something was arranged you get the questions to ask your user later and, for a job, a job id. Test traffic (x-truvon-test) is refused: dry-run at https://sandbox.truvon.ai/mcp.
| Argument | Type | Description |
|---|---|---|
| via | string | How you acted: a Truvon door, the business's own agent endpoint, a platform (a booking or ordering service), its link, its phone, its email |
| kind | string | With business_closed: closed for good, or temporarily (renovation, vacation, season) |
| field | string | With wrong_information: which fact is wrong |
| model | string | Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know. |
| action* | string | What you did for your user |
| source | string | With business_closed: the link where you saw it (a news story, its own post, a listing marked closed). It is checked and archived, and if it says so the business is closed for every agent. |
| correct | string | With wrong_information: the right value, as you found it |
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 5, 2026.
{
"type": "object",
"properties": {
"zip": {
"type": "string"
},
"name": {
"type": "string",
"description": "One business: its name (or use businesses)"
},
"need": {
"type": "string",
"description": "Your user's need: the next step quotes the lines of each business's own pages that answer it, and may_have_missed lists the two best businesses for it that you did not send"
},
"phone": {
"type": "string"
},
"place": {
"type": "string",
"description": "Town, ST"
},
"address": {
"type": "string",
"description": "The street address as you found it"
},
"website": {
"type": "string"
},
"businesses": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"phone": {
"type": "string"
},
"address": {
"type": "string",
"description": "The street address as you found it"
},
"website": {
"type": "string"
}
}
},
"maxItems": 10,
"description": "Several businesses to check at once, each with what you have; place, zip and need below apply to all"
}
}
}| place | string | Where the user is, always with its state: "Town, ST" (e.g. "Springfield, IL") or "Neighborhood, Town, ST" (e.g. "Castro, San Francisco, CA"); "City, CC-RR" with an ISO 3166-2 region outside the US. A place without a state is refused, with the towns it could be. Or send zip, or lat and lon, instead |
| action | string | Only businesses that offer this: book, order, quote, call or message (comma means any) |
| detail | string | compact (default) or full records |
| prices | boolean | Only businesses that state prices |
| open_at | string | Open at a specific day and time in the business's local time, e.g. "sat 18:00"; or "now", "today", "tonight", "tomorrow", "tomorrow 9am". For a range like "this week", leave it out and judge from the hours shown |
| refines | string | The search_id of an earlier search this one narrows (one choice of an "A or B", a more specific wording, an added requirement). Links the two so we learn what the first answer lacked |
| max_miles | number | Only businesses within this many miles of the place (businesses that serve online always pass) |
| completable | boolean | Only businesses an agent can complete the action with itself: a Truvon door, or the business's own MCP server, API or commerce endpoint once it has claimed its listing (treated the same); the rest are removed and counted |
| max_minutes | number | Only businesses within this many minutes of estimated driving (straight line with a road and river-crossing estimate, not a routing service), counted only where someone must be physically present; online and remote service always passes |
| include_closed | boolean | Also list businesses likely closed or closed (left out by default; open on each result says why) |
{
"type": "object",
"required": [
"need"
],
"properties": {
"lat": {
"type": "number",
"description": "The user's latitude in decimal degrees, with lon: the most exact place to measure distance from"
},
"lon": {
"type": "number",
"description": "The user's longitude in decimal degrees, with lat"
},
"zip": {
"type": "string",
"description": "The user's 5-digit ZIP code, instead of place"
},
"need": {
"type": "string",
"description": "The service in a few plain words: \"furnace repair\", \"water heater leak\", \"bbq catering for 12\". Not the user's whole sentence: matching is by meaning and exact words, so symptoms and timing hide the service. Timing goes in open_at, requirements in the filters"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many results (default 5)"
},
"model": {
"type": "string",
"description": "Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know."
},
"place": {
"type": "string",
"description": "Where the user is, always with its state: \"Town, ST\" (e.g. \"Springfield, IL\") or \"Neighborhood, Town, ST\" (e.g. \"Castro, San Francisco, CA\"); \"City, CC-RR\" with an ISO 3166-2 region outside the US. A place without a state is refused, with the towns it could be. Or send zip, or lat and lon, instead"
},
"action": {
"type": "string",
"description": "Only businesses that offer this: book, order, quote, call or message (comma means any)"
},
"detail": {
"enum": [
"compact",
"full"
],
"type": "string",
"description": "compact (default) or full records"
},
"prices": {
"type": "boolean",
"description": "Only businesses that state prices"
},
"open_at": {
"type": "string",
"description": "Open at a specific day and time in the business's local time, e.g. \"sat 18:00\"; or \"now\", \"today\", \"tonight\", \"tomorrow\", \"tomorrow 9am\". For a range like \"this week\", leave it out and judge from the hours shown"
},
"refines": {
"type": "string",
"description": "The search_id of an earlier search this one narrows (one choice of an \"A or B\", a more specific wording, an added requirement). Links the two so we learn what the first answer lacked"
},
"max_miles": {
"type": "number",
"description": "Only businesses within this many miles of the place (businesses that serve online always pass)"
},
"completable": {
"type": "boolean",
"description": "Only businesses an agent can complete the action with itself: a Truvon door, or the business's own MCP server, API or commerce endpoint once it has claimed its listing (treated the same); the rest are removed and counted"
},
"max_minutes": {
"type": "number",
"description": "Only businesses within this many minutes of estimated driving (straight line with a road and river-crossing estimate, not a routing service), counted only where someone must be physically present; online and remote service always passes"
},
"include_closed": {
"type": "boolean",
"description": "Also list businesses likely closed or closed (left out by default; open on each result says why)"
}
}
}{
"type": "object",
"required": [
"business",
"question",
"answer",
"channel"
],
"properties": {
"model": {
"type": "string",
"description": "Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know."
},
"answer": {
"type": "string",
"description": "What the business said, in its words as near as you can (up to 500 characters)"
},
"channel": {
"enum": [
"phone",
"message",
"email",
"in_person",
"door",
"chat",
"other"
],
"type": "string",
"description": "How you asked it"
},
"business": {
"type": "string",
"description": "The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported"
},
"question": {
"type": "string",
"description": "What you asked, in your words (up to 200 characters)"
},
"search_id": {
"type": "string",
"description": "The search_id that led you to the business, if any"
},
"connection": {
"type": "string",
"description": "The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself."
}
}
}| The search_id of the search that did not return it |
| connection | string | The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself. |
{
"type": "object",
"required": [
"name"
],
"properties": {
"zip": {
"type": "string"
},
"name": {
"type": "string",
"description": "The business's name as you found it"
},
"need": {
"type": "string",
"description": "The need it fits, in the plain words you searched with"
},
"model": {
"type": "string",
"description": "Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know."
},
"phone": {
"type": "string"
},
"place": {
"type": "string",
"description": "Town, ST"
},
"address": {
"type": "string",
"description": "Its street address as you found it"
},
"website": {
"type": "string",
"description": "Its own website (never a directory, social or maps page); without one it is recorded but cannot be read"
},
"search_id": {
"type": "string",
"description": "The search_id of the search that did not return it"
},
"connection": {
"type": "string",
"description": "The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself."
}
}
}| failure |
| string |
| When failed. business_closed: the business has closed (say what you saw in detail: a closed sign, a disconnected phone, a recording) |
| outcome* | string | confirmed: the business confirmed; pending: submitted, awaiting the business; handed_off: you gave your user the link or number and they finish it (never counts against the business; the follow-up asks whether it happened); failed: give failure |
| reopens | string | With a temporary closure: the reopening date it states, YYYY-MM-DD |
| business* | string | The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported |
| assertion | string | Platforms only: your Truvon agent assertion (identity protocol §4, a JWS binding this report to your user's pairwise sub). Accepted only when this MCP request carries an OAuth DPoP access token; see /.well-known/truvon-agent-auth. |
| search_id | string | The search_id from find_local_businesses, so the outcome teaches similar future needs |
| connection | string | The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself. |
| expected_at | string | ISO time when the outcome will be knowable: delivery ETA or appointment time |
{
"type": "object",
"required": [
"business",
"action",
"outcome"
],
"properties": {
"via": {
"enum": [
"door",
"agent_endpoint",
"platform",
"link",
"phone",
"email"
],
"type": "string",
"description": "How you acted: a Truvon door, the business's own agent endpoint, a platform (a booking or ordering service), its link, its phone, its email"
},
"kind": {
"enum": [
"permanent",
"temporary"
],
"type": "string",
"description": "With business_closed: closed for good, or temporarily (renovation, vacation, season)"
},
"field": {
"enum": [
"phone",
"address",
"website",
"booking_url",
"email"
],
"type": "string",
"description": "With wrong_information: which fact is wrong"
},
"model": {
"type": "string",
"description": "Optional: the model you run on (for example claude-sonnet-5-5 or gpt-5.5), kept with this report's provenance so what each model reports can be weighed over time. Leave it out if you do not know."
},
"action": {
"enum": [
"book",
"order",
"quote",
"call",
"message"
],
"type": "string",
"description": "What you did for your user"
},
"source": {
"type": "string",
"description": "With business_closed: the link where you saw it (a news story, its own post, a listing marked closed). It is checked and archived, and if it says so the business is closed for every agent."
},
"correct": {
"type": "string",
"description": "With wrong_information: the right value, as you found it"
},
"failure": {
"enum": [
"no_way_to_act",
"blocked",
"site_error",
"no_availability",
"no_response",
"wrong_information",
"business_closed",
"other"
],
"type": "string",
"description": "When failed. business_closed: the business has closed (say what you saw in detail: a closed sign, a disconnected phone, a recording)"
},
"outcome": {
"enum": [
"confirmed",
"pending",
"handed_off",
"failed"
],
"type": "string",
"description": "confirmed: the business confirmed; pending: submitted, awaiting the business; handed_off: you gave your user the link or number and they finish it (never counts against the business; the follow-up asks whether it happened); failed: give failure"
},
"reopens": {
"type": "string",
"description": "With a temporary closure: the reopening date it states, YYYY-MM-DD"
},
"business": {
"type": "string",
"description": "The truvon_id from a result (biz_…) or the business's website domain. Never a name. A business Truvon does not list cannot be reported"
},
"assertion": {
"type": "string",
"description": "Platforms only: your Truvon agent assertion (identity protocol §4, a JWS binding this report to your user's pairwise sub). Accepted only when this MCP request carries an OAuth DPoP access token; see /.well-known/truvon-agent-auth."
},
"search_id": {
"type": "string",
"description": "The search_id from find_local_businesses, so the outcome teaches similar future needs"
},
"connection": {
"type": "string",
"description": "The connection code connect_truvon gave you, once your user approved its link. Not needed when your app signed in to Truvon itself."
},
"expected_at": {
"type": "string",
"description": "ISO time when the outcome will be knowable: delivery ETA or appointment time"
}
}
}