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/mcpA 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.
| Name | Type | Meaning |
|---|---|---|
| q | string | Name or tagline fragment. |
| category | string | Category slug. Call list_taxonomy rather than guessing. |
| model | string | Business-model slug. |
| stack | string | Technology slug. |
| revenue | string | Current monthly-equivalent USD revenue band. Only current USD revenue figures count toward it.under_1k · 1k_10k · 10k_50k · 50k_250k · 250k_plus |
| team | string | solo · small · medium · large |
| funding | string | bootstrapped · angel · venture · other |
| sort | string | newest · likes · revenue · name |
| page | integer | 1-based. Default 1. |
| limit | integer (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.
| Name | Type | Meaning |
|---|---|---|
| slug | stringrequired | The 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.
| Name | Type | Meaning |
|---|---|---|
| page | integer | 1-based. Default 1. |
| limit | integer (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.
| Name | Type | Meaning |
|---|---|---|
| name | stringrequired | |
| website_url | stringrequired | Absolute http(s) URL of the product's own site. |
| description | stringrequired | What the business does, in plain prose. Any figure written here must also appear in claim, or the row is flagged. |
| founders | string[]required | Real people. Never an LLC, a studio, or an App Store seller name. |
| category_slugs | string[] | |
| technology_slugs | string[] | |
| business_model_slugs | string[] | |
| growth_channel_slugs | string[] | |
| claim | object | Optional current monthly revenue. Recorded at low confidence until a reviewer or a payment platform says otherwise. |
| note | string | Context 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.