Prepare the server locally
Run this once before adding it to Claude Code.
git clone <repo-url>
cd MarketoMCP
pip install -r requirements.txtRegister it in Claude Code
claude mcp add -e "MARKETO_CLIENT_ID=${MARKETO_CLIENT_ID}" -e "MARKETO_CLIENT_SECRET=${MARKETO_CLIENT_SECRET}" -e "MARKETO_BASE_URL=${MARKETO_BASE_URL}" marketo-mcp -- python /path/to/MarketoMCP/mcp_server.pyReplace any placeholder paths in the command with the real path on your machine.
MARKETO_CLIENT_IDMARKETO_CLIENT_SECRETMARKETO_BASE_URL+ 1 optionalMake your agent remember this setup
marketo-mcp's config, env vars, and the gotchas you hit — recalled in every future Claude Code, Cursor, and Codex session.
npx conare@latestFree · one command · indexes the sessions already on disk. Set up in the browser instead →
What it does
- Comprehensive management of Marketo assets including leads, activities, and emails.
- Support for browsing and managing smart campaigns.
- Integration with Claude Desktop and other MCP-compliant clients.
- Flexible authentication options for different client types.
Tools 22
get_activity_typesGet all available activity typesget_lead_activitiesGet recent activities for a lead by IDget_lead_activities_by_emailGet recent activities for a lead by emailget_lead_changesGet data value changes for a leadget_lead_by_emailLook up a lead by email addressdescribe_leadsGet lead field metadata and schemaget_email_by_idGet an email asset by IDget_email_by_nameGet an email asset by namebrowse_emailsBrowse email assets with filteringget_email_contentGet content sections of an emailget_email_cc_fieldsGet fields enabled for Email CCpreview_emailGet a live preview of an emailget_channelsGet available program channelsget_folder_by_nameGet a folder by namebrowse_foldersBrowse foldersget_smart_campaign_by_idGet a smart campaign by IDget_smart_campaign_by_nameGet a smart campaign by namebrowse_smart_campaignsBrowse smart campaigns with filteringcreate_smart_campaignCreate a new smart campaignupdate_smart_campaignUpdate an existing smart campaignclone_smart_campaignClone a smart campaignschedule_batch_campaignSchedule a batch campaign to runEnvironment Variables
MARKETO_CLIENT_IDrequiredMarketo API Client ID from LaunchPointMARKETO_CLIENT_SECRETrequiredMarketo API Client Secret from LaunchPointMARKETO_BASE_URLrequiredMarketo REST API base URLMCP_API_KEYSecret API key for bearer token authenticationTry it
Original README from tyron-pretorius/marketo-mcp
Marketo MCP Server
An MCP (Model Context Protocol) server that exposes Adobe Marketo REST API operations as tools. Built with FastMCP, it allows AI assistants and MCP clients to interact with your Marketo instance.
Prerequisites
- Python 3.10+
- A Marketo instance with API access (client ID, client secret, and REST API base URL)
Setup
1. Clone the repository
git clone <repo-url>
cd MarketoMCP
2. Create a virtual environment and install dependencies
python -m venv venv
source venv/bin/activate # macOS/Linux
# venv\Scripts\activate # Windows
pip install -r requirements.txt
3. Configure environment variables
Copy the template and fill in your Marketo API credentials:
cp .env_template .env
Edit .env with your values:
MARKETO_CLIENT_ID="your-client-id"
MARKETO_CLIENT_SECRET="your-client-secret"
MARKETO_BASE_URL="https://your-instance.mktorest.com"
MCP_API_KEY="your-secret-api-key"
You can find these in Marketo Admin > LaunchPoint (for client ID/secret) and Admin > Web Services (for the REST API base URL).
4. Start the server
There are two server scripts to choose from:
`mcp_server.py` — No authentication (for Claude Desktop)
python mcp_server.py
Use this when connecting from Claude Desktop, which only supports OAuth 2.0 authentication for custom connectors. This server has no auth layer, so it should only be exposed on trusted networks or behind a reverse proxy that handles authentication.
`mcp_server_auth.py` — Bearer token authentication (for OpenAI and other clients)
python mcp_server_auth.py
Use this when connecting from OpenAI or any MCP client that supports bearer token authentication. Clients must include the MCP_API_KEY value from your .env file in every request:
Authorization: Bearer <your-MCP_API_KEY-value>
Add the key to your .env:
MCP_API_KEY="your-secret-api-key"
Why two servers? Claude Desktop's custom connector only supports OAuth 2.0 (Client ID / Client Secret). It has no way to send a static bearer token, so
mcp_server_auth.pycannot be used with Claude Desktop. For Claude Desktop, usemcp_server.pyinstead.
Both servers start on http://0.0.0.0:8000 using the Streamable HTTP transport. The MCP endpoint is available at http://localhost:8000/mcp.
Available Tools
Activities
| Tool | Description | Parameters |
|---|---|---|
get_activity_types |
Get all available activity types | — |
get_lead_activities |
Get recent activities for a lead by ID | lead_id, activity_type_ids?, days_back? (default: 7) |
get_lead_activities_by_email |
Get recent activities for a lead by email | email, activity_type_ids?, days_back? (default: 7) |
get_lead_changes |
Get data value changes for a lead | lead_id, fields?, days_back? (default: 7) |
Leads
| Tool | Description | Parameters |
|---|---|---|
get_lead_by_email |
Look up a lead by email address | email |
describe_leads |
Get lead field metadata and schema | — |
Emails
| Tool | Description | Parameters |
|---|---|---|
get_email_by_id |
Get an email asset by ID | email_id |
get_email_by_name |
Get an email asset by name | name, folder_id? |
browse_emails |
Browse email assets with filtering | max_return?, offset?, status?, folder_id?, earliest_updated_at?, latest_updated_at? |
get_email_content |
Get content sections of an email | email_id, status? |
get_email_cc_fields |
Get fields enabled for Email CC | — |
preview_email |
Get a live preview of an email | email_id, status?, content_type?, lead_id? |
Channels
| Tool | Description | Parameters |
|---|---|---|
get_channels |
Get available program channels | max_return?, offset? |
Folders
| Tool | Description | Parameters |
|---|---|---|
get_folder_by_name |
Get a folder by name | name |
browse_folders |
Browse folders | max_return?, offset?, folder_type? |
Smart Campaigns
| Tool | Description | Parameters |
|---|---|---|
get_smart_campaign_by_id |
Get a smart campaign by ID | campaign_id |
get_smart_campaign_by_name |
Get a smart campaign by name | name |
browse_smart_campaigns |
Browse smart campaigns with filtering | max_return?, offset?, is_active?, folder_id?, earliest_updated_at?, latest_updated_at? |
create_smart_campaign |
Create a new smart campaign | name, folder_id, description? |
update_smart_campaign |
Update an existing smart campaign | campaign_id, name?, description?, folder_id? |
clone_smart_campaign |
Clone a smart campaign | campaign_id, name, folder_id, description? |
schedule_batch_campaign |
Schedule a batch campaign to run |