get_disqualification_signals
Identify deals unlikely to close by analyzing company ICP fit, anti-patterns, and churn signals to determine whether to continue investing or walk away.
Instructions
Find out if you're wasting time on a deal that won't close. Runs the company through three layers of signal — ICP fit, anti-pattern matching, and churn patterns — and tells you whether to keep investing or walk away.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| companyName | No | Company name to check | |
| industry | No | Industry | |
| employeeCount | No | Number of employees | |
| revenue | No | Revenue range | |
| geography | No | Location | |
| techStack | No | Technologies they use | |
| dealContext | No | Current deal context (if applicable) | |
| 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. | |
| 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. |
Implementation Reference
- src/catalog.js:91-116 (schema)Definition and schema for the get_disqualification_signals tool.
name: 'get_disqualification_signals', description: 'Find out if you\'re wasting time on a deal that won\'t close. Runs the company through three layers of signal — ICP fit, anti-pattern matching, and churn patterns — and tells you whether to keep investing or walk away.', annotations: READ_ONLY, inputSchema: { type: 'object', properties: { companyName: { type: 'string', description: 'Company name to check' }, industry: { type: 'string', description: 'Industry' }, employeeCount: { type: 'number', description: 'Number of employees' }, revenue: { type: 'string', description: 'Revenue range' }, geography: { type: 'string', description: 'Location' }, techStack: { type: 'array', items: { type: 'string' }, description: 'Technologies they use' }, dealContext: { type: 'object', properties: { dealValue: { type: 'number', description: 'Deal value' }, stage: { type: 'string', description: 'Current deal stage' }, daysInPipeline: { type: 'number', description: 'Days since deal entered pipeline' }, championIdentified: { type: 'boolean', description: 'Has a champion been identified?' }, }, description: 'Current deal context (if applicable)', }, ...COLD_START_PARAMS, }, }, }, - src/server.js:47-69 (handler)The request handler for all tools, which proxies tool execution to the Andru backend API via the AndruClient.
server.setRequestHandler( CallToolRequestSchema, async (request) => { if (!client) { return { content: [{ type: 'text', text: JSON.stringify({ error: 'ANDRU_API_KEY not configured. Tool execution requires an API key.' }) }], isError: true, }; } const { name, arguments: args } = request.params; try { return await client.callTool(name, args || {}); } catch (error) { return { content: [{ type: 'text', text: JSON.stringify({ error: error.message }), }], isError: true, }; } } ); - src/client.js:36-38 (helper)The underlying API client method that makes the actual HTTP POST request to the backend to execute the tool logic.
async callTool(name, args) { return this.post('/api/mcp/tools/call', { tool: name, arguments: args }); }