Build on the same two engines.
Call Omentoo over MCP straight from Claude or Cursor, or as a plain REST request from your backend, CLI, or GitHub Action — the same Pulse themes and weekly Radar opportunities that power the web app. Anonymous synthesis is free; a key unlocks the rest.
Call it over MCP
Omentoo is a remote Model Context Protocol server. Add one URL to Claude, Claude Code, or Cursor and both engines become tools in your chat. synthesize_feedback and status work anonymously (rate-limited); your Pulse, Radar opportunities, and market validation use your om_key. Speaks MCP 2025-11-25 with RFC 9728 auth discovery — no npm package, no local binary.
# Claude Code — add the remote server (anonymous tools work right away)
claude mcp add --transport http omentoo https://omentoo.com/api/mcp
# Add your key to unlock your Pulse, Radar opportunities + market validation
claude mcp add --transport http omentoo https://omentoo.com/api/mcp \
--header "Authorization: Bearer om_..."| Tool | Access | What it does |
|---|---|---|
| synthesize_feedback | Anonymous | Cluster pasted feedback into ranked themes with real quotes. |
| get_pulse | Key | Read your live, revenue-weighted feedback themes (optionally one theme in full). |
| discover_opportunities | Key · Radar | Read this week's ranked Radar recommendations + market opportunities (read-only). |
| validate_against_market | Key | Pressure-test a theme against live market demand, with cited evidence. |
| status | Anonymous | Pre-flight: plan, remaining quota, whether Pulse/Radar have data — no side effects. |
Or use the REST API
Endpoint
https://omentoo.com/api/v1/synthesizeX-Omentoo-Key: om_... header, or as Authorization: Bearer om_.... Body is JSON with a single required feedback string.Request
One required field — feedback, any raw text. Support tickets, churn surveys, sales-call notes, Discord exports, CSV dumps: paste whatever you have.
curl https://omentoo.com/api/v1/synthesize \
-H "X-Omentoo-Key: om_..." \
-H "Content-Type: application/json" \
-d '{
"feedback": "User 1: app crashes on iOS opening attachments\nUser 2: app crashes on iOS, second time this week\nUser 3: SSO is a hard requirement for our org"
}'Response
Returns 200 with a structured synthesis object — themes ranked by mention count, P1–P5 recommendations, and real quotes as evidence. Full TypeScript types ship in the open-source SDK; abbreviated here.
{
"version": "v1",
"model": "anthropic/claude-sonnet-4-6",
"synthesis": {
"headline": "iOS attachment crashes and missing SSO are blocking adoption.",
"themes": [
{
"name": "iOS crashes on attachments",
"summary": "Two users hit the same iOS crash opening attachments...",
"mentionCount": 2,
"severity": "critical",
"sentiment": "frustrated",
"quotes": [
{ "text": "app crashes on iOS when opening attachments", "sourceHint": null },
{ "text": "app crashes on iOS, second time this week", "sourceHint": null }
]
}
// ...
],
"recommendations": [
{
"priority": 1,
"action": "Reproduce and fix the iOS attachment-opening crash",
"rationale": "Two crash reports in one batch — likely many silent ones.",
"effort": "m",
"confidence": "high"
}
// ...
],
"watchlist": [ /* ... */ ],
"meta": {
"totalItemsAnalyzed": 3,
"signalQuality": "thin",
"samplingNote": "Full input analyzed. Sample is small — treat themes as directional."
}
}
}Errors
Every error is JSON with a single human-readable error string, paired with a conventional HTTP status. A transient 503 (inference briefly unavailable) or 500 (synthesis failed) is safe to retry. Nothing is invented — if the signal is too thin to synthesize, you get an honest synthesis back with a low signalQuality, not a guess.
// 400 — bad request
{ "error": "Missing required field: feedback (string)." }
// 401 — missing key
{ "error": "Missing API key. Pass X-Omentoo-Key header or Authorization: Bearer om_..." }
// 401 — key not recognized
{ "error": "Invalid API key." }
// 402 — key belongs to a Free-plan account
{ "error": "API access requires Pro or Team. Upgrade at /app/billing or revoke this key." }
// 413 — input over the per-call character limit
{ "error": "Feedback is 92000 chars; max is 80000." }
// 429 — daily quota exceeded (also sets the X-Pulse-Quota-* headers)
{ "error": "Daily API quota exceeded (100/100 for pro tier). Resets at midnight UTC." }TypeScript / JavaScript
// TypeScript / JavaScript
const res = await fetch("https://omentoo.com/api/v1/synthesize", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Omentoo-Key": process.env.OMENTOO_API_KEY,
},
body: JSON.stringify({
feedback: rawTextFromYourSourceOfChoice,
}),
});
if (res.status === 429) {
console.warn("Daily quota exceeded — resets at midnight UTC");
return;
}
const { synthesis } = await res.json();
console.log(synthesis.headline);
for (const theme of synthesis.themes) {
console.log(`${theme.name} — ${theme.mentionCount} mentions (${theme.severity})`);
}Python
# Python
import os
import requests
resp = requests.post(
"https://omentoo.com/api/v1/synthesize",
headers={
"X-Omentoo-Key": os.environ["OMENTOO_API_KEY"],
"Content-Type": "application/json",
},
json={"feedback": raw_text},
timeout=120,
)
if resp.status_code == 429:
print("Daily quota exceeded")
else:
synthesis = resp.json()["synthesis"]
print(synthesis["headline"])Rate limits & quotas
| Plan | Daily quota | Max input | Approx. monthly value |
|---|---|---|---|
| Free | No API access | — | — |
| Pro | 100 calls / day | 80,000 chars | ~3,000 syntheses / mo |
| Team | 500 calls / day | 80,000 chars | ~15,000 syntheses / mo |
Quota resets at midnight UTC. Every response carries your live quota in two headers:
X-Pulse-Quota-Limit: 100
X-Pulse-Quota-Remaining: 97
Cache-Control: private, no-storeWhat people build with it
- Weekly internal reportsA cron job in your backend pulls support tickets, calls Omentoo, and posts the ranked roadmap to Slack.
- GitHub ActionsRun on every new wave of issues; comment on the highest-mention themes automatically.
- Bring-your-own AI agentYour Cursor or Claude Desktop workflow calls Omentoo to synthesize batched feedback before drafting the roadmap.
- Embedded analysisWire the synthesis straight into your own product (white-label arrangements: email us).
Ready to build with Omentoo?
Anonymous MCP synthesis is free today — add the server and go. API keys, your Pulse and Radar reads, and market validation are on Pro and Team; sign in to set up a key from /app/settings.