Omentoo for developers · MCP + REST

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
# 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_..."
ToolAccess
synthesize_feedbackAnonymous
get_pulseKey
discover_opportunitiesKey · Radar
validate_against_marketKey
statusAnonymous

Or use the REST API

Get an API key

API access is included with Pro ($39/mo) and Team ($99/mo). Generate keys at /app/settings.

Generate key

Endpoint

POSThttps://omentoo.com/api/v1/synthesize
Auth. Send your key as an X-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
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.

200 · application/json
{
  "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.

error · application/json
// 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
// 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
# 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

PlanDaily quotaMax inputApprox. monthly value
FreeNo API access
Pro100 calls / day80,000 chars~3,000 syntheses / mo
Team500 calls / day80,000 chars~15,000 syntheses / mo

Quota resets at midnight UTC. Every response carries your live quota in two headers:

response headers
X-Pulse-Quota-Limit: 100
X-Pulse-Quota-Remaining: 97
Cache-Control: private, no-store

What 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.

Sign in to get a key