EspoCRM MCP Server
Click on "Install 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., "@EspoCRM MCP ServerShow open opportunities for account Acme Corp"
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.
EspoCRM MCP Server für Claude Desktop und ChatGPT
Ein allowlist-basierter MCP-Server für EspoCRM. Er stellt Claude und ChatGPT eng begrenzte Werkzeuge für Accounts, Contacts, Opportunities, verknüpfte E-Mails sowie Meetings, Anrufe und Aufgaben bereit. Meetings, Anrufe und Aufgaben können gesucht, gelesen, angelegt und aktualisiert werden. Es gibt keinen generischen API-Zugriff und keine Löschfunktion.
Der Server kann auf zwei Arten betrieben werden:
Betriebsart | Transport | Typischer Einsatz |
Lokal auf dem eigenen Rechner |
| Claude Desktop direkt; ChatGPT über OpenAI Secure MCP Tunnel |
Auf einem Server mit Docker und Caddy | Streamable HTTP hinter HTTPS-Reverse-Proxy | ChatGPT und Claude als Remote-MCP-Endpunkt mit Bearer Token |
Status: Frühe Version
0.4.0. Vor einem produktiven Einsatz sollten Berechtigungen, Felder, Statuswerte und Filter gegen die eigene EspoCRM-Installation geprüft werden.
Dieses Repository ist ein inoffizielles Community-Projekt. Es ist weder mit EspoCRM noch mit Anthropic, Claude oder OpenAI verbunden und wird von diesen Unternehmen nicht unterstützt oder geprüft.
Welche Betriebsart passt?
Lokal ist die beste Wahl, wenn der MCP-Server und der EspoCRM-API-Key nur auf deinem Rechner liegen sollen. Claude Desktop startet den Server direkt als lokalen Unterprozess. ChatGPT kann denselben lokalen stdio-Server nicht direkt starten, erreicht ihn aber über den offiziellen OpenAI Secure MCP Tunnel.
Serverbetrieb ist die bessere Wahl, wenn Claude und ChatGPT denselben dauerhaft laufenden Remote-MCP-Endpunkt nutzen sollen. Der Node-Prozess läuft dabei in Docker nur intern erreichbar. Caddy übernimmt HTTPS, den öffentlichen Hostnamen und die Bearer-Token-Prüfung.
In beiden Varianten gilt: Die CRM-Inhalte, die über ein MCP-Werkzeug abgerufen werden, werden an den jeweils verwendeten KI-Dienst übertragen und unterliegen den Daten- und Datenschutzeinstellungen des Anthropic- beziehungsweise OpenAI-Kontos.
Related MCP server: Twenty MCP
Funktionen
Accounts suchen, einzeln lesen sowie Kontakte und Opportunities eines Accounts auflisten
Contacts suchen, einzeln lesen sowie Accounts und Opportunities eines Kontakts auflisten
Opportunities suchen, einzeln lesen sowie Account und Kontakte einer Opportunity laden
Meetings suchen, lesen, anlegen und in freigegebenen Feldern aktualisieren
Anrufe suchen, lesen, anlegen und in freigegebenen Feldern aktualisieren
Aufgaben suchen, lesen, anlegen und in freigegebenen Feldern aktualisieren
normalisierten Activity Stream von Accounts, Contacts und Opportunities lesen
einzelne, im Activity Stream referenzierte E-Mails mit Klartextinhalt lesen
explizite Feld-, Filter-, Sortier- und Beziehungs-Allowlist
höchstens 20 Ergebnisse pro Anfrage
Audit-Log ohne CRM-Inhalte oder Zugangsdaten
Die Schreibwerkzeuge führen keine Löschoperationen aus. Das Anlegen oder Aktualisieren eines Meetings beziehungsweise Anrufs versendet auch keine Einladungs- oder Absage-E-Mails. Welche Status- und Auswahlwerte gültig sind, hängt von der jeweiligen EspoCRM-Konfiguration ab.
Activity-Stream-Antworten enthalten freigegebene Posts, E-Mail-Betreffzeilen, emailId-Verweise und Ereignismetadaten. Anhänge, Reaktionen, rohe EspoCRM-data-Objekte sowie alte und neue Werte aus Feldänderungen werden nicht ausgegeben. Post-Texte sind auf 4.000 Zeichen begrenzt.
Das Werkzeug get_email liest eine einzelne E-Mail anhand einer emailId. Es bevorzugt bodyPlain und wandelt HTML nur dann in Text um, wenn kein Klartext vorhanden ist. Pro Aufruf werden standardmäßig 20.000 und höchstens 30.000 Zeichen ausgegeben; längere Inhalte können mit bodyOffset abschnittsweise gelesen werden. Anhangsinhalte, BCC, technische Message-IDs und rohe HTML-Inhalte werden nicht zurückgegeben.
Voraussetzungen
EspoCRM mit HTTPS und REST API
separater EspoCRM-API-Benutzer mit Leserechten auf Account, Contact, Opportunity, Email, Meeting, Call und Task
Create/Edit-Rechte ausschließlich auf Meeting, Call und Task
keine Delete-Rechte für den API-Benutzer
für lokalen Betrieb: Node.js 22 oder neuer
für Claude lokal: Claude Desktop für macOS oder Windows
für ChatGPT lokal: ChatGPT-Workspace mit Entwicklermodus und Zugriff auf Secure MCP Tunnel
für Serverbetrieb: Docker, Docker Compose, Caddy und ein öffentlicher HTTPS-Hostname
Gemeinsame Konfiguration
Kopiere .env.example nach .env und trage URL und API-Key ein. Die .env-Datei ist von Git ausgeschlossen.
ESPOCRM_URL=https://crm.example.de
ESPOCRM_API_KEY=dein-api-keyDer Server ergänzt /api/v1 automatisch. Die Feldfreigaben stehen in config/permissions.example.yaml.
Die .env und relative Konfigurationspfade werden immer vom Projektordner aus aufgelöst. Der MCP-Client muss deshalb keine EspoCRM-Zugangsdaten in seiner eigenen Konfiguration speichern.
Optionale gemeinsame Werte:
# Optional. Defaults to config/permissions.example.yaml.
ESPOCRM_PERMISSIONS_FILE=config/permissions.example.yaml
# Optional. Audit entries contain metadata only, never record contents.
ESPOCRM_AUDIT_LOG=logs/audit.jsonlInstallationsspezifische Felder
Die Beispiel-Allowlist und die Suchwerkzeuge enthalten die benutzerdefinierten Felder cEnrichment, cRolle und cSektor. Diese Felder gehören nicht zum allgemeinen EspoCRM-Standardschema. Andere Installationen müssen sie in config/permissions.example.yaml und den entsprechenden Filtern in src/server.ts anpassen oder entfernen.
Betrieb A: Lokal
Der lokale Betrieb nutzt stdio. Der MCP-Server öffnet keinen eingehenden Port. Claude Desktop startet ihn direkt; ChatGPT nutzt bei Bedarf einen ausgehenden Secure MCP Tunnel.
Lokale Installation
npm install
npm run check
npm test
npm run buildClaude Desktop lokal anbinden
Claude Desktop startet dist/index.js als lokalen Unterprozess. Der Server wird normalerweise nicht manuell gestartet.
Ermittle zuerst absolute Pfade für Node.js und die gebaute Serverdatei:
command -v nodeÖffne in Claude Desktop Settings -> Developer -> Edit Config. Die Konfigurationsdatei liegt normalerweise hier:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.json
Beispiel für macOS:
{
"mcpServers": {
"espocrm": {
"command": "/opt/homebrew/bin/node",
"args": [
"/Users/DEINNAME/git/espocrm-mcp-server/dist/index.js"
]
}
}
}Beispiel für Windows:
{
"mcpServers": {
"espocrm": {
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": [
"C:\\Users\\DEINNAME\\git\\espocrm-mcp-server\\dist\\index.js"
]
}
}
}Der Server lädt .env automatisch aus seinem Projektordner. Der API-Key muss deshalb nicht in claude_desktop_config.json eingetragen werden.
Nach dem Speichern Claude Desktop vollständig beenden und neu starten:
macOS: Cmd+Q oder Claude -> Quit Claude
Windows: Claude über das Symbol im Infobereich mit Quit/Exit schließen
Ein Test in einem neuen Chat:
Suche maximal drei Accounts in EspoCRM und nenne nur ihre Namen.
ChatGPT lokal über Secure MCP Tunnel anbinden
ChatGPT kann einen lokalen stdio-Server nicht direkt starten. Der offizielle OpenAI Secure MCP Tunnel stellt deshalb eine verschlüsselte, ausschließlich ausgehende HTTPS-Verbindung vom lokalen Rechner zu OpenAI her. Es wird kein eingehender Port geöffnet und der EspoCRM-API-Key bleibt in der lokalen .env.
Die Tunnel-Funktion und der ChatGPT-Entwicklermodus sind separate Berechtigungen und können je nach Tarif beziehungsweise Workspace-Richtlinie nicht verfügbar sein. Die Tunnel-Variante eignet sich für eine private Entwickler-App im eigenen Workspace; sie ist kein öffentlicher Plugin-Endpunkt.
In den Platform-Tunnel-Einstellungen einen Tunnel anlegen.
Dem Tunnel die zuständige OpenAI-Organisation und den ChatGPT-Workspace zuordnen.
Unter Platform API Keys einen separaten Laufzeitschlüssel erstellen.
Den Schlüssel auf Restricted setzen und ausschließlich Tunnels: Read + Use freigeben.
Tunnel-ID und Laufzeitschlüssel dürfen nicht in das Repository eingecheckt werden. Unter macOS oder Linux kann der Schlüssel beispielsweise außerhalb des Projekts in einer nur für den eigenen Benutzer lesbaren Datei liegen:
install -d -m 700 "$HOME/.config/openai/tunnel-client"
read -s tunnel_runtime_key
printf '%s\n' "$tunnel_runtime_key" \
> "$HOME/.config/openai/tunnel-client/espocrm-local.key"
chmod 600 "$HOME/.config/openai/tunnel-client/espocrm-local.key"
unset tunnel_runtime_keyLade die aktuelle Version aus den offiziellen openai/tunnel-client-Releases und prüfe die Installation:
tunnel-client --version
tunnel-client help quickstartLokales Tunnel-Profil erstellen:
tunnel-client init \
--sample sample_mcp_stdio_local \
--profile espocrm-local \
--tunnel-id tunnel_... \
--mcp-command "/ABSOLUTER/PFAD/ZU/node /ABSOLUTER/PFAD/ZUM/espocrm-mcp-server/dist/index.js" \
--control-plane-api-key-ref "file:$HOME/.config/openai/tunnel-client/espocrm-local.key"Profil prüfen:
tunnel-client doctor --profile espocrm-local --explainTunnel starten:
tunnel-client runtimes connect \
--alias espocrm-local \
--profile espocrm-local \
--tunnel-id tunnel_... \
--runtime-api-key "file:$HOME/.config/openai/tunnel-client/espocrm-local.key" \
--mcp-command "/ABSOLUTER/PFAD/ZU/node /ABSOLUTER/PFAD/ZUM/espocrm-mcp-server/dist/index.js"
tunnel-client runtimes status espocrm-local --jsonDer Status muss process_running: true, healthy: true und ready: true melden. Ohne laufenden Tunnel bleibt die App in ChatGPT sichtbar, Werkzeugaufrufe schlagen jedoch fehl.
In ChatGPT anschließend:
Unter Settings -> Security and login den Developer mode aktivieren.
ChatGPT Plugins öffnen und Create app beziehungsweise App erstellen wählen.
Unter Connection die Option Tunnel und den zuvor angelegten Tunnel wählen.
Unter Authentication die Option None beziehungsweise Keine Authentifizierung wählen.
Vor dem Verbinden kontrollieren, dass genau die erwarteten 28 Werkzeuge erkannt werden.
Betrieb B: Server mit Docker und Caddy
Der Serverbetrieb nutzt Streamable HTTP. Der Node-Prozess spricht im Container normales HTTP; HTTPS, Hostname und Bearer Token übernimmt Caddy. Der Container-Port sollte nicht öffentlich erreichbar sein.
Docker starten
Auf dem Server:
git clone https://github.com/cknebel/espocrm-mcp-server.git
cd espocrm-mcp-server
cp .env.example .envTrage in .env mindestens ESPOCRM_URL und ESPOCRM_API_KEY ein. Für Remote-MCP sind außerdem diese Werte relevant:
MCP_HTTP_HOST=0.0.0.0
MCP_HTTP_PORT=3000
MCP_HTTP_PATH=/mcp
MCP_HTTP_ALLOWED_HOSTS=espocrm-mcp.example.de,127.0.0.1,localhost
MCP_HTTP_ALLOWED_ORIGINS=https://chatgpt.com,https://claude.aiDer Node-MCP-Server prüft selbst keinen Bearer Token. Er ist für den internen Betrieb hinter Caddy gedacht und darf nicht ungeschützt öffentlich erreichbar sein.
Der Compose-Dienst veröffentlicht den Container-Port standardmäßig nur auf 127.0.0.1 des Hosts:
docker compose up -d --buildDas Audit-Log wird standardmäßig in einem benannten Docker-Volume espocrm-mcp-logs gespeichert. Wenn stattdessen ein Host-Verzeichnis wie ./logs:/app/logs gemountet wird, muss dieses Verzeichnis für den non-root Container-User schreibbar sein.
Lokale Prüfung auf dem Server:
curl http://127.0.0.1:3000/healthzErwartete Antwort:
{"ok":true}Caddy vor den Docker-Dienst setzen
Wenn Caddy auf demselben Host läuft und den auf 127.0.0.1 gebundenen Compose-Port nutzt:
espocrm-mcp.example.de {
encode zstd gzip
route {
@missing_or_wrong_token {
not header Authorization "Bearer {$ESPOCRM_MCP_BEARER_TOKEN}"
}
respond @missing_or_wrong_token 401
@mcp path /mcp /mcp/*
reverse_proxy @mcp 127.0.0.1:3000
respond 404
}
}Wenn Caddy im selben Docker-Netzwerk wie der MCP-Container läuft, kann statt 127.0.0.1:3000 der Compose-Dienstname verwendet werden. In diesem Fall sollte der Port nicht zusätzlich über ports veröffentlicht werden, sondern nur per expose im Compose-Netz sichtbar sein:
espocrm-mcp.example.de {
encode zstd gzip
route {
@missing_or_wrong_token {
not header Authorization "Bearer {$ESPOCRM_MCP_BEARER_TOKEN}"
}
respond @missing_or_wrong_token 401
@mcp path /mcp /mcp/*
reverse_proxy @mcp espocrm-mcp:3000
respond 404
}
}Der öffentliche Remote-MCP-Endpunkt ist dann:
https://espocrm-mcp.example.de/mcpDer Bearer Token liegt im Beispiel als Caddy-Umgebungsvariable ESPOCRM_MCP_BEARER_TOKEN vor. Dieser Wert muss in der Umgebung des Caddy-Prozesses verfügbar sein. Der MCP-Container benötigt ihn nicht.
ChatGPT und Claude remote anbinden
Bei der Remote-Variante wird nicht der lokale stdio-Server eingebunden, sondern der HTTPS-Endpunkt von Caddy:
https://espocrm-mcp.example.de/mcpIn ChatGPT wird dieser Endpunkt als Remote-MCP-App beziehungsweise Custom Connector mit Bearer-Token-Authentifizierung eingetragen. Der Token muss zu ESPOCRM_MCP_BEARER_TOKEN im Caddyfile passen.
In Claude wird derselbe Remote-MCP-Endpunkt verwendet. Der praktische „Trick“ ist: Claude muss keinen lokalen Prozess starten und keine EspoCRM-Zugangsdaten kennen; Claude spricht nur mit dem per Caddy geschützten MCP-Endpunkt. Die EspoCRM-Zugangsdaten bleiben ausschließlich in .env auf dem Server.
Werkzeugdetails für Meetings, Anrufe und Aufgaben
Für jede der drei Aktivitätsarten stehen vier Werkzeuge bereit:
Entität | Suchen | Lesen | Anlegen | Aktualisieren |
Meeting |
|
|
|
|
Anruf |
|
|
|
|
Aufgabe |
|
|
|
|
Die Suchwerkzeuge unterstützen unter anderem Status, CRM-Zuordnung, zuständigen Benutzer, Startzeitraum, onlyMy, Sortierung und Paginierung. Bei Anrufen kann zusätzlich nach Richtung, bei Aufgaben nach Priorität gefiltert werden.
Meetings und Anrufe unterstützen Benutzer, Kontakte und Leads als Teilnehmer. Als übergeordnetes CRM-Objekt sind Account, Contact, Lead, Opportunity und Case zulässig. Die dazu benötigten IDs müssen bereits bekannt sein; der Server bietet weiterhin keine allgemeinen Werkzeuge für Leads oder Cases.
Für normale Meetings und Anrufe werden dateStart und dateEnd verwendet. EspoCRM-Datumszeiten sollten im Format YYYY-MM-DD HH:mm:ss angegeben werden. Ganztägige Meetings verwenden isAllDay: true zusammen mit dateStartDate und dateEndDate im Format YYYY-MM-DD. Aufgaben dürfen Start- und Fälligkeitsdatum mit oder ohne Zeit enthalten.
Die EspoCRM-Standardwerte sind:
Meeting/Call-Status:
Planned,Held,Not HeldAnrufrichtung:
Outbound,InboundAufgabenstatus:
Not Started,Started,Completed,Canceled,DeferredAufgabenpriorität:
Low,Normal,High,Urgent
EspoCRM-Administratoren können Auswahlwerte anpassen. Der Server begrenzt deren Länge, überlässt die fachliche Validierung aber EspoCRM. Update-Werkzeuge senden nur die tatsächlich angegebenen Felder. Nicht in writableFields freigegebene Felder werden vor dem API-Aufruf abgelehnt.
Beispielanfragen im MCP-Client:
Zeige meine geplanten Meetings der nächsten sieben Tage.
Lege morgen von 10:00 bis 10:30 Uhr einen Anruf mit diesem Kontakt an.
Markiere diese Aufgabe als abgeschlossen.
Aktualisieren
Lokaler Betrieb
git pull
npm install
npm run check
npm test
npm run buildDanach Claude Desktop beziehungsweise den Tunnel-Prozess vollständig neu starten.
Serverbetrieb
git pull
docker compose up -d --buildDanach in ChatGPT oder Claude die Remote-MCP-App beziehungsweise den Connector bei Bedarf aktualisieren, damit neue Werkzeugdefinitionen neu eingelesen werden.
Aktualisierung von Version 0.3 auf 0.4
Version 0.4 erweitert das Format der Berechtigungsdatei. Wer eine eigene Datei über ESPOCRM_PERMISSIONS_FILE verwendet, muss sie vor dem ersten Start aktualisieren:
Bei
Account,Contact,OpportunityundEmailjeweilswritableFields: []ergänzen.Die Abschnitte
Meeting,CallundTaskausconfig/permissions.example.yamlübernehmen und bei Bedarf an die eigene EspoCRM-Installation anpassen.Dem API-Benutzer Leserechte für Meeting, Call und Task sowie Create/Edit-Rechte für diese drei Entitäten geben. Keine Delete-Rechte vergeben.
npm run check,npm testundnpm run buildausführen.Claude Desktop, Tunnel-Prozess oder Docker-Container neu starten, damit Version 0.4 und alle 28 Werkzeuge geladen werden.
Fehlende Entitäten oder writableFields führen absichtlich zu einem Startfehler. Dadurch kann der Server nicht unbemerkt mit einer unvollständigen Sicherheitskonfiguration laufen.
Fehlerbehebung
Claude Desktop lokal
Wenn die EspoCRM-Werkzeuge nicht erscheinen:
JSON-Syntax der
claude_desktop_config.jsonprüfen.Sicherstellen, dass
commandundargsabsolute, vorhandene Pfade enthalten.Prüfen, ob
.envim Projektordner liegt und URL sowie API-Key gesetzt sind.Im Projekt
npm run check,npm testundnpm run buildausführen.Claude Desktop vollständig beenden und erneut öffnen.
Claude-Desktop-Protokolle liegen normalerweise hier:
macOS:
~/Library/Logs/ClaudeWindows:
%APPDATA%\Claude\logs
Besonders hilfreich sind mcp.log und Dateien nach dem Muster mcp-server-espocrm.log.
ChatGPT lokal über Tunnel
Wenn die App sichtbar ist, aber keine Daten liefert:
tunnel-client runtimes status espocrm-local --jsonausführen und aufhealthy: truesowieready: trueprüfen.tunnel-client doctor --profile espocrm-local --explainausführen.Prüfen, ob der Tunnel der richtigen Platform-Organisation und dem richtigen ChatGPT-Workspace zugeordnet ist.
Prüfen, ob der Laufzeitschlüssel Tunnels: Read + Use besitzt.
Nach Codeänderungen den Tunnel-Prozess neu starten und die App in ChatGPT über Update/Aktualisieren neu einlesen.
Serverbetrieb
Wenn ChatGPT oder Claude den Remote-MCP-Endpunkt nicht erreichen:
docker compose psprüfen.Auf dem Server
curl http://127.0.0.1:3000/healthzausführen.Prüfen, ob Caddy den richtigen Hostnamen und Pfad
/mcpweiterleitet.Prüfen, ob der Client denselben Bearer Token sendet, den Caddy erwartet.
Prüfen, ob
MCP_HTTP_ALLOWED_HOSTSden öffentlichen Hostnamen enthält.Caddy-Logs und Container-Logs prüfen.
Wenn der Container EACCES: permission denied, open '/app/logs/audit.jsonl' meldet, ist ein gemountetes Log-Verzeichnis nicht für den Container-User schreibbar. Bei einem Bind-Mount ./logs:/app/logs kann das auf dem Server so repariert werden:
docker compose run --rm --user root espocrm-mcp chown -R mcp:mcp /app/logs
docker compose up -dEntwicklung
npm run dev
npm run dev:http
npm run test:watchSiehe SECURITY.md für das Berechtigungs- und Datenschutzmodell.
Lizenz
Veröffentlicht unter der MIT-Lizenz.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceThis read-only MCP Server allows you to connect to SuiteCRM data from Claude Desktop through CData JDBC Drivers. Free (beta) read/write servers available at https://www.cdata.com/solutions/mcp1MIT
- AlicenseNot gradedqualityDmaintenanceA remote MCP server that connects Claude to a Twenty CRM workspace, enabling users to interact with CRM objects (People, Companies, Opportunities, and custom objects) through schema-driven tools for querying, creating, updating, and deleting records.1Apache 2.0
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server that exposes the Poli Júnior Pipedrive CRM to Claude as composable tools.
- FlicenseNot gradedqualityBmaintenanceRead-only MCP server connecting Claude to Vtiger CRM for leads, deals, and overdue follow-ups.
Related MCP Connectors
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
Managed LinkedIn MCP server for AI agents: search, connect, message and enrich on accounts you own.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cknebel/espocrm-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server