# io.usefulapi/keap (remote · keap.usefulapi.io)

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

- Trust score: 70/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `keap.usefulapi.io`: 70/100 (this document), [markdown](https://verifymcp.io/servers/io-usefulapi-keap/keap.md), [page](https://verifymcp.io/servers/io-usefulapi-keap/keap)

## Channel facts

- Endpoint: `https://keap.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 78/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
  - The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2042 tokens (~113/item across 18 items; 18 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 23/100
  - Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http io-usefulapi-keap https://keap.usefulapi.io/mcp
```

### Codex

```toml
[mcp_servers.io-usefulapi-keap]
url = "https://keap.usefulapi.io/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-usefulapi-keap": {
      "type": "remote",
      "url": "https://keap.usefulapi.io/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add io-usefulapi-keap --url https://keap.usefulapi.io/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  io-usefulapi-keap:
    url: "https://keap.usefulapi.io/mcp"
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-keap": {
      "type": "http",
      "url": "https://keap.usefulapi.io/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-01 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 69, +3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 66, −1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 67, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-07-27 (score 66, +54)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 12)

First indexed and scored.

## MCP tools (18)

### `keap_list_contacts` (~152 tokens)

List contacts

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

Input parameters:

- `fields` (string): Comma-separated list of fields to return (field selection).
- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_get_contact` (~56 tokens)

Get contact

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

Input parameters:

- `contact_id` (string, required): The contact id.
- `fields` (string): Comma-separated list of fields to return (field selection).

### `keap_list_companies` (~147 tokens)

List companies

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

Input parameters:

- `fields` (string): Comma-separated list of fields to return (field selection).
- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_get_company` (~56 tokens)

Get company

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

Input parameters:

- `company_id` (string, required): The company id.
- `fields` (string): Comma-separated list of fields to return (field selection).

### `keap_list_opportunities` (~151 tokens)

List opportunities

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

Input parameters:

- `fields` (string): Comma-separated list of fields to return (field selection).
- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_get_opportunity` (~41 tokens)

Get opportunity

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

Input parameters:

- `opportunity_id` (string, required): The opportunity id.

### `keap_list_tags` (~129 tokens)

List tags

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_list_tasks` (~127 tokens)

List tasks

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_get_task` (~38 tokens)

Get task

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

Input parameters:

- `task_id` (string, required): The task id.

### `keap_list_subscriptions` (~125 tokens)

List subscriptions

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_list_orders` (~122 tokens)

List orders

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_list_products` (~123 tokens)

List products

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_list_campaigns` (~126 tokens)

List campaigns

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_list_affiliates` (~126 tokens)

List affiliates

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

Input parameters:

- `filter` (string): Filter expression, e.g. `given_name==John` (see Keap REST v2 filtering).
- `order_by` (string): Field to order results by, e.g. `given_name` or `-date_created`.
- `page_size` (integer): Number of records per page (max 1000).
- `page_token` (string): Opaque pagination cursor from a prior response's next_page_token.

### `keap_create_contact` (~152 tokens)

Create contact

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 parameters:

- `company_id` (string): Id of the company to associate the contact with.
- `email_addresses` (array): Email addresses to set on the contact.
- `extra` (object): Any other Keap fields to merge into the request body verbatim.
- `family_name` (string): The contact's last name.
- `given_name` (string): The contact's first name.
- `phone_numbers` (array): Phone numbers to set on the contact.

### `keap_update_contact` (~171 tokens)

Update contact

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 parameters:

- `company_id` (string): Id of the company to associate the contact with.
- `contact_id` (string, required): The contact id to update.
- `email_addresses` (array): Email addresses to set on the contact.
- `extra` (object): Any other Keap fields to merge into the request body verbatim.
- `family_name` (string): The contact's last name.
- `given_name` (string): The contact's first name.
- `phone_numbers` (array): Phone numbers to set on the contact.

### `keap_create_task` (~129 tokens)

Create task

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

Input parameters:

- `contact_id` (string): Id of a contact to link the task to.
- `description` (string): A longer description / notes for the task.
- `due_date` (string): Due date/time, ISO 8601 (e.g. 2026-08-01T17:00:00Z).
- `extra` (object): Any other Keap fields to merge into the request body verbatim.
- `title` (string, required): The task title.

### `keap_apply_tag` (~71 tokens)

Apply tag to contacts

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

Input parameters:

- `contact_ids` (array, required): Ids of the contacts to tag.
- `tag_id` (string, required): The id of the tag to apply.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/io-usefulapi-keap/keap#diagnostics

## Score history

- 2026-08-03: 70
- 2026-08-02: 70
- 2026-08-01: 70
- 2026-07-31: 69
- 2026-07-30: 66
- 2026-07-29: 67
- 2026-07-28: 67
- 2026-07-27: 66
- 2026-07-26: 12

## Links

- Remote endpoint: https://keap.usefulapi.io/mcp
- Repository: https://github.com/m190/usefulapi-mcp
- Changelog RSS feed: https://verifymcp.io/servers/io-usefulapi-keap/keap/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/io-usefulapi-keap/keap/changelog.json
- HTML version of this page: https://verifymcp.io/servers/io-usefulapi-keap/keap
