maltiverse-mcp
A local stdio MCP server that exposes the Maltiverse threat-intelligence API to Claude Code and any other MCP client. Give it an IP, domain, URL, or file hash and it returns Maltiverse's verdict, threat attributions, and behaviour flags — or hunt the whole dataset with a search query.
All tools are read-only. The API key is supplied only through the
MALTIVERSE_API_KEY environment variable that claude mcp add --env injects —
there are no config files, no prompts, and no --api-key flag (which would leak
into shell history and ps).
Tools
| Tool | What it does | Kind |
|---|---|---|
maltiverse_check_indicator |
Look up any IoC (IP / domain / URL / hash); type auto-detected | read-only |
maltiverse_check_ip |
Reputation of an IPv4/IPv6 address | read-only |
maltiverse_check_hostname |
Reputation of a hostname/domain | read-only |
maltiverse_check_url |
Reputation of a full URL (hashed to Maltiverse's checksum) | read-only |
maltiverse_check_sample |
Reputation of a malware sample by MD5/SHA-1/SHA-256/SHA-512 | read-only |
maltiverse_search |
Search the IoC dataset with Elasticsearch query-string syntax (paginated) | read-only |
Each lookup accepts response_format: concise (default — verdict, threat
names, feeds, key flags) or detailed (adds full per-feed attributions).
Install
pip install maltiverse-mcp
# or
uv tool install maltiverse-mcp
# or run with zero install
uvx maltiverse-mcp
Get a free API key from your Maltiverse profile ("Generate API Key").
Claude Code setup (the claude CLI)
Claude Code ≠ Claude Desktop. The
claude mcpcommands below configure Claude Code (the CLI / IDE extension) and write to~/.claude.json. They do not affect the Claude Desktop GUI app, which reads a different file — see Claude Desktop app for that. If you add a server withclaude mcp addand don't see it in the desktop app, this is why.
# pip install (the console script must be on PATH)
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=YOUR_KEY -- maltiverse-mcp
# zero-install via uv
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=YOUR_KEY -- uvx maltiverse-mcp
# if the script isn't on PATH (a project venv, pyenv, etc.), use an absolute path
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=YOUR_KEY -- /abs/path/to/.venv/bin/maltiverse-mcp
# ...or point at a specific interpreter and run the module
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=YOUR_KEY -- /abs/path/to/.venv/bin/python -m maltiverse_mcp
Then:
claude mcp list # shows: maltiverse ✔ Connected
claude mcp get maltiverse # full config + connection status
# inside a `claude` session, run /mcp to see the server and its tools
Argument order matters.
--envaccepts multipleKEY=valuepairs, so never put the server name directly after--env. Keep the name before--env(as above), or put another flag in between. The--separates Claude's own flags from the command that launches the server.
Choosing a scope
--scope decides where the server is registered and therefore where it shows up:
| Scope | Stored in | Visible in |
|---|---|---|
user |
~/.claude.json |
every Claude Code session, any directory (recommended) |
local |
~/.claude.json (per-project) |
only sessions started in that one directory |
project |
committed .mcp.json |
anyone who checks out the repo (see Team setup) |
If you added it with --scope local and it "disappeared", you were likely running
claude from a different directory. Re-add it with --scope user:
claude mcp remove maltiverse -s local # drop the project-scoped one (if any)
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=YOUR_KEY -- maltiverse-mcp
Rotating the key
claude mcp remove maltiverse -s user
claude mcp add --scope user --transport stdio maltiverse \
--env MALTIVERSE_API_KEY=NEW_KEY -- maltiverse-mcp
Team setup (committed .mcp.json, no secret)
Commit this and let each developer provide the key via their own environment:
{
"mcpServers": {
"maltiverse": {
"type": "stdio",
"command": "maltiverse-mcp",
"env": { "MALTIVERSE_API_KEY": "${MALTIVERSE_API_KEY}" }
}
}
}
Claude Desktop app (the GUI)
The desktop app does not read ~/.claude.json and is not configured by the
claude mcp commands. It has its own config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Edit that file by hand (create it if missing) and add a maltiverse entry under
mcpServers, keeping any existing servers:
{
"mcpServers": {
"maltiverse": {
"command": "/abs/path/to/.venv/bin/maltiverse-mcp",
"env": { "MALTIVERSE_API_KEY": "YOUR_KEY" }
}
}
}
- Use an absolute
commandpath — the desktop app does not inherit your shellPATH, so a baremaltiverse-mcp(oruvx) usually won't resolve. If you installed into a venv, point at.venv/bin/maltiverse-mcp; its shebang selects the right Python automatically. (On Windows use.venv\\Scripts\\maltiverse-mcp.exe.) - macOS: do not put the venv under
~/Documents,~/Desktop, or~/Downloads. The desktop app has no privacy (TCC) permission for those folders, so the spawned Python fails withPermissionError: [Errno 1] Operation not permitted: .../pyvenv.cfgand the server shows "Server disconnected". Install into a venv elsewhere (e.g.~/.venvs/maltiverse-mcp) and pointcommandthere — or grant the app access under System Settings → Privacy & Security → Files and Folders / Full Disk Access. - This is plain JSON — there is no
--transport/--env/--syntax here; usecommand, optionalargs, andenv. - After saving, fully quit the app (⌘Q on macOS / right-click → Quit in the tray on Windows — closing the window is not enough) and reopen it. The server appears under the tools/🔌 menu.
Environment variables
| Variable | Required | Default | Purpose |
|---|---|---|---|
MALTIVERSE_API_KEY |
yes (for tool calls) | — | Bearer API key from your Maltiverse profile |
MALTIVERSE_BASE_URL |
no | https://api.maltiverse.com |
Override the API base URL |
MALTIVERSE_TIMEOUT |
no | 30 |
Per-request timeout in seconds |
MALTIVERSE_LOG_LEVEL |
no | WARNING |
Logging level (logs go to stderr) |
The server starts fine without a key — it stays connected and its tools are discoverable — but any tool call returns an actionable error telling you how to set the key.
Security: for
user/localscope the key is stored by Claude Code in~/.claude.json. Don't commit that file, and don't commit a.mcp.jsonthat contains the literal key — use${MALTIVERSE_API_KEY}expansion as shown above.
Troubleshooting
claude mcp get maltiverse # inspect config + connection status
- In a session, run
/mcpto see server status and the tool list. - Slow to start?
MCP_TIMEOUT=10000 clauderaises the startup timeout. - Output truncated? Raise
MAX_MCP_OUTPUT_TOKENS(responses default to ≤20 results). - "Failed to connect" almost always means the
maltiverse-mcpconsole script isn't onPATH. Use the absolute-interpreter form above (-- /abs/path/to/python -m maltiverse_mcp). - Claude Desktop shows "Server disconnected" right after starting, with
PermissionError: ... Operation not permitted: .../pyvenv.cfgin its logs — the venv is under a macOS-protected folder (~/Documents/~/Desktop/~/Downloads). See Claude Desktop app: install the venv elsewhere (e.g.~/.venvs/maltiverse-mcp) or grant the app Files-and-Folders access.
Development
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
ruff check . && ruff format --check . && mypy src && pytest -q
Inspect it interactively with the MCP Inspector (set MALTIVERSE_API_KEY in its UI):
npx @modelcontextprotocol/inspector maltiverse-mcp
License
MIT — see LICENSE.
Metadata
Release files for maltiverse-mcp 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| maltiverse_mcp-0.1.0.tar.gz | 22.9 kB | With provenance | Details for maltiverse_mcp-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| maltiverse_mcp-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for maltiverse_mcp-0.1.0-py3-none-any.whl |
Total release size: 44.4 kB
Release files / maltiverse_mcp-0.1.0.tar.gz
| Download URL | maltiverse_mcp-0.1.0.tar.gz |
|---|---|
| Size | 22.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2807320f966c1c11b4954da3da8cdeb4949b6131c0b4d085ded24df16d0787fa
|
|
BLAKE2b-256 checksum How to use checksums |
fc8146fd0c80cc7c8990a3657803b27f82809b98f0c355a61895e15d062febd0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logRelease files / maltiverse_mcp-0.1.0-py3-none-any.whl
| Download URL | maltiverse_mcp-0.1.0-py3-none-any.whl |
|---|---|
| Size | 21.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bea0ca77d6ebd84c14e4e1355dd3af7eba426e11c3f808609daa1ed1068c054e
|
|
BLAKE2b-256 checksum How to use checksums |
6be547effc388e41395e77855979a07533d15b90f99fd060ee7fc20fdc51824f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logSecurity for maltiverse-mcp 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for maltiverse_mcp-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Nov 3, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.