MCP Server

UTMStack v12 includes an MCP server. MCP (Model Context Protocol) is an open standard that lets AI tools, such as AI chat apps and coding assistants, call another system's functions. Through it, an AI client you trust can search your logs and alerts, work on alerts and incidents, build dashboards, manage response flows and more, with the same sign-in and permissions as the web console. The built-in SOC-AI assistant uses the same server.

At a glance

ItemValue
Addresshttps://<your UTMStack address>/api/v1/mcp
TransportMCP "Streamable HTTP" (POST, GET and DELETE on the same address), stateless
Sign-inAuthorization: Bearer <access token> or Utm-Api-Key: <key>
Health checkGET https://<your UTMStack address>/api/v1/mcp/health
On by defaultYes
LicenceSigning in with an API key needs the Enterprise licence.

The health check answers, for example:

{"enabled": true, "tools_registered": 141, "server_version": "v1", "server_name": "<your server name>"}

tools_registered is the number of tools your server offers (141 in UTMStack v12.0.2). server_name is the server name chosen at installation. The Overview page shows the same number in the System health card, as SOC-AI engine.

Sign in

Every request needs one of these headers. Requests without a valid one are refused.

MethodHeaderNotes
Access tokenAuthorization: Bearer <token>Get it from POST /api/v1/auth/login. It expires after one hour, so it suits short tests.
API keyUtm-Api-Key: <key>Create it in Configure > Settings > API Keys (see API Keys). Needs the Enterprise licence. The practical choice for an AI client that stays connected.

The AI client acts as the user who owns the token or the key, with that user's permissions. Create a dedicated user with only the permissions the AI client needs, and give it its own key.

On a multi-tenant installation:

  • Use the tenant's own address (its domain) in the MCP address. An API key works only on its owner's tenant domain.

  • The instance operator, signed in with an access token, can add X-Tenant-Id: <tenant id> to act inside a tenant that has granted Full access support access. Read only support access does not work for MCP, because every MCP request is a POST and read-only support allows only reading requests. An API key cannot switch tenant.

Connect an AI client

Any AI client that supports remote MCP servers over Streamable HTTP and lets you add a request header can connect. UTMStack signs clients in with a header (Utm-Api-Key or Authorization); it does not offer OAuth sign-in for MCP. There is no local (stdio) program to install on the UTMStack side.

Step 1: Create a user and an API key

  1. In Configure > Team, create a user for the AI client, for example [email protected], with the narrowest role that does the job. A Viewer can only read; an Analyst can also change alerts, incidents, dashboards and flows. An API key is created by the user it belongs to, and creating one needs the apikey.write permission, which of the built-in roles only Administrator has. So give the user a custom role with the permissions the client needs plus apikey.write. See Roles and Permissions.

  2. Sign in as that user, go to Configure > Settings > API Keys, click New API key, fill in a Name (for example claude-desktop) and, if you can, the Allowed IPs of the computer that runs the client. Click Create key and copy the secret. See Authentication and API Keys.

API keys need the Enterprise licence. Without it, you can test with an access token from POST /api/v1/auth/login (header Authorization: Bearer <token>), but it expires after one hour.

Step 2: Check that the server answers

From the computer that will run the AI client:

curl -s -H "Utm-Api-Key: <key>" https://<your UTMStack address>/api/v1/mcp/health

You should get {"enabled": true, "tools_registered": 141, ...}. If you get an error, fix it first with the Troubleshooting table below; the AI client will fail the same way and usually with a less clear message.

Step 3: Add UTMStack to your client

In every example, replace <your UTMStack address> with your server's address (on a multi-tenant installation, your tenant's address) and keep the key out of shared files: use an environment variable or the client's secret prompt, as shown.

Claude Code

Add the server with one command. --scope user makes it available in all your projects; leave it out to add it to the current project only.

claude mcp add --transport http --scope user utmstack 
  https://<your UTMStack address>/api/v1/mcp 
  --header "Utm-Api-Key: <key>"

To share the set-up with your team without sharing the key, put this in .mcp.json at the root of your project, and let each person set UTM_API_KEY in their own environment:

{
  "mcpServers": {
    "utmstack": {
      "type": "http",
      "url": "https://<your UTMStack address>/api/v1/mcp",
      "headers": {
        "Utm-Api-Key": "${UTM_API_KEY}"
      }
    }
  }
}

