forked from HomeLab/unraid-mcp
**Project Configuration:** - Enhance pyproject.toml with comprehensive metadata, keywords, and classifiers - Add LICENSE file (MIT) for proper open-source distribution - Add PUBLISHING.md with comprehensive publishing guidelines - Update .gitignore to exclude tool artifacts (.cache, .pytest_cache, .ruff_cache, .ty_cache) - Ignore documentation working directories (.docs, .full-review, docs/plans, docs/sessions) **Documentation:** - Add extensive Unraid API research documentation - API source code analysis and resolver mapping - Competitive analysis and feature gap assessment - Release notes analysis (7.0.0, 7.1.0, 7.2.0) - Connect platform overview and remote access documentation - Document known API patterns, limitations, and edge cases **Testing & Code Quality:** - Expand test coverage across all tool modules - Add destructive action confirmation tests - Improve test assertions and error case validation - Refine type annotations for better static analysis **Tool Improvements:** - Enhance error handling consistency across all tools - Improve type safety with explicit type annotations - Refine GraphQL query construction patterns - Better handling of optional parameters and edge cases This commit prepares the project for v0.2.0 release with improved metadata, comprehensive documentation, and enhanced code quality. Co-authored-by: Claude <noreply@anthropic.com>
5.3 KiB
5.3 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
This is an MCP (Model Context Protocol) server that provides tools to interact with an Unraid server's GraphQL API. The server is built using FastMCP with a modular architecture consisting of separate packages for configuration, core functionality, subscriptions, and tools.
Development Commands
Setup
# Initialize uv virtual environment and install dependencies
uv sync
# Install dev dependencies
uv sync --group dev
Running the Server
# Local development with uv (recommended)
uv run unraid-mcp-server
# Using development script with hot reload
./dev.sh
# Direct module execution
uv run -m unraid_mcp.main
Code Quality
# Format code with black
uv run black unraid_mcp/
# Lint with ruff
uv run ruff check unraid_mcp/
# Type checking with mypy
uv run mypy unraid_mcp/
# Run tests
uv run pytest
Docker Development
# Build the Docker image
docker build -t unraid-mcp-server .
# Run with Docker Compose
docker-compose up -d
# View logs
docker-compose logs -f unraid-mcp
# Stop service
docker-compose down
Environment Setup
- Copy
.env.exampleto.envand configure:UNRAID_API_URL: Unraid GraphQL endpoint (required)UNRAID_API_KEY: Unraid API key (required)UNRAID_MCP_TRANSPORT: Transport type (default: streamable-http)UNRAID_MCP_PORT: Server port (default: 6970)UNRAID_MCP_HOST: Server host (default: 0.0.0.0)
Architecture
Core Components
- Main Server:
unraid_mcp/server.py- Modular MCP server with FastMCP integration - Entry Point:
unraid_mcp/main.py- Application entry point and startup logic - Configuration:
unraid_mcp/config/- Settings management and logging configuration - Core Infrastructure:
unraid_mcp/core/- GraphQL client, exceptions, and shared types - Subscriptions:
unraid_mcp/subscriptions/- Real-time WebSocket subscriptions and diagnostics - Tools:
unraid_mcp/tools/- Domain-specific tool implementations - GraphQL Client: Uses httpx for async HTTP requests to Unraid API
- Transport Layer: Supports streamable-http (recommended), SSE (deprecated), and stdio
Key Design Patterns
- Consolidated Action Pattern: Each tool uses
action: Literal[...]parameter to expose multiple operations via a single MCP tool, reducing context window usage - Pre-built Query Dicts:
QUERIESandMUTATIONSdicts prevent GraphQL injection and organize operations - Destructive Action Safety:
DESTRUCTIVE_ACTIONSsets requireconfirm=Truefor dangerous operations - Modular Architecture: Clean separation of concerns across focused modules
- Error Handling: Uses ToolError for user-facing errors, detailed logging for debugging
- Timeout Management: Custom timeout configurations for different query types (90s for disk ops)
- Data Processing: Tools return both human-readable summaries and detailed raw data
- Health Monitoring: Comprehensive health check tool for system monitoring
- Real-time Subscriptions: WebSocket-based live data streaming
Tool Categories (10 Tools, 90 Actions)
unraid_info(19 actions): overview, array, network, registration, connect, variables, metrics, services, display, config, online, owner, settings, server, servers, flash, ups_devices, ups_device, ups_configunraid_array(12 actions): start, stop, parity_start/pause/resume/cancel/history, mount_disk, unmount_disk, clear_stats, shutdown, rebootunraid_storage(6 actions): shares, disks, disk_details, unassigned, log_files, logsunraid_docker(15 actions): list, details, start, stop, restart, pause, unpause, remove, update, update_all, logs, networks, network_details, port_conflicts, check_updatesunraid_vm(9 actions): list, details, start, stop, pause, resume, force_stop, reboot, resetunraid_notifications(9 actions): overview, list, warnings, create, archive, unread, delete, delete_archived, archive_allunraid_rclone(4 actions): list_remotes, config_form, create_remote, delete_remoteunraid_users(8 actions): me, list, get, add, delete, cloud, remote_access, originsunraid_keys(5 actions): list, get, create, update, deleteunraid_health(3 actions): check, test_connection, diagnose
Environment Variable Hierarchy
The server loads environment variables from multiple locations in order:
/app/.env.local(container mount)../.env.local(project root)../.env(project root).env(local directory)
Transport Configuration
- streamable-http (recommended): HTTP-based transport on
/mcpendpoint - sse (deprecated): Server-Sent Events transport
- stdio: Standard input/output for direct integration
Error Handling Strategy
- GraphQL errors are converted to ToolError with descriptive messages
- HTTP errors include status codes and response details
- Network errors are caught and wrapped with connection context
- All errors are logged with full context for debugging
Performance Considerations
- Increased timeouts for disk operations (90s read timeout)
- Selective queries to avoid GraphQL type overflow issues
- Optional caching controls for Docker container queries
- Log file overwrite at 10MB cap to prevent disk space issues