Jake Shore a78d044005 housecall-pro: Complete MCP server with 112 tools and 15 React apps
- 112 MCP tools across 17 domains (jobs, customers, estimates, invoices, payments, employees, scheduling, dispatch, tags, notifications, reviews, reporting, price book, leads, webhooks, time tracking, settings)
- 15 React apps with proper Vite build setup and dark theme
- Full API client with Bearer auth, pagination, error handling, rate limiting
- Complete TypeScript types for all entities
- TSC passes clean
- GHL-quality standard achieved
2026-02-12 17:48:10 -05:00

180 lines
4.6 KiB
TypeScript

/**
* Lead Management Tools
*/
import { HousecallProClient } from '../clients/housecall-pro.js';
export function registerLeadsTools(client: HousecallProClient) {
return {
list_leads: {
description: 'List all leads with optional filters',
parameters: {
type: 'object',
properties: {
status: {
type: 'string',
enum: ['new', 'contacted', 'qualified', 'converted', 'lost'],
description: 'Filter by lead status',
},
source: {
type: 'string',
description: 'Filter by lead source',
},
assigned_to: {
type: 'string',
description: 'Filter by assigned employee ID',
},
created_after: {
type: 'string',
description: 'Filter leads created after this date (ISO 8601)',
},
page: {
type: 'number',
description: 'Page number (default: 1)',
},
page_size: {
type: 'number',
description: 'Items per page (default: 50)',
},
},
},
handler: async (params: any) => {
const leads = await client.listLeads(params);
return { leads, count: leads.length };
},
},
get_lead: {
description: 'Get detailed information about a specific lead',
parameters: {
type: 'object',
properties: {
lead_id: {
type: 'string',
description: 'Lead ID',
},
},
required: ['lead_id'],
},
handler: async (params: { lead_id: string }) => {
const lead = await client.getLead(params.lead_id);
return lead;
},
},
create_lead: {
description: 'Create a new lead',
parameters: {
type: 'object',
properties: {
first_name: {
type: 'string',
description: 'First name',
},
last_name: {
type: 'string',
description: 'Last name',
},
email: {
type: 'string',
description: 'Email address',
},
phone: {
type: 'string',
description: 'Phone number',
},
source: {
type: 'string',
description: 'Lead source (e.g., "Google", "Referral")',
},
notes: {
type: 'string',
description: 'Lead notes',
},
assigned_to: {
type: 'string',
description: 'Employee ID to assign to',
},
},
required: ['first_name', 'last_name'],
},
handler: async (params: any) => {
const lead = await client.createLead(params);
return lead;
},
},
update_lead: {
description: 'Update an existing lead',
parameters: {
type: 'object',
properties: {
lead_id: {
type: 'string',
description: 'Lead ID',
},
status: {
type: 'string',
enum: ['new', 'contacted', 'qualified', 'converted', 'lost'],
description: 'Lead status',
},
notes: {
type: 'string',
description: 'Lead notes',
},
assigned_to: {
type: 'string',
description: 'Employee ID to assign to',
},
},
required: ['lead_id'],
},
handler: async (params: any) => {
const { lead_id, ...updateData } = params;
const lead = await client.updateLead(lead_id, updateData);
return lead;
},
},
convert_lead_to_customer: {
description: 'Convert a lead to a customer',
parameters: {
type: 'object',
properties: {
lead_id: {
type: 'string',
description: 'Lead ID',
},
create_job: {
type: 'boolean',
description: 'Also create an initial job',
},
},
required: ['lead_id'],
},
handler: async (params: any) => {
const result = await client.convertLeadToCustomer(params.lead_id, params.create_job);
return result;
},
},
delete_lead: {
description: 'Delete a lead',
parameters: {
type: 'object',
properties: {
lead_id: {
type: 'string',
description: 'Lead ID',
},
},
required: ['lead_id'],
},
handler: async (params: { lead_id: string }) => {
const result = await client.deleteLead(params.lead_id);
return result;
},
},
};
}