io.github.cyanheads/first-epss-mcp-server
io.github.cyanheads/first-epss-mcp-servercyanheadsstreamable-httpv0.1.3Scanned
Look up FIRST EPSS scores and daily history, find CVEs by threshold, and prioritize them with CVSS.
5 tools: 1 change things and 4 only read.
- Reads private data · 0
- Reads text others write · 4
- Can send data out · 0
- 1 finding
Anlyon alternative
1 of these tools change something. Run those as governed actions.
Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.
Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.
Import an OpenAPI spec →Tools
Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.
5 tools
Changes things 1Claude Code: ask
epss_prioritize_cvesAssign remediation tiers using latest or dated EPSS and caller-supplied CVSS base severity.Reads text others write1 finding
Why it is in this group
- The description's first verb is "assign": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Findings
- Warn
The server marks "epss_prioritize_cves" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "assign": a word for a change.
Description, as the server wrote it Assign remediation tiers using latest or dated EPSS and caller-supplied CVSS base severity. Defaults are severity >= 7 and EPSS probability >= 0.10; select percentile explicitly for population rank. Missing severity stays in epssOnly and missing EPSS stays unscored. Thresholds are policy conventions, not FIRST guidance. Process up to 500 unique entries from batchOffset, returning whole entries within the byte budget. Resume using nextBatchOffset as batchOffset, the original cves with original cvssBaseScore values, returned score date as date, and the same severityThreshold and likelihood. Deferred lists may be declared previews; withheldCves were already processed.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
Only reads 4Show 4 read-only tools
epss_get_scoresRetrieve latest available or historically dated FIRST EPSS probability and percentile for supplied CVEs.Reads text others writeNo findings
Why it is in this group
- The name "epss_get_scores" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Retrieve latest available or historically dated FIRST EPSS probability and percentile for supplied CVEs. Process up to 500 unique entries from batchOffset; response byte limits can return fewer whole entries. Resume with nextBatchOffset as batchOffset, the original cves and returned score date as date. deferredCves were not queried; withheldCves were processed but omitted, and either list can be a declared preview. Missing scores remain unknown; use epss_list_reference for coverage and interpretation.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
epss_get_timeseriesRetrieve an EPSS anchor and up to 30 preceding daily observations for up to 50 unique CVEs from batchOffset.Reads text others writeNo findings
Why it is in this group
- The name "epss_get_timeseries" says "get": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Retrieve an EPSS anchor and up to 30 preceding daily observations for up to 50 unique CVEs from batchOffset. Response byte limits retain whole history items. Resume CVE batches with nextBatchOffset as batchOffset, the original cves and returned score date as date; withheldCves were processed, deferredCves were not queried, and lists can be declared previews. Exact 7-day and 30-day deltas require their calendar baselines; gaps remain unknown. Model boundaries do not explain score movement. Re-anchor using previousAnchorDate for the preceding history window; that snapshot may be unavailable.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
epss_list_referenceExplain FIRST EPSS interpretation, model publishing dates, lookup coverage and transparent prioritization policy.No findings
Why it is in this group
- The name "epss_list_reference" says "list": a word for reading.
Description, as the server wrote it Explain FIRST EPSS interpretation, model publishing dates, lookup coverage and transparent prioritization policy. Use this static reference before interpreting missing scores, score movement or probability versus percentile thresholds.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: false
epss_query_thresholdDiscover CVEs using inclusive EPSS or percentile bounds, CVE year or dataset-addition recency; filters intersect and at least one is required.Reads text others writeNo findings
Why it is in this group
- The name "epss_query_threshold" says "query": a word for reading.
What it can reach
- untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
Description, as the server wrote it Discover CVEs using inclusive EPSS or percentile bounds, CVE year or dataset-addition recency; filters intersect and at least one is required. Examine one candidate page ordered by EPSS descending. Each serialized response surface fits 65536 UTF-8 bytes; budgetLimited and withheldCount disclose whole matches withheld, with nextOffset at the first withheld match. Year filtering can return an empty page with nextOffset; candidateTotal is a broad-query total, not an exact-year total. Continue with the same filters, limit, returned score date and nextOffset.
Annotations the server declares
- readOnlyHint: true
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Exfil surface
Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.
No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.
- Reads private data0
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write4
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out0
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.
Findings
Matches of fixed checks, with the text they matched.
The server marks "epss_prioritize_cves" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "assign": a word for a change.
History
Changes to its tool definitions and to its remote endpoint, newest first.
No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.
Install
Pinned to version 0.1.3. Values in angle brackets are yours to fill in.
claude mcp add --transport http first-epss https://first-epss.caseyjhand.com/mcpclaude mcp add --transport http first-epss https://first-epss.caseyjhand.com/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__first-epss__epss_get_scores",
"mcp__first-epss__epss_get_timeseries",
"mcp__first-epss__epss_query_threshold",
"mcp__first-epss__epss_list_reference"
],
"ask": [
"mcp__first-epss__epss_prioritize_cves"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as first-epss. Review it before you use it.
Capability tags behind 4 rules
- mcp__first-epss__epss_get_scores untrusted-input
- mcp__first-epss__epss_get_timeseries untrusted-input
- mcp__first-epss__epss_query_threshold untrusted-input
- mcp__first-epss__epss_prioritize_cves untrusted-input
Pin
Keep the decision: fail CI when the tools change, follow every change, or show a badge.
Pin in CI
Fail a build when the tools you reviewed are not the tools the server serves today.
curl -s "https://anlyon.dev/api/v1/servers/io.github.cyanheads/first-epss-mcp-server/verify?hash=fa6d11d2140b0fb9c817eebcf2defc31e3b8883510a289f50b6cccb3764d80a1" | jq -e '.changed == false'Pinned hash fa6d11d2140b, from Oct 24, 2026, 21:17 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/io.github.cyanheads/first-epss-mcp-server/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/io.github.cyanheads/first-epss-mcp-server)Source: MCP Registry · repository. Synced Oct 24, 2026, 21:17 UTC.