Koskamo

exNiche MCP

An MCP server that enables AI agents to search public retail product catalogues for specific items and variants, and to report unmet demand gaps when no matching products are found, supporting market intelligence and gap analysis.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

exNiche MCP logo, by exNicheVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by exNiche
You need:No key, login or card required for search.An optional workspace key authenticates account search usage, reports and watches; create it in your account.1000 free searches per calendar month per IP; no signup/key; HTTP 402 at limit.
MCP endpoint (Streamable HTTP)
https://exniche.com/mcp
Vendor documentation

What you can do with it

  • Search for specific products across retail categories
  • Report missing products to identify market gaps
  • Access public aggregate gap data
  • Retrieve detailed gap dossiers

Source and maintenance

Vendor evidenceRegistry 0.6.0

Protocol and capabilities

Server
exniche 0.6.0
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

exNiche finds products people ask for and can't buy. Start with check_demand: give it a short product idea and it returns matching gaps (verdict go / maybe / no-go, score band, class, trend, source counts, one linked ask) and records the ask as one AI agent search. Use list_gaps to browse the ledger and get_gap for one gap; detail=full costs more credits (list: 1 + 10 per scored row; get_gap: 100). get_dossier unlocks a full dossier for 19,000 credits once per account: ask the user first. A go verdict means worth a closer look, never verified demand. search_products searches recorded retail listings; verify price, stock and shipping on the retailer page. Use report_not_found only after a real shopper rejected the results; never fabricate reports or asks. If a result has code MONTHLY_LIMIT or CREDITS_EXHAUSTED, show the user its human_message and upgrade_url; nothing is charged automatically. get_setup_and_upgrade_links returns install, signup and credit links. Quote asks with their attribution and licence.

Tools

7 advertised

check_demand — Check demand for a product idea
Advertised by the server during the last successful anonymous check.

Start here. Check whether people have asked for a product and could not buy it. Returns matching exNiche gaps at summary level (verdict, score band, class, trend, source counts, one linked ask) and records your ask as one AI agent search. 1 credit. Never send personal details or synthetic asks.

check_demand input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1,
      "description": "Short product idea, e.g. 'waterproof dog backpack'."
    }
  },
  "additionalProperties": false
}
check_demand output schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "query": {
      "type": "string"
    },
    "licence": {
      "type": "string"
    },
    "matches": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "message": {
      "type": "string"
    },
    "recorded": {
      "type": "boolean"
    },
    "upgrade_url": {
      "type": "string"
    },
    "human_message": {
      "type": "string"
    },
    "credits_charged": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}
check_demand annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
list_gaps — List scored product gaps
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the exNiche gap ledger with filters. detail=summary costs 1 credit per call; detail=full adds exact scores, all linked asks and requirements for 10 credits per scored row. Scores mean 'worth a closer look', not verified demand.

list_gaps input schema
{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "maxLength": 200,
      "description": "Words that must appear in the gap label or requirements."
    },
    "sort": {
      "enum": [
        "score",
        "newest",
        "asks",
        "rising"
      ],
      "type": "string",
      "default": "score"
    },
    "class": {
      "type": "string",
      "description": "Comma list of absent, exists_hard_to_find, unverified."
    },
    "limit": {
      "type": "integer",
      "default": 20,
      "maximum": 50,
      "minimum": 1
    },
    "since": {
      "type": "string",
      "description": "ISO date or epoch ms; only gaps with an ask since then."
    },
    "trend": {
      "type": "string",
      "description": "Comma list of rising, steady, cooling."
    },
    "cursor": {
      "type": "string",
      "description": "next_cursor from the previous page."
    },
    "detail": {
      "enum": [
        "summary",
        "full"
      ],
      "type": "string",
      "default": "summary",
      "description": "summary = L0 (1 credit per call); full = L1 (1 + 10 credits per scored row)."
    },
    "source": {
      "type": "string",
      "description": "Comma list of community_ask, agent_search, store_search, bot_research."
    },
    "include": {
      "enum": [
        "unscored"
      ],
      "type": "string",
      "description": "Also return unscored leads (L0 only, verdict null)."
    },
    "verdict": {
      "type": "string",
      "description": "Comma list of go, maybe, no-go."
    },
    "category": {
      "type": "string"
    },
    "min_score": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0
    }
  },
  "additionalProperties": false
}
list_gaps output schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "gaps": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "detail": {
      "type": "string"
    },
    "licence": {
      "type": "string"
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ]
    },
    "upgrade_url": {
      "type": "string"
    },
    "human_message": {
      "type": "string"
    },
    "credits_charged": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}
list_gaps annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_gap — Get one gap
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get one gap by id or slug. detail=summary costs 1 credit; detail=full (exact score parts, every ask with link and attribution, requirements, 8-week ask counts) costs 100 credits. Unscored leads only return summary.