Check the connection with claude mcp list, or with /mcp inside a Claude Code session. The server should show as connected.

Claude Desktop

Claude Desktop connects to servers that need a custom header through mcp-remote, a small open-source bridge that runs on your computer, talks to UTMStack over HTTPS and adds the header. It needs Node.js on your computer.

  1. Open the configuration file. On macOS it is ~/Library/Application Support/Claude/claude_desktop_config.json; on Windows it is %APPDATA%\Claude\claude_desktop_config.json. Create it if it does not exist.

  2. Add the server:

{
  "mcpServers": {
    "utmstack": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://<your UTMStack address>/api/v1/mcp",
        "--header",
        "Utm-Api-Key:${UTM_API_KEY}"
      ],
      "env": {
        "UTM_API_KEY": "<key>"
      }
    }
  }
}
  1. Quit Claude Desktop completely and start it again. UTMStack's tools appear in the tools menu of a new conversation.

Write the header without a space after the colon, as above. On Windows, Claude Desktop does not keep spaces inside args intact, and the header would be cut.

Cursor

Add the server to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json in a project:

{
  "mcpServers": {
    "utmstack": {
      "url": "https://<your UTMStack address>/api/v1/mcp",
      "headers": {
        "Utm-Api-Key": "${env:UTM_API_KEY}"
      }
    }
  }
}

Set UTM_API_KEY in your shell profile or system environment, then restart Cursor. The server appears in Cursor's MCP settings with its tools.

Visual Studio Code (GitHub Copilot)

Add .vscode/mcp.json to your workspace. VS Code asks for the key the first time the server starts and stores it securely:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "utm-api-key",
      "description": "UTMStack API key",
      "password": true
    }
  ],
  "servers": {
    "utmstack": {
      "type": "http",
      "url": "https://<your UTMStack address>/api/v1/mcp",
      "headers": {
        "Utm-Api-Key": "${input:utm-api-key}"
      }
    }
  }
}

Start the server from VS Code's list of MCP servers, then use Copilot Chat in agent mode.

Other MCP clients

Look in your client's documentation for "remote MCP server", "Streamable HTTP" or "HTTP transport", and enter:

SettingValue
TransportStreamable HTTP (sometimes shown as "HTTP")
URLhttps://<your UTMStack address>/api/v1/mcp
HeaderUtm-Api-Key: <key>

If your client can only start local (stdio) servers, use the mcp-remote bridge as in the Claude Desktop example: run npx -y mcp-remote https://<your UTMStack address>/api/v1/mcp --header "Utm-Api-Key:<key>" as the server command.

Step 4: Try it

Ask a read-only question first, for example "How many alerts are open in UTMStack, grouped by severity?". The client should call a tool such as alerts.count_open or store.search. Then open Configure > Settings > App Audit Logs: each tool call is listed with the user of your API key.

An AI client with write permissions changes UTMStack for real: it can close alerts, change correlation rules, or create and switch on response flows. Give its user only the permissions it needs, ask most clients to confirm each tool call before it runs, and review what it does.

Certificates

AI clients check the server's HTTPS certificate and refuse the self-signed certificate a new UTMStack server uses. The clean fix is a certificate from a public certificate authority, or from your company's own authority that your computers already trust. See SSL Certificate.

If your certificate comes from your company's own authority and a client still refuses it, point the client to that authority's certificate. Clients built on Node.js, including Claude Code and the mcp-remote bridge, read the environment variable NODE_EXTRA_CA_CERTS:

export NODE_EXTRA_CA_CERTS=/path/to/company-ca.pem

In the Claude Desktop configuration, add it to env next to UTM_API_KEY. Do not switch certificate checking off: the key would then go to whoever answers on that address.

Permissions and audit

  • Every tool checks the same permission as the matching page or API call (for example alerts.write to change an alert). Some tools also need the instance operator role or a licence. A refused call answers "permission denied: …".

  • Every tool call, allowed or refused, is written to the audit log with the event type MCP_TOOL_CALL (Configure > Settings > App Audit Logs).

  • Tools that return lists give 50 items by default and at most 500.

Tools

These are the tools registered in UTMStack v12.0.2. "Needs" is the permission the signed-in user must have.

Alerts (17)

