# Neonjelly (remote · mcp.neonjelly.io)

Remote MCP over 1.37M Shopify stores. 14-day trial, 100/day, no account. Paid from $29/mo.

- Trust score: 84/100 (high trust)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-21

## Components

- remote · `mcp.neonjelly.io`: 84/100 (this document), [markdown](https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp.md), [page](https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp)

## Channel facts

- Endpoint: `https://mcp.neonjelly.io/c/{connect_token}/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-09-21.

- **Endpoint Security**: 83/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.
  - 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**: 87/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 6497 tokens (~103/item across 63 items; 60 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 53/100
  - Stability observed for 16 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.
  - 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 60 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 62 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 Neonjelly MCP server?

Neonjelly is a hosted endpoint at https://mcp.neonjelly.io/c/%7Bconnect_token%7D/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 io-neonjelly-mcp 'https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "io-neonjelly-mcp": {
      "url": "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "io-neonjelly-mcp": {
      "type": "http",
      "url": "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.io-neonjelly-mcp]
url = "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-neonjelly-mcp": {
      "type": "remote",
      "url": "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-neonjelly-mcp --url 'https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-neonjelly-mcp:
    url: "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "io-neonjelly-mcp": {
      "Transport": "http",
      "Url": "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-neonjelly-mcp -t streamable-http -u 'https://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-neonjelly-mcp": {
      "type": "http",
      "url": "https://mcp.neonjelly.io/c/%7Bconnect_token%7D/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-09-20 (score 84, +1)

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

### 2026-09-18 (score 83, +1)

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

### 2026-09-16 (score 82, +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.

### 2026-09-13 (score 81, +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-09-11 (score 80, +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-09-09 (score 79, +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.

### 2026-09-07 (score 78, +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-09-06 (score 77, 0)

- [functional improvement] Stability: unverified → 0.03

## MCP tools (60)

### `whoami` (~61 tokens)

Check quota

Return this key's plan, used today, remaining quota, rate limit, and expiry. Does not count against daily quota — call first when the user asks “what's my quota?” If remaining is 0 or trial expired, call upgrade and open the URL.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `upgrade` (~45 tokens)

Get checkout URL

Return the paid upgrade URL when trial expired, daily quota is 0, or Signals is blocked. Does not count against quota. Always show the returned URL — never invent a checkout link.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `resolve_store` (~81 tokens)

Resolve a store

Resolve a brand name or URL against 1.37M Shopify storefronts and return up to 5 candidates. On a single hit, also return the full store card — call this before inventing a domain; missing stores stay not_found.

Input parameters:

- `q` (string, required): Brand, product, or free-text query. Example: gymshark or neck fan

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `list_playbooks` (~51 tokens)

List playbooks

List composed-tool playbooks by job: store lists, VC, competitor, dropship, outreach, merch. Start here when the user has not named a tool — then call the playbook's first tool.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_examples` (~34 tokens)

Example playbooks

Same playbook map as list_playbooks (VC, competitor, dropship, outreach). Prefer list_playbooks on new sessions.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `brief_market` (~115 tokens)

Brief a market

Return a one-page TAM brief: vertical size, geos, movers, and an optional filtered cohort from 1.37M stores. Pass a vertical; quote catalog counts only — do not invent TAM.

Input parameters:

- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `minVisits` (number): Minimum monthly visits. Example: 10000
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `cohort_tam` (~182 tokens)

Cohort TAM

Roll a filtered store cohort into a groupBy table (country, vertical, industry, category). This is not the unfiltered get_countries TAM — use that when no filters apply.

Input parameters:

- `category` (string): Store category label from the catalog.
- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `groupBy` (string): Roll rows into a breakdown table instead of store cards.
- `groupMetric` (string): How to aggregate visits/revenue when groupBy is set.
- `isDropshipper` (boolean): If true, only stores the catalog flags as dropship.
- `minVisits` (number): Minimum monthly visits. Example: 10000
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `find_peers` (~80 tokens)

Find peer stores

Find stores in the same vertical, country, and visit band as a target domain, then compare cards. Call resolve_store first if you only have a brand name.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `limit` (integer): How many peer stores to return. Default 8, max 25.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `diligence_pack` (~62 tokens)

