Inspection Support Network
Developer documentation / MCP server
The ISN MCP server
A remote Model Context Protocol server that lets an AI assistant work inside one inspection company's ISN as a signed-in user: look up clients, agents and orders, check inspector availability, report on volume and revenue, and book inspections.
https://inspectionsupport.com/{companyKey}/mcp
Every ISN customer runs their own tenant, identified by a company key. The server URL is per company, and everything an assistant does happens inside that company's data.
Connecting
Add the server as a custom connector in your assistant and give it the URL above with your company key in place of
{companyKey}. Claude: Settings → Connectors → Add custom connector. ChatGPT: Settings → Connectors → Create. Any client that speaks Streamable HTTP and OAuth 2.1 works the same way.The assistant discovers the authorization server and sends you to sign in with your normal ISN username and password. No API keys, and nothing to paste.
Approve the connection. From then on the assistant acts as you, with exactly your ISN permissions, until you remove the connector or an ISN administrator disables your user.
Authorization
OAuth 2.1 with dynamic client registration, so a client needs nothing from us in advance. Everything below is published by the discovery documents and is what a conforming client reads; it is listed here so a reviewer can check it without a client.
- Issuer
https://auth.inspectionsupport.com- Server metadata
https://auth.inspectionsupport.com/.well-known/oauth-authorization-server- Resource metadata
https://inspectionsupport.com/.well-known/oauth-protected-resource/{companyKey}/mcp, also advertised in theWWW-Authenticatechallenge on an unauthenticated request.- Endpoints
/oauth/register·/oauth/authorize·/oauth/token·/.well-known/jwks.json, all on the issuer.- Grants
authorization_codewith PKCE (S256only) andrefresh_token. Public clients;token_endpoint_auth_methodnone.- Scopes
mcpandread.- Resource indicators
- RFC 8707. The access token's audience is the exact server URL; a token for one company is refused by every other company's server.
- Tokens
- Access tokens are short-lived RS256 JWTs (RFC 9068). Refresh tokens rotate on every use: 30 days sliding, 90 days absolute from consent.
- Revocation
- Every call re-checks the live ISN user. Disabling the user in ISN ends access on the next request, before any token expires. Removing the connector in the assistant discards its tokens.
- Standards
- RFC 6749, 7591, 7636, 8414, 8707, 9068, 9207, 9728. MCP protocol version
2025-06-18, with2025-03-26and2024-11-05still accepted.
Permissions
Every tool declares its access level in its MCP annotations, and assistants use that to decide when to ask you. 36 tools; 9 of them write.
Read runs without a prompt
readOnlyHint: true. Looking things up, searching, reporting. Nothing in
ISN changes, so an assistant can answer "what is on the calendar tomorrow" in one
step.
Write always asks first
destructiveHint: true. Creating and updating clients, agents, agencies
and orders, and scheduling. One of these, schedule_order, sends the
booking notifications to the client, the agents and the inspector; the assistant is
told to confirm with you before calling it.
Tools
Each description says what the tool does and when to reach for it instead of a neighbour.
Identifiers are UUIDs, and the get_* tools that look up people also accept the
numeric ID shown in ISN. Searches match partially and return only visible records; all lists
paginate with limit and offset.
Clients
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get clientget_client |
Read | Get one client (the property buyer or homeowner on an order) with full contact details. Use when you already have a client ID from a search result or an order; use search_clients to find one by name or email. |
Search clientssearch_clients |
Read | Search the company's clients by name or email, partial matches allowed. Use to find a client ID before creating an order or looking up their history; only visible (non-hidden) clients are returned. |
Create clientcreate_client |
Write | Create a new client record in the company's ISN. Use when a person is not found by search_clients and needs to be attached to an order; check first, because this does not de-duplicate. |
Update clientupdate_client |
Write | Change name, email, or phone on an existing client. Use to correct contact details; only the fields supplied are changed. |
Agents
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get agentget_agent |
Read | Get one real-estate agent with contact details and agency. Use when you already have an agent ID from a search result or an order; use search_agents to find one by name, email, or agency. |
Search agentssearch_agents |
Read | Search the company's real-estate agents by name, email, or agency, partial matches allowed. Use to find the buyer's or seller's agent ID before creating an order or running agent analytics; only visible agents are returned. |
Create agentcreate_agent |
Write | Create a new real-estate agent record, optionally attached to an agency. Use when an agent is not found by search_agents and needs to be named on an order; check first, because this does not de-duplicate. |
Update agentupdate_agent |
Write | Change name, contact details, or agency on an existing agent. Use to correct an agent record or move them to a different agency; only the fields supplied are changed. |
Agencies
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get agencyget_agency |
Read | Get one real-estate agency (brokerage) with its address and phone. Use when you already have an agency ID from an agent record or a search result; use search_agencies to find one by name or city. |
Search agenciessearch_agencies |
Read | Search the company's real-estate agencies by name or city, partial matches allowed. Use to find an agency ID before attaching an agent to it or filtering analytics by agency; only visible agencies are returned. |
Create agencycreate_agency |
Write | Create a new real-estate agency record. Use when an agency is not found by search_agencies and an agent needs to belong to it; check first, because this does not de-duplicate. |
Update agencyupdate_agency |
Write | Change the name, phone, or address of an existing agency. Use to correct an agency record; only the fields supplied are changed. |
Staff
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get userget_user |
Read | Get one staff user of the company (an inspector, scheduler, or office admin) with contact details. Use when you already have a user ID from an order's inspector list or a search result; use search_users or get_inspectors to find one. |
Search userssearch_users |
Read | Search the company's staff users by name or email, partial matches allowed. Use to find a staff member's ID; for inspectors specifically, prefer get_inspectors, which returns only users who can be assigned to an inspection. |
List inspectorsget_inspectors |
Read | List the company's active inspectors, the users who can be assigned to an inspection. Use to get inspector IDs for create_order, get_availability, or the per-inspector analytics and search filters. |
Orders
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get orderget_order |
Read | Get one inspection order in full: property, date, status, clients, agents, inspectors, services, and fees. Use when you already have an order ID from a search; use search_orders to find orders by date, person, status, or address. |
Search orderssearch_orders |
Read | Search inspection orders by scheduled date range, inspector, client, agent, status, or address; filters combine. Use for questions like "what is on the calendar next week" or "John's inspections last month"; for per-person totals over a range, get_client_orders and get_buyers_agent_orders also return the summed fees. |
Get a client's ordersget_client_orders |
Read | Summarise one client's orders over a date range: order count, total fees, and the orders themselves. Use for questions about a specific client's history or spend; use search_orders when the question is not about one client. |
Get a buyer's agent's ordersget_buyers_agent_orders |
Read | Summarise the orders one agent referred as the buyer's agent over a date range: order count, total fees, and the orders themselves. Use for questions about how much business a specific agent brings; use get_agent_performance to rank agents against each other. |
Create order (draft)create_order |
Write | Create a new inspection order in draft status for a property, date, and set of people and services. Use to start a booking; a draft is invisible on the calendar and sends no notifications until schedule_order confirms it. Resolve client, agent, inspector, service, and fee IDs with the search tools first. |
Update orderupdate_order |
Write | Change the property, date, people, services, packages, or fees on an existing order. Use to correct or reschedule an order; only the fields supplied are changed, and a draft stays a draft until schedule_order is called. |
Schedule orderschedule_order |
Write | Confirm a draft order, moving it to scheduled status. Use as the final step after create_order once the details are right: this puts the inspection on the calendar and sends the booking notifications to clients, agents, and inspectors, so do not call it until the user has confirmed. |
Services, packages and fees
| Tool | Access | What it does, and when to use it |
|---|---|---|
Get serviceget_service |
Read | Get one inspection service type (for example a home, radon, or termite inspection) with its details. Use when you already have a service ID from an order or a search result; use search_services to find one by name. |
Search servicessearch_services |
Read | List or search the company's inspection service types by name, partial matches allowed. Use to get service IDs for create_order or get_availability; only services the company currently offers are returned. |
Get packageget_package |
Read | Get one inspection package, a bundle of services sold together, with its details. Use when you already have a package ID; use search_packages to find one by name. |
Search packagessearch_packages |
Read | List or search the company's inspection packages by name, partial matches allowed. Use to get package IDs for create_order when the customer is buying a bundle rather than individual services. |
Search feessearch_fees |
Read | List or search the company's fee catalogue (the priced line items an order can carry) by name, partial matches allowed. Use to get fee IDs and default amounts before adding fees to create_order or update_order. |
Availability
| Tool | Access | What it does, and when to use it |
|---|---|---|
Find available time slotsget_availability |
Read | Find open inspection time slots, ranked by inspector fit, travel distance, agent-preferred inspectors, and time of day. Use before create_order to offer a customer appointment options, or to answer "when can you fit in a 3,000 sq ft inspection in Mesa next week"; every parameter is optional, and the more you supply the better the ranking. Read-only: it never books anything. |
Analytics
| Tool | Access | What it does, and when to use it |
|---|---|---|
Inspection countsget_inspection_counts |
Read | Count inspections over a date range, bucketed by day, week, month, quarter, or year, optionally broken down by inspector, agent, or agency. Use for volume questions like "how many inspections did we do last month" or "monthly counts for 2025"; use get_inspection_trends when the question compares two periods. |
Inspection trendsget_inspection_trends |
Read | Compare inspection counts between two date ranges and report the change. Use for "are we up or down versus last month", year-over-year growth, or quarter-to-quarter comparisons; use get_inspection_counts for a single period. |
Revenue summaryget_revenue_summary |
Read | Total revenue over a date range, with fees, coupons, tax, and average fee, bucketed by period and optionally broken down by inspector, agent, or agency. Use for "what was our revenue this month" or "revenue by inspector"; use get_revenue_trends when the question compares two periods. |
Revenue trendsget_revenue_trends |
Read | Compare revenue between two date ranges and report the change. Use for "is revenue up versus last quarter" or year-over-year revenue growth; use get_revenue_summary for a single period. |
Inspector performanceget_inspector_performance |
Read | Rank the company's inspectors over a date range by inspection count, revenue, or average fee. Use for "who is our busiest inspector", an inspector leaderboard, or one inspector's numbers via inspector_id; use search_orders to see the underlying orders. |
Agent performanceget_agent_performance |
Read | Rank referring real-estate agents over a date range by inspection count or revenue, with a buyer's/seller's role breakdown. Use for "which agent sends us the most business", a top-10 agents list, or one agent's referral numbers via agent_id; use get_agent_retention for who is new or has stopped referring. |
Agency performanceget_agency_performance |
Read | Rank real-estate agencies over a date range by inspection count, revenue, or number of active agents. Use for "which agency sends the most business" or an agency leaderboard; use get_agent_performance with agency_id to see the individual agents inside one. |
Agent retentionget_agent_retention |
Read | Compare which agents referred inspections in two periods, listing new, returning, and churned agents with rates. Use for "how many new agents referred us this quarter", "which agents stopped referring", or an agent churn rate; use get_agent_performance for volume rankings. |
Errors and limits
The server follows the MCP convention that separates the request failing from the tool failing. Both answer HTTP 200; only transport-level conditions use an HTTP status.
The tool could not do it
A result flagged isError with a plain-language reason the assistant can
act on: a record that does not exist, an invalid filter, a missing date.
{
"result": {
"content": [{ "type": "text",
"text": "Client not found" }],
"isError": true
}
}
The request was malformed
A JSON-RPC error member. -32602 for a missing or unknown tool name,
-32603 for an internal error carrying a reference you can quote to
support.
{
"error": {
"code": -32602,
"message": "Unknown tool: nope"
}
}
- 401
- No or invalid credentials. The
WWW-Authenticateheader names the resource metadata so a client can start authorization. - 429
- The company's monthly allowance of tool calls is used up. The error message says so; the allowance resets monthly.
- Notifications
- JSON-RPC notifications (no
id) answer202with an empty body. - Availability window
get_availabilitysearches at most 30 days at a time.- Result size
- Search and list tools default to 50 results and paginate; analytics tools return aggregates, not rows.
For ISN customers
Anyone with an ISN login can connect an assistant to their company. The assistant only ever sees what that user can see, and its calls are recorded like any other activity. To stop it, remove the connector in the assistant; to stop it for good, an ISN administrator disables the user.
Building your own MCP client or agent? The server speaks standard Streamable HTTP and OAuth 2.1, so nothing here is specific to Claude or ChatGPT. For direct HTTP integration without an assistant, use the ISN API instead.