MCP server for HubSpot CRM data sync
npm install daeda-mcp

An MCP server that syncs your HubSpot CRM to a local encrypted database, enabling AI assistants to query your contacts, companies, and deals instantly.
Querying HubSpot through the API is slow and rate-limited. Daeda solves this by:
- Syncing your entire CRM locally - Contacts, companies, deals, and all associations
- Encrypted storage - Your data is encrypted at rest using your HubSpot token
- Instant queries - AI assistants can run SQL queries against your local database
- Works offline - Once synced, no internet required for queries
- Full CRM Sync - Exports all contacts, companies, and deals with all properties
- Association Support - Contact-company, deal-contact, and deal-company relationships
- Smart Seeding - Quick preview of ~1,000 recent deals available in seconds while full sync runs
- Resumable Sync - Interrupted syncs resume automatically on restart
- Read-Only Queries - AI can only SELECT data, never modify your CRM
- "Show me all deals closing this month over $50k"
- "Find contacts at companies in the healthcare industry"
- "Which deals have no associated contacts?"
- "List all contacts with a @gmail.com email"
- "What's the total pipeline value by deal stage?"
1. Go to your HubSpot account → Settings → Integrations → Private Apps
2. Create a new private app
3. Under "Scopes", enable these permissions:
- crm.export (required for bulk data export)
- crm.objects.contacts.read
- crm.objects.companies.read
- crm.objects.deals.read
4. Create the app and copy your access token (starts with pat-)
No installation needed! Just add Daeda to your AI assistant's MCP configuration below - npx handles everything automatically.
Choose your AI assistant below and follow the setup instructions. All configurations use the same JSON structure - just add it to your tool's config file.
Claude Desktop
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
``json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Cursor
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.cursor/mcp.json or .cursor/mcp.json in project |%USERPROFILE%\.cursor\mcp.json
| Windows | or .cursor\mcp.json in project |
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Windsurf
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.codeium/windsurf/mcp_config.json |%USERPROFILE%\.codeium\windsurf\mcp_config.json
| Windows | |
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
VS Code (Copilot MCP)
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/Code/User/settings.json |%APPDATA%\Code\User\settings.json
| Windows | |
Add to your VS Code settings.json:
`json`
{
"mcp": {
"servers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
}
Cline
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json |%APPDATA%\Code\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json
| Windows | |
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Roo Code
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/mcp_settings.json |%APPDATA%\Code\User\globalStorage\rooveterinaryinc.roo-cline\settings\mcp_settings.json
| Windows | |
You can also edit via the Roo Code UI: Click the MCP icon → Edit Global MCP.
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Windows users: Use this format instead:
`json`
{
"mcpServers": {
"daeda": {
"command": "cmd",
"args": ["/c", "npx", "-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Zed
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.config/zed/settings.json |%APPDATA%\Zed\settings.json
| Windows | |
Add to the context_servers section of your Zed settings:
`json`
{
"context_servers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
JetBrains IDEs (IntelliJ, PyCharm, WebStorm, etc.)
JetBrains IDEs (2025.2+) have built-in MCP support via Settings → Tools → AI Assistant → Model Context Protocol (MCP).
1. Open Settings → Tools → AI Assistant → Model Context Protocol (MCP)
2. Click + to add a new server
3. Paste this configuration:
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Config is stored internally at:
| Platform | Location |
|----------|----------|
| macOS | ~/Library/Application Support/JetBrains/ |%APPDATA%\JetBrains\
| Windows | |
Amazon Q Developer
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/amazon-q/mcp.json |%APPDATA%\amazon-q\mcp.json
| Windows | |~/.config/amazon-q/mcp.json
| Linux | |
Create the file if it doesn't exist:
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Restart your IDE after saving.
Claude Code (CLI)
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.claude/config.json (or inherits from Claude Desktop) |%USERPROFILE%\.claude\config.json
| Windows | |
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Continue.dev
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.continue/config.yaml |%USERPROFILE%\.continue\config.yaml
| Windows | |
Continue uses YAML format:
`yaml`
mcpServers:
- name: daeda
command: npx
args:
- "-y"
- "daeda-mcp"
env:
HS_PRIVATE_TOKEN: "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Goose (by Block)
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/.config/goose/config.yaml |%APPDATA%\Block\goose\config\config.yaml
| Windows | |
Goose uses YAML format:
`yaml`
extensions:
daeda:
name: daeda
type: stdio
cmd: npx
args: ["-y", "daeda-mcp"]
envs:
HS_PRIVATE_TOKEN: "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Raycast (macOS only)
Raycast supports MCP via the "Model Context Protocol" extension.
1. Install the MCP extension from Raycast Store
2. Open Raycast → Extensions → Model Context Protocol → Settings
3. Import this configuration:
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
OpenCode
| Platform | Config File Location |
|----------|---------------------|
| Global | ~/.config/opencode/opencode.json |
| Project | |
`json`
{
"mcpServers": {
"daeda": {
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
Trae (ByteDance)
| Platform | Config File Location |
|----------|---------------------|
| macOS | ~/Library/Application Support/Trae/User/settings.json |%APPDATA%\Trae\User\settings.json
| Windows | |
Add to your Trae settings:
`json`
{
"trae.mcp.servers": {
"daeda": {
"type": "stdio",
"command": "npx",
"args": ["-y", "daeda-mcp"],
"env": {
"HS_PRIVATE_TOKEN": "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}
}
}
LibreChat (Self-hosted)
Add to your librechat.yaml configuration:
`yaml`
mcpServers:
daeda:
type: stdio
command: npx
args: ["-y", "daeda-mcp"]
env:
HS_PRIVATE_TOKEN: "pat-xx-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
1. First Launch - Daeda requests bulk exports from HubSpot's Export API
2. Quick Seed - While exports process, ~1,000 recent deals are fetched via Search API for immediate use
3. Full Sync - Export CSVs are downloaded and streamed into an encrypted SQLite database
4. Ready - AI assistants can now query your full CRM instantly
The quick seed completes in 2-5 minutes, giving you immediate access to your 1,000 most recent deals and their associated contacts and companies.
The full sync runs in the background and duration depends on your CRM size:
- Small CRM (10k records): ~5-10 minutes
- Medium CRM (100k records): ~30-60 minutes
- Large CRM (1M+ records): up to 5 hours
Progress is shown via the db_status tool. You can start querying immediately after the quick seed completes.
| Tool | Description |
|------|-------------|
| db_status | Check sync progress and database health |get_raw_sql
| | Execute SELECT queries against your CRM data |
The local database contains:
- contacts - All contacts with email and full properties as JSON
- companies - All companies with domain and full properties as JSON
- deals - All deals with name and full properties as JSON
- contact_company - Contact to company associations
- deal_contact - Deal to contact associations
- deal_company - Deal to company associations
Query any HubSpot property using json_extract():
`sql`
SELECT
json_extract(properties, '$.firstname') as first_name,
json_extract(properties, '$.lastname') as last_name,
email
FROM contacts
WHERE json_extract(properties, '$.lifecyclestage') = 'customer'
LIMIT 10
Your CRM data is stored locally at:
- macOS/Linux: ~/.daeda-mcp/data/%APPDATA%\daeda-mcp\data\`
- Windows:
The database is encrypted using your HubSpot token as the encryption key. If you change tokens, the database will be re-initialized automatically.
- All data stays on your machine
- Database is encrypted at rest
- Only SELECT queries are allowed
- Dangerous SQL keywords are blocked
- Your HubSpot token is never stored (only used for encryption)
MIT - see LICENSE for details.