Skip to main content
Glama

Onsa

Server Details

Find scored B2B leads, read campaign replies and send approved LinkedIn outreach.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL

TDQS

A4.6/5.0
Disambiguation4/5

Tools are mostly distinct, but several lead-retrieval and search-starting tools overlap in purpose (continue_campaign/find_leads, fetch_leads/get_campaign_leads). The detailed descriptions disambiguate them by ID type and workflow, so confusion is unlikely but the surface has some conceptual adjacency.

Naming Consistency5/5

Names consistently follow a verb_noun pattern (find_leads, fetch_leads, list_campaigns, send_outreach), and related objects share nouns such as 'campaign' and 'leads'. No mixed style or cryptic abbreviations.

Tool Count5/5

13 tools is within the ideal 3-15 range and each covers a distinct stage of the lead generation/outreach workflow, from searching to drafting to sending to review.

Completeness4/5

The surface covers the core campaign and outreach loop well: search, fetch, inspect, stats, memos, drafts, review, and send. Minor gaps exist around campaign lifecycle management (no explicit create/update/delete) and replying directly to prospects, but these may be out of scope.

Available Tools

13 tools
continue_campaignSteer a campaignA
Destructive
Inspect

Say something to the agent inside an EXISTING campaign, and get a jobId to poll with fetch_leads. This is how you grow or steer a cohort instead of forking a new one: "find 5 more like these", "look at Singapore and the Gulf instead of US institutions", "focus on funds over $5bn AuM". Prefer this over find_leads whenever the user means "more of this" or "not quite, adjust" — find_leads always creates a SEPARATE campaign with its own ICP, which splits the funnel and makes the two incomparable. The agent sees the campaign's existing leads and ICP, so you can refer to them. It cannot answer you back through this API, so give instructions, not questions. Two limits worth telling the user about: new leads count against the prospect quota, and de-duplication is per workspace — asking for 5 more can yield fewer if the agent rediscovers people already in this workspace. This does NOT remove or skip leads; saying "drop the bad ones" will not take them out of the cohort or out of the outreach queue.

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesWhat to tell the agent, in plain language, as the user would say it
campaignIdYesCampaign to continue, from list_campaigns or fetch_leads

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYes
campaignIdYes
campaignUrlYes
billingWarningYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds important behavioral details beyond annotations: returns a jobId for polling, cannot answer back, does not remove or skip leads, counts against prospect quota, and de-duplicates per workspace. These align with the destructiveHint annotation without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is quite verbose with multiple caveats and examples, but every sentence carries relevant operational guidance. It could be trimmed slightly, but the structure is logical and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary aspects for correct use: purpose, when to use vs alternatives, expected behavior, limitations (quota, de-dup), and how to handle the asynchronous jobId response. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema provides clear descriptions for both campaignId and message, covering 100% of parameters. The description reinforces message examples but adds little beyond what the schema already states, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States clearly that it sends a message to an agent in an existing campaign and returns a jobId to poll with fetch_leads, distinguishing it from find_leads which creates a new campaign.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to prefer this over find_leads when the user means 'more of this' or 'not quite, adjust', and explains why find_leads is not suitable (creates a separate campaign, splits the funnel).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_leadsFetch search resultsA
Read-onlyIdempotent
Inspect

Get the status/results of a find_leads job by jobId. "pending" means the search is still running (leads may already hold a partial list); "completed" means the agent delivered a batch of leads — it is NOT a guarantee that no more will arrive, so if total is still rising keep polling. A job that never yields leads stays "pending" indefinitely. Also returns total (leads in this response), campaignId (pass it to get_campaign / get_campaign_leads / get_campaign_stats) and campaignUrl — a deep link straight into the prospects tab for this search in Onsa. agentMessage is agent text from this campaign's chat, filtered to what was said AFTER this job started — so it is never a reply that predates your request, but on a campaign with several searches it CAN be a late message from an earlier one. A null value does NOT mean the agent is silent: artifact-only messages carry no text, and an agent that ERRORED writes nothing here at all. Treat null as "no news", apply the 15-minute rule, and never read it as proof it is still working. If it is asking for something and no leads are arriving, STOP POLLING, relay that question to the user, and start a new find_leads with the answer folded into the query; the agent cannot be replied to through this API. Each lead carries name, companyName, linkedInUrl, position, headline, location, industry, companyUrl, email (often null), and — most usefully — score (1–5) and scoreExplanation, the reasoning for why this person matches the ICP.

