Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Spur

REMOTE · MCP.USESPUR.COM

Real estate leads, skip tracing, direct mail, SMS & email outreach, and marketing automations

Available components

+3 this week 85 Trust /100

Last scanned (13 hours ago)

Scores higher than 91% of remote servers

Reachable. Last reached 5 Nov 2026.

Category CRM and Sales

Trust breakdown (7 categories)

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
Transport & Reachability100
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
What we tested

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 →

Changelog

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.

Diagnostics

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
MCP tools · 87 exposed · ~15,017 tokens

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 →

Tool Tokens
fetch ~53

Fetch the full text of a record returned by search (ids look like property:…, owner:… or template:…).

NameTypeReqDescription
idstringyesRecord id exactly as returned by search, e.g. property:<uuid>

No output schema declared.

No examples provided.

search ~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.

NameTypeReqDescription
querystringyesKeywords: address, city, owner name, phone, email or template name

No output schema declared.

No examples provided.

spur_add_postcard_qr_code ~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.

NameTypeReqDescription
positionstring–Where to place the code on the back; auto fills the design's qr-box
qr_code_idstringyesQR code id from spur_list_qr_codes or spur_create_qr_code
size_inchesnumber–Edge length when placed in the message area (not used for a slot). 0.75in or more scans reliably
template_idstringyesPostcard template id (UUID from a Spur list/search tool)
x_inchesnumber–Left edge, inches from the bleed's left edge (with y_inches; overrides position)
y_inchesnumber–Top edge, inches from the bleed's top edge (with x_inches)

No output schema declared.

No examples provided.

spur_add_properties_to_list ~60

Add saved properties to an existing property list.

NameTypeReqDescription
list_idstringyesProperty list id (UUID from a Spur list/search tool)
property_idsarrayyesSaved property ids (from spur_list_saved_properties or spur_save_properties)

No output schema declared.

No examples provided.

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

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
localitystring–City from the search result, for display
phone_numberstringyesphone_number from spur_search_phone_numbers
regionstring–State from the search result, for display

No output schema declared.

No examples provided.

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

NameTypeReqDescription
billing_intervalstring–annual is cheaper per month
confirmboolean–Only for users who already have a paid subscription: true ONLY after they approved the switch and the prorated charge in the conversation.
plan_idstringyesTarget plan id, e.g. agent, team, brokerage

No output schema declared.

No examples provided.

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

NameTypeReqDescription
session_idstringyessession_id returned with the checkout link (starts with cs_)

No output schema declared.

No examples provided.

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

NameTypeReqDescription
base_template_idstring–Copy this email template as the starting point
descriptionstring–Internal note about the template; never sent to owners
htmlstring–Full email HTML; merge fields like {{owner_first_name}} are filled per recipient
is_defaultboolean–Make this the user's default email template
namestringyesTemplate name shown in Spur
start_from_blankboolean–true = start from Spur's responsive, compliant blank email layout
subjectstring–Required unless copying a template
text_bodystring–Plain-text version; generated from the HTML when omitted

No output schema declared.

No examples provided.

spur_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).

NameTypeReqDescription
base_template_idstring–Copy this template's HTML and letter type as the starting point
categorystring–Category label, e.g. "Seller Outreach"
descriptionstring–Internal note about the template; never printed
htmlstring–Full letter HTML
letter_typestring–Defaults to the base template's type, else top_first_page
namestringyesTemplate name shown in Spur
start_from_blankboolean–Start from an empty page laid out for letter_type

No output schema declared.

No examples provided.

spur_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…

NameTypeReqDescription
back_htmlstring–Full back-side HTML; keep the address block area clear
base_template_idstring–Copy this template's HTML and size as the starting point
categorystring–Category label, e.g. "Just Sold" or "Market Update"
descriptionstring–Internal note about the template; never printed
front_htmlstring–Full front-side HTML
namestringyesTemplate name shown in Spur
sizestring–Postcard size: "6x4" (standard 4×6), "6x9" or "6x11"
start_from_blankboolean–Start from an empty canvas sized for `size`

No output schema declared.

No examples provided.

spur_create_property_list ~66

Create a property list, optionally seeding it with saved property ids.

NameTypeReqDescription
descriptionstring–Optional note about what the list is for
namestringyesList name shown in Spur
property_idsarray–Saved property ids to add right away

No output schema declared.

No examples provided.

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

NameTypeReqDescription
background_colorstring–Hex color, e.g. #111827. Keep strong contrast with the background so phones can scan it
destination_urlstringyesWhere a scan sends people, e.g. https://acme.example/offer (https:// is added if missing)
foreground_colorstring–Hex color, e.g. #111827. Keep strong contrast with the background so phones can scan it
namestringyesLabel shown in Spur, e.g. 'Spring cash offer'

No output schema declared.

No examples provided.

spur_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…

