# Emailchef MCP by usefulapi (remote · emailchef.usefulapi.io)

Read lists, contacts, campaign stats; add contacts; draft, schedule and send campaigns and SMS.

- Trust score: 18/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-06

## Components

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

## Channel facts

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

## 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-11-06.

- **Endpoint Security**: 46/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not yet verified: we couldn't confirm whether this endpoint requires it.
  - 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.
- **Transport & Reachability**: 0/100
  - Transport check failed: declared streamable-http, but the endpoint redirected instead of responding directly.
- **Schema Quality & AI Usability**: 0/100
  - Schema not yet verified: we couldn't read the endpoint's schema, or could read only part of its tool list.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Tool Safety**: 0/100
  - Tool safety not yet verified: we couldn't read the endpoint's tools, or could read only part of the list.
- **Capabilities**: 0/100
  - Capabilities not yet verified: we couldn't read the endpoint's capabilities.

**Unverified: 5 categories.** Categories scored 0 because we could not verify them: authentication we do not have, an unreachable endpoint, or not enough scan history. We only credit what we can confirm.

## Install

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

Emailchef MCP by usefulapi is a hosted endpoint at https://emailchef.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-emailchef 'https://emailchef.usefulapi.io/mcp'
```

### Cursor

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

### VS Code

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

### Codex

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

### opencode

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

### OpenClaw

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

### Hermes

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

### Netclaw

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

### Vellum

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

### Other

```json
{
  "mcpServers": {
    "io-usefulapi-emailchef": {
      "type": "http",
      "url": "https://emailchef.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-11-06 (score 18, 0)

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

### 2026-11-02 (score 18, −48)

- [security regression] Endpoint reachability: reachable → not serving MCP
- [security regression] Tool safety: pass → unverified
- [security regression] Authorization: pass → unverified
- [security regression] Stability: 0.03 → unverified
- [functional regression] Schema quality: 100 → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified

### 2026-11-01 (score 66, +1)

- [functional improvement] Stability: unverified → 0.03

### 2026-10-31 (score 65)

First indexed and scored.

## MCP tools (43)

### `emailchef_get_account` (~41 tokens)

Get account

The Emailchef account this API key belongs to: id, email, language, status, subscriber total, bounces and complaints. GET /accounts/current.

### `emailchef_get_subscription` (~49 tokens)

Get subscription

The account's current Emailchef plan: plan name, plan expiry, contact and send limits, credits left, active/expired flags. Check this before a big send. GET /subscriptions/current.

### `emailchef_list_senders` (~41 tokens)

List senders

List the sender identities (name, email, verification status, postal address). Campaigns and emails need a verified sender id. GET /senders.

### `emailchef_list_timezones` (~41 tokens)

List timezones

List Emailchef's timezones (id, name, fixed UTC offset). The id is required to schedule a campaign. GET /meta/timezones.

### `emailchef_list_lists` (~112 tokens)

List contact lists

List the contact lists with id, name, and counts of active, unsubscribed and bounced contacts and segments. Newest first by default. GET /lists.

Input parameters:

- `limit` (integer): Results per page, 1-100 (default 25).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.
- `order` (string): Sort direction (default desc).
- `order_by` (string): Sort by creation date (default) or name.

### `emailchef_get_list` (~46 tokens)

Get list

One contact list: name, description, default sender, creation date. GET /lists/{list_id}.

Input parameters:

- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_get_list_stats` (~91 tokens)

Get list growth stats

Daily growth of a list over a date range: total contacts per day and the daily delta. Omit the dates for the whole history. GET /lists/{list_id}/stats.

Input parameters:

- `end_date` (string): Last day, yyyy-mm-dd.
- `list_id` (required): Numeric id (as returned by the list tools).
- `start_date` (string): First day, yyyy-mm-dd.

### `emailchef_get_list_contact_counts` (~55 tokens)

Get list contact counts

How many contacts a list has by state: active, unsubscribed, bounced, reported. GET /lists/{list_id}/stats/count.

Input parameters:

- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_create_list` (~48 tokens)

Create list

WRITE: create a new, empty contact list. Returns the new list id. POST /lists.

Input parameters:

- `description` (string): List description.
- `name` (string, required): List name.

### `emailchef_update_list` (~70 tokens)

Update list

WRITE: rename a contact list and/or change its description. Only the fields you pass change. PUT /lists/{list_id}.

Input parameters:

- `description` (string): New description.
- `list_id` (required): Numeric id (as returned by the list tools).
- `name` (string): New list name.

### `emailchef_list_contacts` (~139 tokens)

List contacts

List the contacts of one list (id, email, name, added by, subscription date), optionally by state. GET /contacts?list_id=...

Input parameters:

- `limit` (integer): Results per page, 1-100 (default 25).
- `list_id` (required): Numeric id (as returned by the list tools).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.
- `order` (string): Sort direction (default desc).
- `order_by` (string): Sort field (default subscription date).
- `status` (string): Only contacts in this state (default: all).

### `emailchef_get_contact` (~78 tokens)

Get contact

One contact in one list: status, email, name, IP, how it was added, when, and its custom field values. GET /contacts/{contact_id}?list_id=...

Input parameters:

- `contact_id` (required): Numeric id (as returned by the list tools).
- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_create_contact` (~153 tokens)

Add contact to a list

WRITE: add a contact (email, name, custom fields) to a list. Only add people who agreed to receive email: an ACTIVE contact will receive the account's campaigns and automations. Returns the contact id and status. POST /contacts.

Input parameters:

- `custom_fields` (object): Custom field values keyed by the field's place_holder (see emailchef_list_custom_fields): a string, or true/false for boolean fields.
- `email` (string, required)
- `first_name` (string)
- `last_name` (string)
- `list_id` (required): Numeric id (as returned by the list tools).
- `status` (string): Initial state (default: the account's default, normally ACTIVE).

### `emailchef_update_contact` (~147 tokens)

Update contact

WRITE: change a contact's name, state or custom fields in one list. Only the fields you pass change. Setting the status to ACTIVE re-subscribes someone: only do so with their consent. PUT /contacts/{contact_id}.

Input parameters:

- `contact_id` (required): Numeric id (as returned by the list tools).
- `custom_fields` (object): Custom field values keyed by the field's place_holder (see emailchef_list_custom_fields): a string, or true/false for boolean fields.
- `first_name` (string)
- `last_name` (string)
- `list_id` (required): Numeric id (as returned by the list tools).
- `status` (string)

### `emailchef_unsubscribe_contact` (~71 tokens)

Unsubscribe contact

WRITE: unsubscribe one contact from one list (it stops receiving that list's email). POST /lists/{list_id}/unsubscribe?contact_id=...

Input parameters:

- `contact_id` (required): Numeric id (as returned by the list tools).
- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_import_contacts` (~141 tokens)

Import contacts

WRITE: bulk-add or update up to 500 contacts in a list in one call (an existing email is updated). Each contact is an object keyed by field placeholder, e.g. {"email":"a@b.com","firstname":"Ada"}: get the placeholders from emailchef_list_predefined_fields and emailchef_list_custom_fields. Import only people who agreed to receive email. Runs in the background: poll emailchef_get_import_task with the returned id. POST /lists/{list_id}/import.

Input parameters:

- `contacts` (array, required): Contacts to import, each keyed by placeholder.
- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_list_import_tasks` (~42 tokens)

List import tasks

List contact import tasks: list, status (DISPATCHED, COMPLETE, FAILED), progress, imported/updated/failed counts. GET /importtasks.

### `emailchef_get_import_task` (~53 tokens)

Get import task

One import task: status, progress, imported/updated/failed counts and any error message. GET /importtasks/{task_id}.

Input parameters:

- `task_id` (required): Numeric id (as returned by the list tools).

### `emailchef_list_predefined_fields` (~34 tokens)

List predefined fields

The built-in contact fields (email, first name, ...) with their placeholders. GET /predefinedfields.

### `emailchef_list_custom_fields` (~60 tokens)

List custom fields

The custom contact fields of a list: name, data type, placeholder (the key used when writing contacts), options. GET /lists/{list_id}/customfields.

Input parameters:

- `list_id` (required): Numeric id (as returned by the list tools).

### `emailchef_list_segments` (~89 tokens)

List segments

List the saved segments of a list with how many contacts match each. GET /lists/{list_id}/segments.

Input parameters:

- `limit` (integer): Results per page, 1-100 (default 25).
- `list_id` (required): Numeric id (as returned by the list tools).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.

### `emailchef_get_segment` (~61 tokens)

Get segment

One segment with its logic and condition groups. GET /lists/{list_id}/segments/{segment_id}.

Input parameters:

- `list_id` (required): Numeric id (as returned by the list tools).
- `segment_id` (required): Numeric id (as returned by the list tools).

### `emailchef_list_blocked` (~99 tokens)

List blocked emails

List the account's blocklist (emails that never receive email): address and reason (MANUAL, UNSUBSCRIBED, COMPLAINT). GET /blockings.

Input parameters:

- `limit` (integer): Results per page, 1-100 (default 25).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.
- `search` (string): Only addresses containing this text.

### `emailchef_block_emails` (~62 tokens)

Block emails

WRITE: add up to 100 addresses to the account blocklist so they never receive email from any list. Reversible with emailchef_unblock_email. POST /blockings?type=MANUAL.

Input parameters:

- `emails` (array, required): Addresses to block.

### `emailchef_unblock_email` (~54 tokens)

Unblock email

WRITE: remove one address from the account blocklist so it can receive email again. Only do this for an address whose owner asked for it. DELETE /blockings/{email}.

Input parameters:

- `email` (string, required)

### `emailchef_get_campaign_counts` (~36 tokens)

Get campaign counts

How many campaigns the account has by state: drafts, sent, scheduled, archived, failed. GET /campaigns/count.

### `emailchef_list_campaigns` (~166 tokens)

List campaigns

List email campaigns with state, recipients, delivered, unique opens and unique clicks. Without a status filter Emailchef returns only SENT and ARCHIVED campaigns; pass a status to see DRAFT, SCHEDULED, SENDING or FAILED ones. GET /campaigns.

Input parameters:

- `limit` (integer): Results per page, 1-100 (default 25).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.
- `order` (string): Sort direction (default desc).
- `order_by` (string): Sort by date (default) or name.
- `search` (string): Only campaigns whose name contains this text.
- `status` (string): Only campaigns in this state (default: SENT and ARCHIVED).

### `emailchef_get_campaign` (~65 tokens)

Get campaign

One campaign: name, subject, HTML and text body, sender, reply-to, state, schedule, recipient lists/segments and cached sent/open/click counts. GET /campaigns/{id}.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).

### `emailchef_get_campaign_links` (~48 tokens)

Get campaign links

The links contained in a campaign (id, name, URL). GET /newsletters/{id}/links.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).

### `emailchef_list_campaign_engagement` (~149 tokens)

List campaign engagement

Per-contact engagement for a sent campaign: who opened, clicked, was delivered, did not open, unsubscribed, complained, or was sent to, with counts and first/last event time. Pick exactly one event. GET /newsletters/{id}/contacts.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).
- `event` (string, required): Which engagement slice to list.
- `limit` (integer): Results per page, 1-100 (default 25).
- `offset` (integer): Rows to skip (default 0). Pass the previous reply's next_offset.
- `search` (string): Only contacts whose email or name contains this text.

### `emailchef_create_campaign` (~227 tokens)

Create campaign (draft)

WRITE: create a new campaign as a DRAFT (nothing is sent). Needs a verified sender (emailchef_list_senders) and at least one list. To be sendable the HTML body must contain the CAN-SPAM placeholders [[account:business]], [[account:address_1]], [[account:city]], [[account:postal_code]], [[account:country]] and an unsubscribe link <a href="[[unsubscribe_link]]">, otherwise the send ends FAILED. Schedule or send it afterwards. POST /newsletters.

Input parameters:

- `html_body` (string): HTML body (include the CAN-SPAM placeholders and unsubscribe link).
- `list_ids` (array, required): Lists to send to.
- `name` (string, required): Campaign name (must be unique in the account).
- `reply_to_id`: Sender id used for replies.
- `segment_id`: Optional segment of the FIRST list to narrow the audience.
- `sender_id` (required): A verified sender id from emailchef_list_senders.
- `subject` (string, required): Email subject.
- `text_body` (string): Plain-text body.

### `emailchef_clone_campaign` (~65 tokens)

Clone campaign

WRITE: copy an existing campaign into a new DRAFT (nothing is sent). A SENT campaign cannot be cloned (Emailchef answers HTTP 500). Returns the new campaign id. POST /newsletters?clone=1.

Input parameters:

- `campaign_id` (required): The campaign to copy.

### `emailchef_update_campaign` (~193 tokens)

Update draft campaign

WRITE: change a DRAFT campaign's name, subject, body, sender, reply-to or recipient lists. Only the fields you pass change: the tool reads the campaign first and sends the complete record back, because Emailchef blanks any omitted field. Refuses a campaign that is not a DRAFT. PUT /newsletters/{id}.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).
- `html_body` (string)
- `list_ids` (array): Replace the recipient lists (any segment is dropped unless segment_id is also passed).
- `name` (string)
- `reply_to_id`: Numeric id (as returned by the list tools).
- `segment_id`: Segment of the first list (only with list_ids).
- `sender_id`: Numeric id (as returned by the list tools).
- `subject` (string)
- `text_body` (string)

### `emailchef_send_test_campaign` (~76 tokens)

Send campaign test email

WRITE: email ONE test copy of a campaign to a single address. The campaign state does not change. The sender must be verified. PUT /campaigns/{id}/sendtest.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).
- `email` (string, required): Where to send the test copy.

### `emailchef_schedule_campaign` (~147 tokens)

Schedule campaign

WRITE, SENDS EMAIL TO CUSTOMERS LATER: schedule a DRAFT campaign to go out to all its recipients at a date and time. Emailchef timezones are fixed offsets without daylight saving: pick the id (emailchef_list_timezones) whose offset matches the send date. Undo before it starts with emailchef_unschedule_campaign. PUT /campaigns/{id}/schedule.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).
- `scheduled_time` (string, required): Local send time in the chosen timezone, YYYY-MM-DD HH:MM:SS (no UTC offset or Z).
- `timezone_id` (required): Timezone id from emailchef_list_timezones.

### `emailchef_unschedule_campaign` (~55 tokens)

Unschedule campaign

WRITE: cancel the schedule of a SCHEDULED campaign and bring it back to DRAFT. PUT /campaigns/{id}/unschedule.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).

### `emailchef_send_campaign` (~144 tokens)

Send campaign now

WRITE, SENDS EMAIL TO CUSTOMERS NOW AND CANNOT BE UNDONE: start sending a DRAFT (or FAILED) campaign immediately to ALL its recipients and use up plan sends. Check the recipients (emailchef_get_campaign), the sender and the subscription first, ideally after emailchef_send_test_campaign, and send only with the user's explicit go-ahead (confirm must be true). Queued asynchronously: poll emailchef_get_campaign for the final state. PUT /campaigns/{id}/send.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).
- `confirm` (boolean, required): Must be true: the user explicitly approved sending this campaign now.

### `emailchef_archive_campaign` (~60 tokens)

Archive campaign

WRITE: archive a campaign (hidden from the default list; statistics are kept). Reversible with emailchef_unarchive_campaign. PUT /campaigns/{id}/archivecampaign.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).

### `emailchef_unarchive_campaign` (~44 tokens)

Restore archived campaign

WRITE: restore an archived campaign. PUT /campaigns/{id}/unarchivecampaign.

Input parameters:

- `campaign_id` (required): Numeric id (as returned by the list tools).

### `emailchef_send_email` (~161 tokens)

Send one email

WRITE, SENDS AN EMAIL NOW AND CANNOT BE UNDONE: send a single email to one recipient from a verified sender and use up plan sends. Pass text_body and/or html_body. The recipient does not need to be a contact. Send only with the user's explicit go-ahead (confirm must be true). POST /sendmail.

Input parameters:

- `confirm` (boolean, required): Must be true: the user explicitly approved sending this email now.
- `html_body` (string)
- `reply_to` (string)
- `sender_id` (required): A verified sender id from emailchef_list_senders.
- `subject` (string, required)
- `text_body` (string)
- `to_email` (string, required)
- `to_name` (string)

### `emailchef_get_sms_balance` (~26 tokens)

Get SMS balance

The account's SMS credit balance and currency. GET /sms/balance.

### `emailchef_get_sms_status` (~62 tokens)

Get SMS status

Delivery status of one sent SMS by message id: recipient, text, sent/done time, parts, price, state and error. GET /sms/status/{messageId}.

Input parameters:

- `message_id` (string, required): Message id returned by emailchef_send_sms.

### `emailchef_send_sms` (~148 tokens)

Send SMS

WRITE, SENDS TEXT MESSAGES NOW, COSTS SMS CREDIT AND CANNOT BE UNDONE: send an SMS to 1-50 phone numbers in international format (e.g. +393331234567). Check emailchef_get_sms_balance first and send only with the user's explicit go-ahead (confirm must be true). Returns a message id per recipient and the remaining balance. POST /sms/send.

Input parameters:

- `confirm` (boolean, required): Must be true: the user explicitly approved sending these SMS now.
- `from` (string): Sender name or number (default: the account's).
- `text` (string, required): The message text.
- `to` (array, required): Recipient phone numbers.

## Diagnostics

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

## Score history

- 2026-11-06: 18
- 2026-11-05: 18
- 2026-11-04: 18
- 2026-11-03: 18
- 2026-11-02: 18
- 2026-11-01: 66
- 2026-10-31: 65

## Common questions

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

Emailchef MCP by usefulapi is listed in the public MCP registry as io.usefulapi/emailchef. Read lists, contacts, campaign stats; add contacts; draft, schedule and send campaigns and SMS. This page covers its hosted endpoint (https://emailchef.usefulapi.io/mcp).

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

Emailchef MCP by usefulapi scores 18 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 Emailchef MCP by usefulapi server expose?

Emailchef MCP by usefulapi exposes 43 tools: emailchef_get_account, emailchef_get_subscription, emailchef_list_senders, emailchef_list_timezones, emailchef_list_lists, and 38 more. Their descriptions and schemas cost roughly 3,749 tokens of context every time the server is loaded.

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

Its publisher declares no required credentials for Emailchef MCP by usefulapi. We have not been able to confirm that against the live endpoint, and a server can require authorisation without declaring it here.

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

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

### What did VerifyMCP test on the Emailchef MCP by usefulapi server?

VerifyMCP ran 4 checks on Emailchef MCP by usefulapi, covering TLS certificate, HSTS header, DNSSEC and Transport. 7 items could not be completed, a gap on our side rather than a finding about Emailchef MCP by usefulapi: Authorization, HTTPS, Schema quality, Stability and 3 more. 5 categories score 0 for that reason, because we only credit what we can confirm. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

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