iContact MCP by usefulapi

Read iContact contacts, lists, campaigns and message stats; add contacts and manage subscriptions.

Should I use this

Quality & Safety

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

Findings (1)

  • LOWTool 'icontact_get_message_statistics' name length outside 3-30 rangein icontact_get_message_statistics

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,086Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (3.19% 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": {
    "icontact": {
      "url": "https://icontact.usefulapi.io/mcp"
    }
  }
}

Remote endpoints

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

What it can do

Tool inventory

Tools (20)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded20 tools