marketo_create_or_update_lead
Create or update leads in Marketo by providing contact information, ensuring data accuracy and eliminating duplicate entries through automated synchronization.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| input | Yes | ||
| lookupField | No | ||
| partitionName | No |
Implementation Reference
- src/index.ts:449-493 (registration)Registration of the 'marketo_create_or_update_lead' tool, including inline input schema and handler function that sends a POST request to Marketo's /rest/v1/leads.json endpoint.server.tool( 'marketo_create_or_update_lead', { input: z.array( z.object({ email: z.string().email(), firstName: z.string().optional(), lastName: z.string().optional(), company: z.string().optional(), title: z.string().optional(), phone: z.string().optional(), address: z.string().optional(), city: z.string().optional(), state: z.string().optional(), zipCode: z.string().optional(), country: z.string().optional(), website: z.string().optional(), customFields: z.record(z.string(), z.any()).optional(), }) ), lookupField: z.enum(['email', 'id', 'cookie']).optional(), partitionName: z.string().optional(), }, async ({ input, lookupField = 'email', partitionName }) => { try { const data = { input, lookupField, partitionName, }; const response = await makeApiRequest('/rest/v1/leads.json', 'POST', data); return { content: [{ type: 'text', text: JSON.stringify(response, null, 2) }], }; } catch (error: any) { return { content: [ { type: 'text', text: `Error: ${error.response?.data?.message || error.message}` }, ], }; } } );
- src/index.ts:472-492 (handler)The handler function for the tool, which prepares the lead data and makes an authenticated POST request to create or update leads via the Marketo Leads API.async ({ input, lookupField = 'email', partitionName }) => { try { const data = { input, lookupField, partitionName, }; const response = await makeApiRequest('/rest/v1/leads.json', 'POST', data); return { content: [{ type: 'text', text: JSON.stringify(response, null, 2) }], }; } catch (error: any) { return { content: [ { type: 'text', text: `Error: ${error.response?.data?.message || error.message}` }, ], }; } }
- src/index.ts:452-470 (schema)Zod schema defining the input parameters: an array of lead objects with standard fields and optional custom fields, plus lookupField and partitionName.input: z.array( z.object({ email: z.string().email(), firstName: z.string().optional(), lastName: z.string().optional(), company: z.string().optional(), title: z.string().optional(), phone: z.string().optional(), address: z.string().optional(), city: z.string().optional(), state: z.string().optional(), zipCode: z.string().optional(), country: z.string().optional(), website: z.string().optional(), customFields: z.record(z.string(), z.any()).optional(), }) ), lookupField: z.enum(['email', 'id', 'cookie']).optional(), partitionName: z.string().optional(),
- src/index.ts:22-52 (helper)Helper function used by the tool to make authenticated API requests to Marketo using axios, handling token retrieval and content types.async function makeApiRequest( endpoint: string, method: string, data?: any, contentType: string = 'application/json' ) { const token = await tokenManager.getToken(); const headers: any = { Authorization: `Bearer ${token}`, }; if (contentType) { headers['Content-Type'] = contentType; } try { const response = await axios({ url: `${MARKETO_BASE_URL}${endpoint}`, method: method, data: contentType === 'application/x-www-form-urlencoded' ? new URLSearchParams(data).toString() : data, headers, }); return response.data; } catch (error: any) { console.error('API request failed:', error.response?.data || error.message); throw error; } }