EyalSec MCP Server
OfficialEyalSec MCP Server gives MCP clients read-only access to your EyalSec account for event triage, machine/runs/rules inspection, and account activity queries.
Search and page through events with filters for product, severity, dates, machine, taint source, impact class, label, sink regex, run, bucket, and advanced conditions.
Get one event's full detail: stack trace, origin, value creation, nearby source code, note, and producing runs.
View event stats, per-product live/suppressed counts, quota usage, and distinct sink/event names.
Build a graph/map of es-python events by source, file, and sink, with counts and worst severity.
List runs behind events, including command lines (secrets masked), and filter events by run_uid.
Check CI findings on a machine since a timestamp, counted by severity and with new findings.
List machines with status, OS target, product, build/update flags, and supported installation targets.
Inspect configuration: rules, filters, taint settings, event uniqueness, and rule templates.
List triage labels and saved searches.
Read account profile, limits, key scope/expiry, setup progress, and the activity/audit log.
Everything is read-only: the server has no write/add/change/delete path, and a read-only API key is recommended.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@EyalSec MCP Server show me the full trace for event 90210"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
EyalSec MCP server
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-mcpClaude 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-mcpUse 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 --checkIt calls the API once and prints the account it reached, the key's scope and the number of machines.
Settings
Variable | Required | Meaning |
| yes | Your API key, from Settings > API access. Read-only is enough. |
| no | Your EyalSec address. Defaults to |
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 |
| 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. |
| 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. |
| The dashboard summary: totals, the last hour, day and week, top event types and a 14-day timeline. |
| How many events each product's list holds, live versus suppressed, and the count toward your monthly quota. |
| The distinct sink labels across your events, handy for building a filter. |
| The es-python events as a graph: sources, the files data was read from, and the operations it reached. |
| The program invocations behind your events, with their command lines (secrets masked). |
| What runs on one machine reported since a moment, counted by severity, with which findings are new. |
| Every machine: status, OS target, product, installed and newest build, and whether an update is waiting. |
| The Linux distributions, architectures and Python versions es-python installs on. |
| How your account and each machine are configured. |
| Your triage labels and saved searches. |
| 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.pyproduced 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_eventsreads 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]'
pytestThe 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 toolsci_findingsCI findingsARead-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 countsCRead-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 mapBRead-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 statisticsBRead-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_accountAccountARead-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 eventARead-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 definitionCRead-onlyIdempotent
What makes two detections count as the same event for one product and scope.
Inputs: machine, agent_kind. Returns: object
get_taint_settingsTaint settingsARead-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 logARead-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 namesARead-onlyIdempotent
The distinct sink labels (the 'where' field) across the account's events, useful for building filters.
Inputs: no named parameters. Returns: object
list_filtersFiltersCRead-onlyIdempotent
The account's event filters (standing blacklist or whitelist patterns on the events page).
Inputs: engine. Returns: object
list_labelsLabelsARead-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 machinesBRead-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_rulesRulesCRead-onlyIdempotent
The rules in one scope. Mode 1 = Hide, 2 = Show, 3 = Raise, 4 = Don't send.
Inputs: machine. Returns: object
list_rule_templatesRule templatesARead-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 runsARead-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 searchesCRead-onlyIdempotent
The account's saved events-page searches for one product.
Inputs: view. Returns: object
search_eventsSearch eventsARead-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 targetsBRead-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
Scored across 19 tools
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.
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.
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.
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
Related MCP Connectors
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Read-only access to a Lumin project's logs, metrics, uptime checks, alerts and infrastructure.
Read-only access to your Infrly services, deploys, logs, metrics and billing.
Read-only access to your Citlyze workspace: AI search visibility, citations, and recommendations.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables read-only access to SentinelOne's platform through MCP, allowing security investigations, threat hunting, and asset inventory queries via natural language.MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityBmaintenanceEnables read-only inspection of Google Ads accounts through MCP, including account inventory, reporting, metadata, change history, and safe GAQL queries.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables 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