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 (14 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
spur_list_workflows ~29

The user's multi-step outreach workflows (email/SMS/mail sequences) with status and enrollment counts.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

spur_manage_billing ~33

Link to the user's Stripe billing portal: update the card on file, download invoices, change or cancel the subscription.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

spur_parse_search_query ~116

Show how Spur interprets a plain-English property search (filters and events) without running it. Free: uses no search credit. Use it to confirm intent before spending a credit, or to turn a vague request into explicit filters you can adjust. The returned arguments can be passed straight to spur_search_properties (keep the same location / status unless the user says otherwise). Exclusions ("no condos", "not foreclosures") are honoured by leaving those filters out.

NameTypeReqDescription
querystringyesThe user's search in their own words

No output schema declared.

No examples provided.

spur_pay_texting_fees ~83

Retry overdue monthly number and registration fees from the Spur wallet right away (normally retried daily). Use after the user adds funds. Restores paused numbers once paid. Charges the wallet: confirm the amount with the user first.

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

No output schema declared.

No examples provided.

spur_preview_letter_campaign ~207

Required step before mailing letters. Renders the letter with the first recipient's real data in its letter type's layout, checks which owners have mailing addresses, estimates the cost from the user's plan (Insert Blank Page letters include the extra address page), and returns a confirmation_token. Show the preview, then ask the user to approve. Only after they approve, call spur_send_letters with the token (the widget's Send button does the same). The token expires in 30 minutes and only covers this exact template, letter type, print options, recipient set and return address.

NameTypeReqDescription
colorboolean–Print in color (false for black and white)
double_sidedboolean–Print on both sides of each sheet
owner_idsarrayyesOwners to mail (spur_find_owners)
return_address_idstring–Defaults to the user's default return address
template_idstringyesLetter template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_preview_letter_template ~61

Show any letter template (yours, a Spur default or a gallery design) rendered with sample data, without changing anything.

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_preview_message_draft ~492

Preview email HTML or SMS text before saving it: renders it with sample or real owner data and runs the design checks. Nothing is saved; iterate here, then save with spur_create_email_template / spur_create_sms_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. 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
channelstringyesWhether the draft is an email or an SMS
fallback_bodystring–SMS only: link-free text sent if links are blocked
htmlstring–Email HTML
owner_idstring–Preview with this owner's real data (spur_find_owners) instead of sample data
subjectstring–Email subject
textstring–SMS text, or the email's plain-text version

No output schema declared.

No examples provided.

spur_preview_message_template ~94

Show a saved email (inbox view, desktop and mobile) or SMS (phone view, segment count) rendered with sample data or a real owner's data, plus design checks. Changes nothing.

NameTypeReqDescription
owner_idstring–Preview with this owner's real data (spur_find_owners) instead of sample data
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_preview_postcard_campaign ~171

