A Model Context Protocol (MCP) server for Dell Unity storage arrays that automatically generates tools from OpenAPI specifications with a credential-free architecture. Enables AI assistants like Claude and automation platforms like n8n to interact with Unity storage systems.
| Feature | Description |
|---|---|
| π Automatic Tool Generation | Dynamically generates 359+ MCP tools from Dell Unity OpenAPI specs |
| π Credential-Free Architecture | No stored credentials - pass host/username/password with each tool call |
| π Multi-Host Support | Manage multiple Unity arrays from a single server |
| π‘οΈ Configurable Operations | GET-only by default, configurable to enable POST/DELETE |
| π Multiple Transports | HTTP/SSE for n8n, stdio for Claude Desktop |
| π Health Monitoring | Built-in health checks and metrics endpoints |
| π³ Docker Ready | Production-ready container images |
- Quick Start
- Installation
- Configuration
- Usage
- Integration
- Available Tools
- Architecture
- Development
- Contributing
- License
# Clone and install
git clone https://github.com/sachdev27/dell-unity-mcp-server.git
cd dell-unity-mcp-server
pip install -e .
# Run HTTP/SSE server (for n8n)
export LOCAL_OPENAPI_SPEC_PATH="./openapi.json"
python -m uvicorn unity_mcp.http_server:app --host 0.0.0.0 --port 8000
# Or run stdio server (for Claude Desktop)
python -m unity_mcp.mainpip install dell-unity-mcp-server# Clone the repository
git clone https://github.com/sachdev27/dell-unity-mcp-server.git
cd dell-unity-mcp-server
# Create virtual environment
python -m venv venv
source venv/bin/activate # On macOS/Linux
# venv\Scripts\activate # On Windows
# Install in development mode
pip install -e ".[dev]"# Build the image
docker build -t dell-unity-mcp-server .
# Run with SSE transport (GET-only by default)
docker run -p 8000:8000 dell-unity-mcp-server
# Run with full access (GET, POST, DELETE)
docker run -p 8000:8000 -e ALLOWED_HTTP_METHODS="GET,POST,DELETE" dell-unity-mcp-server- Python: 3.10, 3.11, 3.12, or 3.13
- Dell Unity: Any supported version with REST API enabled (v5.x recommended)
| Variable | Description | Default |
|---|---|---|
LOCAL_OPENAPI_SPEC_PATH |
Path to OpenAPI specification (required) | - |
LOG_LEVEL |
Logging level (DEBUG, INFO, WARNING, ERROR) | INFO |
HTTP_SERVER_PORT |
HTTP server port | 8000 |
ALLOWED_HTTP_METHODS |
Comma-separated list of allowed methods | GET |
UNITY_HOST |
Default Unity hostname (optional) | - |
UNITY_TLS_VERIFY |
Verify TLS certificates | false |
REQUEST_TIMEOUT |
Request timeout in milliseconds | 30000 |
MAX_RETRIES |
Maximum retry attempts | 3 |
# Required
LOCAL_OPENAPI_SPEC_PATH=/app/openapi.json
# Server Configuration
HTTP_SERVER_PORT=8000
LOG_LEVEL=INFO
# HTTP Methods (GET = read-only, add POST,DELETE for write operations)
ALLOWED_HTTP_METHODS=GET
# Optional Unity defaults
# UNITY_HOST=unity.example.com
# UNITY_TLS_VERIFY=falseBy default, the server only exposes GET operations (read-only). To enable write operations:
# Read-only (default) - 359 tools
export ALLOWED_HTTP_METHODS="GET"
# Full access - 777 tools
export ALLOWED_HTTP_METHODS="GET,POST,PUT,PATCH,DELETE"
β οΈ Important: Unity credentials are NOT stored in configuration. They are passed securely with each tool call.
# Using uvicorn
python -m uvicorn unity_mcp.http_server:app --host 0.0.0.0 --port 8000
# Using the main module
python -m unity_mcp.main --mode httpThe server provides:
- SSE Endpoint:
http://localhost:8000/sse - Health Check:
http://localhost:8000/health - Readiness Check:
http://localhost:8000/ready - Liveness Check:
http://localhost:8000/live - Metrics:
http://localhost:8000/metrics
# Using Python module
python -m unity_mcp.main# docker-compose.yml
version: '3.8'
services:
unity-mcp:
build: .
ports:
- "8000:8000"
environment:
- ALLOWED_HTTP_METHODS=GET
- LOG_LEVEL=INFO
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3# Start the server
docker-compose up -d
# View logs
docker-compose logs -f
# Stop the server
docker-compose down- Add an MCP Client node to your n8n workflow
- Configure the connection:
- Transport: SSE
- URL:
http://localhost:8000/sse
- The 359+ Unity tools will be available to AI agents
Add to your Claude Desktop configuration (claude_desktop_config.json):
{
"mcpServers": {
"dell-unity": {
"command": "/path/to/venv/bin/python",
"args": ["-m", "unity_mcp.main"],
"env": {
"LOCAL_OPENAPI_SPEC_PATH": "/path/to/openapi.json"
}
}
}
}import asyncio
from mcp import ClientSession
from mcp.client.sse import sse_client
async def main():
async with sse_client("http://localhost:8000/sse") as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# List available tools
tools = await session.list_tools()
print(f"Found {len(tools.tools)} tools")
# Get system information
result = await session.call_tool("systemCollectionQuery", {
"host": "unity.example.com",
"username": "admin",
"password": "password",
"fields": "id,name,model,serialNumber"
})
print(result)
# Get all LUNs
result = await session.call_tool("lunCollectionQuery", {
"host": "unity.example.com",
"username": "admin",
"password": "password",
"fields": "id,name,sizeTotal,pool",
"per_page": 100
})
print(result)
asyncio.run(main())The server dynamically generates 359+ tools (GET-only) or 777+ tools (full access) from the Unity OpenAPI specification.
Every tool requires these authentication parameters:
| Parameter | Type | Description |
|---|---|---|
host |
string | Unity hostname or IP |
username |
string | Unity username |
password |
string | Unity password |
| Category | Example Tools | Description |
|---|---|---|
| Storage | lunCollectionQuery, poolCollectionQuery |
LUN and pool management |
| System | systemCollectionQuery, licenseCollectionQuery |
System information |
| Network | ipInterfaceCollectionQuery, fcPortCollectionQuery |
Network configuration |
| File Services | nasServerCollectionQuery, fileSystemCollectionQuery |
File storage |
| Protection | snapCollectionQuery, replicationSessionCollectionQuery |
Data protection |
| Monitoring | alertCollectionQuery, eventCollectionQuery |
Alerts and events |
| Host Access | hostCollectionQuery, hostLUNCollectionQuery |
Host management |
All collection endpoints support Unity query parameters:
{
"host": "unity.example.com",
"username": "admin",
"password": "password",
"fields": "id,name,sizeTotal,health",
"filter": "name lk 'prod*'",
"per_page": 100,
"page": 1,
"compact": "true"
}Unity uses a specific filter syntax for queries:
| Operator | Description | Example |
|---|---|---|
eq |
Equals | filter=severity eq 4 |
ne |
Not equals | filter=health.value ne 5 |
lt |
Less than | filter=sizeTotal lt 1073741824 |
gt |
Greater than | filter=sizeTotal gt 1073741824 |
lk |
Like (wildcard) | filter=name lk 'prod*' |
and |
Logical AND | filter=severity eq 4 and state eq 2 |
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β AI Client ββββββΆβ MCP Server ββββββΆβ Dell Unity β
β (Claude/n8n) β β (No Credentials)β β Array β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β
β Tool Call with β Per-Request
β Credentials β Authentication
βΌ βΌ
{host, user, pass} Basic Auth Header
- No Stored Credentials: Server starts without any Unity connection
- Per-Request Auth: Each tool call includes host/username/password
- Fresh Sessions: New API client created for each request
- Multi-Host Ready: Easily manage multiple Unity arrays
- Configurable Access: Control which HTTP methods are exposed
unity_mcp/
βββ __init__.py # Package initialization and version
βββ api_client.py # Async Unity API client with retry logic
βββ config.py # Configuration management with validation
βββ exceptions.py # Custom exception hierarchy
βββ http_server.py # HTTP/SSE transport server
βββ logging_config.py # Structured logging configuration
βββ main.py # stdio transport entry point
βββ server.py # Core MCP server with tool handlers
βββ tool_generator.py # OpenAPI parser and tool generator
# Clone and install with dev dependencies
git clone https://github.com/sachdev27/dell-unity-mcp-server.git
cd dell-unity-mcp-server
python -m venv venv
source venv/bin/activate
pip install -e ".[dev]"# Run all tests
pytest
# Run with verbose output
pytest -v
# Run with coverage
pytest --cov=unity_mcp --cov-report=html
# Run specific test file
pytest tests/test_tool_generator.py -v# Format code
black unity_mcp tests
# Lint code
ruff check unity_mcp tests
# Type checking
mypy unity_mcp
# Security scan
bandit -r unity_mcp# Build distribution packages
python -m build
# Build Docker image
docker build -t dell-unity-mcp-server .Contributions are welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Model Context Protocol Documentation
- Dell Unity Documentation
- Dell Unity REST API Guide
- n8n MCP Integration Guide
Made with β€οΈ for the storage automation community