Diligence pack

Build an IC memo for one domain: card, growth, traffic, stack roles, bestsellers, changes, and contacts. Includes Signals stats only if that domain is already watched.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `compare_stacks` (~71 tokens)

Compare app stacks

Compare 2–8 store app stacks: shared vs exclusive apps, tagged by role (email, support, reviews, subs, ads). Pass hostnames, not brand names.

Input parameters:

- `domains` (array, required): 2–8 store hostnames. Example: ["gymshark.com","allbirds.com"]

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `competitor_moves` (~80 tokens)

Competitor moves

List catalog store and SKU changes plus vertical movers for one competitor domain. Ads and daily units need a paid Signals watch — do not offer create_signal on trial.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `overlap_vendors` (~94 tokens)

Vendor overlap

Find product-vendor overlap and the average price gap between two stores. Use after compare_stacks when you need shared suppliers, not shared apps.

Input parameters:

- `domainA` (string, required): First store hostname. Example: gymshark.com
- `domainB` (string, required): Second store hostname. Example: allbirds.com
- `limit` (integer): Shared-vendor rows to return. Min 5, max 80.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `screen_dropship` (~149 tokens)

Screen dropship stores

List dropship-flagged stores in a vertical/geo plus their cheapest SKUs. Country is a filter, not a login region — quote the catalog flag, do not invent supplier names.

Input parameters:

- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `limit` (integer): How many dropship-flagged stores to screen. Max 12.
- `minVisits` (number): Minimum monthly visits. Example: 10000
- `priceMax` (number): Maximum listed price in store currency.
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `source_map` (~143 tokens)

Map SKU sources

Group a SKU search by vendor: store count and price min/max across the catalog. Use for sourcing or arbitrage after niche_research names the product.

Input parameters:

- `limit` (integer): Vendor groups to return. Min 5, max 80.
- `priceMax` (number): Maximum listed price in store currency.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `storeVertical` (string): Vertical of the selling store. Example: Apparel
- `vendor` (string): Product vendor / supplier name as listed on the storefront.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `winning_skus` (~102 tokens)

Winning SKUs

List bestsellers, ≥10% markdowns, and new products for a vertical or one store. Require storeVertical or storeDomain — do not call empty.

Input parameters:

- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com
- `storeVertical` (string): Vertical of the selling store. Example: Apparel

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `niche_research` (~105 tokens)

Niche saturation

Run semantic product-idea search plus a saturation report and the stores that sell the top hit. q is a product name or category, not a domain — quote seller count and the UNTAPPED→SATURATED verdict.

Input parameters:

- `limit` (integer): Product ideas to return. Max 40.
- `market` (string): Keep ideas with this saturation verdict only.
- `q` (string, required): Product name or category, not a domain. Example: neck fan or yoga mat

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `search_product_ideas` (~195 tokens)

Search product ideas

Search product names/categories and return ideas with seller count, price, and UNTAPPED→SATURATED verdict — not one-store listings. Prefer niche_research when the user asks “is this saturated?”

Input parameters:

- `countries` (string): ISO-2 country list, comma-separated. Example: US,GB,CA
- `market` (string): Comma verdicts: UNTAPPED,LOW COMPETITION,COMPETITIVE,SATURATED
- `page` (integer): 1-based page. Default 1.
- `priceMax` (number): Maximum listed price in store currency.
- `priceMin` (number): Minimum listed price in store currency.
- `q` (string, required): Product name or category, not a domain. Example: neck fan or yoga mat
- `region` (string): Optional region label for product-idea search.
- `trending` (boolean): If true, only ideas marked trending.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `suggest_product_ideas` (~74 tokens)

Suggest product ideas

Autocomplete product-idea names as the user types. Follow with search_product_ideas or niche_research on the chosen row.

Input parameters:

- `limit` (integer): Autocomplete rows. Max 15.
- `q` (string, required): Brand, product, or free-text query. Example: gymshark or neck fan

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `trending_product_ideas` (~40 tokens)

Trending product ideas