ParametersJSON Schema
NameRequiredDescriptionDefault
jobIdYesThe jobId returned by find_leads — never invent one
limitNoHow many leads to return (default 100)

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYes
leadsYes
totalYes
statusYes
newLeadsYes
returnedYes
campaignIdYes
campaignUrlYes
agentMessageYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description thoroughly discloses read-only behavior, polling semantics, the meaning of null agentMessage, and the lack of a reply channel. It adds substantial nuance beyond the readOnlyHint and idempotentHint annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is highly informative but verbose, with repeated clarifications about null values, polling, and the agent's inability to be replied to. The opening sentence is clear, but the later paragraphs could be tightened without losing essential guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the asynchronous job lifecycle, response fields, polling logic, error/edge-case handling, and next-step actions such as presenting campaignUrl. Given the output schema exists, this is complete for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already provides 100% coverage for jobId and limit with useful descriptions. The tool description reinforces that jobId must come from find_leads and adds the default limit, providing clear guidance without redundancy.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool fetches status/results for a find_leads job by jobId, distinguishing it from initiating a search (find_leads) and from general campaign lead retrieval. The title and description align well and are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use the tool: to poll a find_leads job, interpret pending/completed states, and stop polling if the agent asks something while no leads arrive. It also instructs to relay the question and start a new find_leads. It does not explicitly contrast with get_campaign_leads, but the context is strong enough for correct selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_leadsFind leadsA
Destructive
Inspect

Start a live B2B lead search with Onsa's AI agent — finds real people (with LinkedIn profiles) matched against your ICP. Pass a natural-language brief (titles, company type, geography, e.g. 'find 5 fintech founders in NYC'). Returns a jobId IMMEDIATELY; the search usually takes 3–10 minutes, so then poll fetch_leads with that jobId until status is "completed". limit is a target the agent aims at, not a cap — expect it to return more, and note that every lead it finds counts against the workspace's prospect quota.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many leads to find (default 5)
queryYesNatural-language lead brief, e.g. 'find 5 fintech founders in NYC'

Output Schema

