Skip to content

MCP Server

Ponicorn speaks MCP, so an agent can ask it questions directly. Reading needs no key. There is no publish, edit or delete tool — not gated, absent.

Connect

The server is at https://ponicorn.com/mcp, over Streamable HTTP. There is nothing to install and nothing to sign up for.

Claude Code

claude mcp add --transport http ponicorn https://ponicorn.com/mcp

A client that takes a JSON config

{
  "mcpServers": {
    "ponicorn": {
      "type": "http",
      "url": "https://ponicorn.com/mcp"
    }
  }
}

One address wears two hats: a plain GET https://ponicorn.com/mcp in a browser returns this page, and everything else — a POST, or a GET asking for text/event-stream — reaches the server. So a curl that returns HTML has simply not asked for the endpoint yet.

Check it works

The server answers tools/list with no credential, which makes it the fastest way to confirm a connection.

List the tools

curl -X POST https://ponicorn.com/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

The tools

Four reads and one write. They return the same facts, with the same labels, as the JSON API and the pages themselves — one core behind all three, so they cannot disagree.

Read · no key

search_startups

Search published Ponicorn startups: small internet businesses that make money. Narrow by category, business model, stack, monthly revenue band, team size and funding. Every figure comes back with the date it was true, the page it was read from, and whether it is verified. Returns one page; use page for the rest.

Arguments for search_startups
NameTypeMeaning
qstringName or tagline fragment.
categorystringCategory slug. Call list_taxonomy rather than guessing.
modelstringBusiness-model slug.
stackstringTechnology slug.
revenuestringCurrent monthly-equivalent USD revenue band. Only current USD revenue figures count toward it.under_1k · 1k_10k · 10k_50k · 50k_250k · 250k_plus
teamstringsolo · small · medium · large
fundingstringbootstrapped · angel · venture · other
sortstringnewest · likes · revenue · name
pageinteger1-based. Default 1.
limitinteger (1–100)Rows per page. Default 25.

Solo-founder businesses making $10k–$50k a month, biggest first.

Call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_startups",
    "arguments": {
      "revenue": "10k_50k",
      "team": "solo",
      "sort": "revenue",
      "limit": 1
    }
  }
}

Result

{
  "data": [
    {
      "name": "Example",
      "slug": "example",
      "url": "https://ponicorn.com/startups/example",
      "tagline": "What the business does, in one line.",
      "founder": {
        "name": "Ada Lovelace",
        "slug": "ada-lovelace"
      },
      "founder_verified": true,
      "headline_metric": {
        "metric": "mrr",
        "value": 12000,
        "value_text": null,
        "currency": "USD",
        "measured_at": "2026-08-01",
        "period_type": "monthly",
        "evidence_status": "reported",
        "verified_via": null,
        "connected_via": "stripe",
        "confidence": "high",
        "label": "verified",
        "is_current": true,
        "verified_at": "2026-08-03",
        "disputed": false,
        "note": null,
        "source": {
          "url": "https://example.com/six-months-in",
          "title": "Six months in",
          "publisher": "Example Blog",
          "source_type": "founder_post",
          "author": "Ada Lovelace",
          "published_at": "2026-08-01"
        }
      }
    }
  ],
  "page": {
    "number": 1,
    "size": 1,
    "total": 14,
    "pages": 14
  }
}

Read · no key

get_startup

One published startup in full: what it does, its founders, its business model, stack and growth channels, its complete dated figure history, and the source behind every figure. Slugs come from search_startups.

Arguments for get_startup
NameTypeMeaning
slugstringrequiredThe startup's slug, e.g. habitkit.

Everything Ponicorn has on one business, with its sources.

Call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_startup",
    "arguments": {
      "slug": "example"
    }
  }
}

Result

