# SPACEXPLORATION (remote · spacexploration.com)

Search commercial real estate listings. Reads need no token; authoring is self-serve OAuth (DCR).

- Trust score: 68/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `spacexploration.com`: 68/100 (this document), [markdown](https://verifymcp.io/servers/com-spacexploration-listings/spacexploration.md), [page](https://verifymcp.io/servers/com-spacexploration-listings/spacexploration)

## Channel facts

- Endpoint: `https://spacexploration.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_saved_search).
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 81/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2855 tokens (~135/item across 21 items; 20 tools + 1 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-spacexploration-listings https://spacexploration.com/mcp
```

### Codex

```toml
[mcp_servers.com-spacexploration-listings]
url = "https://spacexploration.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-spacexploration-listings": {
      "type": "remote",
      "url": "https://spacexploration.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-spacexploration-listings --url https://spacexploration.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-spacexploration-listings:
    url: "https://spacexploration.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-spacexploration-listings": {
      "type": "http",
      "url": "https://spacexploration.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 68, +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.

### 2026-07-31 (score 67, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 66, +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.

### 2026-07-27 (score 65, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 65)

First indexed and scored.

## MCP tools (20)

### `get_registry` (~47 tokens)

Get Registry Tool

Returns the full attribute registry — every searchable and filterable field, its type, allowed values, and display label. Read this first to understand the schema before calling search_listings with attribute filters.

### `search_listings` (~230 tokens)

Search Listings Tool

Search commercial real estate listings. Returns paginated hits with facet counts. For AI-driven search, call interpret_search first to convert a natural-language query into structured filters, then pass those filters — and its bounds, when present — here.

Input parameters:

- `bounds` (object|null): Geographic bounding box (degrees) limiting hits to an area. Forward the bounds returned by interpret_search verbatim to honour "near <place>" intent; omit for a nationwide search.
- `filters` (object|null): Structured filter map keyed by Typesense field name. Ranges as {min?, max?}, multi-select as string[], booleans as true/false. Call get_registry to see valid field names and allowed values.
- `page` (integer|null): Page number (1-based). Defaults to 1.
- `query` (string|null): Free-text search query (street address, city, or keyword). Omit or pass null for no text filter.
- `sort` (string|null): Sort key. Valid values from get_registry sort_options (e.g. "listed_at:desc", "price:asc").

### `get_listing` (~86 tokens)

Get Listing Tool

Retrieve the full details of a single listing by its hashid. Returns the complete ListingResource projection including parcel data, all attribute details, and attachments. Broker contact is included only when the requesting user is authorised.

Input parameters:

- `hashid` (string, required): The short hashid of the listing (e.g. "a1b2c3d4"). Found in listing URLs and search hits.

### `interpret_search` (~102 tokens)

Interpret Search Tool

Translate a natural-language property-search sentence into a structured filter payload compatible with search_listings. Use this as a transparent intermediate step: pass the user's raw query here, then forward the returned filters — and the returned bounds, when present (they carry the "near <place>" intent) — to search_listings.

Input parameters:

- `prompt` (string, required): A natural-language property search sentence from the end user. Example: "industrial with rail access in Denver under $5m".

### `save_search` (~98 tokens)

Save Search Tool

Save the current search as a named alert. The user will receive email digests when new matching listings appear. Requires authentication.

Input parameters:

- `filters` (object|null): The structured filter map to persist (same shape as search_listings filters).
- `name` (string|null): A human-readable name for the saved search. If omitted, a name is derived from the filters.
- `query` (string|null): The free-text query string, if any.

### `list_my_saved_searches` (~28 tokens)

List My Saved Searches Tool

List the authenticated user's saved searches, including their filters and alert schedule. Requires authentication.

### `delete_saved_search` (~52 tokens)

Delete Saved Search Tool

Delete a saved search by its ID. Only the owner may delete their own searches. Requires authentication.

Input parameters:

- `id` (integer, required): The numeric ID of the saved search to delete (from list_my_saved_searches).

### `list_my_listings` (~68 tokens)

List My Listings Tool

List all listings owned or brokered by the authenticated user. Optionally filter by status. Requires authentication.

Input parameters:

- `status` (string|null): Filter by listing status. One of: draft, pending_payment, active, suspended, sold, leased, withdrawn. Omit to return all statuses.

### `geocode_address` (~98 tokens)

Geocode Address Tool

Geocode a free-form US address into coordinates and structured components (street_address, city, county, state, postal_code) plus a formatted address and place_id — exactly the identity fields create_listing requires. Use this first, then pass the result straight into create_listing instead of supplying your own coordinates.

Input parameters:

- `address` (string, required): Free-form address to geocode, e.g. "3763 Imperial St, Frederick, CO 80516".

### `create_listing` (~285 tokens)

Create Listing Tool

Create a new draft listing. Returns the full created listing exactly as stored, including its hashid and status. Pass an idempotency_key (any client-generated string, e.g. a UUID) to make the call safe to retry — re-sending the same key returns the original listing instead of creating a duplicate.

Input parameters:

- `city` (string, required): City.
- `county` (string, required): County.
- `formatted_address` (string|null): Full formatted address string from geocoder.
- `idempotency_key` (string|null): Optional client-generated key (e.g. a UUID) making this create safe to retry: re-sending the same key within 24 hours returns the originally created listing instead of a duplicate.
- `latitude` (number, required): Latitude coordinate.
- `listing_type` (string, required): Listing type: sale or lease.
- `longitude` (number, required): Longitude coordinate.
- `place_id` (string|null): Place ID from geocoder.
- `postal_code` (string, required): ZIP/postal code.
- `property_type` (string, required): Property type. Allowed values are listed under the property_type attribute returned by get_registry (e.g. industrial, office, retail, land).
- `state` (string, required): State (2-letter abbreviation).
- `street_address` (string, required): Street address of the property.
- `unit` (string|null): Unit or suite number, if applicable.

### `update_listing` (~230 tokens)

Update Listing Tool

Update a listing's parcel, pricing, or marketing data. Pass at least one group (parcel, pricing, marketing); send each group whole, not just the changed field. Returns the full updated listing exactly as stored.

Input parameters:

- `hashid` (string, required): Hashid of the listing to update.
- `marketing` (object|null): Marketing copy to update: headline, summary, title_override, highlights (string[]).
- `parcel` (object|null): Parcel/address fields to update: street_address, city, county, state, postal_code, latitude, longitude, and optionally unit, lot_acres, year_built, property_type.
- `pricing` (object|null): Pricing fields to update: listing_type (sale|lease); for a sale set sale_price (dollars), for a lease set lease_rate (per the lease_rate_period basis, default per_sqft_year) and optionally lease_rate…

### `set_listing_attributes` (~217 tokens)

Set Listing Attributes Tool

Set broker-authored attributes on a listing you own. Pass `attributes` as a map of registry field name to value (the field names get_registry returns, e.g. {"attr_parking_spaces": 40, "attr_office_class": "Class A"}). Only fields get_registry marks "writable":true can be set; publish-time computed fields and hot columns (use update_listing for those) are rejected with guidance. Enum fields take the allowed value (or an array for multiselect); send null to clear a field. Returns the full updated listing.

Input parameters:

- `attributes` (object, required): Map of registry field name to value, e.g. {"attr_parking_spaces": 40, "attr_office_class": "Class A", "attr_industrial_rail_access": true}. Only fields get_registry marks "writable":true are accepted…
- `hashid` (string, required): Hashid of the listing to update.

### `attach_listing_photo` (~195 tokens)

Attach Listing Photo Tool

Attach a photo to a listing you own directly from its public URL — one call, no separate sign/upload/confirm. The server fetches the image and ingests it with auto-generated thumbnail/hero/full variants. Only https image URLs whose host is publicly routable are accepted. The photo is content-moderated (must be real-estate related and safe) before it can appear publicly — the returned snapshot includes the moderation_status (approved / rejected / escalated) and moderation_reason. A rejected or escalated photo will not be publicly visible and will block publishing until removed or replaced.

Input parameters:

- `hashid` (string, required): Hashid of the listing to attach the photo to.
- `source_url` (string, required): Public https URL of the image to fetch and attach. Must point directly at an image (jpeg, png, webp, gif, avif, heic/heif) on a publicly-routable host.

### `sign_attachment_upload` (~317 tokens)

Sign Attachment Upload Tool

Begin an out-of-band file upload. Returns a presigned R2 PUT URL and the headers to use; the file bytes are uploaded directly to storage, never through this channel. After PUTting the file, call confirm_attachment_upload with the returned attachment_id. Supports listings (photos, documents), users (avatar), and pages (cover, photos).

Input parameters:

- `attachable_id` (string, required): Identifier of the attachable resource. For "listing" pass the listing hashid (e.g. "d5yqqgoa") — the same id every read tool returns. For "user" pass "me" to attach to yourself. For "page" pass its n…
- `attachable_type` (string, required): Morph alias of the resource to attach to: "listing", "user", or "page".
- `collection` (string|null): Optional explicit collection: "photos", "documents", "avatar", "logo", or "cover". Omit to auto-route by MIME (images→photos, docs→documents). Singleton slots (avatar/cover/logo) must be set explicit…
- `content_type` (string, required): MIME type of the file, e.g. "image/jpeg" or "application/pdf". Must match the collection whitelist.
- `filename` (string, required): Original filename including extension, e.g. "front-elevation.jpg". Used to derive the storage key and extension.
- `size` (integer, required): Exact byte size of the file. Verified against the uploaded object at confirm time, so it must be accurate.

### `confirm_attachment_upload` (~111 tokens)

Confirm Attachment Upload Tool

Finalize an out-of-band upload after the file bytes have been PUT to the presigned URL. Verifies the stored object matches what was signed (size and content-type) and marks the attachment ready. Returns the attachment snapshot with its public variant URLs. Idempotent: confirming an already-confirmed upload returns the same snapshot.

Input parameters:

- `attachment_id` (string, required): The attachment_id (ULID) returned by sign_attachment_upload. Confirm only after the file bytes have been successfully PUT to the presigned URL.

### `delete_attachment` (~104 tokens)

Delete Attachment Tool

Delete an attachment you own by its ULID. Soft-deletes the row so it no longer appears on the listing. Use this to clean up an abandoned upload (one you signed but never finished) or a photo you no longer want. Idempotent: deleting an already-deleted attachment succeeds.

Input parameters:

- `attachment_id` (string, required): The attachment_id (ULID) of the attachment to delete, as returned by sign_attachment_upload / confirm_attachment_upload or listed in get_listing.

### `publish_listing` (~82 tokens)

Publish Listing Tool

Kick off the publish pipeline for a draft listing. Enriches with AI, gathers market data, then transitions the listing to Active. Returns the pipeline ID to track progress. Fails with the unmet readiness checklist if the listing is not ready (including any photo that has not cleared content moderation).

Input parameters:

- `hashid` (string, required): Hashid of the listing to publish.

### `get_publish_status` (~121 tokens)

Get Publish Status Tool

Get the status of your listing publishes. Pass a listing hashid for the detailed status of that listing's latest publish run — overall state (pending/running/completed/failed), current phase, per-step progress, and any failure reason. Omit the hashid to list your recent publish runs across all your listings. Use this to track a publish_listing call to completion.

Input parameters:

- `hashid` (string|null): Optional. Hashid of a listing to get its latest publish run in detail. Omit to list your recent publish runs across all your listings.

### `withdraw_listing` (~53 tokens)

Withdraw Listing Tool

Withdraw a listing, removing it from public search. This is a terminal status — the listing cannot be re-activated; create a new listing instead.

Input parameters:

- `hashid` (string, required): Hashid of the listing to withdraw.

### `send_feedback` (~140 tokens)

Send Feedback Tool

File feedback or a support ticket with the SPACEXPLORATION team: a bug report, feature request, question, or anything you would improve about the app or the MCP experience. Works anonymously — include a contact email if you want a reply.

Input parameters:

- `category` (string): What kind of feedback this is. Defaults to "other".
- `email` (string|null): Optional contact email if you or your human want a reply. Authenticated callers default to their account email.
- `message` (string, required): The feedback itself — what happened, or what you would improve about the app or the MCP experience. Plain text, max 5000 characters.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-spacexploration-listings/spacexploration#diagnostics

## Score history

- 2026-08-03: 68
- 2026-08-02: 67
- 2026-08-01: 67
- 2026-07-31: 67
- 2026-07-30: 67
- 2026-07-29: 67
- 2026-07-28: 66
- 2026-07-27: 65
- 2026-07-26: 65

## Links

- Remote endpoint: https://spacexploration.com/mcp
- Website: https://spacexploration.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-spacexploration-listings/spacexploration/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-spacexploration-listings/spacexploration/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-spacexploration-listings/spacexploration