Required step before mailing postcards. Renders the postcard with the first recipient's real data, checks which owners have mailing addresses, estimates the cost from the user's plan, and returns a confirmation_token. Show the preview, then ask the user to approve. Only after they approve, call spur_send_postcards with the token (the widget's Send button does the same). The token expires in 30 minutes and only covers this exact template, recipient set, return address and size.

NameTypeReqDescription
owner_idsarrayyesOwners to mail (spur_find_owners)
return_address_idstring–Defaults to the user's default return address
sizestring–Defaults to the template's size
template_idstringyesPostcard template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_preview_postcard_template ~63

Show any postcard template (yours, a Spur default or a gallery design) rendered with sample data, without changing anything.

NameTypeReqDescription
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_release_phone_number ~86

Permanently give up one of the user's bought numbers. They may never get it back, and contacts texting it will no longer reach them. Confirm with the user first.

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

No output schema declared.

No examples provided.

spur_remove_postcard_qr_code ~64

Remove the tracked QR code from one of the user's postcard templates (both sides) and show the preview. A QR slot from the design stays, empty.

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

No output schema declared.

No examples provided.

spur_resend_texting_verification ~41

Sole proprietors only: re-send the carrier's verification text (the user replies YES) when the previous one expired after 24 hours.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

spur_run_search_automation ~70

Run a search automation immediately instead of waiting for its schedule. Uses 1 search credit (2 if the run makes more than 3 ZHomes calls), and enrichment credits if auto_enrich is on.

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

No output schema declared.

No examples provided.

spur_save_image ~127

Download an image from a public https URL (the user's website, a shared photo link) and save it to the user's Spur image library, so it stays available for printing and sending. Returns the saved image's URL. JPG, PNG, WebP, GIF or SVG, up to 20 MB. For a file on the user's device, use spur_upload_image instead. Only save images the user provided or asked for.

NameTypeReqDescription
filenamestring–Name to save it under, e.g. 'acme-logo'
urlstringyesPublic https URL of the image

No output schema declared.

No examples provided.

spur_save_properties ~89

Save live listings into the user's Spur properties (and optionally a property list). Pass listing objects from spur_search_properties structuredContent.cards[].listing. Already-saved listings are refreshed, not duplicated.

NameTypeReqDescription
list_idstring–Also add the saved properties to this property list (spur_list_property_lists)
listingsarrayyesListing objects copied unchanged from spur_search_properties structuredContent.cards[].listing

No output schema declared.

No examples provided.

spur_save_texting_registration ~203

Create or update the user's carrier (A2P 10DLC) registration draft. Pass only the fields to change; nested objects merge. Pick registration_type from two questions: has an EIN? (no → sole_proprietor) and more than ~2,000 texts/day? (yes → standard, else low_volume_standard). Business details must match IRS records exactly. Only record consent methods the user actually uses: carriers reject texting purchased or skip-traced lists without consent. write_campaign_text=true then reads their website and drafts the campaign description, opt-in flow and sample messages (needs message_types and consent_channels). Show that text to the user to review.

NameTypeReqDescription
addressobject––
business_infoobject––
contactobject––
messagingobject––
registration_typestring––
write_campaign_textboolean–true = also draft the campaign text from their website and answers

No output schema declared.

No examples provided.

spur_save_uploaded_image ~54

Used by the upload widget to save the file the user picked. Not for the assistant.

NameTypeReqDescription
data_base64stringyesFile contents, base64-encoded
filenamestringyesOriginal file name

No output schema declared.

No examples provided.

spur_search_phone_numbers ~109

Search local US numbers the user can buy, by area code, state, city or digits. Show the options and let the user pick before spur_buy_phone_number. Prefer an area code in the user's market.

NameTypeReqDescription
area_codestring–e.g. 512
citystring––
containsstring–Digits the number should contain, e.g. 777
limitinteger––
statestring–e.g. TX

No output schema declared.

No examples provided.

spur_search_properties ~1,632

Search live listings (Zillow data) in Spur with plain English and/or structured filters, including event filters. Results show as cards and a map. Uses 1 property-search credit per call from the user's Spur plan, or 2 credits when the search makes more than 3 ZHomes calls (e.g. several event types, tax/sale-history events, or description-based filters). To check how a sentence will be interpreted before spending a credit, call spur_parse_search_query first. Examples: - "3 bed houses under $2,500/mo in Austin owned 10+ years" -> location="Austin, TX", listing_status="forRent", home_type="singleFamily", min_beds=3, max_price=2500, min_ownership_years=10 - "duplexes for sale in 78704 built before 1980 with absentee owners" -> location="78704", listing_status="forSale", home_type="multiFamily", max_year_built=1979, only_absentee=true - "new pre-foreclosures or price drops of 10%+ in Dallas this week" -> location="Dallas, TX", events=["preforeclosure","price_drop"], event_within_days=7, event_min_change_pct=10 - "motivated sellers in Houston: stale, back on market, or fired their agent" -> location="Houston, TX", events=["stale_listing","back_on_market","agent_to_fsbo"] 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 events (price_increase, back_on_market, distress_escalated, agent_to_fsbo, re…

NameTypeReqDescription
center_latnumber–Radius search centre (with center_lng and radius_miles)
center_lngnumber–Radius search centre longitude (with center_lat and radius_miles)
days_postedinteger–Only listings posted within this many days
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
has_3d_tourboolean–true = only listings with a 3D virtual tour
has_air_conditioningboolean–true = only listings with air conditioning
has_garageboolean–true = only listings with a garage
has_open_houseboolean–true = only listings with an upcoming open house
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_single_storyboolean–true = only single-story homes
is_waterfrontboolean–true = only waterfront listings
keywordsstring–Comma-separated listing keywords, e.g. "pool, granite"
limitinteger–Maximum results to show
listing_statusstring–Defaults to forRent when omitted and the query doesn't imply one
listing_typestring–Seller / listing kind; for catching NEW entries into a distress stage prefer events
locationstring–City and state ("Dallas, TX") or ZIP code
max_ageinteger–At most this many years since built
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_pricenumber–Maximum price (monthly rent for rentals), USD
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_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_pricenumber–Minimum price (monthly rent for rentals), USD
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
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)
querystring–Free-text intent; Spur's AI turns it into filters and re-ranks by description
radius_milesnumber–Keep only listings within this many miles of center_lat / center_lng
viewsarray–Only listings with any of these view types
zip_listarray–Keep only these ZIPs; set location to the city that contains them

No output schema declared.

No examples provided.

spur_send_letters ~84

Mail the letters approved in spur_preview_letter_campaign. Irreversible and charges the user's account. Requires the preview's confirmation_token and the user's explicit approval (confirm=true).

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

No output schema declared.

No examples provided.

spur_send_postcards ~87

Mail the postcards approved in spur_preview_postcard_campaign. Irreversible and charges the user's account. Requires the preview's confirmation_token and the user's explicit approval (confirm=true).

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

No output schema declared.

No examples provided.

spur_send_sms ~137

Text an owner from the user's default approved number (or Spur's workspace number if they have none; see spur_get_texting_setup). Show the user the exact message and recipient and get approval before calling with confirm=true. Billed per 160-character segment (70 if it has emoji or special characters), so a 200-character text costs 2.

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

