# JENNi Shop Local (remote · shop.jennipro.com)

Search local-shop and ship-to-home products by US ZIP and get a JENNi checkout link.

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

> **Recent critical change**: Authorization (2026-10-23). See the changelog below before you install this server.

## Components

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

## Channel facts

- Endpoint: `https://shop.jennipro.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-10-25.

- **Endpoint Security**: 60/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 (complete_checkout).
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 77/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 1624 tokens (~147/item across 11 items; 8 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability check failed: schema churn in the 5 days we've observed: 1 tool removals, 2 breaking changes, 0 auth/transport breaks, 4 additions.
- **Tool Coverage**: 89/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 60% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 73/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.
  - Supports UI / widget rendering.

## Install

### How do I install the JENNi Shop Local MCP server?

JENNi Shop Local is a hosted endpoint at https://shop.jennipro.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-jennipro-shop-shop-local 'https://shop.jennipro.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-jennipro-shop-shop-local": {
      "url": "https://shop.jennipro.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-jennipro-shop-shop-local": {
      "type": "http",
      "url": "https://shop.jennipro.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-jennipro-shop-shop-local]
url = "https://shop.jennipro.com/mcp"
```

### opencode

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

### OpenClaw

```bash
openclaw mcp add com-jennipro-shop-shop-local --url 'https://shop.jennipro.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-jennipro-shop-shop-local:
    url: "https://shop.jennipro.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-jennipro-shop-shop-local": {
      "Transport": "http",
      "Url": "https://shop.jennipro.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-jennipro-shop-shop-local -t streamable-http -u 'https://shop.jennipro.com/mcp'
```

### Other