ParametersJSON Schema
NameRequiredDescription
jobIdYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behavioral traits beyond annotations: it returns a jobId immediately, takes 3–10 minutes, and counts every lead against the workspace's prospect quota. It also clarifies that `limit` is a target, not a hard cap, and the search may return more. The annotations already flag destructiveHint=true and openWorldHint=true, and the description adds concrete context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is informative and front-loaded with the core purpose, then details the async flow and quota nuance. It is slightly verbose but every sentence carries necessary information. The structure is logical: purpose → workflow → parameter caveat. It could be tightened but is not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description covers all essential aspects: the async initiation, the polling contract, the parameter semantics, and the quota impact. It provides enough detail for an agent to correctly call the tool and handle the result without ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both parameters have full schema descriptions (100% coverage), and the description adds important semantic nuance: `limit` is a target the agent aims at, not a strict cap, and `query` is a natural-language brief with an example. This goes beyond the schema and helps the agent craft a correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Start a live B2B lead search') with a clear resource (Onsa's AI agent) and outcome (finds real people with LinkedIn profiles). It explicitly differentiates itself from fetch_leads by naming it as the polling step, and it is distinct from other siblings like get_campaign_leads. The purpose is unambiguous and action-oriented.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use this tool (to initiate a search) and provides a clear follow-up workflow: poll fetch_leads until completion. It does not explicitly list when not to use alternatives, but it names the complementary tool and the async pattern. This is sufficient guidance for an agent to select the right tool among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaignGet campaignA
Read-onlyIdempotent
Inspect

Get one campaign's details: its ICP (the ideal-customer-profile the agent derived and scores leads against), its outreach template, and its settings. The ICP is returned exactly as stored, which is snake_case: perfect_lead and reachable_market are one-line summaries, while company and person hold the rules that actually drive scoring — each is an object with critical and preferential rule lists. product and owner describe the seller. Read company.critical / person.critical before proposing a refinement; the two summary strings are not the criteria. Do not assume any key is present. Also read outreachTemplate to see how much personalization the messages allow: a template whose only placeholders are [FIRST_NAME] / [COMPANY_NAME] produces near-identical mail-merge copy for every lead.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaignIdYesCampaign id from list_campaigns or fetch_leads — never invent one

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
icpYes
tagsYes
titleYes
createdAtYes
updatedAtYes
leadsTotalYes
campaignUrlYes
leadsApproveYes
outreachTemplateYes
outreachAutoApproveYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses exact behavior: the ICP is returned exactly as stored, uses snake_case, warns that keys may be absent ('Do not assume any key is present'), and explains the structure and meaning of fields. This goes beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is wordy but well-organized, front-loading the purpose and then detailing the returned structure and usage notes. Each sentence adds value, though it could be tightened without losing key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema is present but generic, the description compensates by explaining the exact fields, their meanings, and how to interpret them (e.g., identifying the real scoring rules in company.critical). It also flags potential missing keys, making it complete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter campaignId is described with actionable guidance: 'Campaign id from list_campaigns or fetch_leads — never invent one.' This adds clear meaning beyond the schema's type/format constraints, helping the agent select valid input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get one campaign's details' including ICP, outreach template, and settings. It distinguishes from siblings like get_campaign_leads and get_campaign_stats by specifying what data is returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through advice like 'Read company.critical / person.critical before proposing a refinement' and checking outreachTemplate personalization, but it does not explicitly compare with sibling tools or state when to prefer this over alternatives. Usage is more implied than explicitly guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_leadsGet campaign leadsA
Read-onlyIdempotent
Inspect

Read the leads of ANY campaign by campaignId, with the same fields as fetch_leads — including score and scoreExplanation. Use this for a campaign you did not start in this session (fetch_leads only works with a jobId from your own find_leads call), and pass leadIds to resolve the reply buckets from get_campaign_stats back into actual people.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many leads to return (default 50)
leadIdsNoOptional: return only these leads, e.g. positiveLeadIds from get_campaign_stats
campaignIdYesCampaign id from list_campaigns or fetch_leads — never invent one

Output Schema

ParametersJSON Schema
NameRequiredDescription
leadsYes
totalYes
returnedYes
campaignIdYes
campaignUrlYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states 'Read' and is fully consistent with the readOnlyHint and idempotentHint annotations. It adds behavioral context about return fields and the constraint that fetch_leads only works with a jobId from your own find_leads call, though it does not detail auth, rate limits, or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences front-load the core verb and resource, then add targeted usage differentiators and parameter provenance. No filler or redundant wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description gives sufficient context: it describes what is returned (same fields as fetch_leads, including score and scoreExplanation), when to use the tool, and how the parameters connect to sibling tools like get_campaign_stats, list_campaigns, and fetch_leads.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are described with useful semantic context beyond the schema: campaignId must come from list_campaigns or fetch_leads and must never be invented, limit has a documented default of 50, and leadIds is optional with an example (positiveLeadIds from get_campaign_stats).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it reads leads for a given campaignId and explicitly contrasts it with fetch_leads (jobId-specific) and get_campaign_stats (aggregate reply buckets), making the tool's purpose and scope immediately distinguishable from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent when to use this tool (for campaigns not started in this session), when not to use fetch_leads, and how to use leadIds to resolve reply buckets from get_campaign_stats. It also names the correct sources for campaignId (list_campaigns or fetch_leads) and warns never to invent one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign_statsGet campaign funnelA
Read-onlyIdempotent
Inspect

Get the outreach funnel for one campaign: invites sent, invites accepted, messages sent, and replies split into positive / negative / other by sentiment. If the user asks to analyse "LinkedIn reactions" they almost certainly mean the REPLIES people sent — use list_replies for the actual text; this tool only counts them. (Onsa stores no post likes or emoji reactions at all.) LinkedIn and email are merged, as in Onsa's Overview page. These count LEADS, not actions — a lead invited twice counts once — so where a lead was re-invited these read slightly lower than the Overview widget, which counts actions. Say so if the user compares the two. IMPORTANT: invitesSent can EXCEED leadsTotal, and that never means anyone was invited twice — the counters are already de-duplicated by lead. It means a lead who was contacted has since been skipped or deleted: action rows survive that, leadsTotal does not count it. Do not report such a gap as a double invite. Use it to judge which ICP cohort actually earned replies. rates already gives you acceptancePct, replyPct, positivePct and negativePct over the correct denominators — use them rather than doing the arithmetic yourself, and never divide by leadsTotal, which counts every prospect in the cohort including those never contacted. RANK COHORTS ON positivePct, NEVER ON replyPct: a rejection is a reply, so a cohort that provokes people scores high on replyPct while producing nothing. A high replyPct next to a high negativePct means the copy is annoying its audience — say that, do not call it engagement. IMPORTANT LIMIT ON ALL FOUR RATES: they count only replies Onsa has SCORED, so an unscored or still-in-window reply is in none of them and list_replies can legitimately show more replies than these rates imply — quote them as "of the replies Onsa scored", and use list_replies when the question is how many people actually answered. A rate is null when its denominator is 0, meaning nothing was sent, so no rate exists; that is different from the COUNTS above, which are genuinely 0 in that case. Two further caveats worth stating when you report these: the *Scheduled counts are everything queued regardless of date, and sentiment is evaluated once per lead ever, not once per reply. A campaign whose invites were never sent reads as all zeros, which means "not tried yet", not "failed". Counts alone cannot tell the user what to DO: follow this with list_next_steps for the ranked to-do list and list_replies for the words.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaignIdYesCampaign id from list_campaigns or fetch_leads — never invent one

Output Schema

ParametersJSON Schema
NameRequiredDescription
ratesYes
responsesYes
campaignIdYes
leadsTotalYes
campaignUrlYes
invitesSentYes
messagesSentYes
invitesAcceptedYes
invitesScheduledYes
messagesScheduledYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the readOnlyHint and idempotentHint annotations by detailing lead de-duplication, handling of null rates, the fact that scheduled counts include all queued items, and that sentiment is scored once per lead. It also notes potential misinterpretations like invitesSent exceeding leadsTotal and explains why.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries necessary caveats. However, it is structured as a single dense paragraph rather than using bullets or section breaks, making it harder to parse quickly. The front-loading of the core purpose followed by detailed caveats is good, but the wall of text hurts readability slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high complexity of the tool—multiple rates, denominator issues, null handling, and common misinterpretations—the description is exceptionally complete. It covers all edge cases, explains when counts and rates differ, and provides follow-up tool recommendations, leaving no important scenario unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter campaignId is fully described in the schema, and the description adds the crucial guidance to source it from list_campaigns or fetch_leads and never invent one. This contextualizes the parameter beyond its type and format.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Get the outreach funnel for one campaign' and enumerates the exact metrics returned. It distinguishes itself from sibling tools like get_campaign and get_campaign_leads by focusing on counts and rates rather than details, and explicitly contrasts with list_replies.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use and when-not-to-use guidance, including directing users to list_replies for actual reply text and list_next_steps for action items. It warns against using replyPct for ranking and tells the model to interpret high replyPct with high negativePct as annoyed audience, not engagement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_lead_memoGet lead research memoA
Read-onlyIdempotent
Inspect

The research memo Onsa's agent wrote about one lead — usually far richer than scoreExplanation: role history, company size and stage, what they have said publicly, what the angle on them is. THIS IS THE RAW MATERIAL FOR GOOD OUTREACH. Read it before calling rewrite_outreach, and build the message around one specific, checkable fact from it rather than a generic opener. MOST LEADS HAVE NO MEMO — Onsa writes one only for prospects it has researched, so memo: null is the common case, not an error. When it is null, fall back to scoreExplanation and do not invent details.

ParametersJSON Schema
NameRequiredDescriptionDefault
leadIdYesLead to read, from any tool that returns leads

Output Schema

ParametersJSON Schema
NameRequiredDescription
memoYes
nameYes
leadIdYes
companyNameYes
memoWrittenAtYes
scoreExplanationYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the readOnlyHint and idempotentHint annotations by explaining critical runtime behavior: memo: null is normal, not an error, and the memo is usually richer than scoreExplanation. This significantly aids an agent in interpreting results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and mostly efficient, but there is some redundancy in repeating that most leads have no memo and that null is the common case. All content is nonetheless relevant and purposeful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description provides sufficient context for correct invocation: what the tool returns, when null appears, and how to fall back. Combined with the schema and sibling tool list, an agent has everything needed to use this tool effectively without missing information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes leadId with format and required status. The description adds useful sourcing context ('from any tool that returns leads'), going slightly beyond the schema and helping the agent know where to obtain the parameter value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as retrieving the research memo for a single lead, a specific resource distinct from sibling tools like list_campaigns or get_campaign_leads. It also explains the memo's value relative to scoreExplanation, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to read the memo before calling rewrite_outreach, providing direct usage context. It also clarifies that a null memo is the common case and directs fallback to scoreExplanation, giving clear guidance on when and how to handle missing data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaignsList campaignsA
Read-onlyIdempotent
Inspect

List the campaigns (past lead searches) in this workspace that the user takes part in, newest first. Returns the newest limit of them (default 50) — compare returned against total to see whether older campaigns were omitted. Use it to see which ICP cohorts have already been tried before proposing a new one. Each entry has id, title, leadsTotal, hasIcp, tags, createdAt and updatedAt. Pass an id to get_campaign for its ICP, get_campaign_leads for its people, get_campaign_stats for its outreach funnel, list_replies for what prospects wrote back, or list_next_steps for what the campaign still needs a human to do — that last one is the answer when the user asks for recommendations rather than numbers. Note that searches started over MCP may share a generic title, so use the ICP and the dates to tell cohorts apart, not the title alone. A campaign row exists from the moment a search starts, so the NEWEST entry is often still empty (leadsTotal 0) — pick what to analyse by leadsTotal, never by position in the list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many campaigns to return, newest first (default 50)

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
returnedYes
campaignsYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint, idempotentHint), the description explains behavior: results are newest first, limit defaults to 50, returned vs total indicates omitted campaigns, and the newest entry may be empty (leadsTotal 0). This is transparent about what the tool does and does not do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single but somewhat long paragraph. It contains no redundancy and flows logically, but it packs several distinct pieces of advice (use case, key to other tools, title caveat, empty-newest note) into one sentence run. It is still concise enough for the information conveyed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter, the description completely covers what the tool returns (fields listed), how to interpret pagination (returned vs total), common pitfalls (generic titles, empty newest), and relations to sibling tools. Nothing an agent needs to use it effectively is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter limit is fully described in the schema and further clarified in the description ('newest first (default 50)') and the note about comparing returned vs total. The meaning and effect of the parameter are completely clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list', the resource 'campaigns', and the scope 'in this workspace that the user takes part in, newest first'. It also differentiates from sibling tools by explaining that passing an id to get_campaign, get_campaign_leads, etc. provides details for individual campaigns, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool: 'Use it to see which ICP cohorts have already been tried before proposing a new one.' It also directs users to other tools for single-campaign details and warns about generic titles from MCP searches, giving clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_next_stepsWhat to do nextA
Read-onlyIdempotent
Inspect

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. CALL THIS WHENEVER THE USER ASKS FOR RECOMMENDATIONS, ADVICE, NEXT STEPS, OR WHAT TO DO — and alongside get_campaign_stats whenever they ask how a campaign is PERFORMING or what is happening with it, because the funnel gives you numbers and this gives you the actions behind them. It is the question "what should I do about this campaign today". Use it before suggesting new searches — an unworked cohort is almost always worth more than another one. For replies specifically, list_replies is the better source: its awaitingOurReply compares timestamps, while the replied bucket here is only leads whose sentiment was scored and does not know whether you have since answered. Pass any leadIds to get_campaign_leads to see who the people actually are. Honest limits, which you should pass on rather than overstate: Onsa does not record whether you have ALREADY replied, or whether you contacted someone outside Onsa; "replied" only includes replies whose sentiment was scored, so it is a floor; a withdrawn or unreachable invite leaves no trace, so some "never contacted" leads may already have been tried. Sentiment is judged once per lead, not per message. Counts are complete; leadIds are capped at 200.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaignIdYesCampaign to inspect, from list_campaigns or fetch_leads

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes
campaignIdYes
leadsTotalYes
campaignUrlYes
campaignTitleYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description goes well beyond this by disclosing honest limitations: Onsa does not record whether you already replied, 'replied' is a floor because it only includes sentiment-scored replies, withdrawn/unreachable invites leave no trace, sentiment is judged once per lead, and leadIds are capped at 200. This adds substantial behavioral context the agent needs to interpret results correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but densely packed with actionable information. It front-loads the core purpose and usage, then moves to sibling comparisons and limitations. Every sentence earns its place; no fluff. It could be slightly tightened, but the length is justified by the number of edge cases an agent must know to use results correctly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with many caveats and sibling relationships, the description covers everything: what it returns, how to interpret each bucket, when to use it, which alternative to prefer for replies, how to drill into lead IDs, and every known limitation. An output schema exists (not shown but indicated), so return-value format is handled. Nothing an agent needs to call and use it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%—campaignId has a clear description ('Campaign to inspect, from list_campaigns or fetch_leads'). The tool description adds no extra parameter-level meaning; it only mentions leadIds as an output hint for a different tool. With full schema coverage, baseline 3 is appropriate; the description does not need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise statement: a ranked to-do list of what a campaign still needs from a human, and enumerates the exact buckets (replied, accepted-but-never-messaged, drafts, leads found, setup missing). This clearly distinguishes it from siblings like get_campaign_stats (numbers) and list_replies (reply specifics), so an agent can tell them apart without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to call: whenever the user asks for recommendations/advice/next steps, and alongside get_campaign_stats for performance questions. It also gives a strong routing rule—'Use it before suggesting new searches'—and points to list_replies as the better source for replies, with reasoning about timestamp comparison. This is the gold standard for usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pending_outreachList pending outreachA
Read-onlyIdempotent
Inspect

List outreach messages the agent has drafted that are waiting for a human to approve — the "a message for X is ready" queue. Each entry has the draft text plus the lead it is for and why that lead scored as it did. Use it to review drafts in bulk, or to spot copy that reads like a mail-merge before it goes out. Omit campaignId for the whole workspace. This tool does not send anything itself — improve copy with rewrite_outreach (read get_lead_memo first), then queue it with send_outreach once the user has approved that exact text for that exact person.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoHow many drafts to return (default 50)
campaignIdNoLimit to one campaign; omit for every campaign you take part in

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
pendingYes
returnedYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and idempotent. The description adds valuable behavioral context beyond that: it clarifies the tool returns draft text, the lead, and scoring rationale, and explicitly states it does not send messages. No contradiction with annotations; it reinforces them with concrete details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the primary purpose and then provides usage and workflow guidance. Each of the five sentences contributes distinct information: what it lists, what each entry contains, how to use it, a parameter tip, and a clear note on what it does not do. No redundancy or wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (2 optional parameters) and the presence of an output schema, the description fully equips an agent to call it correctly. It covers the review workflow, parameter behavior, and the safe read-only nature, and even suggests reading get_lead_memo before rewriting. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both limit and campaignId have descriptions. The description adds a meaningful semantic hint ('Omit campaignId for the whole workspace') that goes beyond the schema, clarifying the parameter's scope. This extra guidance pushes it slightly above the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists outreach drafts awaiting human approval, using specific verbs ('list', 'review') and a defined resource (the pending-outreach queue). It distinguishes itself from rewrite_outreach and send_outreach by explicitly noting it does not send anything, and the mention of the 'a message for X is ready' queue anchors the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: use for bulk review or spotting mail-merge copy, and gives a complete workflow (read get_lead_memo, rewrite with rewrite_outreach, then send with send_outreach after approval). It also clarifies that omitting campaignId covers the whole workspace, leaving no ambiguity about when and how to invoke the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_repliesRead prospect repliesA
Read-onlyIdempotent
Inspect

THE ACTUAL WORDS people replied with, for every lead in this campaign that answered. get_campaign_stats tells you HOW MANY replied and how Onsa labelled them; this tells you WHAT THEY SAID, which is the only way to work out why a cohort is landing or annoying people. Use it before you draw any conclusion about an ICP from response counts. Each entry carries the outbound message we sent and their reply, so you can read the exchange. sentiment is Onsa's own label and is written ONCE per lead, on their first reply — later replies never change it, and a reply Cogent has not scored yet comes back with sentiment: null, which means UNSCORED, not neutral. Those unscored replies are missing from get_campaign_stats entirely, so this tool can show more replies than the funnel counts. Trust the text over the label.

THREE DERIVED FIELDS, so you do not have to work them out. awaitingOurReply: they spoke last and no sent message followed — this is how you find a reply nobody ever answered, and it is usually the most useful thing here. It is STRUCTURAL ONLY: a flat "no thanks" reads true as well, so check sentiment and the text before you suggest following anyone up. Onsa also sees only what Onsa sent, so it cannot know the user replied by hand in LinkedIn: say "no reply recorded here", never "you ignored them". daysSinceLastReply is elapsed whole days, NOT time-unanswered — it is filled in even where we did answer, so only say "unanswered for N days" when awaitingOurReply is also true. looksLikeBroadcast: their most recent message reached another profile in this campaign word for word, so it is a mass DM rather than an answer — do not count it as engagement. Treat all three as a FLOOR, never a verdict: a blast only one lead received is indistinguishable from a real reply, and two people who send the same long template will both be flagged. Read the text before you trust any of them. Top-level awaitingOurReplyCount spans the whole campaign rather than this page, and leaves out broadcasts and replies scored negative; raise limit if it exceeds returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum replies to return, newest first (default 50)
campaignIdYesCampaign to read replies from

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
returnedYes
campaignIdYes
campaignUrlYes
campaignTitleYes
conversationsYes
awaitingOurReplyCountYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry the safety profile (readOnlyHint=true, idempotentHint=true), and the description adds deep behavioral context beyond them: sentiment is written once per lead and null means UNSCORED not neutral, derived fields are structural-only and must be cross-checked, and the tool can show more replies than the funnel because unscored replies are missing from get_campaign_stats. It even warns about interpretation limits (Onsa cannot see manual LinkedIn replies). This is rich, honest disclosure of data semantics and edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in the opening sentence, and every paragraph earns its place by explaining critical interpretation semantics rather than padding. It is verbose, but the density of non-obvious caveats (derived-field traps, label vs text trust) justifies the length for a tool with subtle data semantics. Slightly more prose than strictly necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema covers return values and annotations cover the safety profile, the description fills every remaining gap: what the tool returns, how to interpret the three derived fields, edge cases (unscored replies, broadcasts, manual replies), and how the data relates to the funnel. Nothing an agent needs to call and interpret this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% — both campaignId and limit are documented in the schema — so the baseline is 3. The description adds real value on top by telling the agent to raise `limit` when awaitingOurReplyCount exceeds `returned`, which is behavioral guidance the schema cannot express. That pushes it above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb-plus-resource statement — 'THE ACTUAL WORDS people replied with, for every lead in this campaign that answered' — and immediately differentiates itself from the sibling get_campaign_stats by stating what that tool does not provide. An agent can distinguish this from the stats/funnel siblings without opening their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names the alternative explicitly ('get_campaign_stats tells you HOW MANY replied') and gives a concrete trigger condition: 'Use it before you draw any conclusion about an ICP from response counts.' It also warns against trusting labels over text. Usage context is fully explicit with no ambiguity about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

rewrite_outreachRewrite outreach draftA
DestructiveIdempotent
Inspect

Replace the text of an outreach draft that is waiting for approval. This is how you fix copy that reads like a mail-merge: get the draft and the lead's scoreExplanation from list_pending_outreach, then write something that names a specific, checkable fact about that person. Do not invent facts — use only what the lead data gives you. The rewritten draft stays in the approval queue; it is not sent by this tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe full replacement message. This same string is called `draftText` when list_pending_outreach returns it, and `confirmText` when you pass it to send_outreach — three names, one set of bytes.
leadIdYesLead whose draft to rewrite, from list_pending_outreach
subjectNoEmail subject. OMIT it to leave the stored subject untouched (do this for LinkedIn, and whenever you are only changing the body); pass null only if you genuinely mean to clear it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
leadIdYes
subjectYes
updatedYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description clearly states the destructive nature ('Replace the text'), confirms idempotence implicitly (rewriting is idempotent), and explicitly notes that the draft 'stays in the approval queue; it is not sent.' It also discloses the behavioral constraint 'Do not invent facts — use only what the lead data gives you,' and clarifies the omit-vs-null semantics for the subject parameter, all beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences (plus parameter descriptions) with no redundant phrasing. The key guidance—what it does, how to use it, and what it doesn't do—is front-loaded in the first sentence, and the rest adds necessary context without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (3 parameters, one optional with nuanced omit-vs-null semantics, and cross-tool naming), the description covers purpose, usage flow, side effects (stays in queue, not sent), behavioral constraints, and parameter semantics. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the descriptions add value beyond the schema. leadId is sourced from list_pending_outreach; text explains that the same string is called draftText and confirmText in other tools (preventing confusion); subject clearly distinguishes between omitting (leave untouched) and passing null (clear it). This cross-referencing and edge-case clarification elevates the parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool's function: 'Replace the text of an outreach draft that is waiting for approval.' The verb 'replace' and resource 'outreach draft' are specific, and it distinguishes itself from siblings like send_outreach (which sends) and list_pending_outreach (which lists) by noting 'it is not sent by this tool.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit guidance on when to use this tool: 'This is how you fix copy that reads like a mail-merge' and instructs the agent to 'get the draft and the lead's scoreExplanation from list_pending_outreach.' It also clarifies when not to use it (not for sending) and provides subject-handling guidance in the parameter description (omit vs. null).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_outreachSend outreach messageA
Destructive
Inspect