No output schema declared.

No examples provided.

spur_send_test_email ~147

Send an email template, filled with sample data (or one owner's data), to the user's own Spur account email from their email sender, to check it in a real inbox. Never goes to owners. Confirm with the user first.

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
owner_idstring–Preview with this owner's real data (spur_find_owners) instead of sample data
sender_idstring–Email sender to send from; defaults to the user's default sender
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_set_auto_recharge ~175

Turns wallet auto-recharge on or off. When on, Spur charges the saved card amount_usd whenever the balance drops below threshold_usd, so sends never fail for lack of funds. Needs a saved card (the first spur_top_up_wallet payment saves one). Turning it on needs the user's approval of the amount and threshold (confirm=true); turning it off doesn't.

NameTypeReqDescription
amount_usdnumber–Amount added per recharge (required when enabling, minimum $5)
confirmboolean–Required to enable: true ONLY after the user approved automatic charges of this amount at this threshold.
enabledbooleanyestrue = turn auto-recharge on, false = off
threshold_usdnumber–Recharge when the balance drops below this (required when enabling; lower than amount_usd)

No output schema declared.

No examples provided.

spur_set_default_phone_number ~41

Make one of the user's bought numbers the default sender for their texts.

NameTypeReqDescription
number_idstringyesnumber_id from spur_get_texting_setup

No output schema declared.

No examples provided.

spur_set_workflow_active ~108

Activate a workflow (enrolled owners start receiving its emails, texts and mail on schedule, which uses credits) or pause it. Activating requires every send step to have a template and the user's explicit approval.

NameTypeReqDescription
activebooleanyestrue = activate (start sending), false = pause
confirmboolean–Required (true) when activating, only after the user approved it
workflow_idstringyesWorkflow id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_set_workflow_step_template ~121

Set which saved template a workflow's send step uses (send_email ← email template, send_sms ← SMS template, send_direct_mail ← postcard/letter template). Get step_ids from spur_get_workflow. If the workflow is active, enrolled owners get the new template from their next send.

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

No output schema declared.

No examples provided.

spur_show_billing_options ~70

Shows the user's wallet balance, one-click top-up amounts, auto-recharge status and every Spur plan with prices, in a widget with Pay/Upgrade buttons. Use whenever the user wants to add funds, buy credits, upgrade, change or compare plans, or a send failed for billing reasons.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

spur_submit_texting_registration ~231

Send the user's registration to the carriers (also resubmits a rejected one after fixes). Charges the Spur wallet: $29 one-time for low volume / sole proprietor or $79 for standard (includes the first month, then $3 or $15/mo), or $15 to resubmit after a carrier rejection; spur_get_texting_setup shows the exact amount due now. Tell the user the amount. Walk the user through the full details first, and only call after they explicitly approve and personally confirm both statements: they only text people who agreed to receive their messages and honor STOP, and they won't send prohibited content (cannabis, firearms, high-risk loans or debt collection, gambling, sexual content, hate speech).

NameTypeReqDescription
confirmbooleanyesSet to true ONLY after the user explicitly approved this exact action in the conversation. Never assume approval.
user_confirms_consentbooleanyesThe user confirmed they only text people who agreed to receive their messages and honor STOP requests
user_confirms_no_prohibited_contentbooleanyesThe user confirmed they won't send prohibited content

No output schema declared.

No examples provided.

spur_top_up_wallet ~103

Creates a Stripe checkout link to add funds to the user's Spur wallet (pays for postcards, letters, SMS, enrichment and other usage beyond the plan). No money moves until the user pays on Stripe, so no confirmation is needed. If the user didn't name an amount, suggest $25, $50 or $100, or enough to cover the send they're planning.

NameTypeReqDescription
amount_usdnumberyesAmount to add in US dollars (minimum $5)

No output schema declared.

No examples provided.

spur_update_email_template ~499

Edit one of the user's email templates and show the updated inbox preview. For tweaks pass replacements (exact find → replace in "html", "subject" or "text"); to redesign pass full html. When the HTML changes, the plain-text version is regenerated unless it was hand-written or you pass text_body. Workflows using this template send the new version from their next step. Example: replacements=[{target:"html", find:"<p style=\"margin:0 0 16px;\"></p>", replace:"<p style=\"margin:0 0 16px;\">I'd like to make a cash offer on {{property_address}}.</p>"}] 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
descriptionstring–Internal note about the template; never sent to owners
htmlstring–Full replacement HTML
is_defaultboolean–true = make this the user's default template for its channel
namestring–New template name
replacementsarray–Small edits applied in order instead of resending the full content
subjectstring–New subject line
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)
text_bodystring–Full replacement plain-text version

