# EyalSec (pypi · eyalsec-mcp)

Read your EyalSec security events, machines, runs and rules from an AI assistant.

- Trust score: 55/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-18

## Components

- pypi · `eyalsec-mcp`: 55/100 (this document), [markdown](https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp.md), [page](https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp)

## Channel facts

- Registry: `pypi`
- Package: `eyalsec-mcp`
- Version: `0.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, 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-10-18.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 31 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 45/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 2 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 70/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 2150 tokens (~113/item across 19 items; 19 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **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.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 19 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 20 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

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

EyalSec runs locally as a PyPI package, launched with uvx eyalsec-mcp. 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 eyalsec-eyalsec-mcp -- uvx eyalsec-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "eyalsec-eyalsec-mcp": {
      "command": "uvx",
      "args": [
        "eyalsec-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "eyalsec-eyalsec-mcp": {
      "command": "uvx",
      "args": [
        "eyalsec-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add eyalsec-eyalsec-mcp -- uvx eyalsec-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "eyalsec-eyalsec-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "eyalsec-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add eyalsec-eyalsec-mcp --command uvx --arg eyalsec-mcp
```

### Hermes

```yaml
mcp_servers:
  eyalsec-eyalsec-mcp:
    command: "uvx"
    args: ["eyalsec-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "eyalsec-eyalsec-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "eyalsec-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add eyalsec-eyalsec-mcp -t stdio -c uvx -a eyalsec-mcp
```

### Other

```json
{
  "mcpServers": {
    "eyalsec-eyalsec-mcp": {
      "command": "uvx",
      "args": [
        "eyalsec-mcp"
      ]
    }
  }
}
```

## 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-10-18 (score 55, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-17 (score 70, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-16 (score 55, −15)

- [security regression] Malware scan: pass → unverified

### 2026-10-15 (score 70)

First indexed and scored.

## MCP tools (19)

### `search_events` (~514 tokens)

Search events

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.

Input parameters:

- `advanced`: The events page condition builder, passed through as is: {"match": "all"|"any", "conditions": [{"field": "sink", "op": "contains", "value": "sql", "negate": false}]}.
- `bucket`: 'live' (default: events not suppressed), 'suppressed', or 'all'.
- `cursor`: next_cursor from a previous call with the same filters, to continue.
- `date_from`: Start date, YYYY-MM-DD or RFC3339.
- `date_to`: End date, YYYY-MM-DD or RFC3339; includes that whole day.
- `labels`: Label ids (from list_labels) to keep.
- `limit` (integer): Stop once at least this many events are collected (whole pages of up to 100).
- `machine`: One machine, by its display name (exact match).
- `run_uid`: Only events produced by this run (a run_uid from list_runs or get_event). es-python only.
- `severity`: Keep only these severities.
- `sink_exclude`: Case-insensitive regex; drop events whose sink label ('where') matches.
- `sink_include`: Case-insensitive regex; keep only events whose sink label ('where') matches.
- `sort`: 'newest' (default) or 'severity' (most severe first).
- `sources`: Keep only these taint source categories.
- `tags`: Impact classes to keep, such as 'xss' or 'sqli'.
- `value_chars` (integer): Cut each event's str_repr to this many characters (0 = no cut).
- `view`: Which product's events: 'python' (es-python) or 'browser' (es-chromium). Omit for every product on the account.
- `xss_only`: Only es-chromium events whose sink can run script. Needs view='browser'.

### `get_event` (~79 tokens)

Get one event

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.

Input parameters:

- `event_id` (integer, required): The event id (the 'id' field of a search_events result).

### `event_stats` (~43 tokens)

Event statistics

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.

### `event_counts` (~103 tokens)

Event counts

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

Input parameters:

- `bucket`: 'live' (default: events not suppressed), 'suppressed', or 'all'.
- `view`: Which product's events: 'python' (es-python) or 'browser' (es-chromium). Omit for every product on the account.

### `list_event_names` (~31 tokens)

Event names

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

### `event_map` (~369 tokens)

Events map

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.

Input parameters:

