Skip to main content
Glama
DigitainIT

Dell SC Series MCP Server

by DigitainIT
README.md
# Dell SC Series MCP Server

[![CI](https://github.com/DigitainIT/dell-sc-series-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/DigitainIT/dell-sc-series-mcp/actions/workflows/ci.yml)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org)
[![MCP](https://img.shields.io/badge/MCP-compatible-green.svg)](https://modelcontextprotocol.io)

A **read-only** [Model Context Protocol](https://modelcontextprotocol.io) (MCP)
server that lets AI assistants (opencode, Claude Desktop, any MCP client)
diagnose **Dell SC Series / Compellent** storage arrays (SC5020/F, SC7020/F,
SC8000, SC9000, SCv20xx/30xx, SC4020…) through the array's **own REST API**.

> Ask your AI: *"How is the SAN doing?"*, *"Any hardware alerts?"*,
> *"When will the SSD pool run out of space?"* — and get answers straight
> from the controller.

## Why this server

- **No Dell Storage Manager (DSM) required.** It talks directly to the
  Storage Center controller REST API (`https://<array>:3033/api/rest`,
  SCOS 7.x). If a DSM Data Collector is present, it works against that too.
- **Read-only by design.** After login it issues only `GET` requests.
  It *cannot* create/modify/delete anything on your array.
- **Battle-tested diagnostics.** The tool set was built while investigating
  a real production SC5020F incident (emergency write-outage caused by pool
  exhaustion, dead cache batteries, broken phone-home) — the tools surface
  exactly the signals that matter.

## Features

- API-version negotiation (works against SCOS 7.x, API 2.0–6.x)
- Session management with transparent re-login on expiry
- TLS verification configurable (self-signed default, CA bundle supported)
- Thread-safe client; sync tools safe for concurrent MCP calls
- Fully mocked test suite — contributors don't need an array

## Tools

| Tool | Description |
|---|---|
| `sc_health_report` | Aggregated markdown health report — the "how is the array?" one-shot |
| `sc_alerts` | Alerts with filters (`unacknowledged_only`, `category`) |
| `sc_capacity` | Disk folders/pools, thresholds, **projected full dates**, provisioned vs written totals |
| `sc_volumes` | Volumes: size, pool, folder, last UNMAP/space-reduction time |
| `sc_servers` | Hosts: connectivity, path counts, mapped volumes, OS |
| `sc_hardware` | Controllers & enclosures: status, last boot, LEDs, conditions |
| `sc_ports` | Front/back-end ports + iSCSI fault domains (IPs, MTU, CHAP) |
| `sc_storage_center` | Array identity, SCOS version, operation mode, background-task flags |

## Requirements

- Python 3.10+
- Network access to the array on **TCP 3033**
- An SCOS user account. **Important visibility note** (learned the hard way):

  | Role | Sees |
  |---|---|
  | `Admin` | Everything (volumes, pools/capacity, all servers, alerts) |
  | `Reporter` | **Filtered subset** on direct connections: alerts, controllers, enclosures — but *no* volumes, capacity pools, or servers |

  For full diagnostics use an Admin account; a Reporter is fine for
  alert/hardware-only monitoring.

## Installation

From source (until published to PyPI):

```bash
git clone https://github.com/DigitainIT/dell-sc-series-mcp.git
cd dell-sc-series-mcp
python -m venv .venv
.venv/Scripts/activate        # Windows; use source .venv/bin/activate on Linux/macOS
pip install -e .
```

## Configuration

Environment variables (see [.env.example](.env.example)):

| Variable | Required | Default | Purpose |
|---|---|---|---|
| `SC_HOST` | ✅ | — | Storage Center management IP/hostname |
| `SC_USER` | ✅ | — | SCOS username |
| `SC_PASS` | ✅ | — | SCOS password |
| `SC_PORT` | | `3033` | REST API port |
| `SC_TLS_VERIFY` | | `false` | Verify TLS (arrays ship self-signed certs) |
| `SC_CA_BUNDLE` | | — | Path to CA bundle (overrides `SC_TLS_VERIFY`) |

## Run

Standalone (stdio transport — this is what MCP clients spawn for you):

```bash
export SC_HOST=192.0.2.10 SC_USER=reader SC_PASS=secret
dell-sc-mcp            # or: python -m dell_sc_mcp
```

### opencode (`opencode.json`)

```json
{
  "mcp": {
    "dell-sc": {
      "type": "local",
      "command": ["dell-sc-mcp"],
      "environment": {
        "SC_HOST": "192.0.2.10",
        "SC_USER": "reader",
        "SC_PASS": "secret"
      },
      "enabled": true
    }
  }
}
```

### Claude Desktop (`claude_desktop_config.json`)

```json
{
  "mcpServers": {
    "dell-sc": {
      "command": "dell-sc-mcp",
      "args": [],
      "env": {
        "SC_HOST": "192.0.2.10",
        "SC_USER": "reader",
        "SC_PASS": "secret"
      }
    }
  }
}
```

On Windows, point `command` at the console script in your venv, e.g.
`C:\\path\\to\\.venv\\Scripts\\dell-sc-mcp.exe`.

## Example conversation

> **You:** Give me a health overview of the storage array.
> **AI (via `sc_health_report`):** Status Up, mode Normal, 23 unacknowledged
> alerts — including active cache battery alerts on both controllers and
> SSD-Pool projected full 2026-12-25…

> **You:** Which hosts have degraded connectivity?
> **AI (via `sc_servers`):** `degradedConnectivity: ["esxi-02"]` — 2/4 paths.

## Troubleshooting

| Symptom | Cause / fix |
|---|---|
| `login failed … HTTP 401` | Wrong credentials. SCOS usernames are **case-sensitive** (`Admin` ≠ `admin`). |
| Login loops through all API versions | Array unreachable or port wrong — verify `Test-NetConnection <ip> -Port 3033`. |
| `sc_volumes`/`sc_capacity` return empty | You're using a `Reporter` account — see visibility table above. |
| `Method not available` on some object | Direct controller connections expose fewer objects than a DSM Data Collector (e.g. no physical disk list, no perf counters). Deploy DSM for those. |
| TLS errors with verify on | Use `SC_CA_BUNDLE` with the array's CA, or keep `SC_TLS_VERIFY=false` on a trusted management LAN. |

## Development

```bash
pip install -e ".[dev]"
pytest                 # fully mocked - no array needed
```

Layout:

```
src/dell_sc_mcp/
  client.py     # SCOS REST API client (auth, version negotiation, relogin)
  server.py     # FastMCP server + tools
tests/          # pytest + responses (HTTP fully mocked)
examples/       # standalone diagnostic scripts (diagnose, probe, summarize,
                # MCP smoke test against a live array)
```

Live smoke test against a real array (optional):

```bash
export SC_HOST=... SC_USER=... SC_PASS=...
python examples/mcp_smoke_test.py
```

## Roadmap

- [ ] Publish to PyPI
- [ ] Optional write tools with explicit guardrails (acknowledge alerts)
- [ ] DSM Data Collector target support (historical performance stats)
- [ ] Response caching for high-frequency polling
- [ ] Streamable HTTP transport

## Contributing

Issues and PRs welcome. Please keep the server **read-only by default** and
never commit real array data (serials, IPs, hostnames) — tests use fictional
fixtures only.

## Disclaimer

This is an independent community project. It is **not affiliated with,
endorsed, or supported by Dell Technologies**. "Dell" and "Compellent" are
trademarks of Dell Inc.

## License

[MIT](LICENSE) © 2026 Gegham Simonyan