List product ideas the catalog marks as heating up. Pair a hit with get_product_research and list_product_sellers — do not invent trend scores.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_product_research` (~57 tokens)

Product-idea report

Return the saturation report for one product idea. Copy id from search_product_ideas or niche_research — do not invent seller counts.

Input parameters:

- `id` (string, required): Product-idea id from search_product_ideas or niche_research.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `list_product_sellers` (~110 tokens)

Stores selling an idea

List stores selling a product idea, sorted by traffic or price. Copy id from search_product_ideas — this is who-sells-this, not a single merchant SKU list.

Input parameters:

- `id` (string, required): Product-idea id from search_product_ideas or niche_research.
- `limit` (integer): Sellers to return. Max 100.
- `page` (integer): 1-based page. Default 1.
- `sort` (string): Seller list sort: store traffic or SKU price.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `product_search` (~243 tokens)

Search SKUs + facets

Search cross-store SKUs and return rows plus facets (vendors, types, stores, price band). At least one filter is required. For saturation / who-sells-this-idea, use niche_research.

Input parameters:

- `isBestSeller` (boolean): If true, only SKUs currently flagged as bestsellers.
- `limit` (integer): SKU rows. Max 80.
- `order` (string): Sort direction. Default desc.
- `priceMax` (number): Maximum listed price in store currency.
- `priceMin` (number): Minimum listed price in store currency.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `sort` (string): SKU sort: price, merchandising position, or last scrape.
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com
- `storeVertical` (string): Vertical of the selling store. Example: Apparel
- `tag` (string): Shopify product tag.
- `vendor` (string): Product vendor / supplier name as listed on the storefront.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `product_intel` (~99 tokens)

SKU memo

Build one SKU memo: card, discount vs compare-at, store, SKU change history, and store bestsellers. Pass domain+handle, or q to resolve first.

Input parameters:

- `domain` (string): Optional store hostname without protocol. Example: gruntstyle.com
- `handle` (string): Optional Shopify product handle. Example: classic-hoodie
- `q` (string): Optional free-text query. Example: hoodie or gymshark

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `change_tracker` (~100 tokens)

Change board

Return a full change board: unified feed, all 8 product change types, 5 store change types, and Signals SKU changes if watched. Prefer this over calling each change tool separately.

Input parameters:

- `domain` (string): Optional store hostname without protocol. Example: gruntstyle.com
- `limit` (integer): SKU rows. Max 80.
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `price_watch` (~127 tokens)

Price watch

List price decreases and increases across stores or one merchant. Default minPriceChangePct is 10 — raise it to cut noise.

Input parameters:

- `limit` (integer): Change rows. Max 60.
- `minPriceChangePct` (number): Minimum absolute price-change percent. Default 10.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `assortment_watch` (~112 tokens)

Assortment watch

List new and removed SKUs plus bestseller enter/exit. Filter by storeDomain or productType when the user names a shop or category.

Input parameters:

- `limit` (integer): Assortment rows. Max 50.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_contacts` (~74 tokens)

Store contacts

Return emails, social URLs, and ESP/support app tells for one store. No phone or owner names in this catalog — pass domain or q.

Input parameters:

- `domain` (string): Optional store hostname without protocol. Example: gruntstyle.com
- `q` (string): Optional free-text query. Example: hoodie or gymshark

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `find_outreach` (~161 tokens)

Outreach store list

Filter the 1.37M-store catalog, hydrate each row, and keep stores that have an email or Instagram. Caps at 10 (each costs a call) — country is a filter, not a login region.

Input parameters:

