MCP server that exposes TrueNAS SCALE operations as MCP tools
truenas-mcp demonstrates solid definition quality with consistent naming conventions, comprehensive parameter schemas, and proper descriptions across all 11 tools. All tools use action verbs (list_, get_, start_, stop_, restart_, install_, upgrade_, rollback_). Input schemas are complete with type definitions and parameter descriptions. However, there are notable gaps: (1) output schemas are not documented in the definitions, we can infer they return JSON but the exact field structure is not specified in the source provided; (2) error handling descriptions are minimal, tools do not explain what to do if an operation fails; (3) some parameter descriptions could be more detailed about constraints and formats (e.g., 'lowercase, hyphens allowed, max 40 chars' for app_name is good, but version parameters lack format guidance). The risk annotations (READ_ONLY, WRITE, DESTRUCTIVE) are properly declared via toolAnnotations, which is a modern pattern strength. Tool composition is clean, each tool has a single responsibility. Pagination is implemented correctly on list_apps with limit/offset. The async job ID pattern (start_app, stop_app, restart_app, install_app, install_custom_app, upgrade_app, rollback_app all return job IDs) is good for non-blocking operations but lacks documentation of how to poll job status, there is no 'get_job_status' tool visible.
Get detailed information about a specific app by name.
Install a catalog app from the TrueNAS app catalog. Returns the async job ID immediately (non-blocking).
Install a custom Docker Compose app on TrueNAS SCALE. Returns the async job ID immediately (non-blocking).
List all installed apps managed by TrueNAS SCALE.
List all Docker images stored on the TrueNAS SCALE system.
Restart an app by name (redeploy). Returns the async job ID immediately (non-blocking).
Output schemas are not documented. Tools return JSON but exact field structure, types, and nesting are not specified in definition or source. LLMs cannot plan downstream calls or extract specific fields without knowing what the response contains.
Async job pattern lacks completion mechanism. Tools like start_app, stop_app, restart_app return async job IDs immediately but there is no documented 'get_job_status' or 'wait_for_job' tool to poll results. Agents cannot know when operations finish or if they succeeded.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 75 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 11 | - | v1 |
Roll an app back to a previous version. Returns the async job ID immediately (non-blocking).
Start an app by name. Returns the async job ID immediately (non-blocking).
Stop a running app by name. Returns the async job ID immediately (non-blocking).
Upgrade an installed app to the specified version, or to the latest available version if version is omitted. Returns the async job ID immediately (non-blocking).
Get upgrade availability and changelog for an installed app.
Error handling is not documented. Tool descriptions do not explain what errors are possible, when they occur, or what the LLM should do next (retry, ask user, try alternative tool). This violates recovery-guide pattern.
Parameter descriptions lack constraint details. 'version' parameter in upgrade_app and rollback_app should specify format (semver?), valid range, or how to discover valid versions. LLMs may hallucinate invalid version strings.
list_images returns empty input schema ({}). No pagination parameters are visible. If the system has many Docker images, LLMs cannot control result size or fetch subsequent pages.
install_custom_app accepts 'custom_compose_config_string' as a raw YAML string. No schema validation, size limits, or format guidance documented. LLMs may generate invalid Docker Compose configs.