Marketo MCP Server
The Marketo MCP Server is a tool for managing Marketo forms via the Marketo API. It provides the following capabilities:
List Forms: Retrieve Marketo forms with pagination and filtering by status (draft or approved)
Get Form by ID: Fetch details of a specific form using its unique ID
Clone Forms: Create copies of existing forms with new names, descriptions, and destination folders
Approve Forms: Change form status to approved with optional audit comments
Handle Authentication: Manage Marketo API authentication and token refresh automatically
Error Handling: Provide solutions for common errors including authentication issues and rate limiting
Integration: Configure easily with Claude Desktop for seamless operation
Used for configuration management, storing sensitive Marketo API credentials and instance URL in environment variables.
Provides a Node.js runtime environment for the MCP server, with compatibility for v14 or higher required for server operation.
The MCP server is implemented in TypeScript, enabling type-safe interactions with the Marketo API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Marketo MCP Server list all draft forms"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Marketo MCP Server
A Model Context Protocol server for Adobe Marketo Engage. Give Claude Desktop, Cursor, and other MCP-compatible clients direct, authenticated access to the Marketo REST API — read and write forms, smart lists, channels, leads, activities, and lists with natural language.
Why
Marketing ops, growth, and RevOps teams spend hours clicking through the Marketo UI to clone a form, approve assets, look up a lead, or audit a smart list. The Marketo MCP Server wires those same REST API operations into an LLM agent, so you can say:
"Clone form 1234 into the Q2 Webinars folder and approve it."
"Show me recent activities for lead alex@example.com."
"Create a new email channel called 'Lifecycle Nurture'."
…and the model executes the actual Marketo API calls on your behalf.
Related MCP server: Dynamic Form MCP
Table of Contents
Features
Form management — list, inspect, clone, and approve forms via the Marketo Asset API
Smart list operations — list and inspect smart lists
Channel CRUD — create, read, update, and delete channels
Lead database — get leads by ID or email, create or update leads in bulk, delete leads
Activity & change logs — fetch activities and field changes for any lead
List membership — add or remove leads from static lists
Program management — list, inspect, clone programs and retrieve program members
Email operations — list, inspect, and send sample emails for QA
Automatic auth — OAuth 2.0 client-credentials flow with token caching & refresh
Stdio transport — works out of the box with Claude Desktop, Cursor, and any MCP client that speaks stdio
Quick start
Option A — Smithery (recommended)
npx -y @smithery/cli install @alexleventer/marketo-mcp --client claudeFollow the prompts to paste in your Marketo base URL, client ID, and client secret.
Option B — npx (no install)
Add the following to your MCP client's config (e.g. claude_desktop_config.json):
{
"mcpServers": {
"marketo": {
"command": "npx",
"args": ["-y", "marketo-mcp"],
"env": {
"MARKETO_BASE_URL": "https://123-ABC-456.mktorest.com/rest",
"MARKETO_CLIENT_ID": "your-client-id",
"MARKETO_CLIENT_SECRET": "your-client-secret"
}
}
}
}Option C — from source
git clone https://github.com/alexleventer/marketo-mcp.git
cd marketo-mcp
npm install
npm run buildCopy the config block printed by the build into your MCP client.
Prerequisites
Node.js 18 or higher
Marketo API credentials (client ID & client secret from a LaunchPoint service)
A Marketo instance with REST API access enabled
An MCP-compatible client — Claude Desktop, Cursor, Cline, or any other
Obtaining Marketo API credentials
Log into Marketo admin
Admin → Integration → LaunchPoint
New → New Service, set service type to Custom and pick a display name (e.g.
MCP Server)Assign an API-only user with the permissions you need (Read-Only Assets, Read-Write Lead, etc.)
Save the Client ID and Client Secret
Your base URL is under Admin → Integration → Web Services → REST API Endpoint (strip
/rest/v1/*— keep justhttps://<munchkin>.mktorest.com/rest)
Configuration
All configuration is via environment variables:
Variable | Required | Description |
| yes | Your REST endpoint, e.g. |
| yes | LaunchPoint service client ID |
| yes | LaunchPoint service client secret |
Copy .env.example to .env for local development.
Available tools
Tool | Description |
| List forms (filter by `status: draft |
| Get a single form by ID |
| Clone a form into a destination folder |
| Approve a draft form |
| List smart lists |
| Get a smart list by ID |
| List channels |
| Get a channel by ID |
| Create a new channel |
| Update an existing channel |
| Delete a channel |
| Get a lead by numeric ID |
| Look up a lead by email address (filter API) |
| Bulk create or update leads (max 300 per call) |
| Delete a lead |
| Fetch activities for a lead (paginated) |
| Fetch field-change history for a lead |
| Get lists that a lead belongs to |
| Add leads to a static list |
| Remove leads from a static list |
| List programs (filter by type, folder, tag, or date range) |
| Get a program by ID |
| Clone a program and all its local assets into a folder |
| Get leads that are members of a program |
| List emails (filter by status) |
| Get an email by ID |
| Send a sample/preview email for QA |
Each tool accepts typed arguments validated with zod and returns the raw Marketo JSON response. See the Adobe Marketo REST API reference for field-level details.
Usage with Claude Desktop
Install Claude Desktop
Open the config at
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) or%APPDATA%\Claude\claude_desktop_config.json(Windows)Paste the
mcpServersblock from Quick startRestart Claude Desktop
Usage with Cursor / other MCP clients
Any MCP client that supports stdio servers will work. Point it at the built binary:
{
"mcpServers": {
"marketo": {
"command": "npx",
"args": ["-y", "marketo-mcp"],
"env": { "MARKETO_BASE_URL": "...", "MARKETO_CLIENT_ID": "...", "MARKETO_CLIENT_SECRET": "..." }
}
}
}Rate limits
Marketo enforces several API rate limits. Keep these in mind when running batch operations:
Limit | Value |
Short-term | 100 calls per 20 seconds per instance |
Daily | 50,000 calls per day |
Concurrent | 10 simultaneous connections |
Bulk import | 10 MB per file, 10 concurrent jobs |
Bulk export | 500 MB per day, 2 concurrent jobs |
If you hit 606 Max rate limit reached, wait 20 seconds before retrying. The Marketo REST API returns a Retry-After header in some cases.
Troubleshooting
Symptom | Likely cause |
| Wrong client ID/secret, or REST API not enabled for the LaunchPoint user |
| The API-only user lacks the role for that endpoint (e.g. Asset API vs Lead Database API) |
| Marketo caps at 100 calls / 20s / instance — batch calls and add delays |
| The folder/form/lead ID doesn't exist or is in a different workspace |
Auth works, but requests hang | Double-check |
You can inspect tool calls locally with the MCP inspector:
npm run inspectorDevelopment
src/
├── index.ts # MCP server + all tool registrations
├── auth.ts # OAuth token manager (caches until expiry)
└── constants.ts # Env var bindingsnpm run dev # Run with ts-node + .env
npm run typecheck # Type-check without emit
npm run lint # ESLint
npm run format # Prettier
npm run build # Compile to build/Contributing
Issues and pull requests welcome at github.com/alexleventer/marketo-mcp.
Fork the repo
Create a feature branch
npm run lint && npm run typecheckOpen a PR
License
ISC — see LICENSE.
Keywords: marketo mcp server, marketo model context protocol, marketo claude, marketo ai, adobe marketo mcp, marketo api claude desktop, marketo automation llm, marketo engage mcp
Available Tools
27 toolsmarketo_add_lead_to_listA
Add one or more leads to a static list by list ID. Accepts an array of lead IDs. Max 300 leads per call.
Inputs: listId (required), leadIds (required).
marketo_approve_formB
Approve a draft form, making it available for use in landing pages and embeds. Optionally include an approval comment.
Inputs: formId (required), comment.
marketo_clone_formA
Clone an existing form into a destination folder. The cloned form is created in draft status and must be approved before use.
Inputs: formId (required), name (required), folderId (required), description.
marketo_clone_programA
Clone an existing program into a destination folder. Clones all local assets (emails, landing pages, smart campaigns) within the program. The cloned program is created with the same channel.
Inputs: programId (required), name (required), folderId (required), description.
marketo_create_channelA
Create a new program channel. Channels must have a unique name and type. The type determines which program types can use this channel.
Inputs: name (required), type (required), description, applicationId.
marketo_create_or_update_leadA
Bulk create or update leads (upsert). Accepts an array of lead records with standard and custom fields. Deduplicates by lookupField (default: email). Max 300 leads per call.
Inputs: input (required), lookupField, partitionName.
marketo_delete_channelA
Delete a channel by ID. Fails if any programs are currently using this channel.
Inputs: channelId (required).
marketo_delete_leadA
Permanently delete a lead by its numeric ID. This action cannot be undone.
Inputs: leadId (required).
marketo_get_channel_by_idA
Retrieve a single channel by its numeric ID. Returns the channel definition including progression statuses and their success mappings.
Inputs: channelId (required).
marketo_get_channelsB
List all program channels in the instance. Channels define the progression statuses available to programs (e.g., Webinar: Invited > Registered > Attended).
Inputs: maxReturn, offset.
marketo_get_email_by_idA
Retrieve a single email by its numeric ID. Returns full email metadata including subject, from address, reply-to, template, and folder location.
Inputs: emailId (required).
marketo_get_emailsA
List email assets in Marketo. Filter by approval status (approved/draft) and paginate with maxReturn/offset. Returns email metadata including subject line, from address, and template ID.
Inputs: maxReturn, offset, status.
marketo_get_form_by_idA
Retrieve a single form by its numeric ID. Returns full form metadata including fields, submit button, and thank-you page configuration.
Inputs: formId (required).
marketo_get_formsA
List forms in the Marketo instance. Filter by approval status (approved/draft) and paginate with maxReturn/offset. Returns form metadata including URL, status, and folder location.
Inputs: maxReturn, offset, status.
marketo_get_lead_activitiesA
Fetch activity records for a specific lead. Filter by activity type IDs (e.g., 1=Visit Webpage, 2=Fill Out Form, 6=Send Email). Supports cursor-based pagination via nextPageToken.
Inputs: leadId (required), activityTypeIds, nextPageToken, batchSize.
marketo_get_lead_by_emailB
Look up a lead by email address using the Marketo leads filter API. Optionally specify which fields to return. Returns matching lead records.
Inputs: email (required), fields.
marketo_get_lead_by_idB
Retrieve a lead by its numeric Marketo ID. Optionally specify which fields to return (defaults to standard fields). Returns lead record with all requested field values.
Inputs: leadId (required), fields.
marketo_get_lead_changesA
Fetch field-change history for a specific lead. Optionally filter to specific field names. Useful for auditing data changes and tracking lead lifecycle progression.
Inputs: leadId (required), fields, nextPageToken, batchSize.
marketo_get_lead_listsA
Get all static lists that a lead belongs to. Supports cursor-based pagination via nextPageToken. Returns list IDs and names.
Inputs: leadId (required), batchSize, nextPageToken.
marketo_get_program_by_idA
Retrieve a single program by its numeric ID. Returns full program metadata including channel, status, costs, tags, and folder path.
Inputs: programId (required).
marketo_get_program_membersA
Get leads that are members of a specific program. Optionally specify which fields to return. Supports cursor-based pagination via nextPageToken. Returns member status alongside lead data.
Inputs: programId (required), fields, batchSize, nextPageToken.
marketo_get_programsA
List programs in Marketo. Filter by type (filterType: id, programType, folder, tag) with filterValues, or by date range (earliestUpdatedAt/latestUpdatedAt). Paginate with maxReturn/offset. Returns program metadata including channel, status, costs, and tags.
Inputs: maxReturn, offset, filterType, filterValues, +2 more.
marketo_get_smart_list_by_idA
Retrieve a single smart list by its numeric ID. Returns the smart list definition including filter rules and membership criteria.
Inputs: smartListId (required).
marketo_get_smart_listsA
List smart lists in the Marketo instance. Paginate with maxReturn (default 200) and offset. Returns smart list metadata including filter rules and folder location.
Inputs: maxReturn, offset.
marketo_remove_lead_from_listA
Remove one or more leads from a static list. Accepts an array of lead IDs. Max 300 leads per call.
Inputs: listId (required), leadIds (required).
marketo_send_sample_emailA
Send a sample/preview of an email to a specified email address. Optionally render with a specific lead's data by passing leadId. Useful for QA before approving.
Inputs: emailId (required), emailAddress (required), textOnly, leadId.
marketo_update_channelA
Update an existing channel's properties (name, description, type). Cannot change progression statuses after creation.
Inputs: channelId (required), name, description, type, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 27 tools
All tools target distinct resources and actions (leads, forms, emails, programs, channels, smart lists) with no overlapping purposes, making it easy for an agent to select the correct tool.
All tools follow a consistent 'marketo_verb_noun' pattern (e.g., marketo_add_lead_to_list, marketo_get_form_by_id), with clear and predictable naming throughout.
27 tools is appropriate for a comprehensive marketing automation platform covering multiple subdomains (leads, forms, emails, programs, channels, smart lists). Each tool has a clear purpose and none seem redundant.
Coverage is strong for leads (CRUD) and channels (full lifecycle), but missing create/delete for forms and emails, and missing create/delete for programs. This leaves notable gaps that may require workarounds.
Maintenance
Related MCP Connectors
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Model Context Protocol server for Studex tools, notifications, and profile integrations
A Model Context Protocol server for Wix AI tools
Model Context Protocol server for todo.vu task management and time tracking.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables interaction with the Tradovate API for managing trading contracts, positions, orders, and accounts.1MIT
- AlicenseAqualityDmaintenanceA server that implements the Model Context Protocol for managing dynamic forms, allowing users to create, retrieve, and handle responses for web forms via the @dynamicfrm/js library.4ISC
- FlicenseDqualityDmaintenanceA comprehensive Model Context Protocol server that enables interaction with the Klaviyo API, providing tools and resources for managing customer profiles, lists, segments, campaigns, flows, and various marketing automation features.473-
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol server for Marketing Connect AI integrations that provides tools, resources, and prompts for AI models to interact with marketing systems and data.-