ToolWhat it doesNeeds
alerts.update_statusUpdate alert statusalerts.write
alerts.update_notesReplace alert notesalerts.write
alerts.update_tagsSet tags on alertsalerts.write
alerts.convert_to_incidentAttach alerts to an incidentalerts.write
alerts.count_openCount open alertsalerts.read
alert_tags.createCreate alert tagalerts.write
alert_tags.updateUpdate alert tagalerts.write
alert_tags.listList alert tagsalerts.read
alert_tags.getGet alert tag by IDalerts.read
alert_tags.deleteDelete alert tagalerts.write
alert_tag_rules.createCreate alert tag rulealerts.write
alert_tag_rules.updateUpdate alert tag rulealerts.write
alert_tag_rules.listList alert tag rulesalerts.read
alert_tag_rules.getGet alert tag rule by IDalerts.read
alert_tag_rules.deleteDelete alert tag rulealerts.write
alerts.search_adversarySearch alerts grouped by adversaryalerts.read
alerts.scoreScore an alert (deterministic 4-phase triage)alerts.read

Incidents (16)

ToolWhat it doesNeeds
incidents.createCreate incidentincidents.write
incidents.add_alertsAttach alerts to an existing incidentincidents.write
incidents.change_statusChange incident status / metadataincidents.write
incidents.listList incidentsincidents.read
incidents.getGet incidentincidents.read
incidents.assigneesList the assignees incidents are currently handed toincidents.read
incident_alerts.createAdd alert row to incidentincidents.write
incident_alerts.update_statusUpdate incident-alert statusincidents.write
incident_alerts.updateUpdate incident-alert rowincidents.write
incident_alerts.listList incident-alert linksincidents.read
incident_alerts.deleteRemove alert from incidentincidents.write
incident_notes.createAdd note to incidentincidents.write
incident_notes.listList incident notesincidents.read
incident_history.listList incident historyincidents.read
incident_history.countCount history rowsincidents.read
incident_history.getGet incident history rowincidents.read

Log and alert data (7)

ToolWhat it doesNeeds
store.searchSearch a datasetloganalyzer.read
store.countCount matching docsloganalyzer.read
store.property_valuesTop values for a fieldloganalyzer.read
store.search_sqlSQL queryloganalyzer.read
store.search_csvSearch, project to columnsloganalyzer.read
store.datasetsList datasetsloganalyzer.read
store.dataset.fieldsDataset fieldsloganalyzer.read

Log Explorer (7)

ToolWhat it doesNeeds
loganalyzer.top_valuesTop-N values for a fieldloganalyzer.read
loganalyzer.chart_viewChart view aggregationloganalyzer.read
loganalyzer.query.createSave analyzer queryloganalyzer.write
loganalyzer.query.updateUpdate analyzer queryloganalyzer.write
loganalyzer.query.listList saved queriesloganalyzer.read
loganalyzer.query.getGet saved queryloganalyzer.read
loganalyzer.query.deleteDelete saved queryloganalyzer.write

Automated response (SOAR) (14)

ToolWhat it doesNeeds
soar.rule.createCreate SOAR rulesoar.write
soar.rule.updateUpdate SOAR rulesoar.write
soar.rule.getGet SOAR rulesoar.read
soar.rule.deleteDelete SOAR rulesoar.write
soar.rule.set_enabledEnable/disable SOAR rulesoar.write
soar.rule.listList SOAR rulessoar.read
soar.node_typesList SOAR flow node typessoar.read
soar.execution.listList rule executionssoar.read
soar.variable.createCreate SOAR variablesoar.write
soar.variable.updateUpdate SOAR variablesoar.write
soar.variable.getGet SOAR variablesoar.read
soar.variable.listList SOAR variablessoar.read
soar.variable.deleteDelete SOAR variablesoar.write
soar.agent.list_by_platformList agents on a platformsoar.read

Dashboards (11)

ToolWhat it doesNeeds
dashboards.createCreate dashboarddashboards.write
dashboards.updateUpdate dashboarddashboards.write
dashboards.listList dashboardsdashboards.read
dashboards.getGet dashboarddashboards.read
dashboards.deleteDelete dashboarddashboards.write
visualizations.createCreate visualizationdashboards.write
visualizations.updateUpdate visualizationdashboards.write
visualizations.listList visualizationsdashboards.read
visualizations.getGet visualizationdashboards.read
visualizations.queryAnswer a visualization specdashboards.read
visualizations.deleteDelete visualizationdashboards.write