```json
{
  "mcpServers": {
    "com-jennipro-shop-shop-local": {
      "type": "http",
      "url": "https://shop.jennipro.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-25 (score 64, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “start_checkout” rewrote its description, which is the text the model reads
- [cosmetic] “start_checkout” added an optional parameter “items”
- [cosmetic] “start_checkout” added an optional parameter “quantity”
- [cosmetic] “start_checkout” added an optional parameter “zip”
- [cosmetic] “start_checkout” made “delivery_address” optional
- [cosmetic] “start_checkout” made “product_id” optional

### 2026-10-24 (score 64, 0)

- [security] Resource “product-widget” now points somewhere else: ui://jenni/product-v1 → ui://jenni/product-v2
- [security] Resource “results-widget” now points somewhere else: ui://jenni/results-v1 → ui://jenni/results-v2
- [security] Resource “stores-widget” now points somewhere else: ui://jenni/stores-v1 → ui://jenni/stores-v2
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “search_catalog” rewrote its description, which is the text the model reads
- [cosmetic] “search_catalog” added an optional parameter “max_price”

### 2026-10-23 (score 64, −4)

- [critical regression] Authorization: partial → fail
- [security regression] A breaking change shipped without a version bump: still 2.0.0
- [security regression] Tool “find_stores” was removed
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] New tool “complete_checkout”, which the server declares destructive
- [security] Tool “get_buying_options” rewrote its description, which is the text the model reads
- [security] Tool “get_order_status” rewrote its description, which is the text the model reads
- [security] Tool “get_product” rewrote its description, which is the text the model reads
- [security] Tool “search_catalog” rewrote its description, which is the text the model reads
- [functional regression] Tool coverage: 74% → 55%
- [functional improvement] Schema quality: 181 → 125
- [functional] The server now declares the “resources” capability
- [functional] First check of Capabilities: pass
- [functional] First check of Schema quality: 100
- [functional] New resource “product-widget”
- [functional] New resource “results-widget”
- [functional] New resource “stores-widget”
- [functional] New tool “create_checkout”
- [functional] New tool “update_checkout”
- [cosmetic] “search_catalog” added an optional parameter “fulfillment_mode”
- [cosmetic] “search_catalog” added an optional parameter “page”
- [cosmetic] “start_checkout” reworded the description of “fulfillment_mode”

### 2026-10-22 (score 68, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “find_stores” rewrote its description, which is the text the model reads
- [security] Tool “get_buying_options” rewrote its description, which is the text the model reads
- [security] Tool “get_order_status” rewrote its description, which is the text the model reads
- [security] Tool “get_product” rewrote its description, which is the text the model reads
- [security] Tool “search_catalog” rewrote its description, which is the text the model reads
- [security] Tool “start_checkout” rewrote its description, which is the text the model reads
- [functional regression] “start_checkout” added a required parameter “delivery_address”, so existing callers break
- [functional regression] “start_checkout” dropped the required parameter “quantity”
- [functional regression] “start_checkout” dropped the required parameter “zip”
- [functional improvement] Schema quality: 277 → 181
- [functional] Server version: 1.1.0 → 2.0.0
- [cosmetic] “find_stores” reworded the description of “zip”
- [cosmetic] “get_product” reworded the description of “zip”
- [cosmetic] “start_checkout” reworded the description of “fulfillment_mode”
- [cosmetic] “start_checkout” dropped the optional parameter “store_id”

### 2026-10-21 (score 68, +1)

- [security regression] Stability: unverified → fail
- [security regression] A breaking change shipped without a version bump: still 1.1.0
- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “find_stores” rewrote its description, which is the text the model reads
- [security] Tool “get_product” rewrote its description, which is the text the model reads
- [security] Tool “search_catalog” rewrote its description, which is the text the model reads
- [security] Tool “start_checkout” rewrote its description, which is the text the model reads
- [functional regression] “search_catalog” made “query” required, so existing callers break
- [functional improvement] Tool coverage: 65% → 76%
- [functional] New tool “get_order_status”
- [cosmetic] “get_product” added an optional parameter “market”
- [cosmetic] “search_catalog” added an optional parameter “market”
- [cosmetic] “get_product” reworded the description of “zip”
- [cosmetic] “search_catalog” reworded the description of “limit”
- [cosmetic] “search_catalog” reworded the description of “query”
- [cosmetic] “search_catalog” reworded the description of “zip”
- [cosmetic] “start_checkout” reworded the description of “store_id”
- [cosmetic] “get_product” dropped the optional parameter “postal_code”
- [cosmetic] “search_catalog” dropped the optional parameter “brand”
- [cosmetic] “search_catalog” dropped the optional parameter “cursor”
- [cosmetic] “search_catalog” dropped the optional parameter “gtin”
- [cosmetic] “search_catalog” dropped the optional parameter “postal_code”
- [cosmetic] “search_catalog” dropped the optional parameter “product_id”
- [cosmetic] “search_catalog” dropped the optional parameter “store_id”
- [cosmetic] “search_catalog” dropped the optional parameter “store_ids”
- [cosmetic] “start_checkout” made “store_id” optional
- [cosmetic] Tool “find_stores” changed its title: Find a shop → Find a shop by name
- [cosmetic] Tool “search_catalog” changed its title: Search local shops → Search products

### 2026-10-20 (score 67)

First indexed and scored.

## MCP tools (8)

### `search_catalog` (~332 tokens)

Search products

Search in-stock products JENNi can deliver to a 5-digit US ZIP: local delivery first, then ship-to-home. Every product returned can be ordered; price is per unit, before the delivery or shipping fee. A product with variants and no price is a size or colour family: buy one of its variants. Sized goods are often listed one size per product: put the size in the query and match it against size or title. Put a price limit in max_price, not the query; keep the query to brand, product type and size. If it returns product_not_found, search once more with fewer words before telling the shopper nothing matched. Pass fulfillment_mode to search one mode. More results: call again with page+1 while page < paging.total_pages.

Input parameters:

- `fulfillment_mode` (string): Search one mode only. Omit to list local delivery first, filled with ship-to-home.
- `limit` (integer): Products to return (default 10).
- `market` (string): Market key, e.g. san-antonio-tx. Used when no zip is given.
- `max_price` (number): Highest price the shopper will pay, in US dollars, e.g. 120. Put a price limit here, not in the query.
- `page` (integer): 1-based results page; call again with page+1 while page < paging.total_pages.
- `query` (string, required): What the shopper wants, e.g. "running shoes".
- `zip` (string): 5-digit US ZIP code the shopper is in, e.g. 78205.

Output parameters:

- `note` (string): What could not be checked (for example local delivery): that availability is unknown, not unavailable.
- `paging` (object)
- `products` (array)
- `reason_code` (string): Present only when products is empty.

### `get_product` (~85 tokens)

Product details

Details for one product_id: description, images, sizes and colours, and its price and delivery at the ZIP.

Input parameters:

- `market` (string): Market key, e.g. san-antonio-tx. Used when no zip is given.
- `product_id` (string, required)
- `zip` (string): 5-digit US ZIP code, for local prices and delivery options.

Output parameters:

- `product` (object)

### `start_checkout` (~245 tokens)

Start checkout

Returns a hosted checkout_url for an exact product and selected fulfillment mode using the delivery ZIP or address. For several products, pass items instead of product_id: one checkout_url puts them all in one basket. JENNi selects the source internally. The buyer reviews delivery, tax and the total, enters payment details, and places the order on the hosted page. This read-only tool creates no order, reservation or charge. The final checkout page verifies current price and availability.

Input parameters:

- `delivery_address` (object): Delivery destination. Address details are not placed in the checkout URL.
- `fulfillment_mode` (string, required): Selected fulfillment mode: local_delivery arrives on the delivery date the buying-options read returns (delivery_promise / deliver_by); ship_to_home ships to the delivery address.
- `items` (array): Several products in one link, instead of product_id. Same fulfillment_mode and ZIP for all.
- `product_id` (string): The exact item: a variant's product_id when it has variants.
- `quantity` (integer): How many of product_id (default 1).
- `zip` (string): 5-digit US delivery ZIP code, when no delivery_address is given.

Output parameters:

- `checkout_url` (string)
- `delivery_promise` (string): Local delivery: "Get it today" or "We'll deliver by <Month D>". Ship-to-home: "Ships to you".
- `fulfillment_mode` (string)
- `item` (string)
- `items` (array)
- `next_step` (string)
- `pricing` (object): unit_price x quantity + fee = total_before_tax. Sales tax is added at checkout.
- `product_id` (string)
- `quantity` (integer)
- `reason_code` (string): Machine-readable reason, alongside the prose note.
- `unit_price` (string)

### `get_buying_options` (~80 tokens)

Check price and delivery

Price, delivery promise and total before tax for one product_id, ZIP, quantity and mode (local_delivery or ship_to_home). Call it when the shopper picks a product, before quoting a total.

Input parameters:

- `fulfillment_mode` (string, required)
- `product_id` (string, required)
- `quantity` (integer, required)
- `zip` (string, required)

Output parameters:

- `available` (boolean): True when this mode can be ordered for this product, ZIP and quantity.
- `delivery_promise` (string): Local delivery: "Get it today" or "We'll deliver by <Month D>". Ship-to-home: "Ships to you".
- `fulfillment_mode` (string)
- `note` (string)
- `pricing` (object): unit_price x quantity + fee = total_before_tax. Sales tax is added at checkout.
- `product_id` (string)
- `reason_code` (string): Why this mode cannot be bought here now.
- `title` (string)
- `unit_price` (string)

### `get_order_status` (~88 tokens)

Check an order

Read where a JENNi order stands: status, delivery ETA when known, courier tracking and whether the card was charged. Requires the private order_token from the shopper’s JENNi order page (starts jos1_). Read-only; it shows no personal details.

Input parameters:

- `order_token` (string, required): The order token from the shopper's JENNi order page, starting jos1_.

Output parameters:

- `eta` (string|null): Delivery estimate when JENNi has one; null means not known yet.
- `items` (array)
- `next_step` (string)
- `order_state` (string|null)
- `payment` (object)
- `refund_state` (string)
- `status` (string)
- `tracking` (array)
- `updated_at` (string|null)

### `create_checkout` (~127 tokens)

Start an order

Start an order JENNi will deliver, without leaving the chat. Give the exact product_id, the delivery address and the shopper's contact details. Returns the delivery options and the order total. Nothing is charged until complete_checkout. Delivered by JENNi.

Input parameters:

- `buyer` (object, required)
- `delivery_address` (object, required)
- `idempotency_key` (string): Optional. Reuse the same value to retry safely; the retry returns the first result instead of acting twice.
- `product_id` (string, required)
- `quantity` (integer): How many (default 1).

Output parameters:

- `checkout_id` (string|null)
- `continue_url` (string): Present when the shopper should finish on JENNi instead.
- `currency` (string)
- `expires_at` (string|null)
- `fulfilled_by` (string)
- `fulfillment_options` (array)
- `line_items` (array)
- `messages` (array)
- `next_step` (string)
- `order_id` (string|null)
- `reason_code` (string)
- `selected_fulfillment_mode` (string|null)
- `status` (string): incomplete, ready_for_complete, requires_escalation, completed or canceled.
- `totals` (object)

### `update_checkout` (~123 tokens)

Update an order

Choose local_delivery or ship_to_home, or change the quantity, address or contact details of an order started with create_checkout. Call with only checkout_id to re-read it. Returns the order total once a delivery option is chosen.

Input parameters:

- `buyer` (object)
- `checkout_id` (string, required)
- `delivery_address` (object)
- `fulfillment_mode` (string)
- `idempotency_key` (string): Optional. Reuse the same value to retry safely; the retry returns the first result instead of acting twice.
- `quantity` (integer)

Output parameters:

- `checkout_id` (string|null)
- `continue_url` (string): Present when the shopper should finish on JENNi instead.
- `currency` (string)
- `expires_at` (string|null)
- `fulfilled_by` (string)
- `fulfillment_options` (array)
- `line_items` (array)
- `messages` (array)
- `next_step` (string)
- `order_id` (string|null)
- `reason_code` (string)
- `selected_fulfillment_mode` (string|null)
- `status` (string): incomplete, ready_for_complete, requires_escalation, completed or canceled.
- `totals` (object)

### `complete_checkout` (~113 tokens)

Place the order

Place the order. Only after the shopper has approved the total from update_checkout. Pays with the shopper's Stripe shared payment token (spt_...), issued for at least the order total. Never send card numbers. Delivered by JENNi.

Input parameters:

- `checkout_id` (string, required)
- `idempotency_key` (string): Optional. Reuse the same value to retry safely; the retry returns the first result instead of acting twice.
- `payment_token` (string, required): Stripe shared payment token, starting spt_.

Output parameters:

- `checkout_id` (string|null)
- `continue_url` (string): Present when the shopper should finish on JENNi instead.
- `currency` (string)
- `expires_at` (string|null)
- `fulfilled_by` (string)
- `fulfillment_options` (array)
- `line_items` (array)
- `messages` (array)
- `next_step` (string)
- `order_id` (string|null)
- `reason_code` (string)
- `selected_fulfillment_mode` (string|null)
- `status` (string): incomplete, ready_for_complete, requires_escalation, completed or canceled.
- `totals` (object)

## Diagnostics

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

## Score history

- 2026-10-25: 64
- 2026-10-24: 64
- 2026-10-23: 64
- 2026-10-22: 68
- 2026-10-21: 68
- 2026-10-20: 67

## Common questions

### What is the JENNi Shop Local MCP server?

JENNi Shop Local is an MCP server listed in the public MCP registry as com.jennipro.shop/shop-local. Search local-shop and ship-to-home products by US ZIP and get a JENNi checkout link. This page covers its hosted endpoint (https://shop.jennipro.com/mcp).

### Is the JENNi Shop Local MCP server safe to use?

JENNi Shop Local 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 JENNi Shop Local MCP server expose?

JENNi Shop Local exposes 8 tools: search_catalog, get_product, start_checkout, get_buying_options, get_order_status, and 3 more. Their descriptions and schemas cost roughly 1,193 tokens of context every time the server is loaded.

### Does the JENNi Shop Local MCP server require authentication?

No. We connected to JENNi Shop Local without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the JENNi Shop Local MCP server still maintained?

JENNi Shop Local 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://shop.jennipro.com/mcp
- Website: https://shop.jennipro.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-jennipro-shop-shop-local/shop.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-jennipro-shop-shop-local/shop.json
- HTML version of this page: https://verifymcp.io/servers/com-jennipro-shop-shop-local/shop
