# Nevent MCP (remote · mcp.nevent.ai)

Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT.

- Trust score: 78/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `mcp.nevent.ai`: 78/100 (this document), [markdown](https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2.md), [page](https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2)
- npm · `mcp-nevent`: 49/100, [markdown](https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-nevent.md), [page](https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-nevent)

## Channel facts

- Endpoint: `https://mcp.nevent.ai/`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.8.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (nevent_update_segment).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 69/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 12704 tokens (~215/item across 59 items; 59 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 90/100
  - Stability observed for 27 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 92/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 2 of 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "nevent_segment_execute" implies "execute" and declares readOnlyHint instead, contradicting what its own name says it does.
  - An AI judge read all 60 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the Nevent MCP server?

Nevent MCP is a hosted endpoint at https://mcp.nevent.ai/, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http nevent-dev-mcp-nevent 'https://mcp.nevent.ai/'
```

### Cursor

```json
{
  "mcpServers": {
    "nevent-dev-mcp-nevent": {
      "url": "https://mcp.nevent.ai/"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "nevent-dev-mcp-nevent": {
      "type": "http",
      "url": "https://mcp.nevent.ai/"
    }
  }
}
```

### Codex

```toml
[mcp_servers.nevent-dev-mcp-nevent]
url = "https://mcp.nevent.ai/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "nevent-dev-mcp-nevent": {
      "type": "remote",
      "url": "https://mcp.nevent.ai/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add nevent-dev-mcp-nevent --url 'https://mcp.nevent.ai/' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  nevent-dev-mcp-nevent:
    url: "https://mcp.nevent.ai/"
```

### Netclaw

```json
{
  "McpServers": {
    "nevent-dev-mcp-nevent": {
      "Transport": "http",
      "Url": "https://mcp.nevent.ai/"
    }
  }
}
```

### Vellum

```bash
assistant mcp add nevent-dev-mcp-nevent -t streamable-http -u 'https://mcp.nevent.ai/'
```

### Other

```json
{
  "mcpServers": {
    "nevent-dev-mcp-nevent": {
      "type": "http",
      "url": "https://mcp.nevent.ai/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-20 (score 78, +1)

No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-18 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-16 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-13 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-11 (score 74, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-10 (score 73, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “nevent_segment_execute” rewrote its description, which is the text the model reads
- [security] Tool “nevent_segment_preview” rewrote its description, which is the text the model reads
- [security] Tool “nevent_create_segment” rewrote its description, which is the text the model reads
- [cosmetic] “nevent_create_segment” reworded the description of “definition”
- [cosmetic] “nevent_segment_execute” reworded the description of “definition”
- [cosmetic] “nevent_segment_preview” reworded the description of “definition”
- [cosmetic] “nevent_update_segment” reworded the description of “definition”

### 2026-09-09 (score 73, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-09-07 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (59)

### `nevent_analytics_query` (~544 tokens)

Query event marketing analytics. Supports dimensions, metrics, time ranges, and filters across campaigns, purchases, users, and more. MANDATORY RULES: (1) ALWAYS call nevent_analytics_table_schema BEFORE querying to discover exact field names. NEVER guess field names. (2) For BOOLEAN fields, use operator "is_true" or "is_false". NEVER use "eq" with string "true"/"false". (3) For enum fields (state, status), check the field description for valid values. Common values: purchases.state = SUCCEEDED|COMPLETE|PENDING|FAILED; campaigns.status = EXECUTED|DRAFT|PAUSED|STOPPED.

Input parameters:

- `collection` (string, required): Collection name, e.g. "purchases", "tickets", "campaigns"
- `compareDimensions` (object): Comparative dimension analysis configuration
- `comparePeriods` (object): Period-over-period comparison (YoY, MoM, etc.) — v3.19.0+
- `ctes` (array): CTE (Common Table Expression) sub-queries — v3.19.0+
- `dimensions` (array): Fields to group by (SELECT dimensions). Omit for aggregate-only queries.
- `distinct` (boolean): Add SELECT DISTINCT to deduplicate result rows (v3.19.0+)
- `dryRun` (boolean): Dry-run mode: estimate query cost without executing (v3.19.0+). Response includes estimatedBytes in metadata.
- `filters` (array): WHERE clause filters to apply before aggregation
- `groupBy` (array): Calendar-based group-by fields (v3.19.0+). Known values: dayOfWeek | weekOfYear | hourOfDay | minuteOfHour | month | quarter | year
- `having` (array): HAVING clause filters to apply after aggregation
- `limit` (number): Maximum rows to return (max 1000, default 100)
- `metrics` (array): Aggregated metrics to compute (SUM, COUNT, etc.)
- `sort`: Sort the result rows. Accepts a single { field, order } object or an array for multi-field sorting.
- `sourceTable` (string): CTE name to use as source instead of a raw collection — v3.19.0+
- `timeGranularity` (string): Time granularity for bucketing (v3.19.0+). Known values: day | week | month | quarter | year | hour | minute | fiscalQuarter | fiscalYear
- `timeRange` (object): Time range filter with optional granularity for trend analysis

### `nevent_analytics_capabilities` (~48 tokens)

Discover 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_schema` (~52 tokens)

Get the full column schema for a specific analytics table including column names, types, and descriptions.

Input parameters:

- `table` (string, required): Table name to inspect, e.g. "purchases", "tickets"

### `nevent_analytics_filter_values` (~60 tokens)

Get distinct values available for a field in an analytics table. Useful for building valid filter values before querying.

Input parameters:

- `collection` (string, required): Collection name to get filter values for
- `filters` (array, required): Fields to get distinct values for

### `nevent_campaign_report` (~99 tokens)

Generate a comprehensive analytics report for a single campaign. Executes 13 parallel queries in one call returning opens, clicks, bounces, unsubscribes, conversions, revenue, and other key performance metrics. Use nevent_list_campaigns to get valid campaign IDs.

Input parameters:

- `campaignId` (string, required): Campaign ID to generate the analytics report for
- `timeRange` (object): Optional time range to restrict report data. Defaults to full campaign lifetime.

### `nevent_segmentation_criteria` (~28 tokens)

List all available audience segmentation criteria including their IDs, operators, and value types.

### `nevent_segment_preview` (~361 tokens)

Preview 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. To require A AND B, put them in separate stanzas; to accept A OR B, put both in the same stanza. MANDATORY RULES: (1) ENTITY operators (is/is_not) accept a single string OR an array of strings (e.g. value: "EVENT_ID" or value: ["EVENT_1","EVENT_2"]). (2) Do NOT include modifiers unless specifically asked for frequency or recency filtering. If included, time_range.value MUST be > 0. KNOWN LIMITATION: Do NOT combine attendance criteria (attended_event, ticket_type) with spending criteria (total_spent, ticket_spent, cashless_recharge_amount) in the SAME stanza. Put them in SEPARATE stanzas. Example — attended EVENT_ID AND spent >= 200, because a fan must match EVERY stanza: { stanzas: [{ criteria: [{ criterion_id: "attended_event", operator: "is", value: "EVENT_ID" }] }, { criteria: [{ criterion_id: "total_spent", operator: "gte", value: 200 }] }] }.

Input parameters:

- `definition` (object, required): Segment DSL. 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 s…

### `nevent_segment_execute` (~188 tokens)

Execute 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 separate stanzas; to accept A OR B, put both in the same stanza.

Input parameters:

- `definition` (object, required): Segment DSL. 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 s…
- `page` (number): Zero-based page index (default 0)
- `page_size` (number): Results per page (max 100, default 20)

### `nevent_dimension_values` (~70 tokens)

Autocomplete values for a segmentation criterion. Useful for discovering valid values when building segment definitions.

Input parameters:

- `criterion_id` (string, required): Criterion ID from nevent_segmentation_criteria, e.g. "country", "event_attended"
- `search` (string): Optional search string to filter matching values

### `nevent_help` (~145 tokens)

Get 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=<category> like "paid_media" / "analytics" / "segments". Omit topic to get an index of all available topics.

Input parameters:

- `topic` (string): Topic to get guidance on. Omit to get an index of all available topics. Values: workflows | errors | tenants | analytics | segments | campaigns | templates | deliverability | paid_media | short_urls…

### `nevent_list_tenants` (~66 tokens)

List 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_tenant` (~216 tokens)

Switch 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 work is done to avoid leaving your account pointing at another tenant. OWNER/ADMIN/STAFF: session-scoped only; you can only switch to tenants in your hierarchy subtree (max 3 levels deep). Use nevent_list_tenants to discover available tenant IDs.

Input parameters:

- `tenant_id` (string, required): The tenant ID to activate for this MCP session. All subsequent analytics, segmentation, campaign, and paid media queries will use this tenant's data. Use nevent_list_tenants to discover available ten…

### `nevent_reset_tenant` (~93 tokens)

Restore 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 — this tool reverses that. For OWNER/ADMIN/STAFF users, this resets to the session's home tenant. No parameters needed.

### `nevent_list_segments` (~87 tokens)

Call 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 (to verify the audience), or nevent_create_campaign (to send a campaign to that segment).

### `nevent_get_segment` (~104 tokens)

Retrieve 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_preview to count the audience, or nevent_update_segment to modify the definition.

Input parameters:

- `segment_id` (string, required): Identifier of the segment to retrieve. Get valid IDs from nevent_list_segments.

### `nevent_create_segment` (~423 tokens)

Create 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 stanzas; to accept A OR B, put both in the same stanza. PREREQUISITE: call nevent_segmentation_criteria first to discover valid criterion_ids and operators. MANDATORY RULES: (1) ENTITY operators (is/is_not) accept a single string OR an array of strings — e.g. value: "EVENT_ID" or value: ["E1","E2"]. (2) Omit modifiers unless the user explicitly requests frequency/recency filtering; if included, time_range.value MUST be > 0. (3) Criteria fields: only criterion_id, operator, value — omit id, timeframe, type. (4) KNOWN LIMITATION: do NOT mix attendance criteria (attended_event, ticket_type) with spending criteria (total_spent, ticket_spent, cashless_recharge_amount) in the same stanza — put them in separate stanzas. Separate stanzas are AND-combined, so a fan must match both. After creation, call nevent_segment_preview to count the audience, then nevent_create_campaign to send to this segment.

Input parameters:

- `definition` (object, required): Segment DSL. 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 s…
- `description` (string): Optional description of the segment's purpose
- `name` (string, required): Human-readable name for the segment, e.g. "VIP Attendees 2025"

### `nevent_update_segment` (~173 tokens)

Modify 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 before scheduling a campaign.

Input parameters:

- `definition` (object): Replacement segment DSL. The full definition is replaced when provided. Criteria in the same stanza are OR-combined: a fan matches the stanza if ANY criterion matches. Stanzas are AND-combined: a fan…
- `name` (string): New human-readable name for the segment. Omit to leave unchanged.
- `segment_id` (string, required): Identifier of the segment to update. Use nevent_list_segments to get valid segment IDs.

### `nevent_create_campaign` (~645 tokens)

Create 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 creation, call nevent_schedule_campaign to schedule delivery. For EMAIL_ONLY (and email multi-channel): email_subject is required. For SMS_ONLY/WHATSAPP_ONLY/PUSH_ONLY and multi-channel involving those: message is required. Optional fields: from_name, preview_text, template_id, segment_ids, utm_source/medium/campaign/content/term/custom_params, reply_to (email address for reply routing — useful when replies should go to a different mailbox than the From address). Always confirm the segment audience count with the user before scheduling.

Input parameters:

- `channel` (string, required): Delivery channel (nev-api CommunicationChannel enum). Use EMAIL_ONLY, SMS_ONLY, WHATSAPP_ONLY, PUSH_ONLY for single-channel; EMAIL_AND_SMS, EMAIL_AND_WHATSAPP, PUSH_AND_SMS, PUSH_AND_WHATSAPP, SMS_AN…
- `email_body` (string): HTML body content of the email (optional, can be set later)
- `email_subject` (string): Email subject line (required when channel=EMAIL, max 998 chars per RFC 5322)
- `from_name` (string): Sender display name (optional, defaults to tenant sender name)
- `message` (string): Message text body (required when channel=SMS or WHATSAPP)
- `name` (string, required): Campaign name (required, max 255 characters)
- `preview_text` (string): Inbox preview text (optional, shown in email client summaries)
- `reply_to` (string): Reply-To email address (optional). Recipients' replies go to this address instead of the From address. Must be a valid email, max 254 chars. Only meaningful for email-bearing channels.
- `segment_ids` (array): Array of segment IDs to target (optional, can be set later)
- `template_id` (string): Template ID to pre-populate campaign content (optional)
- `utm_campaign` (string): UTM campaign parameter (e.g. "summer-sale-2026"). Max 100 chars. Defaults to slugified campaign name.
- `utm_content` (string): UTM content parameter — differentiates links/variants. Max 100 chars.
- `utm_custom_params` (object): Custom tracking parameters as key-value pairs appended to tracked links (optional).
- `utm_medium` (string): UTM medium parameter (e.g. "email", "sms"). Max 100 chars. Auto-detected from channel if omitted.
- `utm_source` (string): UTM source parameter (e.g. "nevent", "newsletter"). Max 100 chars.
- `utm_term` (string): UTM term parameter — paid search keyword. Max 100 chars.

### `nevent_schedule_campaign` (~229 tokens)

Schedule 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_campaign first to verify the draft content and recipient segment. scheduled_time must be in the future (ISO-8601, e.g. 2025-06-01T10:00:00Z). The campaign transitions from DRAFT to SCHEDULED status on success.

Input parameters:

- `campaign_id` (string, required): Campaign ID to schedule (must be in DRAFT status)
- `confirmed` (boolean, required): Must be the literal value true to proceed. Set confirmed=true to confirm you want to schedule this campaign for sending.
- `scheduled_time` (string, required): ISO 8601 datetime for scheduled send (must be in the future). Example: "2026-05-01T10:00:00Z" or "2026-05-01T10:00:00+02:00"

### `nevent_quote_campaign` (~372 tokens)

Estimate 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 campaign the tenant cannot afford fails at send time with a 402. Returns cost (credits required), available (credits in the pool), missing (shortfall), recipientCount, affordable (boolean — the gate to check), blocked, unlimited, and an audience block with uniqueAudience, estimatedEligible per channel, eligibleAnyChannel and emailExclusions (no_email / invalid_email / opt_out / unknown). The audience block is null when the estimate could not be computed: any channel mix touching WhatsApp, more than 20 segments, or a data-api timeout — cost and recipientCount are still valid in that case. Use segment_ids from nevent_list_segments; omit them to quote the full addressable audience. Set transactional=true only for genuinely transactional sends (order confirmations, ticket delivery) — it estimates against the TRANSACTIONAL consent mode, which reaches recipients who opted out of marketing.

Input parameters:

- `channel` (string, required): Delivery channel to quote (nev-api CommunicationChannel enum). Legacy values EMAIL/SMS/WHATSAPP are accepted and mapped to the _ONLY variants. Channel mixes involving WhatsApp return a null audience…
- `segment_ids` (array): Segment IDs to quote (optional, max 20). Omit to quote the full addressable audience for the channel. More than 20 segments makes the backend skip the audience estimate.
- `transactional` (boolean): Whether this is a transactional campaign (default false). Transactional uses the TRANSACTIONAL consent mode for the audience estimate, which reaches recipients who have opted out of marketing.

### `nevent_get_campaign_metrics` (~231 tokens)

Get 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, bounceRate, unsubscribeRate) and the conversion counters (carts, purchases, revenue). This is the OPERATIONAL source of truth, read straight from nev-api — use it right after a send, and prefer it over nevent_campaign_report when the two disagree, because the report reads the analytics warehouse and lags behind by the data pipeline. Use nevent_campaign_report instead when you need to compare many campaigns, slice by dimension, or join against other analytics. Get campaign_id from nevent_list_campaigns. Follow up with nevent_list_campaign_recipients to see who is behind a number (for example which recipients bounced).

Input parameters:

- `campaign_id` (string, required): Campaign ID. Get it from nevent_list_campaigns, or from the response of nevent_create_campaign.

### `nevent_list_campaign_recipients` (~366 tokens)

List 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, UNSUBSCRIBES), narrow to one audience with segment_id when the campaign targeted several segments, or find one person with search (matches name and email). Returns a paginated envelope — content (the recipient rows), page, size, totalElements, totalPages. Rows contain personal data: request the smallest page that answers the question, filter rather than paginate through everything, and do not dump full recipient lists into a summary.

Input parameters:

- `campaign_id` (string, required): Campaign ID. Get it from nevent_list_campaigns, or from the response of nevent_create_campaign.
- `page` (integer): Zero-based page number. Default: 0 (first page).
- `page_size` (integer): Recipients per page (1-100). Default: 25. Keep this small — recipient rows contain personal data and large pages waste context.
- `search` (string): Free-text search across recipient name and email address.
- `segment_id` (string): Restrict the listing to recipients that came from one segment. Useful on multi-segment campaigns to compare which segment engaged. Get segment IDs from nevent_list_segments.
- `status` (string): Filter recipients by delivery state. SCHEDULED = queued but not sent; DELIVERED = accepted by the receiving server; OPENED / CLICKED = engaged; BOUNCES = delivery failed; UNSUBSCRIBES = opted out fro…

### `nevent_list_campaigns` (~290 tokens)

Call 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), channel (EMAIL/SMS), or date range. Use the returned campaign id to call nevent_get_campaign (full content + metrics) or nevent_get_campaign_insights (AI analysis).

Input parameters:

- `channel` (string): Filter by channel: EMAIL | SMS | WHATSAPP
- `date_from` (string): Filter campaigns created on or after this date (ISO 8601, e.g. "2024-01-01T00:00:00Z")
- `date_to` (string): Filter campaigns created on or before this date (ISO 8601, e.g. "2024-12-31T23:59:59Z")
- `limit` (integer): Maximum number of campaigns to return (default 50, max 200)
- `sort` (string): Field to sort by: createdAt (default) | executedAt | name
- `sort_order` (string): Sort direction: asc | desc (default desc)
- `status` (string): Filter by campaign status: EXECUTED | DRAFT | PAUSED | STOPPED | SCHEDULED

### `nevent_get_campaign` (~118 tokens)

Retrieve 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 specific campaign. Next step: nevent_get_campaign_insights for AI-generated recommendations, or nevent_campaign_report for a full analytics query.

Input parameters:

- `campaign_id` (string, required): The campaign Identifier. Use nevent_list_campaigns to discover valid campaign IDs.

### `nevent_get_campaign_insights` (~102 tokens)

Get 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?". Complements raw metrics from nevent_get_campaign with narrative insights.

Input parameters:

- `campaign_id` (string, required): The campaign Identifier. Use nevent_list_campaigns to discover valid campaign IDs.

### `nevent_list_templates` (~209 tokens)

Call 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 source of a specific template.

Input parameters:

- `content_nature` (string): Filter by AI-assigned content nature classification (e.g. "promotional", "transactional", "newsletter", "event_reminder"). Omit to return templates of all natures.
- `limit` (integer): Maximum number of templates to return (default 50, max 200)
- `sort` (string): Sort field: createdAt | modifiedAt | name (default modifiedAt)
- `sort_order` (string): Sort direction: asc | desc (default desc)
- `tags` (array): Filter templates by tags. Only templates that have ALL specified tags are returned. Omit to return templates regardless of tags.

### `nevent_get_template` (~110 tokens)

Retrieve 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 change the content, or nevent_create_campaign to use this template in a new campaign.

Input parameters:

- `template_id` (string, required): The Identifier of the template to retrieve. Get valid IDs from nevent_list_templates.

### `nevent_create_template` (~207 tokens)

Create 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 segment.

Input parameters:

- `format` (string, required): Template format: "html" for raw HTML, "mjml" for MJML source code
- `html_body` (string): Raw HTML content for the template. Provide this field when format is "html".
- `mjml_body` (string): MJML source code for the template. Provide this field when format is "mjml".
- `name` (string, required): Human-readable name for the template, e.g. "Event Reminder — Spring 2026"
- `tags` (array): List of string tags to categorise the template (e.g. ["promotional", "event", "reminder"]). Omit to create with no tags.

### `nevent_update_template` (~214 tokens)

Update 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 campaigns already sent with it.

Input parameters:

- `format` (string): New template format: "html" or "mjml". Omit to leave unchanged.
- `html_body` (string): New raw HTML content for the template. Omit to leave unchanged.
- `mjml_body` (string): New MJML source code for the template. Omit to leave unchanged.
- `name` (string): New human-readable name for the template. Omit to leave unchanged.
- `tags` (array): Replacement list of tags. The full tag list is replaced when provided. Omit to leave existing tags unchanged.
- `template_id` (string, required): Identifier of the template to update. Use nevent_list_templates to get valid template IDs.

### `nevent_clone_template` (~125 tokens)

Clone 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_template and nevent_update_template to customize the clone.

Input parameters:

- `template_id` (string, required): The ID of the email template to clone. Use nevent_list_templates to discover valid template IDs. The clone will have a new unique ID and its name will be suffixed with "(Copy)".

### `nevent_rename_template` (~136 tokens)

Rename 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 to change content, or nevent_preview_template to validate rendering.

Input parameters:

- `name` (string, required): The new name for the template. Must be between 1 and 255 characters. Duplicate names are allowed by the API.
- `template_id` (string, required): The ID of the email template to rename. Use nevent_list_templates to get valid template IDs.

### `nevent_preview_template` (~243 tokens)

Preview 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. Provide sample_user_id or sample_user_email to see real personalization; omit both to see raw tags only.

Input parameters:

- `sample_user_email` (string): Optional user email to look up within the active tenant for merge-tag personalization. Ignored when sample_user_id is also provided. Omit to return raw merge tags only.
- `sample_user_id` (string): Optional MongoDB user ID for merge-tag personalization. When provided, {{name}}, {{email}} and custom fields are resolved from this user's profile. Takes priority over sample_user_email. Omit to retu…
- `subject` (string): Optional subject line to preview with merge-tag resolution. Example: "Hola {{name|title}}, tu resumen semanal". Omit to skip subject personalization.
- `template_id` (string, required): The ID of the email template to preview. Use nevent_list_templates to discover valid template IDs.

### `nevent_send_test_template` (~317 tokens)

Send 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, list of recipients the email was sent to, and any error details.

Input parameters:

- `emails` (array, required): List of email addresses to send the test email to. Each entry must be a valid email address. Minimum 1, maximum 10 recipients. Example: ["qa@example.com", "dev@company.com"].
- `parameters` (object): Optional custom parameters for merge-tag substitution in the test email. Key-value pairs where keys match merge tag names. Example: {name: "Juan", city: "Madrid"}. When provided, overrides sample use…
- `sample_user_email` (string): Optional user email within the active tenant for merge-tag personalization. Ignored when sample_user_id is also provided.
- `sample_user_id` (string): Optional user ID for merge-tag personalization in the test email. When provided, {{name}}, {{email}} and custom fields are resolved from this user's profile. Takes priority over sample_user_email.
- `subject` (string): Optional subject line for the test email. Omit to use the default subject from the template.
- `template_id` (string, required): The ID of the email template to send as a test. Use nevent_list_templates to discover valid template IDs.

### `nevent_get_sending_profile` (~97 tokens)

Call 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, and throttle settings. If the sending profile is not validated or still in warm-up, warn the user before scheduling a large campaign. Combine with nevent_get_suppressions_summary for a full deliverability health check.

### `nevent_get_suppressions_summary` (~90 tokens)

Get 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 suppression rate above 2% indicates deliverability risk — surface this as a warning before scheduling a large campaign.

### `nevent_paid_ads_status` (~85 tokens)

Check 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.

Input parameters:

- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_paid_ads_health` (~130 tokens)

Get 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), featureGate.isInTenantAllowlist (pilot access), lastSuccessfulSyncAt, lastSuccessfulInsightsAt, backfillEnabled. A 404 here means this tenant is not enrolled in the insights pilot for this provider.

Input parameters:

- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_list_paid_campaigns` (~101 tokens)

List 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 nevent_get_paid_campaign_insights and nevent_list_paid_ad_groups.

Input parameters:

- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_get_paid_campaign_insights` (~233 tokens)

Get 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, engagement rate, video metrics. Each row.date is an ISO 8601 UTC timestamp (e.g. "2026-05-10T00:00:00Z"). A 404 may mean this tenant is not enrolled in the insights pilot — call nevent_paid_ads_health to confirm.

Input parameters:

- `campaignId` (string, required): Paid campaign ID from the provider (not a Nevent ObjectId). Use nevent_list_paid_campaigns to get valid campaignId values.
- `from` (string): Start date for insights window (yyyy-MM-dd). Defaults to 7 days ago when omitted.
- `provider` (string, required): Ad provider: meta | google | tiktok
- `to`: End date for insights window (yyyy-MM-dd). Defaults to today when omitted.

### `nevent_paid_attribution` (~105 tokens)

Get 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 paid ads. Use after nevent_list_paid_campaigns to cross-reference campaign IDs.

Input parameters:

- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_list_paid_ad_groups` (~130 tokens)

List 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, targeting, and comparative stats tools.

Input parameters:

- `campaignId` (string): Optional: filter ad groups by parent campaign ID. Use nevent_list_paid_campaigns to get valid campaignId values.
- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_get_paid_ad_group_insights` (~237 tokens)

Get 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, ROAS, engagement rate, video metrics. Each row.date is an ISO 8601 UTC timestamp (e.g. "2026-05-10T00:00:00Z"). A 404 may mean this tenant is not enrolled in the insights pilot — call nevent_paid_ads_health to confirm.

Input parameters:

- `adGroupId` (string, required): Ad group (ad set) ID from the provider. Use nevent_list_paid_ad_groups to get valid adGroupId values.
- `from` (string): Start date for insights window (yyyy-MM-dd). Defaults to 7 days ago when omitted.
- `provider` (string, required): Ad provider: meta | google | tiktok
- `to`: End date for insights window (yyyy-MM-dd). Defaults to today when omitted.

### `nevent_get_paid_ad_group_comparative_stats` (~257 tokens)

Compare 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 (costPerResult, CPM, frequency): ratio > 1.0 means WORSE than siblings (higher cost). For CTR: ratio > 1.0 means BETTER than siblings (higher CTR is better). Use after nevent_list_paid_ad_groups to get a valid adGroupId. A 404 may mean this tenant is not enrolled in the insights pilot — call nevent_paid_ads_health to confirm.

Input parameters:

- `adGroupId` (string, required): Ad group (ad set) ID from the provider. Use nevent_list_paid_ad_groups to get valid adGroupId values.
- `from` (string): Start date for the comparison window (yyyy-MM-dd). Defaults to 7 days ago when omitted.
- `provider` (string, required): Ad provider: meta | google | tiktok
- `to`: End date for the comparison window (yyyy-MM-dd). Defaults to today when omitted.

### `nevent_get_paid_ad_group_targeting` (~166 tokens)

Get 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, expandAge, expandGender), custom and excluded audiences, bidStrategy, promotedObject. A 404 may mean this tenant is not enrolled in the insights pilot — call nevent_paid_ads_health to confirm.

Input parameters:

- `adGroupId` (string, required): Ad group (ad set) ID from the provider. Use nevent_list_paid_ad_groups to get valid adGroupId values.
- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_list_paid_ads` (~179 tokens)

List 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, utmContainsMacros), and lastSyncedAt. Use the returned adId values with nevent_get_paid_ad_creative.

Input parameters:

- `adGroupId` (string): Optional: filter ads by parent ad group ID. Use nevent_list_paid_ad_groups to get valid adGroupId values.
- `campaignId` (string): Optional: filter ads by parent campaign ID. Use nevent_list_paid_campaigns to get valid campaignId values.
- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_get_paid_ad_creative` (~175 tokens)

Get 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 in ~5 minutes. For Dynamic Creative Ads (hasDca: true), the dca field contains multiple creative variants. A 404 may mean this tenant is not enrolled in the insights pilot — call nevent_paid_ads_health to confirm.

Input parameters:

- `adId` (string, required): Ad ID from the provider. Use nevent_list_paid_ads to get valid adId values.
- `provider` (string, required): Ad provider: meta | google | tiktok

### `nevent_list_short_urls` (~256 tokens)

List 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_url_metrics or nevent_get_short_url_clicks), shortCode (use with nevent_get_short_url_campaign_metrics or nevent_list_short_url_user_links), shortUrl, longUrl, title, tags, clickCount, isActive, isParent. Filter by isActive=true for active links only. Use search to filter by title or URL.

Input parameters:

- `isActive` (boolean): Filter by active status. true = only active links, false = only inactive/expired links. Omit to return both.
- `page` (integer): Zero-based page number for pagination. Default: 0 (first page).
- `pageSize` (integer): Number of results per page. Default: 20. Max: 200.
- `search` (string): Free-text search across short code, title, and target URL. E.g. "summer" to find links tagged or titled with that word.

### `nevent_get_short_url` (~145 tokens)

Get 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, lastClickedAt, isActive, isExpired, isParent, parentShortCode, userId, userLinksCount. Use the returned id with nevent_get_short_url_metrics for time-series analytics.

Input parameters:

- `id` (string, required): MongoDB ObjectId of the short URL (24 hex characters). Obtain from nevent_list_short_urls response field "id".

### `nevent_get_short_url_metrics` (~197 tokens)

Get 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/desktop/tablet), clicksByBrowser, clicksByOs, topReferers. Use for performance analysis of individual tracking links. For campaign-wide aggregation across all user links, use nevent_get_short_url_campaign_metrics instead.

Input parameters:

- `days` (integer): Number of days to include in metrics calculation. Default: 30. Max: 365. Use 7 for last week, 30 for last month, 90 for last quarter.
- `id` (string, required): MongoDB ObjectId of the short URL (24 hex characters). Obtain from nevent_list_short_urls response field "id".

### `nevent_get_short_url_campaign_metrics` (~251 tokens)

Get 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_short_urls (where isParent=true). Returns: totalChildUrls, totalClicks, urlsWithClicks, avgClicksPerUrl, clickThroughRate (%), topUsersByClicks (userId, shortCode, clickCount, lastClickedAt), clicksByDay, clicksByDevice, clicksByBrowser, clicksByCountry. This tool aggregates across ALL child user links — use nevent_get_short_url_metrics(id) when you need per-link breakdown for a single URL.

Input parameters:

- `days` (integer): Number of days to include in metrics. Default: 30.
- `parentShortCode` (string, required): Short code of the parent (campaign) short URL (6-8 alphanumeric characters). Obtain from nevent_list_short_urls where isParent=true, field "shortCode".
- `topN` (integer): Number of top-performing users to return in topUsersByClicks. Default: 10.

### `nevent_get_short_url_clicks` (~177 tokens)

Get 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, gclid, isPaidTraffic. Use for detailed click attribution, fraud detection, or per-user behavior analysis. Default returns 100 most recent clicks; use limit to adjust.

Input parameters:

- `id` (string, required): MongoDB ObjectId of the short URL (24 hex characters). Obtain from nevent_list_short_urls response field "id".
- `limit` (integer): Maximum number of recent click records to return, ordered newest-first. Default: 100. Max: 1000.

### `nevent_list_short_url_user_links` (~161 tokens)

List 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 (where isParent=true). Returns an array of ShortUrlDTO — each with userId, shortCode, shortUrl, clickCount. Use the returned `id` values with nevent_get_short_url_metrics for per-user analytics.

Input parameters:

- `parentShortCode` (string, required): Short code of the parent (campaign) short URL (6-8 alphanumeric characters). Obtain from nevent_list_short_urls where isParent=true, field "shortCode".

### `nevent_create_short_url` (~390 tokens)

Create 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 redirect URL), longUrl, title, tags, isActive. Use the returned shortCode with nevent_create_bulk_user_short_urls to generate per-user variants. WRITE operation — requires STANDARD or FULL operation mode. In READ_ONLY mode this tool returns an operation_not_permitted error immediately without making any API call.

Input parameters:

- `customShortCode` (string): Custom short code (6-8 alphanumeric characters). If omitted, a unique code is auto-generated. Example: "SUMMER". Use nevent_validate_short_code (if available) to check availability first.
- `expiresAt` (string): Expiration date/time in ISO 8601 format, e.g. "2025-12-31T23:59:59.000Z". After this date the short URL stops redirecting. Omit for a permanent link.
- `longUrl` (string, required): The full destination URL to redirect to. Must include protocol (https:// or http://). Example: "https://nevent.es/events/summer-festival-2025".
- `metadata` (object): Arbitrary key-value metadata. Useful for storing campaignId, eventId, or other business identifiers. Example: {"campaignId": "NEV-123", "eventId": "evt-456"}.
- `tags` (array): Tags for categorization and filtering. Example: ["campaign", "summer", "2025"]. Use consistent tag names across campaigns.
- `title` (string): Descriptive label for the short URL (max 200 chars). Shown in the admin list view and used for search.

### `nevent_update_short_url` (~304 tokens)

Update 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/false), tags (replaces existing), metadata (replaces existing), longUrl (changes redirect destination). Returns the updated ShortUrlDTO. WRITE operation — requires STANDARD or FULL operation mode. In READ_ONLY mode this tool returns an operation_not_permitted error immediately without making any API call.

Input parameters:

- `expiresAt`: New expiration date/time (ISO 8601). Pass null to remove an existing expiration and make the link permanent. Omit this field entirely to leave expiration unchanged.
- `id` (string, required): MongoDB ObjectId of the short URL (24 hex characters). Obtain from nevent_list_short_urls response field "id".
- `isActive` (boolean): Activate (true) or deactivate (false) the short URL. Deactivated links stop redirecting immediately.
- `longUrl` (string): New destination URL. Changes where existing links redirect to — takes effect immediately.
- `metadata` (object): New metadata object. Replaces (not merges) the existing metadata.
- `tags` (array): New tag list. Replaces (not merges) the existing tags.
- `title` (string): New descriptive title (max 200 chars). Replaces the existing title.

### `nevent_create_bulk_user_short_urls` (~305 tokens)

Generate 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 short URL must already exist (create it first with nevent_create_short_url). Requires: parentShortCode (from nevent_list_short_urls) and userIds (list of user IDs). Returns: parentShortCode, totalRequested, totalCreated, createdLinks (array of ShortUrlDTO with userId, shortCode, shortUrl per user). Use nevent_get_short_url_campaign_metrics afterwards to track aggregate CTR. WRITE operation — requires STANDARD or FULL operation mode. In READ_ONLY mode this tool returns an operation_not_permitted error immediately without making any API call. Note: parentShortCode is sent in both the URL path and request body — they must match (validated server-side).

Input parameters:

- `parentShortCode` (string, required): Short code of the parent (campaign) short URL (6-8 alphanumeric characters) under which user links will be created. Must already exist. Obtain from nevent_list_short_urls where isParent=true.
- `userIds` (array, required): List of user IDs (MongoDB ObjectIds or Nevent user identifiers) to create individual tracking links for. Each user gets a unique short code that resolves to the same destination as the parent. Duplic…

### `nevent_list_short_url_destinations` (~351 tokens)

List short links grouped by DESTINATION URL — one row per destination instead of one per link. Use this to answer "how much traffic is this landing page getting across all my campaigns?", which nevent_list_short_urls cannot answer because every campaign send creates its own parent link. Campaign parents pointing at the same canonical destination collapse into a single row with aggregated totalClicks, linksCount (how many links form the group) and campaignsCount (how many distinct campaigns used it). Unlike nevent_list_short_urls, this INCLUDES system-managed assistant links (the ones the chatbot pushes), flagged readOnly=true — never try to edit or delete those. Filter with origin: MANUAL (human-created), CAMPAIGN (generated by sends), ASSISTANT (chatbot), or ALL (default). Each row carries canonicalId and members[] (id + shortCode) — pass those ids to nevent_get_short_url or nevent_get_short_url_metrics to drill into a specific link. Pagination is over GROUPS, not documents.

Input parameters:

- `origin` (string): Filter by where the links came from. ALL (default) = every origin; MANUAL = links a human created; CAMPAIGN = links generated by campaign sends; ASSISTANT = system-managed links the chatbot pushed (r…
- `page` (integer): Zero-based page number over destination GROUPS. Default: 0 (first page).
- `pageSize` (integer): Number of destination groups per page (1-100). Default: 20.
- `search` (string): Free-text search across destination URL, title, and short code. E.g. "festival" to find every destination for that event.

### `nevent_upload_image` (~288 tokens)

Upload an image to the Nevent media library and get a CDN URL. Accepts base64-encoded images as a data URL (data:image/png;base64,...) or as raw base64 with an explicit mimeType. Returns a destinationUrl (CloudFront CDN URL) that can be used directly in <img src="..."> inside email template HTML. Maximum decoded size: 5 MB. Upload the image, then reference the returned destinationUrl in nevent_update_template or nevent_create_template HTML content.

Input parameters:

- `imageName` (string): Optional file name for the uploaded resource (e.g. "event-banner.png"). When omitted, a name is generated from the upload timestamp.
- `mimeType` (string): MIME type of the image, e.g. "image/png" or "image/jpeg". Required when source is raw base64 (no data URL prefix). Ignored when source is a data URL (MIME type parsed from prefix). Common values: ima…
- `source` (string, required): Base64-encoded image. Two accepted forms: 1. Data URL: "data:image/png;base64,<base64data>" — MIME type parsed from prefix. 2. Raw base64 string — mimeType parameter required. Maximum decoded size: 5…

### `nevent_list_images` (~73 tokens)

List all images stored in the Nevent media library for the current tenant. Returns each image's CDN URL (src), file name, MIME type, and size in bytes. Use the src value in <img src="..."> in email template HTML, or pass it to nevent_delete_image to remove it.

### `nevent_delete_image` (~146 tokens)

Permanently delete one or more images from the Nevent media library. Provide the CDN URLs (src / destinationUrl) from nevent_list_images or nevent_upload_image. The operation is irreversible. Any email template HTML that references the deleted URLs will show broken images. Requires FULL operation mode (NEVENT_OPERATION_MODE=FULL) and ADMIN, SUPERADMIN, or OWNER role.

Input parameters:

- `urls` (array, required): Array of CDN image URLs to delete. Use the src/destinationUrl values from nevent_list_images or nevent_upload_image. Minimum 1 URL required. The operation is permanent. Example: ["https://cdn.nevent.…

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2#diagnostics

## Score history

- 2026-09-20: 78
- 2026-09-19: 77
- 2026-09-18: 77
- 2026-09-17: 76
- 2026-09-16: 76
- 2026-09-15: 75
- 2026-09-14: 75
- 2026-09-13: 75
- 2026-09-12: 74
- 2026-09-11: 74
- 2026-09-10: 73
- 2026-09-09: 73
- 2026-09-08: 72
- 2026-09-07: 72
- 2026-09-06: 71
- 2026-09-05: 71
- 2026-09-04: 71
- 2026-09-03: 70
- 2026-09-02: 70
- 2026-09-01: 69
- 2026-08-31: 69
- 2026-08-30: 68
- 2026-08-29: 68
- 2026-08-28: 67
- 2026-08-27: 67
- 2026-08-26: 66
- 2026-08-25: 65
- 2026-08-24: 64

## Common questions

### What is the Nevent MCP server?

Nevent MCP is listed in the public MCP registry as io.github.nevent-dev/mcp-nevent. Talk to your live-events CRM (campaigns, analytics, paid ads, segments) in Claude and ChatGPT. This page covers its hosted endpoint (https://mcp.nevent.ai/).

### Is the Nevent MCP server safe to use?

Nevent MCP scores 78 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Nevent MCP server expose?

Nevent MCP exposes 59 tools: nevent_analytics_query, nevent_analytics_capabilities, nevent_analytics_table_schema, nevent_analytics_filter_values, nevent_campaign_report, and 54 more. Their descriptions and schemas cost roughly 11,700 tokens of context every time the server is loaded.

### Does the Nevent MCP server require authentication?

No. We connected to Nevent MCP without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Nevent MCP server still maintained?

Nevent MCP is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://mcp.nevent.ai/
- Repository: https://github.com/nevent-dev/mcp-nevent
- Website: https://nevent.ai/en/features/nevent-ai/
- Changelog RSS feed: https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2.json
- HTML version of this page: https://verifymcp.io/servers/nevent-dev-mcp-nevent/mcp-2
