# Vision6 MCP by usefulapi (remote · vision6.usefulapi.io)

Read Vision6 lists, contacts, messages and reports; update contacts; send transactional email/SMS.

- Trust score: 60/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-25

## Components

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

## Channel facts

- Endpoint: `https://vision6.usefulapi.io/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.0.3`

## 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-10-25.

- **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 enforcement could not be verified: the plaintext port redirected somewhere other than https, so enforcement is unproven.
  - 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**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 74/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3892 tokens (~169/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 3/100
  - Stability observed for 1 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 90/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 71% of tool parameters carry a description.
- **Tool Safety**: 92/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 2 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "vision6_list_reports" implies "send" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Vision6 MCP by usefulapi server?

Vision6 MCP by usefulapi is a hosted endpoint at https://vision6.usefulapi.io/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

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

### Cursor

```json
{
  "mcpServers": {
    "io-usefulapi-vision6": {
      "url": "https://vision6.usefulapi.io/mcp"
    }
  }
}
```

### VS Code

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

### Codex

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

### opencode

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

### OpenClaw

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

### Hermes

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

### Netclaw

```json
{
  "McpServers": {
    "io-usefulapi-vision6": {
      "Transport": "http",
      "Url": "https://vision6.usefulapi.io/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add io-usefulapi-vision6 -t streamable-http -u 'https://vision6.usefulapi.io/mcp'
```

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-vision6": {
      "type": "http",
      "url": "https://vision6.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-10-25 (score 60, 0)

- [functional improvement] Stability: unverified → 0.03
- [functional] Server version: 1.0.0 → 1.0.3

### 2026-10-24 (score 60)

First indexed and scored.

## MCP tools (23)

### `vision6_get_account` (~61 tokens)

Get API key details

Details of the API key this server uses: the scopes it grants (e.g. list.view, contact.create, message.edit, report.view) and its creation/expiry time. Use it to see why a request is refused. GET /v1/.

### `vision6_list_lists` (~91 tokens)

List contact lists

List the account's contact lists with id, name, creation/modification time and notification settings. Filter by exact name. GET /lists.

Input parameters:

- `limit` (integer): Results per page, 1-1000 (default 50).
- `name` (string): Exact list name.
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.

### `vision6_get_list` (~31 tokens)

Get a contact list

One contact list by id. GET /lists/{list_id}.

Input parameters:

- `list_id` (integer, required)

### `vision6_list_list_fields` (~121 tokens)

List a list's fields

The fields (columns) of a contact list: label, type (email, mobile, text, dropdown, date ...), allowed values and whether they are mandatory. The lowercase underscore form of a label is the key used for contact values and filters. GET /lists/{list_id}/fields.

Input parameters:

- `limit` (integer): Results per page, 1-1000 (default 50).
- `list_id` (integer, required)
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.

### `vision6_list_folders` (~114 tokens)

List folders

List the account's folders (list folders and message folders) with id, name, type and size. Needed for the folder id when creating a list or message. GET /folders.

Input parameters:

- `limit` (integer): Results per page, 1-1000 (default 50).
- `name` (string)
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.
- `type` (string): Folder type, e.g. list or message.

### `vision6_list_contacts` (~269 tokens)

List contacts

List the contacts of one list: email, mobile, subscribed/blocked status, active flag, double opt-in and the list's custom fields. Filter by email, mobile, active flag, creation/modification time or any custom field (`filters`, e.g. {"city":"Brisbane"} or {"source:ne":"promo"}). GET /lists/{list_id}/contacts.

Input parameters:

- `created_since` (string): Only contacts created at or after this UTC timestamp.
- `email` (string): Exact email address.
- `fields` (string): Optional comma separated list of response fields to return, e.g. id,email.
- `filters` (object): Custom field filters: key = lowercase field key, optionally with :ne or :in (comma separated values), e.g. {"state:in":"qld,nsw"}.
- `is_active` (boolean)
- `limit` (integer): Results per page, 1-1000 (default 50).
- `list_id` (integer, required)
- `mobile` (string): Exact mobile number (international format without +).
- `modified_since` (string): Only contacts changed at or after this UTC timestamp.
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.

### `vision6_get_contact` (~72 tokens)

Get a contact

One contact by id within a list, with all fields. GET /lists/{list_id}/contacts/{contact_id}.

Input parameters:

- `contact_id` (integer, required)
- `fields` (string): Optional comma separated list of response fields to return, e.g. id,email.
- `list_id` (integer, required)

### `vision6_list_messages` (~114 tokens)

List messages

List saved email and SMS messages (templates and campaigns) with id, type, name, subject and sender. Filter by type or exact name/subject. GET /messages.

Input parameters:

- `limit` (integer): Results per page, 1-1000 (default 50).
- `name` (string): Exact message name.
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.
- `subject` (string): Exact subject.
- `type` (string)

### `vision6_get_message` (~66 tokens)

Get a message

One message by id. With include_content=true the HTML and plain-text body is included. GET /messages/{message_id}.

Input parameters:

- `include_content` (boolean): Also return the message body (body_html, body_text). Can be large.
- `message_id` (integer, required)

### `vision6_get_message_sender_defaults` (~43 tokens)

Get default sender details

The account's default from name, from address and reply-to, applied to new email messages when you omit them. GET /message-sender-defaults.

### `vision6_list_reports` (~193 tokens)

List send reports

Send reports for campaigns, newest first: message name, type, sent, bounced, opened, unique clicks, unsubscribes, complaints, total recipients and last sent time. Filter by message, type, test sends or creation time. Click and domain breakdowns are only returned when requested via `fields`. GET /reports.

Input parameters:

- `created_since` (string): Only reports created at or after this UTC timestamp.
- `fields` (string): Optional comma separated list of response fields to return, e.g. id,email.
- `is_test` (boolean): false = only real campaign sends, true = only test sends.
- `limit` (integer): Results per page, 1-1000 (default 50).
- `message_id` (integer)
- `message_type` (string)
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.

### `vision6_get_report` (~122 tokens)

Get a send report

One send report by id with all delivery and engagement counts, per-link click counts and recipient domain distribution. Optionally includes A/B test results and social click/share statistics. GET /reports/{report_id}.

Input parameters:

- `fields` (string): Optional comma separated list of response fields to return, e.g. id,email.
- `include_ab_test` (boolean): Include A/B test variant statistics (only for A/B test reports).
- `include_social` (boolean): Include Facebook/Twitter/LinkedIn click and share statistics.
- `report_id` (integer, required)

### `vision6_list_sent_contacts` (~151 tokens)

List contacts a message was sent to

The contacts one message was sent to, with send time, first/last open time and open type (html, text, sms or not_opened). Use it to see who opened a campaign. GET /messages/{message_id}/sent-contacts.

Input parameters:

- `contact_id` (integer)
- `limit` (integer): Results per page, 1-1000 (default 50).
- `list_id` (integer)
- `message_id` (integer, required)
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.
- `open_type` (string)
- `report_id` (integer): Only sends belonging to this report.

### `vision6_list_transactional_groups` (~126 tokens)

List transactional groups

Transactional send groups (one per group name used with vision6_send_transactional) with sent, failed, bounced, delivered, opened, clicked and unsubscribed counts. GET /transactional-groups.

Input parameters:

- `limit` (integer): Results per page, 1-1000 (default 50).
- `name` (string): Exact group name.
- `offset` (integer): Skip this many results (default 0). Pass the previous reply's next_offset.
- `type` (string, required): Group type (the reference marks it required; call once per type).

### `vision6_get_transactional_group` (~40 tokens)

Get a transactional group

One transactional group by id with its delivery statistics. GET /transactional-groups/{group_id}.

Input parameters:

- `group_id` (integer, required)

### `vision6_create_contact` (~284 tokens)

Create a contact

WRITE: add one contact to a list (needs an email and/or mobile that matches a field of the list). May trigger the list's 'contact created' automations and notification emails. Returns the new contact. POST /lists/{list_id}/contacts.

Input parameters:

- `double_opt_in` (boolean): true marks the contact as already confirmed (sets the double opt-in time to now). It cannot be reset to false afterwards.
- `email` (string): Email address (the list must have an Email field).
- `email_subscribed` (boolean): Whether the email address is subscribed to receive messages.
- `fields` (object): Custom list field values, keyed by the lowercase key of the field name (underscores for spaces/dashes, e.g. first_name). Use vision6_list_list_fields to see the list's fields.
- `is_active` (boolean): The contact's active status.
- `list_id` (integer, required)
- `mobile` (string): Mobile number in international format without + or spaces (Australia: 61400000009). The list must have a Mobile field.
- `mobile_subscribed` (boolean): Whether the mobile number is subscribed to receive messages.
- `remove_unsubscribers` (string): Skip addresses that are on the unsubscribers list: any (account-wide), list (this list), none (default: create everyone).

### `vision6_add_contacts` (~127 tokens)

Add several contacts

WRITE: add up to 200 contacts to a list in one request (faster than one by one). Each needs an email and/or mobile. Vision6 returns no contact data (HTTP 204), so use vision6_list_contacts to read them back. May trigger automations. POST /lists/{list_id}/contacts.

Input parameters:

- `contacts` (array, required)
- `list_id` (integer, required)
- `remove_unsubscribers` (string): Skip addresses that are on the unsubscribers list: any (account-wide), list (this list), none (default: create everyone).

### `vision6_update_contact` (~272 tokens)

Update a contact

WRITE: change one contact's email, mobile, custom field values, subscription status (email_subscribed/mobile_subscribed=false unsubscribes), active flag or double opt-in. Only the fields you pass change. May trigger 'contact updated' automations. Returns the updated contact. PATCH /lists/{list_id}/contacts/{contact_id}.

Input parameters:

- `contact_id` (integer, required)
- `double_opt_in` (boolean): true marks the contact as already confirmed (sets the double opt-in time to now). It cannot be reset to false afterwards.
- `email` (string): Email address (the list must have an Email field).
- `email_subscribed` (boolean): Whether the email address is subscribed to receive messages.
- `fields` (object): Custom list field values, keyed by the lowercase key of the field name (underscores for spaces/dashes, e.g. first_name). Use vision6_list_list_fields to see the list's fields.
- `is_active` (boolean): The contact's active status.
- `list_id` (integer, required)
- `mobile` (string): Mobile number in international format without + or spaces (Australia: 61400000009). The list must have a Mobile field.
- `mobile_subscribed` (boolean): Whether the mobile number is subscribed to receive messages.

### `vision6_delete_contact` (~117 tokens)

Delete a contact

WRITE, IRREVERSIBLE: permanently delete one contact from a list (for example for a privacy erasure request). To stop emailing someone but keep the record, use vision6_update_contact with email_subscribed=false instead. Pass confirm=true only after the user agreed to the deletion. DELETE /lists/{list_id}/contacts?id={contact_id}.

Input parameters:

- `confirm` (boolean, required): Must be true: you confirm the user asked to permanently delete this contact.
- `contact_id` (integer, required)
- `list_id` (integer, required)

### `vision6_create_list` (~154 tokens)

Create a contact list

WRITE: create a new, empty contact list inside a list folder (see vision6_list_folders with type list). Returns the new list. POST /lists.

Input parameters:

- `allow_send_to_duplicates` (boolean): Allow sends to duplicate email or mobile addresses.
- `folder_id` (integer, required): Id of the list folder to create the list in.
- `is_gdpr_compliant` (boolean)
- `name` (string, required)
- `on_register_address` (array): Email addresses to notify when a contact is added.
- `on_unsubscribe_address` (array): Email addresses to notify when a contact unsubscribes.
- `on_update_address` (array): Email addresses to notify when a contact is updated.

### `vision6_create_message` (~370 tokens)

Create a message (draft)

WRITE: save a new email or SMS message in Vision6. This only stores the message; it is NOT sent (use the Vision6 app to send a campaign, or vision6_send_transactional for a one-off send). Email needs email_type, subject and matching body fields (plain: content_text; html: content_html; plain-html: both; raw_html: content_html or content_html_raw). SMS needs content_sms. The drag-and-drop builder is not supported. POST /messages.

Input parameters:

- `content_html` (string): HTML body (email types html and plain-html; raw_html accepts it or content_html_raw).
- `content_html_raw` (string): Raw HTML document (email type raw_html).
- `content_sms` (string): SMS text (required for an sms message; keep it near 500 characters).
- `content_text` (string): Plain-text body (email types plain and plain-html).
- `email_type` (string): Required for email.
- `folder_id` (integer): Message folder id (see vision6_list_folders with type message). Omit to use the account's first message folder.
- `from_address` (string): Sender address. For email it must be a verified address/domain in the account. Omit to use the account's saved default (see vision6_get_message_sender_defaults).
- `from_name` (string)
- `is_responsive` (boolean): Responsive HTML flag (email).
- `is_template` (boolean): Mark the message as reusable starter content.
- `name` (string, required): Display name of the message in Vision6.
- `reply_to` (string)
- `subject` (string): Email subject line (required for email). Supports wildcards like %%first_name**there%%.
- `type` (string, required)

### `vision6_update_message` (~297 tokens)

Update a message

WRITE: change a saved message's name, subject, sender, folder or body. Only the fields you pass change. It does not send anything. PATCH /messages/{message_id}.

Input parameters:

- `content_html` (string): HTML body (email types html and plain-html; raw_html accepts it or content_html_raw).
- `content_html_raw` (string): Raw HTML document (email type raw_html).
- `content_sms` (string): SMS text (required for an sms message; keep it near 500 characters).
- `content_text` (string): Plain-text body (email types plain and plain-html).
- `folder_id` (integer): Message folder id (see vision6_list_folders with type message). Omit to use the account's first message folder.
- `from_address` (string): Sender address. For email it must be a verified address/domain in the account. Omit to use the account's saved default (see vision6_get_message_sender_defaults).
- `from_name` (string)
- `is_responsive` (boolean): Responsive HTML flag (email).
- `is_template` (boolean): Mark the message as reusable starter content.
- `message_id` (integer, required)
- `name` (string): Display name of the message in Vision6.
- `reply_to` (string)
- `subject` (string): Email subject line (required for email). Supports wildcards like %%first_name**there%%.

### `vision6_send_transactional` (~398 tokens)

Send a transactional email or SMS

WRITE: SENDS REAL EMAIL OR SMS to the recipients immediately (asynchronously) and USES ACCOUNT SENDING CREDITS. It cannot be recalled. Up to 100 recipients per call, each identified by exactly one of contact_id, email or mobile, plus optional personalisation values (wildcards %%key%% in the body). Either send a saved message (message_id) or custom content (subject/body_html/body_text, and for SMS body_text + from_address). Unsubscribed addresses are skipped. Email always needs list_id. Results appear in the transactional group (vision6_get_transactional_group). The account owner's email must be confirmed in Vision6 first. Pass confirm_send=true only after the user approved these recipients and this content. POST /transactional-sends.

Input parameters:

- `body_html` (string): Custom HTML body (email, without message_id).
- `body_text` (string): Custom plain-text body (email or SMS, without message_id).
- `confirm_send` (boolean, required): Must be true: you confirm the user approved sending this email/SMS now (it cannot be recalled and uses credits).
- `from_address` (string): Verified sender email address, or the sender mobile number for SMS.
- `from_name` (string)
- `group_id` (integer)
- `group_name` (string): Name of the transactional group that collects the results (created if new). One of group_name or group_id is required.
- `list_id` (integer): List the recipients belong to (required for email; optional for SMS).
- `message_id` (integer): A saved message to send. Do not combine with custom content.
- `recipients` (array, required)
- `reply_to` (string)
- `subject` (string): Custom email subject (without message_id).
- `type` (string, required)
- `unsubscribe_type` (string): SMS with custom content only: how recipients can opt out.

## Diagnostics

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

## Score history

- 2026-10-25: 60
- 2026-10-24: 60

## Common questions

### What is the Vision6 MCP by usefulapi server?

Vision6 MCP by usefulapi is listed in the public MCP registry as io.usefulapi/vision6. Read Vision6 lists, contacts, messages and reports; update contacts; send transactional email/SMS. This page covers its hosted endpoint (https://vision6.usefulapi.io/mcp).

### Is the Vision6 MCP by usefulapi server safe to use?

Vision6 MCP by usefulapi scores 60 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Vision6 MCP by usefulapi server expose?

Vision6 MCP by usefulapi exposes 23 tools: vision6_get_account, vision6_list_lists, vision6_get_list, vision6_list_list_fields, vision6_list_folders, and 18 more. Their descriptions and schemas cost roughly 3,633 tokens of context every time the server is loaded.

### Does the Vision6 MCP by usefulapi server require authentication?

Yes. Vision6 MCP by usefulapi asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.

### Is the Vision6 MCP by usefulapi server still maintained?

Vision6 MCP by usefulapi is still listed as active in the MCP registry. We last reached this channel on 25 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

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