update_profile
Update customer profile information in Klaviyo by modifying email, phone number, name, and custom properties for targeted marketing.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ID of the profile to update | |
| No | Email address of the profile | ||
| phone_number | No | Phone number of the profile | |
| external_id | No | External ID for the profile | |
| first_name | No | First name of the profile | |
| last_name | No | Last name of the profile | |
| properties | No | Additional properties for the profile |
Implementation Reference
- src/tools/profiles.js:100-148 (registration)Registration of the 'update_profile' MCP tool, including inline schema, handler function, and description.server.tool( "update_profile", { id: z.string().describe("ID of the profile to update"), email: z.string().email().optional().describe("Email address of the profile"), phone_number: z.string().optional().describe("Phone number of the profile"), external_id: z.string().optional().describe("External ID for the profile"), first_name: z.string().optional().describe("First name of the profile"), last_name: z.string().optional().describe("Last name of the profile"), properties: z.record(z.any()).optional().describe("Additional properties for the profile") }, async (params) => { try { const { id, ...rest } = params; const attributes = {}; // Add all provided fields to attributes for (const [key, value] of Object.entries(rest)) { if (value !== undefined && key !== 'properties') { attributes[key] = value; } } // Add properties if provided if (params.properties) { attributes.properties = params.properties; } const payload = { data: { type: "profile", id, attributes } }; const result = await klaviyoClient.patch(`/profiles/${id}/`, payload); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Error updating profile: ${error.message}` }], isError: true }; } }, { description: "Update an existing profile in Klaviyo" } );
- src/tools/profiles.js:111-147 (handler)The handler function that destructures parameters, builds the JSON:API payload for profile update, calls klaviyoClient.patch, and returns the result or error response.async (params) => { try { const { id, ...rest } = params; const attributes = {}; // Add all provided fields to attributes for (const [key, value] of Object.entries(rest)) { if (value !== undefined && key !== 'properties') { attributes[key] = value; } } // Add properties if provided if (params.properties) { attributes.properties = params.properties; } const payload = { data: { type: "profile", id, attributes } }; const result = await klaviyoClient.patch(`/profiles/${id}/`, payload); return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Error updating profile: ${error.message}` }], isError: true }; } }, { description: "Update an existing profile in Klaviyo" }
- src/tools/profiles.js:102-110 (schema)Zod validation schema defining the input parameters for the 'update_profile' tool.{ id: z.string().describe("ID of the profile to update"), email: z.string().email().optional().describe("Email address of the profile"), phone_number: z.string().optional().describe("Phone number of the profile"), external_id: z.string().optional().describe("External ID for the profile"), first_name: z.string().optional().describe("First name of the profile"), last_name: z.string().optional().describe("Last name of the profile"), properties: z.record(z.any()).optional().describe("Additional properties for the profile") },
- src/klaviyo-client.js:192-200 (helper)The patch helper function used by the update_profile handler to make the HTTP PATCH request to Klaviyo API with retry logic.export async function patch(endpoint, data, fallbackFn) { return executeWithRetry( () => client.patch(endpoint, data), 'PATCH', endpoint, data, fallbackFn ); }