Compliance (18)

ToolWhat it doesNeeds
compliance.framework.listList compliance frameworkscompliance.read
compliance.framework.getGet frameworkcompliance.read
compliance.framework.createCreate custom frameworkcompliance.write
compliance.framework.updateUpdate framework (user overlay)compliance.write
compliance.framework.deleteDelete frameworkcompliance.write
compliance.control.listList controlscompliance.read
compliance.control.getGet controlcompliance.read
compliance.control.createCreate controlcompliance.write
compliance.control.updateUpdate controlcompliance.write
compliance.control.deleteDelete controlcompliance.write
compliance.report.getGet a framework's standing reportcompliance.read
compliance.report.listList the tenant's standing reportscompliance.read
compliance.report.evaluateRun a framework evaluationcompliance.write
compliance.schedule.createSchedule recurring reportcompliance.write
compliance.schedule.updateUpdate report schedulecompliance.write
compliance.schedule.list_by_userList my report schedulescompliance.read
compliance.schedule.getGet schedulecompliance.read
compliance.schedule.deleteDelete schedulecompliance.write

Detection rules and pipelines (17)

ToolWhat it doesNeeds
regex_pattern.listList regex patternseventprocessing.read
regex_pattern.getGet regex patterneventprocessing.read
correlation_rule.createCreate correlation ruleeventprocessing.write
correlation_rule.updateUpdate correlation ruleeventprocessing.write
correlation_rule.listList correlation ruleseventprocessing.read
correlation_rule.getGet correlation ruleeventprocessing.read
correlation_rule.deleteDelete correlation ruleeventprocessing.write
correlation_rule.set_activeActivate or deactivate correlation ruleeventprocessing.write
correlation_rule.search_property_valuesSearch distinct property valueseventprocessing.read
pipeline.createCreate pipelineeventprocessing.write
pipeline.updateUpdate pipelineeventprocessing.write
pipeline.listList pipelineseventprocessing.read
pipeline.getGet pipelineeventprocessing.read
pipeline.deleteDelete pipelineeventprocessing.write
pipeline.set_activeActivate or deactivate pipelineeventprocessing.write
ingestion_stats.totalsIngestion totalseventprocessing.read
ingestion_stats.timelineIngestion timelineeventprocessing.read

Data sources (5)

ToolWhat it doesNeeds
datasources.listList datasourcesdatasources.read
datasources.getGet datasourcedatasources.read
datasources.update_labelsSet datasource labelsdatasources.write
datasources.deleteDelete datasourcedatasources.write
datasources.countNumber of configured datasourcesdatasources.read

Settings, audit and system (13)

ToolWhat it doesNeeds
audit.listList audit log entriesaudit.read
audit.getGet audit entryaudit.read
adaudit.users.listList Active Directory usersadaudit.read
config.listList configsconfig.read
config.getGet config by keyconfig.read
config.updateUpdate config valueconfig.write
config.check_mailTest SMTP configurationconfig.write
branding.getGet branding (admin view)config.read
branding.updateUpdate branding (MSSP)config.write, multi-tenant licence
branding.get_publicGet public branding (login-page view)Any signed-in user
billing.versionServer version infoAny signed-in user
billing.licenseActive licenseAny signed-in user
socai.analyze_alertForward alert to SOC AI for analysisTo be confirmed

Changes across tenants (instance operator only) (16)