NameTypeReqDescription
ai_querystring–Qualitative intent; each run re-ranks listings by description against it
auto_enrichboolean–Skip-trace new matches on every run (spends enrichment credits)
auto_saveboolean–Save new matches to the user's properties
center_latnumber–Radius search centre (with center_lng and radius_miles)
center_lngnumber–Radius search centre longitude (with center_lat and radius_miles)
day_of_weekinteger–0=Sunday … 6=Saturday; for weekly, biweekly, monthly
days_postedinteger–Only listings posted within this many days
enabledboolean–false = save it paused
event_min_change_pctnumber–Minimum % move for price / rent / Zestimate / assessment events
event_min_equity_gap_pctnumber–Minimum % Zestimate above last sale price for equity_gap (default 30)
event_stale_daysinteger–Days on market that counts as stale (default 90)
event_within_daysinteger–Lookback window for events, in days (default 7)
eventsarray–Only listings where any of these events happened; see the tool description
frequencystringyesHow often the search runs
has_garageboolean–true = only listings with a garage
has_poolboolean–true = only listings with a pool
has_viewboolean–true = only listings with any view (use views on live search for a specific kind)
home_typestring–Zillow home type code
is_price_reducedboolean–true = only listings whose asking price has been cut
is_waterfrontboolean–true = only waterfront listings
keywordsstring–Comma-separated listing keywords, e.g. "pool, granite"
list_idstring–Save new matches into this property list
listing_statusstring–Which listings to search
listing_typestring–Seller / listing kind; for catching NEW entries into a distress stage prefer events
locationstringyesCity/state or ZIP, e.g. "Dallas, TX"
max_ageinteger–At most this many years since built
max_amountnumber–Maximum price in USD (rent per month for forRent)
max_bathsnumber–Maximum bathrooms
max_bedsinteger–Maximum bedrooms
max_days_on_marketinteger–Listed at most this many days
max_lot_sizeinteger–Square feet
max_ownership_yearsnumber–Owner has held the property at most this long
max_sqftinteger–Maximum living area in square feet
max_year_builtinteger–Built in or before this year
max_zipinteger–Highest ZIP code in a numeric ZIP range (with min_zip)
min_ageinteger–Years since built
min_amountnumber–Minimum price in USD (rent per month for forRent)
min_bathsnumber–Minimum bathrooms (half baths count as 0.5)
min_bedsinteger–Minimum bedrooms
min_days_on_marketinteger–Listed at least this many days (higher suggests a motivated seller)
min_equitynumber–Estimated equity in USD (Zestimate or price minus assessed value; rough)
min_lot_sizeinteger–Square feet (1 acre = 43,560)
min_ownership_yearsnumber–Owner has held the property at least this long
min_sqftinteger–Minimum living area in square feet
min_year_builtinteger–Built in or after this year
min_zipinteger–Lowest ZIP code in a numeric ZIP range (with max_zip); prefer zip_list for specific ZIPs
namestringyesAutomation name shown in Spur
neighborhoodsarray–Neighborhood / area names matched against address and description
only_absenteeboolean–Absentee-owned (owner mails elsewhere)
only_pre_foreclosureboolean–Distressed / pre-foreclosure (heuristic, includes description keywords)
only_vacantboolean–Likely vacant (heuristic: description keywords + long days on market)
ownership_typestring–business = LLC / corp / trust owners (heuristic)
radius_milesnumber–Keep only listings within this many miles of center_lat / center_lng
run_timestringyes24h local time "HH:MM"
timezonestring–IANA time zone, e.g. "America/Chicago"
week_of_month––Monthly only; -1 = last
zip_listarray–Keep only these ZIPs; set location to the city that contains them

No output schema declared.

No examples provided.

spur_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).

NameTypeReqDescription
descriptionstring–Internal note about the template; never sent to owners
fallback_bodystring–Link-free version sent if a link gets the text blocked
is_defaultboolean–true = make this the user's default template for its channel
namestringyesTemplate name shown in Spur
textstringyesSMS body; merge fields like {{owner_first_name}} are filled per recipient

No output schema declared.

No examples provided.

spur_create_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:…}]

NameTypeReqDescription
descriptionstring–Optional note about the workflow's goal
namestringyesWorkflow name shown in Spur
stepsarrayyesSteps 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 ~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.

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
image_idstringyesimage_id from spur_list_images

No output schema declared.

No examples provided.

spur_delete_letter_template ~76

Permanently delete one of the user's letter templates. Spur defaults can't be deleted. Confirm with the user first.

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
template_idstringyesTemplate id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

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

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_delete_postcard_template ~77

Permanently delete one of the user's postcard templates. Spur defaults can't be deleted. Confirm with the user first.

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
template_idstringyesTemplate id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

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

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
qr_code_idstringyesQR code id from spur_list_qr_codes

No output schema declared.

No examples provided.

spur_draft_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).

NameTypeReqDescription
channelstringyesWhich kind of message to draft
owner_idstring–Owner to personalize for (from spur_find_owners)
promptstringyesWhat to write, e.g. "friendly first touch asking if they would sell, mention we close in cash"
property_idstring–Saved property the message is about

