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

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

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

  3. 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 the WWW-Authenticate challenge on an unauthenticated request.
Endpoints
/oauth/register · /oauth/authorize · /oauth/token · /.well-known/jwks.json, all on the issuer.
Grants
authorization_code with PKCE (S256 only) and refresh_token. Public clients; token_endpoint_auth_method none.
Scopes
mcp and read.
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, with 2025-03-26 and 2024-11-05 still 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.

An assistant never has more access than the person who connected it. Tools run as that ISN user, inside that user's company, with that user's permissions.

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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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

ToolAccessWhat 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-Authenticate header 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) answer 202 with an empty body.
Availability window
get_availability searches 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.