smartlead-mcp-server
Version:
MCP server for Smartlead campaign management integration. Features include creating campaigns, updating campaign settings, and managing campaign sequences.
241 lines • 8.18 kB
JavaScript
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
import { isListLeadsParams, isGetLeadParams, isAddLeadToCampaignParams, isUpdateLeadParams, isUpdateLeadStatusParams, isBulkImportLeadsParams, isDeleteLeadParams } from '../types/lead.js';
// Handler for lead-related tools
export async function handleLeadTool(toolName, args, apiClient, withRetry) {
switch (toolName) {
case 'smartlead_list_leads': {
return handleListLeads(args, apiClient, withRetry);
}
case 'smartlead_get_lead': {
return handleGetLead(args, apiClient, withRetry);
}
case 'smartlead_add_lead_to_campaign': {
return handleAddLeadToCampaign(args, apiClient, withRetry);
}
case 'smartlead_update_lead': {
return handleUpdateLead(args, apiClient, withRetry);
}
case 'smartlead_update_lead_status': {
return handleUpdateLeadStatus(args, apiClient, withRetry);
}
case 'smartlead_bulk_import_leads': {
return handleBulkImportLeads(args, apiClient, withRetry);
}
case 'smartlead_delete_lead': {
return handleDeleteLead(args, apiClient, withRetry);
}
default:
throw new Error(`Unknown lead tool: ${toolName}`);
}
}
// Individual handlers for each tool
async function handleListLeads(args, apiClient, withRetry) {
if (!isListLeadsParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_list_leads');
}
try {
// Build query parameters from args
const params = new URLSearchParams();
if (args.campaign_id !== undefined) {
params.append('campaign_id', args.campaign_id.toString());
}
if (args.status !== undefined) {
params.append('status', args.status);
}
if (args.limit !== undefined) {
params.append('limit', args.limit.toString());
}
if (args.offset !== undefined) {
params.append('offset', args.offset.toString());
}
if (args.search !== undefined) {
params.append('search', args.search);
}
if (args.start_date !== undefined) {
params.append('start_date', args.start_date);
}
if (args.end_date !== undefined) {
params.append('end_date', args.end_date);
}
const response = await withRetry(async () => apiClient.get('/leads', { params }), 'list leads');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleGetLead(args, apiClient, withRetry) {
if (!isGetLeadParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_get_lead');
}
try {
const response = await withRetry(async () => apiClient.get(`/leads/${args.lead_id}`), 'get lead');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleAddLeadToCampaign(args, apiClient, withRetry) {
if (!isAddLeadToCampaignParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_add_lead_to_campaign');
}
try {
const response = await withRetry(async () => apiClient.post(`/campaigns/${args.campaign_id}/leads`, args), 'add lead to campaign');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleUpdateLead(args, apiClient, withRetry) {
if (!isUpdateLeadParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_update_lead');
}
const { lead_id, ...leadData } = args;
try {
const response = await withRetry(async () => apiClient.put(`/leads/${lead_id}`, leadData), 'update lead');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleUpdateLeadStatus(args, apiClient, withRetry) {
if (!isUpdateLeadStatusParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_update_lead_status');
}
const { lead_id, status } = args;
try {
const response = await withRetry(async () => apiClient.put(`/leads/${lead_id}/status`, { status }), 'update lead status');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleBulkImportLeads(args, apiClient, withRetry) {
if (!isBulkImportLeadsParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_bulk_import_leads');
}
try {
const response = await withRetry(async () => apiClient.post(`/campaigns/${args.campaign_id}/leads/bulk`, {
leads: args.leads
}), 'bulk import leads');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
async function handleDeleteLead(args, apiClient, withRetry) {
if (!isDeleteLeadParams(args)) {
throw new McpError(ErrorCode.InvalidParams, 'Invalid arguments for smartlead_delete_lead');
}
try {
const response = await withRetry(async () => apiClient.delete(`/leads/${args.lead_id}`), 'delete lead');
return {
content: [
{
type: 'text',
text: JSON.stringify(response.data, null, 2),
},
],
isError: false,
};
}
catch (error) {
return {
content: [{
type: 'text',
text: `API Error: ${error.response?.data?.message || error.message}`
}],
isError: true,
};
}
}
//# sourceMappingURL=lead.js.map