No output schema declared.

No examples provided.

spur_update_letter_template ~479

Edit one of the user's letter templates and show the updated preview. For text tweaks pass replacements (exact find → replace); to redesign, pass full html. letter_type switches between top_first_page and insert_blank_page. Spur default and gallery templates can't be edited: copy them first with spur_create_letter_template base_template_id. 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
categorystring–Category label, e.g. "Seller Outreach"
descriptionstring–Internal note about the template; never printed
htmlstring–Full replacement HTML
letter_typestring–"top_first_page": the address prints in the top 3.15in of page 1 (shows through a #10 window envelope), so keep that band empty. "insert_blank_page": Spur adds a separate address page in front, so th…
namestring–New template name
replacementsarray–Small edits applied in order instead of resending the full content
template_idstringyesTemplate id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_update_postcard_template ~709

Edit one of the user's postcard templates and show the updated preview. For text tweaks pass replacements (exact find → replace on a side); to redesign, pass full front_html/back_html. Spur default and gallery templates can't be edited: copy them first with spur_create_postcard_template base_template_id. Example: change the headline -> replacements=[{side:"front", find:"Just Sold!", replace:"Just Listed!"}] 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 whe…

NameTypeReqDescription
back_htmlstring–Full replacement back HTML
categorystring–Category label, e.g. "Just Sold" or "Market Update"
descriptionstring–Internal note about the template; never printed
front_htmlstring–Full replacement front HTML
namestring–New template name
replacementsarray–Small edits applied in order instead of resending the full content
sizestring–Postcard size: "6x4" (standard 4×6), "6x9" or "6x11"
template_idstringyesTemplate id (UUID from a Spur list/search tool)

No output schema declared.

No examples provided.

spur_update_qr_code ~168

Rename a QR code, change where scans go, or change its colors. A new destination also applies to postcards already mailed with this code. Templates pick up new colors at send time.

NameTypeReqDescription
background_colorstring–Hex color, e.g. #111827. Keep strong contrast with the background so phones can scan it
destination_urlstring–Where 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
namestring–New name for the QR code
qr_code_idstringyesQR code id from spur_list_qr_codes

No output schema declared.

No examples provided.

spur_update_sms_template ~281

Edit one of the user's SMS templates and show the updated preview. Pass full text / fallback_body, or replacements (exact find → replace in "text" or "fallback"). Pass fallback_body="" to remove the fallback. 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 text sent instead when links are blocked; "" removes it
is_defaultboolean–true = make this the user's default template for its channel
namestring–New template name
replacementsarray–Small edits applied in order instead of resending the full content
template_idstringyesEmail or SMS template id (UUID from a Spur list/search tool)
textstring–Full replacement SMS body

No output schema declared.

No examples provided.

spur_upload_image ~125

Show an upload box where the user picks or drops an image from their device (logo, headshot, property photo); it's saved to their Spur image library. Use this whenever the user wants to use their own image, including one they attached to the chat: attachments don't reach Spur, so ask them to drop it into the box. After uploading, the user can click "Use this image", or call spur_list_images to get the URL.

NameTypeReqDescription
purposestring–What the image is for, shown to the user, e.g. 'Logo for the postcard back'

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.