loading…
Search for a command to run...
loading…
Connects AI assistants to Custify customer success data for querying account metrics, health scores, and usage trends. It also supports taking actions such as c
Connects AI assistants to Custify customer success data for querying account metrics, health scores, and usage trends. It also supports taking actions such as creating notes, managing tasks, and triggering playbooks.
npm version License: MIT MCP Compatible GitHub Stars
Connect AI tools to your Custify customer success data via the Model Context Protocol.
Query accounts, health scores, usage data, and more — or create notes, tasks, and trigger playbooks — all from within Claude, Cursor, VS Code, or any MCP-compatible AI tool.
Get up and running in under 2 minutes.
Go to Custify Settings > Developer > API Access and create or copy your API key.
npx @custify/mcp-server
See the Configuration section below for your specific tool.
Ask your AI assistant:
How many churned accounts do I have?
Add the following to your claude_desktop_config.json:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}
Restart Claude Desktop after saving.
custifynpx -y @custify/mcp-serverCUSTIFY_API_KEY=your-api-key-hereAdd to your .vscode/mcp.json in your workspace root:
{
"servers": {
"custify": {
"command": "npx",
"args": ["-y", "@custify/mcp-server"],
"env": {
"CUSTIFY_API_KEY": "your-api-key-here"
}
}
}
}
claude mcp add custify -- npx -y @custify/mcp-server \
--env CUSTIFY_API_KEY=your-api-key-here
ChatGPT requires an HTTP-based MCP server. Deploy with Docker:
docker run -d \
-p 3000:3000 \
-e CUSTIFY_API_KEY=your-api-key-here \
ghcr.io/custifyofficial/custify-mcp:latest
Then configure ChatGPT to connect to your server's URL:
https://your-server.example.com/mcp
The Custify MCP server supports two transports:
npx @custify/mcp-server with the CUSTIFY_API_KEY environment variable set.MCP_TRANSPORT=streamable-http and the server will listen on port 3000 (configurable via PORT). The MCP endpoint is /mcp.Refer to your MCP client's documentation for how to configure an MCP server using either transport.
| Tool | Type | Description |
|---|---|---|
list_accounts |
Read | List and filter accounts using Custify's filter system |
get_account |
Read | Get full details for a specific account by ID |
search_accounts |
Read | Search accounts by name or domain |
list_attributes |
Read | Discover all available fields and their types for filtering |
list_accounts supports Custify's full filter system. Each filter is an object with fieldName, fieldType, filterType, and filterValue. Use list_attributes first to discover available fields.
Filter examples:
| What you want | Filter object |
|---|---|
| Churned accounts | {"fieldName": "churned", "fieldType": "Boolean", "filterType": "true"} |
| Name contains "acme" | {"fieldName": "name", "fieldType": "String", "filterType": "contains", "filterValue": "acme"} |
| Health score > 50 | {"fieldName": "metrics.health_scores.<score_id>", "fieldType": "Number", "filterType": "greater", "filterValue": "50"} |
| Signed up after a date | {"fieldName": "signed_up_at", "fieldType": "Date", "filterType": "after", "filterValue": "2024-01-01"} |
| In a specific segment | {"fieldName": "...", "fieldType": "Segment", "filterType": "is_any_of", "filterValue": ["<segment_id>"]} |
| Has any CSM assigned | {"fieldName": "owners_csm", "fieldType": "User", "filterType": "any_value"} |
Available filter types by field type:
| Field Type | Filter Types |
|---|---|
| Boolean | true, false |
| Number | greater, lower, between, is_unknown, any_value |
| String | contains, starts_with, ends_with, does_not_contain, is_unknown, any_value |
| Date | more_than, less_than, exactly, after, before, between, on, last_week, this_week, last_month, this_month, last_quarter, this_quarter, last_year, this_year, is_unknown, any_value |
| Dropdown | is_any_of, is_all_of, is_none_of, is_unknown, any_value |
| Segment | is_any_of, is_all_of, is_none_of |
| Tag | is_any_of, is_all_of, is_none_of, is_unknown, any_value |
| User | is_in, is_not_in, is_unknown, any_value |
| Currency | greater, lower, between, is_unknown, any_value |
| Tool | Type | Description |
|---|---|---|
get_contacts |
Read | List contacts/people for an account |
get_contact |
Read | Get full contact details by ID |
| Tool | Type | Description |
|---|---|---|
get_health_scores |
Read | Get all health scores for an account, with score names and values |
get_usage_data |
Read | Get product usage and event data for an account |
get_usage_trends |
Read | Get health score values over time for trend analysis |
| Tool | Type | Description |
|---|---|---|
get_alerts |
Read | Get alerts/signals for an account |
get_segment_membership |
Read | Get which segments an account belongs to |
| Tool | Type | Description |
|---|---|---|
list_tasks |
Read | Query tasks across all accounts with filters and pagination |
get_task |
Read | Get full details for a specific task by ID |
list_task_filter_values |
Read | Discover assignee, account, and creator IDs (with names) currently used on tasks |
list_tags |
Read | Resolve human-readable tag names to tag IDs. Use category: "task" to scope to task labels. |
list_tasks uses flat, ergonomic parameters. Filters combine with AND. To resolve a tag name like "onboarding follow up" to an ID, call list_tags with category: "task". To resolve an assignee name, call list_task_filter_values (returns user IDs with names).
Filter examples:
| What you want | Parameters |
|---|---|
| My open tasks due today | {"assignee_id": "<user_id>", "status": "open", "due": "today"} |
| Overdue tasks for an account | {"account_id": "<account_id>", "status": "overdue"} |
| All tasks tagged "onboarding follow up" | {"tag_ids": ["<tag_id>"], "status": "open"} |
| High-priority tasks due this week | {"priority": "high", "due": "this_week"} |
| Tasks due in a custom date range | {"due_after": "2026-04-01", "due_before": "2026-04-30"} |
| Tasks assigned to a CSM, sorted by due date | {"assignee_id": "<user_id>", "sort_by": "dueDate", "sort_direction": "asc"} |
Available status values:
| Status | Meaning |
|---|---|
open |
Status is open and not snoozed |
done |
Task completed |
not_relevant |
Marked as not relevant |
overdue |
Open and dueDate <= yesterday |
on_time |
Open and (no dueDate or dueDate > yesterday) |
outstanding |
Open and dueDate <= today |
Available due shortcuts: past_due, today, this_week, this_month, later. For custom ranges, supply both due_after and due_before (ISO dates). The due shortcut and the date-range pair are mutually exclusive — passing only one bound of the range is ignored.
| Tool | Type | Description |
|---|---|---|
create_note |
Write | Add a note to an account's timeline |
create_task |
Write | Create a task assigned to a CSM |
run_playbook |
Write | Trigger a manually-started playbook on an account |
update_custom_fields |
Write | Update custom attribute values on an account or contact |
Resources provide read-only context that AI agents can use to understand your Custify workspace:
| Resource | URI | Description |
|---|---|---|
| Segments | custify://segments |
All segment definitions with names and IDs |
| Playbooks | custify://playbooks |
All playbook definitions with names, types, and IDs |
| Health Score Definitions | custify://health-score-definitions |
All health score configs with names, thresholds, and IDs |
Here are real-world examples of what you can ask your AI assistant once connected:
"How many churned accounts do I have?" Uses
list_accountswith a churned filter to count accounts where churned = true.
"Show me all accounts with a health score below 30" Uses
list_attributesto find the health score field name, thenlist_accountswith a Number filter.
"Find all accounts managed by [email protected]" Uses
list_accountswith a User filter on the CSM field.
"Which accounts signed up this quarter?" Uses
list_accountswith a Date filter:filterType: "this_quarter"onsigned_up_at.
"Give me a full summary of Acme Corp" Uses
search_accountsto find Acme, thenget_account,get_health_scores,get_contacts,get_usage_data, andget_segment_membershipto build a comprehensive briefing.
"What segments is Acme Corp in?" Uses
search_accountsto find the account ID, thenget_segment_membership.
"Show me the health score trend for Acme Corp over the last month" Uses
get_health_scoresto find score IDs, thenget_usage_trendsfor historical values.
"What's on my plate today?" Uses
list_taskswithassignee_id(your user ID) anddue: "today"to pull a daily task list.
"Show me all overdue tasks tagged 'onboarding follow up' assigned to Jane" Uses
list_tagswithcategory: "task"to resolve the tag name to an ID,list_task_filter_valuesto resolve Jane's user ID, thenlist_taskswithtag_ids,assignee_id, andstatus: "overdue".
"What's open for Acme Corp?" Uses
search_accountsto find the account ID, thenlist_taskswithaccount_idandstatus: "open".
"Create a follow-up task for Acme Corp: Review onboarding progress, due next Friday" Uses
search_accountsto find Acme, thencreate_taskwith title, due date, and account ID.
"Add a note to Acme Corp: Spoke with VP of Engineering about API latency concerns" Uses
search_accountsthencreate_notewith the note body.
"Run the renewal prep playbook for Acme Corp" Uses the
playbooksresource to find the playbook ID,search_accountsfor the account, thenrun_playbook.
"What fields can I filter accounts by?" Uses
list_attributesto return all available fields with their names and types.
"What segments do we have?" Reads the
custify://segmentsresource.
"What playbooks are available?" Reads the
custify://playbooksresource.
| Variable | Required | Default | Description |
|---|---|---|---|
CUSTIFY_API_KEY |
Yes | - | Your Custify API key |
CUSTIFY_API_URL |
No | https://api.custify.com |
Custom API base URL (for different clusters) |
MCP_TRANSPORT |
No | stdio |
Transport mode: stdio or streamable-http |
PORT |
No | 3000 |
HTTP server port (only used with streamable-http transport) |
Run the server as a Docker container for HTTP-based MCP clients:
docker run -d \
--name custify-mcp \
-p 3000:3000 \
-e CUSTIFY_API_KEY=your-api-key-here \
ghcr.io/custifyofficial/custify-mcp:latest
The MCP endpoint will be available at http://localhost:3000/mcp and a health check endpoint at http://localhost:3000/health.
CUSTIFY_API_KEY is read from environment variables and is never logged, cached, or exposed through MCP responses. When using STDIO transport, the key stays within your local process. When using HTTP transport, ensure your deployment is behind TLS."Error: CUSTIFY_API_KEY environment variable is required"
Make sure the CUSTIFY_API_KEY environment variable is set in your MCP client configuration. Double-check for typos and ensure there are no extra spaces.
Server not connecting in Claude Desktop
npx is available in your system PATH.Authentication errors (401) Your API key may be invalid or expired. Generate a new key from Custify Settings > Developer > API Access.
Permission errors (403) The endpoint may not be available for API key access. Check that your Custify account has the required permissions.
Timeout or connection errors
If using HTTP transport, verify the server is running and accessible. Check that the PORT environment variable matches your deployment configuration. For STDIO transport, ensure no firewall or proxy is blocking local process communication.
Different Custify cluster?
If your Custify instance is on a different cluster (e.g., EU), set CUSTIFY_API_URL to your cluster's API URL.
Docker container exits immediately
Check the container logs with docker logs custify-mcp. The most common cause is a missing CUSTIFY_API_KEY environment variable.
Contributions are welcome! To get started:
git clone https://github.com/CustifyOfficial/custify-mcp.git
cd custify-mcp-server
npm install
npm run dev
git checkout -b feature/my-featurenpm testPlease open an issue first if you plan a significant change.
MIT - see LICENSE for details.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"custify-mcp-server": {
"command": "npx",
"args": []
}
}
}