Skip to main content
Glama
cogear

RoofScope MCP Server

Official
by cogear

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

  1. Node.js 20 or later.

  2. An API key from Scope Technologies. Every app that uses the RoofScope API needs one. Email support@myscopetech.com to request it.

  3. 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-mcp

Other 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

ROOFSCOPE_API_KEY

yes

The API key Scope Technologies issued you.

ROOFSCOPE_TOKEN

yes

Your account's Scope API Token (My Details → Third-Party).

ROOFSCOPE_ALLOW_ORDERS

no

Set to true to let the assistant place paid orders. Off by default.

ROOFSCOPE_SOURCE_ID

no

Only if Scope Technologies assigned you a source id.

Tools

Tool

What it does

search_roofscope_scopes

Find reports by address or name, with status, hold reason and order date.

get_roofscope_scope

One report's measurements, per building and per plane, plus file links.

get_roofscope_prices

What each report costs on your account.

get_roofscope_delivery_options

Standard and rush delivery charges.

check_roofscope_connection

Whether the key and token work, and whether ordering is on.

order_roofscope_report

Order a new report. Charges your account. Only with ROOFSCOPE_ALLOW_ORDERS=true.

upgrade_roofscope_x

Upgrade a RoofScopeX to a full report. Charges your account. Only with ROOFSCOPE_ALLOW_ORDERS=true.

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 API

The 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

MIT

Available Tools

5 tools
check_roofscope_connectionCheck the RoofScope connectionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 optionsA
Read-only

The extra charge for standard and rush delivery, per RoofScope product and size band.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 pricesA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
productNoOnly this product's prices.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 measurementsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeIdYesThe RoofScope scopeId from search_roofscope_scopes (not the orderId).

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 reportsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoPart of the address or the report's name, e.g. "1308 Rocky".

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedcheck_roofscope_connection
    • First observedget_roofscope_delivery_options
    • First observedget_roofscope_prices
    • First observedget_roofscope_scope
    • First observedsearch_roofscope_scopes

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server for generating PDF reports on real estate properties. Supports location analysis, market reports, and project summaries.
    Mozilla Public 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Read-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.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Provides 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.
    12
    16
    1,861 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT