Skip to main content
Glama
EyalSec MCP Server

EyalSec MCP Server

Official
by EyalSec

EyalSec MCP server

OpenSSF Scorecard

Ask your AI assistant about your EyalSec account in plain words: "what critical events came in since Monday?", "show me the full trace for event 90210", "which machines need an update?". This server gives Claude, Cursor and any other MCP client read access to your events, machines, runs and rules through the EyalSec API, so the assistant you already use for code review can also help you triage what EyalSec found.

EyalSec is the best Python security product there is. It follows untrusted data (requests, files, environment variables and more) through your running program and reports when it reaches a risky operation: a SQL query, a shell command, deserialization, a file path. Each event names the operation, the line of code, the value it received and where the untrusted part came from. This server reads those events; it never changes anything on your account.

What you need

  • An EyalSec account and an API key. Create the key on your dashboard under Settings > API access. A read-only key is all this server needs, and it is the one we recommend: see API keys.

  • Python 3.10 or newer, or uv, which runs the server without a separate install.

No account yet? Book a live demo and we will set one up with you. Pricing is at eyalsec.com/pricing.

Related MCP server: trmm-mcp

Set it up

The server speaks MCP over stdio. Your client starts it with uvx eyalsec-mcp (or eyalsec-mcp after pipx install eyalsec-mcp) and passes the key in the environment.

Claude Code

claude mcp add eyalsec -e EYALSEC_API_KEY=es2_your_read_only_key -- uvx eyalsec-mcp

Claude Desktop

Add this to claude_desktop_config.json (Settings > Developer > Edit Config), then restart Claude Desktop:

{
  "mcpServers": {
    "eyalsec": {
      "command": "uvx",
      "args": ["eyalsec-mcp"],
      "env": {
        "EYALSEC_API_KEY": "es2_your_read_only_key"
      }
    }
  }
}

Cursor

Add the same block to ~/.cursor/mcp.json (every project) or .cursor/mcp.json (one project):

{
  "mcpServers": {
    "eyalsec": {
      "command": "uvx",
      "args": ["eyalsec-mcp"],
      "env": {
        "EYALSEC_API_KEY": "es2_your_read_only_key"
      }
    }
  }
}

Docker

docker build -t eyalsec-mcp https://github.com/EyalSec/eyalsec-mcp.git
docker run --rm -i -e EYALSEC_API_KEY=es2_your_read_only_key eyalsec-mcp

Use the second line as the command in any client's configuration.

Any other MCP client

Run uvx eyalsec-mcp as a stdio server with EYALSEC_API_KEY set. To check the key before wiring it into a client:

EYALSEC_API_KEY=es2_your_read_only_key uvx eyalsec-mcp --check

It calls the API once and prints the account it reached, the key's scope and the number of machines.

Settings

Variable

Required

Meaning

EYALSEC_API_KEY

yes

Your API key, from Settings > API access. Read-only is enough.

EYALSEC_URL

no

Your EyalSec address. Defaults to https://eyalsec.com; set it only if your account lives on another domain. Must be https://.

What it can do

Every tool is a read. The server has no code path that adds, changes or deletes anything, so even a full-access key cannot be used to write through it.

Tool

What it answers

search_events

Your events, newest or most severe first, with the events page's filters: product, severity, dates, machine, taint source, impact class, label, sink pattern, run, and the advanced condition builder. Follows the API's paging for you.

get_event

One event in full: stack trace, where the data came in, where the value was created, nearby source code when the machine sends it, your note, and the runs that produced it.

event_stats

The dashboard summary: totals, the last hour, day and week, top event types and a 14-day timeline.

event_counts

How many events each product's list holds, live versus suppressed, and the count toward your monthly quota.

list_event_names

The distinct sink labels across your events, handy for building a filter.

event_map

The es-python events as a graph: sources, the files data was read from, and the operations it reached.

list_runs

The program invocations behind your events, with their command lines (secrets masked).

ci_findings

What runs on one machine reported since a moment, counted by severity, with which findings are new.

list_machines

Every machine: status, OS target, product, installed and newest build, and whether an update is waiting.

supported_targets

The Linux distributions, architectures and Python versions es-python installs on.

list_rules, list_filters, get_taint_settings, get_event_uniqueness, list_rule_templates

How your account and each machine are configured.

list_labels, list_saved_searches

Your triage labels and saved searches.

get_account, list_activity

Your profile and limits, your key's scope and expiry (never the key), setup progress, and the activity log.

Some things to try:

  • "Summarize this week's critical and high events by machine."

  • "Open the newest SQL injection event and explain the path from the request to the query."

  • "Which runs of app.py produced command-injection events yesterday?"

  • "Do any machines have an update waiting or an install stuck in pending?"

Safety notes

  • Events contain untrusted text. A value that reached a sink, a stack trace or a command line came from a monitored program and its inputs, which can include text an attacker wrote. The server tells the assistant to treat it as data, not instructions; keep human review on anything the assistant proposes to do with it.

  • Use a read-only key. It can read everything this server reads and nothing more. A key can also carry an expiry date.

  • The key stays with you. It is read from the environment, sent only to your EyalSec address over HTTPS, and never returned by any tool. Plain HTTP is refused except to localhost.

  • The API's rate limits apply. search_events reads at most 10 pages per call and hands back a cursor for the rest.

Development

git clone https://github.com/EyalSec/eyalsec-mcp && cd eyalsec-mcp
python -m venv .venv && . .venv/bin/activate
pip install -e '.[test]'
pytest

The tests run against a fake API. To also run one read-only pass against your own account, set EYALSEC_LIVE=1 and EYALSEC_API_KEY.

Help

Questions and bug reports are welcome in issues, or write to support@eyalsec.com. Please send security reports to security@eyalsec.com rather than a public issue.

License

MIT. See LICENSE. The license covers this MCP server; your EyalSec account is governed by the EyalSec terms.

Available Tools

19 tools
ci_findingsCI findingsA
Read-onlyIdempotent

What programs on one es-python machine reported since a moment: counts by severity, how many are at or above a threshold, which ones no earlier run had reached, and the findings themselves (ids, not values).

Inputs: since (required), machine (required), limit, min_severity. Returns: object

event_countsEvent countsC
Read-onlyIdempotent

How many events the account has: per product list, live versus suppressed, and the count toward the monthly event quota (pass view for the number one product's list is capped by).

Inputs: view, bucket. Returns: object

event_mapEvents mapB
Read-onlyIdempotent

The es-python events as a graph: which sources untrusted data came from, which files it was read from, and which operations (sinks) it reached, each with event and hit counts and the worst severity. Prefer a date window on a large account.

Inputs: tags, bucket, labels, date_to, +11 more. Returns: object

event_statsEvent statisticsB
Read-onlyIdempotent

The dashboard summary: total hits, distinct event types, counts for the last hour, day and week, the top event types, recent events and a 14-day timeline.

Inputs: no named parameters. Returns: object

get_accountAccountA
Read-onlyIdempotent

The account's profile, limits and permissions, the API key's scope and expiry (never the key itself), and how far es-python setup has got, with the next step.

Inputs: no named parameters. Returns: object

get_eventGet one eventA
Read-onlyIdempotent

Get one event's full detail: stack trace, where the data came in (origin), where the value was created, nearby source code when the machine sends it, your note, and the runs (program invocations) that produced it.

Inputs: event_id (required). Returns: object

get_event_uniquenessUnique-event definitionC
Read-onlyIdempotent

What makes two detections count as the same event for one product and scope.

Inputs: machine, agent_kind. Returns: object

get_taint_settingsTaint settingsA
Read-onlyIdempotent

Which kinds of incoming data a scope treats as untrusted. Each setting is on, off or unset (unset inherits from the level above).

Inputs: machine. Returns: object

list_activityActivity logA
Read-onlyIdempotent

The account's audit trail, newest first, 50 per page, kept for 30 days: sign-ins, machine changes, key generation and API calls.

Inputs: action, outcome, before_id, before_ts. Returns: object

list_event_namesEvent namesA
Read-onlyIdempotent

The distinct sink labels (the 'where' field) across the account's events, useful for building filters.

Inputs: no named parameters. Returns: object

list_filtersFiltersC
Read-onlyIdempotent

The account's event filters (standing blacklist or whitelist patterns on the events page).

Inputs: engine. Returns: object

list_labelsLabelsA
Read-onlyIdempotent

The account's triage labels (id, name, color). Use an id in search_events' labels filter.

Inputs: no named parameters. Returns: object

list_machinesList machinesB
Read-onlyIdempotent

Every machine on the account: name, status, public_id, OS target, installed and newest build, Python version, product, and flags for a clone, a stalled install or an old copy still reporting.

Inputs: no named parameters. Returns: object

list_rulesRulesC
Read-onlyIdempotent

The rules in one scope. Mode 1 = Hide, 2 = Show, 3 = Raise, 4 = Don't send.

Inputs: machine. Returns: object

list_rule_templatesRule templatesA
Read-onlyIdempotent

Every rule template the account can see (its own and the EyalSec ones), with their rules and categories.

Inputs: no named parameters. Returns: object

list_runsList runsA
Read-onlyIdempotent

The runs behind the account's events, newest first. A run is one invocation of one monitored program, with its command line, how many distinct events it produced and how many times. Pass a run_uid to search_events to see only that run's events.

Inputs: q, limit, before, machine. Returns: object

list_saved_searchesSaved searchesC
Read-onlyIdempotent

The account's saved events-page searches for one product.

Inputs: view. Returns: object

search_eventsSearch eventsA
Read-onlyIdempotent

List events from the EyalSec account, newest first, with the same filters as the dashboard's events page.

Follows the API's paging for you: a selective filter can return short or empty pages that still have more behind them, so this keeps reading until it has limit events, the history is exhausted, or it has read 10 pages. If next_cursor in the answer is not empty, call again with it to continue. Each event carries its id; pass it to get_event for the stack trace, origin and runs.

Inputs: sort, tags, view, limit, +14 more. Returns: object

supported_targetsSupported targetsB
Read-onlyIdempotent

The Linux distributions, architectures and Python versions es-python can be installed for. Needs no API key.

Inputs: os. Returns: object

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.2/5.0

    Scored across 19 tools

    Disambiguation4/5

    Most tools target clearly distinct resources (events, runs, machines, rules, filters, labels, account). Minor overlap exists between event_stats (dashboard summary) and event_counts (per-product/quota counts), and between list_event_names (sink labels) and list_labels (triage labels), which could cause occasional misselection.

    Naming Consistency4/5

    Consistent snake_case throughout, with a predictable verb_noun pattern for most tools (list_rules, get_event, search_events). A subset deviates to bare noun_phrases (event_stats, event_counts, event_map, ci_findings, supported_targets), which is a minor but noticeable inconsistency.

    Tool Count4/5

    19 tools is slightly above the ideal 3-15 range but justified by a broad security-monitoring domain spanning events, runs, machines, rules, filters, labels, findings and account state. Each tool maps to a distinct capability, so nothing feels padded.

    Completeness3/5

    The surface is heavily read-only: many list_*/get_*/search_* tools but no create/update/delete for rules, filters, labels, saved searches or machines. Core investigation workflows are well covered, but lifecycle/mutation operations are notably absent, limiting it as a full management surface.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables read-only access to SentinelOne's platform through MCP, allowing security investigations, threat hunting, and asset inventory queries via natural language.
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables read-only MCP access to Tactical RMM, allowing agents to query devices, clients, sites, audit logs, software, and pending actions without any mutating capabilities.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables read-only inspection of Google Ads accounts through MCP, including account inventory, reporting, metadata, change history, and safe GAQL queries.
      Apache 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables read-only access to Autobase Console projects, clusters, environments, operations, PostgreSQL versions, and extensions through configurable MCP tools. Supports paginated listing and filtering, with limited redacted operation logs and no write or arbitrary execution tools.
      MIT