Spur
REMOTE · MCP.USESPUR.COM
Real estate leads, skip tracing, direct mail, SMS & email outreach, and marketing automations
Available components
Last scanned (13 hours ago)
Scores higher than 91% of remote servers
Reachable. Last reached 5 Nov 2026.
Category CRM and Sales
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security94
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability79
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 16491 tokens (~171/item across 96 items; 87 tools + 9 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management40
- Stability observed for 12 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 12 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 89 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Checks we ran (14)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
- Capabilities
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
- 27 Oct 26 0
- The server rewrote its instructions, which are the text every model session reads security
- New tool “spur_buy_phone_number”, which the server declares destructive security
- New tool “spur_pay_texting_fees”, which the server declares destructive security
- New tool “spur_release_phone_number”, which the server declares destructive security
- New tool “spur_submit_texting_registration”, which the server declares destructive security
- Tool “spur_send_sms” rewrote its description, which is the text the model reads security
- New tool “spur_get_texting_setup” functional
- New tool “spur_resend_texting_verification” functional
- New tool “spur_save_texting_registration” functional
- New tool “spur_search_phone_numbers” functional
- New tool “spur_set_default_phone_number” functional
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 25 Oct 26 0
- Stability: unverified → 0.03 ▲ functional
- 24 Oct 26 80
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://mcp.usespur.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.usespur.com | CN=YR1,O=Let's Encrypt,C=US | 23 Oct 2026 | 21 Jan 2027 | RSA 2048 | SHA256-RSA | 6b85e969e9623944470b6f4b03f8b4275cd |
| SANs: mcp.usespur.com | ||||||
| CN=YR1,O=Let's Encrypt,C=US (CA) | CN=Root YR,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | RSA 2048 | SHA256-RSA | a20253f15f2691c05dc1ce13b9bcca4e |
| CN=Root YR,O=ISRG,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | RSA 4096 | SHA256-RSA | f24b6d17f9d9ad7cb1c9fea78782699f |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.usespur.com. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| usespur.com. | No DS | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer error="invalid_token", error_description="Missing Authorization header", scope="spur", resource_metadata="https://mcp.usespur.com/.well-known/oauth-protected-resource/mcp"
Bearer error="invalid_token", error_description="Missing Authorization header", scope="spur", resource_metadata="https://mcp.usespur.com/.well-known/oauth-protected-resource/mcp" | Header | Value |
|---|---|
| strict-transport-security | max-age=63072000 |
Protected resource metadata
| Document | https://mcp.usespur.com/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.usespur.com/mcp |
| Authorisation server | https://mcp.usespur.com |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.usespur.com/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.usespur.com/mcp | HTTPS enforced | 308 | https://mcp.usespur.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
fetch Fetch Spur record ~53
Fetch the full text of a record returned by search (ids look like property:…, owner:… or template:…).
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Record id exactly as returned by search, e.g. property:<uuid> |
No output schema declared.
No examples provided.
search Search Spur ~72
Search the user's saved Spur properties, owners and postcard templates by keyword (address, city, owner name, phone, email, template name). Returns ids for the fetch tool. For live listings use spur_search_properties.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | Keywords: address, city, owner name, phone, email or template name |
No output schema declared.
No examples provided.
spur_add_postcard_qr_code Add QR code to postcard ~353
Put a tracked QR code on the back of one of the user's postcard templates and show the preview. Each mailed postcard gets its own code under the chosen QR code, so scans are tracked per recipient (spur_get_qr_code_activity). Placement: position="auto" fills the back's QR slot (an element with class qr-box, qr-code-box, qr-placeholder or qr-callout-box, as Spur's gallery designs have) and otherwise goes in the bottom-right of the message area, left of the address block and above the USPS barcode. Corners (top_left, top_right, bottom_left, bottom_right) and x_inches/y_inches place it in the message area; spots in the USPS clear zone are refused. Replaces any QR already on the card. If it lands on the message text, call again with another corner or move the text. Create a QR code first with spur_create_qr_code if spur_list_qr_codes has none that fits.
| Name | Type | Req | Description |
|---|---|---|---|
| position | string | – | Where to place the code on the back; auto fills the design's qr-box |
| qr_code_id | string | yes | QR code id from spur_list_qr_codes or spur_create_qr_code |
| size_inches | number | – | Edge length when placed in the message area (not used for a slot). 0.75in or more scans reliably |
| template_id | string | yes | Postcard template id (UUID from a Spur list/search tool) |
| x_inches | number | – | Left edge, inches from the bleed's left edge (with y_inches; overrides position) |
| y_inches | number | – | Top edge, inches from the bleed's top edge (with x_inches) |
No output schema declared.
No examples provided.
spur_add_properties_to_list Add properties to list ~60
Add saved properties to an existing property list.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | yes | Property list id (UUID from a Spur list/search tool) |
| property_ids | array | yes | Saved property ids (from spur_list_saved_properties or spur_save_properties) |
No output schema declared.
No examples provided.
spur_buy_phone_number Buy phone number ~159
Buy a local number for the user's account (it's theirs immediately and replies land in their SMS inbox). It can't send texts until their carrier registration is approved. Plans include some numbers; beyond that each costs $5/mo from the Spur wallet, first month charged now (spur_get_texting_setup shows the user's price). Tell the user the price and get explicit approval for this exact number first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| locality | string | – | City from the search result, for display |
| phone_number | string | yes | phone_number from spur_search_phone_numbers |
| region | string | – | State from the search result, for display |
No output schema declared.
No examples provided.
spur_change_plan Upgrade or change plan ~180
Moves the user to another Spur plan (ids from spur_show_billing_options; usually agent, team or brokerage). - No paid subscription yet: returns a Stripe checkout link. No confirmation needed. - Already subscribed: switches the plan immediately and charges or credits the prorated difference to the saved card. Call once without confirm to get the exact change, ask the user to approve it, then call again with confirm=true. - Moving to the free Solo plan returns a billing-portal link where the user cancels the paid subscription.
| Name | Type | Req | Description |
|---|---|---|---|
| billing_interval | string | – | annual is cheaper per month |
| confirm | boolean | – | Only for users who already have a paid subscription: true ONLY after they approved the switch and the prorated charge in the conversation. |
| plan_id | string | yes | Target plan id, e.g. agent, team, brokerage |
No output schema declared.
No examples provided.
spur_check_payment Check payment ~65
After the user pays a Stripe checkout link from spur_top_up_wallet or spur_change_plan, confirms the payment went through and returns the new wallet balance and plan. Safe to call repeatedly.
| Name | Type | Req | Description |
|---|---|---|---|
| session_id | string | yes | session_id returned with the checkout link (starts with cs_) |
No output schema declared.
No examples provided.
spur_create_email_template Create email template ~480
Save a new email template and show its inbox preview. Ways to start: - From blank: start_from_blank=true gives a tested 600px responsive layout with greeting, signature and a compliant footer; pass html to replace it. - Redesign: base_template_id copies one of the user's email templates. - From scratch: pass html (or only text_body for a plain-text email). The saved template can then be used by outreach workflows (spur_create_workflow / spur_set_workflow_step_template). Email HTML guidance (see spur://email-design-guide): full HTML document, table-based layout 600px wide, inline styles on elements (a small <style> block in <head> is fine for resets/media queries), web-safe font stacks, no JavaScript, no forms, no external CSS. Images as absolute https URLs with alt text and width attributes. The user's own images (logo, headshot, property photos): spur_list_images gives their URLs; if they want to use an image they have, call spur_upload_image (or spur_save_image for a link) and use the saved URL. Use PNG or JPG in emails, not SVG. A hidden preheader <div style="display:none"> right after <body> sets the inbox snippet. Include an opt-out line ("Reply STOP" or an unsubscribe link) and the sender's postal address in the footer. Keep it under 50,000 characters. Use merge fields like {{owner_first_name}}, {{property_address}}, {{your_name}}, {{your_phone}}, {{company_name}} (see spur://merge-variables). The plain-text version is generated from the HTML unless you pass text_body.
| Name | Type | Req | Description |
|---|---|---|---|
| base_template_id | string | – | Copy this email template as the starting point |
| description | string | – | Internal note about the template; never sent to owners |
| html | string | – | Full email HTML; merge fields like {{owner_first_name}} are filled per recipient |
| is_default | boolean | – | Make this the user's default email template |
| name | string | yes | Template name shown in Spur |
| start_from_blank | boolean | – | true = start from Spur's responsive, compliant blank email layout |
| subject | string | – | Required unless copying a template |
| text_body | string | – | Plain-text version; generated from the HTML when omitted |
No output schema declared.
No examples provided.
spur_create_letter_template Create letter template ~479
Create a letter template and show a preview. Pick the letter type first (top_first_page or insert_blank_page); it decides where the address prints and how much of the page the design can use. Three ways to start: - From blank: start_from_blank=true gives an empty one-page letter laid out for the letter type. - Redesign an existing template: base_template_id (yours, a Spur default or a gallery id) copies its HTML and letter type; override html or letter_type as needed. - From scratch: pass html. HTML guidance (see spur://letter-design-guide): one US Letter page (8.5"×11"), full HTML document with inline <style>, "@page { size: 8.5in 11in; margin: 0; }", no scripts. One root <div class="letter"> 8.5in wide; px/in units only (no vh/vw); no box-shadow, transforms or manual page breaks. top_first_page: leave the first 3.15in blank (an empty <div class="address-zone" style="height:3.15in">), body ≈ 3–4 short paragraphs. insert_blank_page: no address zone; letterhead up to 1.8in, body up to ~400 words. Images as absolute https URLs. The user's own images (logo, headshot, property photos): spur_list_images gives their URLs; if they want to use an image they have, call spur_upload_image (or spur_save_image for a link) and use the saved URL. Use merge fields such as {{owner_first_name}}, {{property_address}}, {{your_name}}, {{your_phone}}, {{company_name}} (see spur://merge-variables).
| Name | Type | Req | Description |
|---|---|---|---|
| base_template_id | string | – | Copy this template's HTML and letter type as the starting point |
| category | string | – | Category label, e.g. "Seller Outreach" |
| description | string | – | Internal note about the template; never printed |
| html | string | – | Full letter HTML |
| letter_type | string | – | Defaults to the base template's type, else top_first_page |
| name | string | yes | Template name shown in Spur |
| start_from_blank | boolean | – | Start from an empty page laid out for letter_type |
No output schema declared.
No examples provided.
spur_create_postcard_template Create postcard template ~727
Create a postcard template and show a preview. Three ways to start: - From blank: start_from_blank=true gives an empty, correctly sized canvas for the size (any side you pass HTML for replaces the blank side). - Redesign an existing template: base_template_id (yours, a Spur default or a gallery id) copies its HTML; override front_html/back_html/size as needed. - From scratch: pass both front_html and back_html. HTML guidance (see spur://postcard-design-guide): full HTML documents, inline <style>, no scripts. Fixed pixel sizing on html, body and a root .postcard at 300 px/in including 0.125" bleed: 6x4 → 1875×1275, 6x9 → 2775×1875, 6x11 → 3375×1875. Keep text 0.25" inside the edge. USPS clear zone on the back, measured from the bleed edges (Spur prints over it and covers anything there): postage 1.25"×1.25" in the top-right corner; address block 3.5"×2", 0.5" from the right edge and 1.35" from the top; USPS barcode strip 4.75"×0.625" along the bottom-right edge. Keep all text, logos, photos and QR codes out of it; a background color or texture under it is fine. The safe message area is left of the address block and above the barcode strip. Images as absolute https URLs. The user's own images (logo, headshot, property photos): spur_list_images gives their URLs; if they want to use an image they have, call spur_upload_image (or spur_save_image for a link) and use the saved URL. Use merge fields such as {{owner_first_name}}, {{property_address}}, {{your_name}}, {{your_phone}}, {{company_name}} (see spur://merge-variables). QR code box by default: unless the user says they don't want a QR code, every back you design includes an empty square <div class="qr-box"> in the message area (≥ 0.75in, e.g. 225×225 px at 300 px/in) with a short call to action beside it ("Scan to see your home's value"). Never write QR markup or {{qrUrl}} yourself: after saving, call spur_add_postcard_qr_code and the tracked QR fills the box (pick the code with spur_list_qr_codes, or ask the user…
| Name | Type | Req | Description |
|---|---|---|---|
| back_html | string | – | Full back-side HTML; keep the address block area clear |
| base_template_id | string | – | Copy this template's HTML and size as the starting point |
| category | string | – | Category label, e.g. "Just Sold" or "Market Update" |
| description | string | – | Internal note about the template; never printed |
| front_html | string | – | Full front-side HTML |
| name | string | yes | Template name shown in Spur |
| size | string | – | Postcard size: "6x4" (standard 4×6), "6x9" or "6x11" |
| start_from_blank | boolean | – | Start from an empty canvas sized for `size` |
No output schema declared.
No examples provided.
spur_create_property_list Create property list ~66
Create a property list, optionally seeding it with saved property ids.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional note about what the list is for |
| name | string | yes | List name shown in Spur |
| property_ids | array | – | Saved property ids to add right away |
No output schema declared.
No examples provided.
spur_create_qr_code Create QR code ~163
Create a tracked QR code that sends scans to destination_url. Then add it to a postcard back with spur_add_postcard_qr_code; each mailed postcard gets its own code under it so scans are tracked per recipient.
| Name | Type | Req | Description |
|---|---|---|---|
| background_color | string | – | Hex color, e.g. #111827. Keep strong contrast with the background so phones can scan it |
| destination_url | string | yes | Where a scan sends people, e.g. https://acme.example/offer (https:// is added if missing) |
| foreground_color | string | – | Hex color, e.g. #111827. Keep strong contrast with the background so phones can scan it |
| name | string | yes | Label shown in Spur, e.g. 'Spring cash offer' |
No output schema declared.
No examples provided.
spur_create_search_automation Create search automation ~1,608
Schedule a recurring property search. Every run uses 1 search credit, or 2 when it makes more than 3 ZHomes calls (several event types, tax/sale-history events, furnished-only or description-based filters). New matches can be saved to a list and enriched automatically (auto_enrich spends skip-trace credits on every run, so confirm with the user). Examples: - "every Monday 8am Central, Dallas rentals under $2k" -> frequency="weekly", day_of_week=1, run_time="08:00", timezone="America/Chicago", location="Dallas, TX", max_amount=2000 - "last Friday of each month" -> frequency="monthly", day_of_week=5, week_of_month=-1 - "every morning, new pre-foreclosures and price drops in Houston, save to my Distress list" -> frequency="daily", run_time="07:00", location="Houston, TX", events=["preforeclosure","price_drop"], list_id=… Accepts the same advanced and event filters as spur_search_properties (min_amount / max_amount instead of min_price / max_price). Run the search once with spur_search_properties first so the user can check the results before scheduling. In automations each event fires once, on the run that first sees it, so the same property isn't saved twice; change events start reporting from the second run. "delisted" is only available here. Events (pass in `events`; a listing matches when ANY selected event fired, and is tagged with each): - Listing lifecycle: new_listing, coming_soon, coming_soon_active, price_drop, price_increase, pending, sold, back_on_market, delisted (automations only), open_house, rental_listed, rent_change, move_in_moved_up - Distress & motivation: preforeclosure, foreclosure, auction, bank_owned, distress_escalated, fsbo, agent_to_fsbo, stale_listing, new_construction - Valuation & tax: tax_assessment_posted, assessed_value_jump, tax_paid_dropped (weak), sale_recorded, zestimate_moved, equity_gap, price_below_assessed Direct events (price_drop, pending, sold, preforeclosure, fsbo, new_listing, …) work on the first search. Change…
| Name | Type | Req | Description |
|---|---|---|---|
| ai_query | string | – | Qualitative intent; each run re-ranks listings by description against it |
| auto_enrich | boolean | – | Skip-trace new matches on every run (spends enrichment credits) |
| auto_save | boolean | – | Save new matches to the user's properties |
| center_lat | number | – | Radius search centre (with center_lng and radius_miles) |
| center_lng | number | – | Radius search centre longitude (with center_lat and radius_miles) |
| day_of_week | integer | – | 0=Sunday … 6=Saturday; for weekly, biweekly, monthly |
| days_posted | integer | – | Only listings posted within this many days |
| enabled | boolean | – | false = save it paused |
| event_min_change_pct | number | – | Minimum % move for price / rent / Zestimate / assessment events |
| event_min_equity_gap_pct | number | – | Minimum % Zestimate above last sale price for equity_gap (default 30) |
| event_stale_days | integer | – | Days on market that counts as stale (default 90) |
| event_within_days | integer | – | Lookback window for events, in days (default 7) |
| events | array | – | Only listings where any of these events happened; see the tool description |
| frequency | string | yes | How often the search runs |
| has_garage | boolean | – | true = only listings with a garage |
| has_pool | boolean | – | true = only listings with a pool |
| has_view | boolean | – | true = only listings with any view (use views on live search for a specific kind) |
| home_type | string | – | Zillow home type code |
| is_price_reduced | boolean | – | true = only listings whose asking price has been cut |
| is_waterfront | boolean | – | true = only waterfront listings |
| keywords | string | – | Comma-separated listing keywords, e.g. "pool, granite" |
| list_id | string | – | Save new matches into this property list |
| listing_status | string | – | Which listings to search |
| listing_type | string | – | Seller / listing kind; for catching NEW entries into a distress stage prefer events |
| location | string | yes | City/state or ZIP, e.g. "Dallas, TX" |
| max_age | integer | – | At most this many years since built |
| max_amount | number | – | Maximum price in USD (rent per month for forRent) |
| max_baths | number | – | Maximum bathrooms |
| max_beds | integer | – | Maximum bedrooms |
| max_days_on_market | integer | – | Listed at most this many days |
| max_lot_size | integer | – | Square feet |
| max_ownership_years | number | – | Owner has held the property at most this long |
| max_sqft | integer | – | Maximum living area in square feet |
| max_year_built | integer | – | Built in or before this year |
| max_zip | integer | – | Highest ZIP code in a numeric ZIP range (with min_zip) |
| min_age | integer | – | Years since built |
| min_amount | number | – | Minimum price in USD (rent per month for forRent) |
| min_baths | number | – | Minimum bathrooms (half baths count as 0.5) |
| min_beds | integer | – | Minimum bedrooms |
| min_days_on_market | integer | – | Listed at least this many days (higher suggests a motivated seller) |
| min_equity | number | – | Estimated equity in USD (Zestimate or price minus assessed value; rough) |
| min_lot_size | integer | – | Square feet (1 acre = 43,560) |
| min_ownership_years | number | – | Owner has held the property at least this long |
| min_sqft | integer | – | Minimum living area in square feet |
| min_year_built | integer | – | Built in or after this year |
| min_zip | integer | – | Lowest ZIP code in a numeric ZIP range (with max_zip); prefer zip_list for specific ZIPs |
| name | string | yes | Automation name shown in Spur |
| neighborhoods | array | – | Neighborhood / area names matched against address and description |
| only_absentee | boolean | – | Absentee-owned (owner mails elsewhere) |
| only_pre_foreclosure | boolean | – | Distressed / pre-foreclosure (heuristic, includes description keywords) |
| only_vacant | boolean | – | Likely vacant (heuristic: description keywords + long days on market) |
| ownership_type | string | – | business = LLC / corp / trust owners (heuristic) |
| radius_miles | number | – | Keep only listings within this many miles of center_lat / center_lng |
| run_time | string | yes | 24h local time "HH:MM" |
| timezone | string | – | IANA time zone, e.g. "America/Chicago" |
| week_of_month | – | – | Monthly only; -1 = last |
| zip_list | array | – | Keep only these ZIPs; set location to the city that contains them |
No output schema declared.
No examples provided.
spur_create_sms_template Create SMS template ~247
Save a new SMS template and show its phone preview with segment count and checks. The saved template can then be used by outreach workflows (spur_create_workflow / spur_set_workflow_step_template). SMS guidance: plain text, ideally one segment (160 GSM characters, or 70 if it uses emoji or other non-GSM characters; longer messages are billed per segment). Identify yourself, keep it conversational, and include opt-out wording ("Reply STOP to opt out") on first-touch messages. Links in texts from unverified numbers can be blocked, so give link-free fallback_body text when the body has a URL. Use merge fields like {{owner_first_name}}, {{property_address}}, {{your_name}} (see spur://merge-variables).
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Internal note about the template; never sent to owners |
| fallback_body | string | – | Link-free version sent if a link gets the text blocked |
| is_default | boolean | – | true = make this the user's default template for its channel |
| name | string | yes | Template name shown in Spur |
| text | string | yes | SMS body; merge fields like {{owner_first_name}} are filled per recipient |
No output schema declared.
No examples provided.
spur_create_workflow Create outreach workflow ~238
Create a multi-step outreach sequence from saved templates. It's saved as an inactive draft: nothing sends until it's activated (spur_set_workflow_active) and owners are enrolled. Send steps take a saved template: email/SMS from spur_list_message_templates (design new ones with spur_create_email_template / spur_create_sms_template), direct mail from the user's saved postcard or letter templates. Wait steps space them out. Reply/open/click branches can be added afterwards in Spur → Outreach. Example: "text, wait 2 days, email, wait 5 days, postcard" -> steps=[{type:"send_sms",template_id:…},{type:"wait",days:2},{type:"send_email",template_id:…},{type:"wait",days:5},{type:"send_direct_mail",template_id:…}]
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Optional note about the workflow's goal |
| name | string | yes | Workflow name shown in Spur |
| steps | array | yes | Steps in run order: send_email / send_sms / send_direct_mail with a saved template_id, and wait steps (days, hours) between them |
No output schema declared.
No examples provided.
spur_delete_image Delete image ~89
Permanently delete one of the user's saved images. Refused while one of their postcard, letter or email templates still uses it, since those would show a broken image. Confirm with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| image_id | string | yes | image_id from spur_list_images |
No output schema declared.
No examples provided.
spur_delete_letter_template Delete letter template ~76
Permanently delete one of the user's letter templates. Spur defaults can't be deleted. Confirm with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| template_id | string | yes | Template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_delete_message_template Delete email or SMS template ~93
Delete one of the user's email or SMS templates. Workflow steps that use it will fail until they get another template, so check spur_list_workflows and confirm with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_delete_postcard_template Delete postcard template ~77
Permanently delete one of the user's postcard templates. Spur defaults can't be deleted. Confirm with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| template_id | string | yes | Template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_delete_qr_code Delete QR code ~103
Permanently delete a QR code. Refused while one of the user's postcard templates still prints it: remove it from those first with spur_remove_postcard_qr_code. Postcards already mailed keep redirecting. Confirm with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| qr_code_id | string | yes | QR code id from spur_list_qr_codes |
No output schema declared.
No examples provided.
spur_draft_message Draft outreach message ~155
Draft an email, SMS or direct-mail message with Spur's AI. Returns text only; nothing is sent. Pass owner_id/property_id to personalize with real owner and property data. Uses 1 AI credit. Use {{merge_fields}} like {{owner_first_name}} and {{property_address}} to keep it reusable (see resource spur://merge-variables).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | yes | Which kind of message to draft |
| owner_id | string | – | Owner to personalize for (from spur_find_owners) |
| prompt | string | yes | What to write, e.g. "friendly first touch asking if they would sell, mention we close in cash" |
| property_id | string | – | Saved property the message is about |
No output schema declared.
No examples provided.
spur_enrich Skip trace / enrich ~144
Run skip tracing to find owners and their phone numbers, emails and mailing addresses. - property_ids: find the owner of saved properties (creates/links owner records) - owner_ids: refresh contact details for existing owners Costs enrichment credits per record (check spur_get_billing_summary). Ask the user to approve the count first, then call with confirm=true.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| owner_ids | array | – | Owner ids to skip-trace (from spur_find_owners) |
| property_ids | array | – | Saved property ids whose owners to skip-trace |
No output schema declared.
No examples provided.
spur_enroll_owners_in_workflow Enroll owners in workflow ~123
Enroll owners in an outreach workflow. The workflow will start emailing/texting/mailing them on its schedule, which uses credits. Confirm the workflow name and owner count with the user first.
| Name | Type | Req | Description |
|---|---|---|---|
| confirm | boolean | yes | Set to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval. |
| owner_ids | array | yes | Owner ids to enroll (from spur_find_owners); owners without the needed contact details are skipped |
| workflow_id | string | yes | Workflow id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_find_owners Find owners ~118
Find property owners in the user's Spur account by name, phone, email or mailing address text. Use spur_get_owner for full details and portfolio.
| Name | Type | Req | Description |
|---|---|---|---|
| enrichment_status | string | – | Only owners with this skip-trace status |
| has_phone | boolean | – | Only owners with at least one phone number |
| limit | integer | – | Maximum number of items to return |
| offset | integer | – | Number of items to skip, for pagination |
| query | string | – | Text to match against name, email, phone or mailing address |
No output schema declared.
No examples provided.
spur_get_automation_logs Automation run history ~60
Recent runs of a search automation: when, how many found/saved/enriched, and errors.
| Name | Type | Req | Description |
|---|---|---|---|
| automation_id | string | yes | Automation id (UUID from a Spur list/search tool) |
| limit | integer | – | Maximum runs to return |
No output schema declared.
No examples provided.
spur_get_billing_summary Billing summary ~46
Plan, wallet balance, and this period's usage and remaining allowance per feature (searches, enrichment, SMS, postcards, letters, AI). Check this before large sends.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_get_campaign_stats Campaign stats ~36
Delivery and run statistics for one campaign.
| Name | Type | Req | Description |
|---|---|---|---|
| campaign_id | string | yes | Campaign id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_get_direct_mail_analytics Direct mail analytics ~31
Letters and postcards sent, delivered, in transit and returned, plus USPS tracking totals and spend.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_get_letter_template Get letter template HTML ~66
Fetch a letter template's HTML for reading or editing. For small text changes prefer spur_update_letter_template with replacements instead of resending the whole HTML.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | Template id from spur_list_letter_templates (a saved template's UUID or a Spur gallery id) |
No output schema declared.
No examples provided.
spur_get_message_template Get email or SMS template ~69
Fetch an email template's subject, HTML and plain text, or an SMS template's text, for reading or editing. For small changes prefer the update tool's replacements over resending everything.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_get_outreach_report Outreach report ~86
Outreach performance (sent, delivered, opened, replied, by channel) for all workflows or one, over an optional date range.
| Name | Type | Req | Description |
|---|---|---|---|
| date_from | string | – | ISO date, e.g. 2026-10-01 |
| date_to | string | – | ISO date |
| workflow_id | string | – | Report on one workflow only; omit for all workflows |
No output schema declared.
No examples provided.
spur_get_owner Get owner ~46
Full owner record: contact details, mailing address, enrichment status and their property portfolio in Spur.
| Name | Type | Req | Description |
|---|---|---|---|
| owner_id | string | yes | Owner id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_get_postcard_template Get postcard template HTML ~81
Fetch a postcard template's HTML for reading or editing. For small text changes prefer spur_update_postcard_template with replacements instead of resending whole HTML.
| Name | Type | Req | Description |
|---|---|---|---|
| side | string | – | Which side's HTML to return |
| template_id | string | yes | Template id from spur_list_postcard_templates (a saved template's UUID or a Spur gallery id) |
No output schema declared.
No examples provided.
spur_get_property Get property ~71
Show one property as a detailed card: a saved Spur property by property_id, or a live listing by zpid. Includes owner links and enrichment status for saved properties.
| Name | Type | Req | Description |
|---|---|---|---|
| property_id | string | – | Saved Spur property id |
| zpid | string|number | – | Zillow property id from search results |
No output schema declared.
No examples provided.
spur_get_property_stats Property stats ~30
Totals for the user's saved properties: counts by status, enrichment progress and similar portfolio-level numbers.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_get_qr_code_activity QR code scans ~81
Scan activity for a QR code: totals, which mailed recipients (owners) scanned their postcard, and recent scans of the code itself. Use it to find warm leads from a postcard campaign.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum recipients and scans to list |
| qr_code_id | string | yes | QR code id from spur_list_qr_codes |
No output schema declared.
No examples provided.
spur_get_sms_conversation SMS thread ~40
The full SMS thread with one owner, oldest first.
| Name | Type | Req | Description |
|---|---|---|---|
| owner_id | string | yes | Owner id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_get_texting_setup Texting setup status ~87
The user's texting setup: phone numbers bought in Spur (and which can send), carrier (A2P 10DLC) registration status, carrier notes, what's still missing, and the next step. Call this before helping with numbers or registration.
| Name | Type | Req | Description |
|---|---|---|---|
| refresh | boolean | – | true = ask the carriers for the latest status first (use when the user is waiting on approval) |
No output schema declared.
No examples provided.
spur_get_workflow Get outreach workflow ~62
One outreach workflow's steps in order (including reply/open branches built in the app), with the email, SMS or mail template each send step uses and its step_id.
| Name | Type | Req | Description |
|---|---|---|---|
| workflow_id | string | yes | Workflow id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_list_campaigns List campaigns ~67
The user's campaigns (bulk email, SMS, direct mail, outreach) with status and recipient progress.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum campaigns to return |
| offset | integer | – | Campaigns to skip, for paging |
| status | string | – | Only campaigns with this status |
No output schema declared.
No examples provided.
spur_list_images List images ~88
The user's saved images (logos, headshots, property photos) with their public URLs, newest first. Use it as <img src="…"> (or a CSS background-image) in postcard, letter or email HTML. To add one, use spur_upload_image (from the user's device) or spur_save_image (from a URL).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum images to return |
No output schema declared.
No examples provided.
spur_list_letter_templates List letter templates ~109
Letter templates available to the user, with their letter type (Top First Page or Insert Blank Page): their own (editable), Spur defaults, and Spur's built-in gallery. Copy one with spur_create_letter_template base_template_id to redesign it, or start from blank with start_from_blank.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Only templates in this category |
| include_gallery | boolean | – | Include Spur's built-in gallery designs |
| letter_type | string | – | Only templates of this letter type |
No output schema declared.
No examples provided.
spur_list_message_templates List email and SMS templates ~48
The user's saved email and SMS templates. These are what outreach workflow send_email / send_sms steps use.
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | – | Only email or only SMS templates; omit for both |
No output schema declared.
No examples provided.
spur_list_postcard_templates List postcard templates ~109
Postcard templates available to the user: their own (editable), Spur defaults, and Spur's built-in gallery. Copy a default or gallery design with spur_create_postcard_template base_template_id to redesign it, or start from blank with start_from_blank.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Only templates in this category, e.g. "Just Sold" |
| include_gallery | boolean | – | Include Spur's built-in gallery designs |
| size | string | – | Only templates designed for this size |
No output schema declared.
No examples provided.
spur_list_property_lists List property lists ~39
All of the user's property lists with ids and sizes. Use the id with spur_list_saved_properties, spur_add_properties_to_list or outreach tools.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_list_qr_codes List QR codes ~56
The user's tracked QR codes: destination URL, colors, and which of their postcard templates print each one. Put one on a postcard with spur_add_postcard_qr_code; see scans with spur_get_qr_code_activity.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_list_return_addresses List return addresses ~29
Return addresses saved for direct mail. The default one is used when a campaign doesn't specify one.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_list_saved_properties List saved properties ~167
List properties the user has saved in Spur, optionally filtered by city, state, list, or enrichment status. Shows cards and a map.
| Name | Type | Req | Description |
|---|---|---|---|
| city | string | – | City name, e.g. "Austin" |
| enrichment_status | string | – | Skip-trace status of the property's owner (spur_enrich) |
| limit | integer | – | Maximum number of items to return |
| list_id | string | – | Only properties in this property list |
| max_price | number | – | Maximum price in USD (rent per month for rentals) |
| min_price | number | – | Minimum price in USD (rent per month for rentals) |
| offset | integer | – | Number of items to skip, for pagination |
| state | string | – | Two-letter state, e.g. "TX" |
No output schema declared.
No examples provided.
spur_list_search_automations List search automations ~28
Scheduled property searches with their schedule, filters, and next/last run times.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
spur_list_sms_conversations SMS inbox ~68
SMS conversations with owners, newest first, with unread counts and the last message. Good for triaging replies (hot leads, not interested, wrong number).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Maximum conversations to return |
| unread_only | boolean | – | true = only conversations with unread replies |
No output schema declared.
No examples provided.
How do I install the Spur MCP server?
Spur is a hosted endpoint at https://mcp.usespur.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.usespur.com
claude mcp add --transport http com-usespur-spur 'https://mcp.usespur.com/mcp'
What is the Spur MCP server?
Spur is an MCP server listed in the public MCP registry as com.usespur/spur. Real estate leads, skip tracing, direct mail, SMS & email outreach, and marketing automations. This page covers its hosted endpoint (https://mcp.usespur.com/mcp).
Is the Spur MCP server safe to use?
Spur scores 85 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the Spur MCP server expose?
Spur exposes 87 tools: spur_search_properties, spur_parse_search_query, spur_get_property, spur_save_properties, spur_list_saved_properties, and 82 more. Their descriptions and schemas cost roughly 15,017 tokens of context every time the server is loaded.
Does the Spur MCP server require authentication?
Yes. Spur asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the Spur MCP server still maintained?
Spur is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the Spur MCP server?
VerifyMCP ran 14 checks on Spur, covering TLS certificate, Authorization, HTTPS, HSTS header and 10 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.