Spur
REMOTE · MCP.USESPUR.COM
Real estate leads, skip tracing, direct mail, SMS & email outreach, and marketing automations
Available components
Last scanned (14 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 →
spur_list_workflows List outreach 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 Billing portal ~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 Preview search filters ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | The user's search in their own words |
No output schema declared.
No examples provided.
spur_pay_texting_fees Pay overdue 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.
| 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. |
No output schema declared.
No examples provided.
spur_preview_letter_campaign Preview letter mailing ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| color | boolean | – | Print in color (false for black and white) |
| double_sided | boolean | – | Print on both sides of each sheet |
| owner_ids | array | yes | Owners to mail (spur_find_owners) |
| return_address_id | string | – | Defaults to the user's default return address |
| template_id | string | yes | Letter template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_preview_letter_template Preview letter template ~61
Show any letter template (yours, a Spur default or a gallery design) rendered with sample data, without changing anything.
| 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_preview_message_draft Preview unsaved email or SMS ~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).
| Name | Type | Req | Description |
|---|---|---|---|
| channel | string | yes | Whether the draft is an email or an SMS |
| fallback_body | string | – | SMS only: link-free text sent if links are blocked |
| html | string | – | Email HTML |
| owner_id | string | – | Preview with this owner's real data (spur_find_owners) instead of sample data |
| subject | string | – | Email subject |
| text | string | – | SMS text, or the email's plain-text version |
No output schema declared.
No examples provided.
spur_preview_message_template Preview email or SMS 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.
| Name | Type | Req | Description |
|---|---|---|---|
| owner_id | string | – | Preview with this owner's real data (spur_find_owners) instead of sample data |
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_preview_postcard_campaign Preview postcard mailing ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| owner_ids | array | yes | Owners to mail (spur_find_owners) |
| return_address_id | string | – | Defaults to the user's default return address |
| size | string | – | Defaults to the template's size |
| template_id | string | yes | Postcard template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_preview_postcard_template Preview postcard template ~63
Show any postcard template (yours, a Spur default or a gallery design) rendered with sample data, without changing anything.
| Name | Type | Req | Description |
|---|---|---|---|
| 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_release_phone_number 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.
| 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. |
| number_id | string | yes | number_id from spur_get_texting_setup |
No output schema declared.
No examples provided.
spur_remove_postcard_qr_code Remove QR code from postcard ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| template_id | string | yes | Postcard template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_resend_texting_verification Resend verification text ~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 Run search automation now ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| automation_id | string | yes | Automation id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_save_image Save image from URL ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| filename | string | – | Name to save it under, e.g. 'acme-logo' |
| url | string | yes | Public https URL of the image |
No output schema declared.
No examples provided.
spur_save_properties 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.
| Name | Type | Req | Description |
|---|---|---|---|
| list_id | string | – | Also add the saved properties to this property list (spur_list_property_lists) |
| listings | array | yes | Listing objects copied unchanged from spur_search_properties structuredContent.cards[].listing |
No output schema declared.
No examples provided.
spur_save_texting_registration 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.
| Name | Type | Req | Description |
|---|---|---|---|
| address | object | – | – |
| business_info | object | – | – |
| contact | object | – | – |
| messaging | object | – | – |
| registration_type | string | – | – |
| write_campaign_text | boolean | – | true = also draft the campaign text from their website and answers |
No output schema declared.
No examples provided.
spur_save_uploaded_image Save uploaded image ~54
Used by the upload widget to save the file the user picked. Not for the assistant.
| Name | Type | Req | Description |
|---|---|---|---|
| data_base64 | string | yes | File contents, base64-encoded |
| filename | string | yes | Original file name |
No output schema declared.
No examples provided.
spur_search_phone_numbers Find 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.
| Name | Type | Req | Description |
|---|---|---|---|
| area_code | string | – | e.g. 512 |
| city | string | – | – |
| contains | string | – | Digits the number should contain, e.g. 777 |
| limit | integer | – | – |
| state | string | – | e.g. TX |
No output schema declared.
No examples provided.
spur_search_properties 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…
| Name | Type | Req | Description |
|---|---|---|---|
| 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) |
| days_posted | integer | – | Only listings posted within this many days |
| 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 |
| has_3d_tour | boolean | – | true = only listings with a 3D virtual tour |
| has_air_conditioning | boolean | – | true = only listings with air conditioning |
| has_garage | boolean | – | true = only listings with a garage |
| has_open_house | boolean | – | true = only listings with an upcoming open house |
| 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_single_story | boolean | – | true = only single-story homes |
| is_waterfront | boolean | – | true = only waterfront listings |
| keywords | string | – | Comma-separated listing keywords, e.g. "pool, granite" |
| limit | integer | – | Maximum results to show |
| listing_status | string | – | Defaults to forRent when omitted and the query doesn't imply one |
| listing_type | string | – | Seller / listing kind; for catching NEW entries into a distress stage prefer events |
| location | string | – | City and state ("Dallas, TX") or ZIP code |
| max_age | integer | – | At most this many years since built |
| 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_price | number | – | Maximum price (monthly rent for rentals), USD |
| 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_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_price | number | – | Minimum price (monthly rent for rentals), USD |
| 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 |
| 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) |
| query | string | – | Free-text intent; Spur's AI turns it into filters and re-ranks by description |
| radius_miles | number | – | Keep only listings within this many miles of center_lat / center_lng |
| views | array | – | Only listings with any of these view types |
| zip_list | array | – | Keep only these ZIPs; set location to the city that contains them |
No output schema declared.
No examples provided.
spur_send_letters 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).
| 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. |
| confirmation_token | string | yes | confirmation_token from spur_preview_letter_campaign |
No output schema declared.
No examples provided.
spur_send_postcards 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).
| 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. |
| confirmation_token | string | yes | confirmation_token from spur_preview_postcard_campaign |
No output schema declared.
No examples provided.
spur_send_sms 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.
| 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. |
| message | string | yes | Exact SMS text the user approved |
| owner_id | string | yes | Owner id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_send_test_email Send test email to yourself ~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.
| 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_id | string | – | Preview with this owner's real data (spur_find_owners) instead of sample data |
| sender_id | string | – | Email sender to send from; defaults to the user's default sender |
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_set_auto_recharge 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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount_usd | number | – | Amount added per recharge (required when enabling, minimum $5) |
| confirm | boolean | – | Required to enable: true ONLY after the user approved automatic charges of this amount at this threshold. |
| enabled | boolean | yes | true = turn auto-recharge on, false = off |
| threshold_usd | number | – | 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 Set default number ~41
Make one of the user's bought numbers the default sender for their texts.
| Name | Type | Req | Description |
|---|---|---|---|
| number_id | string | yes | number_id from spur_get_texting_setup |
No output schema declared.
No examples provided.
spur_set_workflow_active Activate or pause workflow ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| active | boolean | yes | true = activate (start sending), false = pause |
| confirm | boolean | – | Required (true) when activating, only after the user approved it |
| workflow_id | string | yes | Workflow id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_set_workflow_step_template Use template in workflow step ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| step_id | string | yes | step_id from spur_get_workflow |
| template_id | string | yes | Template id (UUID from a Spur list/search tool) |
| workflow_id | string | yes | Workflow id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_show_billing_options Top up or upgrade ~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 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).
| 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. |
| user_confirms_consent | boolean | yes | The user confirmed they only text people who agreed to receive their messages and honor STOP requests |
| user_confirms_no_prohibited_content | boolean | yes | The user confirmed they won't send prohibited content |
No output schema declared.
No examples provided.
spur_top_up_wallet 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.
| Name | Type | Req | Description |
|---|---|---|---|
| amount_usd | number | yes | Amount to add in US dollars (minimum $5) |
No output schema declared.
No examples provided.
spur_update_email_template Edit 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.
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Internal note about the template; never sent to owners |
| html | string | – | Full replacement HTML |
| is_default | boolean | – | true = make this the user's default template for its channel |
| name | string | – | New template name |
| replacements | array | – | Small edits applied in order instead of resending the full content |
| subject | string | – | New subject line |
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
| text_body | string | – | Full replacement plain-text version |
No output schema declared.
No examples provided.
spur_update_letter_template Edit 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).
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | Category label, e.g. "Seller Outreach" |
| description | string | – | Internal note about the template; never printed |
| html | string | – | Full replacement HTML |
| letter_type | string | – | "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… |
| name | string | – | New template name |
| replacements | array | – | Small edits applied in order instead of resending the full content |
| template_id | string | yes | Template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_update_postcard_template Edit 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…
| Name | Type | Req | Description |
|---|---|---|---|
| back_html | string | – | Full replacement back HTML |
| category | string | – | Category label, e.g. "Just Sold" or "Market Update" |
| description | string | – | Internal note about the template; never printed |
| front_html | string | – | Full replacement front HTML |
| name | string | – | New template name |
| replacements | array | – | Small edits applied in order instead of resending the full content |
| size | string | – | Postcard size: "6x4" (standard 4×6), "6x9" or "6x11" |
| template_id | string | yes | Template id (UUID from a Spur list/search tool) |
No output schema declared.
No examples provided.
spur_update_qr_code Edit 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.
| 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 | – | 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 | – | New name for the QR code |
| qr_code_id | string | yes | QR code id from spur_list_qr_codes |
No output schema declared.
No examples provided.
spur_update_sms_template Edit 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).
| Name | Type | Req | Description |
|---|---|---|---|
| description | string | – | Internal note about the template; never sent to owners |
| fallback_body | string | – | Link-free text sent instead when links are blocked; "" removes it |
| is_default | boolean | – | true = make this the user's default template for its channel |
| name | string | – | New template name |
| replacements | array | – | Small edits applied in order instead of resending the full content |
| template_id | string | yes | Email or SMS template id (UUID from a Spur list/search tool) |
| text | string | – | Full replacement SMS body |
No output schema declared.
No examples provided.
spur_upload_image 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.
| Name | Type | Req | Description |
|---|---|---|---|
| purpose | string | – | What the image is for, shown to the user, e.g. 'Logo for the postcard back' |
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.