ToolWhat it doesNeeds
platform.pipeline.bulk_createBulk create pipeline across tenantseventprocessing.write, instance operator
platform.pipeline.bulk_updateBulk update pipeline across tenantseventprocessing.write, instance operator
platform.pipeline.bulk_deleteBulk delete pipeline across tenantseventprocessing.write, instance operator
platform.pipeline.bulk_set_activeBulk activate/deactivate pipeline across tenantseventprocessing.write, instance operator
platform.correlation_rule.bulk_createBulk create correlation rule across tenantseventprocessing.write, instance operator
platform.correlation_rule.bulk_updateBulk update correlation rule across tenantseventprocessing.write, instance operator
platform.correlation_rule.bulk_deleteBulk delete correlation rule across tenantseventprocessing.write, instance operator
platform.correlation_rule.bulk_set_activeBulk activate/deactivate correlation rule across tenantseventprocessing.write, instance operator
platform.compliance.framework.bulk_createBulk create compliance framework across tenantscompliance.write, instance operator
platform.compliance.framework.bulk_updateBulk update compliance framework across tenantscompliance.write, instance operator
platform.compliance.framework.bulk_deleteBulk delete compliance framework across tenantscompliance.write, instance operator
platform.compliance.control.bulk_createBulk create compliance control across tenantscompliance.write, instance operator
platform.compliance.control.bulk_updateBulk update compliance control across tenantscompliance.write, instance operator
platform.compliance.control.bulk_deleteBulk delete compliance control across tenantscompliance.write, instance operator
platform.config.smtp.bulk_updateBulk update SMTP config across tenantsconfig.write, instance operator
platform.branding.bulk_updateBulk update branding across tenantsconfig.write, instance operator

In the tools that change many tenants at once, list the target tenants by their ids. The option to target all tenants does not work in UTMStack v12.0.2.

What the MCP server does not do

  • Start a response flow by hand. Use Trigger flow in the web console or the SOAR API.

  • Manage integrations, users, roles, API keys, identity providers, notifications or tenants. These tools are not offered in UTMStack v12.0.2.

Resources

Resources are read-only documents an AI client can read for background.

ResourceName
mcp://utmstack/catalog/integrationsIntegrations catalog
mcp://utmstack/catalog/frameworksCompliance frameworks catalog
mcp://utmstack/catalog/alert-tagsAlert tag catalog
mcp://utmstack/docs/filter-operatorsFilterType operator reference
mcp://utmstack/docs/event-typesAudit event-type enum
mcp://utmstack/docs/soar-flow-guideSOAR flow building guide
mcp://utmstack/docs/catalogFull MCP tool catalog

The "Full MCP tool catalog" resource also lists tools and prompts that UTMStack v12.0.2 does not offer. The tool list on this page and the tools_registered count are what your server actually has.

Prompts

PromptArgumentWhat it does
soc.draft-soar-rule ("Draft SOAR rule")goal: the goal in plain language, for example "isolate hosts on Mimikatz detections"Guides the model through building a response flow: list existing flows to start from, list variables, propose trigger conditions, then create the flow when you confirm.

Troubleshooting

Check the health address with curl (Step 2 above) before you look at the client: it gives the clearest error.

SymptomCauseFix
401 missing Authorization headerThe client sent no credential. The header name is misspelled, or an environment variable in the configuration is empty.Check the header name Utm-Api-Key and that the variable is set where the client runs.
401 invalid api keyThe key is wrong, rotated or expired; the computer's address is not in the key's Allowed IPs; the key's owner was deactivated; or the installation has no Enterprise licence.Check the key on Configure > Settings > API Keys and the licence on License and Editions.
401 invalid tokenAn access token expired (after one hour).Use an API key for a client that stays connected.
401 credential does not belong to this tenantMulti-tenant installation: the address is another tenant's.Use the address of the key owner's tenant.
404 unknown tenantMulti-tenant installation: the address belongs to no tenant.Use your tenant's address.
404 on /api/v1/mcp/health with no JSON errorThe MCP server is turned off on this installation.Ask whoever runs the server.
403 from a tool that runs in a web browserThe server refuses requests from web pages on other sites.Use a desktop client, or the mcp-remote bridge.
Certificate errors such as "self signed certificate" or "unable to verify the first certificate"The client does not trust the server's certificate.See Certificates above.
The client connects but a tool answers "permission denied: …"The key's user lacks the permission the tool needs.Give the user a role with that permission, or accept that the client cannot do this. The Tools tables list each tool's permission.
A tool you expected is missingThe tool is not offered in UTMStack v12.0.2 (see What the MCP server does not do).Use the web console or the REST API for that task.
Searches stop with a time-outSQL searches are stopped after 30 seconds.Ask for a shorter time range or a narrower search.
The client cannot work in another tenantAPI keys always work inside their owner's tenant.Create a key in each tenant you want to reach.

Turning it off

The MCP server is on by default, and the web console has no switch for it. The built-in SOC-AI assistant works through it, so AI features need it.

  • SOC-AI Assistant

  • Authentication and API Keys

  • API Quick Start

  • Building a Flow