classify_opportunity
Analyze sales deals to determine fit, identify risks, and recommend actions using multiple scoring engines for comprehensive assessment.
Instructions
Run a full read on a deal in one call — fit score, persona match, risk flags, disqualification check, and a verdict: pursue, pause, or walk away. Combines multiple scoring engines for a comprehensive assessment.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| companyName | Yes | Company name | |
| contactTitle | No | Primary contact job title | |
| industry | No | Industry | |
| employeeCount | No | Number of employees | |
| revenue | No | Revenue range | |
| geography | No | Location | |
| dealValue | No | Estimated deal value | |
| dealStage | No | Current deal stage | |
| techStack | No | Technologies used | |
| painPoints | No | Known pain points | |
| 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. | |
| 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:166-186 (registration)Definition of the 'classify_opportunity' tool in the static catalog.
{ name: 'classify_opportunity', description: 'Run a full read on a deal in one call — fit score, persona match, risk flags, disqualification check, and a verdict: pursue, pause, or walk away. Combines multiple scoring engines for a comprehensive assessment.', annotations: READ_ONLY, inputSchema: { type: 'object', properties: { companyName: { type: 'string', description: 'Company name' }, contactTitle: { type: 'string', description: 'Primary contact job title' }, industry: { type: 'string', description: 'Industry' }, employeeCount: { type: 'number', description: 'Number of employees' }, revenue: { type: 'string', description: 'Revenue range' }, geography: { type: 'string', description: 'Location' }, dealValue: { type: 'number', description: 'Estimated deal value' }, dealStage: { type: 'string', description: 'Current deal stage' }, techStack: { type: 'array', items: { type: 'string' }, description: 'Technologies used' }, painPoints: { type: 'array', items: { type: 'string' }, description: 'Known pain points' }, triggerEvents: { type: 'array', items: { type: 'string' }, description: 'Trigger events' }, championIdentified: { type: 'boolean', description: 'Has a champion been identified?' }, competitorInvolved: { type: 'string', description: 'Known competitor in the deal' }, ...COLD_START_PARAMS, - src/server.js:47-69 (handler)The MCP RequestHandler that proxies tool calls (including classify_opportunity) to the Andru backend API.
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 (handler)The AndruClient method that makes the actual HTTP POST request to the backend for the tool execution.
async callTool(name, args) { return this.post('/api/mcp/tools/call', { tool: name, arguments: args }); }