- `appSlug` (string): Shopify app slug. Example: klaviyo-email-marketing
- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `limit` (integer): Max stores to hydrate. Caps at 10 — each costs a catalog call.
- `minVisits` (number): Minimum monthly visits. Example: 10000
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_upstream_health` (~32 tokens)

Catalog health

Return catalog health JSON and whether auth is required. Use when a lookup fails unexpectedly — not for store research.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `search_stores` (~422 tokens)

Search store lists

Filter 1.37M Shopify stores into a list (emails/socials live on the card) or roll them up with groupBy. Without groupBy you get store cards; with groupBy you get breakdown rows, not stores. Country is a filter, not a login region.

Input parameters:

- `appSlug` (string): Shopify app slug. Example: klaviyo-email-marketing
- `category` (string): Store category label from the catalog.
- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `groupBy` (string): Roll rows into a breakdown table instead of store cards.
- `groupBy2` (string): Second breakdown axis. Same values as groupBy. Example: country
- `groupMetric` (string): How to aggregate visits/revenue when groupBy is set.
- `industry` (string): Store industry label from the catalog.
- `isDropshipper` (boolean): If true, only stores the catalog flags as dropship.
- `limit` (integer): Page size. Default 20, max 100.
- `maxRevenue` (number): Maximum modeled monthly revenue in USD. Example: 1000000
- `maxVisits` (number): Maximum monthly visits. Example: 500000
- `minRating` (number): Minimum store or app rating 0–5. Example: 4.2
- `minRevenue` (number): Minimum modeled monthly revenue in USD. Example: 50000
- `minVisits` (number): Minimum monthly visits. Example: 10000
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `order` (string): Sort direction. Default desc.
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `sort` (string): Store list sort. Use stores when groupBy is set.
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store` (~60 tokens)

Get store card

Return one merchant card: traffic, modeled revenue, rating, apps, and socials. Call resolve_store first if you only have a brand name — missing domains stay not_found.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `compare_stores` (~69 tokens)

Compare store cards

Compare 2–8 store cards side by side (traffic, revenue band, apps, rating). Missing domains land in notFound — do not invent the missing rows.

Input parameters:

- `domains` (array, required): 2–8 store hostnames. Example: ["gymshark.com","allbirds.com"]

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store_traffic` (~64 tokens)

Store traffic

Return monthly visits and channel mix for one store. Use after get_store when the user asks how traffic is trending.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `limit` (integer): Monthly traffic points. Max 120.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store_products` (~233 tokens)

Store SKUs

List SKUs for one merchant with price, vendor, type, and bestseller filters. Prefer this over global search_products when you already have a domain.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `isBestSeller` (boolean): If true, only SKUs currently flagged as bestsellers.
- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `order` (string): Sort direction. Default desc.
- `priceMax` (number): Maximum listed price in store currency.
- `priceMin` (number): Minimum listed price in store currency.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `sort` (string): SKU sort: price, merchandising position, or last scrape.
- `tag` (string): Shopify product tag.
- `vendor` (string): Product vendor / supplier name as listed on the storefront.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store_apps` (~50 tokens)

Store app stack

List Shopify apps detected on one merchant. Use compare_stacks when the user wants shared vs exclusive apps across several domains.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store_history` (~69 tokens)

Store history

Return daily snapshots: visits, revenue band, rating, and product counts, up to 365 days. Use for growth charts after get_store.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `limit` (integer): Daily snapshot days. Max 365.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_store_changes` (~127 tokens)

Store observation diffs

List observation diffs for one store: revenue, visits, products, rating, apps. For a mixed product+store board, prefer change_tracker.

Input parameters:

- `changeType` (string): One store observation-diff type.
- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `search_products` (~257 tokens)

Search catalog SKUs

Search SKUs across the 368.9M-product catalog. At least one filter is required. For saturation or who-sells-this-idea, use niche_research.

Input parameters:

- `isBestSeller` (boolean): If true, only SKUs currently flagged as bestsellers.
- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `order` (string): Sort direction. Default desc.
- `priceMax` (number): Maximum listed price in store currency.
- `priceMin` (number): Minimum listed price in store currency.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `sort` (string): SKU sort: price, merchandising position, or last scrape.
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com
- `storeVertical` (string): Vertical of the selling store. Example: Apparel
- `tag` (string): Shopify product tag.
- `vendor` (string): Product vendor / supplier name as listed on the storefront.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_product` (~72 tokens)

Get one SKU

Return one SKU by store domain plus Shopify handle. Use get_store_products or product_search when you do not yet have the handle.

Input parameters:

- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com
- `handle` (string, required): Shopify product handle from the PDP URL. Example: classic-hoodie

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_product_changes` (~166 tokens)

SKU movements

List price, new, removed, position, and bestseller SKU movements. Filter by storeDomain or productType; default noise floor is minPriceChangePct.

Input parameters:

- `changeType` (string): One SKU movement type.
- `limit` (integer): Page size. Default 20, max 100.
- `minPriceChangePct` (number): Minimum absolute price-change percent. Default 10.
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `productType` (string): Shopify product type. Example: T-Shirt or Hoodie
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01
- `storeDomain` (string): Limit to one merchant hostname. Example: gymshark.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_changes` (~105 tokens)

Unified change feed

Return the unified store + product movement feed. Prefer change_tracker when the user wants every change type on one board.

Input parameters:

- `domain` (string): Optional store hostname without protocol. Example: gruntstyle.com
- `entity` (string): Limit the unified change feed to products or stores.
- `limit` (integer): Page size. Default 20, max 100.
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `search_apps` (~191 tokens)

Search Shopify apps

Search the Shopify App Store catalog by name, category, pricing, or rating. Follow a slug with get_app_stores to see which merchants run it.

Input parameters:

- `builtForShopify` (boolean): If true, only Built for Shopify apps.
- `category` (string): Store category label from the catalog.
- `limit` (integer): Page size. Default 20, max 100.
- `minRating` (number): Minimum store or app rating 0–5. Example: 4.2
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `order` (string): Sort direction. Default desc.
- `pricingType` (string): App Store pricing type filter. Example: free or subscription
- `q` (string): Optional free-text query. Example: hoodie or gymshark
- `sort` (string): App catalog sort. Default rating.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_app` (~54 tokens)

Get one app

Return one Shopify app plus an install-base sample. Copy slug from search_apps, then get_app_stores for the merchant list.

Input parameters:

- `slug` (string, required): Shopify App Store slug. Example: klaviyo-email-marketing

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_app_stores` (~99 tokens)

Stores running an app

List merchants observed running a Shopify app, sorted by visits. Use for “who uses Klaviyo?” store lists — country filters live on search_stores, not here.

Input parameters:

- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.
- `slug` (string, required): Shopify App Store slug. Example: klaviyo-email-marketing

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_analytics_overview` (~40 tokens)

Catalog coverage

Return catalog coverage: store/SKU counts, averages, top verticals and countries. Quote these snapshot figures only — do not invent traffic totals.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_verticals` (~90 tokens)

Vertical market size

Return market size by vertical (store counts and averages). Pass countryCode to slice one geo — for a filtered cohort, use search_stores with groupBy=vertical.

Input parameters:

- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `limit` (integer): Page size. Default 20, max 100.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_countries` (~75 tokens)

Country TAM

Return unfiltered geo TAM (store counts by country). Pass vertical to slice one market; a filtered cohort belongs on search_stores groupBy=country.

Input parameters:

- `limit` (integer): Page size. Default 20, max 100.
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_movers` (~168 tokens)

Growing / shrinking stores

List stores growing or shrinking on visits or modeled revenue. Defaults: metric/direction any, minPct 5. Quote catalog movers only.

Input parameters:

- `countryCode` (string): ISO-3166 alpha-2 country filter, not a login region. Example: US, GB, IN
- `direction` (string): Mover direction. Default any.
- `limit` (integer): Page size. Default 20, max 100.
- `metric` (string): Mover metric. Default any.
- `minPct` (number): Minimum percent move for movers. Default 5.
- `since` (string): Inclusive start date YYYY-MM-DD. Example: 2026-08-01
- `vertical` (string): Catalog vertical. Example: Skincare, Apparel, Fashion

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `create_signal` (~91 tokens)

Watch a store (paid)

Paid plans only (trial 403). Create a Signals watch on a competitor domain for ads, units, inventory, and social. Tight watch cap; meters the key. No probe, no scrape.

Input parameters:

- `autoTrack` (string): Signals auto-track mode. bestsellers watches top SKUs; none is the card only.
- `domain` (string, required): Store hostname without protocol. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `list_signals` (~79 tokens)

List Signals watches (paid)

Paid plans only (trial 403). List Signals watches stored on this Neonjelly key. Then GET a domain that is already on Signals — do not advertise this on trial.

Input parameters:

- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal` (~55 tokens)

Signal card (paid)

Paid plans only (trial 403). Return one signal card. id is a Mongo id or a domain already on Signals.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_stats` (~55 tokens)

