RoofScope MCP Server
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@RoofScope MCP ServerPull the RoofScope measurements for 100 Example Ave."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
RoofScope MCP Server (unofficial)
An MCP server for the RoofScope API by Scope Technologies. It lets an AI assistant such as Claude, Cursor or any other MCP client:
find your RoofScope reports by address or name;
read a report's measurements: roof area by pitch, eaves, rakes, ridges, hips, valleys, flashing, every roof plane, gutters and downspouts, siding, and links to the PDF, DXF and DWG files;
look up your account's report prices and delivery options;
order new reports and upgrade RoofScopeX reports, only if you turn ordering on.
Unofficial. This project is not affiliated with, endorsed by, or supported by Scope Technologies. RoofScope is a trademark of Scope Technologies. It uses their public API as documented at docs.myscopetech.io.
Try asking:
"Pull the RoofScope measurements for 100 Example Ave."
"How many squares is the roof on the Johnson job, and what's the pitch breakdown?"
"What would a rush residential RoofScope cost us?"
What you need
Node.js 20 or later.
An API key from Scope Technologies. Every app that uses the RoofScope API needs one. Email support@myscopetech.com to request it.
Your account's Scope API Token. In RoofScope, open My Details and copy the token from the Third-Party section. Tokens last a year; when one expires, click refresh there and update your configuration. RoofScope gives tokens to Growth and Advantage members, L1/L2 deposit holders and partner customers.
Related MCP server: Corridor-MCP
Set it up
Claude Desktop
Open Settings → Developer → Edit Config and add this to claude_desktop_config.json, then restart Claude:
{
"mcpServers": {
"roofscope": {
"command": "npx",
"args": ["-y", "github:cogear/roofscope-mcp"],
"env": {
"ROOFSCOPE_API_KEY": "your-scope-technologies-api-key",
"ROOFSCOPE_TOKEN": "your-scope-api-token"
}
}
}
}Claude Code
claude mcp add roofscope \
-e ROOFSCOPE_API_KEY=your-scope-technologies-api-key \
-e ROOFSCOPE_TOKEN=your-scope-api-token \
-- npx -y github:cogear/roofscope-mcpOther MCP clients
Any client that can start a local (stdio) server works. The command is npx -y github:cogear/roofscope-mcp, with the environment variables below.
From source
git clone https://github.com/cogear/roofscope-mcp.git
cd roofscope-mcp
npm install # also builds dist/Then point your client at node /path/to/roofscope-mcp/dist/index.js.
Configuration
Variable | Required | What it is |
| yes | The API key Scope Technologies issued you. |
| yes | Your account's Scope API Token (My Details → Third-Party). |
| no | Set to |
| no | Only if Scope Technologies assigned you a source id. |
Tools
Tool | What it does |
| Find reports by address or name, with status, hold reason and order date. |
| One report's measurements, per building and per plane, plus file links. |
| What each report costs on your account. |
| Standard and rush delivery charges. |
| Whether the key and token work, and whether ordering is on. |
| Order a new report. Charges your account. Only with |
| Upgrade a RoofScopeX to a full report. Charges your account. Only with |
Ordering is off by default
RoofScope charges every order to your account, and orders can't be cancelled through the API. So the two ordering tools don't exist unless you start the server with ROOFSCOPE_ALLOW_ORDERS=true. When they're on:
the assistant is told to search for an existing report first, quote the price, and get your explicit go-ahead on the address, product, size, structures and delivery;
RoofScope's own order rules (buildings per order, required fields, date and email formats) are checked before anything is sent;
an order is sent exactly once and never retried. If RoofScope doesn't answer in time, the tool says the order may have gone through and to check before ordering again.
Limits and privacy
Scope Technologies limits each API key to 100 requests a second and 10,000 a month. This server sends at most four requests at a time and retries a failed read once.
The server runs on your own computer and talks only to
api.myscopetech.io. It doesn't log or store report contents, names or addresses.
Development
npm install
npm test # offline tests: no network, no keys
npm run typecheck
ROOFSCOPE_API_KEY=… ROOFSCOPE_TOKEN=… npm run live-check # read-only check against the real APIThe live check never calls the order endpoints and prints only counts and field names.
Using RoofScope across a team
This server connects one RoofScope account for one person. If your team wants RoofScope alongside your email, calendar and CRM, with a separate access level for each role, it's built into Higgs Hub, which is where this code came from.
License
Available Tools
5 toolscheck_roofscope_connectionCheck the RoofScope connectionARead-only
Whether RoofScope accepts this server's API key and the account's Scope API Token, and whether ordering is turned on. Use it when another RoofScope tool fails, or to confirm the setup.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds real value by disclosing that this validates two separate credentials (API key and Scope API Token) plus an ordering flag — which explains its role as a failure-diagnosis tool. It does not, however, describe the response shape or how to interpret a failure, leaving a gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads what is checked, the second gives the usage condition. No filler, no repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining results, and it only implicitly conveys that the output reflects the three checks. It never says whether failures surface as errors or structured status fields, which is the main missing piece for a diagnostic tool an agent may call programmatically.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies. There is nothing for the description to clarify, and it correctly avoids inventing parameter discussion.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific diagnostic action and enumerates exactly what it verifies: acceptance of the server's API key, the account's Scope API Token, and whether ordering is enabled. This is clearly distinguishable from the data-fetching siblings (search_roofscope_scopes, get_roofscope_prices, etc.), which return domain data rather than connection state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition: 'Use it when another RoofScope tool fails, or to confirm the setup.' That is actionable routing guidance. It stops short of an explicit when-not (e.g., not needed for routine data calls), so it is clear context rather than full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roofscope_delivery_optionsRoofScope delivery optionsARead-only
The extra charge for standard and rush delivery, per RoofScope product and size band.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so safety and external-lookup behavior are covered. The description adds the useful granularity detail (results are keyed per product and size band), but says nothing about response shape or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short sentence with no filler; the distinguishing detail (delivery surcharge vs. base price) is front-loaded. It is a noun phrase rather than a sentence, which slightly weakens the framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter lookup with no output schema, the description should say more about what comes back — the field(s) for the standard and rush surcharge and how rows are keyed. It hints at product/size-band keying but leaves the return contract and any empty-result behavior unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4; there is no parameter syntax the description needs to carry. The description's mention of product/size-band granularity refers to the returned data, not inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource — the extra charge for standard and rush delivery, broken out per RoofScope product and size band — which is enough to separate it from get_roofscope_prices (base product pricing). It lacks a verb phrase, but the retrieval intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the lookup for shipping surcharges rather than base prices. There is no explicit when-to-use, no exclusion against get_roofscope_prices or search_roofscope_scopes, and no statement of prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roofscope_pricesRoofScope pricesARead-only
What each RoofScope report costs on this account, by product, property type and size band (e.g. "RoofScope-Residential-Greater Than 50 SQ": 69.95).
| Name | Required | Description | Default |
|---|---|---|---|
| product | No | Only this product's prices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds that prices are account-specific and per-product/size-band, but does not discuss caching, volatility, or whether prices can change mid-session.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence covering what, scope, grouping dimensions, and an example value. No filler whatsoever.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by showing the shape of a returned entry ('RoofScope-Residential-Greater Than 50 SQ': 69.95'), which is what an agent needs to parse results. Minor gap: it doesn't say how many entries or whether size bands are exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single enum parameter is fully documented in the schema, so the description's 'by product' only confirms what is already there. Baseline 3 is appropriate when the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (per-report prices on this account) and its keying dimensions (product, property type, size band), plus a concrete example key/value. It is clearly distinct from the sibling read tools like search_roofscope_scopes and get_roofscope_delivery_options, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the pricing lookup, but there is no explicit when-to-use statement, no note that no filter returns all products, and no mention of alternatives. Adequate for a single-purpose lookup but leaves routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roofscope_scopeRoofScope report measurementsARead-only
One RoofScope report's measurements. For roof products: total roof area (in squares) by slope bucket and pitch, perimeter, eaves, rakes, ridges, hips, valleys, step and headwall flashing, and every plane per structure. For GutterScope / RoofScopePlus: gutter and downspout length, end caps and elbows. For SidingScope: siding area, wraps, windows and doors. Plus links to the PDF (and DXF/DWG where there are any). An unfinished or held report comes back as its status instead.
| Name | Required | Description | Default |
|---|---|---|---|
| scopeId | Yes | The RoofScope scopeId from search_roofscope_scopes (not the orderId). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes meaningfully beyond the readOnly/destructive/openWorld annotations by disclosing that the payload shape varies by product type (roof vs gutter vs siding), that PDF/DXF/DWG links are conditional, and that 'an unfinished or held report comes back as its status instead' — a genuinely important edge-case behavior. It stops short of describing error behavior for an invalid or unknown scopeId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then a product-by-product inventory of returns and a status caveat. It is long, but given the absence of an output schema nearly every clause carries information an agent cannot get elsewhere; only the near-duplicate opening relative to the title is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the heavy lifting by naming the returned fields per product and the conditional asset links, plus the unfinished/held status case. It is close to sufficient for a one-parameter read tool; only failure/empty-result behavior is unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and the schema already explains that scopeId comes from search_roofscope_scopes and is not the orderId. The description adds no format, syntax, or example beyond that, so the baseline 3 for schema-driven parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('One RoofScope report's measurements') and enumerates exactly what that resource contains per product line, so an agent knows this is a single-report fetch rather than a search. However, the opening sentence nearly restates the title 'RoofScope report measurements', and it never explicitly contrasts itself with search_roofscope_scopes — that differentiation lives only in the input schema's scopeId note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: call this when you already have a scopeId and need the report's measurements. There is no explicit when-to-use, no statement that scopeId must first come from search_roofscope_scopes (that hint is in the schema, not the description), and no exclusion or alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_roofscope_scopesSearch RoofScope reportsARead-only
Find RoofScope reports ("scopes") on the account whose address or name contains the search text. Returns each one's scopeId, orderId, product, status (Ordered, Completed, Unfunded…), whether it is on hold and why, and the order date. Leave query empty for the most recent. Use the scopeId with get_roofscope_scope for the measurements.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Part of the address or the report's name, e.g. "1308 Rocky". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds value beyond them by enumerating what comes back (scopeId, orderId, product, status values, hold reason, order date) even though no output schema exists. Minor gap: no mention of result caps or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero waste, front-loaded with the search target before the return contents and the follow-up hint. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields and points to the follow-up tool, which is what an agent needs to chain calls. It stops short of noting result limits or whether matching is case-insensitive/partial, so it is strong but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema coverage, the baseline is 3; the description adds the non-obvious empty-string semantics ('Leave query empty for the most recent'), which is meaning the schema does not convey. It does not restate the schema's example format, which is fine.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Find') plus resource ('RoofScope reports ("scopes")'), with the searchable fields (address or name) stated. It also distinguishes itself from sibling get_roofscope_scope by scoping that tool to measurements, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage context: leave query empty for the most recent, and follow up with get_roofscope_scope using the returned scopeId. It routes to a sibling and states a default behavior, but does not state when-not-to-use this tool or any search limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
check_roofscope_connection - First observed
get_roofscope_delivery_options - First observed
get_roofscope_prices - First observed
get_roofscope_scope - First observed
search_roofscope_scopes
TDQS
Scored across 5 tools
Each tool has a distinct purpose: search (list/find reports), get (measurements for one report), prices, delivery options, and a connection diagnostic. The search/get pairing is clearly delineated by the descriptions (query vs. scopeId), and prices vs. delivery charges cannot be confused.
All five names follow a consistent snake_case verb_noun pattern with a uniform roofscope prefix: search_roofscope_scopes, get_roofscope_scope, get_roofscope_prices, get_roofscope_delivery_options, check_roofscope_connection. No mixing of conventions.
Five tools is well-scoped for a read-only RoofScope data integration; each tool earns its place (discovery, detail, pricing, delivery, health check) with no redundancy or padding.
The surface covers discovery, measurement retrieval, pricing, delivery costs, and connection validation, which handles most read-only workflows. However, ordering a report is alluded to (check_roofscope_connection reports whether ordering is on) yet no order/create tool is exposed, leaving a minor lifecycle gap.
Maintenance
Related MCP Connectors
Remote MCP endpoint for U.S. home forecasts, public benchmark data, and permit or zoning readiness.
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Read-only MCP connector for Facehunch saved reports, access status and available source links.
Unofficial MCP server for the public PortlandMaps property/permit/zoning API. Not city-affiliated.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for generating PDF reports on real estate properties. Supports location analysis, market reports, and project summaries.Mozilla Public 2.0
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server providing direct, credentialed access to parcel data via Regrid and county ArcGIS sources, with tools for querying by point, owner, size, and county.-
- AlicenseAqualityBmaintenanceProvides French real estate intelligence from official open data, including notarial sales, transparent estimates, rents, property tax, energy diagnostics, risks, and commune profiles. It enables MCP clients to get auditable property reports and analysis from a simple address without an API key.12161,861 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables desktop agents and clients to access geospatial services via a hosted MCP server, including OpenStreetMap queries, address and business search, POI discovery, routing, matrices, isochrones, map matching, optimization, elevation and terrain, basemap styling, spatial analysis, rendering, usage, and service status.33 npmMIT