Exposes Adobe Marketo REST API operations as tools for AI assistants.
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 |
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 authenticationConfiguration
{"mcpServers": {"marketo": {"command": "python", "args": ["/path/to/MarketoMCP/mcp_server.py"], "env": {"MARKETO_CLIENT_ID": "your-client-id", "MARKETO_CLIENT_SECRET": "your-client-secret", "MARKETO_BASE_URL": "https://your-instance.mktorest.com"}}}}