Signal stats (paid)

Paid plans only (trial 403). Return totals plus store profile for a signal. Domain must already be on Signals.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_sales` (~86 tokens)

Signal daily units (paid)

Paid plans only (trial 403). Return daily units and variants. Needs ≥2 inventory snapshots on the watch — do not invent unit counts.

Input parameters:

- `from` (string): Inclusive start date YYYY-MM-DD.
- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com
- `to` (string): Inclusive end date YYYY-MM-DD.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_inventory` (~55 tokens)

Signal inventory (paid)

Paid plans only (trial 403). Return the stock timeline for a watched store. Domain must already be on Signals.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_social` (~54 tokens)

Signal social (paid)

Paid plans only (trial 403). Return follower snapshots for a watched store. Domain must already be on Signals.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_ads` (~92 tokens)

Signal ads (paid)

Paid plans only (trial 403). Return the ad library or a slice (overview default). No probe — domain must already be on Signals.

Input parameters:

- `days` (integer): Lookback window in days for ad slices. Max 365.
- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com
- `slice` (string): Ad library slice. Default overview.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_apps` (~74 tokens)

Signal apps (paid)

Paid plans only (trial 403). Return apps observed on a tracked store. Set changes=true for app change history.

Input parameters:

- `changes` (boolean): If true, return app change history instead of the current stack.
- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_product_changes` (~57 tokens)

Signal SKU changes (paid)

Paid plans only (trial 403). Return product movements on a tracked store. Catalog-wide SKU moves use get_product_changes.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `get_signal_insights` (~57 tokens)

Signal insights (paid)

Paid plans only (trial 403). Return the insight feed for one watched domain. Prefer this over list_signal_insights.

Input parameters:

- `id` (string, required): Signal Mongo id or a domain already on Signals. Example: gruntstyle.com

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

### `list_signal_insights` (~77 tokens)

Account insight feed (paid)

Paid plans only (trial 403). Account-wide insight feed — often empty unless the key owns watches. Prefer get_signal_insights with a domain already on Signals.

Input parameters:

- `limit` (integer): Page size. Default 20, max 100.
- `offset` (integer): Skip this many rows. Pair with limit to page.

Output parameters:

- `error` (string): Set when the call failed. Example: not_found
- `message` (string): Human-readable error or hint

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp#diagnostics

## Score history

- 2026-09-21: 84
- 2026-09-20: 84
- 2026-09-19: 83
- 2026-09-18: 83
- 2026-09-17: 82
- 2026-09-16: 82
- 2026-09-15: 81
- 2026-09-14: 81
- 2026-09-13: 81
- 2026-09-12: 80
- 2026-09-11: 80
- 2026-09-10: 79
- 2026-09-09: 79
- 2026-09-08: 78
- 2026-09-07: 78
- 2026-09-06: 77
- 2026-09-05: 77
- 2026-09-04: 33
- 2026-09-03: 33

## Common questions

### What is the Neonjelly MCP server?

Neonjelly is an MCP server listed in the public MCP registry as io.neonjelly/mcp. Remote MCP over 1.37M Shopify stores. 14-day trial, 100/day, no account. Paid from $29/mo. This page covers its hosted endpoint (https://mcp.neonjelly.io/c/{connect_token}/mcp).

### Is the Neonjelly MCP server safe to use?

Neonjelly scores 84 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 Neonjelly MCP server expose?

Neonjelly exposes 60 tools: whoami, upgrade, resolve_store, list_playbooks, get_examples, and 55 more. Their descriptions and schemas cost roughly 6,122 tokens of context every time the server is loaded.

### Does the Neonjelly MCP server require authentication?

Yes. Neonjelly 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 Neonjelly MCP server still maintained?

Neonjelly is still listed as active in the MCP registry. We last reached this channel on 21 September 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://mcp.neonjelly.io/c/%7Bconnect_token%7D/mcp
- Repository: https://github.com/germanas/neonjelly-mcp-public
- Website: https://www.neonjelly.io/
- Changelog RSS feed: https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp.json
- HTML version of this page: https://verifymcp.io/servers/io-neonjelly-mcp/c-connect-token-mcp
