node804-hpe-msa
A token-efficient, read-only Model Context Protocol
server for HPE MSA (Modular Smart Array) storage — Gen5 (1050/2050/2052) and
Gen6 (1060/2060/2062). It exposes the array's show-style visibility through the
MSA REST management API, shaped for minimal token use.
Part of the Node804 MCP suite; shares
node804-mcp-toolkit for RBAC, TLS, audit, and response
shaping, and mirrors the conventions of node804-panos-mcp.
Design principles
- Lean responses by default — each tool returns a curated field whitelist;
verbose=trueopts into the full response. Typically 40–70% fewer tokens. - Read-only by construction — every tool is a
showcommand. No provisioning/write tool is registered, ever.MSA_MODEnever registers a surface aboveread. - TLS verification on by default — MSA controller certificates are often self-signed; disabling verification is an explicit opt-in that warns.
- No confident-empty — a failed auth/transport/command returns an
error, never a misleading empty inventory.
HPE MSA engineer skill
The repo also ships a skill, skills/hpe-msa-engineer/SKILL.md,
that teaches the model how to work with an MSA through these tools: to reach for
get_health_summary before dumping inventories, to read health from the
health/health-reason fields, to treat an error result as "unknown" rather
than "empty", and to follow named playbooks (health check, capacity review, disk
failure triage, mapping audit, performance review, event/alert triage, firmware
inventory). The server works without it, but the model makes fewer calls and
fewer mistakes with it. The setup wizard installs it for you (below), and it is
bundled inside the published wheel so the wizard can install it offline.
Installation
Requires Python ≥ 3.13.
Option A — uv (recommended). No install step: uvx fetches the package from
PyPI on first run and caches it. Pin the version so upgrades are deliberate:
uvx node804-hpe-msa==0.1.0
Option B — pip:
pip install node804-hpe-msa
Option C — from source (development):
git clone https://github.com/Node804/node804-hpe-msa.git
cd node804-hpe-msa
uv sync # or: pip install -e ".[dev]"
Each option provides the node804-hpe-msa command (and the
node804-hpe-msa-setup wizard), plus the hpe_msa_mcp Python module
(runnable as python -m hpe_msa_mcp). The package pulls in its dependency
node804-mcp-toolkit — shared
RBAC, audit-logging, TLS, and lean-response utilities — automatically.
On Windows, a pip/venv install puts the console scripts at
.venv\Scripts\node804-hpe-msa.exe (and ...-setup.exe); on Linux/macOS at
.venv/bin/node804-hpe-msa. When configuring an MCP host, use the command's
absolute path (or run it via uvx) — see the Claude Desktop
section for a full Windows example.
Quick setup (wizard)
After a pip install, the fastest way to get configured is the bundled wizard:
node804-hpe-msa-setup
If
node804-hpe-msa-setupisn't found, the console script isn't on yourPATH(common with a pip--userinstall or a venv that isn't active). Use the module form instead — it's identical and works for every subcommand below:python -m hpe_msa_mcp.setupUse the full interpreter path if
pythonisn't the one you installed into, e.g.C:\Python313\python.exe -m hpe_msa_mcp.setup.
The wizard walks through everything the server needs:
- an
arrays.jsonentry (name + host, or a comma-separated failover list); - the controller password, read with
getpassand stored straight in the OS keychain — never written to disk; - optional shared default credentials (one monitoring user+password reused by every array that has none of its own);
- a Claude Desktop server entry pointing at this interpreter, with no host or password in the config (both resolve from 1/2); and
- installing the
hpe-msa-engineerskill — copied into~/.claude/skillsfor Claude Code, and zipped for upload to Claude Desktop / claude.ai.
Nothing sensitive is echoed, and the Claude Desktop config is backed up before it
is touched. For a scripted, non-interactive install, provide the password in the
MSA_SETUP_PASSWORD environment variable and pass --yes:
MSA_SETUP_PASSWORD='...' node804-hpe-msa-setup \
--name prod --host 10.0.0.10,10.0.0.11 --username monitor \
--claude --skill --yes
Run node804-hpe-msa-setup --help (or python -m hpe_msa_mcp.setup --help)
for every flag. The wizard is modify-aware: when arrays.json already has
entries it lists them and lets you skip straight to the client/skill steps, so
re-running it never forces you to re-enter an array. It also exposes subcommands
for day-to-day changes:
# Upgrade just the skill (after pip install -U node804-hpe-msa)
node804-hpe-msa-setup skill
# Manage arrays.json without the full wizard
node804-hpe-msa-setup array list
node804-hpe-msa-setup array add --name branch --host 10.0.0.30
node804-hpe-msa-setup array remove --name branch
Configuration
Credentials
Two sources, in priority order:
-
arrays.json(multi-array) — at$MSA_ARRAYS_CONFIG, or the default location:- Linux/macOS:
~/.config/hpe-msa-mcp/arrays.json - Windows:
%USERPROFILE%\.config\hpe-msa-mcp\arrays.json(e.g.C:\Users\you\.config\hpe-msa-mcp\arrays.json)
Passwords live in the OS keychain (service
hpe-msa-mcp— on Windows this is Credential Manager); the file holds only non-secret fields. A plaintextpasswordin the file (per-array or indefaults) is auto-migrated to the keychain on first load and stripped from the file.One entry per array, not per controller. An MSA is a single logical management target — logging into either controller returns the whole array, so a second entry for controller B would just be a duplicate. To survive a controller's management port going down, either point
hostat the array's management VIP, or give one entry ahostslist (e.g. both controller IPs); the client tries them in order and settles on the first that answers.{ "arrays": [ { "name": "san-a", "host": "10.0.0.10", "username": "manage" }, { "name": "san-b", "hosts": ["10.0.0.20", "10.0.0.21"], "username": "manage" } ] }
Shared credentials (same monitoring user on every array). Set the username + password once as shared defaults, then list just
{ name, host }per array — each inherits the defaults, and any entry can overrideusername(or set its own keychain password). Resolution is per-array → default → env:{ "defaults": { "username": "monitor" }, "arrays": [ { "name": "san-a", "host": "10.0.0.10" }, { "name": "san-b", "hosts": ["10.0.0.20", "10.0.0.21"] }, { "name": "san-c", "host": "10.0.0.30", "username": "admin" } ] }
The shared default password is never stored in the file — it lives in the keychain default account. Set it (and the default username), and register arrays with just a name + host, using the
node804-hpe-msa-setupwizard. Or, for a fully env-driven setup, leavedefaults.usernameout and setMSA_USERNAME+MSA_PASSWORD— they act as the shared default for every array entry that doesn't specify its own. - Linux/macOS:
-
Environment fallback (single array) — used when no
arrays.jsonexists:Linux/macOS:
export MSA_HOST=10.0.0.10 export MSA_USERNAME=manage export MSA_PASSWORD=... # prefer arrays.json + keychain in production
Windows (PowerShell):
$env:MSA_HOST = "10.0.0.10" $env:MSA_USERNAME = "manage" $env:MSA_PASSWORD = "..." # prefer arrays.json + keychain in production
In practice, an MCP host passes these via its own
envblock (see below) rather than the shell.
When more than one array is configured, every tool requires the array
parameter. With one array (or the env fallback) it's optional.
Environment variables
| Var | Purpose | Default |
|---|---|---|
MSA_MODE |
RBAC mode. Only read registers tools. |
read |
MSA_AUDIT_LOG |
Path to a JSON-lines audit log. Unset = disabled. | unset |
MSA_TLS_VERIFY |
true / false. MSA certs are often self-signed. |
true |
MSA_TLS_CA |
Path to a custom CA PEM bundle. Implies verify on. | unset |
MSA_ARRAYS_CONFIG |
Override path for arrays.json. |
~/.config/hpe-msa-mcp/arrays.json |
MSA_HOST |
Single-array fallback hostname. | unset |
MSA_USERNAME |
Single-array fallback username. | unset |
MSA_PASSWORD |
Single-array fallback password. | unset |
MSA_API_TIMEOUT |
Per-request timeout in seconds. | 30 |
MCP host config (generic)
If the console script is on the host's PATH:
{
"mcpServers": {
"hpe-msa": {
"command": "node804-hpe-msa",
"env": { "MSA_HOST": "10.0.0.10", "MSA_USERNAME": "manage", "MSA_PASSWORD": "..." }
}
}
}
Or run as a module: python -m hpe_msa_mcp.
Claude Desktop
Claude Desktop does not use your shell environment, so point command at the
absolute path of the console script (or the venv Python) and pass
credentials in the env block. Edit the config file, then fully quit and
reopen Claude Desktop.
Config file location:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json(e.g.C:\Users\you\AppData\Roaming\Claude\claude_desktop_config.json) - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
You can open the file quickly from Claude Desktop: Settings → Developer → Edit Config.
Windows example
Use the console script's absolute path. In JSON, backslashes must be escaped
(\\) — or use forward slashes, which also work on Windows.
{
"mcpServers": {
"hpe-msa": {
"command": "C:\\Users\\you\\Repos\\MCP\\hpe-msa-mcp\\.venv\\Scripts\\node804-hpe-msa.exe",
"env": {
"MSA_HOST": "10.0.0.10",
"MSA_USERNAME": "manage",
"MSA_PASSWORD": "your-password",
"MSA_TLS_VERIFY": "false"
}
}
}
}
Alternatively, invoke the module through the venv's Python (handy if the
.exe shim is missing):
{
"mcpServers": {
"hpe-msa": {
"command": "C:\\Users\\you\\Repos\\MCP\\hpe-msa-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "hpe_msa_mcp"],
"env": {
"MSA_HOST": "10.0.0.10",
"MSA_USERNAME": "manage",
"MSA_PASSWORD": "your-password"
}
}
}
}
macOS example
{
"mcpServers": {
"hpe-msa": {
"command": "/Users/you/Repos/MCP/hpe-msa-mcp/.venv/bin/node804-hpe-msa",
"env": {
"MSA_HOST": "10.0.0.10",
"MSA_USERNAME": "manage",
"MSA_PASSWORD": "your-password"
}
}
}
}
Notes:
- Prefer
arrays.json+ the OS keychain over a plaintextMSA_PASSWORDin the config. If you configurearrays.json, you can drop the credential env vars entirely (keepcommand/args), and reference arrays by name via thearraytool parameter. MSA_TLS_VERIFYdefaults totrue. MSA controller certificates are commonly self-signed — either setMSA_TLS_VERIFY=false(as above) or pointMSA_TLS_CAat your internal CA bundle.- After a successful start you should see the tools available in Claude Desktop;
run
server_statusto confirm posture andcheck_connectivityto test the array round-trip.
Authentication model
MSA uses a session key, not a long-lived API key. The client hashes
username_password (SHA-256, with an MD5 fallback for old firmware),
GETs /api/login/<hash>, and caches the returned sessionKey. The key idles
out (~30 min); an expired-session response transparently re-logs-in and retries.
Login hashes, session keys, and passwords are scrubbed from every error/log line.
Tool catalog
All tools are Mode.READ. List tools accept verbose / fields / pattern /
pagination and return { total, count, items }.
Diagnostics
server_status— active mode, TLS posture, audit sink, configured arrays. No network call.check_connectivity— live login +show systemround-trip.
System
get_system,get_versions,get_controllers,get_enclosures,get_frus,get_license,get_ntp_status,get_network
Hardware
get_disks,get_sensor_status,get_fans,get_power_supplies,get_expander_status,get_certificate
Storage
get_pools,get_disk_groups,get_volumes,get_snapshots
Hosts / SAN
get_host_groups,get_hosts,get_initiators,get_maps,get_ports
Events
get_events(count + optional severity),get_alerts
Statistics
get_controller_statistics,get_volume_statistics,get_disk_statistics
Aggregation
get_health_summary— one-call rollup of system health, controller redundancy, degraded/failed disks, pool capacity, and active alerts. Start here for "is this array healthy?".
Utility
run_show_command— run any read-onlyshowcommand not covered above. Theshowverb is fixed by the server; the command and arguments are validated against a safe token charset, so it can never mutate the array.list_arrays— configured targets + shared defaults (never passwords).
Configuring arrays is not an MCP tool. Registering arrays and setting shared credentials mutate local config + the OS keychain, and exposing that to the model is a prompt-injection risk (a malicious instruction could register an attacker host that inherits your monitoring credential and leak it on the next login). Use the
node804-hpe-msa-setupwizard —array add/array removeand shared-default setup live there, run by you.
Development
pytest # unit tests (respx-mocked; no live array needed)
ruff check .
ruff format .
mypy src
Live smoke tests are marked integration and skipped by default; point them at
a real array by configuring credentials and running pytest -m integration.
Installing the skill manually
The setup wizard installs the hpe-msa-engineer
skill, but you can also do it by hand. For Claude Code, copy the folder into
your personal skills directory (or a project's .claude/skills/ to scope it there):
mkdir -p ~/.claude/skills && cp -r skills/hpe-msa-engineer ~/.claude/skills/
New-Item -ItemType Directory -Force "$env:USERPROFILE\.claude\skills" | Out-Null
Copy-Item -Recurse skills\hpe-msa-engineer "$env:USERPROFILE\.claude\skills\"
For Claude Desktop / claude.ai, zip the folder (the archive must contain
hpe-msa-engineer/SKILL.md) and upload it under Settings → Capabilities →
Skills — or just run node804-hpe-msa-setup skill, which writes the zip for
you. After upgrading the server, update the skill too; it describes tool behavior
for the matching version.
License
MIT © 2026 Michael Pope
Metadata
Release files for node804-hpe-msa 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 |
|---|---|---|---|---|
| node804_hpe_msa-0.1.0.tar.gz | 74.6 kB | With provenance | Details for node804_hpe_msa-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| node804_hpe_msa-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for node804_hpe_msa-0.1.0-py3-none-any.whl |
Total release size: 152.0 kB
Release files / node804_hpe_msa-0.1.0.tar.gz
| Download URL | node804_hpe_msa-0.1.0.tar.gz |
|---|---|
| Size | 74.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f17f80eaf444393f201d1d8d4b2baa28e86f9373da7fe05535ee46eace7ce542
|
|
BLAKE2b-256 checksum How to use checksums |
d7a43fca79e8160f502fb79ba2d89f8b3cbcffc3973341513184448ecf7a211e
|
| 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 4, 2026.
Transparency logRelease files / node804_hpe_msa-0.1.0-py3-none-any.whl
| Download URL | node804_hpe_msa-0.1.0-py3-none-any.whl |
|---|---|
| Size | 77.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5145effa6c7d7aa86bfefa8253025a4a9a5d7b466d648b27f5ecf6c5c54de1c8
|
|
BLAKE2b-256 checksum How to use checksums |
29f7a9bb0e3e875bdc4856eb64ff14d7945c393b8f83f929d70303681d67520e
|
| 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 4, 2026.
Transparency logSecurity for node804-hpe-msa 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 node804_hpe_msa-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 4, 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.