No output schema declared.

No examples provided.

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

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
owner_idsarray–Owner ids to skip-trace (from spur_find_owners)
property_idsarray–Saved property ids whose owners to skip-trace

No output schema declared.

No examples provided.

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

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
owner_idsarrayyesOwner ids to enroll (from spur_find_owners); owners without the needed contact details are skipped
workflow_idstringyesWorkflow id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

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

NameTypeReqDescription
enrichment_statusstring–Only owners with this skip-trace status
has_phoneboolean–Only owners with at least one phone number
limitinteger–Maximum number of items to return
offsetinteger–Number of items to skip, for pagination
querystring–Text to match against name, email, phone or mailing address

No output schema declared.

No examples provided.

spur_get_automation_logs ~60

Recent runs of a search automation: when, how many found/saved/enriched, and errors.

NameTypeReqDescription
automation_idstringyesAutomation id (UUID from a Spur list/search tool)
limitinteger–Maximum runs to return

No output schema declared.

No examples provided.

spur_get_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 ~36

Delivery and run statistics for one campaign.

NameTypeReqDescription
campaign_idstringyesCampaign id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_get_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 ~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.

NameTypeReqDescription
template_idstringyesTemplate 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 ~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.

NameTypeReqDescription
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_get_outreach_report ~86

Outreach performance (sent, delivered, opened, replied, by channel) for all workflows or one, over an optional date range.

NameTypeReqDescription
date_fromstring–ISO date, e.g. 2026-10-01
date_tostring–ISO date
workflow_idstring–Report on one workflow only; omit for all workflows

No output schema declared.

No examples provided.

spur_get_owner ~46

Full owner record: contact details, mailing address, enrichment status and their property portfolio in Spur.

NameTypeReqDescription
owner_idstringyesOwner id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_get_postcard_template ~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.

NameTypeReqDescription
sidestring–Which side's HTML to return
template_idstringyesTemplate 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 ~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.

NameTypeReqDescription
property_idstring–Saved Spur property id
zpidstring|number–Zillow property id from search results

No output schema declared.

No examples provided.

spur_get_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 ~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.

NameTypeReqDescription
limitinteger–Maximum recipients and scans to list
qr_code_idstringyesQR code id from spur_list_qr_codes

No output schema declared.

No examples provided.

spur_get_sms_conversation ~40

The full SMS thread with one owner, oldest first.

NameTypeReqDescription
owner_idstringyesOwner id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_get_texting_setup ~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.

NameTypeReqDescription
refreshboolean–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 ~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.

NameTypeReqDescription
workflow_idstringyesWorkflow id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_list_campaigns ~67

The user's campaigns (bulk email, SMS, direct mail, outreach) with status and recipient progress.

NameTypeReqDescription
limitinteger–Maximum campaigns to return
offsetinteger–Campaigns to skip, for paging
statusstring–Only campaigns with this status

No output schema declared.

No examples provided.

spur_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).

NameTypeReqDescription
limitinteger–Maximum images to return

No output schema declared.

No examples provided.

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

NameTypeReqDescription
categorystring–Only templates in this category
include_galleryboolean–Include Spur's built-in gallery designs
letter_typestring–Only templates of this letter type

No output schema declared.

No examples provided.

spur_list_message_templates ~48

The user's saved email and SMS templates. These are what outreach workflow send_email / send_sms steps use.

NameTypeReqDescription
channelstring–Only email or only SMS templates; omit for both

No output schema declared.

No examples provided.

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

NameTypeReqDescription
categorystring–Only templates in this category, e.g. "Just Sold"
include_galleryboolean–Include Spur's built-in gallery designs
sizestring–Only templates designed for this size

No output schema declared.

No examples provided.

spur_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 ~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 ~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 ~167

List properties the user has saved in Spur, optionally filtered by city, state, list, or enrichment status. Shows cards and a map.

NameTypeReqDescription
citystring–City name, e.g. "Austin"
enrichment_statusstring–Skip-trace status of the property's owner (spur_enrich)
limitinteger–Maximum number of items to return
list_idstring–Only properties in this property list
max_pricenumber–Maximum price in USD (rent per month for rentals)
min_pricenumber–Minimum price in USD (rent per month for rentals)
offsetinteger–Number of items to skip, for pagination
statestring–Two-letter state, e.g. "TX"

No output schema declared.

No examples provided.

spur_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 ~68

SMS conversations with owners, newest first, with unread counts and the last message. Good for triaging replies (hot leads, not interested, wrong number).

NameTypeReqDescription
limitinteger–Maximum conversations to return
unread_onlyboolean–true = only conversations with unread replies

No output schema declared.

No examples provided.

Install

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

# add to Claude Code
claude mcp add --transport http com-usespur-spur 'https://mcp.usespur.com/mcp'
Common questions

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.