Skip to main content
Glama
spranab

icantmarket-mcp

by spranab
README.md
# icantmarket-mcp

[![npm](https://img.shields.io/npm/v/icantmarket-mcp)](https://www.npmjs.com/package/icantmarket-mcp)
[![npm downloads](https://img.shields.io/npm/dm/icantmarket-mcp)](https://www.npmjs.com/package/icantmarket-mcp)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)

You shipped the thing and now it sits at zero users, because promoting it is a
different job than building it. icantmarket is a verified help-exchange where
technical founders trade that work with each other — and this server puts it
in the tool you already have open, so asking for help doesn't cost you a
context switch.

MCP server for [icantmarket](https://icantmarket.com) — a verified help-exchange for technical founders. Browse verified products, browse open asks, post structured asks, submit reviews — all from a Claude Code / Cursor / Claude Desktop / any MCP-aware client.

```
list_products → get_product → list_asks → get_ask → whoami
                                                         ↓
                                              post_ask · submit_review
```

## Install

Works with any MCP-compliant client. The canonical run command is `npx -y icantmarket-mcp` over stdio, with `ICANTMARKET_API_TOKEN` exported in the env if you want the write tools.

### Claude Code

```bash
claude mcp add icantmarket --env ICANTMARKET_API_TOKEN=ic_xxx \
  -- npx -y icantmarket-mcp
```

### OpenAI Codex CLI

Add to `~/.codex/config.toml`:

```toml
[mcp_servers.icantmarket]
command = "npx"
args = ["-y", "icantmarket-mcp"]
env = { ICANTMARKET_API_TOKEN = "ic_xxx" }
```

### Cursor / Windsurf / Claude Desktop / Continue.dev / Zed / Cline

Same JSON shape for all of them. Drop into `~/.cursor/mcp.json`, `claude_desktop_config.json`, `~/.continue/config.json`, your Zed `settings.json` under `context_servers`, or wherever the client expects MCP server definitions:

```json
{
  "mcpServers": {
    "icantmarket": {
      "command": "npx",
      "args": ["-y", "icantmarket-mcp"],
      "env": { "ICANTMARKET_API_TOKEN": "ic_xxx" }
    }
  }
}
```

### MCPier

It's in the official catalog:

```bash
pier install icantmarket-mcp
```

## Get a token

Mint at [icantmarket.com/me/api-tokens](https://icantmarket.com/me/api-tokens) (sign in first). Token shape: `ic_<24-byte hex>`. Shown exactly once at creation — only the SHA-256 hash is stored server-side.

Reads (`list_products`, `get_product`, `list_asks`, `get_ask`) work without a token. Writes (`whoami`, `post_ask`, `submit_review`) need one.

## Tools

| Tool | Auth | What it does |
| --- | --- | --- |
| `list_products` | none | Browse L1+ verified active products. Filter by `category`. Paginated. |
| `get_product` | none | One product by slug + count of open asks. |
| `list_asks` | none | Browse open public asks. Filter by `status`, `type`, `product_slug`. |
| `get_ask` | none | One public ask by UUID + product summary. |
| `whoami` | token | Sanity-check the token + return identity. |
| `post_ask` | token | Post a structured ask. Must own the product. |
| `submit_review` | token | Submit a substantive review on someone else's ask. |

## What this is for

When a maker says to their agent:

- *"Post an update ask for my YantrikDB Server v0.8.20 launch."* → agent uses `list_products` to find the slug + UUID, then `post_ask`.
- *"Find me a launch ask in `devtools` I could review."* → agent uses `list_asks?type=launch` and surfaces the results.
- *"Review the open ask on `saga-mcp`."* → agent uses `list_asks?product_slug=saga-mcp` → `get_ask` → `submit_review`.

## What this is NOT for

- **Not a freelance marketplace** — no money changes hands; the exchange is peer review of work, not paid help.
- **Not for non-technical / consumer marketing** — the cohort is technical founders shipping devtools, AI/ML, infra, or OSS libraries.
- **Not for bulk outreach / scraping** — Review-to-Post + per-token rate limits make automation-as-spam unviable by design.
- **Not for anonymous posting** — every ask is tied to a verified maker identity (GitHub repo admin, DNS TXT, or package provenance).
- **Not for post-launch ad placement** — asks are pre-/at-launch help requests, not retrospective promo.

## Anti-gaming the agent should know about

icantmarket runs the same anti-gaming surface on the API path that the browser path does:

- **Hype-word detector** — `revolutionary`, `game-changing`, `best-in-class`, `10x`, etc. on `post_ask` body fields trigger 422. Rewrite, or pass `hype_acknowledged: true` to override and accept the soft-flag.
- **Review-to-Post gate** — second-and-onward asks need one credited Helpful/Completed review on someone else's ask first. `post_ask` returns 422 with the reason if blocked.
- **Self-review block** — `submit_review` rejects reviewing one's own asks.
- **Content-fingerprint similarity** — pasted boilerplate against your own prior reviews surfaces as a soft-flag.
- **Famous-name gate** — claims on famous package/repo names (react, numpy, etc.) go through admin pending_review before they're posted to.
- **Per-token rate limits** — 30/hr for posts and reviews.

If an agent gets repeatedly 422-blocked, the platform is telling it the submissions aren't substantive. Fix the content, not the path.

## Voice constraint

The agent's `post_ask` and `submit_review` content should be:

- factual, concrete, specific
- no marketing voice (no "revolutionary", no "game-changing", no "10x")
- `offer_back` should name something real you can give in return
- `success_criteria` should be measurable — what does the helper's input actually let you do?

## Configuration

Environment variables:

| Variable | Required | Default | Purpose |
| --- | --- | --- | --- |
| `ICANTMARKET_API_TOKEN` | for writes | — | Bearer token from `/me/api-tokens` |
| `ICANTMARKET_BASE_URL` | no | `https://icantmarket.com/api/v1` | Override for staging / self-host |

## Source

- Server: [github.com/spranab/icantmarket-mcp](https://github.com/spranab/icantmarket-mcp)
- Platform: [github.com/spranab/icantmarket](https://github.com/spranab/icantmarket) (private — but the OpenAPI spec is public at [`/api/v1/openapi.json`](https://icantmarket.com/api/v1/openapi.json))
- llms.txt: [icantmarket.com/llms.txt](https://icantmarket.com/llms.txt)

## Related projects

Other MCP servers and agent infrastructure by the same author:

- [saga-mcp](https://github.com/spranab/saga-mcp) — SQLite-backed project
  tracker for AI agents.
- [brainstorm-mcp](https://github.com/spranab/brainstorm-mcp) — multi-model
  debate as an MCP tool.
- [yantrikdb-mcp](https://github.com/yantrikos/yantrikdb-mcp) — persistent
  cognitive memory for Claude Code, Cursor and Windsurf.
- [mcpier](https://github.com/spranab/mcpier) — self-hosted MCP control plane
  that keeps API keys off your clients.
- [truenas-mcp](https://github.com/spranab/truenas-mcp) — 278 TrueNAS SCALE
  actions behind one hierarchical tool.

## License

MIT.

TDQS

A4.1/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource and action: products versus asks versus user identity, and list versus get versus submit/post. Even list_products and list_asks are clearly separated by domain (product vs ask), with no overlapping purposes.

Naming Consistency4/5

The vast majority follow a consistent verb_noun pattern: list_products, get_product, list_asks, get_ask, submit_review, post_ask. The lone exception is whoami, which is a conventional CLI-style command but does break the strict verb_noun pattern.

Tool Count5/5

Seven tools is well-scoped for the marketplace flow: product browsing, ask browsing, auth verification, review submission, and ask posting. Each tool maps to a clear user need without redundancy or bloat.

Completeness4/5

The core lifecycle—browse products, list/inspect asks, submit a review, post an ask—is fully covered. Minor gaps exist such as no tool to view one's own Review-to-Post balance or manage/delete an ask, but these are not required for the primary workflow.

Maintenance

ActivityMaintained
ResponsivenessNo issues