Welcome to the Flunter MCP
MCP server that exposes Flunter data to any MCP client (Claude Desktop, Claude Code, ...). It is a thin layer over the Flunter external API (/v1, x-api-key auth): every tool maps to an endpoint of that API, and the server has exactly the rights of the API key it is given.
Looking for the API documentation? Click here
Installation
Setup
Requires Node >= 20. No manual download needed: npx fetches and runs the package on the fly.
| Variable | Description |
|---|---|
FLUNTER_API_KEY | API key of the user (sent as x-api-key) |
FLUNTER_API_URL | Optional, defaults to https://api.flunter.com |
FLUNTER_API_TIMEOUT_MS | Optional request timeout, default 30000 |
Register in a client
Claude Code:
claude mcp add flunter-mcp \
--env FLUNTER_API_KEY=xxx \
-- npx -y @flunter/mcp
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"flunter-mcp": {
"command": "npx",
"args": ["-y", "@flunter/mcp"],
"env": { "FLUNTER_API_KEY": "xxx" }
}
}
}
Tools
| Tool | Title | Access |
|---|---|---|
get_contact | Get a contact | read-only |
update_contact | Update a contact | write |
search_contacts | Search contacts | read-only |
list_campaigns | List campaigns | read-only |
get_campaign | Get a campaign with its contacts | read-only |
create_campaign | Create a campaign and import contacts from a CRM list or contact list data | write |
get_contact_fields | Get contact fields configuration | read-only |
get_call_outcomes | Get call outcomes | read-only |
list_calls | List calls | read-only |
get_call | Get a call | read-only |
list_tasks | List tasks | read-only |
get_task | Get a task | read-only |
create_task | Create a task | write |
update_task | Update a task | write |
delete_task | Delete a task | destructive |
get_contact
Get a contact read-only
Returns one contact by UUID, with all its fields, its notes and its tasks (uuid, status, scheduledAt, title, description, processed). Contact UUIDs come from get_campaign, search_contacts or list_calls.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Contact UUID. format: uuid |
update_contact
Update a contact write
Updates a contact by UUID. Only the provided fields are changed. Writes data: only call it when the user explicitly asked to modify a contact. Custom fields and contact status cannot be updated. Returns the updated contact, with its notes and tasks.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Contact UUID. format: uuid |
firstName | string | optional | First name, e.g. George |
lastName | string | optional | Last name, e.g. Dupont |
phone | string | optional | International format, e.g. +33612345678 |
email | string | optional | format: email |
jobTitle | string | optional | Job title, e.g. Sales Manager |
company | string | optional | Company name, e.g. ACME Corp |
cityName | string | optional | City of the contact, e.g. Paris |
countryCode | string | optional | ISO 3166-1 alpha-2, e.g. FR. min length: 2. max length: 2 |
timezone | string | optional | IANA timezone, e.g. Europe/Paris |
companyCity | string | optional | City of the company, e.g. Paris |
companyWebsite | string | optional | Company website, e.g. https://www.acme.com |
companyIndustry | string | optional | Company industry, e.g. Software |
companyUrl | string | optional | URL of the company page in an external tool, e.g. https://app.acme.com/company/acme |
linkedinUrl | string | optional | LinkedIn profile, e.g. https://linkedin.com/in/georgedupont |
doNotCall | boolean | optional | true excludes the contact from calls |
search_contacts
Search contacts read-only
Finds contacts by name, phone number, company or email. The external API has no direct contact search: this looks through the campaigns whose content matches the query, then filters their contacts. At most 10 matching campaigns are scanned; narrow with campaignUuid if needed.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | required | Name, phone number, company or email fragment. min length: 2 |
campaignUuid | string | optional | Only search inside this campaign. format: uuid |
limit | integer | optional | Max contacts returned (default 25). min: 1. max: 100 |
list_campaigns
List campaigns read-only
Lists campaigns (contact lists) visible to the API key owner, paginated. The `search` text also matches the first/last name or phone number of the contacts inside campaigns.
| Parameter | Type | Required | Description |
|---|---|---|---|
search | string | optional | Campaign name, or contact first/last name / phone number |
campaignUuids | string[] | optional | Restrict to these campaign UUIDs |
userUuids | any[] | optional | Filter by owner/assigned user UUIDs (managers only) |
createdFrom | string | optional | Created on or after (YYYY-MM-DD). pattern: ^\d{4}-\d{2}-\d{2}$ |
createdTo | any | optional | Created on or before (YYYY-MM-DD) |
sortBy | createdAt | updatedAt | optional | Default: API order |
sortDirection | ASC | DESC | optional | Used with sortBy (default DESC) |
page | integer | optional | Page number (default 1). min: 1 |
limit | integer | optional | Page size (default 50, max 200). min: 1. max: 200 |
get_campaign
Get a campaign with its contacts read-only
Returns one campaign by UUID, including all its contacts.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Campaign UUID. format: uuid |
create_campaign
Create a campaign and import contacts from a CRM list or contact list data write
Creates a campaign and imports the given contacts into it. Writes data: only call it when the user explicitly asked to import contacts. Contacts failing validation are reported in importSummary.errors while the valid ones are still imported. Use get_contact_fields first to know the required fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | required | Campaign name. min length: 1 |
source | string | optional | Campaign source, when the campaign is created from a CRM (values: null, hubspot, salesforce, pipedrive, close, boond, odoo |
listId | string | optional | CRM list Id, when the campaign is created from a crm (cf source) |
contacts | object[] | optional | Contacts to import |
contacts[].firstName | string | optional | First name, e.g. George |
contacts[].lastName | string | optional | Last name, e.g. Dupont |
contacts[].phone | string | optional | International format, e.g. +33612345678 |
contacts[].email | string | optional | format: email |
contacts[].jobTitle | string | optional | Job title, e.g. Sales Manager |
contacts[].company | string | optional | Company name, e.g. ACME Corp |
contacts[].cityName | string | optional | City of the contact, e.g. Paris |
contacts[].countryCode | string | optional | ISO 3166-1 alpha-2, e.g. FR. min length: 2. max length: 2 |
contacts[].timezone | string | optional | IANA timezone, e.g. Europe/Paris |
contacts[].companyCity | string | optional | City of the company, e.g. Paris |
contacts[].companyWebsite | string | optional | Company website, e.g. https://www.acme.com |
contacts[].companyIndustry | string | optional | Company industry, e.g. Software |
contacts[].companyUrl | string | optional | URL of the company page in an external tool, e.g. https://app.acme.com/company/acme |
contacts[].linkedinUrl | string | optional | LinkedIn profile, e.g. https://linkedin.com/in/georgedupont |
contacts[].doNotCall | boolean | optional | true excludes the contact from calls |
contacts[].name | string | optional | Full name, used when first/last name are not split |
contacts[].crmUrl | string | optional | URL of the contact in the CRM, e.g. https://crm.example.com/contact/123 |
contacts[].crmSource | string | optional | CRM the contact comes from, e.g. hubspot |
contacts[].customFields | object<string, string> | optional | Custom field values by field key, e.g. {"custom1": "value1"} |
ownerUuid | string | optional | Assign the campaign to this user (managers only). format: uuid |
get_contact_fields
Get contact fields configuration read-only
Returns the organization's contact field configuration: which fields are enabled, visible, required and which are custom fields.
No parameters.
get_call_outcomes
Get call outcomes read-only
Returns the organization's call outcomes and their groups (Success, Follow up, Refusal, Unreachable, Bad contact). Use it to translate outcome IDs used by list_calls.
No parameters.
list_calls
List calls read-only
Lists calls, paginated. Set contactUuid to get the call history of one contact. callStatus IDs: 0 Created, 1 Initiated, 2 Ringing, 3 Connected, 4 No Answer, 5 Busy, 6 Canceled, 7 Completed, 8 Failed. Outcome IDs: see get_call_outcomes.
| Parameter | Type | Required | Description |
|---|---|---|---|
contactUuid | string | optional | Only calls made to this contact. format: uuid |
campaignUuid | any | optional | Only calls of this campaign |
userUuids | any[] | optional | Only calls made by these users |
search | string | optional | Campaign name, or contact first/last name / phone number |
callStatus | integer[] | optional | Call status IDs (listed above) |
callOutcome | integer[] | optional | Outcome IDs |
isIncoming | boolean | optional | true = incoming only, false = outgoing only |
dateFrom | string | optional | From this date (YYYY-MM-DD), inclusive. pattern: ^\d{4}-\d{2}-\d{2}$ |
dateTo | any | optional | Until this date (YYYY-MM-DD), inclusive |
minDurationSeconds | integer | optional | min: 0 |
maxDurationSeconds | integer | optional | min: 0 |
sortDirection | ASC | DESC | optional | Sort by creation date |
page | integer | optional | Page number (default 1). min: 1 |
limit | integer | optional | Page size (default 50, max 1000). min: 1. max: 1000 |
get_call
Get a call read-only
Returns one call by UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Call UUID. format: uuid |
list_tasks
List tasks read-only
Lists tasks visible to the API key owner, paginated. status IDs: 1 To do, 2 Overdue, 3 Completed.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | integer[] | optional | Filter by task status |
page | integer | optional | Page number (default 1). min: 1 |
limit | integer | optional | Page size (default 50, max 200). min: 1. max: 200 |
get_task
Get a task read-only
Returns one task by UUID.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Task UUID. format: uuid |
create_task
Create a task write
Creates a task linked to a contact. Writes data: only call it when the user explicitly asked for a task/reminder.
| Parameter | Type | Required | Description |
|---|---|---|---|
type | integer | optional | Task type: 1 Call reminder, 2 Generic reminder, 3 Email reminder, 99 Other |
title | string | optional | Task title, e.g. Follow up call |
description | string | optional | Task details, e.g. Call back about the proposal |
scheduledAt | string | optional | Due date. format: date-time |
processed | boolean | optional | true marks the task as completed |
contactUuid | string | required | Contact this task is linked to. format: uuid |
update_task
Update a task write
Updates a task by UUID. Only the provided fields are changed.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Task UUID. format: uuid |
type | integer | optional | Task type: 1 Call reminder, 2 Generic reminder, 3 Email reminder, 99 Other |
title | string | optional | Task title, e.g. Follow up call |
description | string | optional | Task details, e.g. Call back about the proposal |
scheduledAt | string | optional | Due date. format: date-time |
processed | boolean | optional | true marks the task as completed |
contactUuid | string | optional | Reassign this task to another contact. format: uuid |
delete_task
Delete a task destructive
Deletes a task by UUID. Writes data: only call it when the user explicitly asked to delete a task.
| Parameter | Type | Required | Description |
|---|---|---|---|
uuid | string | required | Task UUID. format: uuid |