About ICHI — Internet Cyber Health Index
ichi-mcp is a stdio MCP server built with the official Python MCP SDK, letting AI assistants read the free public ICHI API. It exposes daily internet-wide threat readings, critical alerts, and source health without calculating scores or adding data.
Key features
- 01Read current score and threat band
- 02Inspect dimension scores and data freshness
- 03Retrieve recent critical advisories
- 04Check source health and feed status
- 05Return JSON errors for failed responses
Use cases
- 01Check the daily internet threat level in an assistant
- 02Review whether index inputs are stale or impaired
- 03Retrieve recent cybersecurity advisories
MCP support
The stdio MCP server provides tools for MCP clients to read ICHI's public API, including the current index, alerts, and source health.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
We haven’t collected a package or remote endpoint for this server. Follow the instructions in the project README.
Tools
Local servers expose tools only once running on your machine, and the maintainer has not provided a tool list.
Details
From the project READMEichi-mcp
A minimal Model Context Protocol (MCP) stdio
server, built on the official Python mcp SDK, that lets an AI assistant read
the free public ICHI API. No API key is needed.
What ICHI is (and is not)
ICHI — the Internet Cyber Health Index — is a free, publicly accessible, source-transparent daily barometer of internet-wide cyber threat conditions, created by Joe Bernik. It is an outside-in directional signal. It is not an organization-specific risk score, not a deterministic forecast, and not a substitute for your own internal telemetry. The band is the operative read; moves within a band should be treated as noise. See the methodology.
This repository is maintained by/for ICHI's creator.
Tools
| Tool | Source | Returns |
|---|---|---|
get_current_index | GET /api/current-index | score, rounded score, band + band range, evaluation time, model, per-dimension sub-scores with human-readable names and contributions, informational (unscored) values, freshness/impairment info (headline state, age, stale/impaired/invalid inputs, degraded dimensions), links |
get_recent_alerts(limit=5) | GET /api/alerts (RSS 2.0) | latest N (1–50) items from ICHI's critical-advisory feed: title, link, id, published (ISO-8601), category, description |
get_source_health | GET /api/health | overall status and confidence, feed counts (live/stale/delayed/failed, by tier), sources included in the score, and names of failed/stale/delayed/dormant/not-connected feeds |
Every tool returns a JSON object with "ok": true, or "ok": false plus an
"error" message on timeouts, HTTP errors, or unparseable responses — the
server never crashes on a bad upstream response.
Install / run
Requires Python ≥ 3.10. With uv:
uvx --from git+https://github.com/bernik-bot/ichi-mcp ichi-mcp
Pin a release with git+https://github.com/bernik-bot/[email protected].
Or with pip: pip install git+https://github.com/bernik-bot/ichi-mcp then run ichi-mcp.
(Not published on PyPI.)
Claude Desktop
Add to claude_desktop_config.json
(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"ichi": {
"command": "uvx",
"args": ["--from", "git+https://github.com/bernik-bot/ichi-mcp", "ichi-mcp"]
}
}
}
If uvx isn't on Claude Desktop's PATH, use its absolute path (which uvx).
Generic MCP client (stdio)
{
"command": "uvx",
"args": ["--from", "git+https://github.com/bernik-bot/ichi-mcp", "ichi-mcp"],
"env": { "ICHI_TIMEOUT": "10" }
}
Configuration
| Env var | Default | Meaning |
|---|---|---|
ICHI_TIMEOUT | 10 | HTTP timeout in seconds |
ICHI_BASE_URL | https://ichi.global | API base URL (testing only) |
Example output (abridged, from a live call)
{
"ok": true,
"score": 64.91,
"rounded": 65,
"band": "ELEVATED",
"band_range": "50-69",
"evaluated_at": "2026-10-31T13:30:22.978Z",
"model": "v7.1",
"dimensions": [
{"key": "V", "name": "Vulnerability Pressure", "score": 42.21, "contribution": 8},
{"key": "C", "name": "C2 / Malware Infrastructure", "score": 96.03, "contribution": 13.14}
],
"freshness": {"headline_state": "LIVE", "age_seconds": 267, "completeness": "COMPLETE", "stale_inputs": [], "impaired_sources": []},
"link": "https://ichi.global"
}
Limitations
- Reads only ICHI's public endpoints; it does no scoring of its own and adds no data.
- Dimension names are mapped from API keys using the published methodology
(model v7.x). The API key
Pis the phishing-driven dimension the methodology labels "O — Actor Operations"; the informationalOvalue is labelled as Outages. Unknown keys are passed through unchanged. If ICHI's schema changes, missing fields come back asnullrather than errors. - The alerts feed is ICHI's critical-advisory RSS feed; per its own description it is observation only and carries no score.
- No caching: each tool call makes one HTTP request. ICHI's current index is re-evaluated about every 10 minutes.
Development
uv venv && uv pip install -e ".[dev]"
ruff check . && pytest -q # tests mock HTTP, no network
python examples/smoke_client.py # live end-to-end over stdio via the MCP client
Works with both mcp 1.x (FastMCP) and 2.x (MCPServer, the renamed FastMCP);
CI tests both.
License
MIT
Daily ICHI readings and exploited-vulnerability alerts are posted on X by @ICHI_Global (automated, run by ICHI's creator).
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.