Hubspot Email Mcp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Hubspot Email Mcp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP (Model Context Protocol) server that enables Claude Code to create HubSpot marketing email drafts directly from document files (.md and .docx).
.md) and Word (.docx) documents@hubspot/rich_text, @hubspot/email_linked_image)The MCP server intelligently parses your document and creates a properly structured HubSpot email:
@hubspot/rich_text modules@hubspot/email_linked_image modulesThis approach avoids creating excessive sections, which can cause Gmail to clip emails over 102KB.
uv package manager (recommended) or pipUsing uv (recommended):
cd hubspot-email-mcp
uv syncUsing pip:
cd hubspot-email-mcp
pip install -e .The app needs the following scopes:
content (Read and write access to marketing emails)files (Read and write access to File Manager)pat-...)Copy the example configuration:
cp config.example.json config.jsonEdit config.json with your settings:
{
"hubspot_api_key": "pat-na1-xxxx-xxxx-xxxx",
"file_folder_path": "/email-images",
"brand_guidelines_path": "brand-guidelines.json"
}Configuration Fields:
hubspot_api_key: Your HubSpot Private App tokenfile_folder_path: Folder path in HubSpot File Manager where images will be uploadedbrand_guidelines_path: (Optional) Path to brand guidelines JSON file for consistent stylingThis MCP server creates emails using HubSpot's default modules, so you don't need a custom template. The server automatically:
The template_path configuration field has been removed as it's not needed.
The server supports brand guidelines for consistent styling across all emails. Create a brand-guidelines.json file to define your brand's colors, typography, spacing, and image styles.
📖 See [BRAND-GUIDELINES-REFERENCE.md](BRAND-GUIDELINES-REFERENCE.md) for complete documentation of all available fields.
#### Create Brand Guidelines File
Copy the example:
cp brand-guidelines.example.json brand-guidelines.jsonEdit the file and customize for your brand. The example includes all available fields with explanations.
#### Brand Guidelines Structure
{
"colors": {
"primary": "#197FC4",
"secondary": "#00a4bd",
"text": "#23496d",
"background": "#ffffff",
"border": "#000000"
},
"typography": {
"primaryFont": "Arial, sans-serif",
"secondaryFont": "Arial, sans-serif",
"headingOneSize": 28,
"headingTwoSize": 22,
"bodySize": 15,
"linkColor": "#00a4bd",
"linkUnderline": true
},
"spacing": {
"sectionPaddingTop": "40px",
"sectionPaddingBottom": "40px",
"modulePaddingTop": "20px",
"modulePaddingBottom": "20px"
},
"images": {
"defaultWidth": 600,
"maxWidth": "100%",
"alignment": "center",
"cornerRadius": 0,
"addBorder": false,
"borderWidth": 1,
"borderColor": "#000000"
},
"buttons": {
"backgroundColor": "#197FC4",
"textColor": "#ffffff",
"cornerRadius": 8,
"fontSize": 16
}
}#### What Gets Styled
When brand guidelines are configured, the server automatically applies:
Text Modules:
Image Modules:
Sections:
Path Configuration:
"brand_guidelines_path": "/absolute/path/to/brand-guidelines.json""brand_guidelines_path": "brand-guidelines.json"#### Working with Multiple Brands/Portals (Recommended)
If you work with multiple HubSpot portals or brands, the best approach is to configure multiple MCP servers in Claude Desktop. This gives you:
Example Setup:
Create separate config files for each brand:
hubspot-email-mcp/
├── config-brand-a.json # Brand A portal config
├── config-brand-b.json # Brand B portal config
├── brand-a-guidelines.json # Brand A styles
└── brand-b-guidelines.json # ACME brand stylesconfig-brand-a.json:
{
"hubspot_api_key": "pat-na1-xxxx-xxxx-xxxx",
"file_folder_path": "/email-images",
"brand_guidelines_path": "brand-a-guidelines.json"
}config-brand-b.json:
{
"hubspot_api_key": "pat-na1-yyyy-acme-key",
"file_folder_path": "/acme-email-images",
"brand_guidelines_path": "brand-b-guidelines.json"
}Then configure multiple servers in Claude Desktop (see next section for details).
Single Brand Setup (Alternative):
If you only work in one portal but want to switch brand guidelines occasionally:
{
"hubspot_api_key": "pat-na1-xxxx",
"file_folder_path": "/email-images",
"brand_guidelines_path": "brand-guidelines.json"
}Update brand_guidelines_path to switch styles, then restart Claude Desktop.
Edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS/Linux) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"hubspot-email": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/hubspot-email-mcp",
"run",
"hubspot-email-mcp"
],
"env": {
"HUBSPOT_EMAIL_MCP_CONFIG": "/absolute/path/to/config.json"
}
}
}
}If you work with multiple HubSpot portals or brands, configure one server per portal:
{
"mcpServers": {
"hubspot-email-brand-a": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/hubspot-email-mcp",
"run",
"hubspot-email-mcp"
],
"env": {
"HUBSPOT_EMAIL_MCP_CONFIG": "/absolute/path/to/config-brand-a.json"
}
},
"hubspot-email-brand-b": {
"command": "uv",
"args": [
"--directory",
"/absolute/path/to/hubspot-email-mcp",
"run",
"hubspot-email-mcp"
],
"env": {
"HUBSPOT_EMAIL_MCP_CONFIG": "/absolute/path/to/config-brand-b.json"
}
}
}
}How to Use:
When you ask Claude to create an email, it will know which brand/portal you're targeting based on context:
# For Brand A portal
Create a marketing email from newsletter.md for the Brand A portal
# For Brand B portal
Create a marketing email from announcement.docx for the Brand B portalClaude Code will automatically use the correct server based on your request.
Benefits:
~/Library/Logs/Claude/ (macOS) or %APPDATA%\Claude\logs\ (Windows)Once installed, you can use the tool from Claude Code:
Create a marketing email from newsletter.md named "Monthly Newsletter"
with subject line "Your Monthly Update - January 2025"Create a marketing email from product-announcement.docx named
"New Product Launch" with subject "Introducing Our Latest Innovation".md or .docx) with: Create a HubSpot marketing email from /path/to/my-newsletter.md
named "Newsletter Q1" with subject "Quarterly Update".md)# Heading 1
## Heading 2
Paragraph text with **bold** and *italic*.

- Bullet point 1
- Bullet point 2Image References:
 - will be uploaded - will be skipped.docx)The server uses HubSpot's default modules from Design Manager:
These modules are available by default in all HubSpot accounts and don't require any custom development.
Why This Matters:
Our Approach:
Future Enhancement: The server can be extended to support multi-column layouts by detecting layout changes and creating new sections only when necessary.
uv is installed: uv --version~/Library/Logs/Claude/%APPDATA%\Claude\logs\401 Unauthorized:
config.json403 Forbidden:
content, files)Image Upload Failures:
file_folder_path exists in your File ManagerImages not showing:
files scope enabledText formatting issues:
<h1>, etc.)# Install dev dependencies
uv sync --dev
# Run tests (when implemented)
pytestCreate a test document:
test.md:
# Test Email
This is a test email with an image.
Then use Claude Code to create an email from it.
HubSpot has rate limits on their APIs:
The server includes basic error handling for rate limits (429 errors).
config.json file with real API keysconfig.example.json is safe to commit (contains no real keys)MIT
For issues or questions:
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.