Marketing
onsa.ai
Facilitates B2B lead generation and campaign management by searching for and scoring leads against ideal-customer profiles.
ENDPOINT 1
https://api.onsa.ai/api/mcp
MCP server metadata
- Name
- ONSA
- Version
- 1.0.0
Onsa finds real, scored B2B sales leads (actual people with LinkedIn profiles) for your workspace, and keeps every search as a "campaign" you can come back to. RUNNING A SEARCH: `find_leads` starts a live search and returns a `jobId` IMMEDIATELY — the search runs in the background and usually takes 3–10 minutes. Poll `fetch_leads` with that `jobId` roughly every 20s. IMPORTANT: `status` flips to "completed" when the agent delivers its FIRST batch of leads, not necessarily its last — if `total` is still rising, keep polling. A search that never delivers leads (the agent asked a question, or failed) reports `status: "stalled"` after about 15 minutes: STOP polling, read `agentMessage` for the reason, tell the user, and either re-run `find_leads` with the answer folded into the query or send them to campaignUrl. `limit` is a target the search agent aims at, not a cap — it often returns more. JUDGING A COHORT: every lead carries `score` (1–5) and `scoreExplanation` — the agent's written reasoning for why this person matches. Use those, not just names, when you assess whether a search found the right people. WRITING OUTREACH THAT IS NOT MAIL-MERGE: `list_pending_outreach` shows drafts awaiting a human. Before improving one, call `get_lead_memo` — Onsa has usually already researched that person, and the memo is far richer than scoreExplanation. Rewrite around ONE specific, checkable fact from it via `rewrite_outreach`, show the user the result, and only then `send_outreach` with their explicit go-ahead. Never invent a fact about a person; if there is no memo, say so and keep the message honest. GROWING OR STEERING A COHORT: use `continue_campaign`, not `find_leads`. "More like these", "try the Gulf instead", "drop the wrong-shaped ones" all belong in the campaign that already exists — `find_leads` would fork a separate campaign with its own ICP and split the funnel. READING WHAT PROSPECTS ACTUALLY SAID: `get_campaign_stats` counts replies and labels them; `list_replies` returns THE REPLY TEXT. Never diagnose a cohort from counts alone — read the replies before you conclude anything about why an ICP is or is not landing. The stored `sentiment` label is written once per lead and unscored replies are missing from the funnel counts entirely, so `list_replies` is both richer and more complete than the stats. RANKING COHORTS: rank on positivePct, never on replyPct. A rejection is a reply, so a cohort that provokes people scores high on replyPct while producing nothing, and a high replyPct beside a high negativePct means the copy is annoying its audience rather than engaging it. Because every rate counts only the replies Onsa has scored, quote them as "of the replies Onsa scored" and use `list_replies` when the question is how many people actually answered. When counts and the Overview page disagree, say why: these count leads, the widget counts actions. DECIDING WHAT TO DO NEXT: when the user asks how a campaign is doing, what is happening with it, or what they should do about it — anything shaped like "analyse my campaigns and recommend something" — call `list_next_steps` for that campaign. It returns the ranked to-do list: people who replied, invites accepted but never messaged, drafts waiting for approval, leads found but never contacted, missing setup. `get_campaign_stats` gives you the funnel and `list_replies` the words, but neither tells you what to DO. An unworked cohort is almost always worth more than another search. COMPARING COHORTS: `list_campaigns` shows every past search, `get_campaign` returns one campaign's ICP and outreach template, `get_campaign_leads` returns its leads (use this rather than fetch_leads for a campaign you did not start in this session), and `get_campaign_stats` returns its outreach funnel (invites sent and accepted, messages sent, positive/negative/other responses). Together these let you compare which ICP actually produced replies and propose a better one. Show each lead's name as a link to its linkedInUrl. Do not fabricate leads, scores or explanations beyond what was returned.
Known tools 13
find_leadsStarts a live B2B lead search with Onsa's agent, matching real people (with LinkedIn profiles) against the workspace's ICP.
Inferred read-onlylist_campaignsLists the campaigns (past lead searches) in this workspace that the user takes part in, newest first.
Inferred read-onlyget_campaignReturns one campaign's ICP - the ideal-customer profile the agent derived and scores leads against - plus its outreach template and settings.
Inferred read-onlyget_campaign_leadsReturns the leads of any campaign by campaignId, with the same fields as fetch_leads, including score and scoreExplanation.
Inferred read-onlycontinue_campaignSends an instruction to the agent inside an existing campaign and returns a jobId to read with fetch_leads.
Inferred read-onlylist_pending_outreachLists outreach messages the agent has drafted that are waiting for a human to approve - the 'a message for X is ready' queue.
Potential side effectsget_lead_memoReturns the research memo Onsa's agent wrote about one lead: role history, company size and stage, what they have said publicly, and the angle on them.
Inferred read-onlyrewrite_outreachReplaces the text of an outreach draft that is waiting for approval.
Inferred read-onlysend_outreachQueues one already-approved outreach draft for delivery to a real person on LinkedIn.
Inferred read-onlylist_repliesReturns the text of what prospects replied, for every lead in the campaign that answered, paired with the outbound message it answers.
Potential side effectslist_next_stepsReturns what this campaign still needs from a human, as a ranked to-do list: people who replied, people who accepted an invite but were never messaged, drafts waiting for approval, leads found but never contacted, and setup that is missing.
Inferred read-onlyget_campaign_statsReturns the outreach funnel for one campaign: invites sent, invites accepted, messages sent, and replies split into positive / negative / other by sentiment.
Inferred read-onlyCONNECT WITH APPROVAL
Client installation
Review this server and its permissions before adding it. Secret placeholders must be set locally.
Codex
~/.codex/config.toml
[mcp_servers.onsa]
url = "https://api.onsa.ai/api/mcp"
enabled = true
Claude Code
.mcp.json
{
"mcpServers": {
"onsa": {
"type": "http",
"url": "https://api.onsa.ai/api/mcp"
}
}
}
Claude Desktop
Settings → Connectors → Add custom connector
Name: onsa
Remote MCP URL: https://api.onsa.ai/api/mcp
Add this remote URL as a custom connector in Claude Desktop. Availability depends on the user plan and workspace policy.
Cursor
.cursor/mcp.json
{
"mcpServers": {
"onsa": {
"url": "https://api.onsa.ai/api/mcp"
}
}
}
Visual Studio Code
.vscode/mcp.json
Add to Visual Studio Code{
"servers": {
"onsa": {
"type": "http",
"url": "https://api.onsa.ai/api/mcp"
}
}
}
Generic MCP
Client-specific MCP configuration
{
"name": "onsa",
"transport": "streamable-http",
"url": "https://api.onsa.ai/api/mcp"
}
MCP Inspector
Run the official MCP Inspector locally and enter the indexed Streamable HTTP endpoint.
TRUST AND VERIFICATION EVIDENCE
Loading Trust v2 evidence…
Checking the associated registrable domain. The BuiltWith key remains server-side.
Evidence is source-attributed and does not guarantee that a third-party server is safe. Risk labels are conservative metadata heuristics.