Queue an approved outreach draft for sending to a real person on LinkedIn. THIS REACHES A HUMAN. Show the user the exact message AND the recipient, and get their explicit go-ahead for that person, every time — even if they said "send them all". You must pass back both confirmText (character-for-character, not re-typed) and confirmName (the recipient's name), because these drafts are often near-identical between people and matching the body alone does not prove you meant this one. A mismatch refuses without telling you the real text: re-read it with list_pending_outreach. This tool ALSO puts a confirmation dialog in front of the person at the keyboard, quoting the draft as stored — you cannot answer it, and nothing is sent until they do. If they decline or dismiss it, STOP: do not call this again for that lead, ask what they want changed. Note this QUEUES the message — Onsa sends it on its own schedule, subject to daily limits — so report it as queued, not delivered.

ParametersJSON Schema
NameRequiredDescriptionDefault
leadIdYesLead to message, from list_pending_outreach
confirmNameYesThe recipient's name as shown to the user, to prove you meant this person
confirmTextYesThe exact draft text you showed the user and they approved, verbatim

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
leadIdYes
queuedYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description richly discloses side effects: it reaches a human, queues rather than delivers immediately, is subject to daily limits, places a confirmation dialog in front of the user, and refuses mismatches without revealing the actual stored text. These details go far beyond the annotations, which only mark readOnly=false and destructive=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, but it is verbose and repeats safety concepts: showing the message, getting explicit approval, the confirmation dialog, and the queue behavior are each mentioned multiple times. It could be condensed without losing essential safety guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high-stakes nature of sending a human-facing message, the description covers all necessary context: required confirmation, behavior on mismatch, user dialog flow, queue semantics, and daily limits. No critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All three parameters are fully described in the schema, and the description adds crucial semantic detail: confirmText must be exact verbatim, confirmName must match the recipient as shown, and leadId comes from list_pending_outreach. This clarifies usage beyond the basic schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence clearly states the verb and resource: 'Queue an approved outreach draft for sending to a real person on LinkedIn.' It also distinguishes the tool from siblings like rewrite_outreach and list_pending_outreach by focusing on the send action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to use the tool: only after showing the exact message and recipient and receiving explicit user approval. It also states when NOT to call it (after user declines/dismisses the dialog) and directs re-reading with list_pending_outreach on mismatch.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 13 tool updates
    • First observedcontinue_campaign
    • First observedfetch_leads
    • First observedfind_leads
    • First observedget_campaign
    • First observedget_campaign_leads
    • First observedget_campaign_stats
    • First observedget_lead_memo
    • First observedlist_campaigns
    • First observedlist_next_steps
    • First observedlist_pending_outreach
    • First observedlist_replies
    • First observedrewrite_outreach
    • First observedsend_outreach

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables sending LinkedIn messages and invitations, reading conversations, and managing outreach through natural language by automating a real LinkedIn session via a Chrome extension.
    15
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Connects AI assistants to LinkedIn outreach, enabling lead finding, campaign management, messaging, and analytics through natural language.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources