Revenue intelligence for complex B2B growth.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your Andru API key. Optional: without one, your agent can sign you up from the conversation. Or get one at https://platform.andru-ai.com/settings/developer
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Checking whether a company's revenue engine is ready for its next stage: use this when the person wants to score one company's revenue readiness from its operating metrics (for example ARR, net revenue retention, sales cycle). Returns a Revenue Readiness Index (0-100) with stage fit, confidence, and the #1 growth constraint. Pass the metrics you have; more metrics give higher confidence. For every portfolio company at once, use get_portfolio_readiness_rollup. Paid. Check the price with quote before running.
Operating metrics (any subset): arr, mrr, momGrowth or yoyGrowth (%), netRevenueRetention (%), grossMargin (%), monthlyChurn (%), cac, ltv, burnMultiple, customerCount, pipelineValue, salesCycleDays. Percentages as numbers (110 = 110%; 1.1 is read as 110% for retention and margin). The more provided, the higher the confidence.
Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).
Optional label for the company being assessed.
Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.
Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Checking whether a company's revenue engine is ready for its next stage: use this when the person wants to score one company's revenue readiness from its operating metrics (for example ARR, net revenue retention, sales cycle). Returns a Revenue Readiness Index (0-100) with stage fit, confidence, and the #1 growth constraint. Pass the metrics you have; more metrics give higher confidence. For every portfolio company at once, use get_portfolio_readiness_rollup. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| metrics* | object | Operating metrics (any subset): arr, mrr, momGrowth or yoyGrowth (%), netRevenueRetention (%), grossMargin (%), monthlyChurn (%), cac, ltv, burnMultiple, customerCount, pipelineValue, salesCycleDays. Percentages as numbers (110 = 110%; 1.1 is read as 110% for retention and margin). The more provided, the higher the confidence. |
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| companyName | string | Optional label for the company being assessed. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
{
"type": "object",
"required": [
"metrics"
],
"properties": {
"metrics": {
"type": "object",
"description": "Operating metrics (any subset): arr, mrr, momGrowth or yoyGrowth (%), netRevenueRetention (%), grossMargin (%), monthlyChurn (%), cac, ltv, burnMultiple, customerCount, pipelineValue, salesCycleDays. Percentages as numbers (110 = 110%; 1.1 is read as 110% for retention and margin). The more provided, the higher the confidence."
},
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"companyName": {
"type": "string",
"description": "Optional label for the company being assessed."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
}
}
}Before outreach, choosing where to spend time: use this when the person has a list of companies to score or rank against their ICP (up to 50 at once). Returns each company's tier and score, plus totals.
| Argument | Type | Description |
|---|---|---|
| companies* | array | Companies to score (max 50) |
{
"type": "object",
"required": [
"companies"
],
"properties": {
"companies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Company domain"
},
"revenue": {
"type": "string",
"description": "Revenue range"
},
"industry": {
"type": "string",
"description": "Industry vertical"
},
"geography": {
"type": "string",
"description": "HQ location"
},
"techStack": {
"type": "array",
"items": {
"type": "string"
},
"description": "Technologies used"
},
"painPoints": {
"type": "array",
"items": {
"type": "string"
},
"description": "Known pain points"
},
"companyName": {
"type": "string",
"description": "Company name"
},
"employeeCount": {
"type": "number",
"description": "Number of employees"
},
"triggerEvents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Recent trigger events"
}
}
},
"description": "Companies to score (max 50)"
}
}
}Use this after a first conversation, when the person wants one read on whether this buyer is ready: fit score, how well the people involved match the buyers in their ICP, risk flags and a fit check, ending in one call: pursue, proceed with caution, deprioritize, or not a fit today. It doesn't confirm a champion; that takes asking the person. For a quick fit score only, use get_icp_fit_score.
| Argument | Type | Description |
|---|---|---|
| revenue | string | Revenue range |
| industry | string | Industry |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| dealStage | string | Current deal stage |
| dealValue | number | Estimated deal value |
| geography | string | Location |
| techStack | array | Technologies used |
| painPoints | array | Known pain points |
Any step, when no other tool fits: use this when the person asks an open question for one of Andru's domain experts. Gets a domain-scoped answer in natural language (it may call lookup tools; tools that cost money must be called directly). One turn per call; pass prior turns as `history` to continue. Use `module` to pick the expert (e.g. 'market-clarity', 'deal-acceleration', 'due-diligence', 'portfolio-ops'). Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| module* | string | Which domain agent to consult (e.g. 'market-clarity', 'due-diligence', 'portfolio-ops'). |
| history | array | Optional prior turns: [{ role, content }]. At most 10 turns of 2,000 characters each. |
| message* | string | Your question / request for the agent (up to 4,000 characters). |
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
{
"type": "object",
"required": [
"module",
"message"
],
"properties": {
"module": {
"type": "string",
"description": "Which domain agent to consult (e.g. 'market-clarity', 'due-diligence', 'portfolio-ops')."
},
"history": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional prior turns: [{ role, content }]. At most 10 turns of 2,000 characters each."
},
"message": {
"type": "string",
"description": "Your question / request for the agent (up to 4,000 characters)."
},
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
}
}
}Before outreach, finding companies with a reason to change now: use this when the person needs new companies to sell to, for example when their pipeline is thin. Searches the web for real companies showing the problem the person's product solves right now (hiring, launches, funding, expansion) and links the page behind every piece of evidence. Uses the product saved on the account. Takes up to a couple of minutes. Only companies with sourced evidence are returned. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| industry | string | Target industry to search within |
| companyName | string | Your company name. Defaults to the product saved on your account. |
| targetMarket | string | Target market segment (e.g., "Series A SaaS companies") |
| coreCapability | string | The single most important thing your product does — the core capability that makes customers buy |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
Building the material a step needs, often what the champion carries into rooms the person won't be in: use this when the person picked an asset from Andru's catalog (find it with list_assets), e.g. 'Board Presentation', 'Buying Committee Navigation'. Built from everything Andru knows about their company and saved to their Andru library. Takes up to a few minutes: returns a job_id; call get_asset with it to receive the asset as markdown.
| Argument | Type | Description |
|---|---|---|
| asset* | string | The asset name from list_assets. |
| prospectCompany | string | For a prospect asset (Pre-Call Intelligence Brief, Deal Reengagement Strategy, Personalized Cost of Inaction One-Pager): the company it is for. |
| prospectContact | string | For a prospect asset: the person it is for, name and title. |
{
"type": "object",
"required": [
"asset"
],
"properties": {
"asset": {
"type": "string",
"description": "The asset name from list_assets."
},
"prospectCompany": {
"type": "string",
"description": "For a prospect asset (Pre-Call Intelligence Brief, Deal Reengagement Strategy, Personalized Cost of Inaction One-Pager): the company it is for."
},
"prospectContact": {
"type": "string",
"description": "For a prospect asset: the person it is for, name and title."
}
}
}Portfolio oversight: use this when a PE or VC operator wants a written brief on their portfolio companies' go-to-market activity for a period: what Andru's work across the companies found (targets, opportunities, overlaps), each company's public go-to-market news, and the market signals around their buyers, with sources. Not a financial or performance report. Send the companies (name and website, up to 15) or a portfolioId; with neither, Andru suggests the companies on the firm's website for the person to confirm. Takes a few minutes: returns a job_id; call get_asset with it. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| companies | array | The portfolio companies to brief, up to 15. Saved as a portfolio on your account the first time. |
| periodEnd | string | Optional ISO date for the period end. Default: the end of the last full period. |
| periodType | string | Reporting period type. Default quarterly. |
| periodStart | string | Optional ISO date for the period start. Default: the start of the last full period. |
| portfolioId | string | A portfolio already on your account (returned by an earlier brief). With companies, they are added to it. |
| idempotencyKey |
Use this when the person wants a plan for a specific target account. Builds a first map of the buying committee, the opportunities that fit what they sell, the likely champion, what each person needs to hear, and next steps, from sourced research, saved to their Andru account. Treat the committee and champion as a map to confirm with each person. Returns the plan's link with a short summary. A plan for the same company from the last 30 days comes back at once. Takes 1 to 3 minutes: returns a job_id; call get_asset with it. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| refresh | boolean | Build a new plan even if one from the last 30 days exists ($12). Default false. |
| accountName* | string | The company to plan for. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
| productDescription | string | What you sell to this account, if different from the product saved in Andru (a sentence or two). |
Collecting what Andru built for a step: use this when the person asks whether something Andru started is done: an asset from generate_asset, a brief from generate_portfolio_brief, or an account plan from get_account_plan. While it is building you get its progress; when it is done you get the asset or brief in full as markdown, or the plan's link and summary (all saved to their Andru account).
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The job_id returned by generate_asset, generate_portfolio_brief or get_account_plan. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "The job_id returned by generate_asset, generate_portfolio_brief or get_account_plan."
}
}
}Use this when a buyer is weighing another option, or the person asks how they compare with a named alternative. Treats it as diligence for the buyer: where the alternative fits this buyer better, where the person's product does, and questions that help the buyer decide for themselves. Grounded in the account's ICP.
| Argument | Type | Description |
|---|---|---|
| context | string | Additional context (e.g., "enterprise deal", "competing on price") |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| competitorName* | string | The alternative the buyer is weighing (a product or company). |
| competitorFeatures | array | What that alternative offers, as you know it. |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
Use this when a deal has stalled or the person wonders whether this buyer is ready for them. Checks the company against the account's ICP and the profile of companies that aren't a fit, and returns one of four fit levels with the reasons. When the answer is no, help the person tell the buyer kindly who fits them better today.
| Argument | Type | Description |
|---|---|---|
| revenue | string | Revenue range |
| industry | string | Industry |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| geography | string | Location |
| techStack | array | Technologies they use |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| companyName | string | Company name to check |
After discovery, checking what the buyer said they need against what the person offers: use this when the person knows what a buyer needs and wants to see how well their product matches. Pass the buyer's `buyerPainPoints` and `requiredCapabilities`. Returns 0-100 for pain coverage, outcome clarity, capability fit and 3 more dimensions, plus an overall score. To check whether a company is a fit at all, use get_icp_fit_score.
| Argument | Type | Description |
|---|---|---|
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| buyerSize | string | Buyer company size |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| buyerIndustry | string | Buyer's industry |
| buyerPainPoints | array | Pain points the buyer has expressed or you expect them to have |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
The context behind every step: use this when the person asks what Andru knows about them or their company. Returns their profile, product, and memory grouped as What I Know, Patterns I've Noticed and How You Operate.
No arguments.
{
"type": "object",
"properties": {}
}Use this when the person asks whether one company is a good fit, before they reach out or spend more time. Scores it in seconds against the account's ICP on 5 dimensions (company profile, tech stack, pain, budget fit, buying signals) and returns an A–D tier with the reason behind each score. For many companies at once, use batch_fit_score.
| Argument | Type | Description |
|---|---|---|
| domain | string | Company website domain |
| revenue | string | Revenue range (e.g., "$1M-$5M") |
| industry | string | Industry vertical |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| geography | string | HQ location |
| techStack | array | Technologies the company uses |
| painPoints | array | Known pain points or challenges they face |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
Use this when the person asks who their ideal customer is, who isn't a fit, or needs to explain who buys from them and why. Returns the account's ICP, built from what they sell: the buyers who decide, what each one is measured on and the concerns each needs answered, the signals that a company is ready to change, and who isn't a fit. If the first ICP is still being built, it says so; ask again in a minute.
No arguments.
{
"type": "object",
"properties": {}
}Use this when the person asks what's changing in their market or their buyers' markets, or needs a reason a buyer might act now. Returns relevance-ranked signals (trends, buyer pain, moves by the alternatives buyers weigh, regulatory and tech shifts, hiring and funding), each with its impact on buyers and a recommended action. Signals come from Market Pulse; if the account has no Market Pulse yet, it says so.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max signals (1–25). Default 10. |
| industry | string | Optional industry/vertical filter. |
| signalType | string | Optional filter to one signal category. |
| windowDays | number | Look-back window in days (1–30). Default 7. |
| minRelevance | number | Minimum relevance 0–1. Default 0.5. |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max signals (1–25). Default 10."
},
"industry": {
"type": "string",
"description": "Optional industry/vertical filter."
},
"signalType": {
"enum": [
"market_trend",
"buyer_pain",
"competitor_move",
"regulatory",
"technology_shift",
"hiring_trend",
"funding_landscape"
],
"type": "string",
"description": "Optional filter to one signal category."
},
"windowDays": {
"type": "number",
"description": "Look-back window in days (1–30). Default 7."
},
"minRelevance": {
"type": "number",
"description": "Minimum relevance 0–1. Default 0.5."
}
}
}Use this when the person asks how one saved metric, deal stage or priority changed over time, such as "What was my MRR 3 months ago?" or "When did my biggest deal move into procurement?".
| Argument | Type | Description |
|---|---|---|
| key* | string | Memory key (e.g., "mrr", "acme_deal_stage"). |
| category* | string | Memory category (e.g., "metric", "account"). |
{
"type": "object",
"required": [
"category",
"key"
],
"properties": {
"key": {
"type": "string",
"description": "Memory key (e.g., \"mrr\", \"acme_deal_stage\")."
},
"category": {
"type": "string",
"description": "Memory category (e.g., \"metric\", \"account\")."
}
}
}Use this when the person needs to put their story in one buyer's terms: a first note to an executive about what they could change, or the same point for the CFO and the IT lead. Returns what that buyer responds to, the problem in their words, and the concerns they need answered, for a channel and funnel stage. Built from the account's ICP. To learn who the buyer is, use get_persona_profile; to prepare for one specific meeting, use get_pre_brief.
| Argument | Type | Description |
|---|---|---|
| stage | string | Where the buyer is in their journey |
| channel | string | Channel (email, linkedin, phone, etc.) |
| segment | string | Target segment or vertical |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| personaType | string | Target buyer title |
| productDescription |
Use this when the person asks what a specific buyer role cares about (a CFO, a VP of Operations) or why that person isn't responding. Returns Andru's starting picture of that buyer from the account's ICP: what they're measured on, what worries them, the concerns they need answered before they say yes, and what they need to hear. Treat it as something to confirm with the real person, not a conclusion. To prepare for one specific meeting, use get_pre_brief.
| Argument | Type | Description |
|---|---|---|
| title* | string | Job title of the person you're meeting (e.g., "VP Engineering", "CTO", "Head of Sales") |
| industry | string | Their industry |
| vertical | string | The industry the user sells into (e.g., "fintech", "healthcare", "defense"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask. |
| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| companySize | string | Their company size range |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
Portfolio oversight: use this when a PE or VC operator wants a scorecard across all their portfolio companies, or asks which company is most at risk. Returns each company's Revenue Readiness Index, comparable across companies, with the average, the at-risk count and customer-concentration risk. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| portfolioId* | string | The portfolio to roll up. whoami lists yours with their ids. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
{
"type": "object",
"required": [
"portfolioId"
],
"properties": {
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"portfolioId": {
"type": "string",
"description": "The portfolio to roll up. whoami lists yours with their ids."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
}
}
}Use this when the person has a specific upcoming meeting or call and wants to be ready for it. This is the default for "prepare me for my call". Returns a short brief: what the meeting is for and what each person in the room likely thinks going in (what they want, the concerns they need answered, what moves them, and where they'll disagree), built from the account's buying committee and labelled as Andru's assumptions to correct. Send the meeting (from their calendar, or described in a sentence), what kind of meeting it is, and who will be there by title. If you leave out who's in the room, Andru answers with the six buyers to choose from. To talk with the buyers before the meeting, use simulate_buyer_persona with the same brief.
| Argument | Type | Description |
|---|---|---|
| room | array | Who will be there: up to 8 people, each with their title and, if you know it, which of the six buyers they are. |
| stage | integer | Where the deal is, by the last thing the buyer did (required for a deal meeting). |
| meeting | string | The meeting in a sentence if it isn't on their calendar, e.g. 'pricing call with the company's VP of Finance and their IT lead'. |
| meetingId | string | The meeting from the person's calendar (an id from a previous reply). Leave it out and describe the meeting in `meeting` instead. |
| situation | string | What kind of meeting: a discovery call, where they speak first; a deal meeting (demo, pricing, pilot, procurement); or a customer review. |
| companyName | string |
Learning from every deal: use this when the person asks what they decided, learned or recorded before: metrics, deal patterns, account history, decisions and habits Andru has saved. Filter by category, key pattern or memory type.
| Argument | Type | Description |
|---|---|---|
| category | string | Filter to a specific memory category. Omit to search all. |
| keyPattern | string | Filter keys matching this pattern (supports * wildcards, e.g., "*mrr*", "acme_*"). |
| memoryType | string | Filter by memory type. episodic=specific facts, semantic=patterns, procedural=behavioral habits. |
{
"type": "object",
"properties": {
"category": {
"enum": [
"metric",
"account",
"priority",
"preference",
"decision",
"deadline"
],
"type": "string",
"description": "Filter to a specific memory category. Omit to search all."
},
"keyPattern": {
"type": "string",
"description": "Filter keys matching this pattern (supports * wildcards, e.g., \"*mrr*\", \"acme_*\")."
},
"memoryType": {
"enum": [
"episodic",
"semantic",
"procedural"
],
"type": "string",
"description": "Filter by memory type. episodic=specific facts, semantic=patterns, procedural=behavioral habits."
}
}
}When the founder is ready to hand the path they've proven to a first seller: use this when the person is planning a sales hire: what role, how to pay it, how to interview for it, or how to ramp the new hire. Returns a job description, comp structure, interview questions that reveal sales ability, a 90-day ramp plan and weekly activity targets tied to their ARR goal. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| dealSize | string | Average deal size (e.g., "$15K ACV", "$50K ACV"). Infer from context or ask. |
| teamSize | number | Current team size. Infer from context if mentioned. |
| arrTarget* | string | Annual recurring revenue target (e.g., "$2M", "$5M", "$10M"). Ask the user if not mentioned. |
| companyStage* | string | Current funding stage. Infer from conversation context if the user has mentioned it. |
| avgCycleLength | string | Average sales cycle length (e.g., "30 days", "60 days", "90+ days"). Infer or ask. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
Fundraising, not selling: use this when the person is raising money and asks which investors to talk to. Finds up to 3 VC firms investing now in companies like theirs, each with a recent deal or stated focus and a link to the page it came from (a live web search, about 30 seconds). Only firms with sourced evidence are returned. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| stage* | string | Current funding stage. Infer from context if mentioned. |
| quoteId | string | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| arrRange | string | Current ARR range (e.g., "$0-$500K", "$500K-$2M", "$2M-$10M"). Infer or ask. |
| vertical | string | Industry vertical (e.g., "AI/ML", "FinTech", "HealthTech", "SaaS"). Infer from product description. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
| productDescription* | string | What the company does and who it serves. Infer from conversation context if the user has already described their product. |
Use this when the person needs a deliverable, often something their champion will carry into meetings the person won't be in (a business case for the CFO, an email draft, a board deck), or asks what Andru can make. Searches Andru's catalog of 139 sales, hiring, fundraising and buying assets. Each entry says what it is, the business outcome, its price, whether it needs the person's own data, and whether it can be generated today. Then call generate_asset with the asset's name.
| Argument | Type | Description |
|---|---|---|
| group | string | Optional catalog group. |
| limit | number | Maximum results (default 15). |
| query | string | Keywords for what you need, e.g. 'board deck', 'buying committee', 'first sales hire'. |
| available_only | boolean | Only assets that can be generated today. |
{
"type": "object",
"properties": {
"group": {
"enum": [
"Core",
"Advanced",
"Strategic",
"Buy-side"
],
"type": "string",
"description": "Optional catalog group."
},
"limit": {
"type": "number",
"description": "Maximum results (default 15)."
},
"query": {
"type": "string",
"description": "Keywords for what you need, e.g. 'board deck', 'buying committee', 'first sales hire'."
},
"available_only": {
"type": "boolean",
"description": "Only assets that can be generated today."
}
}
}Writing down what each deal taught: use this when the person asks you to remember something about their revenue: a deal decision, a reason a deal was won or lost, an ICP refinement, a metric update or a strategic pivot. Saving an existing key keeps the previous value in its history.
| Argument | Type | Description |
|---|---|---|
| key* | string | Unique identifier for this memory (lowercase_underscored, e.g., "current_arr", "acme_deal_stage"). |
| value* | string | The memory content — a concise, specific fact or insight. |
| domain | string | Business domain this memory relates to. Default: general. |
| category* | string | What kind of memory this is. |
| confidence | number | How confident this memory is (0.0-1.0). Default: 1.0 for founder-stated facts. |
| memoryType | string | episodic=time-bound fact, semantic=general pattern, procedural=behavioral habit. Default: episodic. |
{
"type": "object",
"required": [
"category",
"key",
"value"
],
"properties": {
"key": {
"type": "string",
"description": "Unique identifier for this memory (lowercase_underscored, e.g., \"current_arr\", \"acme_deal_stage\")."
},
"value": {
"type": "string",
"description": "The memory content — a concise, specific fact or insight."
},
"domain": {
"enum": [
"revenue",
"product",
"team",
"investor",
"market",
"general"
],
"type": "string",
"description": "Business domain this memory relates to. Default: general."
},
"category": {
"enum": [
"metric",
"account",
"priority",
"preference",
"decision",
"deadline"
],
"type": "string",
"description": "What kind of memory this is."
},
"confidence": {
"type": "number",
"description": "How confident this memory is (0.0-1.0). Default: 1.0 for founder-stated facts."
},
"memoryType": {
"enum": [
"episodic",
"semantic",
"procedural"
],
"type": "string",
"description": "episodic=time-bound fact, semantic=general pattern, procedural=behavioral habit. Default: episodic."
}
}
}Before any outreach: use this when the person wants to see how a company's website reads to the buyers it wants, before they have an Andru account. Returns who the company sells to, the buyers who decide, and what the site says versus what those buyers need to hear. Send the website. No account needed. Takes about a minute: you get a preview_id; call again with it to collect the read. If the person signs up with signup_start and this preview_id, the read becomes their first ICP.
| Argument | Type | Description |
|---|---|---|
| website | string | The company's website, e.g. acme.com. |
| previewId | string | From an earlier call, to collect the read. |
{
"type": "object",
"properties": {
"website": {
"type": "string",
"description": "The company's website, e.g. acme.com."
},
"previewId": {
"type": "string",
"description": "From an earlier call, to collect the read."
}
}
}Before spending on the person's behalf: use this when the person asks what a call would cost, or before running a paid tool. Send the tool name and its arguments. Returns the price, whether today's free calls cover it, the wallet balance, how much this key can still spend without asking, and a quote_id that holds the price for 30 minutes. Pass quote_id with the call to pay the quoted price.
| Argument | Type | Description |
|---|---|---|
| tool* | string | The tool you plan to call, e.g. get_pre_brief. |
| arguments | object | The arguments you plan to send with it. |
{
"type": "object",
"required": [
"tool"
],
"properties": {
"tool": {
"type": "string",
"description": "The tool you plan to call, e.g. get_pre_brief."
},
"arguments": {
"type": "object",
"description": "The arguments you plan to send with it."
}
}
}Use this when the person tells you what they sell, or Andru doesn't know their product yet. Send their company website (Andru reads it and remembers the product) or a short product description, once. Andru turns it into a product description and, from that, their first ICP: who fits and who doesn't (about 3 minutes). Every later call uses it. Call with no arguments to see what Andru has saved.
| Argument | Type | Description |
|---|---|---|
| website | string | Your company website, e.g. acme.com. Andru reads the homepage once. |
| vertical | string | Optional: the industry you sell into. |
| targetRole | string | Optional: the buyer role you target, e.g. CFO. |
| productDescription | string | Or: what your product does and who it is for (2-3 sentences). |
{
"type": "object",
"properties": {
"website": {
"type": "string",
"description": "Your company website, e.g. acme.com. Andru reads the homepage once."
},
"vertical": {
"type": "string",
"description": "Optional: the industry you sell into."
},
"targetRole": {
"type": "string",
"description": "Optional: the buyer role you target, e.g. CFO."
},
"productDescription": {
"type": "string",
"description": "Or: what your product does and who it is for (2-3 sentences)."
}
}
}Getting set up: use this when the person asks to sign up for or sign in to Andru from here. Send their email. Andru emails them a 6-digit code and an Approve button. If they read you the code, call signup_verify. If they tap Approve, call signup_status with the request_id until it returns your key. They also choose how much you can spend without asking them; it starts at nothing beyond the daily free calls.
| Argument | Type | Description |
|---|---|---|
| email* | string | The person's email. The code goes here. |
| website | string | Optional: their company website, e.g. acme.com. Andru reads it so its answers are about what they sell. |
| foundVia | string | Optional: how the person or their agent found Andru: moltbook, a2a_directory, mcp_registry (includes Smithery), npm, search, ai_assistant, person or other. Other text is kept as written. |
| agentName | string | Optional: your agent's name. The key is named after it. |
| previewId | string | Optional: from preview_company. The read becomes their first ICP. |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "The person's email. The code goes here."
},
"website": {
"type": "string",
"description": "Optional: their company website, e.g. acme.com. Andru reads it so its answers are about what they sell."
},
"foundVia": {
"type": "string",
"description": "Optional: how the person or their agent found Andru: moltbook, a2a_directory, mcp_registry (includes Smithery), npm, search, ai_assistant, person or other. Other text is kept as written."
},
"agentName": {
"type": "string",
"description": "Optional: your agent's name. The key is named after it."
},
"previewId": {
"type": "string",
"description": "Optional: from preview_company. The read becomes their first ICP."
}
}
}Getting set up: use this after signup_start when the person approves by tapping the button in their email instead of reading you a code. Send the request_id. Returns "waiting" (ask again after the number of seconds it gives), your API key once they approve (shown once; save it), or "expired".
| Argument | Type | Description |
|---|---|---|
| requestId* | string | The request_id from signup_start. |
{
"type": "object",
"required": [
"requestId"
],
"properties": {
"requestId": {
"type": "string",
"description": "The request_id from signup_start."
}
}
}Getting set up: use this after signup_start when the person reads you the 6-digit code from their email. Send the email and the code. Returns an Andru API key for this agent.
| Argument | Type | Description |
|---|---|---|
| code* | string | The 6-digit code from the email. |
| email* | string | The email the code was sent to. |
| foundVia | string | Optional: how the person or their agent found Andru: moltbook, a2a_directory, mcp_registry (includes Smithery), npm, search, ai_assistant, person or other. Other text is kept as written. |
| agentName | string | Optional: your agent's name. The key is named after it. |
{
"type": "object",
"required": [
"email",
"code"
],
"properties": {
"code": {
"type": "string",
"description": "The 6-digit code from the email."
},
"email": {
"type": "string",
"description": "The email the code was sent to."
},
"foundVia": {
"type": "string",
"description": "Optional: how the person or their agent found Andru: moltbook, a2a_directory, mcp_registry (includes Smithery), npm, search, ai_assistant, person or other. Other text is kept as written."
},
"agentName": {
"type": "string",
"description": "Optional: your agent's name. The key is named after it."
}
}
}Use this only when the person asks to talk with, or play out the meeting with, the buyers who'll be in the room. Andru writes a brief of what each person likely thinks going in (10 briefs a day), then plays them, one or several at once, in a Deal Prep session of 25 turns, asking what real buyers ask. Say "End role-play. How did I do?" for a scored debrief and what to take into the meeting. For the written brief alone, use get_pre_brief; it writes the same brief this session starts from. Paid. Check the price with quote before running.
| Argument | Type | Description |
|---|---|---|
| mode | string | meetings = the user's calendar meetings in the next 7 days (free). brief = the free brief for a meeting (10 a day). opening = open a session ($5) from a brief_id, or with one buyer. reply = the founder's next message; speaker picks who answers. list = the user's six buyers (free). |
| room | array | Who's in the room, 1–8 people, each with persona (one of the six buyers) and an optional title and name. |
| stage | number | The deal's stage, 0–7. |
| meeting | string | The meeting in a sentence, when it isn't on the calendar. |
| message | string | mode=reply: what the seller says to the buyer. "End role-play. How did I do?" ends with a debrief. |
| persona | string | Which of the user's six buyers to simulate (mode=list shows them, from their buying committee). Pick based on who the user is preparing to meet. |
Before spending on the person's behalf: use this when the person asks what this key or connection can spend, or how much is left. Returns the account, the key's name, how much it can spend today and this month without asking, the wallet balance, and free calls left today, and the portfolios this account can see, each with its id.
No arguments.
{
"type": "object",
"properties": {}
}| targetRole | string | The buyer role being evaluated (e.g., "CFO", "CTO", "VP Sales"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical. |
| companyName* | string | Company name |
| contactTitle | string | Primary contact job title |
| employeeCount | number | Number of employees |
| triggerEvents | array | Trigger events |
| championIdentified | boolean | Has a champion been identified? |
| competitorInvolved | string | Known competitor in the deal |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
{
"type": "object",
"required": [
"companyName"
],
"properties": {
"revenue": {
"type": "string",
"description": "Revenue range"
},
"industry": {
"type": "string",
"description": "Industry"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"dealStage": {
"type": "string",
"description": "Current deal stage"
},
"dealValue": {
"type": "number",
"description": "Estimated deal value"
},
"geography": {
"type": "string",
"description": "Location"
},
"techStack": {
"type": "array",
"items": {
"type": "string"
},
"description": "Technologies used"
},
"painPoints": {
"type": "array",
"items": {
"type": "string"
},
"description": "Known pain points"
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"companyName": {
"type": "string",
"description": "Company name"
},
"contactTitle": {
"type": "string",
"description": "Primary contact job title"
},
"employeeCount": {
"type": "number",
"description": "Number of employees"
},
"triggerEvents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Trigger events"
},
"championIdentified": {
"type": "boolean",
"description": "Has a champion been identified?"
},
"competitorInvolved": {
"type": "string",
"description": "Known competitor in the deal"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}| productDescription | string | What your product does and who it's for. Defaults to the product saved on your account. |
{
"type": "object",
"properties": {
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"industry": {
"type": "string",
"description": "Target industry to search within"
},
"companyName": {
"type": "string",
"description": "Your company name. Defaults to the product saved on your account."
},
"targetMarket": {
"type": "string",
"description": "Target market segment (e.g., \"Series A SaaS companies\")"
},
"coreCapability": {
"type": "string",
"description": "The single most important thing your product does — the core capability that makes customers buy"
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
},
"productDescription": {
"type": "string",
"description": "What your product does and who it's for. Defaults to the product saved on your account."
}
}
}| string |
| Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
{
"type": "object",
"properties": {
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"companies": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"website": {
"type": "string",
"description": "e.g. example.com; tells companies with similar names apart."
}
}
},
"maxItems": 15,
"description": "The portfolio companies to brief, up to 15. Saved as a portfolio on your account the first time."
},
"periodEnd": {
"type": "string",
"description": "Optional ISO date for the period end. Default: the end of the last full period."
},
"periodType": {
"enum": [
"quarterly",
"monthly",
"annual"
],
"type": "string",
"description": "Reporting period type. Default quarterly."
},
"periodStart": {
"type": "string",
"description": "Optional ISO date for the period start. Default: the start of the last full period."
},
"portfolioId": {
"type": "string",
"description": "A portfolio already on your account (returned by an earlier brief). With companies, they are added to it."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
}
}
}{
"type": "object",
"required": [
"accountName"
],
"properties": {
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"refresh": {
"type": "boolean",
"description": "Build a new plan even if one from the last 30 days exists ($12). Default false."
},
"accountName": {
"type": "string",
"description": "The company to plan for."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
},
"productDescription": {
"type": "string",
"description": "What you sell to this account, if different from the product saved in Andru (a sentence or two)."
}
}
}{
"type": "object",
"required": [
"competitorName"
],
"properties": {
"context": {
"type": "string",
"description": "Additional context (e.g., \"enterprise deal\", \"competing on price\")"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"competitorName": {
"type": "string",
"description": "The alternative the buyer is weighing (a product or company)."
},
"competitorFeatures": {
"type": "array",
"items": {
"type": "string"
},
"description": "What that alternative offers, as you know it."
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}| dealContext |
| object |
| Current deal context (if applicable) |
| employeeCount | number | Number of employees |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
{
"type": "object",
"properties": {
"revenue": {
"type": "string",
"description": "Revenue range"
},
"industry": {
"type": "string",
"description": "Industry"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"geography": {
"type": "string",
"description": "Location"
},
"techStack": {
"type": "array",
"items": {
"type": "string"
},
"description": "Technologies they use"
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"companyName": {
"type": "string",
"description": "Company name to check"
},
"dealContext": {
"type": "object",
"properties": {
"stage": {
"type": "string",
"description": "Current deal stage"
},
"dealValue": {
"type": "number",
"description": "Deal value"
},
"daysInPipeline": {
"type": "number",
"description": "Days since deal entered pipeline"
},
"championIdentified": {
"type": "boolean",
"description": "Has a champion been identified?"
}
},
"description": "Current deal context (if applicable)"
},
"employeeCount": {
"type": "number",
"description": "Number of employees"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}| requiredCapabilities | array | Capabilities the buyer needs from a solution |
{
"type": "object",
"properties": {
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"buyerSize": {
"type": "string",
"description": "Buyer company size"
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"buyerIndustry": {
"type": "string",
"description": "Buyer's industry"
},
"buyerPainPoints": {
"type": "array",
"items": {
"type": "string"
},
"description": "Pain points the buyer has expressed or you expect them to have"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
},
"requiredCapabilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "Capabilities the buyer needs from a solution"
}
}
}| companyName | string | Company name to evaluate |
| employeeCount | number | Number of employees |
| triggerEvents | array | Recent trigger events (e.g., "just raised Series B", "new CTO hired") |
| productDescription | string | A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
{
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Company website domain"
},
"revenue": {
"type": "string",
"description": "Revenue range (e.g., \"$1M-$5M\")"
},
"industry": {
"type": "string",
"description": "Industry vertical"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"geography": {
"type": "string",
"description": "HQ location"
},
"techStack": {
"type": "array",
"items": {
"type": "string"
},
"description": "Technologies the company uses"
},
"painPoints": {
"type": "array",
"items": {
"type": "string"
},
"description": "Known pain points or challenges they face"
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"companyName": {
"type": "string",
"description": "Company name to evaluate"
},
"employeeCount": {
"type": "number",
"description": "Number of employees"
},
"triggerEvents": {
"type": "array",
"items": {
"type": "string"
},
"description": "Recent trigger events (e.g., \"just raised Series B\", \"new CTO hired\")"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}| string |
| A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: "What does your product do, and who do you sell to?" before calling this tool. |
{
"type": "object",
"properties": {
"stage": {
"enum": [
"awareness",
"consideration",
"decision"
],
"type": "string",
"description": "Where the buyer is in their journey"
},
"channel": {
"type": "string",
"description": "Channel (email, linkedin, phone, etc.)"
},
"segment": {
"type": "string",
"description": "Target segment or vertical"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"personaType": {
"type": "string",
"description": "Target buyer title"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}{
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Job title of the person you're meeting (e.g., \"VP Engineering\", \"CTO\", \"Head of Sales\")"
},
"industry": {
"type": "string",
"description": "Their industry"
},
"vertical": {
"type": "string",
"description": "The industry the user sells into (e.g., \"fintech\", \"healthcare\", \"defense\"). Infer from conversation context — the user's product description, company name, or the companies they're asking about. If unclear, ask."
},
"targetRole": {
"type": "string",
"description": "The buyer role being evaluated (e.g., \"CFO\", \"CTO\", \"VP Sales\"). Infer from context — often explicit in the user's question. If not mentioned, default to the most senior relevant role for their vertical."
},
"companySize": {
"type": "string",
"description": "Their company size range"
},
"productDescription": {
"type": "string",
"description": "A brief description of what the user's product does and who it's for. Infer this from the conversation if the user has already described their product. If the user hasn't mentioned their product yet, ask them: \"What does your product do, and who do you sell to?\" before calling this tool."
}
}
}| Company you're meeting. Andru looks for the matching meeting on the person's calendar. |
{
"type": "object",
"properties": {
"room": {
"type": "array",
"items": {
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string"
},
"buyerKey": {
"type": "string"
}
}
},
"maxItems": 8,
"description": "Who will be there: up to 8 people, each with their title and, if you know it, which of the six buyers they are."
},
"stage": {
"type": "integer",
"maximum": 7,
"minimum": 0,
"description": "Where the deal is, by the last thing the buyer did (required for a deal meeting)."
},
"meeting": {
"type": "string",
"description": "The meeting in a sentence if it isn't on their calendar, e.g. 'pricing call with the company's VP of Finance and their IT lead'."
},
"meetingId": {
"type": "string",
"description": "The meeting from the person's calendar (an id from a previous reply). Leave it out and describe the meeting in `meeting` instead."
},
"situation": {
"enum": [
"discovery",
"deal",
"customer_review"
],
"type": "string",
"description": "What kind of meeting: a discovery call, where they speak first; a deal meeting (demo, pricing, pilot, procurement); or a customer review."
},
"companyName": {
"type": "string",
"description": "Company you're meeting. Andru looks for the matching meeting on the person's calendar."
}
}
}| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
{
"type": "object",
"required": [
"companyStage",
"arrTarget"
],
"properties": {
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"dealSize": {
"type": "string",
"description": "Average deal size (e.g., \"$15K ACV\", \"$50K ACV\"). Infer from context or ask."
},
"teamSize": {
"type": "number",
"description": "Current team size. Infer from context if mentioned."
},
"arrTarget": {
"type": "string",
"description": "Annual recurring revenue target (e.g., \"$2M\", \"$5M\", \"$10M\"). Ask the user if not mentioned."
},
"companyStage": {
"enum": [
"Pre-Seed",
"Seed",
"Series A",
"Series B"
],
"type": "string",
"description": "Current funding stage. Infer from conversation context if the user has mentioned it."
},
"avgCycleLength": {
"type": "string",
"description": "Average sales cycle length (e.g., \"30 days\", \"60 days\", \"90+ days\"). Infer or ask."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
}
}
}{
"type": "object",
"required": [
"productDescription",
"stage"
],
"properties": {
"stage": {
"enum": [
"Pre-Seed",
"Seed",
"Series A",
"Series B",
"Series C+"
],
"type": "string",
"description": "Current funding stage. Infer from context if mentioned."
},
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"arrRange": {
"type": "string",
"description": "Current ARR range (e.g., \"$0-$500K\", \"$500K-$2M\", \"$2M-$10M\"). Infer or ask."
},
"vertical": {
"type": "string",
"description": "Industry vertical (e.g., \"AI/ML\", \"FinTech\", \"HealthTech\", \"SaaS\"). Infer from product description."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
},
"productDescription": {
"type": "string",
"description": "What the company does and who it serves. Infer from conversation context if the user has already described their product."
}
}
}| quoteId |
| string |
| Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). |
| speaker | string | Who answers this turn (p1, p2…, from the brief). |
| stageId | number | Buyer journey stage (1=Researching, 2=Quantifying, 3=Exploring, 4=Comparing, 5=Business Case, 6=Implementing, 7=Advocating). Default: 3 (Exploring). |
| brief_id | string | The brief to open a session from. |
| situation | string | discovery, deal or customer_review. |
| meeting_id | string | A meeting from mode=meetings. |
| session_id | string | The Deal Prep session to continue (returned by mode=opening). Required for mode=reply. |
| productName | string | Product name. Defaults to the product in their ICP. |
| session_key | string | Optional idempotency key for opening a session: retrying with the same key never charges twice. |
| idempotencyKey | string | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. |
| maxAmountCents | integer | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
| productDescription | string | What the user's product does. Defaults to the product in their ICP. |
{
"type": "object",
"required": [],
"properties": {
"mode": {
"enum": [
"meetings",
"brief",
"opening",
"reply",
"list"
],
"type": "string",
"description": "meetings = the user's calendar meetings in the next 7 days (free). brief = the free brief for a meeting (10 a day). opening = open a session ($5) from a brief_id, or with one buyer. reply = the founder's next message; speaker picks who answers. list = the user's six buyers (free)."
},
"room": {
"type": "array",
"items": {
"type": "object",
"required": [
"persona"
],
"properties": {
"name": {
"type": "string"
},
"title": {
"type": "string"
},
"persona": {
"type": "string"
}
}
},
"description": "Who's in the room, 1–8 people, each with persona (one of the six buyers) and an optional title and name."
},
"stage": {
"enum": [
0,
1,
2,
3,
4,
5,
6,
7
],
"type": "number",
"description": "The deal's stage, 0–7."
},
"meeting": {
"type": "string",
"description": "The meeting in a sentence, when it isn't on the calendar."
},
"message": {
"type": "string",
"description": "mode=reply: what the seller says to the buyer. \"End role-play. How did I do?\" ends with a debrief."
},
"persona": {
"type": "string",
"description": "Which of the user's six buyers to simulate (mode=list shows them, from their buying committee). Pick based on who the user is preparing to meet."
},
"quoteId": {
"type": "string",
"description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes)."
},
"speaker": {
"type": "string",
"description": "Who answers this turn (p1, p2…, from the brief)."
},
"stageId": {
"enum": [
1,
2,
3,
4,
5,
6,
7
],
"type": "number",
"description": "Buyer journey stage (1=Researching, 2=Quantifying, 3=Exploring, 4=Comparing, 5=Business Case, 6=Implementing, 7=Advocating). Default: 3 (Exploring)."
},
"brief_id": {
"type": "string",
"description": "The brief to open a session from."
},
"situation": {
"enum": [
"discovery",
"deal",
"customer_review"
],
"type": "string",
"description": "discovery, deal or customer_review."
},
"meeting_id": {
"type": "string",
"description": "A meeting from mode=meetings."
},
"session_id": {
"type": "string",
"description": "The Deal Prep session to continue (returned by mode=opening). Required for mode=reply."
},
"productName": {
"type": "string",
"description": "Product name. Defaults to the product in their ICP."
},
"session_key": {
"type": "string",
"description": "Optional idempotency key for opening a session: retrying with the same key never charges twice."
},
"idempotencyKey": {
"type": "string",
"description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice."
},
"maxAmountCents": {
"type": "integer",
"minimum": 0,
"description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged."
},
"productDescription": {
"type": "string",
"description": "What the user's product does. Defaults to the product in their ICP."
}
}
}