Flunter

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.

VariableDescription
FLUNTER_API_KEYAPI key of the user (sent as x-api-key)
FLUNTER_API_URLOptional, defaults to https://api.flunter.com
FLUNTER_API_TIMEOUT_MSOptional 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

ToolTitleAccess
get_contactGet a contactread-only
update_contactUpdate a contactwrite
search_contactsSearch contactsread-only
list_campaignsList campaignsread-only
get_campaignGet a campaign with its contactsread-only
create_campaignCreate a campaign and import contacts from a CRM list or contact list datawrite
get_contact_fieldsGet contact fields configurationread-only
get_call_outcomesGet call outcomesread-only
list_callsList callsread-only
get_callGet a callread-only
list_tasksList tasksread-only
get_taskGet a taskread-only
create_taskCreate a taskwrite
update_taskUpdate a taskwrite
delete_taskDelete a taskdestructive

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.

ParameterTypeRequiredDescription
uuidstringrequiredContact 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.

ParameterTypeRequiredDescription
uuidstringrequiredContact UUID. format: uuid
firstNamestringoptionalFirst name, e.g. George
lastNamestringoptionalLast name, e.g. Dupont
phonestringoptionalInternational format, e.g. +33612345678
emailstringoptionalformat: email
jobTitlestringoptionalJob title, e.g. Sales Manager
companystringoptionalCompany name, e.g. ACME Corp
cityNamestringoptionalCity of the contact, e.g. Paris
countryCodestringoptionalISO 3166-1 alpha-2, e.g. FR. min length: 2. max length: 2
timezonestringoptionalIANA timezone, e.g. Europe/Paris
companyCitystringoptionalCity of the company, e.g. Paris
companyWebsitestringoptionalCompany website, e.g. https://www.acme.com
companyIndustrystringoptionalCompany industry, e.g. Software
companyUrlstringoptionalURL of the company page in an external tool, e.g. https://app.acme.com/company/acme
linkedinUrlstringoptionalLinkedIn profile, e.g. https://linkedin.com/in/georgedupont
doNotCallbooleanoptionaltrue 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.

ParameterTypeRequiredDescription
querystringrequiredName, phone number, company or email fragment. min length: 2
campaignUuidstringoptionalOnly search inside this campaign. format: uuid
limitintegeroptionalMax 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.

ParameterTypeRequiredDescription
searchstringoptionalCampaign name, or contact first/last name / phone number
campaignUuidsstring[]optionalRestrict to these campaign UUIDs
userUuidsany[]optionalFilter by owner/assigned user UUIDs (managers only)
createdFromstringoptionalCreated on or after (YYYY-MM-DD). pattern: ^\d{4}-\d{2}-\d{2}$
createdToanyoptionalCreated on or before (YYYY-MM-DD)
sortBycreatedAt | updatedAtoptionalDefault: API order
sortDirectionASC | DESCoptionalUsed with sortBy (default DESC)
pageintegeroptionalPage number (default 1). min: 1
limitintegeroptionalPage 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.

ParameterTypeRequiredDescription
uuidstringrequiredCampaign 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.

ParameterTypeRequiredDescription
namestringrequiredCampaign name. min length: 1
sourcestringoptionalCampaign source, when the campaign is created from a CRM (values: null, hubspot, salesforce, pipedrive, close, boond, odoo
listIdstringoptionalCRM list Id, when the campaign is created from a crm (cf source)
contactsobject[]optionalContacts to import
contacts[].firstNamestringoptionalFirst name, e.g. George
contacts[].lastNamestringoptionalLast name, e.g. Dupont
contacts[].phonestringoptionalInternational format, e.g. +33612345678
contacts[].emailstringoptionalformat: email
contacts[].jobTitlestringoptionalJob title, e.g. Sales Manager
contacts[].companystringoptionalCompany name, e.g. ACME Corp
contacts[].cityNamestringoptionalCity of the contact, e.g. Paris
contacts[].countryCodestringoptionalISO 3166-1 alpha-2, e.g. FR. min length: 2. max length: 2
contacts[].timezonestringoptionalIANA timezone, e.g. Europe/Paris
contacts[].companyCitystringoptionalCity of the company, e.g. Paris
contacts[].companyWebsitestringoptionalCompany website, e.g. https://www.acme.com
contacts[].companyIndustrystringoptionalCompany industry, e.g. Software
contacts[].companyUrlstringoptionalURL of the company page in an external tool, e.g. https://app.acme.com/company/acme
contacts[].linkedinUrlstringoptionalLinkedIn profile, e.g. https://linkedin.com/in/georgedupont
contacts[].doNotCallbooleanoptionaltrue excludes the contact from calls
contacts[].namestringoptionalFull name, used when first/last name are not split
contacts[].crmUrlstringoptionalURL of the contact in the CRM, e.g. https://crm.example.com/contact/123
contacts[].crmSourcestringoptionalCRM the contact comes from, e.g. hubspot
contacts[].customFieldsobject<string, string>optionalCustom field values by field key, e.g. {"custom1": "value1"}
ownerUuidstringoptionalAssign 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.

ParameterTypeRequiredDescription
contactUuidstringoptionalOnly calls made to this contact. format: uuid
campaignUuidanyoptionalOnly calls of this campaign
userUuidsany[]optionalOnly calls made by these users
searchstringoptionalCampaign name, or contact first/last name / phone number
callStatusinteger[]optionalCall status IDs (listed above)
callOutcomeinteger[]optionalOutcome IDs
isIncomingbooleanoptionaltrue = incoming only, false = outgoing only
dateFromstringoptionalFrom this date (YYYY-MM-DD), inclusive. pattern: ^\d{4}-\d{2}-\d{2}$
dateToanyoptionalUntil this date (YYYY-MM-DD), inclusive
minDurationSecondsintegeroptionalmin: 0
maxDurationSecondsintegeroptionalmin: 0
sortDirectionASC | DESCoptionalSort by creation date
pageintegeroptionalPage number (default 1). min: 1
limitintegeroptionalPage size (default 50, max 1000). min: 1. max: 1000

get_call

Get a call read-only

Returns one call by UUID.

ParameterTypeRequiredDescription
uuidstringrequiredCall 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.

ParameterTypeRequiredDescription
statusinteger[]optionalFilter by task status
pageintegeroptionalPage number (default 1). min: 1
limitintegeroptionalPage size (default 50, max 200). min: 1. max: 200

get_task

Get a task read-only

Returns one task by UUID.

ParameterTypeRequiredDescription
uuidstringrequiredTask 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.

ParameterTypeRequiredDescription
typeintegeroptionalTask type: 1 Call reminder, 2 Generic reminder, 3 Email reminder, 99 Other
titlestringoptionalTask title, e.g. Follow up call
descriptionstringoptionalTask details, e.g. Call back about the proposal
scheduledAtstringoptionalDue date. format: date-time
processedbooleanoptionaltrue marks the task as completed
contactUuidstringrequiredContact this task is linked to. format: uuid

update_task

Update a task write

Updates a task by UUID. Only the provided fields are changed.

ParameterTypeRequiredDescription
uuidstringrequiredTask UUID. format: uuid
typeintegeroptionalTask type: 1 Call reminder, 2 Generic reminder, 3 Email reminder, 99 Other
titlestringoptionalTask title, e.g. Follow up call
descriptionstringoptionalTask details, e.g. Call back about the proposal
scheduledAtstringoptionalDue date. format: date-time
processedbooleanoptionaltrue marks the task as completed
contactUuidstringoptionalReassign 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.

ParameterTypeRequiredDescription
uuidstringrequiredTask UUID. format: uuid