get_gap input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "description": "Gap id or slug from list_gaps or check_demand."
    },
    "detail": {
      "enum": [
        "summary",
        "full"
      ],
      "type": "string",
      "default": "summary",
      "description": "summary = L0 (1 credit per call); full = L1 (1 + 10 credits per scored row)."
    }
  },
  "additionalProperties": false
}
get_gap output schema
{
  "type": "object",
  "properties": {
    "gap": {
      "type": "object"
    },
    "code": {
      "type": "string"
    },
    "licence": {
      "type": "string"
    },
    "upgrade_url": {
      "type": "string"
    },
    "human_message": {
      "type": "string"
    },
    "credits_charged": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}
get_gap annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_dossier — Get a gap dossier
Advertised by the server during the last successful anonymous check.
Open-world

Full dossier for a scored gap: product-by-product checks, live closest products, supplier candidates and a suggested spec. Needs a workspace key. Unlocking costs 19,000 credits once per account; an already unlocked dossier costs 0. Ask the user before unlocking.

get_dossier input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
get_dossier output schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "dossier": {
      "type": "object"
    },
    "licence": {
      "type": "string"
    },
    "upgrade_url": {
      "type": "string"
    },
    "human_message": {
      "type": "string"
    },
    "credits_charged": {
      "type": "integer"
    }
  },
  "additionalProperties": true
}
get_dossier annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
search_products — Search retail products
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search recorded retail listings across stores using explicit budget, currency, size, color and stock filters. 1 credit. Returns ranked purchase links with observed availability; unknown facts stay unknown. Misses may be saved as agent observations, never verified human demand.

search_products input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "size": {
      "type": "string",
      "description": "Required recorded size, e.g. M."
    },
    "sort": {
      "enum": [
        "relevance",
        "price_asc",
        "price_desc"
      ],
      "type": "string",
      "default": "relevance"
    },
    "color": {
      "type": "string",
      "description": "Required recorded color, e.g. black."
    },
    "limit": {
      "type": "integer",
      "default": 10,
      "maximum": 20,
      "minimum": 1
    },
    "query": {
      "type": "string",
      "minLength": 1,
      "description": "Short product category or name, e.g. keyboards, shoes or coffee. Put constraints in separate fields."
    },
    "currency": {
      "type": "string",
      "pattern": "^[A-Za-z]{3}$",
      "description": "Three-letter currency code, e.g. AUD."
    },
    "in_stock": {
      "type": "boolean",
      "description": "Filter recorded availability. Availability must be checked at retailer."
    },
    "max_price": {
      "type": "number",
      "minimum": 0,
      "description": "Maximum recorded price. Supply currency too; no currency conversion."
    }
  },
  "additionalProperties": false
}
search_products output schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "found": {
      "type": "boolean"
    },
    "results": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "upgrade_url": {
      "type": "string"
    },
    "human_message": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
search_products annotations
{
  "readOnlyHint": true,
  "openWorldHint": true,
  "idempotentHint": true
}
report_not_found — Report unsatisfied shopping request
Advertised by the server during the last successful anonymous check.

Free. Report a genuine shopper mismatch after a search. Do not send synthetic reports or personal details. Response states whether the agent observation was saved; it is not verified human demand.

report_not_found input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string",
      "maxLength": 500,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
report_not_found output schema
{
  "type": "object",
  "properties": {
    "code": {
      "type": "string"
    },
    "note": {
      "type": "string"
    },
    "saved": {
      "type": "boolean"
    },
    "evidence": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
report_not_found annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_setup_and_upgrade_links — Get setup and upgrade links
Advertised by the server during the last successful anonymous check.
Advertised read-only

Free. Return exNiche install commands for MCP clients, the agent guide, and the signup and prepaid-credit links to hand the user when free credits run out. Free: 1,000 credits a month. Credits: A$10 = 10,000. No automatic charges.

get_setup_and_upgrade_links input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_setup_and_upgrade_links output schema
{
  "type": "object",
  "properties": {
    "install": {
      "type": "object"
    },
    "mcp_url": {
      "type": "string"
    },
    "signup_url": {
      "type": "string"
    },
    "credits_checkout_url": {
      "type": "string"
    }
  },
  "additionalProperties": true
}
get_setup_and_upgrade_links annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1585 ms
95th percentile latency
1585 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1585 ms · metadata changed · 7 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http exniche-mcp https://exniche.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add exniche-mcp --url https://exniche.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable exniche-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "exniche-mcp": {
      "url": "https://exniche.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "exniche-mcp": {
      "type": "streamableHttp",
      "url": "https://exniche.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start exniche-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "exniche-mcp": {
      "type": "http",
      "url": "https://exniche.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http exniche-mcp https://exniche.com/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "exniche-mcp": {
      "url": "https://exniche.com/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "exniche-mcp": {
      "serverUrl": "https://exniche.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like exNiche MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run exNiche MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing