Jacob Magar
f69aa94826
feat(dx): add fastmcp.json configs, module-level tool registration, tool timeout
...
- Add fastmcp.http.json and fastmcp.stdio.json declarative server configs
for streamable-http (:6970) and stdio transports respectively
- Move register_all_modules() to module level in server.py so
`fastmcp run server.py --reload` discovers the fully-wired mcp object
without going through run_server() — tools registered exactly once
- Add timeout=120 to @mcp.tool() decorator as a global safety net;
any hung subaction returns a clean MCP error instead of hanging forever
- Document fastmcp run --reload, fastmcp list, fastmcp call in README
- Bump version 1.0.1 → 1.1.0
Co-authored-by: Claude <claude@anthropic.com >
2026-03-16 10:32:16 -04:00
Jacob Magar
7db878b80b
docs: fix stale references in CLAUDE.md post-consolidation refactor
...
- Fix test patching example: tools.info → tools.unraid (old module deleted)
- Fix destructive actions: storage → disk (correct action domain)
- Update mutation handler ordering: QUERIES → _*_QUERIES domain dicts
- Add test-destructive.sh to scripts section
- Bump version 1.0.0 → 1.0.1
Co-authored-by: Claude <claude@anthropic.com >
2026-03-16 10:21:58 -04:00
Jacob Magar
dab1cd6995
refactor(tools)!: consolidate 15 individual tools into single unified unraid tool
...
BREAKING CHANGE: Replaces 15 separate MCP tools (unraid_info, unraid_array,
unraid_storage, unraid_docker, unraid_vm, unraid_notifications, unraid_rclone,
unraid_users, unraid_keys, unraid_health, unraid_settings, unraid_customization,
unraid_plugins, unraid_oidc, unraid_live) with a single `unraid` tool using
action (domain) + subaction (operation) routing.
New interface: unraid(action="system", subaction="overview") replaces
unraid_info(action="overview"). All 15 domains and ~108 subactions preserved.
- Add unraid_mcp/tools/unraid.py (1891 lines, all domains consolidated)
- Remove 15 individual tool files
- Update tools/__init__.py to register single unified tool
- Update server.py for new tool registration pattern
- Update subscriptions/manager.py and resources.py for new tool names
- Update all 25 test files + integration/contract/safety/schema/property tests
- Update mcporter smoke-test script for new tool interface
- Bump version 0.6.0 → 1.0.0
Co-authored-by: Claude <noreply@anthropic.com >
2026-03-16 02:29:57 -04:00
Jacob Magar
06368ce156
chore: bump version to 0.6.0
2026-03-15 22:33:16 -04:00
Jacob Magar
1f35c20cdf
chore: update schema tests, docs, bump version to 0.5.0
...
- Add schema validation tests for new tools (customization, plugins, oidc)
and expanded array/keys actions (13 array, 7 keys)
- Update TestSchemaCompleteness to include new modules with KNOWN_SCHEMA_ISSUES
exclusion list for 4 tool-level schema mismatches (tracked for later fix)
- Fix missing register_oidc_tool import in server.py (was causing NameError)
- Update CLAUDE.md Tool Categories section: 11 → 15 tools, ~103 actions
- Update Destructive Actions section with array/plugins additions
- Bump version 0.4.8 → 0.5.0 in pyproject.toml and .claude-plugin/plugin.json
- Schema tests: 84 passing → 119 passing (35 new tests)
- Full suite: 618 passing → 738 passing (120 net new passing)
2026-03-15 19:42:05 -04:00
Jacob Magar
72ccf9b074
chore: add settings slash command and bump to 0.4.8
...
- Add commands/settings.md slash command for unraid_settings tool
- Sync uv.lock after version bump
Co-authored-by: Claude <claude@anthropic.com >
2026-03-14 16:40:04 -04:00
Jacob Magar
5740f4848a
chore: bump version to 0.4.7
2026-03-14 14:49:13 -04:00
Jacob Magar
14e9dca8bc
chore: bump version to 0.4.6
2026-03-14 04:30:01 -04:00
Jacob Magar
3f13cf89c8
chore: bump plugin.json version to 0.4.5
...
Co-Authored-By: Claude <noreply@anthropic.com >
2026-03-14 03:09:58 -04:00
Jacob Magar
91bce1dbd5
fix: address PR review threads (test-actions, diagnostics, docker, health, storage, plugin)
...
Resolves review threads:
- PRRT_kwDOO6Hdxs50R8VI (test-actions.sh: remove || echo "000" curl fallback)
- PRRT_kwDOO6Hdxs50R8VJ (test-actions.sh: JSON parse failures → FAIL not silent)
- PRRT_kwDOO6Hdxs50QdKd (diagnostics.py: sanitize raw exception text from ToolError)
- PRRT_kwDOO6Hdxs50QdKs (storage.py: unassigned uses unassignedDevices query)
- PRRT_kwDOO6Hdxs50Mwlk (docker.py: port_conflicts returns flat merged list)
- PRRT_kwDOO6Hdxs50Mwlo (docker.py: logs returns plain string not dict)
- PRRT_kwDOO6Hdxs50Mt5K (docker.py: unraid_docker logs format compatibility)
- PRRT_kwDOO6Hdxs50Mt5L (health.py: or {} null guards throughout)
- PRRT_kwDOO6Hdxs50Mt5r (docker.py: port_conflicts flat list backward compat)
- plugin.json: version synced to 0.4.4 to match pyproject.toml
Changes:
- test-actions.sh: curl exit code captured directly; JSON failures surface as FAIL
- diagnostics.py: 4 ToolError sites log exc_info=True, raise sanitized messages
- storage.py: unassigned action queries unassignedDevices instead of disks
- docker.py: logs action returns newline-joined string; port_conflicts merges
containerPorts + lanPorts into a flat list for backward compatibility
- health.py: all nested dict lookups use `or {}` instead of `.get(k, {})` to
handle explicit GraphQL null values
Co-authored-by: Claude <noreply@anthropic.com >
2026-03-13 23:19:50 -04:00
Jacob Magar
cd33ee2dda
chore: sync versions, update uv, expand dockerignore
...
- plugin.json: bump version 0.2.0 → 0.4.0 to match pyproject.toml
- Dockerfile: update uv 0.5.4 → 0.6 (global CLAUDE.md requires 0.10+)
- .dockerignore: exclude tests/, docs/, scripts/, commands/, .full-review/,
.claude-plugin/, *.md (keep README.md) — reduces image size
2026-03-13 03:08:01 -04:00
Jacob Magar
5b6a728f45
refactor: move MCP server config inline to plugin.json
...
Move MCP server configuration from standalone .mcp.json to inline
definition in plugin.json. This consolidates all plugin metadata
in a single location.
- Add type: stdio and env fields to inline config
- Remove redundant .mcp.json file
- Maintains same functionality with cleaner structure
2026-02-16 17:30:25 -05:00
Jacob Magar
abb7915672
feat: harden API safety and expand command docs with full test coverage
2026-02-15 22:15:51 -05:00
Jacob Magar
d791c6b6b7
refactor: move plugin manifest to repository root per Claude Code best practices
...
- Move plugin.json from skills/unraid/.claude-plugin/ to .claude-plugin/
- Update validation script to use correct plugin manifest path
- Add plugin structure section to root README.md
- Add installation instructions to skills/unraid/README.md
- Aligns with Claude Code's expectation for source: './' in marketplace.json
2026-02-15 17:22:30 -05:00