Keap MCP by usefulapi

List and create Keap contacts, companies, tasks, opportunities, orders, tags and campaigns.

Should I use this

Quality & Safety

A
Description quality
91%
Schema completeness
94%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Findings (1)

  • LOWTool 'keap_apply_tag' description lacks action verbin keap_apply_tag

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,472Tokens (tool definitions)
~1.6 KBTypical response size
Significant attention impact (2.71% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "keap": {
      "url": "https://keap.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

https://keap.usefulapi.io/mcpstreamable-http

What it can do

Tool inventory

Tools (18)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢keap_list_contacts(page_size, page_token, filter, order_by, fields)

List contacts in the Keap CRM. Supports filtering, ordering, field selection, and cursor pagination (page_size / page_token). Keap: GET /contacts.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    },
    "fields": {
      "description": "Comma-separated list of fields to return (field selection).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_get_contact(contact_id, fields)

Get a single contact by id. Keap: GET /contacts/{contact_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "contact_id": {
      "type": "string",
      "description": "The contact id."
    },
    "fields": {
      "description": "Comma-separated list of fields to return (field selection).",
      "type": "string"
    }
  },
  "required": [
    "contact_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_companies(page_size, page_token, filter, order_by, fields)

List companies in the Keap CRM. Supports filtering, ordering, field selection, and cursor pagination. Keap: GET /companies.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    },
    "fields": {
      "description": "Comma-separated list of fields to return (field selection).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_get_company(company_id, fields)

Get a single company by id. Keap: GET /companies/{company_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "company_id": {
      "type": "string",
      "description": "The company id."
    },
    "fields": {
      "description": "Comma-separated list of fields to return (field selection).",
      "type": "string"
    }
  },
  "required": [
    "company_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_opportunities(page_size, page_token, filter, order_by, fields)

List sales opportunities (deals) in the pipeline. Supports filtering, ordering, field selection, and cursor pagination. Keap: GET /opportunities.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    },
    "fields": {
      "description": "Comma-separated list of fields to return (field selection).",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_get_opportunity(opportunity_id)

Get a single opportunity by id. Keap: GET /opportunities/{opportunity_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "opportunity_id": {
      "type": "string",
      "description": "The opportunity id."
    }
  },
  "required": [
    "opportunity_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_tags(page_size, page_token, filter, order_by)

List tags defined in the account (used to segment contacts). Supports filtering, ordering, and cursor pagination. Keap: GET /tags.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_tasks(page_size, page_token, filter, order_by)

List tasks (follow-ups / to-dos). Supports filtering, ordering, and cursor pagination. Keap: GET /tasks.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_get_task(task_id)

Get a single task by id. Keap: GET /tasks/{task_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "task_id": {
      "type": "string",
      "description": "The task id."
    }
  },
  "required": [
    "task_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_subscriptions(page_size, page_token, filter, order_by)

List recurring subscriptions / payment plans. Supports filtering, ordering, and cursor pagination. Keap: GET /subscriptions.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_orders(page_size, page_token, filter, order_by)

List e-commerce orders. Supports filtering, ordering, and cursor pagination. Keap: GET /orders.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_products(page_size, page_token, filter, order_by)

List products in the catalog. Supports filtering, ordering, and cursor pagination. Keap: GET /products.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_campaigns(page_size, page_token, filter, order_by)

List marketing campaigns (automation sequences). Supports filtering, ordering, and cursor pagination. Keap: GET /campaigns.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢keap_list_affiliates(page_size, page_token, filter, order_by)

List referral-program affiliates. Supports filtering, ordering, and cursor pagination. Keap: GET /affiliates.

Input Schema

{
  "type": "object",
  "properties": {
    "page_size": {
      "description": "Number of records per page (max 1000).",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "page_token": {
      "description": "Opaque pagination cursor from a prior response's next_page_token.",
      "type": "string"
    },
    "filter": {
      "description": "Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).",
      "type": "string"
    },
    "order_by": {
      "description": "Field to order results by, e.g. `given_name` or `-date_created`.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴keap_create_contact(given_name, family_name, email_addresses, phone_numbers, company_id, ...)

CREATE a new contact in the Keap CRM. Provide any of given_name, family_name, email_addresses, phone_numbers, company_id, plus an optional `extra` object of any other Keap fields. Keap: POST /contacts.

Input Schema

{
  "type": "object",
  "properties": {
    "given_name": {
      "description": "The contact's first name.",
      "type": "string"
    },
    "family_name": {
      "description": "The contact's last name.",
      "type": "string"
    },
    "email_addresses": {
      "description": "Email addresses to set on the contact.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "The email address."
          },
          "field": {
            "description": "Which email slot, e.g. EMAIL1 / EMAIL2 / EMAIL3.",
            "type": "string"
          }
        },
        "required": [
          "email"
        ]
      }
    },
    "phone_numbers": {
      "description": "Phone numbers to set on the contact.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "number": {
            "type": "string",
            "description": "The phone number."
          },
          "field": {
            "description": "Which phone slot, e.g. PHONE1 / PHONE2.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ]
      }
    },
    "company_id": {
      "description": "Id of the company to associate the contact with.",
      "type": "string"
    },
    "extra": {
      "description": "Any other Keap fields to merge into the request body verbatim.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴keap_update_contact(contact_id, given_name, family_name, email_addresses, phone_numbers, ...)

UPDATE an existing contact by id. Provide any of given_name, family_name, email_addresses, phone_numbers, company_id, plus an optional `extra` object of any other Keap fields (only supplied fields are changed). Keap: PATCH /contacts/{contact_id}.

Input Schema

{
  "type": "object",
  "properties": {
    "contact_id": {
      "type": "string",
      "description": "The contact id to update."
    },
    "given_name": {
      "description": "The contact's first name.",
      "type": "string"
    },
    "family_name": {
      "description": "The contact's last name.",
      "type": "string"
    },
    "email_addresses": {
      "description": "Email addresses to set on the contact.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "The email address."
          },
          "field": {
            "description": "Which email slot, e.g. EMAIL1 / EMAIL2 / EMAIL3.",
            "type": "string"
          }
        },
        "required": [
          "email"
        ]
      }
    },
    "phone_numbers": {
      "description": "Phone numbers to set on the contact.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "number": {
            "type": "string",
            "description": "The phone number."
          },
          "field": {
            "description": "Which phone slot, e.g. PHONE1 / PHONE2.",
            "type": "string"
          }
        },
        "required": [
          "number"
        ]
      }
    },
    "company_id": {
      "description": "Id of the company to associate the contact with.",
      "type": "string"
    },
    "extra": {
      "description": "Any other Keap fields to merge into the request body verbatim.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "contact_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴keap_create_task(title, description, due_date, contact_id, extra)

CREATE a task (follow-up / to-do), optionally linked to a contact. Keap: POST /tasks.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "The task title."
    },
    "description": {
      "description": "A longer description / notes for the task.",
      "type": "string"
    },
    "due_date": {
      "description": "Due date/time, ISO 8601 (e.g. 2026-08-01T17:00:00Z).",
      "type": "string"
    },
    "contact_id": {
      "description": "Id of a contact to link the task to.",
      "type": "string"
    },
    "extra": {
      "description": "Any other Keap fields to merge into the request body verbatim.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  },
  "required": [
    "title"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴keap_apply_tag(tag_id, contact_ids)

APPLY a tag to one or more contacts (segments them / can trigger automation). Keap: POST /tags/{tag_id}/contacts:applyTags.

Input Schema

{
  "type": "object",
  "properties": {
    "tag_id": {
      "type": "string",
      "description": "The id of the tag to apply."
    },
    "contact_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Ids of the contacts to tag."
    }
  },
  "required": [
    "tag_id",
    "contact_ids"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
verifiedversion not recorded18 tools
failed observationversion not recorded—