raidcom-mcp 0.0.0-stage → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -0
- package/INSTALL.md +169 -0
- package/LICENSE +21 -0
- package/README.docker.md +50 -0
- package/README.md +119 -2
- package/README.plugin.md +56 -0
- package/dist/builder.js +409 -0
- package/dist/catalog.js +79 -0
- package/dist/cmdline.js +145 -0
- package/dist/config.js +128 -0
- package/dist/http.js +215 -0
- package/dist/index.js +307 -0
- package/dist/recipes.js +307 -0
- package/dist/search.js +157 -0
- package/dist/tools.js +179 -0
- package/package.json +54 -4
- package/spec/examples.json +390 -0
- package/spec/limits.json +236 -0
- package/spec/notes/conventions.md +56 -0
- package/spec/notes/horcm-setup.md +27 -0
- package/spec/raidcom-catalog.json +1 -0
- package/spec/recipes.json +1106 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## 0.1.3 — 2026-10-28
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **`RAIDCOM_HTTP_CLIENT_IP_HEADER`** reads the client's address from a header a trusted proxy sets, such as `cf-connecting-ip` behind Cloudflare. On Render, which sits behind Cloudflare, counting `X-Forwarded-For` entries gave a Cloudflare address, so every user shared the rate limit and the in-progress cap of their Cloudflare edge.
|
|
10
|
+
- **`RAIDCOM_HTTP_DEBUG_CLIENT=true`** makes `/healthz` show the forwarding headers it received, to choose the proxy settings.
|
|
11
|
+
|
|
12
|
+
## 0.1.2 — 2026-10-27
|
|
13
|
+
|
|
14
|
+
0.1.0 and 0.1.1 were withdrawn from npm and can't be published again there; this is the first version on npm since. 0.1.1's GitHub release and Docker image stay available.
|
|
15
|
+
|
|
16
|
+
### Security
|
|
17
|
+
|
|
18
|
+
- **Script text could carry shell commands through two global options.** `global.pair_type` was written into scripts without a check (`"pair_type": "$(id)"` produced `run raidcom lock resource -I$(id)0`), and `global.instance` was only checked when a step produced at least one command (`"instance": "0;id"` produced `export HORCMINST=0;id`). All global options are now checked once, before anything is written: `pair_type` must be H, M, TC or SI, `instance` and `unit` whole numbers from 0 to 9999, and unknown global options are refused.
|
|
19
|
+
- **A value starting with `#` was written unquoted,** so the shell treated the rest of the line as a comment and dropped options after it, including `-checkmode precheck`. Values containing `#` are now always quoted.
|
|
20
|
+
- **Values that start with `-` and a letter are refused,** so a value such as `"CL1-A-0 -IH9"` can't add options of its own.
|
|
21
|
+
- **LDEV IDs that aren't numbers** (`abc`, `1e+308`) are now errors rather than warnings.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
|
|
25
|
+
- **A request could stop or slow the HTTP server.** A range with numbers above 2^53 made range expansion loop until the process ran out of memory; very long command names took seconds of CPU; large `foreach` and `zip` lists were expanded before the 500-command limit was checked. Ranges now only use exact numbers, lists stop at the limit while they are expanded, and names longer than 64 characters are refused before any matching.
|
|
26
|
+
- **Slow clients could take every HTTP slot.** Clients now have 10 seconds to send headers and 15 to send the whole request, and one address may have at most 8 requests in progress.
|
|
27
|
+
- **Behind a trusted proxy, the rate limit used the client-supplied X-Forwarded-For entry.** `RAIDCOM_HTTP_TRUST_PROXY` now takes the number of proxies in front of the server (`true` still means one), and the client address is the entry that many places from the right, as Express does it. With proxies configured, `/healthz` shows the address the server takes as the caller's, to check the number. The limiter remembers at most 10,000 addresses.
|
|
28
|
+
- **Empty `foreach` or `zip` lists, or a script with no commands,** are errors instead of an empty script reported as success.
|
|
29
|
+
- **`raidcom_check_command`:** the two words after `-login` are always dropped, even when the password starts with `-`; a bare `-I` and a repeated option are reported.
|
|
30
|
+
- **Names such as `constructor` or `__proto__`** in queries, recipe IDs, parameters and option names no longer crash a tool or slip past checks.
|
|
31
|
+
- **`create-dp-pool`:** giving only one of the two thresholds is an error instead of being ignored.
|
|
32
|
+
- **Search confidence:** a tie between the top results is now rated low, and the search evaluation checks that high-confidence results are right at least 85% of the time.
|
|
33
|
+
- **Release pipeline:**
|
|
34
|
+
- the MCP Registry rejected `server.json` (description over 100 characters);
|
|
35
|
+
- the plugin bump never started after automatic releases; Release now starts it once npm has the version;
|
|
36
|
+
- plugin releases no longer become the repository's "latest" release;
|
|
37
|
+
- the CHANGELOG heading checks match the exact version;
|
|
38
|
+
- rebuilding an older release no longer moves the Docker `latest` tag back;
|
|
39
|
+
- the Windows test uses the smoke test from the tag;
|
|
40
|
+
- the Windows package tests run again (the job was missing from 0.1.1's Release workflow);
|
|
41
|
+
- the plugin's lockfile is audited and watched by Dependabot.
|
|
42
|
+
|
|
43
|
+
## 0.1.1 — 2026-10-26
|
|
44
|
+
|
|
45
|
+
### Added
|
|
46
|
+
|
|
47
|
+
- **More release packages.** Every release now also has a Claude Desktop extension (`.mcpb`), standalone packages for macOS, Linux and Windows (x64 and arm64) with a Node.js runtime bundled, and a zip of the `raidcom-command-builder` skill, besides the npm package and the Docker image. `SHA256SUMS` covers them all. The Windows packages are tested on Windows x64 and arm64 machines. CI builds the Desktop extension, the skill zip and the Linux x64 standalone package on every pull request and smoke-tests them. INSTALL.md has a section for each.
|
|
48
|
+
- **Claude Code plugin `raidcom-community`** (`plugin/`, listed by `.claude-plugin/marketplace.json`; see README.plugin.md). It installs the server from a pinned npm version and adds the `raidcom-command-builder` skill. It needs no settings. The Plugin release workflow opens a pull request that moves the plugin to each new server release (including the lockfile), and tags `plugin-v<version>` and creates a GitHub release with the plugin zip when that pull request is merged.
|
|
49
|
+
- **Security scanning in CI.** CodeQL (security-extended queries) runs on every pull request, push to `main` and weekly. Dependency review fails a pull request that adds a vulnerable dependency. A Security audit workflow runs `npm audit` on the runtime dependencies and a Trivy scan of the Docker image on pull requests that touch dependencies or the Dockerfile, and weekly.
|
|
50
|
+
- **Recipe `create-mainframe-pool`:** creates a mainframe parity group (always `-emulation 3390-V`, not a parameter), assigns an SSID, creates and quick-formats 3390 LDEVs and makes them a DP pool, with `HORCC_DRIVEOPERATION=1` exported at the top of the script. Recipes can now export environment variables (`env`).
|
|
51
|
+
- **CU:LDEV notation** (`dd:0f`) is accepted for LDEV IDs and range-checked, and ranges such as `dd:00-dd:0f` expand in recipes and scripts.
|
|
52
|
+
- `add parity_grp` accepts `-emulation`, which the manual's syntax line leaves out but mainframe-capable systems use. The generator records it as an addition.
|
|
53
|
+
- **The Release workflow also pushes the image to Docker Hub** (`subramaniamv/raidcom-mcp`) when the `DOCKERHUB_USERNAME` and `DOCKERHUB_TOKEN` repository secrets are set; otherwise it pushes to ghcr.io only.
|
|
54
|
+
- **Build, CI and release pipeline.** CI now also builds the npm package and installs it into an empty folder to check it starts over stdio and HTTP (`npm run package`, `npm run smoke`). Merging a pull request that bumps `version` in `package.json` tags the commit (the Tag release workflow, which requires a matching `CHANGELOG.md` section) and starts the Release workflow: it re-runs the tests, attaches the package and `SHA256SUMS` to a GitHub release, publishes to npm with provenance, lists the version in the MCP Registry and pushes a multi-arch image to ghcr.io.
|
|
55
|
+
|
|
56
|
+
## 0.1.0
|
|
57
|
+
|
|
58
|
+
First version.
|
|
59
|
+
|
|
60
|
+
- Eight read-only MCP tools: `raidcom_list_commands`, `raidcom_describe_command`, `raidcom_build_command`, `raidcom_check_command`, `raidcom_build_script`, `raidcom_list_recipes`, `raidcom_build_recipe`, `raidcom_model_limits`.
|
|
61
|
+
- A catalogue of 178 commands (218 syntax forms, 562 examples) generated from the Command Reference, with per-model limits for VSP One Block 24/26/28, VSP 5000 series and VSP E series.
|
|
62
|
+
- Thirteen recipes: FC, iSCSI and NVMe/TCP provisioning, DP pools, extending and deleting volumes, command devices, zero-page reclaim, inventory, copy groups.
|
|
63
|
+
- Stdio and stateless Streamable HTTP transports (bearer token, TLS or proxy, host and origin checks, rate limit).
|
|
64
|
+
- Build-only by design: no tool connects to a storage system or runs a command.
|
package/INSTALL.md
ADDED
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# Installing raidcom-mcp
|
|
2
|
+
|
|
3
|
+
raidcom-mcp only builds command text. It needs no access to a storage system, no credentials and no CCI installation.
|
|
4
|
+
|
|
5
|
+
## Choose an install method
|
|
6
|
+
|
|
7
|
+
Every release on GitHub has these files, with `SHA256SUMS` to check them:
|
|
8
|
+
|
|
9
|
+
| You use | Install with | Needs Node.js? |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Claude Desktop | the [`.mcpb` extension](#claude-desktop-extension-mcpb) | No (Claude Desktop brings its own) |
|
|
12
|
+
| Claude Code | the [plugin](#claude-code-plugin) | Yes, 22.19 or later |
|
|
13
|
+
| Any MCP client, no Node.js installed | a [standalone package](#standalone-package) | No |
|
|
14
|
+
| Any MCP client, with Node.js | the [npm package](#from-the-npm-package) or [from source](#from-source) | Yes, 22.19 or later |
|
|
15
|
+
| A server for others to use | [Docker](#docker) or [HTTP](#run-over-http) | No |
|
|
16
|
+
|
|
17
|
+
### Verify your download
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
sha256sum -c SHA256SUMS --ignore-missing
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
On macOS, use `shasum -a 256 -c SHA256SUMS --ignore-missing`; on Windows, compare `Get-FileHash <file>` with the line in `SHA256SUMS`.
|
|
24
|
+
|
|
25
|
+
## Claude Desktop extension (.mcpb)
|
|
26
|
+
|
|
27
|
+
1. Download `raidcom-mcp-<version>.mcpb`.
|
|
28
|
+
2. Open it, either by double-clicking it or by dragging it onto Claude Desktop.
|
|
29
|
+
3. Click **Install**, then enable the extension. There are no settings to fill in.
|
|
30
|
+
|
|
31
|
+
The extension runs with the Node.js built into Claude Desktop. To remove it, go to **Settings → Extensions**.
|
|
32
|
+
|
|
33
|
+
### Add the command-builder skill (optional)
|
|
34
|
+
|
|
35
|
+
The `raidcom-command-builder` skill guides Claude through finding a command, building it, and showing it with its warnings. The Claude Code plugin includes it. For Claude Desktop or claude.ai, download `raidcom-command-builder-<version>.zip` from the same release (don't unzip it) and upload it under **Settings → Capabilities → Skills**. Skills need a Pro, Max, Team or Enterprise plan with code execution turned on.
|
|
36
|
+
|
|
37
|
+
## Standalone package
|
|
38
|
+
|
|
39
|
+
Each standalone package contains the server and its own Node.js runtime:
|
|
40
|
+
|
|
41
|
+
| System | Package |
|
|
42
|
+
|---|---|
|
|
43
|
+
| macOS, Apple silicon | `raidcom-mcp-<version>-darwin-arm64.tar.gz` |
|
|
44
|
+
| macOS, Intel | `raidcom-mcp-<version>-darwin-x64.tar.gz` |
|
|
45
|
+
| Linux, x64 | `raidcom-mcp-<version>-linux-x64.tar.gz` |
|
|
46
|
+
| Linux, arm64 | `raidcom-mcp-<version>-linux-arm64.tar.gz` |
|
|
47
|
+
| Windows, x64 | `raidcom-mcp-<version>-win-x64.zip` |
|
|
48
|
+
| Windows, arm64 | `raidcom-mcp-<version>-win-arm64.zip` |
|
|
49
|
+
|
|
50
|
+
The Linux packages need glibc 2.28 or later (RHEL/Rocky 8+, Debian 10+, Ubuntu 20.04+). On Alpine Linux, use [Docker](#docker) or the npm package.
|
|
51
|
+
|
|
52
|
+
### macOS and Linux
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
sudo tar -xzf raidcom-mcp-<version>-linux-x64.tar.gz -C /opt
|
|
56
|
+
sudo ln -sf /opt/raidcom-mcp-<version>-linux-x64/bin/raidcom-mcp /usr/local/bin/raidcom-mcp
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
The server command is then `/usr/local/bin/raidcom-mcp`. The launcher follows the symlink to find its runtime.
|
|
60
|
+
|
|
61
|
+
### Windows
|
|
62
|
+
|
|
63
|
+
Unzip the archive to a folder such as `C:\Program Files\raidcom-mcp`. The server is started by its bundled `runtime\node.exe` running `dist\index.js`:
|
|
64
|
+
|
|
65
|
+
```powershell
|
|
66
|
+
& "C:\Program Files\raidcom-mcp\raidcom-mcp-<version>-win-x64\runtime\node.exe" "C:\Program Files\raidcom-mcp\raidcom-mcp-<version>-win-x64\dist\index.js"
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
From a Command Prompt you can also run `bin\raidcom-mcp.cmd`. In MCP client configs use `node.exe` and `index.js` as shown above, because clients often can't start `.cmd` files directly.
|
|
70
|
+
|
|
71
|
+
## Claude Code plugin
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
/plugin install raidcom-community --marketplace visubramaniam/raidcom-mcp
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
See [README.plugin.md](README.plugin.md).
|
|
78
|
+
|
|
79
|
+
## From the npm package
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
npm install -g raidcom-mcp
|
|
83
|
+
raidcom-mcp # MCP over stdio
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Requires Node.js 22.19 or later (`node --version`).
|
|
87
|
+
|
|
88
|
+
## From source
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
git clone https://github.com/visubramaniam/raidcom-mcp.git
|
|
92
|
+
cd raidcom-mcp
|
|
93
|
+
npm ci
|
|
94
|
+
npm test
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`npm test` builds the server, runs the unit tests and the search evaluation.
|
|
98
|
+
|
|
99
|
+
## Connect it to Claude
|
|
100
|
+
|
|
101
|
+
### Claude Code
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
claude mcp add raidcom -- node /absolute/path/to/raidcom-mcp/dist/index.js
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Claude Desktop
|
|
108
|
+
|
|
109
|
+
Add this to `claude_desktop_config.json` (Settings → Developer → Edit config) and restart Claude Desktop:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{
|
|
113
|
+
"mcpServers": {
|
|
114
|
+
"raidcom": { "command": "node", "args": ["/absolute/path/to/raidcom-mcp/dist/index.js"] }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Other MCP clients
|
|
120
|
+
|
|
121
|
+
Any client that starts a stdio server can run `node dist/index.js`. Clients that speak Streamable HTTP can use the hosted mode below.
|
|
122
|
+
|
|
123
|
+
## Docker
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
docker build -t raidcom-mcp .
|
|
127
|
+
docker run -i --rm raidcom-mcp # MCP over stdio
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
See [README.docker.md](README.docker.md) for hosting.
|
|
131
|
+
|
|
132
|
+
## Run over HTTP
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
export RAIDCOM_TRANSPORT=http
|
|
136
|
+
export RAIDCOM_HTTP_TOKEN=$(openssl rand -hex 32)
|
|
137
|
+
node dist/index.js
|
|
138
|
+
# [raidcom-mcp] ready: ... listening on http://127.0.0.1:8361/mcp
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
The transport is stateless: every request is independent, so any number of instances can sit behind a load balancer. Clients send `Authorization: Bearer <token>`.
|
|
142
|
+
|
|
143
|
+
Which settings are required depends on where it listens:
|
|
144
|
+
|
|
145
|
+
- **Loopback only** (the default `127.0.0.1`): a token, or `RAIDCOM_HTTP_OPEN=true`.
|
|
146
|
+
- **Reachable by other machines**: also TLS. Either give the server a certificate (`RAIDCOM_HTTP_TLS_CERT`, `RAIDCOM_HTTP_TLS_KEY`) or put it behind a reverse proxy or load balancer that ends TLS and set `RAIDCOM_HTTP_BEHIND_TLS_PROXY=true`.
|
|
147
|
+
- **A public name**: list it in `RAIDCOM_HTTP_ALLOWED_HOSTS` (for example `raidcom.example.com`), or requests are refused with 403 to defend against DNS rebinding.
|
|
148
|
+
- **Behind a proxy**: set `RAIDCOM_HTTP_TRUST_PROXY` to the number of proxies in front of the server (`true` means one), so the rate limits apply per user. Each proxy adds an entry to `X-Forwarded-For`; the server takes the entry that many places from the right, and ignores entries further left, which the client could have written. Too low a number makes every user look like the same proxy (they then share one rate limit); too high lets a client choose its own address. To check the number, open `/healthz`: behind proxies it shows `client`, which should be your own public address (compare with `curl https://ifconfig.me`). Hosting platforms often have more than one proxy, and some put a CDN in front whose own proxies vary in number. If the address `/healthz` shows never matches yours, set `RAIDCOM_HTTP_DEBUG_CLIENT=true` and open `/healthz` again: it lists the forwarding headers it received. Behind Cloudflare (Render, for example) use `RAIDCOM_HTTP_CLIENT_IP_HEADER=cf-connecting-ip` instead of counting proxies; Cloudflare overwrites that header on every request, so a client can't set it. Turn the debug setting off again afterwards.
|
|
149
|
+
|
|
150
|
+
A public service that anyone may use can run with `RAIDCOM_HTTP_OPEN=true`: the server holds no secrets and cannot reach any array, so the risk is limited to load, which the rate limit and the 256 KB body limit bound.
|
|
151
|
+
|
|
152
|
+
### Check that it works
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
curl http://127.0.0.1:8361/healthz
|
|
156
|
+
curl -s http://127.0.0.1:8361/mcp -H "Authorization: Bearer $RAIDCOM_HTTP_TOKEN" \
|
|
157
|
+
-H "content-type: application/json" -H "accept: application/json, text/event-stream" \
|
|
158
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
You can also explore it with the MCP Inspector: `npm run inspect`.
|
|
162
|
+
|
|
163
|
+
## Running the commands it builds
|
|
164
|
+
|
|
165
|
+
raidcom-mcp does not run them. On a host with CCI installed and a running HORCM instance (see the `raidcom://notes/horcm-setup` resource), review the command or script and run it there. Scripts read credentials from `$RAIDCOM_USER` and `$RAIDCOM_PASSWORD` in your shell when built with `login: true`; they are never written into the script.
|
|
166
|
+
|
|
167
|
+
## Upgrading and uninstalling
|
|
168
|
+
|
|
169
|
+
`git pull && npm ci && npm test`. To uninstall, remove the MCP entry from your client and delete the folder.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vinod Subramaniam
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.docker.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Running raidcom-mcp with Docker
|
|
2
|
+
|
|
3
|
+
## Build
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
docker build -t raidcom-mcp .
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Stdio (a local client)
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
docker run -i --rm raidcom-mcp
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Hosted over HTTP
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
docker run -d --name raidcom-mcp -p 8361:8361 \
|
|
19
|
+
-e RAIDCOM_TRANSPORT=http \
|
|
20
|
+
-e RAIDCOM_HTTP_HOST=0.0.0.0 \
|
|
21
|
+
-e RAIDCOM_HTTP_TOKEN="$(openssl rand -hex 32)" \
|
|
22
|
+
-e RAIDCOM_HTTP_BEHIND_TLS_PROXY=true \
|
|
23
|
+
-e RAIDCOM_HTTP_ALLOWED_HOSTS=raidcom.example.com \
|
|
24
|
+
-e RAIDCOM_HTTP_TRUST_PROXY=true \
|
|
25
|
+
raidcom-mcp
|
|
26
|
+
curl http://127.0.0.1:8361/healthz
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Put a reverse proxy or load balancer in front that ends TLS and forwards `/mcp` and `/healthz` to port 8361. Leave out `RAIDCOM_HTTP_TOKEN` and set `RAIDCOM_HTTP_OPEN=true` for a public service without authentication. The container runs as the unprivileged `node` user, needs no volumes, and needs no outbound network access.
|
|
30
|
+
|
|
31
|
+
Example `docker-compose.yml`:
|
|
32
|
+
|
|
33
|
+
```yaml
|
|
34
|
+
services:
|
|
35
|
+
raidcom-mcp:
|
|
36
|
+
build: .
|
|
37
|
+
restart: unless-stopped
|
|
38
|
+
ports: ["127.0.0.1:8361:8361"]
|
|
39
|
+
read_only: true
|
|
40
|
+
environment:
|
|
41
|
+
RAIDCOM_TRANSPORT: http
|
|
42
|
+
RAIDCOM_HTTP_HOST: 0.0.0.0
|
|
43
|
+
RAIDCOM_HTTP_BEHIND_TLS_PROXY: "true"
|
|
44
|
+
RAIDCOM_HTTP_ALLOWED_HOSTS: raidcom.example.com
|
|
45
|
+
RAIDCOM_HTTP_TRUST_PROXY: "true"
|
|
46
|
+
RAIDCOM_HTTP_TOKEN: ${RAIDCOM_HTTP_TOKEN:?set a token}
|
|
47
|
+
healthcheck:
|
|
48
|
+
test: ["CMD", "wget", "-qO-", "http://127.0.0.1:8361/healthz"]
|
|
49
|
+
interval: 30s
|
|
50
|
+
```
|
package/README.md
CHANGED
|
@@ -1,3 +1,120 @@
|
|
|
1
|
-
#
|
|
1
|
+
# raidcom-mcp: build Hitachi raidcom commands from plain-language requests
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A community MCP server that turns a request such as *"present four 100 GB volumes from pool 0 to host esx01 on CL1-A and CL2-A"* into validated `raidcom` commands. It is **build-only**: it never connects to a storage system, never runs a command and holds no credentials. It returns command text (or a shell script) for a person to review and run on a host with CCI installed. That makes it safe to host online for anyone to use.
|
|
4
|
+
|
|
5
|
+
It is an independent project, not an official Hitachi Vantara product.
|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
- **Finds the right command.** `raidcom_list_commands` ranks the 178 commands in the catalogue against a question (BM25 with synonyms and verb intent) and says how confident it is.
|
|
10
|
+
- **Builds one command.** `raidcom_build_command` takes a command name and options as structured data, checks them against the manual's syntax and the storage model's limits, and returns the command line.
|
|
11
|
+
- **Builds many.** `raidcom_build_script` repeats steps over ranges (`foreach`, `zip`), adds `get command_status` after asynchronous commands, optionally locks the resource group, and returns a script that stops at the first failure.
|
|
12
|
+
- **Ready-made workflows.** `raidcom_list_recipes` and `raidcom_build_recipe` cover 14 common jobs: FC, iSCSI and NVMe/TCP provisioning, DP pools, mainframe (3390) pools, extending and deleting volumes, command devices, zero-page reclaim, inventory, copy groups.
|
|
13
|
+
- **Checks an existing command.** `raidcom_check_command` parses a pasted command line (never executing it; shell operators are refused) and reports every problem.
|
|
14
|
+
- **Knows the model limits.** `raidcom_model_limits` gives the LDEV, LUN, pool, serial and port ranges of VSP One Block 24/26/28, VSP 5000 series and VSP E series.
|
|
15
|
+
|
|
16
|
+
All eight tools are marked read-only. There is no tool that executes anything.
|
|
17
|
+
|
|
18
|
+
## How the catalogue is made
|
|
19
|
+
|
|
20
|
+
`spec/raidcom-catalog.json` is generated by `scripts/generate-catalog.mjs` from the text of the *Command Control Interface Command Reference* (MK-90RD7009). For every command it keeps the name, supported models, a one-line summary, each syntax form (as a small grammar), each option's value shape and a short description, and the command lines of the manual's examples. Hitachi's prose, tables and output samples are not copied. The manuals themselves are not part of this repository; to regenerate the catalogue with your own copy:
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
pdftotext -layout CCI_Command_Reference.pdf cci-reference.txt
|
|
24
|
+
npm run generate-catalog -- cci-reference.txt
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`tests/unit/catalog.test.mjs` replays every example in the manual through the parser and validator (about 96% pass; the rest are places where the manual's syntax line and its examples disagree).
|
|
28
|
+
|
|
29
|
+
## Validation
|
|
30
|
+
|
|
31
|
+
- Unknown options, wrong number of values, values outside an option's allowed words, and missing required options (checked against the syntax grammar) are errors with a suggested fix.
|
|
32
|
+
- LDEV IDs, LUN IDs, pool IDs, serial numbers and port names (`CL1-A`, `CL3-B-12`) are checked against the model you give, or the widest range of any model.
|
|
33
|
+
- Values that a shell could misread (`; | & $ \` > < ' "` and so on) are refused, and names with spaces are quoted.
|
|
34
|
+
- Because the manual's syntax lines are occasionally incomplete, `strict: false` turns *missing option* errors into warnings. Unknown options and out-of-range values stay errors.
|
|
35
|
+
- Out of scope: the `pair*` commands (paircreate, pairdisplay, ...) from the Quick Reference, and `raidcom -login`/`-logout` lines as commands of their own (scripts can add them with `login: true`, reading `$RAIDCOM_USER` and `$RAIDCOM_PASSWORD` from the shell).
|
|
36
|
+
|
|
37
|
+
## Setup
|
|
38
|
+
|
|
39
|
+
You need Node.js 22.19 or later.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
git clone https://github.com/visubramaniam/raidcom-mcp.git
|
|
43
|
+
cd raidcom-mcp
|
|
44
|
+
npm ci
|
|
45
|
+
npm run build
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Claude Code
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
claude mcp add raidcom -- node /path/to/raidcom-mcp/dist/index.js
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Claude Desktop
|
|
55
|
+
|
|
56
|
+
Add to `claude_desktop_config.json`:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"raidcom": { "command": "node", "args": ["/path/to/raidcom-mcp/dist/index.js"] }
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Claude Desktop, standalone packages
|
|
67
|
+
|
|
68
|
+
Each [release](https://github.com/visubramaniam/raidcom-mcp/releases) has a Claude Desktop extension (`.mcpb`), standalone packages for macOS, Linux and Windows with Node.js bundled, the npm package, and a skill zip. See [INSTALL.md](INSTALL.md).
|
|
69
|
+
|
|
70
|
+
### Claude Code plugin
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
/plugin install raidcom-community --marketplace visubramaniam/raidcom-mcp
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
See [README.plugin.md](README.plugin.md).
|
|
77
|
+
|
|
78
|
+
### Hosted over HTTP
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
RAIDCOM_TRANSPORT=http RAIDCOM_HTTP_HOST=0.0.0.0 RAIDCOM_HTTP_TOKEN=$(openssl rand -hex 32) \
|
|
82
|
+
RAIDCOM_HTTP_BEHIND_TLS_PROXY=true RAIDCOM_HTTP_ALLOWED_HOSTS=raidcom.example.com node dist/index.js
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
The endpoint is `/mcp` (stateless Streamable HTTP); `/healthz` reports liveness. See [INSTALL.md](INSTALL.md) and [README.docker.md](README.docker.md).
|
|
86
|
+
|
|
87
|
+
## Configuration
|
|
88
|
+
|
|
89
|
+
| Variable | Default | Meaning |
|
|
90
|
+
|---|---|---|
|
|
91
|
+
| `RAIDCOM_TRANSPORT` | `stdio` | `stdio` or `http` |
|
|
92
|
+
| `RAIDCOM_HTTP_HOST` | `127.0.0.1` | Address to listen on |
|
|
93
|
+
| `RAIDCOM_HTTP_PORT` | `8361` | Port (`0` picks a free one) |
|
|
94
|
+
| `RAIDCOM_HTTP_TOKEN` | none | Bearer token, at least 32 characters. Required unless `RAIDCOM_HTTP_OPEN=true` |
|
|
95
|
+
| `RAIDCOM_HTTP_OPEN` | `false` | Serve anyone who can reach the port, without a token |
|
|
96
|
+
| `RAIDCOM_HTTP_TLS_CERT`, `RAIDCOM_HTTP_TLS_KEY` | none | PEM files; the server then speaks HTTPS |
|
|
97
|
+
| `RAIDCOM_HTTP_BEHIND_TLS_PROXY` | `false` | A proxy or load balancer ends TLS. Needed for non-loopback addresses without TLS |
|
|
98
|
+
| `RAIDCOM_HTTP_ALLOWED_HOSTS` | none | Extra `Host` values to accept (`*` for any) |
|
|
99
|
+
| `RAIDCOM_HTTP_ALLOWED_ORIGINS` | none | `Origin` values to accept (`*` for any) |
|
|
100
|
+
| `RAIDCOM_HTTP_RATE_LIMIT` | `120` | Requests per minute per client (`0` for none) |
|
|
101
|
+
| `RAIDCOM_HTTP_CLIENT_IP_HEADER` | none | A header your proxy sets to the client's address, e.g. `cf-connecting-ip` behind Cloudflare (Render uses Cloudflare). Takes precedence over `X-Forwarded-For` |
|
|
102
|
+
| `RAIDCOM_HTTP_DEBUG_CLIENT` | `false` | `/healthz` also shows the forwarding headers it received, to choose the two settings above |
|
|
103
|
+
| `RAIDCOM_HTTP_TRUST_PROXY` | `false` | Take the client address from `X-Forwarded-For`: `true` for one proxy in front, or the number of proxies (see [INSTALL.md](INSTALL.md#run-over-http)) |
|
|
104
|
+
| `RAIDCOM_CATALOG`, `RAIDCOM_LIMITS`, `RAIDCOM_RECIPES`, `RAIDCOM_EXAMPLES` | bundled | Use another spec file (an empty `RAIDCOM_EXAMPLES` turns the example questions off) |
|
|
105
|
+
|
|
106
|
+
## Tests
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
npm test
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
runs the unit tests (`tests/unit`) and the search evaluation (`tests/search-eval.mjs`: 40 tuning and 30 held-out requests, each with a minimum top-1 and top-3 score that may only go up).
|
|
113
|
+
|
|
114
|
+
## Contributing
|
|
115
|
+
|
|
116
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). Security problems: [SECURITY.md](SECURITY.md).
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
MIT, see [LICENSE](LICENSE). "Hitachi", "raidcom" and "VSP" are trademarks of their owners; this project is not affiliated with or endorsed by Hitachi.
|
package/README.plugin.md
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# The raidcom-community Claude plugin
|
|
2
|
+
|
|
3
|
+
**raidcom-community** is a Claude plugin that installs the [raidcom-mcp](README.md) server, so Claude can turn a storage task into validated Hitachi `raidcom` commands and scripts. It also adds a skill, `raidcom-command-builder`, that guides Claude through the work.
|
|
4
|
+
|
|
5
|
+
> Not an official Hitachi Vantara product: raidcom-mcp and this plugin are an independent community project, not supported by or affiliated with Hitachi Vantara.
|
|
6
|
+
|
|
7
|
+
It is **build-only**. It needs no credentials and no access to a storage system, and it never runs a command. Claude shows you the command or script; you review it and run it on a host with CCI installed.
|
|
8
|
+
|
|
9
|
+
## Where it works
|
|
10
|
+
|
|
11
|
+
| Where | Works? |
|
|
12
|
+
|---|---|
|
|
13
|
+
| **Claude Code**: terminal, IDE extensions, and the desktop app's Code tab | Yes |
|
|
14
|
+
| **Claude chat** (claude.ai, desktop and mobile chat) | No: chat doesn't run plugins' local servers. Use the hosted HTTP server instead, if one is available to you ([INSTALL.md](INSTALL.md#run-over-http)) |
|
|
15
|
+
|
|
16
|
+
## Install
|
|
17
|
+
|
|
18
|
+
Requires Node.js 22.19 or later, with npm. In a Claude Code session:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/plugin install raidcom-community --marketplace visubramaniam/raidcom-mcp
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Or from your shell:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
claude plugin marketplace add visubramaniam/raidcom-mcp
|
|
28
|
+
claude plugin install raidcom-community@raidcom-community
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Claude Code installs the server from the plugin's `package.json` (pinned to an exact version of the `raidcom-mcp` npm package, and to a lockfile with integrity hashes once the release workflow has added it). There are no settings to fill in.
|
|
32
|
+
|
|
33
|
+
## Use
|
|
34
|
+
|
|
35
|
+
Ask in plain language:
|
|
36
|
+
|
|
37
|
+
- *"Present four 100 GB volumes from pool 0 to host esx01 on CL1-A and CL2-A on a VSP One Block 28."*
|
|
38
|
+
- *"Write the commands to create a mainframe pool from these drives."*
|
|
39
|
+
- *"Check this command: raidcom add lun -port CL1-A-0 -ldev_id 200 -lun_id 1"*
|
|
40
|
+
- *"Which raidcom command shows free LDEV IDs?"*
|
|
41
|
+
|
|
42
|
+
Start the skill by name with `/raidcom-community:raidcom-command-builder`.
|
|
43
|
+
|
|
44
|
+
## Update, disable and uninstall
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
claude plugin update raidcom-community@raidcom-community
|
|
48
|
+
claude plugin disable raidcom-community@raidcom-community
|
|
49
|
+
claude plugin uninstall raidcom-community@raidcom-community
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Each plugin version installs a matching `raidcom-mcp` version; [CHANGELOG.md](CHANGELOG.md) lists what changed.
|
|
53
|
+
|
|
54
|
+
## Privacy
|
|
55
|
+
|
|
56
|
+
The server runs on your computer, makes no network requests and stores nothing. Requests you make to Claude go to Anthropic as usual; the plugin adds nothing to them beyond the tool results.
|