# Moonshot Lab (demo) (remote · moonshotlab1.com)

Agent car inventory index. Synthetic demo data, not real inventory, not an offer.

- Trust score: 64/100 (medium)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-25

## Components

- remote · `moonshotlab1.com`: 64/100 (this document), [markdown](https://verifymcp.io/servers/com-moonshotlab1-inventory/moonshotlab1.md), [page](https://verifymcp.io/servers/com-moonshotlab1-inventory/moonshotlab1)

## Channel facts

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

## 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-10-25.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 17 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - 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**: 56/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7399 tokens (~435/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 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.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 17 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Moonshot Lab (demo) MCP server?

Moonshot Lab (demo) is a hosted endpoint at https://moonshotlab1.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.

### Claude

```bash
claude mcp add --transport http com-moonshotlab1-inventory 'https://moonshotlab1.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-moonshotlab1-inventory": {
      "url": "https://moonshotlab1.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-moonshotlab1-inventory": {
      "type": "http",
      "url": "https://moonshotlab1.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-moonshotlab1-inventory]
url = "https://moonshotlab1.com/mcp"
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add com-moonshotlab1-inventory --url 'https://moonshotlab1.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-moonshotlab1-inventory:
    url: "https://moonshotlab1.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-moonshotlab1-inventory": {
      "Transport": "http",
      "Url": "https://moonshotlab1.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-moonshotlab1-inventory -t streamable-http -u 'https://moonshotlab1.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-moonshotlab1-inventory": {
      "type": "http",
      "url": "https://moonshotlab1.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-10-24 (score 64, +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.

### 2026-10-23 (score 63, 0)

- [security] Tool “prepare_dealer_handoff” rewrote its description, which is the text the model reads
- [cosmetic] “prepare_dealer_handoff” added an optional parameter “add_on_interest”
- [cosmetic] “prepare_dealer_handoff” added an optional parameter “buyer_address”
- [cosmetic] “prepare_dealer_handoff” added an optional parameter “financing_details”
- [cosmetic] “prepare_dealer_handoff” added an optional parameter “trade_details”
- [cosmetic] “prepare_dealer_handoff” reworded the description of “shopper_contact”

### 2026-10-22 (score 63, +1)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “compare_payment_scenarios” rewrote its description, which is the text the model reads
- [security] Tool “get_payment_estimate” rewrote its description, which is the text the model reads
- [security] Tool “get_price_breakdown” rewrote its description, which is the text the model reads
- [security] Tool “list_dealers” rewrote its description, which is the text the model reads
- [security] Tool “search_inventory” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 368 → 410
- [functional] Schema quality: good → excellent
- [functional] New tool “cancel_search”
- [functional] New tool “get_new_matches”
- [functional] New tool “prepare_dealer_handoff”
- [functional] New tool “register_agent”
- [functional] New tool “save_search”
- [cosmetic] “search_inventory” added an optional parameter “best_value_needs”
- [cosmetic] “search_inventory” added an optional parameter “dealer_segment”
- [cosmetic] “search_inventory” added an optional parameter “financeable_only”
- [cosmetic] “search_inventory” added an optional parameter “group_id”
- [cosmetic] “search_inventory” added an optional parameter “max_out_the_door”
- [cosmetic] “search_inventory” added an optional parameter “min_out_the_door”
- [cosmetic] “search_inventory” added an optional parameter “region_id”
- [cosmetic] “search_inventory” added an optional parameter “seating_min”
- [cosmetic] “search_inventory” added an optional parameter “sliding_doors”
- [cosmetic] “search_inventory” added an optional parameter “store_id”
- [cosmetic] “search_inventory” added an optional parameter “third_row”
- [cosmetic] “search_inventory” added an optional parameter “third_row_type”
- [cosmetic] “compare_payment_scenarios” reworded the description of “buyer_zip”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_state”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_zip”
- [cosmetic] “get_payment_estimate” reworded the description of “buyer_zip”
- [cosmetic] “search_inventory” reworded the description of “buyer_zip”
- [cosmetic] “search_inventory” reworded the description of “max_monthly_payment”
- [cosmetic] “search_inventory” reworded the description of “payment_max”
- [cosmetic] “search_inventory” reworded the description of “sort”

### 2026-10-21 (score 62, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “get_payment_estimate” rewrote its description, which is the text the model reads
- [security] Tool “search_inventory” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 313 → 368
- [functional] New tool “compare_payment_scenarios”
- [cosmetic] “search_inventory” added an optional parameter “eligible_incentive_labels”
- [cosmetic] “search_inventory” added an optional parameter “include_near_misses”
- [cosmetic] “search_inventory” added an optional parameter “max_monthly_payment”
- [cosmetic] “search_inventory” added an optional parameter “scenarios”
- [cosmetic] “search_inventory” reworded the description of “buyer_zip”
- [cosmetic] “search_inventory” reworded the description of “credit_tier”

### 2026-10-20 (score 62, +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-10-19 (score 61, +3)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “estimate_out_the_door” rewrote its description, which is the text the model reads
- [security] Tool “get_dealer” rewrote its description, which is the text the model reads
- [security] Tool “get_listing” rewrote its description, which is the text the model reads
- [security] Tool “get_media” rewrote its description, which is the text the model reads
- [security] Tool “get_ontology” rewrote its description, which is the text the model reads
- [security] Tool “get_price_breakdown” rewrote its description, which is the text the model reads
- [security] Tool “get_trade_in_scenarios” rewrote its description, which is the text the model reads
- [security] Tool “search_inventory” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: pass → fail
- [functional improvement] Tool coverage: 0% → 100%
- [functional improvement] Stability: unverified → 0.03
- [functional] Schema quality: fair → good
- [functional] New tool “get_payment_estimate”
- [functional] New tool “list_searchable_fields”
- [cosmetic] “search_inventory” added an optional parameter “apr”
- [cosmetic] “search_inventory” added an optional parameter “buyer_city”
- [cosmetic] “search_inventory” added an optional parameter “buyer_county”
- [cosmetic] “search_inventory” added an optional parameter “buyer_state”
- [cosmetic] “search_inventory” added an optional parameter “buyer_zip”
- [cosmetic] “search_inventory” added an optional parameter “credit_tier”
- [cosmetic] “search_inventory” added an optional parameter “down_payment”
- [cosmetic] “search_inventory” added an optional parameter “exterior_color”
- [cosmetic] “search_inventory” added an optional parameter “filters”
- [cosmetic] “search_inventory” added an optional parameter “include_payment”
- [cosmetic] “search_inventory” added an optional parameter “payment_max”
- [cosmetic] “search_inventory” added an optional parameter “payment_min”
- [cosmetic] “search_inventory” added an optional parameter “payoff”
- [cosmetic] “search_inventory” added an optional parameter “term_months”
- [cosmetic] “search_inventory” added an optional parameter “trade_equity”
- [cosmetic] “search_inventory” added an optional parameter “trade_value”
- [cosmetic] “get_media” reworded the description of “listing_id”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_city”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_county”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_state”
- [cosmetic] “estimate_out_the_door” reworded the description of “buyer_zip”
- [cosmetic] “estimate_out_the_door” reworded the description of “eligible_incentive_labels”
- [cosmetic] “estimate_out_the_door” reworded the description of “financed”
- [cosmetic] “estimate_out_the_door” reworded the description of “lender_name”
- [cosmetic] “estimate_out_the_door” reworded the description of “listing_id”
- [cosmetic] “estimate_out_the_door” reworded the description of “payoff”
- [cosmetic] “estimate_out_the_door” reworded the description of “plate_transfer”
- [cosmetic] “estimate_out_the_door” reworded the description of “registration_state”
- [cosmetic] “estimate_out_the_door” reworded the description of “trade_value”
- [cosmetic] “estimate_out_the_door” reworded the description of “vehicle_weight_lbs”
- [cosmetic] “get_dealer” reworded the description of “dealer_key”
- [cosmetic] “get_dealer” reworded the description of “inventory_limit”
- [cosmetic] “get_dealer” reworded the description of “inventory_offset”
- [cosmetic] “get_listing” reworded the description of “listing_id”
- [cosmetic] “get_media” reworded the description of “limit”
- [cosmetic] “get_media” reworded the description of “types”
- [cosmetic] “get_price_breakdown” reworded the description of “listing_id”
- [cosmetic] “search_inventory” reworded the description of “body_style”
- [cosmetic] “search_inventory” reworded the description of “city”
- [cosmetic] “search_inventory” reworded the description of “condition”
- [cosmetic] “search_inventory” reworded the description of “dealer_key”
- [cosmetic] “search_inventory” reworded the description of “drivetrain”
- [cosmetic] “search_inventory” reworded the description of “fuel_type”
- [cosmetic] “search_inventory” reworded the description of “limit”
- [cosmetic] “search_inventory” reworded the description of “make”
- [cosmetic] “search_inventory” reworded the description of “max_mileage”
- [cosmetic] “search_inventory” reworded the description of “model”
- [cosmetic] “search_inventory” reworded the description of “offset”
- [cosmetic] “search_inventory” reworded the description of “price_max”
- [cosmetic] “search_inventory” reworded the description of “price_min”
- [cosmetic] “search_inventory” reworded the description of “radius_miles”
- [cosmetic] “search_inventory” reworded the description of “sort”
- [cosmetic] “search_inventory” reworded the description of “state”
- [cosmetic] “search_inventory” reworded the description of “trim”
- [cosmetic] “search_inventory” reworded the description of “year_max”
- [cosmetic] “search_inventory” reworded the description of “year_min”
- [cosmetic] “search_inventory” reworded the description of “zip”

### 2026-10-18 (score 58)

First indexed and scored.

## MCP tools (17)

### `search_inventory` (~2291 tokens)

Search the SYNTHETIC demo inventory (about 860 fictional vehicles at 20 fictional dealers in TX, CA, FL, GA, AZ,
IL, NY and OH). Results are not real vehicles for sale; say so when you show them.
Each result has listing_id (dealer_key:VIN), vehicle basics, headline_price (before tax, title and fees), dealer_name,
and selling_location: the store that holds the unit, with address and phone. link_status is linked, or ambiguous
when the listing does not say which of the dealer's stores holds it (see selling_location_candidates). A unit can
be held at a sister store run by another dealer in the same group; operated_by_dealer_id then differs from dealer_id.
Matching is exact on vocabularies, so a total of 0 often means a wrong value: check the parameter descriptions,
widen radius_miles or drop a filter; a zero total also returns hints.
The named parameters are shortcuts. filters reaches every other attribute: for example
{"field": "canonical.vin", "op": "eq", "value": "<VIN>"} finds a VIN, {"field": "price_summary.doc_fee", "op": "range",
"max": 300}, {"field": "incentives[].label_raw", "op": "eq", "value": "Military Appreciation"}.
Payment search: payment_max / payment_min filter on a DEMO monthly finance estimate computed per listing from its
itemized out-the-door estimate (tax, title, registration, dealer fees) for the buyer location, minus down payment and
trade equity, at a demo APR by credit tier unless apr is given. Each result then has estimated_payment (rounded to
$5, with a range) and dealer_advertised_payment when the listing shows one; the response has payment_assumptions
and a one-line assumptions_summary to read back to the shopper. For 'under $300/month' pass max_monthly_payment=300.
With a cap, near_misses lists up to 3 cars just above it, and a zero result returns to_reach_target (extra down
payment, or a 72 or 84 month term). To compare scenarios for one car, use compare_payment_scenarios.
Every result has estimated_out_the_door (exact, same as estimate…

Input parameters:

- `apr`: APR percent for payment estimates. If omitted, a demo APR by credit_tier is used.
- `best_value_needs`: With sort=best_value, shopper needs that also score: seats, cargo, full_third_row, sliding_doors, low_mileage, newer, budget_headroom (needs max_out_the_door). Score = 0.70 x base + 0.30 x mean need…
- `body_style`: suv, sedan, pickup, hatchback, minivan or wagon. Use pickup for trucks.
- `buyer_city`: Buyer's city for payment tax lines.
- `buyer_county`: Buyer's county (without 'County') for payment tax lines.
- `buyer_state`: Buyer's two-letter state for payment tax and fees. Default: the selling store's state.
- `buyer_zip`: Buyer's ZIP; fills any missing buyer state, county and city. If no buyer location is given, zip is used, then the selling store (see out_the_door_assumptions.buyer).
- `city`: Exact city of the selling store (for example Houston, Katy, Plano). Suburbs are separate cities, so for 'in or near a city' prefer zip plus radius_miles.
- `condition`: new, used or cpo (certified pre-owned). used also returns cpo units.
- `credit_tier`: excellent, good (default), fair or poor; picks the demo APR when apr is omitted. Credit tiers (demo APR new / used): excellent about 720 and up (6.0% / 8.5%); good about 660 to 719 (7.5% / 11.0%); fa…
- `dealer_key`: Dealer key from list_dealers, e.g. lonemesa.
- `dealer_segment`: franchise, independent_used or bhph (buy-here-pay-here). Each result shows dealer_segment and dealer_type.
- `down_payment`: Cash down in USD for payment estimates. Default 0.
- `drivetrain`: fwd, awd, rwd or 4wd.
- `eligible_incentive_labels`: label_raw values of conditional incentives the buyer says they qualify for; applied to payment estimates where a listing offers them. Off by default.
- `exterior_color`: Exterior color family: white, black, silver, gray, blue, red, green or bronze.
- `filters`: Generic filters on ANY ontology field (vehicle, listing, store, dealer, price, fee, incentive, media, payment). All filters must match. See list_searchable_fields.
- `financeable_only` (boolean): True to drop listings whose payment estimate fails the demo financing rules (minimum amount financed, max term by age and mileage) at these terms. Recommended with max_monthly_payment; financing_summ…
- `fuel_type`: gasoline, hybrid, plug_in_hybrid or electric. Use electric for EV or BEV.
- `group_id`: Dealer group id (hierarchy: Group, then Region, then Store), e.g. meridian. See list_dealers.
- `include_near_misses` (boolean): With a payment cap, also return up to 3 listings within $25 above it in near_misses, flagged above_target. Default true.
- `include_payment` (boolean): True to add estimated_payment to every result without filtering on it.
- `limit` (integer): Results per page, 1 to 50. Each result is about 2 KB; 5 to 10 is usually enough.
- `make`: Make, case-insensitive, e.g. Honda, Ford, Tesla. 14 makes are present.
- `max_mileage`: Maximum odometer miles.
- `max_monthly_payment`: Canonical monthly payment cap: the shopper's monthly budget in USD, e.g. 300 for 'under $300/month' (demo estimate).
- `max_out_the_door`: Maximum estimated out-the-door total in USD for the buyer location (tax, title, registration, dealer fees, minus trade). Exact, unrounded, and the same figure estimate_out_the_door returns for the sa…
- `min_out_the_door`: Minimum estimated out-the-door total in USD (same basis as max_out_the_door).
- `model`: Model with its punctuation, case-insensitive: CR-V, F-150, Model 3, Mustang Mach-E.
- `offset` (integer): Paging offset.
- `payment_max`: DEPRECATED alias of max_monthly_payment (still accepted; the lower wins if both are given).
- `payment_min`: Minimum estimated monthly finance payment in USD (demo estimate).
- `payoff`: Loan payoff owed on the trade-in, USD.
- `price_max`: Maximum headline price in USD (before tax, title and dealer fees). For a budget that includes taxes and fees, check estimate_out_the_door.
- `price_min`: Minimum headline price in USD (before tax, title and dealer fees).
- `radius_miles`: Radius in miles around zip.
- `region_id`: Region inside a group, as group_id/region_id (e.g. meridian/dfw-metro) or a bare region id.
- `scenarios`: Optional what-if finance scenarios (up to 6). Each returned listing gets payment_scenarios with payment, amount financed, total interest and total cost per scenario. Filter and sort still use the mai…
- `seating_min`: Minimum seats, e.g. 7 for a third row family vehicle (synthetic demo spec).
- `sliding_doors`: True for sliding rear doors (minivans).
- `sort` (string): price_asc (default), price_desc, year_desc, mileage_asc, distance_asc (needs zip), payment_asc, payment_desc, otd_asc (estimated out the door) or best_value (documented score over out-the-door cost,…
- `state`: Two-letter code of the selling store's state: TX, CA, FL, GA, AZ, IL, NY or OH. Not the full name.
- `store_id`: Store id, dealer_key plus store ZIP, e.g. bluebonnetridge-75201.
- `term_months`: Loan term in months, 12 to 96. Default 60.
- `third_row`: True for third row seating only, false to exclude it (synthetic demo spec).
- `third_row_type`: full (adult-usable, car-seat capable) or compact (small, occasional; e.g. Tiguan). Demo spec.
- `trade_equity`: Net trade equity in USD if allowance and payoff are unknown (negative for upside-down); no tax credit is applied for it.
- `trade_value`: Trade-in allowance in USD (gets the trade-in tax credit where the state allows it).
- `trim`: Trim name, e.g. LX, EX-L, Lariat.
- `year_max`: Latest model year.
- `year_min`: Earliest model year.
- `zip`: Five-digit US ZIP of the shopper. With radius_miles, filters by straight-line distance to the selling store and adds distance_miles to each result.

### `list_searchable_fields` (~186 tokens)

Every filterable ontology field (vehicle, listing, store, dealer, price, fee, incentive, media, payment) with its
type, range or allowed values, shortcut names, the operators (eq, any_of, contains, range, bool, exists, negate) and
example filters for search_inventory. The full compact list is about 30 KB, so narrow it with prefix or query.

Input parameters:

- `detail` (string): compact (default): type, range or up to 12 values. full: up to 40 allowed values, examples and counts; use it with prefix or query.
- `prefix`: Only fields starting with this, e.g. canonical, price_summary, incentives, store, dealer_profile, media_block, derived, payment.
- `query`: Only fields whose name or description contains this text, e.g. fee, color, payment.

### `get_payment_estimate` (~714 tokens)

Use this to answer 'what would my monthly payment be' for ONE listing. It runs the same itemized
out-the-door calculation as estimate_out_the_door (always treated as financed) and turns it into a DEMO monthly
finance payment: out-the-door total minus down payment and trade equity, amortized at the APR (or a demo APR
by credit_tier) over term_months. Returns finance.estimated_monthly_payment rounded to $5 with monthly_payment_unrounded,
monthly_payment_range (rounded outward, so it always contains the unrounded value), financing_eligibility (demo
lender rules: minimum amount financed, max term by vehicle age and mileage, with flags),
amount_financed_estimate, total_of_payments, finance_charge and every assumption, plus the out-the-door figure
it used, a one-line assumptions_summary and any dealer-advertised payment shown separately (not comparable unless
the terms match). Totals: total_cost_including_trade_equity (PRIMARY: cash down plus payments plus net trade
equity given up) and cash_outlay_excluding_trade_equity (cash down plus payments); total_cost_estimate is a
deprecated alias of the latter, kept for one version. For ONE set of terms only: to compare two or more down, term, trade or
credit options, call compare_payment_scenarios once instead of calling this tool repeatedly.
Use get_price_breakdown instead for the dealer's listed price and fees only, and estimate_out_the_door for
the full itemized total without a payment. To find cars by payment across many listings, use search_inventory
with max_monthly_payment (canonical; payment_max is a deprecated alias). Estimate, not an offer; dealer sets price, lender sets rate. Not penny-accurate. Leases are not modeled.

Input parameters:

- `apr`: APR percent, 0 to 36. If omitted, a demo APR is picked by credit_tier.
- `buyer_city`: Buyer's city, for local tax lines.
- `buyer_county`: Buyer's county without 'County', for local tax lines.
- `buyer_state`: Buyer's two-letter state for tax and fees. Default: the selling store's state, or the state of buyer_zip.
- `buyer_zip`: Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source).
- `credit_tier`: excellent, good (default), fair or poor. Picks the demo APR when apr is omitted (used and cpo rates are higher than new).
- `down_payment`: Cash down in USD, subtracted from the out-the-door total. Default 0.
- `eligible_incentive_labels`: label_raw values of conditional incentives from get_price_breakdown that the buyer qualifies for.
- `listing_id` (string, required): dealer_key:VIN from search_inventory.
- `payoff`: Loan payoff owed on the trade-in, USD (negative equity is added to the amount financed).
- `term_months`: Loan term in months, 12 to 96. Default 60.
- `trade_equity`: Net trade equity in USD when allowance and payoff are unknown (negative if upside down). Subtracted after tax, so no trade-in tax credit is applied.
- `trade_value`: Trade-in allowance in USD. Passed to the out-the-door step, so it gets the state's trade-in tax credit where allowed.

### `compare_payment_scenarios` (~516 tokens)

Use this to compare several financing what-ifs for ONE listing side by side in one call (for example cash
down, term, credit tier or APR, trade-in, incentives). Each scenario reruns the itemized out-the-door estimate and
returns estimated_out_the_door, amount_financed_estimate, apr_percent and apr_source, term_months,
estimated_monthly_payment (rounded to $5) with the unrounded value and an outward-rounded range,
total_interest_estimate, total_cost_including_trade_equity (PRIMARY total: cash down plus all payments plus net
trade equity given up), cash_outlay_excluding_trade_equity (cash down plus payments only; total_cost_estimate is
its deprecated alias) and financing_eligibility with flags (demo rules), plus lowest_monthly, lowest_total_cost
(decided by total_cost_including_trade_equity) and lowest_cash_outlay_excluding_trade_equity. Those lowest_* keys are
UNFILTERED math winners. Present recommended_scenario, lowest_monthly_eligible or lowest_total_cost_eligible instead:
they skip scenarios the demo financing rules flag, so an ineligible scenario is never the recommendation. A scenario
{"name":"cash","cash":true} prices paying cash (no loan, no interest); cash_purchase always gives the cash amount due.
Each scenario has trade_risk (negative_equity_rolled_in, loan_to_value_pct and warnings, for example LTV over 110%)
and credit_tier_source. Prefer this over repeated get_payment_estimate calls. Up to 6 scenarios. For a single scenario use
get_payment_estimate. Estimate, not an offer; dealer sets price, lender sets rate. Leases are not modeled.

Input parameters:

- `buyer_city`: Buyer's city.
- `buyer_county`: Buyer's county without 'County'.
- `buyer_state`: Buyer's two-letter state for tax and fees. Default: the selling store's state.
- `buyer_zip`: Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source).
- `listing_id` (string, required): dealer_key:VIN from search_inventory.
- `scenarios` (array, required): 1 to 6 what-if scenarios, e.g. [{"name":"0 down"},{"name":"3k down 72","down_payment":3000,"term_months":72}]. Omitted fields default to $0 down, 60 months, good credit.

### `register_agent` (~137 tokens)

Optional and free. Registers your agent and returns an agent key (shown once) that gives it a durable,
anonymous id in Moonshot Lab's bot analytics. Send it as the X-MoonshotLab-Agent-Key header, or add ?agent_key=<key>
to the MCP URL. Nothing else changes: anonymous use keeps working, limits are the same, and no personal data is
collected. Dealers only ever see aggregate demand by platform name.

Input parameters:

- `agent_name`: Optional: your agent or product name (no personal data).
- `platform`: Optional: platform it runs on, e.g. ChatGPT, Claude, custom.

### `save_search` (~478 tokens)

DEMO. Save a car search and get alerted when new cars match. Returns a search_id (keep it; it is the only way to
read or cancel the search) and an expiry (default 30 days, renewable). Check for new cars with get_new_matches, or
give a callback_url. Shopper email alerts are optional and need explicit consent. On this demo, email sending is
switched off (alerts are logged, not sent) and new arrivals are simulated.

Input parameters:

- `body_style`: e.g. suv, sedan, truck.
- `callback_url`: Optional HTTPS webhook for new matches. Public addresses only; HMAC-signed (X-MoonshotLab-Signature: t=<unix>,v1=<hex HMAC-SHA256 of '<t>.<body>'>).
- `condition`: new, used or cpo.
- `credit_tier`: excellent, good, fair or poor, for the payment estimate.
- `down_payment`: Down payment used for the payment estimate, USD.
- `drivetrain`: e.g. awd, fwd.
- `email_consent`: true only if the shopper explicitly agreed to alert emails.
- `expires_in_days`: Days until the search ends (default 30, max 90). Renew any time.
- `fuel_type`: e.g. gasoline, hybrid, electric.
- `make`: Make, e.g. Toyota.
- `max_mileage`: Most miles.
- `max_monthly_payment`: Highest estimated monthly payment, USD.
- `model`: Model, e.g. RAV4.
- `price_max`: Highest advertised price, USD.
- `radius_miles`: Miles from zip (needs zip).
- `renew_search_id`: Pass an existing search_id to renew it instead of saving a new one.
- `shopper_email`: Optional: shopper's email for alert emails. Only with email_consent=true after the shopper agreed. Every email has a one-click unsubscribe.
- `state`: Two-letter state of the selling store.
- `term_months`: Loan term for the payment estimate.
- `trim`: Trim.
- `year_max`: Newest model year.
- `year_min`: Oldest model year.
- `zip`: Shopper's five-digit ZIP, the center of the search area.

### `get_new_matches` (~66 tokens)

DEMO. New cars that started matching a saved search after it was saved (or after `since`).

Input parameters:

- `search_id` (required): search_id from save_search.
- `since`: Optional ISO 8601 time; only matches after it (use checked_at from your last call).

### `cancel_search` (~36 tokens)

DEMO. Cancel a saved search. Any shopper email stored for it is deleted.

Input parameters:

- `search_id` (required): search_id from save_search.

### `prepare_dealer_handoff` (~962 tokens)

Use this when the shopper has picked a car and a deal structure and wants to take it to the dealer. Builds a
structured dealer handoff package for ONE configured deal: vehicle and VIN, the full itemized out-the-door
estimate (with excluded items such as optional add-ons), the chosen financing scenario with demo financing
eligibility, trade and negative-equity details (loan-to-value), all warnings, the assistant name and session
reference, a timestamp (UTC and America/Chicago) and an estimate-not-offer disclaimer. Returns the package as JSON
plus a ready-to-send email body (email.subject, email.text, email.html) with no recipient filled in.
THIS TOOL SENDS NOTHING and contacts no one: delivery.status is not_sent, and delivery happens later, with the
shopper's consent, through the dealer's chosen channel (email, desking or F&I). No dealer email is invented;
dealer.handoff_contact is null until the dealer provides one. On synthetic data the package is labeled DEMO.
Before calling, ask the shopper for a phone number or email for the dealer (with their OK); the call fails without a phone, email, or a name plus preferred_contact. The deal (date, shopper name and contact, car, payment, status) is saved to the store's dealer dashboard, where only that store, its region and group can see the contact info and address.
Optional extras the dealer will use: trade_details (VIN, miles, plate, color, who the loan is with and how much),
buyer_address (with county, for tax and registration), financing_details (deposit, cash down and rebates as
separate lines, and any lender pre-approval the shopper already has) and add_on_interest (yes, no or unsure for
service contract, GAP, maintenance, other; never priced). The email has a deal sheet in buyer's order line order
including the store's dealer fees. NEVER ask the shopper for a Social Security number (or any part of one), date
of birth or income; the tool rejects them. Leases, add-on pricing and payment dates are left to the dealer.

Input parameters:

- `add_on_interest`: Optional: is the shopper interested in service_contract, gap, maintenance, other (yes, no or unsure)? No prices; the dealer covers these.
- `assistant`: Optional assistant reference: name, session_ref, contact.
- `buyer_address`: Optional shopper address (street, city, state, zip, county), with their OK. Sets tax and registration; visible only to the deal's store, region and group.
- `buyer_city`: Buyer's city.
- `buyer_county`: Buyer's county without 'County'.
- `buyer_state`: Buyer's two-letter state.
- `buyer_zip`: Buyer's five-digit ZIP; alone it resolves state, county and city.
- `eligible_incentive_labels`: Conditional incentive label_raw values the shopper qualifies for.
- `financing_details`: Optional separate deposit, cash_down and rebates (they add up to the down payment), plus pre_approval (has_pre_approval, lender_name, approved_amount, rate_percent; the rate is used for the payment u…
- `listing_id`: dealer_key:VIN from search_inventory. Either this or vin is required.
- `payoff`: Loan payoff owed on the trade-in, USD.
- `scenario`: The financing scenario the shopper chose, same shape as one compare_payment_scenarios scenario (down_payment, term_months, credit_tier or apr, trade fields, or cash=true). Default: $0 down, 60 months…
- `shopper_contact`: REQUIRED. Ask the shopper how the dealer should reach them, and share only with their OK: name, phone and/or email, preferred_contact (call, text or email), notes. Needs a phone or email, or a name p…
- `trade_details`: Optional trade-in details from the shopper: year, make, model, trim, vin, odometer, plate, plate_state, color, payoff_lender, payoff_amount.
- `trade_equity`: Net trade equity if allowance and payoff are unknown (no tax credit).
- `trade_value`: Trade-in allowance in USD (used when the scenario does not set it).
- `trade_vehicle`: Short description of the trade, e.g. '2021 Ford F-150 XLT, 48k mi'.
- `vin`: 17-character VIN, if listing_id is not known. Rejected if several dealers list it.

### `get_listing` (~122 tokens)

Full synthetic listing record with per-value provenance (method 'synthetic'). listing_id is dealer_key:VIN (as
returned by search_inventory) or the urn. The vehicle-to-store link is in listing.selling_location (link_status,
selling_location_id, candidates, flags such as group_site_lists_sister_store or multi_store_unstated); the dealer
block is the advertising dealer. For price and fees in a compact form, use get_price_breakdown.

Input parameters:

- `listing_id` (string, required): dealer_key:VIN from search_inventory, or the listing urn.

### `get_price_breakdown` (~265 tokens)

Use this to see what the dealer LISTS for ONE listing, as published: headline price, MSRP (new cars),
price_components, dealer fees (doc fee and others) and fee bundles (parts marked part_of_bundle, not double
counted), flags such as whether the advertised price already includes fees, options, incentives split into
all_buyer (already in the price) and conditional (not in the price), and the state's public tax and fee RULES
with data-flag checks. It takes no buyer inputs and computes no tax amounts or total.
Use estimate_out_the_door next for the buyer's total with tax, title, registration and fees, and
get_payment_estimate for a monthly payment. Pass conditional incentive label_raw values to those tools as
eligible_incentive_labels only if the shopper qualifies. A dealer-advertised monthly payment, when present, is a
price_components item of type payment_quote: dealer ad text, not a calculation. Each price_component has a plain
label, source_text and method_text; fees and incentives carry tax_treatment (taxable or reduces_taxable_amount,
whether it is inside the advertised price, and why).

Input parameters:

- `listing_id` (string, required): dealer_key:VIN from search_inventory.

### `estimate_out_the_door` (~559 tokens)

Use this for the buyer's TOTAL price of ONE listing: an itemized out-the-door DEMO ESTIMATE for the buyer's
state, county and city, built with real public tax and fee rules for the 8 covered states. Lines include the
price, dealer fees, eligible incentives, state and local sales tax, title and registration fees, and a trade-in
block (allowance, payoff, equity, tax credit). Every line has a source and confidence; unknowns become ranges.
Read estimated_out_the_door with estimate_range and confidence. With a trade-in, estimated_out_the_door is the
balance due after the trade (negative equity added); deal.vehicle_out_the_door_before_trade is the car alone.
Use get_price_breakdown instead for only the dealer's listed price and fees, and get_payment_estimate to turn
this total into a monthly finance payment (this tool returns payments: null). Read warnings, for example when the
shopper's state differs from the store's state. Not an offer, not a quote, not penny-accurate. Inputs are not stored.

Input parameters:

- `buyer_city`: Shopper's city, e.g. Chicago. Some city taxes depend on it; it can also imply the county.
- `buyer_county`: Shopper's county name without the word County, e.g. Harris, Cook, Orange. Improves local tax lines.
- `buyer_state`: Shopper's two-letter state; sets the tax and fee state. Defaults to the selling store's state, or the state of buyer_zip. States outside the 8 covered return a low-confidence estimate without tax and…
- `buyer_zip`: Buyer's five-digit ZIP. Alone it resolves buyer state, county and city (echoed in tax_location.resolution with the source).
- `eligible_incentive_labels`: label_raw values of conditional incentives from get_price_breakdown that the shopper qualifies for (case-insensitive).
- `financed`: True if the purchase will be financed, false for cash. Some fees and incentives depend on it; if omitted they are flagged as uncertain.
- `lender_name`: Lender holding the trade-in loan (optional, not stored).
- `listing_id` (string, required): dealer_key:VIN from search_inventory.
- `payoff`: Loan payoff in USD still owed on the trade-in.
- `plate_transfer` (boolean): True to transfer existing plates where the state allows it.
- `registration_state`: State where the car will be registered, if different from buyer_state.
- `trade_value`: Trade-in allowance in USD offered or expected for the shopper's car.
- `vehicle_weight_lbs`: Vehicle weight, used by weight-based registration fees.

### `get_dealer` (~106 tokens)

Fictional dealer profile: registry entity, stores (selling locations) with fictional addresses and 555 phone
numbers, group, state rules and a page of inventory. Not a real business; do not tell anyone to call or visit.

Input parameters:

- `dealer_key` (string, required): Dealer key from list_dealers or a search result, e.g. bluebonnetridge.
- `inventory_limit` (integer): Inventory rows to include.
- `inventory_offset` (integer): Paging offset for inventory.

### `list_dealers` (~80 tokens)

All 20 fictional demo dealers with group and store counts (each dealer lists its stores with group_id, region_id
and store_id), the dealer hierarchy (Group, then Region, then Store), the 4 fictional dealer groups and a coverage
summary: which metros have demo stores, with dealer, store and new/used listing counts per metro.

### `get_media` (~107 tokens)

Media block for a listing: self-generated SVG placeholder images labeled DEMO (photo, video poster, spin), with
rights notes. They are not photos of a real car. No video or 360 viewer exists in the demo.

Input parameters:

- `limit` (integer): Maximum items, 0 to 100.
- `listing_id` (string, required): dealer_key:VIN from search_inventory.
- `types`: Filter by item type: photo, video (poster image only) or spin_exterior.

### `get_trade_in_scenarios` (~43 tokens)

Ready-made demo trade-in scenarios (one per state) with trade_value and payoff to pass to estimate_out_the_door
or get_payment_estimate.

### `get_ontology` (~55 tokens)

Schema links, schema version, covered states, condition values, search sorts and the value-wrapper format
({v, m, c, src}). For the list of filterable fields and allowed values, use list_searchable_fields.

## Diagnostics

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

## Score history

- 2026-10-25: 64
- 2026-10-24: 64
- 2026-10-23: 63
- 2026-10-22: 63
- 2026-10-21: 62
- 2026-10-20: 62
- 2026-10-19: 61
- 2026-10-18: 58

## Common questions

### What is the Moonshot Lab (demo) MCP server?

Moonshot Lab (demo) is an MCP server listed in the public MCP registry as com.moonshotlab1/inventory. Agent car inventory index. Synthetic demo data, not real inventory, not an offer. This page covers its hosted endpoint (https://moonshotlab1.com/mcp).

### Is the Moonshot Lab (demo) MCP server safe to use?

Moonshot Lab (demo) scores 64 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 Moonshot Lab (demo) MCP server expose?

Moonshot Lab (demo) exposes 17 tools: search_inventory, list_searchable_fields, get_payment_estimate, compare_payment_scenarios, register_agent, and 12 more. Their descriptions and schemas cost roughly 6,723 tokens of context every time the server is loaded.

### Does the Moonshot Lab (demo) MCP server require authentication?

No. We connected to Moonshot Lab (demo) without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Moonshot Lab (demo) MCP server still maintained?

Moonshot Lab (demo) is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

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