; never add empty paragraphs or \ ; never add empty paragraphs or \
\
for spacing). Merge fields need a fallback with this syntax: \{\{ first_name | there \}\}, \{\{ company_name | your company \}\}, \{\{ position | your role \}\}, \{\{ industry | your industry \}\}, \{\{ website | your website \}\} (not default("...")); a bare \{\{company_name\}\} renders empty when the company is unknown. End every body with \{\{sender_signature\}\} on its own line, then \{\{unsubscribe_text\}\} on its own line, and nothing after them; never type your own sign-off (Best regards, name) or unsubscribe sentence, those two variables render them. They and sender_* fields take no fallback.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `name` | `string` | Yes | Campaign name shown in the app. |
| `emailAccountId` | `string` | Yes | Required by the schema but not used: a campaign is not tied to one mailbox. Sending mailboxes are picked per contact in add_prospect_to_campaign. Pass any mailbox id from list_email_accounts. |
| `steps` | `object[]` | Yes | The emails of the sequence, in order, one object per email. At least one step is needed before contacts can be added. |
| `steps[].subject` | `string` | Yes | Subject line. Merge fields need a fallback, e.g. Quick idea for \{\{ company_name \| your team \}\}. |
| `steps[].body` | `string` | Yes | Plain text, one paragraph per line, no blank lines, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\} on their own lines. |
| `steps[].delayDays` | `number` | No | Whole days to wait after the previous step. 0 for the first step. Default 0. |
| `settings` | `object` | No | Optional sending schedule object; omitted keys use the defaults. daysRange: days of the week it may send, numbers 0-6 where 0 is Sunday, default [1,2,3,4,5] (Monday to Friday). timeSlot: sending window \{ start, end \} in whole hours (0-23) of the campaign timezone, default \{ start: 9, end: 17 \}. timezone: IANA timezone of the window, default America/New_York; supported: America/Los_Angeles, America/Denver, America/Chicago, America/New_York, UTC, Europe/London, Europe/Paris, Europe/Athens, Australia/Perth, Australia/Adelaide, Australia/Sydney, Asia/Dubai, Asia/Riyadh, Asia/Karachi, Asia/Kolkata, Asia/Dhaka, Asia/Ho_Chi_Minh, Asia/Tokyo, Pacific/Guadalcanal, Pacific/Auckland, Pacific/Midway, Pacific/Honolulu, America/Anchorage, America/Puerto_Rico, America/St_Johns, America/Sao_Paulo. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_campaign",
"title": "Create email campaign",
"annotations": {
"title": "Create email campaign",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"name": {
"type": "string",
"description": "Campaign name shown in the app."
},
"emailAccountId": {
"type": "string",
"description": "Required by the schema but not used: a campaign is not tied to one mailbox. Sending mailboxes are picked per contact in add_prospect_to_campaign. Pass any mailbox id from list_email_accounts."
},
"steps": {
"type": "array",
"description": "The emails of the sequence, in order, one object per email. At least one step is needed before contacts can be added.",
"items": {
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "Subject line. Merge fields need a fallback, e.g. Quick idea for {{ company_name | your team }}."
},
"body": {
"type": "string",
"description": "Plain text, one paragraph per line, no blank lines, ending with {{sender_signature}} then {{unsubscribe_text}} on their own lines."
},
"delayDays": {
"type": "number",
"description": "Whole days to wait after the previous step. 0 for the first step. Default 0."
}
},
"required": [
"subject",
"body"
]
}
},
"settings": {
"type": "object",
"description": "Optional sending schedule object; omitted keys use the defaults. daysRange: days of the week it may send, numbers 0-6 where 0 is Sunday, default [1,2,3,4,5] (Monday to Friday). timeSlot: sending window { start, end } in whole hours (0-23) of the campaign timezone, default { start: 9, end: 17 }. timezone: IANA timezone of the window, default America/New_York; supported: America/Los_Angeles, America/Denver, America/Chicago, America/New_York, UTC, Europe/London, Europe/Paris, Europe/Athens, Australia/Perth, Australia/Adelaide, Australia/Sydney, Asia/Dubai, Asia/Riyadh, Asia/Karachi, Asia/Kolkata, Asia/Dhaka, Asia/Ho_Chi_Minh, Asia/Tokyo, Pacific/Guadalcanal, Pacific/Auckland, Pacific/Midway, Pacific/Honolulu, America/Anchorage, America/Puerto_Rico, America/St_Johns, America/Sao_Paulo."
}
},
"required": [
"websiteId",
"name",
"emailAccountId",
"steps"
]
}
}
```
# create_contact (/docs/mcp/tools/create-contact)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_contact.mdx. */}
**Create contact** · Changes data
Saves a new person record (name, job title, company domain) and returns it with its _id. Its main use is to get a contactId for verify_contact. To find new people use search_people. To push someone into a CRM use push_lead_to_crm. The name, position, company domain and email (businessEmail, or personalEmail when there is no work email) are stored; phone and LinkedIn are not. Costs nothing. Errors: 405 when firstName, lastName or position is missing.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. Required by the tool schema; the saved record is not linked to it. |
| `firstName` | `string` | Yes | Person's first name. Required. |
| `lastName` | `string` | Yes | Person's last name. Required. |
| `position` | `string` | Yes | Job title, e.g. "Head of Marketing". Required. |
| `domain` | `string` | No | Company domain without protocol, e.g. "acme.example". Without it verify_contact cannot guess an address. |
| `businessEmail` | `string` | No | Work email. Saved on the contact; verify_contact checks it. |
| `personalEmail` | `string` | No | Personal email, used only when businessEmail is not given. |
| `linkedinUrl` | `string` | No | LinkedIn profile URL. Accepted but not stored. |
| `phone` | `string` | No | Phone number. Accepted but not stored. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_contact",
"title": "Create contact",
"annotations": {
"title": "Create contact",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites. Required by the tool schema; the saved record is not linked to it."
},
"firstName": {
"type": "string",
"description": "Person's first name. Required."
},
"lastName": {
"type": "string",
"description": "Person's last name. Required."
},
"position": {
"type": "string",
"description": "Job title, e.g. \"Head of Marketing\". Required."
},
"domain": {
"type": "string",
"description": "Company domain without protocol, e.g. \"acme.example\". Without it verify_contact cannot guess an address."
},
"businessEmail": {
"type": "string",
"description": "Work email. Saved on the contact; verify_contact checks it."
},
"personalEmail": {
"type": "string",
"description": "Personal email, used only when businessEmail is not given."
},
"linkedinUrl": {
"type": "string",
"description": "LinkedIn profile URL. Accepted but not stored."
},
"phone": {
"type": "string",
"description": "Phone number. Accepted but not stored."
}
},
"required": [
"websiteId",
"firstName",
"lastName",
"position"
]
}
}
```
# create_filter (/docs/mcp/tools/create-filter)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_filter.mdx. */}
**Save a lead filter** · Changes data
Save a lead filter under a name so it shows as a saved view on the leads page and can be used as an automation segment. url is a query string of lead filter parameters (the same names get_leads uses); date and pagination parameters are removed before saving, so a saved filter always applies to whatever date range is chosen. websiteId comes from list_websites. Saving the same name twice creates two filters. Returns the saved filter (_id, name, url, tab).
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `name` | `string` | Yes | Name shown for the saved view, e.g. "US SaaS visitors". |
| `url` | `string` | Yes | Query string of filter parameters, e.g. "?visitorLocation=US&industries=Software&tag=HOT". dateFrom, dateTo, page and similar date/pagination parameters are stripped. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_filter",
"title": "Save a lead filter",
"annotations": {
"title": "Save a lead filter",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"name": {
"type": "string",
"description": "Name shown for the saved view, e.g. \"US SaaS visitors\"."
},
"url": {
"type": "string",
"description": "Query string of filter parameters, e.g. \"?visitorLocation=US&industries=Software&tag=HOT\". dateFrom, dateTo, page and similar date/pagination parameters are stripped."
}
},
"required": [
"websiteId",
"name",
"url"
]
}
}
```
# create_lead_scoring_model (/docs/mcp/tools/create-lead-scoring-model)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_lead_scoring_model.mdx. */}
**Create a lead scoring model** · Changes data
Create a lead scoring model on a website, with its rules: criteria (same shape as get_lead_scoring_model / update_lead_scoring_model), active and aiMatching are saved with it. Leave criteria out to start with an empty model and add rules later with update_lead_scoring_model. Names must be unique per website (case-insensitive). To have AI build a model from your website instead, use ai_generate_scoring_model. websiteId comes from list_websites. Returns the saved model with its _id. If the model was created but its rules could not be saved, the result is an error with modelId and a note to retry with update_lead_scoring_model.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `name` | `string` | Yes | Model name, unique on the website, e.g. "Enterprise SaaS". |
| `active` | `boolean` | No | true (default) to score leads with it straight away, false to save it switched off. |
| `criteria` | `object` | No | Rules keyed by criterion, in the shape get_lead_scoring_model returns (industry, employees, revenue, jobTitle, pageVisited, …), e.g. \{"industry":[\{"values":["Software"],"score":8,"filter":"any"\}]\}. |
| `aiMatching` | `object` | No | AI matching settings, in the shape get_lead_scoring_model returns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_lead_scoring_model",
"title": "Create a lead scoring model",
"annotations": {
"title": "Create a lead scoring model",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"name": {
"type": "string",
"description": "Model name, unique on the website, e.g. \"Enterprise SaaS\"."
},
"active": {
"type": "boolean",
"description": "true (default) to score leads with it straight away, false to save it switched off."
},
"criteria": {
"type": "object",
"description": "Rules keyed by criterion, in the shape get_lead_scoring_model returns (industry, employees, revenue, jobTitle, pageVisited, …), e.g. {\"industry\":[{\"values\":[\"Software\"],\"score\":8,\"filter\":\"any\"}]}."
},
"aiMatching": {
"type": "object",
"description": "AI matching settings, in the shape get_lead_scoring_model returns."
}
},
"required": [
"websiteId",
"name"
]
}
}
```
# create_list (/docs/mcp/tools/create-list)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_list.mdx. */}
**Create a list** · Changes data
Creates an empty contact or company list on a website and returns it. Add people to it from the dashboard or a campaign.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. |
| `name` | `string` | Yes | The list's name. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_list",
"title": "Create a list",
"annotations": {
"title": "Create a list",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"listType": {
"type": "string",
"enum": [
"contact",
"company"
],
"description": "contact for lists of people, company for lists of companies."
},
"name": {
"type": "string",
"description": "The list's name."
}
},
"required": [
"websiteId",
"listType",
"name"
]
}
}
```
# create_tag (/docs/mcp/tools/create-tag)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/create_tag.mdx. */}
**Create a tag** · Changes data
Create a new tag on a website so you can label leads with tag_lead. The name is stored in upper case and must be unique on the website (a duplicate returns 'Tag text already exist'). websiteId comes from list_websites. Check list_tags first to reuse an existing tag. Returns status 'Successful' and tagId.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `name` | `string` | Yes | Tag name, e.g. "Hot account" (saved as "HOT ACCOUNT"). |
| `color` | `string` | No | Hex colour as #RRGGBB, e.g. "#059669". Default "#1E4EFF". Any other format is refused. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "create_tag",
"title": "Create a tag",
"annotations": {
"title": "Create a tag",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"name": {
"type": "string",
"description": "Tag name, e.g. \"Hot account\" (saved as \"HOT ACCOUNT\")."
},
"color": {
"type": "string",
"description": "Hex colour as #RRGGBB, e.g. \"#059669\". Default \"#1E4EFF\". Any other format is refused."
}
},
"required": [
"websiteId",
"name"
]
}
}
```
# delete_ai_scout (/docs/mcp/tools/delete-ai-scout)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_ai_scout.mdx. */}
**Delete an AI Scout** · Deletes or overwrites data
Deletes an AI Scout: it stops for good and is removed from the list. The leads it already delivered stay in Leads.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_ai_scout",
"title": "Delete an AI Scout",
"annotations": {
"title": "Delete an AI Scout",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"scoutId": {
"type": "string",
"description": "AI Scout ID from list_ai_scouts."
}
},
"required": [
"websiteId",
"scoutId"
]
}
}
```
# delete_automation (/docs/mcp/tools/delete-automation)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_automation.mdx. */}
**Delete automation** · Deletes or overwrites data
Deletes an automation permanently, so it no longer acts on any lead. Records already pushed to CRMs or campaigns stay where they are. To stop it while keeping the setup, use toggle_automation with isActive false. Get automationId from list_automations. Confirm with the user before calling. Returns status 'Successful', or 404 'No automation found'.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `automationId` | `string` | Yes | Automation _id from list_automations. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_automation",
"title": "Delete automation",
"annotations": {
"title": "Delete automation",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"automationId": {
"type": "string",
"description": "Automation _id from list_automations."
}
},
"required": [
"automationId"
]
}
}
```
# delete_campaign_step (/docs/mcp/tools/delete-campaign-step)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_campaign_step.mdx. */}
**Delete a campaign step** · Deletes or overwrites data
Removes one email from a campaign's sequence for good. Contacts who already got it keep it. Confirm with the user before calling. Returns 404 when templateId is not a step of the campaign.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). |
| `campaignId` | `string` | Yes | campaignId from list_campaigns. |
| `templateId` | `string` | Yes | _id of the step, from get_campaign (emailCampaignTemplates). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_campaign_step",
"title": "Delete a campaign step",
"annotations": {
"title": "Delete a campaign step",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (the campaign's website)."
},
"campaignId": {
"type": "string",
"description": "campaignId from list_campaigns."
},
"templateId": {
"type": "string",
"description": "_id of the step, from get_campaign (emailCampaignTemplates)."
}
},
"required": [
"websiteId",
"campaignId",
"templateId"
]
}
}
```
# delete_campaign (/docs/mcp/tools/delete-campaign)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_campaign.mdx. */}
**Delete email campaign** · Deletes or overwrites data
Permanently delete an email campaign together with all its steps and every prospect in it; scheduled emails are never sent and the history is lost. This cannot be undone and nothing is refunded. To stop only some contacts use stop_prospect or remove_prospect_from_campaign. Confirm with the user before calling. campaignId comes from list_campaigns. Returns a status message and deletedProspects (how many prospects were removed).
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `campaignId` | `string` | Yes | Email campaign id from list_campaigns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_campaign",
"title": "Delete email campaign",
"annotations": {
"title": "Delete email campaign",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"description": "Email campaign id from list_campaigns."
}
},
"required": [
"campaignId"
]
}
}
```
# delete_email_account (/docs/mcp/tools/delete-email-account)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_email_account.mdx. */}
**Remove mailbox** · Deletes or overwrites data
Remove a connected mailbox from the account. Prospects that were scheduled or in progress on it are moved to error-sending and paused, so their next steps will not send until they are given another mailbox. The mailbox slot is freed. This does not delete the mailbox at its email provider. Confirm with the user before calling. emailAccountId comes from list_email_accounts. Returns a status message.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `emailAccountId` | `string` | Yes | Mailbox id from list_email_accounts (_id). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_email_account",
"title": "Remove mailbox",
"annotations": {
"title": "Remove mailbox",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"emailAccountId": {
"type": "string",
"description": "Mailbox id from list_email_accounts (_id)."
}
},
"required": [
"emailAccountId"
]
}
}
```
# delete_filter (/docs/mcp/tools/delete-filter)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_filter.mdx. */}
**Delete a saved filter** · Deletes or overwrites data
Delete a saved lead filter. Any automation that used it as its segment is switched to 'All leads', so it will then run for every new lead; check list_automations before deleting a filter an automation depends on. filterId is the _id from list_filters. Confirm with the user before calling. Returns status 'successful', or an error when the filter does not exist.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `filterId` | `string` | Yes | Saved filter id (the _id from list_filters). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_filter",
"title": "Delete a saved filter",
"annotations": {
"title": "Delete a saved filter",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"filterId": {
"type": "string",
"description": "Saved filter id (the _id from list_filters)."
}
},
"required": [
"filterId"
]
}
}
```
# delete_intent_topic (/docs/mcp/tools/delete-intent-topic)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_intent_topic.mdx. */}
**Unsubscribe intent topic** · Deletes or overwrites data
Unsubscribes a website from an intent topic and deletes the subscription, including its delivery counters. Leads already delivered stay. To stop it only for a while, use update_intent_topic with paused true. Confirm with the user before calling. Returns \{ result: \{ deleted: true, topicSlug \} \}, or 404 when the website is not subscribed.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `topicSlug` | `string` | Yes | Slug of a subscribed topic, from list_intent_topics. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_intent_topic",
"title": "Unsubscribe intent topic",
"annotations": {
"title": "Unsubscribe intent topic",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"topicSlug": {
"type": "string",
"description": "Slug of a subscribed topic, from list_intent_topics."
}
},
"required": [
"websiteId",
"topicSlug"
]
}
}
```
# delete_lead_comment (/docs/mcp/tools/delete-lead-comment)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead_comment.mdx. */}
**Delete a lead comment** · Deletes or overwrites data
Permanently delete a comment from a lead. Only the user who wrote the comment can delete it; others get 'You do not have permission'. commentId is the _id from get_lead_comments. Confirm with the user before calling. Returns status 'Successful'.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `commentId` | `string` | Yes | Comment id (the _id from get_lead_comments). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_lead_comment",
"title": "Delete a lead comment",
"annotations": {
"title": "Delete a lead comment",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"commentId": {
"type": "string",
"description": "Comment id (the _id from get_lead_comments)."
}
},
"required": [
"commentId"
]
}
}
```
# delete_lead_scoring_model (/docs/mcp/tools/delete-lead-scoring-model)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead_scoring_model.mdx. */}
**Delete a lead scoring model** · Deletes or overwrites data
Permanently delete a lead scoring model and remove its score from every lead of the website. This cannot be undone. To stop a model scoring without losing it, use update_lead_scoring_model with active=false instead. modelId from list_lead_scoring_models. Confirm with the user before calling. Returns status 'Successful'.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `modelId` | `string` | Yes | Scoring model id from list_lead_scoring_models. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_lead_scoring_model",
"title": "Delete a lead scoring model",
"annotations": {
"title": "Delete a lead scoring model",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"modelId": {
"type": "string",
"description": "Scoring model id from list_lead_scoring_models."
}
},
"required": [
"modelId"
]
}
}
```
# delete_lead (/docs/mcp/tools/delete-lead)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_lead.mdx. */}
**Delete leads permanently** · Deletes or overwrites data
Permanently delete one or more leads. This cannot be undone, the credits they used are not given back, and the companies of the deleted leads are added to the website's blocked company domains (the Exclude list in Qualify), so new leads from those companies stop appearing. To only take a lead off the list, use hide_lead instead. leadIds come from get_leads. Confirm with the user before calling. Returns deletedCount, the number of leads actually deleted (leads outside your account are skipped).
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadIds` | `string[]` | Yes | Array of lead ids (the _id values from get_leads), e.g. ["66f1...", "66f2..."]. Use leads from one website per call. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_lead",
"title": "Delete leads permanently",
"annotations": {
"title": "Delete leads permanently",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "Array of lead ids (the _id values from get_leads), e.g. [\"66f1...\", \"66f2...\"]. Use leads from one website per call."
}
},
"required": [
"leadIds"
]
}
}
```
# delete_linkedin_campaign (/docs/mcp/tools/delete-linkedin-campaign)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_linkedin_campaign.mdx. */}
**Delete a LinkedIn campaign** · Deletes or overwrites data
Deletes a LinkedIn campaign and stops everything it would still send. Connections already made on LinkedIn stay.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_linkedin_campaign",
"title": "Delete a LinkedIn campaign",
"annotations": {
"title": "Delete a LinkedIn campaign",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"linkedinCampaignId": {
"type": "string",
"description": "LinkedIn campaign ID from list_linkedin_campaigns."
}
},
"required": [
"websiteId",
"linkedinCampaignId"
]
}
}
```
# delete_linkedin_keyword (/docs/mcp/tools/delete-linkedin-keyword)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_linkedin_keyword.mdx. */}
**Delete a LinkedIn keyword** · Deletes or overwrites data
Stops watching a LinkedIn keyword for good and removes it from the list. The leads it already found stay.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `keywordId` | `string` | Yes | Keyword ID from list_linkedin_keywords. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_linkedin_keyword",
"title": "Delete a LinkedIn keyword",
"annotations": {
"title": "Delete a LinkedIn keyword",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"keywordId": {
"type": "string",
"description": "Keyword ID from list_linkedin_keywords."
}
},
"required": [
"websiteId",
"keywordId"
]
}
}
```
# delete_list (/docs/mcp/tools/delete-list)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_list.mdx. */}
**Delete a list** · Deletes or overwrites data
Deletes a list for good. The contacts or companies in it stay in the account. Confirm with the user before calling. Returns 404 when the list is not one of this website's.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. |
| `listId` | `string` | Yes | _id from list_lists. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_list",
"title": "Delete a list",
"annotations": {
"title": "Delete a list",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"listType": {
"type": "string",
"enum": [
"contact",
"company"
],
"description": "contact for lists of people, company for lists of companies."
},
"listId": {
"type": "string",
"description": "_id from list_lists."
}
},
"required": [
"websiteId",
"listType",
"listId"
]
}
}
```
# delete_tag (/docs/mcp/tools/delete-tag)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_tag.mdx. */}
**Delete a tag** · Deletes or overwrites data
Deletes a tag from this website; it is removed from every lead that had it. The leads themselves stay. tagId comes from list_tags.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `tagId` | `string` | Yes | Tag ID from list_tags. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_tag",
"title": "Delete a tag",
"annotations": {
"title": "Delete a tag",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"tagId": {
"type": "string",
"description": "Tag ID from list_tags."
}
},
"required": [
"websiteId",
"tagId"
]
}
}
```
# delete_website (/docs/mcp/tools/delete-website)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/delete_website.mdx. */}
**Delete website** · Deletes or overwrites data
Deletes a website: tracking stops, it disappears from list_websites and its leads are no longer shown, and its website slot is freed. It cannot be restored with these tools. websiteId comes from list_websites. Confirm with the user before calling, naming the website. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. Double-check it is the website the user means. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "delete_website",
"title": "Delete website",
"annotations": {
"title": "Delete website",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites. Double-check it is the website the user means."
}
},
"required": [
"websiteId"
]
}
}
```
# dismiss_campaign_capacity_warning (/docs/mcp/tools/dismiss-campaign-capacity-warning)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/dismiss_campaign_capacity_warning.mdx. */}
**Dismiss a capacity warning** · Changes data
Hides a campaign's capacity warning (more contacts than its mailboxes can send to in time) for some days. Nothing about sending changes; add mailboxes or lower the contacts to fix the cause.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `campaignId` | `string` | Yes | Campaign ID from list_campaigns. |
| `dismissDays` | `number` | No | How many days to hide it (1-90, default 7). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "dismiss_campaign_capacity_warning",
"title": "Dismiss a capacity warning",
"annotations": {
"title": "Dismiss a capacity warning",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"campaignId": {
"type": "string",
"description": "Campaign ID from list_campaigns."
},
"dismissDays": {
"type": "number",
"minimum": 1,
"maximum": 90,
"description": "How many days to hide it (1-90, default 7)."
}
},
"required": [
"websiteId",
"campaignId"
]
}
}
```
# downgrade_plan (/docs/mcp/tools/downgrade-plan)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/downgrade_plan.mdx. */}
**Downgrade plan** · Changes data · Acts outside your account
Schedules the subscription to change to a new number of leads per month from the next billing date; nothing is charged or refunded now and current credits stay until then. Current add-ons are kept. Returns tierName, leads, the new monthly price and effectiveAt (when it takes effect); get_subscription then shows it under pendingDowngrade. Use upgrade_plan for more leads now; to stop paying use cancel_subscription or pause_subscription. Confirm with the user before calling.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leads` | `number` | Yes | Leads per month of the plan to switch to at the next billing date. |
| `annual` | `boolean` | No | true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "downgrade_plan",
"title": "Downgrade plan",
"annotations": {
"title": "Downgrade plan",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"leads": {
"type": "number",
"description": "Leads per month of the plan to switch to at the next billing date."
},
"annual": {
"type": "boolean",
"description": "true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch."
}
},
"required": [
"leads"
]
}
}
```
# enrich_domain (/docs/mcp/tools/enrich-domain)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/enrich_domain.mdx. */}
**Find contacts at a company** · Changes data · Spends credits or money
Look up the people known at a company domain and return them as contacts[] (name, position, email, LinkedIn, isDecisionMaker, plus scores against your scoring models when they have job-title rules). Use it to find who to reach at a company that visited; for firmographics without credits use free_enrich_company, to search people by title use search_people. websiteId (from list_websites) is required even though the schema marks it optional. Cost: 1 credit the first time your account gets contacts for a domain; repeating the same domain is not charged again, and nothing is charged when no contacts are found. Refused when the account has no credits left. Confirm with the user before calling.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `domain` | `string` | Yes | Company domain, e.g. "acme.example" (a full URL is reduced to its domain). |
| `websiteId` | `string` | No | Website id from list_websites whose credits pay for the lookup. Required: the call returns an error without it. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "enrich_domain",
"title": "Find contacts at a company",
"annotations": {
"title": "Find contacts at a company",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "Company domain, e.g. \"acme.example\" (a full URL is reduced to its domain)."
},
"websiteId": {
"type": "string",
"description": "Website id from list_websites whose credits pay for the lookup. Required: the call returns an error without it."
}
},
"required": [
"domain"
]
}
}
```
# export_leads_csv (/docs/mcp/tools/export-leads-csv)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/export_leads_csv.mdx. */}
**Export leads to CSV** · Changes data · Acts outside your account
Queue a CSV export of a website's leads whose last visit falls in the date range. The file is built in the background: the user gets an email with the download link and it is listed under Downloads in the dashboard for 30 days; this tool does not return the file itself. Each finished export uses one of the plan's CSV downloads; it fails when the plan has no CSV downloads or none are left. websiteId from list_websites. For leads you want to read in the conversation, use get_leads. Returns status 'queued' and job (id, status, stage, progress, rowCount, fileName, expiresAt).
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `dateFrom` | `string` | Yes | Start of the range (last visit date). Accepts YYYY-MM-DD, MM/DD/YYYY, ISO 8601 or epoch milliseconds. |
| `dateTo` | `string` | Yes | End of the range, inclusive. Same formats as dateFrom. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "export_leads_csv",
"title": "Export leads to CSV",
"annotations": {
"title": "Export leads to CSV",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"dateFrom": {
"type": "string",
"description": "Start of the range (last visit date). Accepts YYYY-MM-DD, MM/DD/YYYY, ISO 8601 or epoch milliseconds."
},
"dateTo": {
"type": "string",
"description": "End of the range, inclusive. Same formats as dateFrom."
}
},
"required": [
"websiteId",
"dateFrom",
"dateTo"
]
}
}
```
# export_list_csv (/docs/mcp/tools/export-list-csv)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/export_list_csv.mdx. */}
**Export a list to CSV** · Changes data · Acts outside your account
Builds a CSV of a list and emails the download link to the user. Returns as soon as the export has started.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. |
| `listId` | `string` | Yes | _id from list_lists. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "export_list_csv",
"title": "Export a list to CSV",
"annotations": {
"title": "Export a list to CSV",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"listType": {
"type": "string",
"enum": [
"contact",
"company"
],
"description": "contact for lists of people, company for lists of companies."
},
"listId": {
"type": "string",
"description": "_id from list_lists."
}
},
"required": [
"websiteId",
"listType",
"listId"
]
}
}
```
# find_contact_email (/docs/mcp/tools/find-contact-email)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/find_contact_email.mdx. */}
**Find contact email** · Changes data · Acts outside your account · Spends credits or money
Looks for a business email for one search_people contact by trying likely address patterns at their company and verifying each one. Use it only when reveal_contact found no email for that person. depth 'popular' tries the common patterns and costs 50 credits. 'deep' tries more patterns and costs 100 credits. Credits are charged whether or not an address is found. Confirm the cost with the user before calling.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (the same one used for search_people). |
| `profileId` | `string` | Yes | profileId from a search_people row. |
| `depth` | `"popular" \| "deep"` | No | 'popular' (default, 50 credits) or 'deep' (100 credits). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "find_contact_email",
"title": "Find contact email",
"annotations": {
"title": "Find contact email",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (the same one used for search_people)."
},
"profileId": {
"type": "string",
"description": "profileId from a search_people row."
},
"depth": {
"type": "string",
"enum": [
"popular",
"deep"
],
"description": "'popular' (default, 50 credits) or 'deep' (100 credits)."
}
},
"required": [
"websiteId",
"profileId"
]
}
}
```
# generate_campaign_emails_ai (/docs/mcp/tools/generate-campaign-emails-ai)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/generate_campaign_emails_ai.mdx. */}
**Write campaign emails with AI** · Changes data
Writes a sequence of emails for a campaign with AI, from your website, offer and ideal customer, and saves them as the campaign steps. Review them with get_campaign before starting the campaign.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `campaignId` | `string` | Yes | Campaign ID from list_campaigns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "generate_campaign_emails_ai",
"title": "Write campaign emails with AI",
"annotations": {
"title": "Write campaign emails with AI",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"campaignId": {
"type": "string",
"description": "Campaign ID from list_campaigns."
}
},
"required": [
"websiteId",
"campaignId"
]
}
}
```
# get_account (/docs/mcp/tools/get-account)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_account.mdx. */}
**Get account** · Read-only
Shows the signed-in account: plan, credit limits and remaining credits, refresh and trial dates, add-ons, features, settings, pause status, failed-payment flag and the account's websites (the first 11 only). Use it to get an overview or to check credits before a credit-spending action. For subscription price and renewal date use get_subscription; for credit usage line by line use get_credit_history; for the complete website list use list_websites. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
This tool takes no parameters.
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_account",
"title": "Get account",
"annotations": {
"title": "Get account",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {}
}
}
```
# get_ai_scout (/docs/mcp/tools/get-ai-scout)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_ai_scout.mdx. */}
**Get an AI Scout** · Read-only
One AI Scout with its sources, how many people it found, qualified and delivered, and the latest people it picked with why they fit. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `scoutId` | `string` | Yes | AI Scout ID from list_ai_scouts. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_ai_scout",
"title": "Get an AI Scout",
"annotations": {
"title": "Get an AI Scout",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"scoutId": {
"type": "string",
"description": "AI Scout ID from list_ai_scouts."
}
},
"required": [
"websiteId",
"scoutId"
]
}
}
```
# get_auto_topup (/docs/mcp/tools/get-auto-topup)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_auto_topup.mdx. */}
**Get auto top-up** · Read-only
Whether auto top-up is on: when credits run out, a pack of leads is bought automatically, up to a monthly cap in USD. Returns on/off, the pack size, the cap and what was spent this month. Free.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_auto_topup",
"title": "Get auto top-up",
"annotations": {
"title": "Get auto top-up",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_automation_runs (/docs/mcp/tools/get-automation-runs)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation_runs.mdx. */}
**Get an automation's runs** · Read-only
The runs of one automation, newest first: which lead each run handled, when, and whether it succeeded (and why not). Use it to check that an automation really sent leads to Slack, your CRM or a webhook. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `automationId` | `string` | Yes | Automation ID from list_automations. |
| `limit` | `number` | No | Runs to return (1-200). |
| `skip` | `number` | No | Runs to skip, for paging. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_automation_runs",
"title": "Get an automation's runs",
"annotations": {
"title": "Get an automation's runs",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"automationId": {
"type": "string",
"description": "Automation ID from list_automations."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 200,
"description": "Runs to return (1-200)."
},
"skip": {
"type": "number",
"minimum": 0,
"description": "Runs to skip, for paging."
}
},
"required": [
"websiteId",
"automationId"
]
}
}
```
# get_automation_stats (/docs/mcp/tools/get-automation-stats)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation_stats.mdx. */}
**Get automation statistics** · Read-only
For every automation of a website: how many leads it handled, how many failed and when it last ran. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_automation_stats",
"title": "Get automation statistics",
"annotations": {
"title": "Get automation statistics",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_automation (/docs/mcp/tools/get-automation)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_automation.mdx. */}
**Get automation** · Read-only
Returns the full setup of one automation: name, isActive, when (trigger event), then (action), trigger, interval, frequency settings (repeatWindowHours, dedupeScope), contact selection, email verification rules, filter and the action settings. Read it before update_automation. For what an automation did for a specific lead, use get_lead_automation_history. Get automationId from list_automations. Errors: 400 for an invalid id, 404 'automation not found.'
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `automationId` | `string` | Yes | Automation _id from list_automations (24 hex characters). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_automation",
"title": "Get automation",
"annotations": {
"title": "Get automation",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"automationId": {
"type": "string",
"description": "Automation _id from list_automations (24 hex characters)."
}
},
"required": [
"automationId"
]
}
}
```
# get_billing (/docs/mcp/tools/get-billing)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_billing.mdx. */}
**Get billing (subscription)** · Read-only
Returns the same subscription summary as get_subscription: plan, leads per month, credits used and remaining, top-up credits, price, billing interval, next billing date, whether it is set to cancel or is paused, pending downgrade and any running retention discount. The websiteId is accepted but does not change the result (billing is per account). Prefer get_subscription. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. Required by the schema but ignored; the result covers the whole account. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_billing",
"title": "Get billing (subscription)",
"annotations": {
"title": "Get billing (subscription)",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites. Required by the schema but ignored; the result covers the whole account."
}
},
"required": [
"websiteId"
]
}
}
```
# get_blog_article (/docs/mcp/tools/get-blog-article)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_blog_article.mdx. */}
**Get blog article** · Read-only
Returns one blog article in full (Optimize add-on): its content blocks, FAQ, every version with its status, the public url and the visits it received. Use it before update_blog_article to see the current text. Get articleId from list_blog_articles. Returns \{ article, visits, url \}, or 404 'Article not found'.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `articleId` | `string` | Yes | Article _id from list_blog_articles. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_blog_article",
"title": "Get blog article",
"annotations": {
"title": "Get blog article",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"articleId": {
"type": "string",
"description": "Article _id from list_blog_articles."
}
},
"required": [
"websiteId",
"articleId"
]
}
}
```
# get_campaign_capacity (/docs/mcp/tools/get-campaign-capacity)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign_capacity.mdx. */}
**Get campaign health** · Read-only
Returns the campaign's health: connected mailboxes and their daily limits, how many emails it can send a day, and what is holding it back (e.g. no mailbox, warmup, limits). Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). |
| `campaignId` | `string` | Yes | campaignId from list_campaigns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_campaign_capacity",
"title": "Get campaign health",
"annotations": {
"title": "Get campaign health",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (the campaign's website)."
},
"campaignId": {
"type": "string",
"description": "campaignId from list_campaigns."
}
},
"required": [
"websiteId",
"campaignId"
]
}
}
```
# get_campaign_stats (/docs/mcp/tools/get-campaign-stats)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign_stats.mdx. */}
**Get campaign statistics** · Read-only
Returns how a campaign is doing: emails sent, opened, clicked, replied, bounced and unsubscribed, with rates. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). |
| `campaignId` | `string` | Yes | campaignId from list_campaigns. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_campaign_stats",
"title": "Get campaign statistics",
"annotations": {
"title": "Get campaign statistics",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (the campaign's website)."
},
"campaignId": {
"type": "string",
"description": "campaignId from list_campaigns."
}
},
"required": [
"websiteId",
"campaignId"
]
}
}
```
# get_campaign (/docs/mcp/tools/get-campaign)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_campaign.mdx. */}
**Get campaign details** · Read-only
Get one email campaign with live analytics: settings (isActive, schedule, timezone), its steps in emailCampaignTemplates[] (each with _id = templateId for update_campaign_step, subject, body and per-step stats), stats (prospect total, scheduledCount, uniqueContacted, totalEmailsSent, opens, clicks, replies, warm replies, bounced, unsubscribed and their rates), steps[] (per-step sent/opened/clicked/replied), statusBuckets (prospect counts per status) and statistics (sent vs scheduled over time). campaignId comes from list_campaigns. Use get_prospects for the contacts themselves.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `campaignId` | `string` | Yes | Email campaign id from list_campaigns or create_campaign. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_campaign",
"title": "Get campaign details",
"annotations": {
"title": "Get campaign details",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"description": "Email campaign id from list_campaigns or create_campaign."
}
},
"required": [
"campaignId"
]
}
}
```
# get_company_people (/docs/mcp/tools/get-company-people)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_company_people.mdx. */}
**Get people at the lead's company** · Read-only
Other people who work at the company of a lead (name, job title, department, seniority, LinkedIn), optionally only one department, to find the right contact when the visitor was not the buyer. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `leadId` | `string` | Yes | Lead ID from get_leads. |
| `department` | `string` | No | Only this department, e.g. Sales Department. |
| `page` | `number` | No | Page of results, from 1. |
| `limit` | `number` | No | People per page (1-100). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_company_people",
"title": "Get people at the lead's company",
"annotations": {
"title": "Get people at the lead's company",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"leadId": {
"type": "string",
"description": "Lead ID from get_leads."
},
"department": {
"type": "string",
"description": "Only this department, e.g. Sales Department."
},
"page": {
"type": "number",
"minimum": 1,
"description": "Page of results, from 1."
},
"limit": {
"type": "number",
"minimum": 1,
"maximum": 100,
"description": "People per page (1-100)."
}
},
"required": [
"websiteId",
"leadId"
]
}
}
```
# get_country_blacklist (/docs/mcp/tools/get-country-blacklist)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_country_blacklist.mdx. */}
**Get blocked countries** · Read-only
Returns the countries whose visitors are never identified on this website (two-letter codes such as DE or FR). Visits from them are not turned into leads and use no credits. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_country_blacklist",
"title": "Get blocked countries",
"annotations": {
"title": "Get blocked countries",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_credit_history (/docs/mcp/tools/get-credit-history)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_credit_history.mdx. */}
**Get credit history** · Read-only
Lists the account's credit transactions from the last 90 days, newest first: each row has operation (CHARGE, REFUND or DUPLICATE_PREVENTED), amount, credits before/after, the website, the lead's domain/email, a source category (WEBSITE_VISITOR, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, INTENT_SIGNALS, ADJUSTMENT, OTHER), a reason and createdAt. Returns \{ count, hasMore, logs \}. Use it to explain where credits went. For one website's per-cycle allowance snapshots use get_website_credit_history. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `page` | `number` | No | Page number, starting at 1 (default 1). Use hasMore in the result to know if there is a next page. |
| `limit` | `number` | No | Rows per page (default 100, max 500). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_credit_history",
"title": "Get credit history",
"annotations": {
"title": "Get credit history",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"page": {
"type": "number",
"description": "Page number, starting at 1 (default 1). Use hasMore in the result to know if there is a next page."
},
"limit": {
"type": "number",
"description": "Rows per page (default 100, max 500)."
}
}
}
}
```
# get_credit_summary (/docs/mcp/tools/get-credit-summary)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_credit_summary.mdx. */}
**Get the credit summary** · Read-only
Credits used in a billing cycle, by source (website visitors, Prospector, AI Scout, Web Scraping…) and by day, with what is left. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `cycle` | `number` | No | 0 for the current cycle, 1 for the one before, … |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_credit_summary",
"title": "Get the credit summary",
"annotations": {
"title": "Get the credit summary",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"cycle": {
"type": "number",
"minimum": 0,
"description": "0 for the current cycle, 1 for the one before, …"
}
},
"required": [
"websiteId"
]
}
}
```
# get_crm_mappings (/docs/mcp/tools/get-crm-mappings)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_crm_mappings.mdx. */}
**Get CRM field mappings** · Read-only
The field mappings used when leads are pushed to a CRM: which lead field fills which CRM field, for contacts and companies. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `crm` | `"hubspot" \| "salesforce" \| "pipedrive" \| "zoho" \| "gohighlevel"` | Yes | The CRM. |
| `objectType` | `"contact" \| "company"` | No | contact or company. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_crm_mappings",
"title": "Get CRM field mappings",
"annotations": {
"title": "Get CRM field mappings",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"crm": {
"type": "string",
"enum": [
"hubspot",
"salesforce",
"pipedrive",
"zoho",
"gohighlevel"
],
"description": "The CRM."
},
"objectType": {
"type": "string",
"enum": [
"contact",
"company"
],
"description": "contact or company."
}
},
"required": [
"websiteId",
"crm"
]
}
}
```
# get_domain_blacklist (/docs/mcp/tools/get-domain-blacklist)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_blacklist.mdx. */}
**List blocked domains** · Read-only
Lists the company domains blocked from becoming leads on a website. Returns \{ result: [ \{ domain, csv, ... \} ] \}, where csv is the name of the group each domain was added under. Use the group name with remove_from_domain_blacklist. To block more domains use add_to_domain_blacklist. websiteId comes from list_websites.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_domain_blacklist",
"title": "List blocked domains",
"annotations": {
"title": "List blocked domains",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_domain_setup_status (/docs/mcp/tools/get-domain-setup-status)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_setup_status.mdx. */}
**Domain setup progress** · Read-only
Check the setup progress of the outreach domains bought for a website (unpaid picks are not shown). Call it after purchase_outreach_domains until every domain is ready. websiteId comes from list_websites. Per domain read status, completedSteps of totalSteps (5: purchased, DNS configured, mail setup, mailboxes created, ready), progressPercent, terminal (true when ready), mailboxCount, awaitingSenderInfo, hasError with retryCount / retriesExhausted / nextRetryAt (failed steps are retried automatically) and paymentError. Also returns hasEmailSenderInfo and a summary (total, ready, inFlight, errored, paymentErrored, awaitingSenderInfo). Not available with a website-scoped key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_domain_setup_status",
"title": "Domain setup progress",
"annotations": {
"title": "Domain setup progress",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_domain_suggestions (/docs/mcp/tools/get-domain-suggestions)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_domain_suggestions.mdx. */}
**Suggest outreach domains** · Read-only
Suggest look-alike domain names for cold outreach, built from the website's own domain and keeping its ending (e.g. acme.example gives getacme.example, tryacme.example, useacme.example, goacme.example, acmeapp.example, acmehq.example). Availability is not checked: run search_domain_availability on a name before add_outreach_domain. websiteId comes from list_websites. Returns baseDomain and suggestions[]. Not available with a website-scoped key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id from list_websites. Suggestions are derived from this website's domain. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_domain_suggestions",
"title": "Suggest outreach domains",
"annotations": {
"title": "Suggest outreach domains",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id from list_websites. Suggestions are derived from this website's domain."
}
},
"required": [
"websiteId"
]
}
}
```
# get_email_account_stats (/docs/mcp/tools/get-email-account-stats)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_account_stats.mdx. */}
**Mailbox sending load** · Read-only
Get the sending load of every mailbox on a website: how many campaign emails are scheduled on it and how full its next 30 days are. It does not return opens, replies or bounces; use get_campaign for campaign results and get_warmup_stats for warmup numbers. websiteId comes from list_websites. Returns one entry per mailbox with emailAccount (the mailbox id, match it to list_email_accounts), totalScheduledEmails and capacity (a percentage string; anything above 100% is shown as 200%), or a note when the website has no mailboxes.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_email_account_stats",
"title": "Mailbox sending load",
"annotations": {
"title": "Mailbox sending load",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_email_account (/docs/mcp/tools/get-email-account)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_account.mdx. */}
**Get a mailbox** · Read-only
One mailbox in full: address, sender name and signature, daily sending limit, warmup state and health, and whether it is connected. Passwords are never returned. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_email_account",
"title": "Get a mailbox",
"annotations": {
"title": "Get a mailbox",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"emailAccountId": {
"type": "string",
"description": "Mailbox ID from list_email_accounts."
}
},
"required": [
"websiteId",
"emailAccountId"
]
}
}
```
# get_email_template (/docs/mcp/tools/get-email-template)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_template.mdx. */}
**Get a campaign email** · Read-only
Returns one email (step) of a campaign in full: subject and body templates with their merge fields, the sender, the delay before it is sent and its position in the sequence. templateId comes from get_campaign (emailCampaignTemplates). Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `campaignId` | `string` | Yes | Campaign ID from list_campaigns. |
| `templateId` | `string` | Yes | Step ID from get_campaign, emailCampaignTemplates. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_email_template",
"title": "Get a campaign email",
"annotations": {
"title": "Get a campaign email",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"campaignId": {
"type": "string",
"description": "Campaign ID from list_campaigns."
},
"templateId": {
"type": "string",
"description": "Step ID from get_campaign, emailCampaignTemplates."
}
},
"required": [
"websiteId",
"campaignId",
"templateId"
]
}
}
```
# get_email_thread (/docs/mcp/tools/get-email-thread)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_email_thread.mdx. */}
**Read email thread** · Read-only
Read one outreach email conversation: the email that was sent (subject, send time, opens) and every reply under it, incoming and outgoing. emailId comes from get_inbox_emails (prospects[].emails[].emailId). Returns prospectEmail with the prospect's _id, name and recipientEmail, email (the sent email with its replies[]) and emailAccount (the mailbox that sent it). Use reply_to_prospect to answer.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `emailId` | `string` | Yes | Email id from get_inbox_emails, prospects[].emails[].emailId (not the prospect _id). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_email_thread",
"title": "Read email thread",
"annotations": {
"title": "Read email thread",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"emailId": {
"type": "string",
"description": "Email id from get_inbox_emails, prospects[].emails[].emailId (not the prospect _id)."
}
},
"required": [
"emailId"
]
}
}
```
# get_google_ads_audience (/docs/mcp/tools/get-google-ads-audience)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_google_ads_audience.mdx. */}
**Get a Google Ads audience** · Read-only
One retargeting audience: settings, contacts uploaded, match rate and the stats of its Google campaign. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `audienceId` | `string` | Yes | Audience ID from list_google_ads_audiences. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_google_ads_audience",
"title": "Get a Google Ads audience",
"annotations": {
"title": "Get a Google Ads audience",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"audienceId": {
"type": "string",
"description": "Audience ID from list_google_ads_audiences."
}
},
"required": [
"websiteId",
"audienceId"
]
}
}
```
# get_icp (/docs/mcp/tools/get-icp)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_icp.mdx. */}
**Get ideal customer profile** · Read-only
Returns the ideal customer profile (ICP) saved for a website: the companies the user wants to reach. Read it before update_icp, or when explaining why a lead is or is not a good fit. Lead scoring rules are separate: use list_lead_scoring_models. Returns employeeLowerBound / employeeUpperBound, revenueLowerBound / revenueUpperBound, location[], role[], industries[], sector[], the priority values for each criterion and any AI qualification questions. Returns null when no ICP is saved.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_icp",
"title": "Get ideal customer profile",
"annotations": {
"title": "Get ideal customer profile",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_inbox_emails (/docs/mcp/tools/get-inbox-emails)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_inbox_emails.mdx. */}
**List outreach inbox** · Read-only
List prospects from the outreach master inbox of a website across all campaigns, most recent activity first. Default status inbox shows prospects who replied (including out-of-office) and are not archived. Use get_email_thread to read one conversation, reply_to_prospect to answer and archive_email to clear it. websiteId comes from list_websites. Returns prospects[] (each with _id, recipientEmail, firstName, lastName, status, the sending emailAccount, emailCampaign and emails[]; each emails[].emailId is the emailId the other inbox tools take), totalProspects, currentPage and totalPages.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id from list_websites. |
| `status` | `string` | No | Which view to list: inbox (replied, not archived; default), contacted (an email was sent), scheduled (an email is due and not sent yet) or archived. |
| `page` | `number` | No | Page number, starting at 1. Default 1. |
| `limit` | `number` | No | Prospects per page. Default 20. |
| `searchQuery` | `string` | No | Optional case-insensitive text matched against first name, last name and email address. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_inbox_emails",
"title": "List outreach inbox",
"annotations": {
"title": "List outreach inbox",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id from list_websites."
},
"status": {
"type": "string",
"description": "Which view to list: inbox (replied, not archived; default), contacted (an email was sent), scheduled (an email is due and not sent yet) or archived."
},
"page": {
"type": "number",
"description": "Page number, starting at 1. Default 1."
},
"limit": {
"type": "number",
"description": "Prospects per page. Default 20."
},
"searchQuery": {
"type": "string",
"description": "Optional case-insensitive text matched against first name, last name and email address."
}
},
"required": [
"websiteId"
]
}
}
```
# get_intent_topics_catalog (/docs/mcp/tools/get-intent-topics-catalog)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_intent_topics_catalog.mdx. */}
**Browse intent topics** · Read-only
Lists every third-party intent topic you can subscribe to, e.g. 'CRM Software' or 'Cybersecurity'. Each topic tracks companies that are actively researching that category across the web. Use it to find a topicSlug for subscribe_to_intent_topic. To see the topics a website already follows, use list_intent_topics. Costs nothing. Returns \{ result[] \} sorted by name; each row has topicSlug, displayName, profile.roleKeywords, profile.industryConstraint, surgeThreshold and availabilityPerDay.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
This tool takes no parameters.
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_intent_topics_catalog",
"title": "Browse intent topics",
"annotations": {
"title": "Browse intent topics",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {}
}
}
```
# get_lead_ai_summary (/docs/mcp/tools/get-lead-ai-summary)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_ai_summary.mdx. */}
**AI visit summary for a lead** · Read-only
Get a short AI-written summary (about 50 words) of what this visitor did on your website, based on their company, country and the pages they viewed, ending with one verdict: 'Ready to Buy', 'Research' or 'Just Browsing'. Returned as aISummary (text, may contain \
tags). leadId comes from get_leads. Use get_lead for the raw page-visit data. Generated fresh on each call, so wording can differ between calls. Changes nothing in the account.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_ai_summary",
"title": "AI visit summary for a lead",
"annotations": {
"title": "AI visit summary for a lead",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadId": {
"type": "string",
"description": "Lead id (the _id of a row returned by get_leads)."
}
},
"required": [
"leadId"
]
}
}
```
# get_lead_automation_history (/docs/mcp/tools/get-lead-automation-history)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_automation_history.mdx. */}
**Lead automation history** · Read-only
List every automation run recorded for one lead, newest first, as automationLogs[] with status, message (the result or error text), automation (the automation id, see list_automations) and executedAt. Use it to check whether a lead reached Slack, a CRM, a webhook or an email campaign and why a run failed. leadId comes from get_leads. To run automations again use retrigger_automations or rerun_automation_for_lead. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_automation_history",
"title": "Lead automation history",
"annotations": {
"title": "Lead automation history",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadId": {
"type": "string",
"description": "Lead id (the _id of a row returned by get_leads)."
}
},
"required": [
"leadId"
]
}
}
```
# get_lead_comments (/docs/mcp/tools/get-lead-comments)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_comments.mdx. */}
**Get lead comments** · Read-only
Get the comments (team notes) on a lead. Each comment has _id (commentId for update_lead_comment / delete_lead_comment), content, the author's firstName, lastName, userEmail, role and picture, and createdAt. leadId comes from get_leads. Add one with add_lead_comment. Returns \{ comments: [...] \}. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_comments",
"title": "Get lead comments",
"annotations": {
"title": "Get lead comments",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadId": {
"type": "string",
"description": "Lead id (the _id of a row returned by get_leads)."
}
},
"required": [
"leadId"
]
}
}
```
# get_lead_quality (/docs/mcp/tools/get-lead-quality)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_quality.mdx. */}
**Get the lead quality bar** · Read-only
Returns the lead quality settings of a website: the minimum ideal-customer score a lead needs to be kept, the bar per source (website visitors, intent, Web Scraping, Prospector, AI Scout), contacts-only options and the audience focus (B2B, B2C or both). Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_quality",
"title": "Get the lead quality bar",
"annotations": {
"title": "Get the lead quality bar",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_lead_recordings (/docs/mcp/tools/get-lead-recordings)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_recordings.mdx. */}
**List session recordings** · Read-only
List session recordings (replays of what a visitor did on your website), newest first, up to 100. Pass clientId to list a website's recordings, or email to list one identified visitor's recordings. Each recording has session_id, client_id, lead_email, started_at, ended_at, duration_ms, page_count, first_page and finalized. Recordings exist only when session recording is enabled for the website. clientId comes from get_website or get_tracking_pixel; the email is the lead's exactPerson email from get_leads. To watch one, pass its session_id and client_id to get_recording_url. At least one of clientId or email is required. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `clientId` | `string` | No | The website's clientId (16-32 characters) from get_website or get_tracking_pixel. |
| `email` | `string` | No | Email address of an identified visitor (from get_leads). When given, the list is the recordings for this email. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_recordings",
"title": "List session recordings",
"annotations": {
"title": "List session recordings",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"clientId": {
"type": "string",
"description": "The website's clientId (16-32 characters) from get_website or get_tracking_pixel."
},
"email": {
"type": "string",
"description": "Email address of an identified visitor (from get_leads). When given, the list is the recordings for this email."
}
}
}
}
```
# get_lead_scoring_model (/docs/mcp/tools/get-lead-scoring-model)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead_scoring_model.mdx. */}
**Get a lead scoring model** · Read-only
Get one lead scoring model with all its rules. Each criterion (industry, employees, revenue, hqLocation, sector, technologies, companyType, tag, keywords, jobTitle, department, seniority, visitorLocation, visitorCity, visitorState, pageVisited, numberVisits, duration, recency, referrerDomain, campaignSource/Medium/Name/Term, companyDomain, contactEmail) holds a list of rules with values, score (-10 to +10 points) and filter ('any' = add points, 'only' = keep only matching leads, 'excl' = exclude matching leads). Also returns name, active, status, bands (warm/hot thresholds) and revision. modelId is an _id from list_lead_scoring_models. Read it before update_lead_scoring_model. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `modelId` | `string` | Yes | Scoring model id (24 hex characters), the _id from list_lead_scoring_models. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead_scoring_model",
"title": "Get a lead scoring model",
"annotations": {
"title": "Get a lead scoring model",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"modelId": {
"type": "string",
"description": "Scoring model id (24 hex characters), the _id from list_lead_scoring_models."
}
},
"required": [
"modelId"
]
}
}
```
# get_lead (/docs/mcp/tools/get-lead)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_lead.mdx. */}
**Get lead details** · Read-only
Get one lead's company profile and visit history: company (name, domain, industry, sector, type, founded year, location, employee range, estimated revenue, LinkedIn/Facebook pages), tags, UTM values, pageVisits[] (url, path, timeSpentMs/timeSpentSeconds, visitCount, sorted by time spent) and summary (totalVisits, lastVisit, totalTimeOnSiteMs, referrer), plus CRM record ids when the lead was pushed. leadId is the _id of a row from get_leads. exactPerson is the identified person (firstName, lastName, fullName, businessEmail, personalEmail, email, phone, position, linkedinUrl), or null when only the company is known; exactPersonType says Exact Visitor or Suggested Contact. Use get_lead_ai_summary for a short written read of the visit, get_lead_automation_history for automation runs. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_lead",
"title": "Get lead details",
"annotations": {
"title": "Get lead details",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadId": {
"type": "string",
"description": "Lead id (the _id of a row returned by get_leads)."
}
},
"required": [
"leadId"
]
}
}
```
# get_leads (/docs/mcp/tools/get-leads)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_leads.mdx. */}
**List website leads** · Read-only
List the identified visitors (leads) of one website whose last visit falls in a date range, newest first: the exact person (exactPerson: name, email, phone, LinkedIn, position), their company, visitor location, pages viewed, visits, UTM data, tags and lead scores. Use get_lead for one lead's full page history, get_lead_comments for notes, export_leads_csv for a full file. websiteId comes from list_websites. Read-only. 50 leads per page; totalLeads, totalPages and currentPage tell you where you are, and paginationCapped=true means narrow the dates or filters to reach every lead. Hidden leads are never listed. When nothing matches, emptyStateReason says why (not_verified, too_restrictive_filters, no_leads_in_date_range, no_leads_ever). Results may be up to 60 seconds old.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `dateFrom` | `string` | Yes | Start of the range, matched on the lead's last visit date (whole day). Accepts YYYY-MM-DD, MM/DD/YYYY, a full ISO 8601 timestamp or epoch milliseconds. |
| `dateTo` | `string` | Yes | End of the range (inclusive, whole day). Same formats as dateFrom. |
| `page` | `number` | No | Page number, 1-based, 50 leads per page. Default 1; pages beyond 100 return page 100. |
| `domain` | `string` | No | Free-text search across company name and domain, person names and emails, e.g. "acme.example" or "Jane Smith". |
| `industries` | `string` | No | One industry to match (case-insensitive, partial match), e.g. "Software". A single value, not a list. |
| `sectors` | `string` | No | One company sector to match (case-insensitive, partial match). |
| `visitorLocation` | `string` | No | Visitor country as a two-letter ISO code, e.g. "US", "GB" (case-insensitive). |
| `visitorLocationState` | `string` | No | Visitor state/region, e.g. "California". When set without visitorLocation, results are limited to US visitors. |
| `tag` | `string` | No | Tag name (not id) to filter by, e.g. "HOT"; tag names are stored in upper case and matched case-insensitively. Names come from list_tags. |
| `visits_lower_bound` | `number` | No | Minimum number of visits (sessions). Default 0. |
| `visits_upper_bound` | `number` | No | Maximum number of visits (sessions). Leave it out to include every lead, however many visits. |
| `employeesMin` | `number` | No | Smallest company headcount to include, e.g. 10. |
| `employeesMax` | `number` | No | Largest company headcount to include, e.g. 200. |
| `tech` | `string` | No | Technology the company uses, case-insensitive partial match, e.g. "HubSpot", or a JSON array string of several: '["HubSpot","Shopify"]'. |
| `exactVisitor` | `boolean` | No | true to list only leads where the exact person was identified (name and contact details), false for all leads. Leave it out for all leads. |
| `utmSource` | `string` | No | JSON array string of [operator, value] pairs, e.g. '[["contains","google"]]'. Operators: contains, not-contains, starts-with, ends-with. A plain string (not JSON) makes the call fail. |
| `utmMedium` | `string` | No | JSON array string of [operator, value] pairs, e.g. '[["contains","cpc"]]'. Same operators as utmSource. |
| `pageVisited` | `string` | No | JSON array string of [operator, value] pairs matched against visited page paths, e.g. '[["contains","pricing"]]' or '[["not-contains","careers"]]'. Operators: contains, not-contains, starts-with (value without the leading slash), ends-with. A plain string makes the call fail. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_leads",
"title": "List website leads",
"annotations": {
"title": "List website leads",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"dateFrom": {
"type": "string",
"description": "Start of the range, matched on the lead's last visit date (whole day). Accepts YYYY-MM-DD, MM/DD/YYYY, a full ISO 8601 timestamp or epoch milliseconds."
},
"dateTo": {
"type": "string",
"description": "End of the range (inclusive, whole day). Same formats as dateFrom."
},
"page": {
"type": "number",
"description": "Page number, 1-based, 50 leads per page. Default 1; pages beyond 100 return page 100."
},
"domain": {
"type": "string",
"description": "Free-text search across company name and domain, person names and emails, e.g. \"acme.example\" or \"Jane Smith\"."
},
"industries": {
"type": "string",
"description": "One industry to match (case-insensitive, partial match), e.g. \"Software\". A single value, not a list."
},
"sectors": {
"type": "string",
"description": "One company sector to match (case-insensitive, partial match)."
},
"visitorLocation": {
"type": "string",
"description": "Visitor country as a two-letter ISO code, e.g. \"US\", \"GB\" (case-insensitive)."
},
"visitorLocationState": {
"type": "string",
"description": "Visitor state/region, e.g. \"California\". When set without visitorLocation, results are limited to US visitors."
},
"tag": {
"type": "string",
"description": "Tag name (not id) to filter by, e.g. \"HOT\"; tag names are stored in upper case and matched case-insensitively. Names come from list_tags."
},
"visits_lower_bound": {
"type": "number",
"description": "Minimum number of visits (sessions). Default 0."
},
"visits_upper_bound": {
"type": "number",
"description": "Maximum number of visits (sessions). Leave it out to include every lead, however many visits."
},
"employeesMin": {
"type": "number",
"description": "Smallest company headcount to include, e.g. 10."
},
"employeesMax": {
"type": "number",
"description": "Largest company headcount to include, e.g. 200."
},
"tech": {
"type": "string",
"description": "Technology the company uses, case-insensitive partial match, e.g. \"HubSpot\", or a JSON array string of several: '[\"HubSpot\",\"Shopify\"]'."
},
"exactVisitor": {
"type": "boolean",
"description": "true to list only leads where the exact person was identified (name and contact details), false for all leads. Leave it out for all leads."
},
"utmSource": {
"type": "string",
"description": "JSON array string of [operator, value] pairs, e.g. '[[\"contains\",\"google\"]]'. Operators: contains, not-contains, starts-with, ends-with. A plain string (not JSON) makes the call fail."
},
"utmMedium": {
"type": "string",
"description": "JSON array string of [operator, value] pairs, e.g. '[[\"contains\",\"cpc\"]]'. Same operators as utmSource."
},
"pageVisited": {
"type": "string",
"description": "JSON array string of [operator, value] pairs matched against visited page paths, e.g. '[[\"contains\",\"pricing\"]]' or '[[\"not-contains\",\"careers\"]]'. Operators: contains, not-contains, starts-with (value without the leading slash), ends-with. A plain string makes the call fail."
}
},
"required": [
"websiteId",
"dateFrom",
"dateTo"
]
}
}
```
# get_linkedin_campaign_timeline (/docs/mcp/tools/get-linkedin-campaign-timeline)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_linkedin_campaign_timeline.mdx. */}
**Get a LinkedIn campaign timeline** · Read-only
What a LinkedIn campaign did day by day over the last days: invitations sent, accepted, messages sent and replies. Free.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. |
| `days` | `number` | No | How many days back (1-90). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_linkedin_campaign_timeline",
"title": "Get a LinkedIn campaign timeline",
"annotations": {
"title": "Get a LinkedIn campaign timeline",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"linkedinCampaignId": {
"type": "string",
"description": "LinkedIn campaign ID from list_linkedin_campaigns."
},
"days": {
"type": "number",
"minimum": 1,
"maximum": 90,
"description": "How many days back (1-90)."
}
},
"required": [
"websiteId",
"linkedinCampaignId"
]
}
}
```
# get_linkedin_campaign (/docs/mcp/tools/get-linkedin-campaign)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_linkedin_campaign.mdx. */}
**Get a LinkedIn campaign** · Read-only
One LinkedIn campaign of this website: its settings and the people in it with their status (invited, connected, messaged, replied), optionally one status, page by page. Free.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `linkedinCampaignId` | `string` | Yes | LinkedIn campaign ID from list_linkedin_campaigns. |
| `status` | `string` | No | Only people with this status. |
| `page` | `number` | No | Page of people, from 1. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_linkedin_campaign",
"title": "Get a LinkedIn campaign",
"annotations": {
"title": "Get a LinkedIn campaign",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"linkedinCampaignId": {
"type": "string",
"description": "LinkedIn campaign ID from list_linkedin_campaigns."
},
"status": {
"type": "string",
"description": "Only people with this status."
},
"page": {
"type": "number",
"minimum": 1,
"description": "Page of people, from 1."
}
},
"required": [
"websiteId",
"linkedinCampaignId"
]
}
}
```
# get_list (/docs/mcp/tools/get-list)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_list.mdx. */}
**Get a list** · Read-only
Returns one list with its contacts or companies, page by page. Returns 404 when the list is not one of this website's.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `listType` | `"contact" \| "company"` | Yes | contact for lists of people, company for lists of companies. |
| `listId` | `string` | Yes | _id from list_lists. |
| `page` | `number` | No | Page of items, starting at 1. |
| `limit` | `number` | No | Items per page. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_list",
"title": "Get a list",
"annotations": {
"title": "Get a list",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"listType": {
"type": "string",
"enum": [
"contact",
"company"
],
"description": "contact for lists of people, company for lists of companies."
},
"listId": {
"type": "string",
"description": "_id from list_lists."
},
"page": {
"type": "number",
"minimum": 1,
"description": "Page of items, starting at 1."
},
"limit": {
"type": "number",
"minimum": 1,
"description": "Items per page."
}
},
"required": [
"websiteId",
"listType",
"listId"
]
}
}
```
# get_permissions_catalog (/docs/mcp/tools/get-permissions-catalog)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_permissions_catalog.mdx. */}
**Get the permissions catalog** · Read-only
Returns every permission a member can be given and the presets (full, sales, developer, viewer, team, client) with the permissions each one ticks. Use it before invite_members or update_member.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
This tool takes no parameters.
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_permissions_catalog",
"title": "Get the permissions catalog",
"annotations": {
"title": "Get the permissions catalog",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {}
}
}
```
# get_pricing (/docs/mcp/tools/get-pricing)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_pricing.mdx. */}
**Get outreach mailbox and domain pricing** · Read-only
Returns the account's prices for outreach mailboxes and sending domains: mailboxPricePerMonthUSD (and the yearly equivalent), whether custom or default pricing applies, the defaults, and the outreach starter-kit state (available now, or earned on upgrade). It does NOT return subscription plan prices; to see what a plan change would cost use preview_plan_change, and for the current plan use get_subscription. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
This tool takes no parameters.
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_pricing",
"title": "Get outreach mailbox and domain pricing",
"annotations": {
"title": "Get outreach mailbox and domain pricing",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {}
}
}
```
# get_prospects (/docs/mcp/tools/get-prospects)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_prospects.mdx. */}
**List campaign prospects** · Read-only
List the contacts (prospects) already added to email campaigns on a website, newest first. Pass campaignId (from list_campaigns) to see one campaign's prospects; each prospect carries its emails[] with the per-step schedule, send time, opens and replies. Use get_inbox_emails for replies only, and search_people/get_leads to find new contacts. websiteId comes from list_websites. Returns prospects[], totalCount and totalPages. Page size is 50 for the whole website, 200 for one campaign. The prospect _id is the prospectId used by stop_prospect and remove_prospect_from_campaign. When the campaign is paused, every prospect is shown with paused: true.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id (24 hex characters) from list_websites. |
| `campaignId` | `string` | No | Optional email campaign id from list_campaigns. Limits the list to that campaign. |
| `page` | `number` | No | Page number, starting at 1. Default 1. |
| `status` | `string` | No | Optional prospect status filter, e.g. scheduled, contacted, warm-reply, cold-reply, bounced, unsubscribed, out-of-office, error-sending, manually-paused, delayed, skipped. An unknown value is ignored and all prospects are returned. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_prospects",
"title": "List campaign prospects",
"annotations": {
"title": "List campaign prospects",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id (24 hex characters) from list_websites."
},
"campaignId": {
"type": "string",
"description": "Optional email campaign id from list_campaigns. Limits the list to that campaign."
},
"page": {
"type": "number",
"description": "Page number, starting at 1. Default 1."
},
"status": {
"type": "string",
"description": "Optional prospect status filter, e.g. scheduled, contacted, warm-reply, cold-reply, bounced, unsubscribed, out-of-office, error-sending, manually-paused, delayed, skipped. An unknown value is ignored and all prospects are returned."
}
},
"required": [
"websiteId"
]
}
}
```
# get_recording_url (/docs/mcp/tools/get-recording-url)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_recording_url.mdx. */}
**Get recording playback link** · Read-only
Get a signed playback link for one session recording. The link expires after 5 minutes, so open or share it right away and request a new one later. sessionId is session_id and clientId is client_id from get_lead_recordings (clientId also from get_website). The session must be among the website's 100 most recent recordings, otherwise access is refused. Returns url. Read-only.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `sessionId` | `string` | Yes | Recording id (session_id from get_lead_recordings), 16-64 characters. |
| `clientId` | `string` | Yes | The website's clientId that owns the recording (client_id from get_lead_recordings, or from get_website). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_recording_url",
"title": "Get recording playback link",
"annotations": {
"title": "Get recording playback link",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"sessionId": {
"type": "string",
"description": "Recording id (session_id from get_lead_recordings), 16-64 characters."
},
"clientId": {
"type": "string",
"description": "The website's clientId that owns the recording (client_id from get_lead_recordings, or from get_website)."
}
},
"required": [
"sessionId",
"clientId"
]
}
}
```
# get_slack_message_template (/docs/mcp/tools/get-slack-message-template)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_slack_message_template.mdx. */}
**Get the Slack message template** · Read-only
The template of the message posted to Slack for each lead, with its merge fields. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_slack_message_template",
"title": "Get the Slack message template",
"annotations": {
"title": "Get the Slack message template",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_subscription (/docs/mcp/tools/get-subscription)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_subscription.mdx. */}
**Get subscription** · Read-only
Shows the current subscription: plan, tierName, leads per month, usedCredits, remaining, topUpCredits, refreshOn, price (monthly equivalent, USD), annualTotal, interval ('month' or 'year'), nextBillingDate, cancelAtPeriodEnd, subscriptionStatus, isPausedByUser/pausedUntil, pendingDowngrade, retentionDiscount and add-ons. Read-only. Call it before any plan change: the interval tells you which value of `annual` to pass to preview_plan_change, upgrade_plan and downgrade_plan. Price fields are empty when there is no paid subscription. Needs an account-level key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
This tool takes no parameters.
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_subscription",
"title": "Get subscription",
"annotations": {
"title": "Get subscription",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {}
}
}
```
# get_tracking_pixel (/docs/mcp/tools/get-tracking-pixel)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_tracking_pixel.mdx. */}
**Get tracking snippet** · Read-only
Returns the JavaScript snippet to install on a website so visitors can be identified, plus websiteId, clientId, status and url. Give trackingScript to the user to add to every page of their site (or their tag manager / site builder). After it is installed, run verify_website. websiteId comes from list_websites or add_website.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites or add_website. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_tracking_pixel",
"title": "Get tracking snippet",
"annotations": {
"title": "Get tracking snippet",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites or add_website."
}
},
"required": [
"websiteId"
]
}
}
```
# get_warmup_health (/docs/mcp/tools/get-warmup-health)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_warmup_health.mdx. */}
**Get warmup health** · Read-only
Returns one mailbox's warmup health: reputation, inbox vs spam placement and what to fix. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_warmup_health",
"title": "Get warmup health",
"annotations": {
"title": "Get warmup health",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"emailAccountId": {
"type": "string",
"description": "_id of the mailbox from list_email_accounts."
}
},
"required": [
"websiteId",
"emailAccountId"
]
}
}
```
# get_warmup_stats (/docs/mcp/tools/get-warmup-stats)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_warmup_stats.mdx. */}
**Get warmup stats** · Read-only
Get warmup statistics for all mailboxes on a website: totals (mailboxes, warmup on, connected, warmup emails sent and received) and per mailbox the daily volume, inbox placement and reputation. websiteId comes from list_websites. reputation is only reported when a health check from the last 7 days backs it, otherwise it is insufficient_data with healthScore null. sentToday is the real number of warmup emails sent today and effectiveDailyLimit the limit actually enforced; currentDailyVolume resets daily. rampWeek (= warmupSettings.currentWeek) is the warmup ramp week and is null while warmup is off; rampingCurrentWeek on list_email_accounts is a different thing, the campaign sending ramp. warmupPlacement counts warmup emails that landed in inbox vs spam.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website id from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_warmup_stats",
"title": "Get warmup stats",
"annotations": {
"title": "Get warmup stats",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website id from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_web_scraping (/docs/mcp/tools/get-web-scraping)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_web_scraping.mdx. */}
**Get Web Scraping keywords** · Read-only
Web Scraping looks for your keywords on websites across the open web — in the page text or in the scripts a site loads — and adds the companies that match, with their people, as leads under Leads › Web Scraping. A keyword can be a phrase your buyers write about themselves ("ships worldwide") or a domain such as a competitor's tracker (competitor-tool.com). Returns whether it is on, the keywords and their match mode, the daily limit, contacts-only, leads today and in total, and leads per keyword over the last 7 days. Free.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_web_scraping",
"title": "Get Web Scraping keywords",
"annotations": {
"title": "Get Web Scraping keywords",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_website_analytics (/docs/mcp/tools/get-website-analytics)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_analytics.mdx. */}
**Get website audience breakdown** · Read-only
Summarises who the identified leads on a website are, over a date range (default the last 30 days): top 10 industries, all company-size ranges, top 10 job titles and top 5 countries, each with a count. Empty lists mean no data in the range. For leads per day use get_website_daily_stats; for the leads themselves use get_leads. websiteId comes from list_websites.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `dateFrom` | `string` | No | Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days. |
| `dateTo` | `string` | No | End date (inclusive), same formats as dateFrom. Only used together with dateFrom. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_website_analytics",
"title": "Get website audience breakdown",
"annotations": {
"title": "Get website audience breakdown",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"dateFrom": {
"type": "string",
"description": "Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days."
},
"dateTo": {
"type": "string",
"description": "End date (inclusive), same formats as dateFrom. Only used together with dateFrom."
}
},
"required": [
"websiteId"
]
}
}
```
# get_website_credit_history (/docs/mcp/tools/get-website-credit-history)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_credit_history.mdx. */}
**Get website credit history** · Read-only
Returns the credit snapshots stored for one website: each entry has creditsLimit, creditsRemaining, creditsUsed, refreshOn and timestamps. Returns \{ history: [...] \}, the full list (no paging). Use it for a website that has its own credit allowance. For individual credit charges and refunds use get_credit_history. websiteId comes from list_websites.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (24-character ID). |
| `page` | `number` | No | Accepted but currently ignored; the whole history is returned. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_website_credit_history",
"title": "Get website credit history",
"annotations": {
"title": "Get website credit history",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (24-character ID)."
},
"page": {
"type": "number",
"description": "Accepted but currently ignored; the whole history is returned."
}
},
"required": [
"websiteId"
]
}
}
```
# get_website_daily_stats (/docs/mcp/tools/get-website-daily-stats)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_daily_stats.mdx. */}
**Get daily lead counts** · Read-only
Returns one row per day for a website (default the last 30 days, every day included even with 0): date (YYYY-MM-DD, UTC), leadsIdentified, avgIcpScore and leadsWithIcpScore. Each lead is counted on the day of its most recent visit, so a returning lead moves to its latest day. leadsProspected, emailsSent and emailsScheduled are always 0 here. For the audience breakdown use get_website_analytics. websiteId comes from list_websites.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `dateFrom` | `string` | No | Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days. |
| `dateTo` | `string` | No | End date (inclusive), same formats as dateFrom. Only used together with dateFrom. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_website_daily_stats",
"title": "Get daily lead counts",
"annotations": {
"title": "Get daily lead counts",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"dateFrom": {
"type": "string",
"description": "Start date, e.g. 2026-10-01 (ISO), 10/01/2026 or epoch milliseconds. Only used when dateTo is also given; otherwise the last 30 days."
},
"dateTo": {
"type": "string",
"description": "End date (inclusive), same formats as dateFrom. Only used together with dateFrom."
}
},
"required": [
"websiteId"
]
}
}
```
# get_website_diagnostics (/docs/mcp/tools/get-website-diagnostics)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website_diagnostics.mdx. */}
**Diagnose website** · Read-only
Checks why a website may not be producing leads. Returns processing.isBlocked and shouldExpectLeads, credits (account, website and effective credits, and whether the website has its own allowance), recentActivity (leadsLast48Hours, lastLeadCreatedAt, hasNeverGeneratedLeads) and messages.primary, a one-line status that names the block reason (e.g. trial expired, credits exhausted, account paused). Use it for 'no leads' questions; to check the snippet is installed use verify_website. websiteId comes from list_websites.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_website_diagnostics",
"title": "Diagnose website",
"annotations": {
"title": "Diagnose website",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# get_website (/docs/mcp/tools/get-website)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/get_website.mdx. */}
**Get website** · Read-only
Returns one website's details: name, url, domain, clientId, trackingScript (the install snippet), status (unverified, verified, removed or failed), lastVerifiedAt, tracking settings (identifySettings, trackExactVisitors, trackCompanyWithSuggestedContacts, trackPersonalEmails, session recording, email digest), credit limits and remaining, trial dates, tags, intent-topic state, integrations and members. websiteId comes from list_websites. If the ID is unknown the result says 'No website found'. For just the snippet use get_tracking_pixel.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (24-character ID). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "get_website",
"title": "Get website",
"annotations": {
"title": "Get website",
"readOnlyHint": true,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (24-character ID)."
}
},
"required": [
"websiteId"
]
}
}
```
# hide_lead (/docs/mcp/tools/hide-lead)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/hide_lead.mdx. */}
**Hide or unhide a lead** · Changes data
Hide a lead from the leads list (hide=true, the default) or bring a hidden lead back (hide=false). Hidden leads no longer appear in get_leads. Hiding is reversible and keeps the lead's data; it does not give back the credit the lead used. To remove a lead for good use delete_lead. leadId comes from get_leads. Returns status 'Successful'; hiding an already hidden lead returns an error 'Lead is already hidden.'
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leadId` | `string` | Yes | Lead id (the _id of a row returned by get_leads). |
| `hide` | `boolean` | No | true (default) hides the lead; false makes a hidden lead visible again. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "hide_lead",
"title": "Hide or unhide a lead",
"annotations": {
"title": "Hide or unhide a lead",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"leadId": {
"type": "string",
"description": "Lead id (the _id of a row returned by get_leads)."
},
"hide": {
"type": "boolean",
"description": "true (default) hides the lead; false makes a hidden lead visible again."
}
},
"required": [
"leadId"
]
}
}
```
# All tools (/docs/mcp/tools)
{/* Generated by scripts/sync-mcp-tools.mjs. Do not edit. */}
Your assistant sees these automatically and picks the right one for your request; you never call them by name. **230 tools**: 99 read-only, 100 that change data, 31 that delete or overwrite data, 43 that act outside your account (send email, push to a CRM, charge a card) and 13 that can spend credits or money.
## Account & billing [#account--billing]
| Tool | What it does | |
| --- | --- | --- |
| [`get_account`](/docs/mcp/tools/get-account) | Shows the signed-in account: plan, credit limits and remaining credits, refresh and trial dates, add-ons, features, settings, pause status, failed-payment flag and the account's websites (the first 11 only). | Read-only |
| [`update_account_tracking_settings`](/docs/mcp/tools/update-account-tracking-settings) | Turns tracking options on or off for every website of the account at once: identify people, suggested contacts, personal emails, session recordings. | Changes data |
| [`get_credit_summary`](/docs/mcp/tools/get-credit-summary) | Credits used in a billing cycle, by source (website visitors, Prospector, AI Scout, Web Scraping…) and by day, with what is left. | Read-only |
| [`list_billing_domains`](/docs/mcp/tools/list-billing-domains) | The sending domains billed to the account, with their yearly price, renewal date and auto-renew. | Read-only |
| [`list_open_invoices`](/docs/mcp/tools/list-open-invoices) | The account invoices that are still open or past due, with amount and due date. | Read-only |
| [`list_invoices`](/docs/mcp/tools/list-invoices) | The account's invoices, newest first: date, amount, currency, status (paid, open) and a link to the PDF. | Read-only |
| [`get_auto_topup`](/docs/mcp/tools/get-auto-topup) | Whether auto top-up is on: when credits run out, a pack of leads is bought automatically, up to a monthly cap in USD. | Read-only |
| [`set_auto_topup`](/docs/mcp/tools/set-auto-topup) | Turns auto top-up on or off and sets the pack of leads bought each time credits run out and the monthly cap in USD. | Changes data |
| [`get_billing`](/docs/mcp/tools/get-billing) | Returns the same subscription summary as get_subscription: plan, leads per month, credits used and remaining, top-up credits, price, billing interval, next billing date, whether it is set to cancel or is paused, pending downgrade and any running retention discount. | Read-only |
| [`get_pricing`](/docs/mcp/tools/get-pricing) | Returns the account's prices for outreach mailboxes and sending domains: mailboxPricePerMonthUSD (and the yearly equivalent), whether custom or default pricing applies, the defaults, and the outreach starter-kit state (available now, or earned on upgrade). | Read-only |
| [`get_credit_history`](/docs/mcp/tools/get-credit-history) | Lists the account's credit transactions from the last 90 days, newest first: each row has operation (CHARGE, REFUND or DUPLICATE_PREVENTED), amount, credits before/after, the website, the lead's domain/email, a source category (WEBSITE_VISITOR, PROSPECTOR, ENRICHMENT, EMAIL_VERIFICATION, CONTACT_UNLOCK, INTENT_SIGNALS, ADJUSTMENT, OTHER), a reason and createdAt. | Read-only |
| [`get_website_credit_history`](/docs/mcp/tools/get-website-credit-history) | Returns the credit snapshots stored for one website: each entry has creditsLimit, creditsRemaining, creditsUsed, refreshOn and timestamps. | Read-only |
| [`get_subscription`](/docs/mcp/tools/get-subscription) | Shows the current subscription: plan, tierName, leads per month, usedCredits, remaining, topUpCredits, refreshOn, price (monthly equivalent, USD), annualTotal, interval ('month' or 'year'), nextBillingDate, cancelAtPeriodEnd, subscriptionStatus, isPausedByUser/pausedUntil, pendingDowngrade, retentionDiscount and add-ons. | Read-only |
| [`preview_plan_change`](/docs/mcp/tools/preview-plan-change) | Shows what a plan change would cost without changing anything. | Read-only |
| [`upgrade_plan`](/docs/mcp/tools/upgrade-plan) | Moves the subscription to more leads per month right away and charges the card on file today. | Changes data · Credits |
| [`downgrade_plan`](/docs/mcp/tools/downgrade-plan) | Schedules the subscription to change to a new number of leads per month from the next billing date; nothing is charged or refunded now and current credits stay until then. | Changes data |
| [`pause_subscription`](/docs/mcp/tools/pause-subscription) | Pauses the subscription for 1 to 6 months: invoices during the pause are not collected, no new leads come in while paused, and it resumes automatically on pausedUntil. | Deletes or overwrites data |
| [`cancel_subscription`](/docs/mcp/tools/cancel-subscription) | Cancels the subscription at the end of the current billing period (it stays usable until then) and records why. | Deletes or overwrites data |
| [`reactivate_subscription`](/docs/mcp/tools/reactivate-subscription) | Undoes a cancellation that has not taken effect yet, or ends a pause early. | Changes data |
## Free tools [#free-tools]
| Tool | What it does | |
| --- | --- | --- |
| [`free_enrich_company`](/docs/mcp/free-tools/free-enrich-company) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_intent_signals`](/docs/mcp/free-tools/free-intent-signals) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_find_decision_makers`](/docs/mcp/free-tools/free-find-decision-makers) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_companies_using_tech`](/docs/mcp/free-tools/free-companies-using-tech) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_find_lookalikes`](/docs/mcp/free-tools/free-find-lookalikes) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_people_search`](/docs/mcp/free-tools/free-people-search) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
| [`free_email_pattern`](/docs/mcp/free-tools/free-email-pattern) | Free on every plan of a signed-in account, also after the trial ends, no credits used. | Read-only |
## Team [#team]
| Tool | What it does | |
| --- | --- | --- |
| [`list_members`](/docs/mcp/tools/list-members) | Lists the people on the account as team: userId, name, email, role (Owner or Member), permissions, preset, websites and whether their invite is still pending. | Read-only |
| [`get_permissions_catalog`](/docs/mcp/tools/get-permissions-catalog) | Returns every permission a member can be given and the presets (full, sales, developer, viewer, team, client) with the permissions each one ticks. | Read-only |
| [`invite_members`](/docs/mcp/tools/invite-members) | Invites people to the account; each one receives an invitation email to set a password. | Changes data |
| [`update_member`](/docs/mcp/tools/update-member) | Changes a member's role, permissions or websites. | Changes data |
| [`remove_member`](/docs/mcp/tools/remove-member) | Removes a person from the account: they lose access straight away. | Deletes or overwrites data |
## Prospector [#prospector]
| Tool | What it does | |
| --- | --- | --- |
| [`create_contact`](/docs/mcp/tools/create-contact) | Saves a new person record (name, job title, company domain) and returns it with its _id. | Changes data |
| [`verify_contact`](/docs/mcp/tools/verify-contact) | Checks whether the email of a saved contact is valid and deliverable. | Changes data · Credits |
| [`search_companies`](/docs/mcp/tools/search-companies) | Searches the company database by name or domain keyword, industry, HQ country, headcount, revenue and technologies. | Read-only |
| [`search_people`](/docs/mcp/tools/search-people) | Searches the 209M-contact people database by job title, company, company HQ country, seniority, department, industry, technology and company size. | Read-only |
| [`reveal_contact`](/docs/mcp/tools/reveal-contact) | Returns the email address and phone number held for one person from search_people. | Changes data · Credits |
| [`find_contact_email`](/docs/mcp/tools/find-contact-email) | Looks for a business email for one search_people contact by trying likely address patterns at their company and verifying each one. | Changes data · Credits |
| [`list_auto_searches`](/docs/mcp/tools/list-auto-searches) | Lists the Auto Searches of one website: name, status (running or paused), preferences, people per day, leads delivered today and in total, the matching pool and the last run. | Read-only |
| [`build_auto_search_profile`](/docs/mcp/tools/build-auto-search-profile) | Turns a plain-English description of the ideal customer ("founders of US SaaS companies with 10-200 staff") into Auto Search preferences: field, values and weight (Must, High, Prefer or Bonus). | Read-only |
| [`create_auto_search`](/docs/mcp/tools/create-auto-search) | Creates an Auto Search and starts it: every day new people matching the preferences are verified and added to the website's leads, 1 credit per lead delivered, up to perDay a day, until it is paused. | Changes data · Credits |
| [`pause_auto_search`](/docs/mcp/tools/pause-auto-search) | Pauses one Auto Search: no more leads are delivered and no more credits are used until it is resumed. | Changes data |
| [`resume_auto_search`](/docs/mcp/tools/resume-auto-search) | Resumes a paused Auto Search: deliveries start again today, 1 credit per lead delivered. | Changes data · Credits |
| [`get_icp`](/docs/mcp/tools/get-icp) | Returns the ideal customer profile (ICP) saved for a website: the companies the user wants to reach. | Read-only |
| [`update_icp`](/docs/mcp/tools/update-icp) | Changes a website's ideal customer profile: target industries, sectors, HQ locations, headcount and revenue ranges. | Changes data |
## Qualify (lead scoring) [#qualify-lead-scoring]
| Tool | What it does | |
| --- | --- | --- |
| [`recalculate_lead_scores`](/docs/mcp/tools/recalculate-lead-scores) | Re-run lead scoring for specific leads against the website's current scoring models, and answer any AI qualification questions those leads do not have an answer for yet. | Changes data |
| [`list_lead_scoring_models`](/docs/mcp/tools/list-lead-scoring-models) | List a website's lead scoring models (Qualify): the rules that score each lead on company, people and behaviour criteria and mark it warm or hot. | Read-only |
| [`create_lead_scoring_model`](/docs/mcp/tools/create-lead-scoring-model) | Create a lead scoring model on a website, with its rules: criteria (same shape as get_lead_scoring_model / update_lead_scoring_model), active and aiMatching are saved with it. | Changes data |
| [`ai_generate_scoring_model`](/docs/mcp/tools/ai-generate-scoring-model) | Have AI build a lead scoring model from the website's own pages (it reads the site to infer the ideal customer) and save it as 'ICP Score - AI Generated'. | Changes data |
| [`get_lead_scoring_model`](/docs/mcp/tools/get-lead-scoring-model) | Get one lead scoring model with all its rules. | Read-only |
| [`update_lead_scoring_model`](/docs/mcp/tools/update-lead-scoring-model) | Change a lead scoring model's name, on/off state and/or rules. | Deletes or overwrites data |
| [`delete_lead_scoring_model`](/docs/mcp/tools/delete-lead-scoring-model) | Permanently delete a lead scoring model and remove its score from every lead of the website. | Deletes or overwrites data |
## Automations & CRM [#automations--crm]
| Tool | What it does | |
| --- | --- | --- |
| [`get_lead_automation_history`](/docs/mcp/tools/get-lead-automation-history) | List every automation run recorded for one lead, newest first, as automationLogs[] with status, message (the result or error text), automation (the automation id, see list_automations) and executedAt. | Read-only |
| [`retrigger_automations`](/docs/mcp/tools/retrigger-automations) | Runs a website's automations again for a list of leads, for example after a CRM or Slack connection was fixed. | Changes data |
| [`list_crm_variables`](/docs/mcp/tools/list-crm-variables) | The lead and company fields (name, email, job title, company size, pages visited, score…) that can be mapped to fields in your CRM. | Read-only |
| [`get_crm_mappings`](/docs/mcp/tools/get-crm-mappings) | The field mappings used when leads are pushed to a CRM: which lead field fills which CRM field, for contacts and companies. | Read-only |
| [`set_crm_mappings`](/docs/mcp/tools/set-crm-mappings) | Sets the field mappings for contacts or companies pushed to a CRM. | Deletes or overwrites data |
| [`get_slack_message_template`](/docs/mcp/tools/get-slack-message-template) | The template of the message posted to Slack for each lead, with its merge fields. | Read-only |
| [`set_slack_message_template`](/docs/mcp/tools/set-slack-message-template) | Changes the template of the message posted to Slack for each lead. | Changes data |
| [`send_slack_test_message`](/docs/mcp/tools/send-slack-test-message) | Posts a sample lead message to a Slack channel so you can see how it looks. | Changes data |
| [`test_webhook`](/docs/mcp/tools/test-webhook) | Sends a sample lead, as automations send them, to a URL so you can check your endpoint receives and parses it. | Changes data |
| [`preview_automation_filter`](/docs/mcp/tools/preview-automation-filter) | Counts the leads of the last days that match a saved filter, and shows a few of them, before you use the filter in an automation. | Read-only |
| [`get_automation_stats`](/docs/mcp/tools/get-automation-stats) | For every automation of a website: how many leads it handled, how many failed and when it last ran. | Read-only |
| [`get_automation_runs`](/docs/mcp/tools/get-automation-runs) | The runs of one automation, newest first: which lead each run handled, when, and whether it succeeded (and why not). | Read-only |
| [`list_slack_channels`](/docs/mcp/tools/list-slack-channels) | The channels of the Slack workspace connected to this website, to pick one for a Slack automation. | Read-only |
| [`list_automations`](/docs/mcp/tools/list-automations) | Lists a website's automations: rules that act when a lead matches, for example sending to Slack, a CRM, a webhook, Zapier, an email or LinkedIn campaign, or an email alert. | Read-only |
| [`create_automation`](/docs/mcp/tools/create-automation) | Creates an automation that is active straight away and runs whenever a lead matches it. | Changes data |
| [`get_automation`](/docs/mcp/tools/get-automation) | Returns the full setup of one automation: name, isActive, when (trigger event), then (action), trigger, interval, frequency settings (repeatWindowHours, dedupeScope), contact selection, email verification rules, filter and the action settings. | Read-only |
| [`update_automation`](/docs/mcp/tools/update-automation) | Changes an existing automation: its name, rule, action settings or on/off state. | Changes data |
| [`delete_automation`](/docs/mcp/tools/delete-automation) | Deletes an automation permanently, so it no longer acts on any lead. | Deletes or overwrites data |
| [`toggle_automation`](/docs/mcp/tools/toggle-automation) | Switches an automation on or off without changing its setup. | Changes data |
| [`rerun_automation_for_lead`](/docs/mcp/tools/rerun-automation-for-lead) | Runs one type of automation again for a single lead right now and reports the outcome. | Changes data |
| [`push_lead_to_crm`](/docs/mcp/tools/push-lead-to-crm) | Creates a contact in the website's connected CRM: HubSpot, Pipedrive, Salesforce, Zoho or GoHighLevel. | Changes data |
| [`list_crm_owners`](/docs/mcp/tools/list-crm-owners) | Lists the users in a connected CRM that a contact can be assigned to. | Read-only |
## Intent data [#intent-data]
| Tool | What it does | |
| --- | --- | --- |
| [`get_intent_topics_catalog`](/docs/mcp/tools/get-intent-topics-catalog) | Lists every third-party intent topic you can subscribe to, e.g. | Read-only |
| [`list_intent_topics`](/docs/mcp/tools/list-intent-topics) | Lists the intent topics a website is subscribed to, with delivery numbers. | Read-only |
| [`subscribe_to_intent_topic`](/docs/mcp/tools/subscribe-to-intent-topic) | Subscribes a website to an intent topic, so companies researching that topic start arriving as leads each day, up to the daily limit. | Changes data · Credits |
| [`update_intent_topic`](/docs/mcp/tools/update-intent-topic) | Pauses or resumes an intent topic subscription, or changes its daily lead limit. | Changes data |
| [`delete_intent_topic`](/docs/mcp/tools/delete-intent-topic) | Unsubscribes a website from an intent topic and deletes the subscription, including its delivery counters. | Deletes or overwrites data |
## Campaigns & inbox [#campaigns--inbox]
| Tool | What it does | |
| --- | --- | --- |
| [`list_email_blacklist`](/docs/mcp/tools/list-email-blacklist) | Lists the email addresses campaigns on this website never send to, grouped by the name they were added under. | Read-only |
| [`add_to_email_blacklist`](/docs/mcp/tools/add-to-email-blacklist) | Adds email addresses that campaigns on this website must never send to, e.g. | Changes data |
| [`remove_from_email_blacklist`](/docs/mcp/tools/remove-from-email-blacklist) | Removes every address added under one group name; campaigns can email them again. | Deletes or overwrites data |
| [`update_campaign`](/docs/mcp/tools/update-campaign) | Renames a campaign, starts it (status active: emails start going out to its contacts) or pauses it, or changes its sending days (0 Sunday to 6 Saturday), hours (timeSlot start and end, 0-24), timezone or open/click tracking. | Changes data |
| [`clone_campaign`](/docs/mcp/tools/clone-campaign) | Copies a campaign with its steps and settings, named '\
\
for spacing). Merge fields need a fallback, e.g. \{\{ first_name | there \}\}, \{\{ company_name | your company \}\}. End every body with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\}, each on its own line, and nothing after them; never type your own sign-off or unsubscribe sentence.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `campaignId` | `string` | Yes | Email campaign id from list_campaigns. |
| `templateId` | `string` | Yes | Id of the step to edit, from get_campaign emailCampaignTemplates[]._id (24 hex characters). |
| `subject` | `string` | No | Optional new subject line. Merge fields need a fallback, e.g. \{\{ company_name \| your team \}\}. |
| `body` | `string` | No | Optional new body: plain text, one paragraph per line, ending with \{\{sender_signature\}\} then \{\{unsubscribe_text\}\}. |
| `delayDays` | `number` | No | Optional whole days to wait after the previous step. 0 for the first step. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_campaign_step",
"title": "Edit campaign email",
"annotations": {
"title": "Edit campaign email",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"campaignId": {
"type": "string",
"description": "Email campaign id from list_campaigns."
},
"templateId": {
"type": "string",
"description": "Id of the step to edit, from get_campaign emailCampaignTemplates[]._id (24 hex characters)."
},
"subject": {
"type": "string",
"description": "Optional new subject line. Merge fields need a fallback, e.g. {{ company_name | your team }}."
},
"body": {
"type": "string",
"description": "Optional new body: plain text, one paragraph per line, ending with {{sender_signature}} then {{unsubscribe_text}}."
},
"delayDays": {
"type": "number",
"description": "Optional whole days to wait after the previous step. 0 for the first step."
}
},
"required": [
"campaignId",
"templateId"
]
}
}
```
# update_campaign (/docs/mcp/tools/update-campaign)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_campaign.mdx. */}
**Update a campaign** · Changes data · Acts outside your account
Renames a campaign, starts it (status active: emails start going out to its contacts) or pauses it, or changes its sending days (0 Sunday to 6 Saturday), hours (timeSlot start and end, 0-24), timezone or open/click tracking. Fields left out stay as they are. Confirm with the user before setting status active. Returns 404 when the campaign is not one of this website's.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites (the campaign's website). |
| `campaignId` | `string` | Yes | campaignId from list_campaigns. |
| `name` | `string` | No | New name. |
| `status` | `"active" \| "paused"` | No | active to start sending, paused to stop. |
| `daysRange` | `number[]` | No | Days to send on, 0 (Sunday) to 6 (Saturday). |
| `timeSlot` | `object` | No | Sending hours in the campaign timezone. |
| `timeSlot.start` | `number` | No | First hour, 0-23. |
| `timeSlot.end` | `number` | No | Last hour, 1-24. |
| `timezone` | `string` | No | IANA timezone, e.g. Europe/London. |
| `isTrackingEnabled` | `boolean` | No | Track opens and clicks. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_campaign",
"title": "Update a campaign",
"annotations": {
"title": "Update a campaign",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites (the campaign's website)."
},
"campaignId": {
"type": "string",
"description": "campaignId from list_campaigns."
},
"name": {
"type": "string",
"description": "New name."
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
],
"description": "active to start sending, paused to stop."
},
"daysRange": {
"type": "array",
"items": {
"type": "number",
"minimum": 0,
"maximum": 6
},
"description": "Days to send on, 0 (Sunday) to 6 (Saturday)."
},
"timeSlot": {
"type": "object",
"properties": {
"start": {
"type": "number",
"minimum": 0,
"maximum": 23,
"description": "First hour, 0-23."
},
"end": {
"type": "number",
"minimum": 1,
"maximum": 24,
"description": "Last hour, 1-24."
}
},
"description": "Sending hours in the campaign timezone."
},
"timezone": {
"type": "string",
"description": "IANA timezone, e.g. Europe/London."
},
"isTrackingEnabled": {
"type": "boolean",
"description": "Track opens and clicks."
}
},
"required": [
"websiteId",
"campaignId"
]
}
}
```
# update_email_account (/docs/mcp/tools/update-email-account)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_email_account.mdx. */}
**Update a mailbox** · Changes data
Changes a mailbox: the daily sending limit (queued emails are rescheduled to match), the sender name, company, position, phone and the HTML signature. Only the fields you pass change. Passwords and server settings change only in the dashboard.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `emailAccountId` | `string` | Yes | Mailbox ID from list_email_accounts. |
| `messagesPerDayLimit` | `number` | No | Emails per day (1-500); our own mailboxes have a lower cap. |
| `firstname` | `string` | No | Sender first name. |
| `lastname` | `string` | No | Sender last name. |
| `company` | `string` | No | Sender company. |
| `position` | `string` | No | Sender job title. |
| `phoneNumber` | `string` | No | Sender phone number. |
| `signatureHTML` | `string` | No | The signature, as HTML. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_email_account",
"title": "Update a mailbox",
"annotations": {
"title": "Update a mailbox",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"emailAccountId": {
"type": "string",
"description": "Mailbox ID from list_email_accounts."
},
"messagesPerDayLimit": {
"type": "number",
"minimum": 1,
"maximum": 500,
"description": "Emails per day (1-500); our own mailboxes have a lower cap."
},
"firstname": {
"type": "string",
"description": "Sender first name."
},
"lastname": {
"type": "string",
"description": "Sender last name."
},
"company": {
"type": "string",
"description": "Sender company."
},
"position": {
"type": "string",
"description": "Sender job title."
},
"phoneNumber": {
"type": "string",
"description": "Sender phone number."
},
"signatureHTML": {
"type": "string",
"description": "The signature, as HTML."
}
},
"required": [
"websiteId",
"emailAccountId"
]
}
}
```
# update_filter (/docs/mcp/tools/update-filter)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_filter.mdx. */}
**Favourite a saved filter** · Changes data
Marks a saved leads filter as a favourite (shown first) or not. Returns 404 when the filter is not one of this website's.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `filterId` | `string` | Yes | _id from list_filters. |
| `isFavorite` | `boolean` | Yes | true to favourite it, false to un-favourite. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_filter",
"title": "Favourite a saved filter",
"annotations": {
"title": "Favourite a saved filter",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"filterId": {
"type": "string",
"description": "_id from list_filters."
},
"isFavorite": {
"type": "boolean",
"description": "true to favourite it, false to un-favourite."
}
},
"required": [
"websiteId",
"filterId",
"isFavorite"
]
}
}
```
# update_icp (/docs/mcp/tools/update-icp)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_icp.mdx. */}
**Update ideal customer profile** · Changes data
Changes a website's ideal customer profile: target industries, sectors, HQ locations, headcount and revenue ranges. Only the fields you pass change; the rest keep their saved values. A list you pass replaces the saved list, so read get_icp first and send the full list you want. Costs nothing and only changes settings inside the account. Returns the saved ICP.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `industries` | `string[]` | No | Target industries; replaces the saved list, e.g. ["Computer Software"]. |
| `employeesMin` | `number` | No | Smallest company headcount to target (whole number). |
| `employeesMax` | `number` | No | Largest company headcount to target (whole number). |
| `locations` | `string[]` | No | Target countries; replaces the saved list, e.g. ["United States", "United Kingdom"]. |
| `sectors` | `string[]` | No | Target sectors; replaces the saved list. |
| `revenueMin` | `number` | No | Smallest annual revenue to target (number). |
| `revenueMax` | `number` | No | Largest annual revenue to target (number). |
| `excludedDomains` | `string[]` | No | Domains to exclude. Not saved today (see notes); use add_to_domain_blacklist to exclude domains. |
| `excludedIndustries` | `string[]` | No | Industries to exclude. Not saved today (see notes). |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_icp",
"title": "Update ideal customer profile",
"annotations": {
"title": "Update ideal customer profile",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"industries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target industries; replaces the saved list, e.g. [\"Computer Software\"]."
},
"employeesMin": {
"type": "number",
"description": "Smallest company headcount to target (whole number)."
},
"employeesMax": {
"type": "number",
"description": "Largest company headcount to target (whole number)."
},
"locations": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target countries; replaces the saved list, e.g. [\"United States\", \"United Kingdom\"]."
},
"sectors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Target sectors; replaces the saved list."
},
"revenueMin": {
"type": "number",
"description": "Smallest annual revenue to target (number)."
},
"revenueMax": {
"type": "number",
"description": "Largest annual revenue to target (number)."
},
"excludedDomains": {
"type": "array",
"items": {
"type": "string"
},
"description": "Domains to exclude. Not saved today (see notes); use add_to_domain_blacklist to exclude domains."
},
"excludedIndustries": {
"type": "array",
"items": {
"type": "string"
},
"description": "Industries to exclude. Not saved today (see notes)."
}
},
"required": [
"websiteId"
]
}
}
```
# update_intent_topic (/docs/mcp/tools/update-intent-topic)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_intent_topic.mdx. */}
**Pause or edit intent topic** · Changes data
Pauses or resumes an intent topic subscription, or changes its daily lead limit. Pausing stops new deliveries from that topic. To stop following a topic for good, use delete_intent_topic. Pass at least one of paused or userDailyLimit, otherwise the call returns 400. Returns 404 when the website is not subscribed to that topic. Returns \{ result \} with the updated subscription.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `topicSlug` | `string` | Yes | Slug of a subscribed topic, from list_intent_topics. |
| `paused` | `boolean` | No | true pauses deliveries, false resumes them. |
| `userDailyLimit` | `number` | No | New maximum leads per day. Positive whole number, capped at 5000. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_intent_topic",
"title": "Pause or edit intent topic",
"annotations": {
"title": "Pause or edit intent topic",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"topicSlug": {
"type": "string",
"description": "Slug of a subscribed topic, from list_intent_topics."
},
"paused": {
"type": "boolean",
"description": "true pauses deliveries, false resumes them."
},
"userDailyLimit": {
"type": "number",
"description": "New maximum leads per day. Positive whole number, capped at 5000."
}
},
"required": [
"websiteId",
"topicSlug"
]
}
}
```
# update_lead_comment (/docs/mcp/tools/update-lead-comment)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_comment.mdx. */}
**Edit a lead comment** · Deletes or overwrites data
Replace the text of an existing lead comment. Only the user who wrote the comment can edit it; others get 'You do not have permission'. The previous text is not kept. commentId is the _id from get_lead_comments. Returns status 'Successful'.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `commentId` | `string` | Yes | Comment id (the _id from get_lead_comments). |
| `content` | `string` | Yes | The new comment text; replaces the old text entirely. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_lead_comment",
"title": "Edit a lead comment",
"annotations": {
"title": "Edit a lead comment",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"commentId": {
"type": "string",
"description": "Comment id (the _id from get_lead_comments)."
},
"content": {
"type": "string",
"description": "The new comment text; replaces the old text entirely."
}
},
"required": [
"commentId",
"content"
]
}
}
```
# update_lead_notes (/docs/mcp/tools/update-lead-notes)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_notes.mdx. */}
**Update lead notes** · Changes data
Sets the free-form notes on a lead, replacing what was there; an empty string clears them. For a threaded discussion use add_lead_comment instead.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `leadId` | `string` | Yes | Lead ID from get_leads. |
| `notes` | `string` | No | The full notes text; empty clears them. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_lead_notes",
"title": "Update lead notes",
"annotations": {
"title": "Update lead notes",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"leadId": {
"type": "string",
"description": "Lead ID from get_leads."
},
"notes": {
"type": "string",
"description": "The full notes text; empty clears them."
}
},
"required": [
"websiteId",
"leadId"
]
}
}
```
# update_lead_quality (/docs/mcp/tools/update-lead-quality)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_quality.mdx. */}
**Update the lead quality bar** · Changes data
Changes the lead quality settings of a website. Leads scoring below the bar are not added (and use no credits). Only the fields you pass change; the highest bar is 80 (20 on lifetime-deal plans).
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `minScore` | `number` | No | Minimum ideal-customer score for every source (0-80). |
| `bySource` | `object` | No | Per-source bars that override minScore. |
| `bySource.visitors` | `number` | No | Minimum score for website visitor leads (0-80); null uses the general bar. |
| `bySource.intent` | `number` | No | Minimum score for 3rd-party intent leads (0-80); null uses the general bar. |
| `bySource.scraping` | `number` | No | Minimum score for Web Scraping leads (0-80); null uses the general bar. |
| `bySource.prospector` | `number` | No | Minimum score for Prospector leads (0-80); null uses the general bar. |
| `bySource.scout` | `number` | No | Minimum score for AI Scout leads (0-80); null uses the general bar. |
| `contactsOnly` | `boolean` | No | Only keep leads with a person to contact. |
| `audienceFocus` | `"B2B" \| "B2C" \| "BOTH"` | No | B2B, B2C or BOTH. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_lead_quality",
"title": "Update the lead quality bar",
"annotations": {
"title": "Update the lead quality bar",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"minScore": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum ideal-customer score for every source (0-80)."
},
"bySource": {
"type": "object",
"properties": {
"visitors": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum score for website visitor leads (0-80); null uses the general bar."
},
"intent": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum score for 3rd-party intent leads (0-80); null uses the general bar."
},
"scraping": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum score for Web Scraping leads (0-80); null uses the general bar."
},
"prospector": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum score for Prospector leads (0-80); null uses the general bar."
},
"scout": {
"type": "number",
"minimum": 0,
"maximum": 80,
"description": "Minimum score for AI Scout leads (0-80); null uses the general bar."
}
},
"description": "Per-source bars that override minScore."
},
"contactsOnly": {
"type": "boolean",
"description": "Only keep leads with a person to contact."
},
"audienceFocus": {
"type": "string",
"enum": [
"B2B",
"B2C",
"BOTH"
],
"description": "B2B, B2C or BOTH."
}
},
"required": [
"websiteId"
]
}
}
```
# update_lead_scoring_model (/docs/mcp/tools/update-lead-scoring-model)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_lead_scoring_model.mdx. */}
**Update a lead scoring model** · Deletes or overwrites data
Change a lead scoring model's name, on/off state and/or rules. Every criterion key you pass in criteria replaces that criterion's whole rule list; criteria you leave out are unchanged, so read the model first with get_lead_scoring_model and send the full list for each criterion you change. Rule changes on a live model queue a re-score of recent leads in the background (rescoring.status 'queued'); removing a domain from companyDomain exclusions also unblocks it. Changes are recorded in the model's history. modelId from list_lead_scoring_models. Returns status 'success', the new revision and a summary of changes.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `modelId` | `string` | Yes | Scoring model id from list_lead_scoring_models. |
| `name` | `string` | No | New model name. |
| `active` | `boolean` | No | true turns the model on (it scores leads), false turns it off. |
| `criteria` | `object` | No | Object keyed by criterion name, each value a full list of rules in the shape get_lead_scoring_model returns, e.g. \{"industry":[\{"values":["Software"],"score":8,"filter":"any"\}],"revenue":[\{"values":\{"min":1000000,"max":null\},"score":5\}]\}. score is -10..10; filter is 'any', 'only' or 'excl'. Numeric criteria (revenue, numberVisits, duration, alexaRank) take \{min,max\}; recency takes \{days\}; others take a list of strings. Empty or duplicate rules are dropped. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_lead_scoring_model",
"title": "Update a lead scoring model",
"annotations": {
"title": "Update a lead scoring model",
"readOnlyHint": false,
"destructiveHint": true,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"modelId": {
"type": "string",
"description": "Scoring model id from list_lead_scoring_models."
},
"name": {
"type": "string",
"description": "New model name."
},
"active": {
"type": "boolean",
"description": "true turns the model on (it scores leads), false turns it off."
},
"criteria": {
"type": "object",
"description": "Object keyed by criterion name, each value a full list of rules in the shape get_lead_scoring_model returns, e.g. {\"industry\":[{\"values\":[\"Software\"],\"score\":8,\"filter\":\"any\"}],\"revenue\":[{\"values\":{\"min\":1000000,\"max\":null},\"score\":5}]}. score is -10..10; filter is 'any', 'only' or 'excl'. Numeric criteria (revenue, numberVisits, duration, alexaRank) take {min,max}; recency takes {days}; others take a list of strings. Empty or duplicate rules are dropped."
}
},
"required": [
"modelId"
]
}
}
```
# update_linkedin_account (/docs/mcp/tools/update-linkedin-account)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_linkedin_account.mdx. */}
**Update a LinkedIn account** · Changes data
Changes the label of a connected LinkedIn account, or pauses and resumes it (paused: its campaigns send nothing).
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `linkedinAccountId` | `string` | Yes | LinkedIn account ID from list_linkedin_accounts. |
| `label` | `string` | No | A name for the account. |
| `status` | `"active" \| "paused"` | No | active or paused. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_linkedin_account",
"title": "Update a LinkedIn account",
"annotations": {
"title": "Update a LinkedIn account",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"linkedinAccountId": {
"type": "string",
"description": "LinkedIn account ID from list_linkedin_accounts."
},
"label": {
"type": "string",
"description": "A name for the account."
},
"status": {
"type": "string",
"enum": [
"active",
"paused"
],
"description": "active or paused."
}
},
"required": [
"websiteId",
"linkedinAccountId"
]
}
}
```
# update_member (/docs/mcp/tools/update-member)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_member.mdx. */}
**Update a team member** · Changes data
Changes a member's role, permissions or websites. Fields left out stay as they are. Confirm with the user before calling. Needs the master key.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `userId` | `string` | Yes | userId from list_members. |
| `role` | `"Owner" \| "Member"` | No | Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner. |
| `preset` | `"full" \| "sales" \| "developer" \| "viewer" \| "team" \| "client"` | No | Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog). |
| `permissions` | `string[]` | No | Exact permission ids, from get_permissions_catalog. Overrides the preset. |
| `allWebsites` | `boolean` | No | true: access to every current and future website. |
| `websites` | `string[]` | No | Website ids the member can see, when allWebsites is false. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_member",
"title": "Update a team member",
"annotations": {
"title": "Update a team member",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"userId": {
"type": "string",
"description": "userId from list_members."
},
"role": {
"type": "string",
"enum": [
"Owner",
"Member"
],
"description": "Owner (everything, including billing) or Member (what permissions allow). Only an Owner can make another Owner."
},
"preset": {
"type": "string",
"enum": [
"full",
"sales",
"developer",
"viewer",
"team",
"client"
],
"description": "Start from a preset of permissions: full, sales, developer, viewer, team or client (see get_permissions_catalog)."
},
"permissions": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact permission ids, from get_permissions_catalog. Overrides the preset."
},
"allWebsites": {
"type": "boolean",
"description": "true: access to every current and future website."
},
"websites": {
"type": "array",
"items": {
"type": "string"
},
"description": "Website ids the member can see, when allWebsites is false."
}
},
"required": [
"userId"
]
}
}
```
# update_tag (/docs/mcp/tools/update-tag)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_tag.mdx. */}
**Update a tag** · Changes data
Renames a tag or changes its colour on this website. Every lead that has the tag keeps it. Pass only what changes. tagId comes from list_tags.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `tagId` | `string` | Yes | Tag ID from list_tags. |
| `name` | `string` | No | New tag name. |
| `color` | `string` | No | New colour as a hex code, e.g. #1E4EFF. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_tag",
"title": "Update a tag",
"annotations": {
"title": "Update a tag",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"tagId": {
"type": "string",
"description": "Tag ID from list_tags."
},
"name": {
"type": "string",
"description": "New tag name."
},
"color": {
"type": "string",
"description": "New colour as a hex code, e.g. #1E4EFF."
}
},
"required": [
"websiteId",
"tagId"
]
}
}
```
# update_warmup_settings (/docs/mcp/tools/update-warmup-settings)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_warmup_settings.mdx. */}
**Update warmup settings** · Changes data
Changes how hard a mailbox warms up: intensity conservative, normal or aggressive, and the most warmup emails a day (5-100). Returns 404 when the mailbox is not one of this website's.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. |
| `intensity` | `"conservative" \| "normal" \| "aggressive"` | No | conservative, normal or aggressive. |
| `dailyLimit` | `number` | No | Most warmup emails a day, 5-100. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_warmup_settings",
"title": "Update warmup settings",
"annotations": {
"title": "Update warmup settings",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"emailAccountId": {
"type": "string",
"description": "_id of the mailbox from list_email_accounts."
},
"intensity": {
"type": "string",
"enum": [
"conservative",
"normal",
"aggressive"
],
"description": "conservative, normal or aggressive."
},
"dailyLimit": {
"type": "number",
"minimum": 5,
"maximum": 100,
"description": "Most warmup emails a day, 5-100."
}
},
"required": [
"websiteId",
"emailAccountId"
]
}
}
```
# update_web_scraping (/docs/mcp/tools/update-web-scraping)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_web_scraping.mdx. */}
**Update Web Scraping keywords** · Changes data · Acts outside your account · Spends credits or money
Turns Web Scraping on or off and sets its keywords (exact or fuzzy match, each can be paused), the daily limit (1-500 leads, 1 credit each) and contacts-only (only companies where we found a person). Passing keywords replaces the whole list: get_web_scraping first and send the full list. Not on LTD plans.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `enabled` | `boolean` | No | On or off. |
| `keywords` | `object[]` | No | The full keyword list: value (a phrase your buyers write, or a domain in a script such as a competitor's tracker), matchMode (exact or fuzzy), paused. |
| `keywords[].value` | `string` | Yes | A phrase your buyers write on their own site, or a domain that appears in a script URL. |
| `keywords[].matchMode` | `"exact" \| "fuzzy"` | No | exact (the phrase as written) or fuzzy (close variants too). |
| `keywords[].paused` | `boolean` | No | true to keep the keyword but stop searching for it. |
| `dailyLimit` | `number` | No | Leads per day, 1-500. |
| `contactsOnly` | `boolean` | No | Only add companies where a person was found. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_web_scraping",
"title": "Update Web Scraping keywords",
"annotations": {
"title": "Update Web Scraping keywords",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"enabled": {
"type": "boolean",
"description": "On or off."
},
"keywords": {
"type": "array",
"items": {
"type": "object",
"properties": {
"value": {
"type": "string",
"description": "A phrase your buyers write on their own site, or a domain that appears in a script URL."
},
"matchMode": {
"type": "string",
"enum": [
"exact",
"fuzzy"
],
"description": "exact (the phrase as written) or fuzzy (close variants too)."
},
"paused": {
"type": "boolean",
"description": "true to keep the keyword but stop searching for it."
}
},
"required": [
"value"
]
},
"description": "The full keyword list: value (a phrase your buyers write, or a domain in a script such as a competitor's tracker), matchMode (exact or fuzzy), paused."
},
"dailyLimit": {
"type": "number",
"minimum": 1,
"maximum": 500,
"description": "Leads per day, 1-500."
},
"contactsOnly": {
"type": "boolean",
"description": "Only add companies where a person was found."
}
},
"required": [
"websiteId"
]
}
}
```
# update_website (/docs/mcp/tools/update-website)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/update_website.mdx. */}
**Update website settings** · Changes data
Changes a website's name, url and tracking settings. Send only the fields to change. Returns status (success, partial or error), saved (fields stored) and failed (field + reason); fields that are not website settings are listed under ignored. A setting switched off at account level cannot be switched on here (403). websiteId comes from list_websites. Confirm with the user before switching tracking settings off, since that changes which leads are created.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `name` | `string` | No | New display name for the website. |
| `url` | `string` | No | Website address, e.g. https://www.acme.example. verify_website checks the home page of this address. |
| `trackExactVisitors` | `boolean` | No | true to identify the exact person visiting (name, email, LinkedIn) as well as their company. |
| `trackPersonalEmails` | `boolean` | No | true to include personal email addresses (e.g. Gmail) for identified visitors; false for business emails only. |
| `enablePersonalEmails` | `boolean` | No | Same as trackPersonalEmails (kept for older clients). trackPersonalEmails wins if both are sent. |
| `trackCompanyWithSuggestedContacts` | `boolean` | No | true to still create a lead for the visiting company, with suggested contacts there, when the exact person cannot be identified. |
| `identifySettings` | `"both" \| "personal-level-data" \| "company-level-data"` | No | Which leads to show: 'both' (default), 'personal-level-data' (person leads) or 'company-level-data' (company leads). |
| `emailTrackingEnabled` | `boolean` | No | Website-level email tracking flag. Open and click tracking for outreach emails is set per campaign. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "update_website",
"title": "Update website settings",
"annotations": {
"title": "Update website settings",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"name": {
"type": "string",
"description": "New display name for the website."
},
"url": {
"type": "string",
"description": "Website address, e.g. https://www.acme.example. verify_website checks the home page of this address."
},
"trackExactVisitors": {
"type": "boolean",
"description": "true to identify the exact person visiting (name, email, LinkedIn) as well as their company."
},
"trackPersonalEmails": {
"type": "boolean",
"description": "true to include personal email addresses (e.g. Gmail) for identified visitors; false for business emails only."
},
"enablePersonalEmails": {
"type": "boolean",
"description": "Same as trackPersonalEmails (kept for older clients). trackPersonalEmails wins if both are sent."
},
"trackCompanyWithSuggestedContacts": {
"type": "boolean",
"description": "true to still create a lead for the visiting company, with suggested contacts there, when the exact person cannot be identified."
},
"identifySettings": {
"type": "string",
"enum": [
"both",
"personal-level-data",
"company-level-data"
],
"description": "Which leads to show: 'both' (default), 'personal-level-data' (person leads) or 'company-level-data' (company leads)."
},
"emailTrackingEnabled": {
"type": "boolean",
"description": "Website-level email tracking flag. Open and click tracking for outreach emails is set per campaign."
}
},
"required": [
"websiteId"
]
}
}
```
# upgrade_plan (/docs/mcp/tools/upgrade-plan)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/upgrade_plan.mdx. */}
**Upgrade plan** · Changes data · Acts outside your account · Spends credits or money
Moves the subscription to more leads per month right away and charges the card on file today. Same interval: the charge is the extra leads at the new plan's per-lead price, the extra credits are added now and the renewal date stays the same. Switching monthly/yearly: the current subscription is replaced and the full new amount is charged today. If leads is not higher than today's plan, the change is scheduled for the next billing date instead. Run preview_plan_change first, show the price and get an explicit yes. Confirm with the user before calling. Returns status (active, requires_action or scheduled), chargedNowCents and nextBillingDate; 402 means the card was declined, 409 means the subscription is paused.
| Connection | Account-owner URL or OAuth (not a team member URL) |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `leads` | `number` | Yes | Leads per month of the new plan; use the same value you previewed. |
| `annual` | `boolean` | No | true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "upgrade_plan",
"title": "Upgrade plan",
"annotations": {
"title": "Upgrade plan",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"leads": {
"type": "number",
"description": "Leads per month of the new plan; use the same value you previewed."
},
"annual": {
"type": "boolean",
"description": "true for yearly billing, false for monthly. Leave it out to keep the current billing interval; only pass a value when the user wants to switch."
}
},
"required": [
"leads"
]
}
}
```
# verify_contact (/docs/mcp/tools/verify-contact)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_contact.mdx. */}
**Verify contact email** · Changes data · Acts outside your account · Spends credits or money
Checks whether the email of a saved contact is valid and deliverable. If the contact has no email but has a domain, it tries firstnamelastname@domain and firstname.lastname@domain. Pass the contactId returned by create_contact; a raw email is not accepted. For people from search_people use reveal_contact or find_contact_email instead. Needs the Email Waterfall add-on: without it the call returns 402 with an upgradeUrl. A valid or catch-all result can use a credit, and the call returns 400 'You do not have enough credits!' when credits run out. Confirm with the user before calling. Returns \{ email, phone, verificationStatus \} (e.g. valid, catch-all), or 404 'Contact Details not found' with email null.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `contactId` | `string` | Yes | The _id returned by create_contact (24 hex characters). |
| `websiteId` | `string` | Yes | Website ID from list_websites. Used for the credit check. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "verify_contact",
"title": "Verify contact email",
"annotations": {
"title": "Verify contact email",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": false,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"contactId": {
"type": "string",
"description": "The _id returned by create_contact (24 hex characters)."
},
"websiteId": {
"type": "string",
"description": "Website ID from list_websites. Used for the credit check."
}
},
"required": [
"contactId",
"websiteId"
]
}
}
```
# verify_tracking_domain (/docs/mcp/tools/verify-tracking-domain)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_tracking_domain.mdx. */}
**Verify a tracking domain** · Changes data · Acts outside your account
Checks that a mailbox's custom tracking domain has its CNAME record set, so open and click tracking links use your own domain. Returns what is missing when it is not set.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
| `emailAccountId` | `string` | Yes | _id of the mailbox from list_email_accounts. |
| `customDomain` | `string` | Yes | The tracking domain, e.g. track.yourdomain.com. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "verify_tracking_domain",
"title": "Verify a tracking domain",
"annotations": {
"title": "Verify a tracking domain",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
},
"emailAccountId": {
"type": "string",
"description": "_id of the mailbox from list_email_accounts."
},
"customDomain": {
"type": "string",
"description": "The tracking domain, e.g. track.yourdomain.com."
}
},
"required": [
"websiteId",
"emailAccountId",
"customDomain"
]
}
}
```
# verify_website (/docs/mcp/tools/verify-website)
{/* Generated by scripts/sync-mcp-tools.mjs from happierleads-api. Do not edit: change src/routes/mcp/toolDocs.json there, or add content/mcp-notes/verify_website.mdx. */}
**Verify installation** · Changes data · Acts outside your account
Loads the website's home page (from its saved url) and checks whether this website's tracking snippet is in the HTML. When found, the website is marked verified and the response contains 'verified'; an empty response means the snippet was not found, the page could not be loaded, or no url is set (set it with update_website). Use after installing the snippet from get_tracking_pixel. For deeper problems (no leads arriving, credits, blocks) use get_website_diagnostics.
| Connection | Account URL, team member URL or OAuth |
| --- | --- |
## Parameters [#parameters]
| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `websiteId` | `string` | Yes | Website ID from list_websites. |
## Tool definition [#tool-definition]
What your assistant receives from `tools/list`:
```json
{
"name": "verify_website",
"title": "Verify installation",
"annotations": {
"title": "Verify installation",
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": true
},
"inputSchema": {
"type": "object",
"properties": {
"websiteId": {
"type": "string",
"description": "Website ID from list_websites."
}
},
"required": [
"websiteId"
]
}
}
```
# Blog articles
> Your hosted blog (Optimize add-on): articles written for your ideal customer, reviewed and published by you.
Every section below does the same job: in the dashboard (Guide), from your code (API) or through an AI assistant (MCP).
## Guide — In the dashboard
Source: /docs/optimize/blog-articles
With the Optimize add-on your website gets a hosted blog. New articles are proposed for your ideal customer; you read, edit, approve or reject each one, and every change is kept as a version you can go back to.
1. **Optimize → SEO** lists your articles; filter and sort them.
2. **Open a proposed article**, edit it if you like, then **Approve** or **Reject**.
3. **History** shows every version; **Revert** brings one back.
4. Change not showing? **Clear cache**.
---
## API — From your code
Source: /docs/optimize/blog-articles/api
Authenticated with `?privateKey=YOUR_KEY` (see [Authentication](/docs/authentication)).