iContact MCP by usefulapi
Read iContact contacts, lists, campaigns and message stats; add contacts and manage subscriptions.
Should I use this
Quality & Safety
Findings (1)
- LOWin icontact_get_message_statistics
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
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": {
"icontact": {
"url": "https://icontact.usefulapi.io/mcp"
}
}
}Remote endpoints
https://icontact.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (20)
🟢icontact_get_account
The iContact account behind the credentials (company name, address, plan fields) and its client folders, with the folder this server uses. GET /a/ and GET /a/{accountId}/c/.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_contacts(status, email, first_name, last_name, list_id, ...)
List contacts (email, name, address, phone, status, create date). Filter by status, exact email, first/last name or a list the contact belongs to. GET /contacts.
Input Schema
{
"type": "object",
"properties": {
"status": {
"description": "Contact status; total = every contact, including those on no list (e.g. just created and not yet subscribed).",
"type": "string",
"enum": [
"normal",
"bounced",
"donotcontact",
"pending",
"invitable",
"deleted",
"total"
]
},
"email": {
"description": "Only the contact with this email address.",
"type": "string",
"minLength": 1,
"maxLength": 254
},
"first_name": {
"description": "Only contacts with this first name.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"last_name": {
"description": "Only contacts with this last name.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"list_id": {
"description": "Only contacts subscribed to this list id (see icontact_list_lists).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"order_by": {
"description": "Sort by a field of the resource, optionally with a direction, e.g. createDate:desc.",
"type": "string",
"pattern": "^[A-Za-z]{1,40}(:(asc|desc))?$"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_contact(contact_id)
One contact by id. GET /contacts/{contactId}.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact contact id (see icontact_list_contacts)."
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡icontact_create_contact(email, status, prefix, first_name, last_name, ...)
WRITE: add one contact to the account (it is not added to any list; use icontact_set_subscription for that). Not idempotent: an email that already exists is reported by iContact as a warning. POST /contacts.
Input Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address."
},
"status": {
"description": "Contact status (default normal).",
"type": "string",
"enum": [
"normal",
"bounced",
"donotcontact",
"pending",
"invitable",
"deleted"
]
},
"prefix": {
"description": "Name prefix, e.g. Dr.",
"type": "string",
"minLength": 1,
"maxLength": 40
},
"first_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"last_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"suffix": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"street": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"street2": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"state": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"postal_code": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"phone": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"fax": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"business": {
"description": "Company name.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"email"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴icontact_update_contact(contact_id, email, status, prefix, first_name, ...)
WRITE: change fields of one contact; only the fields you pass are sent. Setting status to donotcontact or deleted stops mail to that contact. POST /contacts/{contactId}.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact contact id."
},
"email": {
"description": "New email address.",
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"status": {
"description": "New contact status.",
"type": "string",
"enum": [
"normal",
"bounced",
"donotcontact",
"pending",
"invitable",
"deleted"
]
},
"prefix": {
"description": "Name prefix, e.g. Dr.",
"type": "string",
"minLength": 1,
"maxLength": 40
},
"first_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"last_name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"suffix": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"street": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"street2": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"city": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"state": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"postal_code": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"phone": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"fax": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"business": {
"description": "Company name.",
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"contact_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_lists(order_by, limit, offset)
List the account's mailing lists (name, description, welcome-message settings). GET /lists.
Input Schema
{
"type": "object",
"properties": {
"order_by": {
"description": "Sort by a field of the resource, optionally with a direction, e.g. createDate:desc.",
"type": "string",
"pattern": "^[A-Za-z]{1,40}(:(asc|desc))?$"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_list(list_id)
One mailing list by id. GET /lists/{listId}.
Input Schema
{
"type": "object",
"properties": {
"list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact list id."
}
},
"required": [
"list_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_subscriptions(list_id, contact_id, status, limit, offset)
List list memberships (subscriptionId, contactId, listId, status). Filter by list, contact or status. GET /subscriptions.
Input Schema
{
"type": "object",
"properties": {
"list_id": {
"description": "Only subscriptions to this list.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"contact_id": {
"description": "Only subscriptions of this contact.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"status": {
"description": "Subscription status.",
"type": "string",
"enum": [
"normal",
"pending",
"unsubscribed"
]
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴icontact_set_subscription(contact_id, list_id, status)
WRITE: put a contact on a list (status normal, or pending to start double opt-in) or unsubscribe it (status unsubscribed). Only for contacts who agreed to receive mail. POST /subscriptions.
Input Schema
{
"type": "object",
"properties": {
"contact_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact contact id."
},
"list_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact list id."
},
"status": {
"type": "string",
"enum": [
"normal",
"pending",
"unsubscribed"
],
"description": "normal = subscribed, pending = awaiting confirmation, unsubscribed."
}
},
"required": [
"contact_id",
"list_id",
"status"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_campaigns(order_by, limit, offset)
List campaigns (the sender identity and settings that messages belong to). GET /campaigns.
Input Schema
{
"type": "object",
"properties": {
"order_by": {
"description": "Sort by a field of the resource, optionally with a direction, e.g. createDate:desc.",
"type": "string",
"pattern": "^[A-Za-z]{1,40}(:(asc|desc))?$"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_campaign(campaign_id)
One campaign by id. GET /campaigns/{campaignId}.
Input Schema
{
"type": "object",
"properties": {
"campaign_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact campaign id."
}
},
"required": [
"campaign_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_messages(message_type, campaign_id, order_by, limit, offset)
List messages (subject, type, campaign, create date, HTML and text bodies). Filter by type or campaign. GET /messages.
Input Schema
{
"type": "object",
"properties": {
"message_type": {
"description": "Message type.",
"type": "string",
"enum": [
"normal",
"autoresponder",
"welcome",
"confirmation"
]
},
"campaign_id": {
"description": "Only messages of this campaign.",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"order_by": {
"description": "Sort by a field of the resource, optionally with a direction, e.g. createDate:desc.",
"type": "string",
"pattern": "^[A-Za-z]{1,40}(:(asc|desc))?$"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_message(message_id)
One message by id, with subject and HTML/text bodies. GET /messages/{messageId}.
Input Schema
{
"type": "object",
"properties": {
"message_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact message id."
}
},
"required": [
"message_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_message_statistics(message_id)
Delivery statistics of a message (released, bounces, opens, clicks, unsubscribes, complaints, forwards). GET /messages/{messageId}/statistics.
Input Schema
{
"type": "object",
"properties": {
"message_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact message id."
}
},
"required": [
"message_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_message_activity(message_id, kind, limit, offset)
Who opened, clicked, bounced from or unsubscribed after a message: one page of events for one message. GET /messages/{messageId}/opens | clicks | bounces | unsubscribes.
Input Schema
{
"type": "object",
"properties": {
"message_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact message id."
},
"kind": {
"type": "string",
"enum": [
"opens",
"clicks",
"bounces",
"unsubscribes"
],
"description": "Which events to list."
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"required": [
"message_id",
"kind"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_sends(order_by, limit, offset)
List sends (a message sent to lists/segments: send id, message id, included/excluded lists, scheduled time, status). GET /sends.
Input Schema
{
"type": "object",
"properties": {
"order_by": {
"description": "Sort by a field of the resource, optionally with a direction, e.g. createDate:desc.",
"type": "string",
"pattern": "^[A-Za-z]{1,40}(:(asc|desc))?$"
},
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_send(send_id)
One send by id. GET /sends/{sendId}.
Input Schema
{
"type": "object",
"properties": {
"send_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact send id."
}
},
"required": [
"send_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_segments(limit, offset)
List saved segments (rule-based groups of contacts). GET /segments.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_get_segment(segment_id)
One segment by id. GET /segments/{segmentId}.
Input Schema
{
"type": "object",
"properties": {
"segment_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "iContact segment id."
}
},
"required": [
"segment_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢icontact_list_custom_fields(limit, offset)
List the account's custom contact fields (name, type). GET /customfields.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Results per page, 1-100 (default 25).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"offset": {
"description": "Records to skip (default 0). Pass the previous reply's next_offset.",
"type": "integer",
"minimum": 0,
"maximum": 10000000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence