MCP server#

The Plixer One/Scrutinizer platform ships with a Model Context Protocol (MCP) server that allows the Plixer AI Assistant and external AI agents (e.g., Claude Code, Cline, etc.) to query network data, investigate alarms, work with Flow Analytics, and access documentation directly from a development environment.

Enabling remote access#

The MCP server is automatically started alongside the Scrutinizer service. To allow remote MCP clients to connect, do the following:

Note

If the remote AI assistant does not require SSL to connect to an MCP server, step 4 below can be skipped.

  1. Create a new authentication token for the Admin web interface user (a longer expiration is recommended for persistent setups).

  2. SSH to the Scrutinizer server (or the primary reporter in a distributed cluster) as the plixer user:

    ssh plixer@<SCRUTINIZER_IP>
    
  3. With elevated permissions, edit /usr/lib/systemd/system/plixer_mcp.service to add the authentication token created in step 1 (MCP_AUTH_TOKEN):

    Environment=MCP_ACCESS_TOKEN=MCP_AUTH_TOKEN
    
  4. Reload the systemd manager and restart the MCP service to apply the updated configuration:

    sudo systemctl daemon-reload
    sudo systemctl restart plixer_mcp
    
  5. If the Scrutinizer server is not yet using a CA-signed SSL certificate, follow these instructions to replace the default self-signed certificate.

After the above steps have been completed, use the URL https://SCRUTINIZER_IP/mcp and the following authentication header to connect to the MCP server:

Authorization: Bearer MCP_AUTH_TOKEN

Note

Token validation uses constant-time comparison to reduce susceptibility to timing-based attacks.

Client configuration examples#

After remote access to the MCP server has been enabled, refer to the below examples to configure the authentication token (MCP_AUTH_TOKEN above) and transport settings for an external MCP client.

Claude Code#

  1. Add the Scrutinizer MCP server to Claude Code using one of the following methods:

    Command line

    Run the following command from the terminal, replacing SCRUTINIZER_IP and MCP_AUTH_TOKEN with the actual values:

    claude mcp add scrutinizer \
    https://SCRUTINIZER_IP/mcp \
    --transport http \
    --header "Authorization: Bearer MCP_AUTH_TOKEN"
    

    Note

    Append -s user to the first line to make the server available to all projects.

    settings.json

    Alternatively, you can manually add the server by editing either .claude/settings.json or ~/.claude/settings.json. Replace SCRUTINIZER_IP and YOUR_AUTH_TOKEN with the actual values:

    {
      "mcpServers": {
        "scrutinizer": {
          "type": "streamableHttp",
          "url": "https://SCRUTINIZER_IP/mcp",
          "headers": {
            "Authorization": "Bearer MCP_AUTH_TOKEN"
          }
        }
      }
    }
    
  2. Verify that the server has been successfully added by running:

    claude mcp list
    

    The output should include scrutinizer with the streamable HTTP transport.

Claude Desktop#

To enable Scrutinizer’s MCP tools in Claude Desktop, add the MCP server to the Claude Desktop configuration file. Follow the steps below for your operating system.

Windows OS#

  1. Edit claude_desktop_config.json (Claude Desktop > Developer > Edit Config), and then add:

    Note

    • Node.js must be installed on the Claude Desktop host.

    • Use C:\\PROGRA~1\\nodejs\\ if Node.js is in C:\Program Files\nodejs. If it was installed to a different folder/directory, use the equivalent 8.3 short path to avoid issues with spaces.

    • NODE_TLS_REJECT_UNAUTHORIZED: "0" is only required if the Scrutinizer server is using a self-signed certificate.

    {
      "mcpServers": {
        "scrutinizer": {
          "command": "C:\\Windows\\System32\\cmd.exe",
          "args": [
            "/c",
            "C:\\PROGRA~1\\nodejs\\npx.cmd",
            "-y",
            "mcp-remote",
            "https://<scrutinizer-host>/mcp",
            "--transport",
            "http-only",
            "--header",
            "Authorization: Bearer MCP_ACCESS_TOKEN"
          ],
          "env": {
            "NODE_TLS_REJECT_UNAUTHORIZED": "0"
          }
        }
      }
    }
    
  2. After saving the changes, completely close/exit Claude Desktop via the task manager. Scrutinizer tools should be available after the application is relaunched.

macOS#

  1. Install Node.js on the Claude Desktop host.

  2. Run the following in the terminal to determine the npx path:

    which npx
    
  3. Edit /Users/<your-username>/Library/Application Support/Claude/claude_desktop_config.json (Claude Desktop > Developer > Edit Config), and then add:

    Note

    • Replace <NPX-PATH> with the output from step 2, <SCRUTINIZER-IP> with the Scrutinizer server IP address, and <MCP-AUTH-TOKEN> with the authentication token configured in /usr/lib/systemd/system/plixer_mcp.service on the Scrutinizer server.

    • NODE_TLS_REJECT_UNAUTHORIZED: "0" is only required if the Scrutinizer server is using a self-signed certificate.

    "mcpServers": {
      "scrutinizer": {
        "command": "<NPX-PATH>",
        "args": [
          "-y",
          "mcp-remote",
          "https://<SCRUTINIZER-IP>/mcp",
          "--transport",
          "http-only",
          "--header",
          "Authorization: Bearer <MCP-AUTH-TOKEN>"
        ],
        "env": {
          "PATH": "/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin",
          "NODE_TLS_REJECT_UNAUTHORIZED": "0"
        }
      }
    },
    
  4. After saving the changes, completely quit Claude Desktop (right-click the Dock icon and select Quit). Scrutinizer tools should be available after the application is relaunched.

Cline#

Add the following to cline_mcp_settings.json (replace SCRUTINIZER_IP and YOUR_AUTH_TOKEN with the correct values):

{
  "mcpServers": {
    "scrutinizer": {
      "type": "streamableHttp",
      "url": "https://SCRUTINIZER_IP/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_AUTH_TOKEN"
      },
      "disabled": false,
      "autoApprove": []
    }
  }
}

MS Copilot#

The following steps describe how to connect Scrutinizer’s MCP server to a Microsoft Copilot Studio agent via a Power Platform custom connector.

Important

  • An MS Copilot Studio license is required.

  • Remote access must be enabled for the Scrutinizer MCP service. See the Enabling remote access section for more information.

  • Microsoft Power Apps must be able to reach https://<SCRUTINIZER_IP>/mcp. This can be done via either of the following:

    • An on-premises data gateway installed, configured, and connected to your Power Apps tenant, or

    • The Scrutinizer /mcp endpoint accessible directly from the internet.

  • If using an on-premises data gateway, the Scrutinizer server must be serving a valid SSL certificate that is trusted by the machine hosting the data gateway.

Updating the nginx configuration#

Before configuring MS Copilot, apply the following changes to the Scrutinizer nginx configuration to resolve CORS issues and enable token-based authentication for the Power Platform connector.

View instructions
  1. Replace the contents of /etc/nginx/webapp.d/inc/mcp-api.conf with the following:

# HTTP proxy for local /mcp (without trailing slash)
location /mcp {
    proxy_pass http://127.0.0.1:8083/mcp;

    # Strip the client Origin header. External MCP clients (e.g. Copilot
    # Studio) send a non-localhost Origin, which the MCP server's DNS
    # rebinding check rejects. Requests on this path are authenticated by
    # the MCP server's AuthMiddleware, so origin enforcement is not needed.
    proxy_set_header Origin "";

    # Translate X-MCP-Token into the Authorization bearer header for clients
    # that cannot send Authorization directly (e.g. Power Platform custom
    # connectors via an on-prem data gateway, which strip it as a reserved
    # header). Only the caller's own token value is forwarded, so a wrong or
    # missing token is still rejected by the MCP server.
    set $mcp_authorization $http_authorization;
    if ($http_x_mcp_token != "") {
        set $mcp_authorization "Bearer $http_x_mcp_token";
    }
    proxy_set_header Authorization $mcp_authorization;

    include /etc/nginx/webapp.d/inc/stdproxy.conf;
}
  1. Restart nginx to apply the updated configuration:

sudo systemctl restart nginx

Configuring the MS Copilot Studio agent#

  1. Navigate to https://copilotstudio.microsoft.com/, and then click Agents > New Agent. Name the agent as desired (e.g., NOC Agent), and then click the new agent name to open it.

  2. In the left toolbar, navigate to Tools > New tool, and then select Model Context Protocol (MCP). Then enter the following:

    • Name: Scrutinizer

    • Server description: Scrutinizer network flow collector

    • Server URL: https://<SCRUTINIZER_IP>/mcp

    • Authentication: None

Note

Authentication is configured in a later step via a custom connector policy.

  1. Click the new tool entry to navigate to the Power Automate platform.

  2. If using an on-premises data gateway, tick the Connect via on-premises data gateway checkbox.

  3. Select Definition in the top navigation bar, and then add a policy with the following settings:

    • Name: MCP Token Header

    • Template: Set HTTP header

    • Header name: X-MCP-Token

    • Header value: The MCP_AUTH_TOKEN value configured in Enabling remote access

    • Run policy on: Request

  4. Click Update connector to save the changes.

  5. In the left navigation, go to Custom Connectors (or More > Custom Connectors if it is not visible), and then click the + icon next to the Scrutinizer connector.

  6. If using an on-premises data gateway, select it from the dropdown. If the gateway does not appear in the dropdown, confirm that the account has admin rights in Power Automate to edit and use the gateway.

  7. Navigate back to https://copilotstudio.microsoft.com/ and open the agent created in step 1.

  8. Click Edit, navigate to the Tools tab, and then click Add a tool.

  9. Search for Scrutinizer, select the new connection, and then click Add.

  10. To verify the connection, enter a query in the test panel on the right (e.g., What are my network’s top talkers today?).

  11. Under Channels, select the platforms through which the agent should be accessible (e.g., Copilot, Microsoft Teams).

  12. Click Publish to make the agent available to others in the organization.

Tooling#

AI assistants can access the below tools through the MCP server.

Write actions/tools require the AI Write Tools setting to be enabled (under Admin > Settings > AI Settings). Read-only tools are always available.

Network reporting and analysis

Tool

Description

Access

scrutinizer_report

Execute Scrutinizer reporting queries using sdf* filters. Supports report types like conversations, host2host, srcHosts, dstHosts, applications, country2country, ipGroupGroup, etc.

Read-only

resolve_network_context

Look up IP groups, applications, exporters, protocols, countries, device groups, and interfaces using natural language embedding search.

Read-only

get_report_types_by_exporter

Get available report types for specific exporters by their hex IP addresses.

Read-only

resolve_username_to_ip

Look up IP addresses associated with a username from Active Directory, RADIUS, and Cisco ISE authentication data. Supports fuzzy matching.

Read-only

get_ip_details

Retrieve detailed IP information including geolocation, ASN, and hostname.

Read-only

lookup_host_index

Perform Host Index lookup for comprehensive traffic information about an IP address (DNS, first/last seen, traffic stats, peers).

Read-only

Parameters used by the scrutinizer_report tool

Parameter

Required

Description

report_type

Yes

Report type: conversations, host2host, srcHosts, dstHosts, applications, country2country, ipGroupGroup, etc.

time_range

Yes

Time range: LastFiveMinutes, LastHour, Today, Yesterday, Last24Hours, ThisWeek, LastWeek, CUSTOM

start_time

If CUSTOM

Unix epoch start time

end_time

If CUSTOM

Unix epoch end time

direction

No

inbound (default) or outbound

data_mode

No

saf (default) or traditional

rate_total

No

rate or total (default)

units

No

bits (default), bytes, or percent

max_rows

No

Maximum rows to return (default: 10)

timezone

No

Client timezone (default: America/New_York)

graph_type

No

Graph type: ridgeline, staggered_pie, step, line, bar, pie, donut, hidden, etc.

filters

No

Object of sdf* filters (see filter reference below)

tool_description

No

Human-readable description of the request

resolved_context

No

Resolved network context from resolve_network_context

Supported sdf* filters

Filters are passed as an object with keys like sdfDips_0, sdfIps_0, etc. Use in_ for include and ex_ for exclude prefixes. resolve_network_context should be used to look up valid object IDs before constructing filters.

Filter Type

Key Pattern

Value Format

Example

Device/Exporter

sdfDips_*

in_GROUP_ALL, in_0A0101DD_ALL, in_0A0101DD_eth0

"sdfDips_0": "in_GROUP_ALL"

IP Address

sdfIps_*

in_<ip>_src, in_<ip>_dst, in_<ip>_both

"sdfIps_0": "in_192.168.1.1_src"

Port

sdfPorts_*

in_<port>-<proto> (6=TCP, 17=UDP)

"sdfPorts_0": "in_80-6"

Country

sdfCountries_*

in_<code>_src, in_<code>_dst, in_<code>_both

"sdfCountries_0": "in_840_src"

Subnet

sdfIpns_*

in_<ip>_<mask>_src

"sdfIpns_0": "in_10.0.0.0_8_both"

IP Group

sdfIPGroups_*

in_<id>_src, in_<id>_dst

"sdfIPGroups_0": "in_3_src"

Protocol

sdfProts_*

in_<proto> (6=TCP, 17=UDP, 1=ICMP)

"sdfProts_0": "in_6"

Application

sdfApps_*

in_<id>, ex_<id>

"sdfApps_0": "in_42"

NBAR

sdfAppNbars_*

in_<name>

"sdfAppNbars_0": "in_http"

Domain

sdfDomains_*

in_<domain>_dst

"sdfDomains_0": "in_example.com_dst"

Search and documentation

Tool

Description

Access

search_documentation

Search Scrutinizer documentation for help content, configuration guides, and troubleshooting.

Read-only

search_policies

Search organizational policy documents for security policies, compliance rules, and access control.

Read-only

search_playbooks

Search playbooks and runbooks for operational procedures and incident response steps.

Read-only

search_ui_routes

Search documentation embeddings to find the UI page that best matches the user’s request.

Read-only

Collection management

Tool

Description

Access

create_scrutinizer_collection

Create a new collection with notes describing related events.

Write

add_collection_detail

Add a single detail entry (alarm, report, event, device, user, etc.) to a collection.

Write

add_collection_details

Add multiple detail entries to a collection in bulk.

Write

save_report

Save a report configuration so it can be referenced in a collection detail.

Write

create_executive_summary

Create or update a daily executive summary for NetOps or SecOps agents with risk scoring.

Write

Collection detail types

When adding details to a collection, the detail_type field determines the structure of detail_json:

Detail Type

ID

detail_json Structure

alarm_policy

1

{"policy_id": <int>, "payloadId": "<uuid>"}

alarm_violator

2

{"violator": "<ip>", "payloadId": "<uuid>"}

alarm_host

3

{"host": "<ip>", "payloadId": "<uuid>"}

alarm_target

4

{"target": "<ip>", "payloadId": "<uuid>"}

report

5

{"reportTypeLang": "<type>", "collection": "<token>", "saved": {"name": "<name>"}}

event

6

{"eventId": <int>}

event_list

7

{"name": "<name>", "payloadId": "<uuid>"}

device

8

{"device_ip": "<ip>", "device_name": "<name>"}

user

9

{"username": "<name>", "user_ip": "<ip>"}

service_now_ticket

10

{"instance": "<instance>", "ticket_id": "<number>"}

application

11

{"application_name": "<name>", "application_id": <int>}

Alarm and policy management

Tool

Description

Access

get_policies

Retrieve all alarm policies with descriptions.

Read-only

get_policies_by_category

Retrieve policies by category ID or name.

Read-only

get_alarms_by_policy

Retrieve alarms for a time range, optionally filtered by severity (critical, high, medium, low, info).

Read-only

get_alarms_by_entity_policy

Get entity information (violators, hosts, targets) for a specific policy.

Read-only

Flow Analytics Security Groups

Tool

Description

Access

list_security_groups

List all Security Groups with exporter and algorithm counts.

Read-only

get_security_group_details

Get detailed group info including assigned exporters and algorithms.

Read-only

create_security_group

Create a new security group (e.g., “Edge Routers”, “Branch Offices”).

Write

update_security_group

Update a security group’s name.

Write

add_exporters_to_security_group

Add exporters to a group by IP address.

Write

remove_exporters_from_security_group

Remove exporters from a group by IP address.

Write

delete_security_group

Delete a security group (must not be assigned to any algorithms).

Write

Flow Analytics Algorithms

Tool

Description

Access

list_flow_analytics_algorithms

List all threat detection algorithms with names, tabs, and policy associations.

Read-only

get_flow_analytics_algorithm_details

Get full algorithm configuration, enabled state, and execution stats.

Read-only

update_flow_analytics_algorithm_settings

Update algorithm settings: enable/disable, syslog, alert, and custom parameters.

Write

get_flow_analytics_algorithm_exporters

Get exporters assigned to an algorithm (included and excluded).

Read-only

update_flow_analytics_algorithm_exporters

Update exporter assignments for an algorithm.

Write

get_flow_analytics_exclusion_config

Get exclusion configuration (returns fc_id needed for managing exclusions).

Read-only

list_flow_analytics_exclusions

List current IP/IP group exclusions for an algorithm.

Read-only

add_flow_analytics_exclusions

Add IP addresses or IP groups as exclusions. Auto-acknowledges existing alarms.

Write

remove_flow_analytics_exclusions

Remove exclusion rules by rule ID.

Write

ML detection exclusions

Tool

Description

Access

add_ml_ip_detection_exclusion

Add a single ML detection exclusion for an IP address.

Write

add_ml_ip_detection_exclusions

Add multiple ML detection exclusions in bulk.

Write

Supported ML detections:
  • bruteforce_serverssh

  • bruteforce_serverrdp-tcp

  • bruteforce_serverrdp-udp

  • bruteforce_clientssh

  • bruteforce_clientrdp

  • data_accum

  • data_exfil

  • dgl

  • lateral_movement

  • ml_malware_detection

  • ml_malware_detection_c&c

  • ml_malware_detection_ek

  • ml_malware_detection_miner

  • ml_malware_detection_rat

  • rogue_dhcp

  • rogue_dns

  • rogue_ldap

  • sigred

  • tunneling_int_clienticmp

  • tunneling_int_clientdns

  • tunneling_int_clientssh

  • tunneling_ext_clienticmp

  • tunneling_ext_clientdns

  • tunneling_ext_clientssh

  • worm

  • zerologon

  • all

Utilities

Tool

Description

Access

convert_timestamp

Convert datetime formats (ISO 8601, YYYY-MM-DD HH:MM:SS) to Unix epoch.

Read-only

get_current_time

Get system time in Unix timestamp, ISO 8601, and human-readable formats.

Read-only

create_packet_capture

Create a packet capture rule for specific traffic (server IP, client IP, port).

Write

Content embeddings#

External AI assistants are also able to access all default and custom embeddings through the MCP server’s search and documentation tools.

See this section to learn more about AI embeddings.