- `advanced`: The events page condition builder, passed through as is: {"match": "all"|"any", "conditions": [{"field": "sink", "op": "contains", "value": "sql", "negate": false}]}.
- `bucket`: 'live' (default: events not suppressed), 'suppressed', or 'all'.
- `date_from`: Start date, YYYY-MM-DD or RFC3339.
- `date_to`: End date, YYYY-MM-DD or RFC3339; includes that whole day.
- `focus_file`: Focus on one file path, exactly as listed in 'files'.
- `focus_sink`: Focus on one sink, exactly as listed in 'sinks'.
- `focus_source`: Focus on one source category (or 'other') and list its newest events.
- `labels`: Label ids (from list_labels) to keep.
- `machine`: One machine, by its display name (exact match).
- `run_uid`: Only events produced by this run (a run_uid from list_runs or get_event). es-python only.
- `severity`: Keep only these severities.
- `sink_exclude`: Case-insensitive regex; drop events whose sink label ('where') matches.
- `sink_include`: Case-insensitive regex; keep only events whose sink label ('where') matches.
- `sources`: Keep only these taint source categories.
- `tags`: Impact classes to keep, such as 'xss' or 'sqli'.

### `list_runs` (~114 tokens)

List runs

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.

Input parameters:

- `before`: next_before from a previous call, to continue.
- `limit` (integer): Rows per page.
- `machine`: One machine, by its display name (exact match).
- `q`: A case-insensitive piece of the command line.

### `ci_findings` (~127 tokens)

CI findings

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

Input parameters:

- `limit`: How many findings to list, worst first.
- `machine` (string, required): The machine's name.
- `min_severity`: Threshold; the default is 'high'.
- `since` (string, required): Start of the window: RFC3339 (2026-10-07T12:00:00Z), Unix seconds or an HTTP date.

### `list_saved_searches` (~37 tokens)

Saved searches

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

Input parameters:

- `view` (string): 'python' (default) or 'browser'.

### `list_labels` (~31 tokens)

Labels

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

### `list_machines` (~51 tokens)

List machines

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.

### `supported_targets` (~57 tokens)

Supported targets

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

Input parameters:

- `os`: An OS target such as 'ubuntu_24_04_x86_64' to list only the Python versions for it.

### `list_rules` (~62 tokens)

Rules

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

Input parameters:

- `machine`: A machine's public_id (from list_machines), or omit for the account-wide (global) scope.

### `list_filters` (~42 tokens)

Filters

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

Input parameters:

- `engine`: 'python' or 'browser' for one product's Filters page.

### `get_taint_settings` (~65 tokens)

Taint settings

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

Input parameters:

- `machine`: A machine's public_id (from list_machines), or omit for the account-wide (global) scope.

### `get_event_uniqueness` (~70 tokens)

Unique-event definition

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

Input parameters:

- `agent_kind` (string): The product: 'python' or 'browser'.
- `machine`: A machine's public_id (from list_machines), or omit for the account-wide (global) scope.

### `list_rule_templates` (~32 tokens)

Rule templates

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

### `get_account` (~44 tokens)

Account

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.

### `list_activity` (~105 tokens)

Activity log

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

Input parameters:

- `action`: One exact action name, such as 'machine.create' or 'auth.login'.
- `before_id`: Next page: the 'id' of the last entry received.
- `before_ts`: Next page: the 'time' of the last entry received.
- `outcome`: Keep only this outcome.

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp#diagnostics

## Score history

- 2026-10-18: 55
- 2026-10-17: 70
- 2026-10-16: 55
- 2026-10-15: 70

## Common questions

### What is the EyalSec MCP server?

EyalSec is an MCP server listed in the public MCP registry as io.github.EyalSec/eyalsec-mcp. Read your EyalSec security events, machines, runs and rules from an AI assistant. This page covers its PyPI package (eyalsec-mcp).

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

EyalSec scores 55 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. 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 EyalSec MCP server expose?

EyalSec exposes 19 tools: search_events, get_event, event_stats, event_counts, list_event_names, and 14 more. Their descriptions and schemas cost roughly 1,976 tokens of context every time the server is loaded.

### Is the EyalSec MCP server still maintained?

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

### What licence is the EyalSec MCP server under?

EyalSec declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/eyalsec-mcp/
- Socket report: https://socket.dev/pypi/package/eyalsec-mcp
- Repository: https://github.com/EyalSec/eyalsec-mcp
- Website: https://eyalsec.com/
- Changelog RSS feed: https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp.json
- HTML version of this page: https://verifymcp.io/servers/eyalsec-eyalsec-mcp/eyalsec-mcp
