Andru
Andru is an enterprise buyer-specialist MCP server for qualifying deals, preparing buyer conversations, and generating sales/fundraising/portfolio assets.
Preview a company’s website read before signup, and start/verify/check Andru signup.
Check account limits, pricing quotes, wallet balance, and spend controls.
Score company fit individually or in batches against your ICP.
Classify opportunities and check disqualification signals.
Understand buyers with persona profiles, messaging frameworks, competitive positioning, and evaluation criteria.
Build account plans and discover prospects with sourced evidence.
Prepare for meetings with pre-briefs and buyer role-play simulations.
Plan a first sales hire and match with relevant VC firms.
Store/query revenue memory, founder context, and memory history.
Access market signals, company revenue-readiness scoring, and portfolio rollups/briefs.
Consult Andru domain specialists for open-ended sales questions.
Search, generate, collect, list, and cancel catalog assets from 139 sales, hiring, fundraising, and buying deliverables.
Set product context once so later tools use what you sell.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Andru MCP Server
An enterprise buyer specialist that already knows your buyers. Your agent builds the assets technical founders sell with, and prepares them for real buyer conversations.
Andru is an enterprise buyer specialist for complex B2B deals: it already knows your buyers and scores deals the same way every time. Give your agent 30 tools and a catalog of 139 assets, built from what Andru knows about your company and buyers. Start with:
Pure Signal Market Resonance: who needs your product most, and why now (every account starts with a free cold-read ICP)
Buying Committee Navigation: the committee, its objectors and the order to engage them
Champion Enablement Kit: what your champion needs for the meetings you're not in
Technical Sales Translator: technical features in the language buyers pay for
Executive Business Case Builder: the case your champion takes to the people who sign
Prepare for real conversations with buyer role-play and pre-meeting briefs (up to 10 a day). Lookups are free. Assets and role-play draw on one prepaid wallet, at the same prices as the platform: andru-ai.com/pricing.
Build any of them with generate_asset (for example generate_asset with asset: "Champion Enablement Kit"), and find the rest with list_assets.
Installation
npm install -g mcp-server-andru-intelligenceOr run directly:
npx mcp-server-andru-intelligenceOr connect to the hosted server at https://mcp.andru-ai.com/mcp.
In Cursor or VS Code, add the hosted server in one click: see Add to Cursor or VS Code.
Related MCP server: battlecard
Configuration
Environment Variables
Variable | Required | Default | Description |
| No | — | Your Andru API key. Without one, your agent can sign you up from the conversation. |
| No |
| API base URL. The default is Andru's production API; you don't need to change it. Your key is only sent to |
Get your API key at platform.andru-ai.com/settings/developer.
No key yet? Start the server without one and ask your agent to sign you up. It calls signup_start with your email; you get a code and an Approve button; the session then uses the new key.
Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"andru-intelligence": {
"command": "npx",
"args": ["mcp-server-andru-intelligence"]
}
}
}Already have a key? Add "env": { "ANDRU_API_KEY": "<your key>" }. Without one, ask your agent to sign you up.
Claude Code
claude mcp add andru-intelligence npx mcp-server-andru-intelligenceAlready have a key? Add --env ANDRU_API_KEY=<your key>.
Available Tools
Qualification & Scoring
Tool | What It Does | Latency |
| Tells you in seconds whether a company is worth your time — scores across 5 dimensions against who actually buys from you | <100ms |
| Score up to 50 companies at once — tier and score so you can rank a list in under a second | <500ms |
| Full read on a deal — fit score, persona match, risk flags, disqualification check, and a verdict: pursue, pause, or walk away | <200ms |
| Find out if you're wasting time on a deal that won't close — three layers of signal and a clear recommendation | <200ms |
Stakeholder Understanding
Tool | What It Does | Latency |
| Look up who you're actually talking to — what they care about at 7 AM, what they need before they say yes, and exactly how to open | <50ms |
| Your story in one buyer's terms: what they respond to, the problem in their words, and the concerns they need answered, built from your ICP | <50ms |
| When a buyer is weighing another option: where it fits them better, where yours does, and questions that help them decide for themselves | <100ms |
| Scores how well you match what a buyer needs — across pain coverage, outcome clarity, capability fit, and 3 more dimensions | <100ms |
Account & Pipeline
Tool | What It Does | Latency |
| Builds the account plan in your Andru account and returns its link with a short summary. A plan from the last 30 days comes back at once. Returns a job_id; | 1–3 min |
| Your ICP, built from what you sell: the buyers who decide, what each is measured on and needs answered, the signals a company is ready to change, and who isn't a fit | <100ms |
Prospecting & Meetings
Tool | What It Does | Latency |
| Finds real companies likely to buy your product — searches the web live and links the page behind every piece of evidence | up to ~2 min |
| What the meeting is for and what each person in the room likely thinks going in, built from your buying committee and labelled as assumptions to correct | 10-20s |
Founder Tools
Tool | What It Does | Latency |
| First sales hire blueprint — JD, comp model, interview questions, and 90-day ramp plan for the stage you're at | 10-20s |
| Up to 3 VC firms investing now in companies like yours, each with a recent deal or stated focus and a link to the page it came from | ~30s |
| Prepare for a meeting with the people who'll be in the room: a brief of what each person likely thinks going in (10 a day), then a Deal Prep session where Andru plays them, one or several at once | 5-15s |
What Andru Remembers
Tool | What It Does | Latency |
| Query what Andru has learned about your business over time: metrics, deal patterns, account history, decisions | varies |
| Save an insight, decision, metric or pattern to Andru's memory; earlier values are versioned automatically | varies |
| Everything Andru knows about you, organised by memory type | varies |
| How a metric, deal stage or priority has changed over time ("What was my MRR 3 months ago?") | varies |
Market & Portfolio Intelligence
Tool | What It Does | Latency |
| What's moving in your market now: ranked signals, each with its buyer impact and a recommended action | varies |
| Scores a company's Revenue Readiness Index (0–100) from its operating metrics, with its #1 growth constraint | varies |
| A board-ready scorecard of every portfolio company by Revenue Readiness Index, with aggregates | varies |
| A brief on your portfolio's sales activity for a period, with sources (not a financial or performance report) | a few min |
Consultation
Tool | What It Does | Latency |
| Ask one of Andru's domain expert agents in natural language and get a domain-scoped answer | varies |
Asset Catalog
Tool | What It Does |
| Search Andru's catalog of 139 assets, from enterprise deals to hiring, fundraising and buying: what each is, its business outcome, and whether it can be generated today |
| Generate any catalog asset from everything Andru knows about your company; saved to your Andru library |
| Collect a generated asset or portfolio brief as markdown, or an account plan's link and summary |
| Stop an asset that |
| List the assets saved to your Andru library: each one's name, when it was built, and whether it was built in part. Open one with |
Product Context
Tool | What It Does |
| Tell Andru what you sell, once: your company website (Andru reads it) or a short description. Every later call uses it |
Pricing
Andru charges from a prepaid wallet, at the same prices as the platform: andru-ai.com/pricing. Answers from your own data are free, and a call that only asks you for more information is never charged. Your wallet balance is at platform.andru-ai.com/settings/billing.
CLI
These tools are also available from the command line via the companion andru-intel package:
npx andru-intel assets board # search the asset catalog (free)
npx andru-intel generate "Board Presentation" --out board-deck.md # build it, save as markdown
npx andru-intel list # see all tools
npx andru-intel score "AI code review" # instant ICP (works offline)
npx andru-intel persona CFO # buyer persona deep dive
npx andru-intel blueprint --stage "Series A" --arr "$2M"
npx andru-intel thesis "AI sales platform" --stage "Seed"
npx andru-intel roleplay CTO
npx andru-intel wellness
npx andru-intel run get_competitive_positioning --competitorName "<the alternative>"Cold-Start Support
7 tools work without any pipeline data — just describe your product:
get_icp_fit_score,get_persona_profile,get_messaging_framework,get_competitive_positioning,get_evaluation_criteria,classify_opportunity,get_disqualification_signals
Andru only needs to know what you sell once:
Signed up with a company email? Andru reads your company's website and remembers your product. Nothing to do.
Client shows forms (Claude Code, Cursor, VS Code)? The first tool that needs it asks for your website in one field, then answers.
Otherwise: call
set_product_contextwith your website (or a description) once.
You can still pass productDescription, vertical, and targetRole on any call; what you send first is remembered. The tools use pre-built stakeholder understanding (5 pre-built buyer personas, 3 vertical segment profiles) to deliver results immediately.
Run a full ICP pipeline at platform.andru-ai.com for understanding tuned to your specific product and market.
Available Resources
URI | Description |
| Your tracked accounts — tier, pipeline value, stakeholder count, and account plan status |
How It Works
This MCP server is a thin proxy that authenticates with your Andru API key and forwards tool/resource requests to the Andru backend. All intelligence generation, ICP scoring, and data access happens server-side — the MCP server itself is stateless.
When your AI app connects, the server tells Andru the app's name and version. Each tool call is recorded by tool name, outcome and cost; what you typed isn't part of that record.
Claude Desktop/Code → MCP Server (stdio) → Andru API (HTTPS)A2A Protocol
Andru also supports the Agent-to-Agent (A2A) protocol for direct agent-to-agent communication. The AgentCard is available at:
https://api.andru-ai.com/.well-known/agent-card.jsonIntelligence Briefs
Free signal reads for the questions technical founders ask at 11 PM:
I've Done 30 Customer Interviews and Still Can't Define My ICP
My Pipeline Is Full of Companies That Like Us But Nobody's Buying Urgently
As a Technical Founder, What Am I Getting Wrong About Sales?
Why Does My Messaging Fall Flat Even When I'm Talking to the Right Companies?
License
MIT
Available Tools
34 toolsassess_company_readinessScore a company's revenue readinessAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| metrics | Yes | 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 | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| companyName | No | Optional label for the company being assessed. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover read/write and world scope; the description adds the crucial information that the call is paid, must be preceded by a quote, can be capped, and that output includes a 0-100 index, stage fit, confidence, and the #1 growth constraint. It also discloses the quality tradeoff (more metrics = higher confidence), which is behavioral context beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences: purpose, trigger, return shape, alternative, and payment note. Front-loaded with the verb and scope, and every clause carries actionable information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description names the return fields (index, stage fit, confidence, top constraint). With a nested metrics object fully described in schema and the paid/quote flow explained, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter list including the nested metrics vocabulary is already fully documented. The description reinforces the 'pass what you have' semantics and the quote-before-run flow but adds nothing about individual parameter syntax or formats. Baseline 3 for a schema-rich tool is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('score one company's revenue readiness from its operating metrics') and describes the produced artifact (Revenue Readiness Index). It explicitly separates itself from get_portfolio_readiness_rollup for the portfolio-wide case, so an agent can choose between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('use this when the person wants to score one company's revenue readiness'), names the alternative tool for the multi-company case, and adds a required pre-step ('Check the price with quote before running'). No ambiguity about when or how to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_fit_scoreScore a list of companiesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| companies | Yes | Companies to score (max 50) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real value by disclosing the return shape (per-company tier and score plus totals), which is essential given there is no output schema. It omits what happens past the 50 limit and whether an ICP profile must exist first.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the use case front-loaded before the mechanics. Slightly awkward colon construction, but every clause carries information and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only batch tool with no output schema, the description covers purpose, batch limit, and return contents. Only minor gaps remain — the source of the ICP and behavior on oversized inputs — which are not blocking for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with every nested company field (domain, revenue, industry, techStack, painPoints, etc.) documented in the schema itself. The description adds only the max-50 constraint, which is already stated in the schema, so it contributes nothing beyond structured data — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — scoring/ranking a list of companies against an ICP, capped at 50. The word 'list' implicitly distinguishes it from the single-company scoring siblings, but no sibling is named explicitly (e.g., get_icp_fit_score), so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear situational trigger ('Before outreach, choosing where to spend time') and a condition (list of companies up to 50). It does not name alternatives such as get_icp_fit_score for a single company, nor state when-not to use it, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classify_opportunityRead a dealARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| revenue | No | Revenue range | |
| industry | No | Industry | |
| vertical | No | 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 | No | Current deal stage | |
| dealValue | No | Estimated deal value | |
| geography | No | Location | |
| techStack | No | Technologies used | |
| painPoints | No | Known pain points | |
| targetRole | No | 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 | Yes | Company name | |
| contactTitle | No | Primary contact job title | |
| employeeCount | No | Number of employees | |
| triggerEvents | No | Trigger events | |
| championIdentified | No | Has a champion been identified? | |
| competitorInvolved | No | Known competitor in the deal | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only supply readOnlyHint and openWorldHint, so the description adds real value by disclosing the shape of the result (the four possible verdicts) and one hard limitation (it cannot confirm a champion). It does not say how much of the input is required vs. optional or how confident/enriched the read is when params are sparse, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the usage trigger before the output description and the sibling redirect. It is dense with enumerations but each clause carries information; the only slight drag is the run-on list of verdicts embedded mid-sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the job of explaining what comes back, and it does so by listing the components and the four possible calls. With 16 mostly optional parameters and light annotations, a note on how thin inputs degrade the read would make it fully complete, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains inference expectations for vertical, targetRole, and productDescription. The description adds no parameter-level guidance beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action (produce one read on buyer readiness), enumerates the outputs (fit score, ICP match of the people involved, risk flags, fit check) and states the terminal verdict set. It also explicitly differentiates itself from get_icp_fit_score, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger ('after a first conversation'), an explicit boundary ('It doesn't confirm a champion; that takes asking the person'), and names the alternative for the narrow case ('For a quick fit score only, use get_icp_fit_score'). When-to-use, when-not, and alternative are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consult_agentAsk an Andru specialistAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| module | Yes | Which domain agent to consult (e.g. 'market-clarity', 'due-diligence', 'portfolio-ops'). | |
| history | No | Optional prior turns: [{ role, content }]. At most 10 turns of 2,000 characters each. | |
| message | Yes | Your question / request for the agent (up to 4,000 characters). | |
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the call is paid, it may itself invoke lookup tools, it is single-turn so continuation requires passing `history`, and cost control flows through quote/quoteId/maxAmountCents. These are non-obvious behavioral traits for a read-ish, open-world, paid tool that the readOnlyHint=false and openWorldHint=true flags only hint at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: routing rule, then behavior, then parameters, then cost warning. Nearly every clause earns its place; the only weak spot is the opening 'Any step,' fragment, which is less informative than what follows.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, yet the description says the return is a natural-language domain-scoped answer, covers the fallback-tool role, conversation continuation, and the payment/quote flow. That is everything an agent needs to invoke it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description goes above it by explaining the conversational model ('one turn per call; pass prior turns as history to continue') and giving module values that map the abstract expert router to concrete domains. It doesn't re-explain quoteId/idempotencyKey, but the schema already does that well.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: routes an open question to a named domain expert and returns a natural-language answer. It distinguishes itself from concrete siblings by naming module values ('market-clarity', 'deal-acceleration'), though the opening phrase 'Any step, when no other tool fits' is a bit diffuse before the concrete statement arrives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rule ('when no other tool fits', 'the person asks an open question for one of Andru's domain experts'), explicit constraint (tools that cost money must be called directly, not via the agent), and explicit prerequisite (check price with quote before running). An agent knows exactly when and when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_prospectsFind likely buyersAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| industry | No | Target industry to search within | |
| companyName | No | Your company name. Defaults to the product saved on your account. | |
| targetMarket | No | Target market segment (e.g., "Series A SaaS companies") | |
| coreCapability | No | The single most important thing your product does — the core capability that makes customers buy | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. | |
| productDescription | No | What your product does and who it's for. Defaults to the product saved on your account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare non-read-only, open-world, non-destructive; the description goes much further by disclosing latency ('up to a couple of minutes'), cost model (paid, quote first, maxAmountCents guard), and a quality guarantee ('only companies with sourced evidence are returned' with page links). These are exactly the traits an agent needs before committing to a paid, slow call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and when-to-use in the first sentence, then layers in latency, cost, and guarantees. Dense but every clause carries information; the only minor cost is that cost/payment caveats are packed at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains the return contract (only sourced-evidence companies, evidence linked to pages) and the cost/latency envelope for a slow paid operation. It could say more about result volume or shape (e.g., how many companies, fields per record), which is the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds value by explaining that companyName and productDescription default to the product saved on the account, which clarifies why zero parameters are required. It does not add much on industry/targetMarket/coreCapability beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — searching the web for real companies showing the problem the product solves — plus the concrete signals checked (hiring, launches, funding, expansion). An agent can distinguish this from preview_company or batch_fit_score, which operate on known companies rather than discovering new ones.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('needs new companies to sell to, for example when their pipeline is thin') and a prerequisite chain ('check the price with quote before running'). It does not explicitly state when NOT to use it or name a discovery alternative, so it stops just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_assetBuild an assetAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| asset | Yes | The asset name from list_assets. | |
| prospectCompany | No | For a prospect asset (Pre-Call Intelligence Brief, Deal Reengagement Strategy, Personalized Cost of Inaction One-Pager): the company it is for. | |
| prospectContact | No | For a prospect asset: the person it is for, name and title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the asset is built from Andru's company knowledge, saved to the user's library, takes up to a few minutes, and is asynchronous: it returns a job_id that must be passed to get_asset to receive markdown. This is strong behavioral context for a non-read-only, open-world generation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then usage context, then persistence and async behavior. Every sentence contributes actionable information, and the examples clarify acceptable asset inputs without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a generation tool with no output schema, the description explains the return value (a job_id), the retrieval path (get_asset), the output format (markdown), and the expected latency. Combined with full schema coverage and annotations, an agent has enough information to call and follow up correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds useful examples for the asset parameter and contextualizes prospect assets, but it does not materially expand the meaning of prospectCompany or prospectContact beyond the schema descriptions. The baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific generation action for an asset from Andru's catalog and distinguishes it from the prerequisite list_assets and follow-up get_asset. An agent can understand what the tool produces without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit triggering context: use this when the person picked an asset from Andru's catalog, and it names list_assets as the way to find that asset. It also explains the follow-up retrieval call. It does not state when not to use it or compare against the sibling generate_portfolio_brief, so it falls short of the full 5 criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_portfolio_briefBrief on portfolio go-to-marketAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| companies | No | The portfolio companies to brief, up to 15. Saved as a portfolio on your account the first time. | |
| periodEnd | No | Optional ISO date for the period end. Default: the end of the last full period. | |
| periodType | No | Reporting period type. Default quarterly. | |
| periodStart | No | Optional ISO date for the period start. Default: the start of the last full period. | |
| portfolioId | No | A portfolio already on your account (returned by an earlier brief). With companies, they are added to it. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and openWorldHint=true; the description adds what the agent actually needs: the call is slow ("takes a few minutes"), returns a job_id rather than the brief, is paid, and the price must be quoted first. That async + billing behavior is invisible from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the oversight use case and tightly packed with distinct information — no filler sentences. The first sentence is long and clause-heavy ("for a period: what Andru's work across the companies found..."), which slightly slows parsing, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an async, paid, zero-required-parameter tool with no output schema, the description covers the full lifecycle: inputs or fallback, latency expectation, job_id return, retrieval via get_asset, and price control via quote. An agent can invoke and follow through correctly without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds meaning by explaining the companies/portfolioId interaction and the no-input fallback where Andru proposes companies from the firm's website for confirmation. It doesn't add format guidance for periodStart/periodEnd or the quoteId/maxAmountCents linkage beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (written brief on portfolio companies' go-to-market activity) and enumerates the contents: targets/opportunities/overlaps, public GTM news, market signals, with sources. It also draws an explicit negative boundary ("Not a financial or performance report"), which separates it from get_portfolio_readiness_rollup and financial siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the actor and situation precisely ("when a PE or VC operator wants..."), specifies the required input paths (companies or portfolioId) and the fallback when neither is supplied. It also routes to sibling tools explicitly: quote before running, get_asset to retrieve the result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_account_planBuild an account planAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| refresh | No | Build a new plan even if one from the last 30 days exists ($12). Default false. | |
| accountName | Yes | The company to plan for. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. | |
| productDescription | No | What you sell to this account, if different from the product saved in Andru (a sentence or two). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare write-like, open-world, non-destructive behavior, and the description adds substantial context beyond that: it is paid, takes 1–3 minutes, returns a job_id for later retrieval via get_asset, returns a link with a short summary, and reuses plans from the last 30 days unless refreshed. It also sets a caution that the committee and champion should be treated as a map to confirm with each person. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the usage condition, then proceeds through output, caching, latency, payment, and follow-up in a logical sequence. Every sentence contributes operational detail; there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, paid, asynchronous, open-world tool with no output schema, the description covers what the agent needs: when to invoke, what the output looks like, how long it takes, how to retrieve it, how caching affects behavior, and the payment prerequisite. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines all six parameters. The description still adds meaningful workflow context around quoteId and maxAmountCents by telling the agent to check the price with quote before running, and it implies the caching behavior tied to the refresh parameter. That extra guidance lifts it above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it builds an account plan for a target account. It enumerates the concrete contents of that plan — buying committee map, fit opportunities, likely champion, messaging, next steps — so an agent can distinguish it from generic asset or brief tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear condition: 'Use this when the person wants a plan for a specific target account.' It also explains the cached-result behavior and a prerequisite workflow (check price with quote, then call get_asset with the job_id). It stops short of naming when-not-to-use or an explicit sibling alternative for a different task, so it is strong but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_assetCollect a finished resultARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The job_id returned by generate_asset, generate_portfolio_brief or get_account_plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered; the description adds genuinely useful behavior: this is a polling call, it returns progress in-flight and full content in markdown when complete, and results are persisted to the user's Andru account. It does not describe timeout, error, or failed-job behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense sentence, but it is front-loaded with the triggering condition and then branches into each return case. Every clause carries information; the nested colons make it slightly hard to parse on first pass.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so well: it distinguishes in-progress versus completed responses and specifies the shape of each result type (full markdown, or link plus summary). An agent has enough to call it and interpret what comes back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents job_id as coming from generate_asset, generate_portfolio_brief, or get_account_plan. The description restates the same origin information, adding no format or usage nuance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (collect a finished result) and enumerates exactly what kinds of artifacts come back: an asset, a brief, or an account plan, each tied to its producing sibling. It is clear what the tool returns, though the name 'get_asset' undersells that it also retrieves briefs and plans, so the description has to work a bit to correct the impression.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete triggering condition: use it when the person asks whether something Andru started is done. It also clarifies the polling semantics (progress while building, full result when done). It does not name an alternative retrieval path such as list_assets, so the boundary with siblings is only partially drawn.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_competitive_positioningWeigh the buyer's alternativesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| context | No | Additional context (e.g., "enterprise deal", "competing on price") | |
| vertical | No | 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 | No | 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 | Yes | The alternative the buyer is weighing (a product or company). | |
| competitorFeatures | No | What that alternative offers, as you know it. | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is known. The description adds context about the tool's framing ('diligence for the buyer') and grounding in the account's ICP, but does not disclose rate limits, auth needs, or detailed output format beyond the high-level summary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the usage trigger, followed by a clear behavioral summary and grounding context. Every sentence contributes directly to understanding when and how to use the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analysis tool with no output schema, the description adequately explains what the tool produces ('where the alternative fits this buyer better, where the person's product does, and questions that help the buyer decide'). It omits details like output format or length, but the core value is conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed per-parameter guidance (e.g., how to infer vertical, targetRole, productDescription). The description adds no additional parameter meaning beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific scenario and what the tool does: '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.' This clearly distinguishes it from generic analysis tools, but it does not explicitly contrast with siblings like get_market_signals or get_icp_fit_score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions: 'Use this when a buyer is weighing another option, or the person asks how they compare with a named alternative.' No when-not-to-use or alternative tools are named, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_disqualification_signalsCheck whether a buyer is readyARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| revenue | No | Revenue range | |
| industry | No | Industry | |
| vertical | No | 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 | No | Location | |
| techStack | No | Technologies they use | |
| targetRole | No | 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 | No | Company name to check | |
| dealContext | No | Current deal context (if applicable) | |
| employeeCount | No | Number of employees | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true. The description adds useful behavioral context by stating that the tool returns one of four fit levels with reasons and by guiding how to handle a negative result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the usage trigger, followed by a precise explanation of the check and return shape, then a short guidance sentence for negative outcomes. Every sentence contributes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, read-only tool with no output schema, the description gives the trigger, core mechanism, and return cardinality. It still leaves the four level names unspecified and does not differentiate from overlapping sibling scoring tools, but the complete schema and annotations fill most remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 10 parameters in detail, including inference guidance. The description adds no parameter-level semantics beyond referring generally to checking the company.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it checks the company against the account's ICP and an anti-fit profile, then returns one of four fit levels with reasons. This clearly states what the tool does, though it does not explicitly distinguish itself from sibling scoring tools such as assess_company_readiness or get_icp_fit_score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger: use when a deal has stalled or the person wonders whether the buyer is ready. However, it does not state when not to use it or name alternatives, which matters given overlapping sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evaluation_criteriaScore fit to a buyer's needsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vertical | No | 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 | No | Buyer company size | |
| targetRole | No | 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 | No | Buyer's industry | |
| buyerPainPoints | No | Pain points the buyer has expressed or you expect them to have | |
| productDescription | No | 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 | No | Capabilities the buyer needs from a solution |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only and open-world traits, and the description adds the return structure: 0-100 sub-scores for pain coverage, outcome clarity, capability fit plus three more dimensions and an overall score. That is real value beyond annotations and there is no output schema. It does not describe failure modes or what to do with low scores.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the situation and the core inputs, then the return value, then the alternative. Slightly dense in the return sentence but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description's summary of the returned sub-scores is necessary and mostly sufficient. For a 7-parameter read-only scoring tool with full schema coverage and read-only annotations, this is close to complete; only interpretation guidance is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all seven parameters are already documented in the schema. The description only calls out two of them (buyerPainPoints, requiredCapabilities) by name, adding at most emphasis rather than meaning. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('checking what the buyer said they need against what the person offers') and describes the output shape. The comparison to the get_icp_fit_score sibling makes the boundary clear without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('after discovery', 'when the person knows what a buyer needs') and an explicit alternative ('To check whether a company is a fit at all, use get_icp_fit_score'). An agent can route to the correct tool on that alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_founder_contextRead what Andru knows about youARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful return grouping ('What I Know,' 'Patterns I've Noticed,' 'How You Operate'), but does not discuss freshness, source, limitations, or how open-world behavior applies.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and mostly front-loaded with the usage trigger. The opening phrase 'The context behind every step' is slightly vague but does not obscure the actionable guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only retrieval tool with no output schema, the description does enough: it states the trigger and outlines the returned categories. It could be stronger by clarifying how it differs from sibling memory/profile tools, but it is sufficient to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter-level ambiguity. The description does not need to compensate for missing schema details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the resource: stored context about the person and their company, including profile, product, and memory. It distinguishes this from generic identity lookup by framing it as 'what Andru knows about them,' though it does not explicitly name overlapping sibling tools such as whoami or get_memory_history.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: use when the person asks what Andru knows about them or their company. It does not state when not to use it or name alternatives, but the primary usage condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_icp_fit_scoreScore a company's fitARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | Company website domain | |
| revenue | No | Revenue range (e.g., "$1M-$5M") | |
| industry | No | Industry vertical | |
| vertical | No | 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 | No | HQ location | |
| techStack | No | Technologies the company uses | |
| painPoints | No | Known pain points or challenges they face | |
| targetRole | No | 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 | No | Company name to evaluate | |
| employeeCount | No | Number of employees | |
| triggerEvents | No | Recent trigger events (e.g., "just raised Series B", "new CTO hired") | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: the scoring runs in seconds, evaluates 5 named dimensions, and returns an A–D tier with per-dimension reasons, which tells the agent what to expect back. It stops short of explaining how the account ICP is sourced or what happens when signals are missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: trigger first, then what it evaluates and returns, then the sibling alternative. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, no-output-schema tool, the description covers trigger, scoring dimensions, and return shape (A–D tier plus reasons). It doesn't address how the 12 mostly optional inputs combine or what the score degrades to when context is thin, which is the main remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself carries strong inference guidance for vertical, targetRole, and productDescription, so the schema does the heavy lifting. The description adds nothing about which inputs matter most or how partial data affects the score, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (scores one company's fit against the ICP) and immediately scopes it to a single company, contrasting with batch_fit_score. An agent can distinguish it from get_icp_profile or assess_company_readiness without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the person asks whether one company is a good fit, before they reach out or spend more time') and names the alternative tool plus the condition that selects it ('For many companies at once, use batch_fit_score'). Both the when and the when-not are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_icp_profileRead your ideal customer profileARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and openWorldHint=true already covering safety, the description adds non-obvious behavior: the first ICP may still be building, and the agent should ask again in a minute. It also enumerates the returned ICP components, though it does not discuss auth or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the usage trigger, followed by the return contents and the retry edge case. Every sentence adds useful information, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with no output schema, the description supplies the trigger, the returned ICP components, and the eventual-consistency retry behavior. That is enough for an agent to invoke it correctly and interpret the initial empty state.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter semantics to document. The baseline score for a parameterless tool is 4, and nothing in the description creates ambiguity about inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It states a specific action and resource: returns the account's ICP, scoped to buyers, metrics, concerns, readiness signals, and non-fit accounts. It does not explicitly name sibling tools like get_icp_fit_score or get_persona_profile, but the described output is conceptually distinct enough for an agent to tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete triggers: when the person asks who their ideal customer is, who isn't a fit, or needs to explain who buys from them and why. It does not state when not to use the tool or explicitly point to alternatives among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_signalsSee what's moving in your marketARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max signals (1–25). Default 10. | |
| industry | No | Optional industry/vertical filter. | |
| signalType | No | Optional filter to one signal category. | |
| windowDays | No | Look-back window in days (1–30). Default 7. | |
| minRelevance | No | Minimum relevance 0–1. Default 0.5. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds real behavioral context beyond that: results are relevance-ranked, each signal carries an impact statement and a recommended action, and — importantly — it discloses the empty-state behavior ('if the account has no Market Pulse yet, it says so'), which is exactly the kind of precondition an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the usage trigger before describing output. The middle sentence is long but every item in the parenthetical earns its place by defining scope. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing the return shape, and it does: ranked signals each with impact and recommended action, plus the no-Market-Pulse case. All five params are optional with no required inputs to explain. Only a brief note on pagination/truncation relative to the limit cap is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five optional parameters are already documented with ranges, defaults, and an enum. The description's prose list of signal categories loosely mirrors the signalType enum and 'relevance-ranked' hints at minRelevance, but it adds no syntax, format, or interaction detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (market signals) and enumerates the exact content returned: trends, buyer pain, competitor moves, regulatory and tech shifts, hiring and funding. An agent can distinguish this from siblings like get_competitive_positioning or get_disqualification_signals based on that content list, though no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Opens with an explicit trigger: '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.' That is a concrete use context, but there are no exclusions or named alternatives for adjacent questions (e.g. competitive positioning vs. market movement).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_memory_historyShow how a memory changedARead-onlyInspect
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?".
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Memory key (e.g., "mrr", "acme_deal_stage"). | |
| category | Yes | Memory category (e.g., "metric", "account"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that the lookup is scoped to a single saved key over time, but says nothing about what the history contains, whether it can be sparse or truncated, or how far back it reaches - meaningful gaps for a history tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler, and the trigger condition plus examples are exactly what an agent needs. It devotes the entire budget to usage and never states in plain terms what is returned, so it is efficient but not perfectly balanced.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A two-parameter read-only lookup with full schema coverage and clear annotations needs little more than the trigger condition, which is provided. The one remaining gap is the return shape (a sequence of prior values with timestamps), which has no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both required parameters are documented with examples in the schema, so the baseline is 3. The description loosely echoes the categories ('metric', 'deal stage or priority'), but those examples do not match the schema's own example ('account'), adding little and slightly muddying the category vocabulary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: the change-over-time history of a single saved metric, deal stage or priority, made concrete with two example questions. An agent can distinguish it from get_revenue_memory (current values) by the 'over time' framing, though it never names the sibling or says explicitly that it returns a timeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with an explicit trigger ('Use this when the person asks how one ... changed over time') and backs it with two representative utterances, which is strong routing guidance. It does not state when-not-to-use or name an alternative tool for the 'current value' case, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messaging_frameworkPut your story in each buyer's termsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stage | No | Where the buyer is in their journey | |
| channel | No | Channel (email, linkedin, phone, etc.) | |
| segment | No | Target segment or vertical | |
| vertical | No | 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 | No | 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 | No | Target buyer title | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-context traits are covered. The description adds useful behavior context: output is buyer-responsive messaging derived from the account's ICP, but it does not discuss limitations, generation variability, or auth/rate details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the use case and followed by output, source, and alternatives. The examples are brief and help disambiguate multi-buyer use, with no obvious padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is read-only/open-world with no output schema, so the description needs to explain likely returns; it does by naming the buyer-specific messaging components. It leaves some optional-parameter interplay and output structure to the rich schema, making it strong but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema carries defaults, enums, and inference instructions for all seven parameters. The description only mentions channel, funnel stage, and buyer in passing, adding no syntax or precedence details beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete job—turning an account's story into one buyer's terms—and lists the returned components: what the buyer responds to, the problem in their words, and the concerns they need answered. It explicitly separates this from get_persona_profile and get_pre_brief, so an agent can identify the resource and its role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It opens with the triggering condition ('when the person needs...'), includes example scenarios such as a first executive note or the same point for the CFO and IT lead, and routes the agent to get_persona_profile for buyer identity or get_pre_brief for meeting prep. This is explicit when-to-use and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_persona_profileProfile a buyerARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Job title of the person you're meeting (e.g., "VP Engineering", "CTO", "Head of Sales") | |
| industry | No | Their industry | |
| vertical | No | 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 | No | 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 | No | Their company size range | |
| productDescription | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint, the description discloses the data source (the account's ICP) and, importantly, the epistemic status: it is a starting hypothesis to confirm with the real person, not a conclusion. That is genuinely useful context the annotations cannot convey. It stops short of 5 because it doesn't say what happens when the ICP is thin or unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger, then the return payload, then the caveat, then the routing alternative — four short, non-redundant sentences with no filler. Every sentence changes how an agent would use the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating the four content classes it produces. Combined with 100% parameter coverage and the safety annotations, an agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters carry their own semantics, including inference instructions for vertical, targetRole, and productDescription. The description only echoes the ICP framing ('that buyer from the account's ICP') and adds no format or precedence guidance beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Returns Andru's starting picture of that buyer from the account's ICP') and enumerates the returned content (metrics, worries, objections, message), so an agent knows exactly what it gets. It differentiates from get_pre_brief but leaves the very similar siblings simulate_buyer_persona and get_evaluation_criteria unaddressed, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('when the person asks what a specific buyer role cares about... or why that person isn't responding') plus an explicit alternative and its selecting condition ('To prepare for one specific meeting, use get_pre_brief'). Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_portfolio_readiness_rollupPortfolio readiness scorecardAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| portfolioId | Yes | The portfolio to roll up. whoami lists yours with their ids. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and openWorldHint=true but say nothing about billing; the description fills exactly that gap by flagging the tool as Paid with a mandatory quote step. It also discloses the comparison semantics ('comparable across companies'), which is behavioral context an agent needs to interpret results. Minor omissions: no mention of the 30-minute quote hold, idempotency, or the maxAmountCents cap that the schema carries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: use case first, return contents second, payment prerequisite last. The 'Portfolio oversight:' prefix is a small category tag but no sentence is redundant or padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so by enumerating the per-company index, the average, at-risk count, and concentration risk. The paid/quote flow is also covered. It could still say more about cost variability or what happens when portfolioId is invalid, but nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in structured form — baseline 3. The description adds nothing about portfolioId sourcing (whoami), quoteId, idempotencyKey, or maxAmountCents beyond what the schema already says, though its 'comparable across companies' note helps interpret results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — a portfolio-level readiness 'scorecard' — and explicitly scopes it to 'across all their portfolio companies,' which cleanly separates it from the single-company sibling assess_company_readiness. It also names the concrete output (Revenue Readiness Index per company, average, at-risk count, concentration risk).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering persona and situation ('PE or VC operator wants a scorecard across all their portfolio companies, or asks which company is most at risk') plus a prerequisite workflow ('Check the price with quote before running'). It stops short of stating when NOT to use it (e.g., a single company → assess_company_readiness), so the exclusion is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pre_briefPrepare for a meetingAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| room | No | 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 | No | Where the deal is, by the last thing the buyer did (required for a deal meeting). | |
| meeting | No | 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 | No | The meeting from the person's calendar (an id from a previous reply). Leave it out and describe the meeting in `meeting` instead. | |
| situation | No | What kind of meeting: a discovery call, where they speak first; a deal meeting (demo, pricing, pilot, procurement); or a customer review. | |
| companyName | No | Company you're meeting. Andru looks for the matching meeting on the person's calendar. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: the output is explicitly labelled as Andru's assumptions to correct, and there is a documented fallback (leave out the room and Andru replies with six buyers to choose from). It does not contradict the annotations, which flag a non-read-only, open-world tool. It says nothing about persistence, cost or latency of the generation call, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger and the default condition before describing the output shape, so the key routing information comes first. The middle sentences are dense, and the parameter recap partially repeats the schema, but none of it is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the job of explaining the return value, which it does well, and it also covers the fallback path. The omission of stage (required for a deal meeting) and companyName leaves a small completeness gap for a 6-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a little procedural framing around the meeting inputs and the omitted-room behaviour, but it never mentions the stage or companyName parameters, and the schema does more work than the prose does.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb, resource and trigger ('prepare for an upcoming meeting'), then describes exactly what comes back: what the meeting is for and what each person in the room thinks going in. It reads clearly against siblings such as simulate_buyer_persona and generate_portfolio_brief.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('the person has a specific upcoming meeting or call and wants to be ready'), calls itself the default for 'prepare me for my call', and names the alternative plus the condition that selects it ('To talk with the buyers before the meeting, use simulate_buyer_persona with the same brief').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_revenue_memorySearch revenue memoryARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Filter to a specific memory category. Omit to search all. | |
| keyPattern | No | Filter keys matching this pattern (supports * wildcards, e.g., "*mrr*", "acme_*"). | |
| memoryType | No | Filter by memory type. episodic=specific facts, semantic=patterns, procedural=behavioral habits. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds that results come from things 'Andru has saved,' implying a persisted, accumulated store rather than a live lookup, which is useful context. It says nothing about result volume, ordering, or the relationship to memory history, so it stays at a baseline 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'Learning from every deal:' preamble is marketing framing that does not help tool selection and delays the actual trigger phrase. The run-on sentence listing content types is dense but does convey information; one editorial pass would remove the fluff and front-load the 'use when' clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero required parameters, no output schema, and full schema descriptions, the definition covers the trigger and the filterable axes adequately. What is missing is any disambiguation from get_memory_history and any hint about what a result looks like, which matters for a search tool with an open-ended result set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum values carry their own descriptions (including the episodic/semantic/procedural gloss), so the schema does the heavy lifting. The description's 'Filter by category, key pattern or memory type' merely restates the three parameter names and adds no syntax or combination guidance beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description enumerates the resource contents clearly (metrics, deal patterns, account history, decisions, habits Andru has saved), which tells the agent what is being retrieved. However, it never states the verb directly ('search' only appears in the title) and never distinguishes itself from the sibling get_memory_history, which sounds nearly identical in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'use this when the person asks what they decided, learned or recorded before.' That is a clear usage condition an agent can pattern-match against. It stops short of exclusions or naming the alternative (get_memory_history) that would make the routing decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sales_blueprintPlan your first sales hireAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| dealSize | No | Average deal size (e.g., "$15K ACV", "$50K ACV"). Infer from context or ask. | |
| teamSize | No | Current team size. Infer from context if mentioned. | |
| arrTarget | Yes | Annual recurring revenue target (e.g., "$2M", "$5M", "$10M"). Ask the user if not mentioned. | |
| companyStage | Yes | Current funding stage. Infer from conversation context if the user has mentioned it. | |
| avgCycleLength | No | Average sales cycle length (e.g., "30 days", "60 days", "90+ days"). Infer or ask. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond annotations: discloses that the call is paid and that the price must be checked via quote first — critical for a non-read-only, open-world tool. It doesn't cover timeout/expiry of the quote or what happens on failure, but the cost-gating workflow is the key disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the trigger condition, then the deliverables, then the payment prerequisite. Slightly dense and the opening clause ('hand the path they've proven to a first seller') is a bit ornate, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what comes back, and it covers the paid prerequisite. An agent has enough to invoke it correctly; only edge cases (quote expiry, failure semantics) are left to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including inference hints and the idempotency/maxAmountCents safeguards. The description only implicitly links arrTarget to the activity targets and adds no parameter-level detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and enumerates the concrete deliverables (job description, comp structure, interview questions, 90-day ramp plan, activity targets tied to ARR goal), which makes it unmistakably distinct from siblings like generate_asset or get_account_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear triggering condition ('when the person is planning a sales hire') plus the sub-questions it answers (what role, how to pay, how to interview, how to ramp). No explicit exclusions or named alternatives are stated, but the use case is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thesis_matchFind investors who fitAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| stage | Yes | Current funding stage. Infer from context if mentioned. | |
| quoteId | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| arrRange | No | Current ARR range (e.g., "$0-$500K", "$500K-$2M", "$2M-$10M"). Infer or ask. | |
| vertical | No | Industry vertical (e.g., "AI/ML", "FinTech", "HealthTech", "SaaS"). Infer from product description. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. | |
| productDescription | Yes | What the company does and who it serves. Infer from conversation context if the user has already described their product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false, openWorldHint=true, destructiveHint=false; the description goes well beyond them by disclosing that this is a live web search taking about 30 seconds, capped at 3 firms, that only evidence-backed firms are returned, and that the call is paid with a quote-first pricing gate. That is exactly the context an agent needs before spending the user's money.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the usage decision before any mechanics, and nearly every clause carries information (result cap, evidence requirement, source link, latency, pricing). The parentheticals stack up in the second sentence, costing a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters and no output schema, the description still conveys the return shape (up to 3 firms, each with a recent deal or stated focus plus a source URL), the latency, and the billing guardrails. Nothing an agent needs to call this correctly and safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by explaining why quoteId exists (check price with quote first) and setting the expectation that stage/vertical/product info is inferred from conversation. It also bounds the result set to 3, which shapes how maxAmountCents should be reasoned about.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — finds up to 3 VC firms actively investing in companies like the user's, each with sourced evidence — and frames it as 'fundraising, not selling', which separates it from the sales-facing siblings like discover_prospects and get_icp_fit_score. An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the person is raising money and asks which investors to talk to') and an explicit exclusion ('not selling'). It also states the prerequisite workflow: check the price with quote before running, which maps to the quoteId parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_assetsSearch the asset catalogARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | Optional catalog group. | |
| limit | No | Maximum results (default 15). | |
| query | No | Keywords for what you need, e.g. 'board deck', 'buying committee', 'first sales hire'. | |
| available_only | No | Only assets that can be generated today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, and the description adds real substance beyond them: what each result entry contains (identity, business outcome, price, data dependency, same-day generability) — which matters since there is no output schema. It does not discuss result ordering, relevance ranking, or what happens with zero matches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Leads with the usage trigger, then the purpose, then the return shape, then the next step — a coherent progression. It is slightly padded: the inline deliverable examples overlap with the query keyword examples in the schema, and "the person" is repeated awkwardly, but no sentence is disposable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search with no output schema, the description covers entry fields, catalog breadth, and the downstream generate_asset call, which is enough to invoke it correctly. Missing is any note on relevance/pagination behavior beyond the limit parameter already in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including the group enum and the "can be generated today" semantics of available_only. The description only loosely echoes those ideas ("whether it can be generated today") without adding syntax, defaults, or interaction rules between query and group. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: "Searches Andru's catalog of 139 sales, hiring, fundraising and buying assets." The search-vs-retrieve distinction from get_asset is implicit in "Searches" and reinforced by the explicit handoff to generate_asset, so an agent can separate it from the sibling retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete, situational triggers (deliverable for a meeting the person won't attend, business case for the CFO, someone asking what Andru can make) and names the follow-up call to generate_asset. It does not say when NOT to use it — e.g. when the asset name is already known and get_asset is the cheaper call — so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_revenue_insightSave a revenue insightAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Unique identifier for this memory (lowercase_underscored, e.g., "current_arr", "acme_deal_stage"). | |
| value | Yes | The memory content — a concise, specific fact or insight. | |
| domain | No | Business domain this memory relates to. Default: general. | |
| category | Yes | What kind of memory this is. | |
| confidence | No | How confident this memory is (0.0-1.0). Default: 1.0 for founder-stated facts. | |
| memoryType | No | episodic=time-bound fact, semantic=general pattern, procedural=behavioral habit. Default: episodic. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false; the description is consistent with that and adds a genuinely non-obvious behavior: 'Saving an existing key keeps the previous value in its history,' i.e. it is an upsert with retained history. It does not cover return values or whether confidence/memoryType affect merging, leaving some gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the action and the trigger condition, and every clause adds information. The single long sentence with stacked colons is slightly unwieldy, which costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter write tool with full schema coverage, no output schema, and annotations covering the safety profile, the description covers what to save, when to save, and key-reuse behavior. The one notable omission is what the tool returns (e.g., the stored memory id/history reference), which would help an agent confirm the write.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by tying the key parameter to upsert/history behavior, which the schema does not say. Nothing is said about confidence or memoryType semantics beyond the enum descriptions already provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb+resource ('Writing down what each deal taught' → saving a revenue insight) and enumerates the kinds of content it holds: deal decisions, win/loss reasons, ICP refinements, metric updates, strategic pivots. An agent can distinguish this from get_revenue_memory by the verb alone, though the description never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'use this when the person asks you to remember something about their revenue,' followed by concrete example cases that map to the category enum. There are no exclusion conditions or named alternatives, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_companyPreview a companyARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| website | No | The company's website, e.g. acme.com. | |
| previewId | No | From an earlier call, to collect the read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond readOnlyHint/openWorldHint: it discloses the asynchronous two-call pattern (a preview_id is returned, call again with it to collect the read), the ~1 minute latency, and that no account is needed. It even describes the downstream handoff where the preview_id carried into signup_start turns the read into the user's first ICP — context no annotation or schema conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The trigger and beneficiary are front-loaded before any mechanics, and every sentence carries information. The style is choppy ('Send the website. No account needed.') and slightly chatty, but no sentence is expendable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does it: the three content areas of the read are enumerated, plus the preview_id handle and how to collect the result. An agent has everything needed to make both calls correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: 'Send the website' identifies the first-call input and 'call again with it to collect the read' explains that previewId is the second-phase key rather than a filter. That sequencing is not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (preview a company's website read for its buyers) and spells out what the result contains: who the company sells to, the deciding buyers, and site-versus-need gap. The pre-signup framing ('before they have an Andru account') also separates it from account-dependent siblings like assess_company_readiness and get_pre_brief.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Before any outreach') and a clear prerequisite state (person has no Andru account yet, just wants a preview of how the site reads). It does not name a specific alternative tool for the case where the person already has an account, so the boundary is implied rather than routed explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quoteGet the price of a callARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | The tool you plan to call, e.g. get_pre_brief. | |
| arguments | No | The arguments you plan to send with it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnly/openWorld, but the description adds substantive behavior: it returns price, free-call coverage, wallet balance, remaining key spend, and a quote_id valid for 30 minutes. It also discloses the price-hold window and how the quote is redeemed, which the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The critical precondition ('Before spending on the person's behalf') is front-loaded and each sentence adds value. The return-value list is dense but purposeful; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description fully enumerates the return payload plus the quote_id lifecycle, which is exactly what an agent needs to act on the result. It is complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both 'tool' and 'arguments' are already documented. The description restates their role ('Send the tool name and its arguments') but adds no format or edge-case guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Get the price of a call') and frames the purpose in terms of the user's need and the agent's spend decision. An agent can distinguish it from sibling get_* data tools because it is explicitly about pre-costing a paid call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions ('when the person asks what a call would cost, or before running a paid tool') and a follow-up rule ('Pass quote_id with the call to pay the quoted price'). Nothing is left to inference for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_product_contextTell Andru what you sellAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| website | No | Your company website, e.g. acme.com. Andru reads the homepage once. | |
| vertical | No | Optional: the industry you sell into. | |
| targetRole | No | Optional: the buyer role you target, e.g. CFO. | |
| productDescription | No | Or: what your product does and who it is for (2-3 sentences). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already disclose a non-read-only, open-world, idempotent operation. The description adds useful context beyond that: it saves and remembers product information, triggers an approximately 3-minute process, produces a product description and first ICP, and is reused by later calls. It does not clarify overwrite behavior or failure modes, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the triggering condition and is tightly structured. Each sentence adds operational value: when to use it, what to send, what gets produced, how long it takes, and how to inspect the saved result.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a setup tool with full schema coverage and annotations, the description covers the essential context: purpose, trigger condition, inputs, side effects, timing, and no-argument inspection behavior. It leaves a small gap around whether calling again updates or overwrites existing product context, and what the immediate response looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains each parameter. The description still adds value by framing website and productDescription as alternatives and by explaining the no-argument behavior for inspecting saved context. It does not discuss vertical or targetRole, but the schema covers those.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: tell Andru what the company sells so it can save a product description and generate a first ICP. It implicitly distinguishes this from later retrieval tools by saying 'Every later call uses it,' but it does not explicitly name siblings such as get_icp_profile, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to call: when the person tells you what they sell, or Andru does not know the product yet. It also says to send a website or product description once, and that calling with no arguments shows what Andru has saved. It stops short of naming alternative tools or explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signup_startStart sign-upAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | The person's email. The code goes here. | ||
| website | No | Optional: their company website, e.g. acme.com. Andru reads it so its answers are about what they sell. | |
| foundVia | No | 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 | No | Optional: your agent's name. The key is named after it. | |
| previewId | No | Optional: from preview_company. The read becomes their first ICP. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior beyond the annotations: Andru emails a 6-digit code and an Approve button, the caller must handle either code verification or approval polling, and the resulting key is returned through signup_status. It also explains the initial spend limit default, which is important operational context for an otherwise non-read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the trigger condition and the core action, then follows the branching flow efficiently. It is mostly concise, though the final sentence about spend limits is slightly tangential and not tied to any input parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-step sign-up flow with no output schema, the description covers the key branches and the verification/polling sequence well. It does not explicitly state what signup_start itself returns, though the need for request_id in the next step is implied.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already well documented by the input schema. The description reinforces that the email is where the code goes, but it does not add meaningful semantics for website, foundVia, agentName, or previewId beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: starting Andru sign-up or sign-in by sending the person's email. It clearly distinguishes this tool from the follow-up siblings signup_verify and signup_status by explaining which path to take depending on whether the user reads a code or taps Approve.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: when the person asks to sign up for or sign in to Andru from here. It also names the alternatives and the exact conditions for choosing signup_verify versus signup_status, including polling signup_status until it returns the key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signup_statusCheck sign-up approvalAInspect
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".
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | The request_id from signup_start. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnlyHint=false with no guidance, but the description carries the full behavioral load: it enumerates the three outcomes ('waiting' with a retry-after hint, the API key delivered once and needing to be saved, and 'expired'). That retry and one-time-display information is exactly what an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact block: context, precondition, action, then the three possible results in the order the agent will encounter them. Parenthetical clarifications ('shown once; save it', 'ask again after the number of seconds it gives') each prevent a concrete failure mode rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe returns and it does so completely for all three states, including the retry cadence for the pending case. An agent has everything needed to call it and act on any response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single requestId property is already documented as coming from signup_start. The description's 'Send the request_id' restates the schema without adding format, sourcing, or validation detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description makes the operation concrete: poll sign-up status after signup_start for the case where the user approves via email button rather than dictating a code. It implicitly distinguishes itself from signup_start and signup_verify, though the verb+resource framing ('check signup status') relies on the title rather than the prose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call (after signup_start, when the person taps the approval button instead of reading a code) and the alternative path is named by contrast. There is no inference required to pick this over the sibling flow tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signup_verifyFinish sign-up with a codeAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The 6-digit code from the email. | |
| Yes | The email the code was sent to. | ||
| foundVia | No | 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 | No | Optional: your agent's name. The key is named after it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-read-only, non-destructive, closed-world write; the description usefully adds that it consumes a one-time email code and produces a credential (an API key) as its side effect. It doesn't cover failure behavior for an expired or wrong code, which matters for a verification step.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the sequencing precondition and ending with the return value. The leading 'Getting set up:' label is mild filler but costs little.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly discloses the key return value (API key) that an agent needs to proceed. For a 2-required-param, non-destructive flow tool this is largely sufficient; only error/retry semantics are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both required params and the optional foundVia/agentName are already documented in the schema. The description only restates 'send the email and the code' and says nothing about the optional attribution or agent-naming fields, so it adds little beyond structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (complete sign-up by submitting the emailed code) and a concrete outcome (returns an Andru API key for this agent). It explicitly positions itself in the signup_start → signup_verify sequence, so an agent can distinguish it from signup_start and signup_status immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition: use it after signup_start, when the human reads back the 6-digit code. What's missing is the fallback path — nothing says what to do if no code arrived (presumably signup_status) or what to do when verification fails.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_buyer_personaPrepare with buyer role-playAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | 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 | No | Who's in the room, 1–8 people, each with persona (one of the six buyers) and an optional title and name. | |
| stage | No | The deal's stage, 0–7. | |
| meeting | No | The meeting in a sentence, when it isn't on the calendar. | |
| message | No | mode=reply: what the seller says to the buyer. "End role-play. How did I do?" ends with a debrief. | |
| persona | No | 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 | No | Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes). | |
| speaker | No | Who answers this turn (p1, p2…, from the brief). | |
| stageId | No | Buyer journey stage (1=Researching, 2=Quantifying, 3=Exploring, 4=Comparing, 5=Business Case, 6=Implementing, 7=Advocating). Default: 3 (Exploring). | |
| brief_id | No | The brief to open a session from. | |
| situation | No | discovery, deal or customer_review. | |
| meeting_id | No | A meeting from mode=meetings. | |
| session_id | No | The Deal Prep session to continue (returned by mode=opening). Required for mode=reply. | |
| productName | No | Product name. Defaults to the product in their ICP. | |
| session_key | No | Optional idempotency key for opening a session: retrying with the same key never charges twice. | |
| idempotencyKey | No | Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice. | |
| maxAmountCents | No | Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged. | |
| productDescription | No | What the user's product does. Defaults to the product in their ICP. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it is not read-only, open-world and non-destructive; the description adds substantial context beyond that: free vs. paid modes, a 10-briefs-per-day cap, a 25-turn session limit, the exact phrase that ends the session and produces a scored debrief, and a pre-charge price check. These are exactly the operational facts an agent needs before invoking a paid, session-based tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the eligibility condition, then what the tool does, how to end it, the alternative, and the cost — a sensible ordering dense with signal. It is compact for an 18-parameter multi-mode tool, though a few clauses (the two pricing sentences, the quoted trigger phrase) could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-mode, paid, session-oriented tool with no output schema, the description covers the dominant flow (brief → play → debrief) and its cost gate. The secondary modes (meetings, list, brief) are only handled in the schema, which is acceptable at 100% coverage, but return values are not described at all and the description is silent on what a session response contains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all 18 parameters carry their own descriptions, including mode enums, stage/stageId meanings, and idempotency behavior, so the schema does the heavy lifting. The description adds only light framing — that a session opens from a brief and continues via replies until the debrief phrase — rather than explaining parameter interactions beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — role-playing the buyers who will be in the room, with Andru writing a brief then playing them in a 25-turn Deal Prep session — and explicitly separates this from get_pre_brief, the written-brief-only sibling. An agent can tell this apart from every other tool in the list without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gating is explicit: "Use this only when the person asks to talk with, or play out the meeting with, the buyers." An alternative is named with the condition that selects it (get_pre_brief for the brief alone), and the pricing precondition (check quote before running) is given. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiShow this key's account and limitsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description does add useful context on what is returned and implies spending thresholds exist ('without asking'), which matters behaviorally. It does not cover failure modes (e.g., what happens with an invalid or expired key) or the format of the response, so it goes beyond annotations but without much depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence for usage plus one for returns, with the usage trigger front-loaded. The returns clause is a long run-on list, though each item is meaningful and not wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description carries the burden of describing the return value, and it enumerates the returned fields including the portfolios, which are nested in practice. It omits error conditions and whether the returned limit figures are currency amounts or call counts, a small remaining gap for a zero-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters and the description correctly presents it as argument-free, so there is no parameter semantics to explain. Baseline 4 applies for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and enumerates the exact contents returned: account, key name, spend limits for the day and month, wallet balance, free calls left, and portfolios with ids. No sibling in the tool list overlaps with this introspection role, so the scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition: use it when the person asks what the key or connection can spend or how much is left, and front-loads the context 'before spending on the person's behalf'. It does not name alternative tools or exclusions, but no sibling plausibly competes with this one.
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.
7 tool updates
v1.4.10- Changed
get_account_plan1 field changed- changed
Input schema / properties / accountName / descriptionPrevious value: -"The company to plan for, e.g. \"Acme Logistics\"."New value: +"The company to plan for."
- Removed
get_capability_profile - Changed
get_competitive_positioning2 fields changed- changed
Input schema / properties / competitorFeatures / descriptionPrevious value: -"Known competitor features or capabilities"New value: +"What that alternative offers, as you know it." - changed
Input schema / properties / competitorName / descriptionPrevious value: -"Competitor company name"New value: +"The alternative the buyer is weighing (a product or company)."
- Removed
get_founder_wellness - Changed
get_icp_profile3 fields changed- removed
Input schema / properties / includeAntiPatternsRemoved value: -{ - "description": "Include anti-patterns and churn predictors (default: true)", - "type": "boolean" -} - removed
Input schema / properties / includeSevenAnswersRemoved value: -{ - "description": "Include seven critical buyer answers (default: true)", - "type": "boolean" -} - removed
Input schema / properties / layersRemoved value: -{ - "description": "Specific layers to include (1-5). Omit for all layers.", - "items": { - "enum": [ - 1, - 2, - 3, - 4, - 5 - ], - "type": "number" - }, - "type": "array" -}
- Changed
get_messaging_framework1 field changed- removed
Input schema / properties / mbtiCategoryRemoved value: -{ - "description": "Communication style to adapt the message to", - "enum": [ - "Analytical", - "Driver", - "Expressive", - "Amiable" - ], - "type": "string" -}
- Changed
get_pre_brief13 fields changed- removed
Input schema / properties / briefTypeRemoved value: -{ - "description": "Type of meeting brief to generate (default: general)", - "enum": [ - "general", - "discovery", - "demo", - "negotiation", - "renewal", - "expansion" - ], - "type": "string" -} - changed
Input schema / properties / companyName / descriptionPrevious value: -"Company you're meeting with. Andru finds the matching calendar event and pulls attendee context automatically."New value: +"Company you're meeting. Andru looks for the matching meeting on the person's calendar." - removed
Input schema / properties / contactNameRemoved value: -{ - "description": "Name of the person you're meeting (optional — helps match the right event and personalize the brief).", - "type": "string" -} - removed
Input schema / properties / dealIdRemoved value: -{ - "description": "Associated deal ID for additional deal intelligence", - "type": "string" -} - removed
Input schema / properties / eventIdRemoved value: -{ - "description": "Calendar event ID (from Andru calendar integration). If provided, skips calendar search.", - "type": "string" -} - removed
Input schema / properties / idempotencyKeyRemoved value: -{ - "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", - "type": "string" -} - removed
Input schema / properties / maxAmountCentsRemoved value: -{ - "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", - "minimum": 0, - "type": "integer" -} - added
Input schema / properties / meetingAdded value: +{ + "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'.", + "type": "string" +} - added
Input schema / properties / meetingIdAdded value: +{ + "description": "The meeting from the person's calendar (an id from a previous reply). Leave it out and describe the meeting in `meeting` instead.", + "type": "string" +} - removed
Input schema / properties / quoteIdRemoved value: -{ - "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", - "type": "string" -} - added
Input schema / properties / roomAdded value: +{ + "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.", + "items": { + "properties": { + "buyerKey": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "title" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" +} - added
Input schema / properties / situationAdded value: +{ + "description": "What kind of meeting: a discovery call, where they speak first; a deal meeting (demo, pricing, pilot, procurement); or a customer review.", + "enum": [ + "discovery", + "deal", + "customer_review" + ], + "type": "string" +} - added
Input schema / properties / stageAdded value: +{ + "description": "Where the deal is, by the last thing the buyer did (required for a deal meeting).", + "maximum": 7, + "minimum": 0, + "type": "integer" +}
16 tool updates
v1.4.9- Changed
assess_company_readiness3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
consult_agent3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
discover_prospects3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
generate_portfolio_brief3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
get_account_plan3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
get_portfolio_readiness_rollup4 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / portfolioId / descriptionPrevious value: -"The portfolio to roll up. Must belong to the caller."New value: +"The portfolio to roll up. whoami lists yours with their ids." - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
get_pre_brief3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
get_sales_blueprint3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Changed
get_thesis_match3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Added
preview_company - Added
quote - Added
signup_start - Added
signup_status - Added
signup_verify - Changed
simulate_buyer_persona3 fields changed- added
Input schema / properties / idempotencyKeyAdded value: +{ + "description": "Optional: any unique string for this call. Retrying with the same key returns the first result and never charges twice.", + "type": "string" +} - added
Input schema / properties / maxAmountCentsAdded value: +{ + "description": "Optional: the most this call may cost, in cents. If the price is higher, nothing runs and nothing is charged.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Optional: the quote_id from quote, to pay the quoted price (held for 30 minutes).", + "type": "string" +}
- Added
whoami
5 tool updates
v1.4.8- Changed
generate_asset2 fields changed- added
Input schema / properties / prospectCompanyAdded value: +{ + "description": "For a prospect asset (Pre-Call Intelligence Brief, Deal Reengagement Strategy, Personalized Cost of Inaction One-Pager): the company it is for.", + "type": "string" +} - added
Input schema / properties / prospectContactAdded value: +{ + "description": "For a prospect asset: the person it is for, name and title.", + "type": "string" +}
- Changed
generate_portfolio_brief3 fields changed- added
Input schema / properties / companiesAdded value: +{ + "description": "The portfolio companies to brief, up to 15. Saved as a portfolio on your account the first time.", + "items": { + "properties": { + "name": { + "type": "string" + }, + "website": { + "description": "e.g. example.com; tells companies with similar names apart.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "maxItems": 15, + "type": "array" +} - changed
Input schema / properties / portfolioId / descriptionPrevious value: -"The portfolio to brief. Must belong to the caller."New value: +"A portfolio already on your account (returned by an earlier brief). With companies, they are added to it." - removed
Input schema / requiredRemoved value: -[ - "portfolioId" -]
- Changed
get_account_plan7 fields changed- changed
Input schema / properties / accountName / descriptionPrevious value: -"Target account/company name"New value: +"The company to plan for, e.g. \"Acme Logistics\"." - removed
Input schema / properties / dealContextRemoved value: -{ - "description": "Current deal context", - "properties": { - "nextMeeting": { - "description": "Next meeting date/context", - "type": "string" - }, - "stage": { - "description": "Current deal stage", - "type": "string" - }, - "value": { - "description": "Deal value", - "type": "number" - } - }, - "type": "object" -} - removed
Input schema / properties / domainRemoved value: -{ - "description": "Company domain", - "type": "string" -} - removed
Input schema / properties / industryRemoved value: -{ - "description": "Industry vertical", - "type": "string" -} - added
Input schema / properties / productDescriptionAdded value: +{ + "description": "What you sell to this account, if different from the product saved in Andru (a sentence or two).", + "type": "string" +} - added
Input schema / properties / refreshAdded value: +{ + "description": "Build a new plan even if one from the last 30 days exists ($12). Default false.", + "type": "boolean" +} - removed
Input schema / properties / stakeholdersRemoved value: -{ - "description": "Known stakeholders at the account", - "items": { - "properties": { - "name": { - "type": "string" - }, - "role": { - "description": "Buying committee role (champion, economic_buyer, etc.)", - "type": "string" - }, - "title": { - "type": "string" - } - }, - "type": "object" - }, - "type": "array" -}
- Changed
get_asset1 field changed- changed
Input schema / properties / job_id / descriptionPrevious value: -"The job_id returned by generate_asset."New value: +"The job_id returned by generate_asset, generate_portfolio_brief or get_account_plan."
- Changed
simulate_buyer_persona14 fields changed- added
Input schema / properties / brief_idAdded value: +{ + "description": "The brief to open a session from.", + "type": "string" +} - added
Input schema / properties / meetingAdded value: +{ + "description": "The meeting in a sentence, when it isn't on the calendar.", + "type": "string" +} - added
Input schema / properties / meeting_idAdded value: +{ + "description": "A meeting from mode=meetings.", + "type": "string" +} - changed
Input schema / properties / mode / descriptionPrevious value: -"opening = open a session ($5) and get the buyer's opening line. reply = send the seller's next message on session_id. list = available personas. Default: opening."New value: +"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)." - changed
Input schema / properties / mode / enumPrevious value: -[ - "opening", - "reply", - "list" -]New value: +[ + "meetings", + "brief", + "opening", + "reply", + "list" +] - changed
Input schema / properties / persona / descriptionPrevious value: -"Which buyer to simulate. Pick based on who the user is preparing to meet."New value: +"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." - removed
Input schema / properties / persona / enumRemoved value: -[ - "CFO", - "CTO", - "COO", - "VP Sales", - "VP Engineering" -] - changed
Input schema / properties / productDescription / descriptionPrevious value: -"What the user's product does. Infer from conversation context."New value: +"What the user's product does. Defaults to the product in their ICP." - changed
Input schema / properties / productName / descriptionPrevious value: -"Product name. Infer from context."New value: +"Product name. Defaults to the product in their ICP." - added
Input schema / properties / roomAdded value: +{ + "description": "Who's in the room, 1–8 people, each with persona (one of the six buyers) and an optional title and name.", + "items": { + "properties": { + "name": { + "type": "string" + }, + "persona": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "persona" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / situationAdded value: +{ + "description": "discovery, deal or customer_review.", + "enum": [ + "discovery", + "deal", + "customer_review" + ], + "type": "string" +} - added
Input schema / properties / speakerAdded value: +{ + "description": "Who answers this turn (p1, p2…, from the brief).", + "type": "string" +} - added
Input schema / properties / stageAdded value: +{ + "description": "The deal's stage, 0–7.", + "enum": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7 + ], + "type": "number" +} - changed
Input schema / properties / stageId / descriptionPrevious value: -"Buyer journey stage (1=Researching through 7=Advocating). Default: 3."New value: +"Buyer journey stage (1=Researching, 2=Quantifying, 3=Exploring, 4=Comparing, 5=Business Case, 6=Implementing, 7=Advocating). Default: 3 (Exploring)."
4 tool updates
v1.4.4- Changed
assess_company_readiness1 field changed- changed
Input schema / properties / metrics / descriptionPrevious value: -"Operating metrics (any subset): arr, mrr, growthRate, netRevenueRetention, grossMargin, cac, ltv, burnRate, runwayMonths, pipelineValue, customerCount, churnRate, etc."New value: +"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."
- Changed
discover_prospects3 fields changed- changed
Input schema / properties / companyName / descriptionPrevious value: -"Your company name"New value: +"Your company name. Defaults to the product saved on your account." - changed
Input schema / properties / productDescription / descriptionPrevious value: -"What your product does and who it's for. Infer from conversation context if the user has already described their product."New value: +"What your product does and who it's for. Defaults to the product saved on your account." - removed
Input schema / requiredRemoved value: -[ - "companyName", - "productDescription" -]
- Changed
generate_portfolio_brief2 fields changed- changed
Input schema / properties / periodEnd / descriptionPrevious value: -"Optional ISO date for the period end."New value: +"Optional ISO date for the period end. Default: the end of the last full period." - changed
Input schema / properties / periodStart / descriptionPrevious value: -"Optional ISO date for the period start."New value: +"Optional ISO date for the period start. Default: the start of the last full period."
- Changed
get_founder_wellness1 field changed- removed
Input schema / properties / userIdRemoved value: -{ - "description": "The user's Andru account ID. Required for personalized wellness tracking.", - "type": "string" -}
13 tool updates
v1.4.1- Added
assess_company_readiness - Added
consult_agent - Added
generate_asset - Added
generate_portfolio_brief - Added
get_asset - Added
get_market_signals - Changed
get_messaging_framework1 field changed- changed
Input schema / properties / mbtiCategory / descriptionPrevious value: -"MBTI communication category for message adaptation"New value: +"Communication style to adapt the message to"
- Added
get_portfolio_readiness_rollup - Removed
get_syndication_status - Added
list_assets - Added
set_product_context - Changed
simulate_buyer_persona8 fields changed- added
Input schema / properties / messageAdded value: +{ + "description": "mode=reply: what the seller says to the buyer. \"End role-play. How did I do?\" ends with a debrief.", + "type": "string" +} - changed
Input schema / properties / mode / descriptionPrevious value: -"opening = buyer's opening message. list = available personas. Default: opening."New value: +"opening = open a session ($5) and get the buyer's opening line. reply = send the seller's next message on session_id. list = available personas. Default: opening." - changed
Input schema / properties / mode / enumPrevious value: -[ - "opening", - "list" -]New value: +[ + "opening", + "reply", + "list" +] - added
Input schema / properties / session_idAdded value: +{ + "description": "The Deal Prep session to continue (returned by mode=opening). Required for mode=reply.", + "type": "string" +} - added
Input schema / properties / session_keyAdded value: +{ + "description": "Optional idempotency key for opening a session: retrying with the same key never charges twice.", + "type": "string" +} - changed
Input schema / properties / stageId / descriptionPrevious value: -"Buyer journey stage (0=Unaware through 7=Advocating). Default: 3."New value: +"Buyer journey stage (1=Researching through 7=Advocating). Default: 3." - changed
Input schema / properties / stageId / enumPrevious value: -[ - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7 -]New value: +[ + 1, + 2, + 3, + 4, + 5, + 6, + 7 +] - changed
Input schema / requiredPrevious value: -[ - "persona" -]New value: +[]
- Removed
trigger_syndication
23 tool updates
v1.4.0- First observed
batch_fit_score - First observed
classify_opportunity - First observed
discover_prospects - First observed
get_account_plan - First observed
get_capability_profile - First observed
get_competitive_positioning - First observed
get_disqualification_signals - First observed
get_evaluation_criteria - First observed
get_founder_context - First observed
get_founder_wellness - First observed
get_icp_fit_score - First observed
get_icp_profile - First observed
get_memory_history - First observed
get_messaging_framework - First observed
get_persona_profile - First observed
get_pre_brief - First observed
get_revenue_memory - First observed
get_sales_blueprint - First observed
get_syndication_status - First observed
get_thesis_match - First observed
log_revenue_insight - First observed
simulate_buyer_persona - First observed
trigger_syndication
TDQS
Scored across 34 tools
Most tools have distinct purposes, but the set contains several overlapping assessment tools (get_icp_fit_score, batch_fit_score, classify_opportunity, get_disqualification_signals, get_evaluation_criteria, assess_company_readiness) and several memory/context tools (get_founder_context, get_revenue_memory, get_memory_history). The descriptions cross-reference alternatives well, but with 34 tools an agent can still plausibly misselect among the fit/scoring and memory families.
Most names are snake_case and follow a verb_noun pattern (get_, list_, generate_, assess_, classify_). A few deviations exist, such as whoami, quote, signup_start/verify/status, and batch_fit_score, but they are grouped and readable rather than chaotic.
The set is large at 34 tools, above the practical range for a single MCP surface even for a broad sales/revenue platform. Many tools are distinct, but the surface would benefit from consolidation or splitting into narrower modules.
Coverage is broad across ICP, prospecting, meeting prep, scoring, memory, portfolio, assets, billing, and fundraising. However, lifecycle management is thin: there is no clear listing or management of saved assets/account plans/prospects, and no update/delete operations for most saved objects beyond keeping memory history.
Maintenance
Related MCP Connectors
Sales intelligence for B2B SMEs — lead scoring, ICP fit, CRM enrichment & writeback.
Cold engine for B2B founders. Detects buying signals, drafts outreach, books qualified meetings.
AI-native GTM OS for B2B SaaS — account health, pipeline, renewals, territories, and benchmarks.
AI sales — prospect discovery, ICP scoring, outreach generation.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive B2B intelligence server providing over 48 tools for lead generation, company research, and sales automation via the Model Context Protocol. It enables AI-powered prospect discovery, enrichment, and competitive analysis through seamless integrations with Make.com, Claude Desktop, and Apify.2MIT
- AlicenseNot gradedqualityBmaintenanceBattle cards and scored practice calls against an AI buyer, for any company vs any competitor. From Battlecard: score every call, rehearse every gap.MIT
- AlicenseAqualityAmaintenanceGTM signal intelligence suite for AI agents. Six tools: hiring signals, tech stack detection, company-to-LinkedIn resolution, ICP scoring, job board scanning, and a combined signals aggregator. Built for outbound sales workflows.21140 npm3MIT
- AlicenseNot gradedqualityAmaintenanceSales intelligence for DACH & EU SMEs — lead scoring, ICP fit, CRM enrichment & writeback.MIT