
Get the authenticated Kit account and the user the API key belongs to, including the plan and the confirmed sending addresses. Use this before createbroadcast or createsequence to pick a sending address Kit will accept.
Get the account's public creator profile: display name, byline, bio and public URL. Kit answers 404 when the account has never set one up.
List the brand colors configured on the account. Call this before updateaccountcolors, which replaces the whole list rather than appending to it.
Replace the account's brand colors with the list supplied. Kit overwrites the whole list, so call getaccountcolors first and include every color you want to keep.
Get account-wide email performance: sends, opens, clicks and the bounce and unsubscribe rates over Kit's reporting window. Use getbroadcaststats for one broadcast instead.
Get subscriber growth over a date window: new subscribers, cancellations and the net change. Omit both dates for Kit's default window of the last 90 days.
List broadcasts with optional status and sent-date filters. Set slim to true to drop each broadcast's HTML body from the payload. Use this to find a broadcast_id.
Get one broadcast by ID, including its body, audience and schedule. Use list_broadcasts to find broadcast IDs.
Get delivery and engagement statistics for one broadcast: recipients, opens, clicks and unsubscribes. Use listbroadcaststats for every broadcast at once.
List every broadcast with its delivery statistics, filtered by status and sent date. Use getbroadcaststats for one broadcast instead of paging this report.
List per-link click totals for one sent broadcast. Kit answers 404 for a broadcast that has not been sent, so check status with get_broadcast first.
Create a broadcast. It stays a draft unless sendat is set. Kit rejects an unconfirmed emailaddress with a 422 but still creates the draft, so do not retry on that error or you will accumulate duplicates; use getaccount to pick a confirmed sending address, and listemail_templates for a template ID.
Update a broadcast's subject, body, schedule or audience. Only the fields you set are sent, so the rest keep their current values. Use list_broadcasts to find IDs.
Permanently delete a broadcast. The inverse of createbroadcast. Use listbroadcasts to find broadcast IDs.
List the account's saved subscriber segments. Use this to find a segment before referencing it in a broadcast audience. The Kit API exposes no segment create, update or delete endpoint, so segments are managed in the Kit app.
List the email templates available to broadcasts and sequences. Call this to find an emailtemplateid for createbroadcast, createsequence or createsequenceemail.
List the account's published newsletter posts. Leave includecontent null for the much smaller metadata-only payload and use getpost to read one body. Match a post to its broadcast through publication_id.
Get one published post by ID, including its body. Use list_posts to find post IDs.
List reusable content snippets, filtered by kind and archived state. Leave includecontent null for the smaller metadata-only payload. Use this to find a snippetid.
Get one snippet by ID, including its content. Use list_snippets to find snippet IDs.
Create an inline content snippet that broadcasts and sequence emails can reuse. Kit derives the snippet key from the name.
Update an inline snippet's name or content, or archive and restore it with archived. Only the fields you set are sent. The Kit API defines no snippet-delete endpoint, so archiving is how a snippet is retired. Use list_snippets to find IDs.
List the account's custom fields. Call this before createsubscriber or updatesubscriber to learn the field keys accepted in their fields map.
Create a custom field from a label. Kit derives the field key from the label and returns it; that key is what createsubscriber and updatesubscriber take in their fields map. Labels must be unique in the account.
Rename a custom field. Use listcustomfields to find IDs. Kit keeps the original key, so existing personalization tags and subscriber values keep working.
Permanently delete a custom field and the values stored against it on every subscriber. Use listcustomfields to find IDs.
List the account's forms and landing pages, filtered by lifecycle state and type. Use this to find a form_id before adding a subscriber or creating a form-scoped webhook. The Kit API has no single-form endpoint, so read a form from this list.
List the subscribers who joined through one form, with optional state and date filters. Use list_forms to find form IDs. Kit's list indexes lag writes by up to a few minutes.
Add an existing subscriber to a form by subscriber ID, which triggers the form's automations. Use listforms for form IDs and listsubscribers for subscriber IDs. Use addsubscribertoformby_email when you only have an email address.
Add a subscriber to a form by email address. Kit answers 404 when no subscriber has that address, so call createsubscriber first. Use addsubscribertoform when you already hold the subscriber ID.
List the emails in one sequence, in send order. Leave includecontent null for the much smaller metadata-only payload and use getsequenceemail to read one body. Use listsequences to find sequence IDs.
Get one email from a sequence, including its body and delay. Use listsequenceemails to find sequence-email IDs.
Add an email to a sequence. Kit requires a subject and a delay before sending. Use listsequences for sequence IDs and listemail_templates for a template ID.
Update one email in a sequence. Only the fields you set are sent, so the rest keep their current values. Use listsequenceemails to find sequence-email IDs.
Permanently delete one email from a sequence. The inverse of createsequenceemail. Use listsequenceemails to find sequence-email IDs.
List the account's sequences, optionally with their send statistics. Use this to find a sequence_id before adding subscribers, reading its emails or creating a sequence-scoped webhook.
Get one sequence by ID, optionally with its send statistics. Use list_sequences to find sequence IDs.
Create a sequence. Use getaccount for a confirmed sending address and listemail_templates for a template ID. Kit answers 403 on plans that do not include sequence creation.
Update a sequence's name, sending address or schedule. Only the fields you set are sent, so the rest keep their current values. Use list_sequences to find sequence IDs.
Permanently delete a sequence and the emails inside it. The inverse of createsequence. Use listsequences to find sequence IDs.
List the subscribers enrolled in one sequence, with optional state and date filters. Use list_sequences to find sequence IDs. Kit's list indexes lag writes by up to a few minutes.
Enroll an existing subscriber in a sequence by subscriber ID. Use listsequences for sequence IDs and listsubscribers for subscriber IDs. Use addsubscribertosequenceby_email when you only have an email address.
Enroll a subscriber in a sequence by email address. Use listsequences to find sequence IDs. Use addsubscribertosequence when you already hold the subscriber ID.
List subscribers with optional state, date and email filters, and server-side sorting. Use searchsubscribers for engagement or tag conditions. Kit's list index lags writes by up to a few minutes, so use getsubscriber to read back a just-created subscriber.
Search subscribers with Kit's condition grammar: opens, clicks, tags, attribution and custom-field conditions. Use listsubscribers for plain state or date filters. Use listtags and list_forms to find the IDs the conditions reference.
Get one subscriber by ID, including their custom-field values and location. This read is immediately consistent, unlike list_subscribers, so use it to confirm a write.
Get one subscriber's email engagement: sends, opens, clicks, bounces and the time since their last open or click. Use list_subscribers to find subscriber IDs.
List the tags applied to one subscriber, each with the time it was applied. Use listtagsubscribers for the other direction.
Create a subscriber, or update the existing one with the same email address — Kit upserts on email. Use listcustomfields for the keys accepted in fields. Kit ignores state for an address it already holds.
Update a subscriber's email address, first name or custom-field values. Kit requires an email address on every update, so pass the current one when changing other fields. Use listcustomfields for the accepted field keys.
Unsubscribe a subscriber, moving them to the cancelled state. This revokes consent and Kit treats it as permanent, so there is no re-subscribe tool. Use list_subscribers to find subscriber IDs.
Set the location Kit holds for a subscriber. Kit requires countrycode, latitude and longitude together and rejects a partial location. Use deletesubscriber_location to clear it.
Clear the location Kit holds for a subscriber. The inverse of setsubscriberlocation. Use list_subscribers to find subscriber IDs.
List the account's tags, newest first. Use this to find a tagid before tagging a subscriber, creating a tag-scoped webhook or filtering subscribers. Page forward with pageinfo.end_cursor.
Create a tag. Kit returns the existing tag instead of a duplicate when the name is already taken, so this is safe to call repeatedly. This connector exposes no tag delete; a tag created here can be renamed with update_tag.
Rename a tag. Use list_tags to find tag IDs. Subscribers keep the tag through a rename.
List the subscribers carrying one tag, with optional state and date filters. Use list_tags to find tag IDs. Kit's list indexes lag writes by up to a few minutes, so a just-tagged subscriber may not appear immediately.
Apply a tag to an existing subscriber by subscriber ID. Use listtags for tag IDs and listsubscribers for subscriber IDs. Use tagsubscriberby_email when you only have an email address.
Apply a tag to a subscriber identified by email address, creating the subscriber when the address is new. Use listtags to find tag IDs. Use tagsubscriber when you already hold the subscriber ID.
Remove a tag from a subscriber by subscriber ID. Use listtagsubscribers to see who carries a tag. Kit answers success even when the subscriber did not have the tag.
Remove a tag from a subscriber identified by email address. Use removetagfromsubscriber when you already hold the subscriber ID. Use listtags to find tag IDs.
Validate the Kit API key with a lightweight account lookup. Returns success plus a message explaining any failure.
List the account's registered webhooks and the events they fire on. Use this to find a webhook_id before deleting one.
Register a webhook that POSTs to a URL when one Kit event fires. Scope-specific events need their ID: use listforms, listtags or list_sequences to find it. Kit registers one event per webhook, so call this once per event.
Delete a webhook so Kit stops posting its event. The inverse of createwebhook. Use listwebhooks to find webhook IDs.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now