{
  "data": {
    "name": "Example",
    "slug": "example",
    "url": "https://ponicorn.com/startups/example",
    "tagline": "What the business does, in one line.",
    "founder": {
      "name": "Ada Lovelace",
      "slug": "ada-lovelace"
    },
    "founder_verified": true,
    "headline_metric": {
      "metric": "mrr",
      "value": 12000,
      "value_text": null,
      "currency": "USD",
      "measured_at": "2026-08-01",
      "period_type": "monthly",
      "evidence_status": "reported",
      "verified_via": null,
      "connected_via": "stripe",
      "confidence": "high",
      "label": "verified",
      "is_current": true,
      "verified_at": "2026-08-03",
      "disputed": false,
      "note": null,
      "source": {
        "url": "https://example.com/six-months-in",
        "title": "Six months in",
        "publisher": "Example Blog",
        "source_type": "founder_post",
        "author": "Ada Lovelace",
        "published_at": "2026-08-01"
      }
    },
    "description": "A longer paragraph on what the business does and for whom.",
    "founders": [
      {
        "name": "Ada Lovelace",
        "slug": "ada-lovelace",
        "role": "Founder"
      }
    ],
    "categories": [
      {
        "name": "Developer tools",
        "slug": "developer-tools"
      }
    ],
    "technologies": [
      {
        "name": "TypeScript",
        "slug": "typescript"
      }
    ],
    "metrics": [
      {
        "metric": "mrr",
        "value": 12000,
        "value_text": null,
        "currency": "USD",
        "measured_at": "2026-08-01",
        "period_type": "monthly",
        "evidence_status": "reported",
        "verified_via": null,
        "connected_via": "stripe",
        "confidence": "high",
        "label": "verified",
        "is_current": true,
        "verified_at": "2026-08-03",
        "disputed": false,
        "note": null,
        "source": {
          "url": "https://example.com/six-months-in",
          "title": "Six months in",
          "publisher": "Example Blog",
          "source_type": "founder_post",
          "author": "Ada Lovelace",
          "published_at": "2026-08-01"
        }
      }
    ],
    "…": "and the rest of the profile"
  }
}

Read · no key

list_taxonomy

The controlled vocabularies actually used by a published startup — categories, business models, stacks — plus the revenue bands, team-size bands and sort orders. Call this before filtering rather than guessing a slug.

Which slugs can I filter on?

Call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_taxonomy",
    "arguments": {}
  }
}

Result

{
  "data": {
    "categories": [
      {
        "name": "Developer tools",
        "slug": "developer-tools"
      }
    ],
    "business_models": [
      {
        "name": "SaaS",
        "slug": "saas"
      }
    ],
    "technologies": [
      {
        "name": "TypeScript",
        "slug": "typescript"
      }
    ],
    "revenue_bands": [
      {
        "slug": "10k_50k",
        "label": "$10k–$50k / mo",
        "min_monthly_usd": 10000,
        "max_monthly_usd": 50000
      }
    ],
    "team_sizes": [
      {
        "slug": "solo",
        "label": "Solo founder"
      }
    ],
    "sorts": [
      "newest",
      "likes",
      "revenue",
      "name"
    ],
    "…": "and the funding and metric vocabularies"
  }
}

Read · no key

list_milestones

Dated figures founders posted from a profile they claimed, newest first, each already read by a person. One page at a time.

Arguments for list_milestones
NameTypeMeaning
pageinteger1-based. Default 1.
limitinteger (1–100)Rows per page. Default 25.

What have founders posted lately?

Call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_milestones",
    "arguments": {
      "limit": 1
    }
  }
}

Result

{
  "data": [
    {
      "note": "Crossed 12k MRR.",
      "published_at": "2026-08-03T08:00:00.000Z",
      "startup": {
        "name": "Example",
        "slug": "example",
        "url": "https://ponicorn.com/startups/example"
      },
      "metric": {
        "metric": "mrr",
        "value": 12000,
        "value_text": null,
        "currency": "USD",
        "measured_at": "2026-08-01",
        "period_type": "monthly",
        "evidence_status": "reported",
        "verified_via": null,
        "connected_via": "stripe",
        "confidence": "high",
        "label": "verified",
        "is_current": true,
        "verified_at": "2026-08-03",
        "disputed": false,
        "note": null,
        "source": {
          "url": "https://example.com/six-months-in",
          "title": "Six months in",
          "publisher": "Example Blog",
          "source_type": "founder_post",
          "author": "Ada Lovelace",
          "published_at": "2026-08-01"
        }
      }
    }
  ],
  "page": {
    "number": 1,
    "size": 1,
    "total": 41,
    "pages": 41
  }
}

Write · needs a key

submit_startup

File one startup for review. Requires a Ponicorn API key sent as Authorization: Bearer; create one at /dashboard/api-keys. This never publishes: it creates a submission attributed to your account that a person reads before anything appears on the site. Submit a business you built, or one you can point at evidence for. Do not invent figures, quotes or founder details.

Arguments for submit_startup
NameTypeMeaning
namestringrequired
website_urlstringrequiredAbsolute http(s) URL of the product's own site.
descriptionstringrequiredWhat the business does, in plain prose. Any figure written here must also appear in claim, or the row is flagged.
foundersstring[]requiredReal people. Never an LLC, a studio, or an App Store seller name.
category_slugsstring[]
technology_slugsstring[]
business_model_slugsstring[]
growth_channel_slugsstring[]
claimobjectOptional current monthly revenue. Recorded at low confidence until a reviewer or a payment platform says otherwise.
notestringContext for the reviewer. Never shown publicly.

File my business for review. Needs an API key.

Call

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "submit_startup",
    "arguments": {
      "name": "Example",
      "website_url": "https://example.com",
      "description": "What the business does.",
      "founders": [
        "Ada Lovelace"
      ],
      "category_slugs": [
        "developer-tools"
      ],
      "claim": {
        "value": "12000",
        "currency": "USD"
      }
    }
  }
}

Result

{
  "accepted": true,
  "submission_id": 412,
  "status": "pending_review",
  "note": "Filed for review. Publishing is a human decision and this tool cannot do it."
}

Connecting with a key, so submit_startup works

claude mcp add --transport http ponicorn https://ponicorn.com/mcp \
  --header "Authorization: Bearer pon_…"

Keep the key out of browser code. A key in browser JavaScript is a leaked key.

Reading the answers

Every figure carries the date it was true, the page it was read from, and a label of verified or unverified. Quote the label: an unverified figure is a founder’s own statement or an estimate, never a confirmed fact. How figures work explains the rule in full.

One figure, in full

{
  "metric": "mrr",
  "value": 12000,
  "value_text": null,
  "currency": "USD",
  "measured_at": "2026-08-01",
  "period_type": "monthly",
  "evidence_status": "reported",
  "verified_via": null,
  "connected_via": "stripe",
  "confidence": "high",
  "label": "verified",
  "is_current": true,
  "verified_at": "2026-08-03",
  "disputed": false,
  "note": null,
  "source": {
    "url": "https://example.com/six-months-in",
    "title": "Six months in",
    "publisher": "Example Blog",
    "source_type": "founder_post",
    "author": "Ada Lovelace",
    "published_at": "2026-08-01"
  }
}

The server says as much to your client itself: this is the instructions string it returns on initialize.

Ponicorn: small internet businesses that make money, with the source behind every figure. Call list_taxonomy before filtering so you use a slug that exists. Every figure carries measured_at, evidence_status, a label of verified or unverified, and the source it was read from — quote the label and never present an estimate as a confirmed fact. submit_startup needs an API key and files a submission for a person to read; nothing here can publish, edit or delete.

Protocol

Streamable HTTP, stateless: one POST carries one message or one batch and gets one response. No session id is issued and no stream is held open — the specification permits both omissions, and this server has nothing to push. A client that sends Accept: text/event-stream without application/json gets its answer as a single SSE frame.

Protocol version
2025-06-18
Also accepted
2025-03-26 · 2024-11-05
Server
ponicorn 1.0.0
Batch
At most 20 messages a request, in a body under 64 KB.
Origins
Any. A browser-hosted client can reach it.

Limits

Reads are limited to 120 requests a minute per address — the same budget the JSON API spends, because it is the same budget. Writes are limited to 10 a minute per key, 5 a minute per account and 20 submissions a day per account. Over the line, the server answers a JSON-RPC error rather than dropping the connection.

Without a client

/llms.txt lists the site’s pages for a model, /llms-full.txt carries every profile in full, and every public page has a Markdown version at the same URL with .md appended. For a person, /sitemap lists the same ground.