PostHog MCP Server
Official PostHog MCP Server for product analytics, feature flags, experiments, and more.
Beschreibung vom Entwickler (englisches Original)
Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.
Diese drei werden nie zu einer Punktzahl zusammengefasst: Meinungen, Messungen und Beliebtheit sind verschiedene Dinge.
Für diesen Server haben wir noch keine Zusammenfassung in einfacher Sprache geschrieben. Unten stehen die Fakten, die wir aus der Registry gelesen haben.
Wähle die KI-App, die du nutzt, und kopiere die Einstellungen.
NEVENT_JWT_TOKEN, NEVENT_OPERATION_MODEAls geheim markierte Werte sind Schlüssel zu deinem Konto. Gib sie nie weiter und füge sie nie in einen Chat ein.
Du brauchst
Welche App nutzt du?
Wähle oben deine App. Wir merken sie uns, damit der Button beim nächsten Mal „In … installieren“ anzeigt.
Funktioniert in Claude im Web, auf dem Desktop und auf dem Handy:
https://mcp.nevent.ai/Öffne Claude Desktop → Settings → Developer → Edit Config und füge dies in claude_desktop_config.json ein
{
"mcpServers": {
"nevent": {
"command": "npx",
"args": [
"-y",
"mcp-nevent"
],
"env": {
"NEVENT_JWT_TOKEN": "your-value",
"NEVENT_OPERATION_MODE": "your-value"
}
}
}
}Führe das in deinem Terminal aus
claude mcp add --transport http nevent https://mcp.nevent.ai/claude mcp add nevent --env NEVENT_JWT_TOKEN=your-value --env NEVENT_OPERATION_MODE=your-value -- npx -y mcp-neventTrag die leeren Werte ein, bevor du ihn startest.
In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"nevent": {
"url": "https://mcp.nevent.ai/"
}
}
}In .cursor/mcp.json in deinem Projekt oder in ~/.cursor/mcp.json einfügen
{
"mcpServers": {
"nevent": {
"command": "npx",
"args": [
"-y",
"mcp-nevent"
],
"env": {
"NEVENT_JWT_TOKEN": "your-value",
"NEVENT_OPERATION_MODE": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"nevent": {
"type": "http",
"url": "https://mcp.nevent.ai/"
}
}
}In .vscode/mcp.json in deinem Projekt einfügen
{
"servers": {
"nevent": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"mcp-nevent"
],
"env": {
"NEVENT_JWT_TOKEN": "your-value",
"NEVENT_OPERATION_MODE": "your-value"
}
}
}
}Dein Browser fragt, ob er die App öffnen darf, dann zeigt die App die Einstellungen und bittet dich um Bestätigung. Schlüsselwerte bleiben leer, damit du sie selbst einträgst.
ChatGPT verbindet sich nur mit Servern im Internet:
https://mcp.nevent.ai/Menünamen können sich je nach Tarif und mit der Zeit leicht unterscheiden.
Deine Auswahl bleibt in einem Cookie auf diesem Gerät; kein Konto nötig.
NEVENT_OPERATION_MODE envDiese Einstellungen werden aus dem Registry-Eintrag des Entwicklers erzeugt. Wenn in der README etwas anderes steht, folge der README.
Tool-Namen und -Beschreibungen genau so, wie der Server sie am 10. Nov. 2026 gemeldet hat. Geschrieben hat sie der Entwickler, nicht wir; wir zeigen sie als reinen Text.
nevent_analytics_queryQuery event marketing analytics. Supports dimensions, metrics, time ranges, and filters across campaigns, purchases, fans (user_tenants), and more. MANDATORY RULES: (1) ALWAYS call nevent_analytics_table_schema BEFORE querying to discover exact field names. NEVER guess field name
nevent_analytics_capabilitiesDiscover available analytics tables and their summary metadata. Call this before nevent_analytics_query, then use nevent_analytics_table_schema to learn valid field names for a selected table.
nevent_analytics_table_schemaGet the full column schema for a specific analytics table including column names, types, and descriptions.
nevent_analytics_filter_valuesGet distinct values available for a field in an analytics table. Useful for building valid filter values before querying.
nevent_campaign_reportGenerate the monthly campaign report of the current brand for a calendar month (year + month). Executes 13 parallel queries in one call: marketing campaign metrics for that month and the previous one, ROI and attribution, revenue, variable costs, 24-month purchase history, transa
nevent_segmentation_criteriaList all available audience segmentation criteria including their IDs, operators, and value types.
nevent_segment_previewPreview estimated audience size for a segment definition without saving it. Returns fan count and sample contacts. SEMANTICS: criteria in the same stanza are OR-combined — a fan matches the stanza if ANY criterion matches. Stanzas are AND-combined — a fan must match EVERY stanza.
nevent_segment_executeExecute a segment definition and retrieve matching contacts with pagination. SEMANTICS: criteria in the same stanza are OR-combined — a fan matches the stanza if ANY criterion matches. Stanzas are AND-combined — a fan must match EVERY stanza. To require A AND B, put them in separ
nevent_dimension_valuesAutocomplete values for a segmentation criterion. Useful for discovering valid values when building segment definitions.
nevent_helpGet guidance when you are unsure which tool to call or how to handle an error. Returns structured markdown for the requested topic. Call with topic="workflows" for common patterns, topic="errors" for error code meanings, topic="tenants" for multi-tenant guidance, or topic= like "
nevent_list_tenantsList all Nevent tenants (clients) accessible to the authenticated user. Returns tenant IDs and names for use with nevent_switch_tenant. SUPERADMIN: returns all tenants in the platform. OWNER/ADMIN: returns only your tenant hierarchy subtree (up to 3 levels).
nevent_switch_tenantSwitch the active tenant for this session. All subsequent queries (analytics, segments, campaigns, paid media) will use the specified tenant's data. SUPERADMIN: this mutates your user record in the database — the switch PERSISTS. Always call nevent_reset_tenant when cross-tenant
nevent_reset_tenantRestore the original tenant context set at session start. ALWAYS call this after cross-tenant queries (nevent_switch_tenant) to avoid leaving your SUPERADMIN account pointing to another tenant. For SUPERADMIN users, tenant switches PERSIST in the user record in the database — thi
nevent_get_regional_settingsGet the regional settings of the organization you are working in: reporting currency, time zone, operating country and communication language, each with where it comes from (own, inherited, market or platform default). Use them to show amounts and dates the way the organization w
nevent_list_segmentsCall this FIRST when you need to build or target an audience. Returns all saved segments for the active tenant: id, name, estimated contact count, and last-execution date. Use the returned segment ids to call nevent_get_segment (for the filter definition), nevent_segment_preview
nevent_get_segmentRetrieve the complete filter definition of a specific segment (criteria stanzas, operators, values) along with its estimated contact count and metadata. Call this after nevent_list_segments when you need to inspect, clone, or explain a segment's logic. Next step: nevent_segment_p
nevent_create_segmentCreate and persist a new audience segment from a filter definition. SEMANTICS: criteria in the same stanza are OR-combined — a fan matches the stanza if ANY criterion matches. Stanzas are AND-combined — a fan must match EVERY stanza. To require A AND B, put them in separate stanz
nevent_update_segmentModify an existing segment's name and/or filter definition. Call this after nevent_get_segment to inspect the current definition before changing it. At least one of name or definition must be provided. After update, call nevent_segment_preview to confirm the new audience count be
nevent_create_campaignCreate a new campaign draft (email, SMS, WhatsApp, push, or multi-channel). PREREQUISITES: call nevent_list_segments to get the target segment_id, and nevent_list_templates to get the template_id. The campaign is always created in DRAFT status — no messages are sent. After creati
nevent_schedule_campaignSchedule an existing DRAFT campaign for delivery at a specific ISO-8601 datetime. IMPORTANT: this is a DESTRUCTIVE action — the campaign will be queued for sending to real contacts. You MUST set confirmed=true in the call, which requires explicit user consent. Call nevent_get_cam
nevent_quote_campaignEstimate the credit cost and eligible audience of a campaign BEFORE sending it. Read-only pre-flight check against nev-api POST /campaigns/quote — it never debits credits and never sends. Call this after nevent_create_campaign and before nevent_schedule_campaign: scheduling a cam
nevent_get_campaign_metricsGet the delivery and engagement counters nev-api holds for one campaign: totalRecipients, totalSent, totalDelivered, totalBounces, totalComplaints, totalOpens, uniqueOpens, totalClicks, uniqueClicks, unsubscribes, the derived rates (openRate, clickRate, clickToOpenRate, bounceRat
nevent_list_campaign_recipientsList the individual recipients of a campaign and what happened to each message. Use this to put names behind the aggregate numbers from nevent_get_campaign_metrics: who bounced, who clicked, who unsubscribed. Filter with status (SCHEDULED, DELIVERED, OPENED, CLICKED, BOUNCES, UNS
nevent_list_eventsList the events of the active tenant, one page at a time (nev-api GET /events). Use it to find an event ID before reading its sales with nevent_event_sales_provenance, or to look an event up by name. By default it returns upcoming events ordered by start date; pass future=false f
nevent_event_sales_provenanceWhere the ticket sales of ONE event come from (nev-data-api, analytics warehouse). Pick the event with nevent_list_events (TICKETED events), then choose a view. summary (default): sales grouped by dimension — provider, distribution channel, purchase channel, promo code or marketi
nevent_get_campaign_deliverabilityEmail deliverability of ONE campaign (nev-api, the "Entregabilidad" tab of the campaign). view=summary (default): sent, delivered, soft bounces, hard bounces and complaints, plus a warning when something is off. view=bounce_reasons: why messages bounced, grouped by SES bounce sub
nevent_get_campaign_unsubscribesUnsubscribes and spam complaints of ONE campaign (nev-api). view=summary (default): number of unsubscribes, unsubscribe rate, spam complaints and complaint rate. view=reasons: the reasons people gave when unsubscribing, grouped into canonical buckets. view=segment_breakdown: unsu
nevent_list_campaignsCall this to discover existing campaigns before reporting on performance or scheduling new sends. Returns campaigns for the active tenant with status, channel, send date, and top-level engagement metrics (sent, open rate, click rate). Filter by status (DRAFT/SCHEDULED/SENT/FAILED
nevent_get_campaignRetrieve the complete record of a campaign: email subject and body HTML, sending profile, all delivery and engagement metrics (sent, delivered, opens, clicks, unsubscribes, bounces), and tracked links with click counts. Call this after nevent_list_campaigns to drill into a specif
nevent_get_campaign_insightsGet pre-computed AI analysis for a specific campaign: performance summary, detected anomalies (e.g. unusually high bounce rate), and improvement recommendations. Call this after nevent_get_campaign when the user asks "how did this campaign perform?" or "what could be improved?".
nevent_list_templatesCall this to discover available email templates before creating a campaign. Returns templates for the active tenant: id, name, tags, and whether they use MJML or HTML. Use the returned template id in nevent_create_campaign. Call nevent_get_template to inspect the full HTML/MJML s
nevent_get_templateRetrieve the full content of an email template: MJML source, rendered HTML, tags, and usage metrics (how many campaigns used this template). Call this after nevent_list_templates when the user wants to inspect, copy, or modify a template. Next step: nevent_update_template to chan
nevent_create_templateCreate and persist a new email template with MJML or raw HTML content. Prefer MJML for responsive email (set format="MJML"). The template is saved and available for reuse across campaigns. After creation, call nevent_create_campaign with the returned template id to send it to a s
nevent_update_templateUpdate an existing email template: change the name, MJML/HTML content, or tags. Call nevent_get_template first to inspect the current version before modifying. At least one of name, content, or tags must be provided. Note: updating a template does NOT retroactively change campaig
nevent_clone_templateClone an existing email template to create a duplicate as a starting point for a new campaign. Use after nevent_list_templates to pick a template to duplicate. Returns the new cloned template (id, name with "(Copy)" suffix, format, tags). Typically follow with nevent_rename_templ
nevent_rename_templateRename an email template without modifying its content (lightweight — no re-render triggered). Use after nevent_clone_template to give the clone a proper name, or to reorganize existing templates. Returns the updated template with the new name. Next step: nevent_update_template t
nevent_preview_templatePreview a template with merge tags resolved against a sample user's profile. Returns originalBody (raw {{tags}}) and personalizedBody (tags replaced with user data), plus detectedMergeTags (all unique tags found). Always call before nevent_send_test_template to validate rendering
nevent_send_test_templateSend a test email of the template to one or more email addresses via SES. Use after nevent_preview_template validates rendering. Test emails carry test indicators in headers and are sent via AWS SES. This call may take up to 60 seconds due to SES delivery. Returns success status,
nevent_get_sending_profileCall this before creating a campaign to verify the tenant is ready to send email. Returns: sender domain(s) and their validation status, warm-up phase (cold/warming/warmed), daily send rate cap, throttle settings, and senders: the senders an email campaign can be sent with (ident
nevent_get_suppressions_summaryGet a deliverability health snapshot for the active tenant: total suppressed emails (hard bounces + complaints + manual unsubscribes), 30-day trend, and breakdown by suppression reason. Call this when the user asks about list health, unsubscribe rates, or bounce issues. A suppres
nevent_paid_ads_statusCheck if a paid ads provider account (meta, google, or tiktok) is connected to this tenant and when data was last synced. Call this first before any ads queries to confirm the integration is active. Returns: connected (bool), accountId, accountName, lastSyncAt.
nevent_paid_ads_healthGet operational health signals for a paid ads provider. Always call this before claiming "no data" to the user — it surfaces throttle state, feature gate enrollment, stale syncs, and tier. Key fields: throttle.isThrottled (API throttled), throttle.nextAttemptAt (next retry), feat
nevent_list_paid_campaignsList all paid campaigns synced from a provider (meta, google, or tiktok). Call this to discover campaignId values — you need a campaignId to call insights or ad group tools. Returns campaign IDs, names, statuses, objectives, and budgets. Use the returned campaignId values with ne
nevent_get_paid_campaign_insightsGet daily performance metrics for a specific paid campaign. Use after nevent_list_paid_campaigns to get a valid campaignId. Date range defaults to the last 7 days when from/to are omitted. Returns daily rows with: spend, impressions, reach, frequency, clicks, CTR, CPM, CPC, ROAS,
nevent_paid_attributionGet the most business-focused view of paid ads: links campaigns to actual ticket sales and revenue via UTM matching. Returns per-campaign: ticketsSold, revenue, budget, utmCampaigns (matched UTM values), status. Use this when the user asks about ROI, conversion, or revenue from p
nevent_list_paid_ad_groupsList ad groups (ad sets) for a paid ads provider, optionally filtered by campaign. Use after nevent_list_paid_campaigns to drill down into a campaign's ad sets. Returns ad group IDs, names, statuses, and lastSyncedAt. Use the returned adGroupId values with the ad group insights,
nevent_get_paid_ad_group_insightsGet daily performance metrics for a specific ad group (ad set). Use after nevent_list_paid_ad_groups to get a valid adGroupId. Date range defaults to the last 7 days when from/to are omitted. Returns daily rows with: spend, impressions, reach, frequency, clicks, CTR, CPM, CPC, RO
nevent_get_paid_ad_group_comparative_statsCompare an ad group's performance metrics against the mean of its campaign sibling ad groups. Use to detect underperforming ad sets — each metric (costPerResult, CPM, frequency, CTR) is returned with its campaign sibling mean and ratioVsMean (1.0 = on par). For cost metrics (cost
nevent_get_paid_ad_group_targetingGet the full audience targeting configuration for an ad group. Use after nevent_list_paid_ad_groups to get a valid adGroupId. Returns: ageRange, genders, geoSummary (countries/cities/regions), topInterests, topBehaviors, placements, Advantage+ flags (automaticPlacements, expandAg
nevent_list_paid_adsList individual ads for a paid ads provider, optionally filtered by campaign and/or ad group. Use after nevent_list_paid_campaigns or nevent_list_paid_ad_groups to drill down to ad level. Returns ad IDs, names, statuses, UTM fields (utmSource, utmMedium, utmCampaign, utmContainsM
nevent_get_paid_ad_creativeGet the creative content of a specific ad: copy (body, title, description, CTA), click URL, UTM params, and pre-signed S3 image/video URLs (TTL ~1 hour). Use after nevent_list_paid_ads to get a valid adId. Null imageUrl/videoUrl means the asset mirror job has not run yet — retry
nevent_list_short_urlsList all short URLs for the current tenant with their tracking metrics (click count, last clicked). Use to discover existing campaign links or to audit active tracking URLs. Returns items (array of ShortUrlDTO), total, page, pageSize, totalPages. Key fields per item: id (use with
nevent_get_short_urlGet complete details of a specific short URL including target URL, metadata, creation date, expiration, tags, and current click count. Use after nevent_list_short_urls to get the `id`. Key fields returned: id, shortCode, shortUrl, longUrl, title, tags, metadata, clickCount, lastC
nevent_get_short_url_metricsGet aggregated click analytics for a specific short URL over a time window (default 30 days). Use after nevent_list_short_urls to get the `id`. Returns: totalClicks, uniqueVisitors, firstClickAt, lastClickAt, clicksByDay (date → count), clicksByCountry, clicksByDevice (mobile/des
nevent_get_short_url_campaign_metricsGet aggregated click metrics across a parent short URL and all its per-user variants. Use when a marketing campaign was sent with per-user tracking links (created via nevent_create_bulk_user_short_urls) to see total reach and CTR. Requires the `parentShortCode` from nevent_list_s
nevent_get_short_url_clicksGet individual click event records for a specific short URL, ordered by most recent first. Use after nevent_list_short_urls to get the `id`. Each click record includes: clickedAt, ipAddress, userAgent, referer, country, city, device, browser, os, utmSource, utmCampaign, fbclid, g
nevent_list_short_url_user_linksList all per-user short URL variants created under a parent (campaign) short URL. Use after nevent_create_bulk_user_short_urls to inspect the generated links, or to audit which users have a tracking link for a campaign. Requires the `parentShortCode` from nevent_list_short_urls (
nevent_create_short_urlCreate a new short URL that redirects to the specified destination. Persists immediately — the short code is active as soon as the call returns. Requires at minimum a valid longUrl. All other fields are optional. Returns the created ShortUrlDTO with: id, shortCode, shortUrl (full
nevent_update_short_urlUpdate an existing short URL's configuration. Only provided fields are changed — omitted fields remain unchanged. Changes apply immediately. Use after nevent_list_short_urls to get the `id`. Supported updates: title, expiresAt (pass null to remove expiration), isActive (true/fals
nevent_create_bulk_user_short_urlsGenerate per-user short URL variants for an existing parent short URL. Each user receives their own unique short link that resolves to the same destination as the parent, but identifies the user on click — used for fan-level click attribution in email/SMS campaigns. The parent sh
Wir prüfen Informationen, die jeder sehen kann; den Code haben wir nicht gelesen. Checks, die nicht zutreffen, werden nicht mitgezählt. · Geprüft am 10. Nov. 2026
Der Registry-Name wurde mit dem GitHub-Konto nevent-dev bestätigt, dem das Repo gehört
Code zuletzt geändert: vor 6 Tagen
Dieses Repo haben wir noch nicht von GitHub gelesen
Antwort in 132 ms (HTTP 200)
Keine Anmeldung nötig
Wir haben 60 Tool-Beschreibungen gelesen und keine versteckten Anweisungen an die KI gefunden
Verglichen mit allen aktiven Servern dieser Kategorie in der Registry. Sterne zählen nur, wenn dem Herausgeber das Repo gehört.
Er hat 4 von 4 zutreffenden Basischecks bestanden. Den Code haben wir nicht gelesen. Bevor du einen Schlüssel oder Token hinzufügst, sieh nach, welche Zugriffe der Server verlangt, und nutze einen Schlüssel, der nur die Berechtigungen hat, die du brauchst.
Das musst du eintragen: NEVENT_JWT_TOKEN
Beides geht: Installiere ihn auf deinem Computer oder verbinde dich mit der Cloud-Version.
Das GitHub-Repo wurde zuletzt vor 6 Tagen geändert, und die neueste Version (1.8.0) kam vor 3 Monaten in die Registry.
Apps, die MCP unterstützen, etwa Claude Desktop, Claude Code, Cursor und VS Code. Er verbindet sich per URL, also funktionieren auch Apps, die Remote-MCP-Server akzeptieren, zum Beispiel ChatGPT im Entwicklermodus.
In derselben Kategorie: PostHog MCP Server, Agent-Native Analytics, Openshorts
Server derselben Kategorie von anderen Entwicklern, sortiert nach Sternen.
So liest du eine Karte:↓ Downloads pro Wochei★ GitHub-SterneiDrei Säulen: Bewertungen · Checks · NutzungiAktualisiert = neueste Version in der Registry veröffentlichti
Official PostHog MCP Server for product analytics, feature flags, experiments, and more.
Agent-Native Amplitude/Mixpanel - connect data sources, prompt for charts
Turn long videos into viral vertical shorts and publish them to TikTok, Instagram and YouTube.
Unverändert aus dem Repo des Entwicklers übernommen. PopNx MCP hat den Inhalt weder geprüft noch empfiehlt es ihn. HTML, Bilder und Skripte wurden entfernt. Links führen von dieser Website weg.
Talk to your live-events CRM (campaigns, analytics, paid ads, segments, short URLs) in Claude and ChatGPT.
Official MCP server for Nevent — the marketing platform for live event promoters. 63 tools across 10 groups (analytics, segmentation, campaigns, templates, deliverability, paid media, short URLs, media library, multi-tenant, and help/discovery) over OAuth 2.1 (hosted) or stdio (local).
📚 Full documentation: [https://help.nevent.ai/en/nevent-ai/](https://help.nevent.ai/en/nevent-ai/)
Add https://mcp.nevent.ai/ as a remote MCP server in your client. Works with Claude.ai, ChatGPT, Cursor, Cline, Continue and any compatible MCP client.
→ Step-by-step with screenshots: Connect with Claude · Connect with ChatGPT
npx mcp-nevent
Required env: NEVENT_JWT_TOKEN. Optional: NEVENT_OPERATION_MODE (READ_ONLY | STANDARD | FULL).
→ Full local setup: Local installation
Settings → Integrations / Connectors → Add custom MCP → URL https://mcp.nevent.ai/. Authorize with your Nevent admin account.
# Hosted (OAuth)
claude mcp add --transport http nevent https://mcp.nevent.ai/
claude mcp add nevent -- node /path/to/mcp-nevent/dist/index.js export NEVENT_JWT_TOKEN=your_token
→ Full guide: Claude Code
Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": { "nevent": { "command": "node", "args": ["/path/to/mcp-nevent/dist/index.js"], "env": { "NEVENT_JWT_TOKEN": "your_nevent_jwt_token" } } } }
→ Full guide: Claude Desktop
→ Per-client setup: Cursor, Cline, Continue, VS Code
"Show me registrations for EventX broken down by ticket type"
"Which campaigns sent last month had an open rate above 30%?"
"Create a segment of attendees who bought a VIP ticket in 2025 but haven't opened any email in the last 90 days"
"Schedule the 'Summer Gala' campaign for next Monday at 10:00 CET"
"Compare ROAS across our Meta ad campaigns for March"
"Create per-user tracking links for the Summer Gala campaign and show me which users clicked"
→ More patterns: Ready-to-use prompts · Use cases
| Topic | Link |
|---|---|
| What Nevent AI is and how it works | https://help.nevent.ai/en/nevent-ai/ |
| Capabilities by area (analytics, campaigns, audience, paid media…) | https://help.nevent.ai/en/nevent-ai/what-you-can-do/ |
| End-to-end use cases | https://help.nevent.ai/en/nevent-ai/use-cases/ |
| Permissions and security | https://help.nevent.ai/en/nevent-ai/permissions-and-security/ |
| FAQ | https://help.nevent.ai/en/nevent-ai/faq/ |
| Topic | Link |
|---|---|
| Overview, transports and architecture | https://help.nevent.ai/en/nevent-ai/developers/ |
| Local installation and env vars | https://help.nevent.ai/en/nevent-ai/developers/local-installation/ |
| Multi-tenant model | https://help.nevent.ai/en/nevent-ai/developers/multi-tenant/ |
| Reference of all 63 tools | https://help.nevent.ai/en/nevent-ai/developers/tools/ |
| Troubleshooting and error codes | https://help.nevent.ai/en/nevent-ai/developers/troubleshooting/ |
LLM (Claude / ChatGPT / Cursor / …)
| | MCP (Streamable HTTP or stdio) v ┌─────────────────┐ │ Nevent MCP │ mcp.nevent.ai (hosted) or local └─────────────────┘ | | REST + JWT v Nevent APIs (analytics, campaigns, segments, paid media, short URLs)
Hosted mode uses OAuth 2.1: the MCP server issues short-lived JWT tokens after validating your Nevent credentials. Each session is isolated — no shared service accounts.
Optional environment variables for the HTTP server:
| Variable | Default | Purpose |
|---|---|---|
MCP_READONLY_REDIRECT_PREFIXES | unset | Comma-separated redirect_uri prefixes. A client that registered a matching redirect URI only gets read-only tools. Every prefix must end with `/`, for example https://support.nevent.ai/helpbot/. |
MCP_READONLY_CLIENT_IDS | unset | Comma-separated client_id values restricted the same way. |
MCP_REFRESH_REVALIDATE | restricted | restricted, all or off: which clients are revalidated against nev-api (GET /auth/me) when they refresh a token. |
MCP_REFRESH_MAX_LIFETIME_DAYS | 90 | Maximum total lifetime of a refresh-token chain, counted from the original login. |
See CHANGELOG.md for the exact behaviour.
MCP_AUTH_MODE=bearer-passthrough is a second HTTP auth mode for trusted clients that already hold a per-user nev-api JWT and want to call MCP tools on that user's behalf — for example nev-helpbot, the Chatwoot support bot, answering as the promoter currently chatting.
MCP_AUTH_MODE=bearer-passthrough \
MCP_BEARER_PASSTHROUGH_SERVICE_KEY=$(openssl rand -hex 32) \ node dist/index.js --transport=http --port=3000
Every request must carry BOTH the client's service key and the calling user's own nev-api JWT:
X-Nevent-Service-Key: <pre-shared service key>
Authorization: Bearer
MCP_BEARER_PASSTHROUGH_SERVICE_KEY (at least 32 characters) is required: the server refuses to start without it. It is compared in constant time (crypto.timingSafeEqual over SHA-256 digests) and checked before the token is introspected, so outsiders cannot make this server call nev-api. A missing or wrong key gets a bare 401 (Unauthorized.) with no hint of which check failed. For rotation, set MCP_BEARER_PASSTHROUGH_SERVICE_KEY_PREVIOUS to the old key while the client moves to the new one, then remove it. Keep it in a secret store, never in the repository. Requests are also capped per IP (600/min, applied before body parsing) and per token (300/min). GET /health is unauthenticated for load balancers and returns only {status, version, commitSha}.MCP_BEARER_PASSTHROUGH_WRITES=human additionally exposes, to sessions of a person (principalType HUMAN verified in /auth/me), 12 write tools: nevent_create_segment, nevent_update_segment, nevent_create_template, nevent_update_template, nevent_clone_template, nevent_rename_template, nevent_send_test_template, nevent_create_campaign, nevent_schedule_campaign, nevent_create_short_url, nevent_update_short_url, nevent_create_bulk_user_short_urls. SERVICE sessions never get writes. upload_image, delete_image, reset_tenant, switch_tenant and list_tenants are never exposed, and an unclassified tool is denied. The policy is fixed per session at initialize. Writes are not safe to enable yet: the real barrier is the signed single-use write grant (NEV-1855), so the server refuses to start with human until that exists (override for non-production only: MCP_BEARER_PASSTHROUGH_WRITES_UNSAFE_NO_GRANT=true). Each tenant+user is limited to MCP_BEARER_PASSTHROUGH_WRITES_PER_HOUR writes per hour (default 30; over it, a write_rate_limit_exceeded tool error and nothing is executed; READ is never limited). Every tool call is logged with user_id, principal_type and the verified tenant (no email or token). Calls also need NEVENT_OPERATION_MODE=STANDARD for writes and FULL for nevent_schedule_campaign (classified DELETE because it sends for real); startup refuses human with READ_ONLY. The hourly limit is per process (in memory, each instance has its own budget, a restart resets it), counts only calls that actually execute (not invalid arguments, not calls the operation-mode guard rejects; a handler that fails does count) and accepts 1-1000. The no-grant override is rejected when NODE_ENV=production.MONGODB_URI stays optional: set it to also enable the Mongo-backed read tools (campaigns/templates/deliverability), each still scoped by the caller's own JWT tenant.initialize, tools/list, tools/call, not only at session start — this server calls GET {NEVENT_API_URL}/auth/me with the forwarded token. A 200 confirms the session is live and the request proceeds; 401, 403, a network error, or a timeout are all treated the same way — the MCP request is rejected with 401 and no tool, no `tools/list`, and no session is ever created or advanced from it. There is no permissive fallback: if nev-api cannot be reached to confirm the token, the request is refused, it is never let through anyway./auth/me on every message, but the cache never serves an entry past the token's own expiry.stdio mode's shared NEVENT_JWT_TOKEN.GET /auth/me also reports principalType (HUMAN or SERVICE), effectiveTenantId and serviceSession. Technical service sessions minted by POST /auth/service-token (unattended agents) are accepted like a human token only with `TENANT` scope (PLATFORM, i.e. global SUPERADMIN, is refused). The session is locked to effectiveTenantId, which comes only from this answer (never from the JWT payload; also correct for hierarchical admins navigating a child tenant). Fail-closed: an unknown principalType, a SERVICE response without effectiveTenantId, or any response with no tenant at all is refused. A SERVICE verification is cached for 10 s instead of 60 s so a disabled account or revoked session stops working almost immediately.