Tools reference
Every tool in the Huff connector, with what it does, its inputs, and an example.
The connector has 17 tools: 8 that read and 9 that write. Read tools are marked readOnlyHint: true, so Claude can run them freely and ask before a write. You do not call these yourself. Claude picks them based on what you ask.
Every tool acts as the person who signed in. See Data and permissions for how that limits results.
Read tools
search_signals
Searches recent project signals in your organization's markets, plus 2 miles past their edges, newest first. It has no keyword or date input. To answer "this week", Claude reads the newest results and checks their dates.
| Input | Type | Required | Description |
|---|---|---|---|
jurisdiction | string | No | A 5-digit locality FIPS code, such as 51810 for Virginia Beach. |
type | enum | No | A signal type. market_overview returns the values in use under byType. |
siteStages | enum[] | No | Up to 10 of proposed, new_ground, permitted, out_to_bid. This is how far along the site is, not a Pipeline stage. Leave it out for every stage. |
limit | number | No | 1 to 100. Defaults to 25. |
Returns: a list with id, siteId, type, jurisdiction, title, address, acres, occurredAt, and sourceUrl.
Example: "Show me new ground sites in Virginia Beach."
{ "jurisdiction": "51810", "siteStages": ["new_ground"], "limit": 25 }market_overview
Counts project signals by locality and by type, to show where activity is. These counts cover everything Huff tracks, not only your markets. They are totals and include no site details.
No inputs.
Returns: totalSignals, byJurisdiction, and byType.
Example: "Where is the most activity right now?"
get_site
Opens one site: its project signals with source links, the companies and people tied to it with any contact details on record, and whether your team is pursuing it.
| Input | Type | Required | Description |
|---|---|---|---|
siteId | string | Yes | The site's id, from search_signals or list_routable_sites. |
Returns: id, name, jurisdiction, address, acres, stage, lastActivityAt, signals, parties, and pursuit. Each entry in parties has an entityId that adopt_operator accepts. For a site outside your markets, it returns only outside: true and the jurisdiction.
Example: "Who is working on that site?"
{ "siteId": "<siteId from search_signals>" }list_routable_sites
Lists the sites on open Pipeline leads across your organization that have a map point, newest lead first. Use it to find the ids for create_route.
No inputs.
Returns: a list with id, name, jurisdiction, address, lat, and lng.
Example: "Which of the sites we're pursuing can I drive to?"
get_account
Opens one company in your organization, with its contacts and most recent interactions.
| Input | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | The company's id, from list_accounts. |
Returns: account, contacts, and interactions.
Example: "When did we last talk to that contractor?"
{ "accountId": "<accountId from list_accounts>" }list_accounts
Lists the companies in your organization, in name order, a page at a time.
| Input | Type | Required | Description |
|---|---|---|---|
limit | number | No | 1 to 100. |
offset | number | No | 0 or more. |
Returns: items, total, limit, and offset.
Example: "List the first 50 companies in my book."
{ "limit": 50, "offset": 0 }list_pipeline
Lists leads, newest first, with the place, its stage, its owner, and a source link. You see the teams you sit on. Owners and admins see the whole organization. Someone on no team sees leads that have no team.
| Input | Type | Required | Description |
|---|---|---|---|
kind | enum | No | open, won, or lost. Leave it out for all leads. |
Returns: a list of leads.
Example: "What are we still working on?"
{ "kind": "open" }list_stages
Lists the stages on a team's board, in order, with the ids set_lead_stage needs. Your organization names its stages. Each stage's kind is the fixed meaning behind it: open, won, or lost.
| Input | Type | Required | Description |
|---|---|---|---|
teamId | string | No | The team. Leave it out for your organization's default board. |
Returns: the board and its stages.
Example: "What stages can a lead be in?"
Write tools
start_pursuing
Puts a site on a team's Pipeline at that team's first open stage. Leads belong to the team, so everyone on it sees the same board. A site outside your markets is refused as if it did not exist.
| Input | Type | Required | Description |
|---|---|---|---|
siteId | string | Yes | The site's id. |
teamId | string | No | Needed if you sit on more than one team. |
notes | string | No | Notes on the lead. |
Returns: the new lead.
Example: "Start pursuing that site."
{ "siteId": "<siteId from search_signals>", "notes": "Asked about rental for the clearing work." }set_lead_stage
Moves a lead to another stage on its team's board. You can move your own team's leads. Owners and admins can move any lead in the organization.
| Input | Type | Required | Description |
|---|---|---|---|
leadId | string | Yes | The lead's id, from list_pipeline. |
stageId | string | Yes | The stage's id, from list_stages. |
Returns: the updated lead.
Example: "Move that lead to Quoted."
{ "leadId": "<leadId from list_pipeline>", "stageId": "<stageId from list_stages>" }drop_lead
Removes a lead from its team's Pipeline. You can drop your own team's leads. Owners and admins can drop any lead in the organization. The site can be pursued again later as a new lead.
| Input | Type | Required | Description |
|---|---|---|---|
leadId | string | Yes | The lead's id, from list_pipeline. |
Returns: removed, with the lead's id.
Example: "Drop the Oak Street lead. We lost interest."
{ "leadId": "<leadId from list_pipeline>" }create_account
Adds a company to your organization's Companies.
| Input | Type | Required | Description |
|---|---|---|---|
name | string | Yes | The company's name. |
segment | enum | Yes | What the company does on a job: developer_owner, general_contracting, site_contractor, subcontractor, engineer_architect, public_agency, supplier, or other. |
website | string | No | Website. |
notes | string | No | Notes. |
phone | string | No | Phone number. |
address | string | No | Street address. |
city | string | No | City. |
state | string | No | State. |
zip | string | No | ZIP code. |
Returns: the new company.
Example: "Add Tidewater Site Partners as a site contractor."
{ "name": "Tidewater Site Partners", "segment": "site_contractor" }add_contact
Adds a person to a company in your organization.
| Input | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | The company's id. |
name | string | Yes | The person's name. |
title | string | No | Job title. |
email | string | No | Email address. |
phone | string | No | Phone number. |
notes | string | No | Notes. |
Returns: the new contact.
Example: "Add Dana Reyes as their project manager."
{ "accountId": "<accountId from list_accounts>", "name": "Dana Reyes", "title": "Project manager" }log_interaction
Records a touch on a company. Interactions logged this way are marked as made through AI, and Claude cannot change that mark.
| Input | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | The company's id. |
kind | enum | Yes | call, email, meeting, site_visit, or note. |
summary | string | Yes | What happened. |
occurredAt | string | No | When it happened. Defaults to now and cannot be in the future. |
contactId | string | No | The contact involved. |
Returns: the new interaction.
Example: "Log a call with Dana. They want a quote by Friday."
{
"accountId": "<accountId from list_accounts>",
"kind": "call",
"summary": "Dana wants a quote by Friday."
}create_route
Creates a driving route from site stops, in the order given. The route belongs to you. Every site needs a map point and has to be inside your markets, or the route is refused.
| Input | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1 to 140 characters. |
siteIds | string[] | Yes | 1 to 25 site ids, in visit order. Use list_routable_sites to find them. |
Returns: the new route.
Example: "Make a route called Tuesday north with those three sites."
{ "name": "Tuesday north", "siteIds": ["<siteId>", "<siteId>", "<siteId>"] }optimize_route
Reorders the stops on one of your routes for the shortest drive. With a starting point, Huff solves the day from there and no stop is pinned. Send both coordinates or neither.
| Input | Type | Required | Description |
|---|---|---|---|
routeId | string | Yes | The route's id, from create_route. |
originLat | number | No | Starting latitude, -90 to 90. |
originLng | number | No | Starting longitude, -180 to 180. |
Returns: routeId and outcome, which is one of:
reordered: the stops have a new order.already-optimal: the order was already the shortest.too-small: there are too few stops to reorder.unmappable: a stop has no map point.no-trip: no drive could be worked out.
Example: "Put that route in the shortest order, starting from here."
{ "routeId": "<routeId from create_route>", "originLat": 36.85, "originLng": -75.98 }adopt_operator
Adds a company named on a site to your Companies and links it, so its company page shows its other projects. Running it twice returns the existing company instead of a duplicate.
| Input | Type | Required | Description |
|---|---|---|---|
entityId | string | Yes | The company's entityId, from parties in get_site. |
segment | enum | Yes | What the company does on a job: developer_owner, general_contracting, site_contractor, subcontractor, engineer_architect, public_agency, supplier, or other. A site's operator is usually developer_owner. |
Returns: the company, new or existing.
Example: "Add that site's developer to my Companies."
{ "entityId": "<entityId from get_site>", "segment": "developer_owner" }