@coffeerunhobby/mcp-ha-connect 1.1.0 → 1.2.0
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/CLAUDE.md +266 -0
- package/README.md +39 -4
- package/dist/omadaClient/client.d.ts +18 -1
- package/dist/omadaClient/client.js +27 -0
- package/dist/omadaClient/client.js.map +1 -1
- package/dist/omadaClient/index.d.ts +3 -1
- package/dist/omadaClient/index.js +7 -0
- package/dist/omadaClient/index.js.map +1 -1
- package/dist/omadaClient/request.d.ts +4 -0
- package/dist/omadaClient/request.js +6 -0
- package/dist/omadaClient/request.js.map +1 -1
- package/dist/tools/omada/blockClient.d.ts +3 -0
- package/dist/tools/omada/blockClient.js +14 -0
- package/dist/tools/omada/blockClient.js.map +1 -0
- package/dist/tools/omada/index.js +6 -0
- package/dist/tools/omada/index.js.map +1 -1
- package/dist/tools/omada/unblockClient.d.ts +3 -0
- package/dist/tools/omada/unblockClient.js +14 -0
- package/dist/tools/omada/unblockClient.js.map +1 -0
- package/dist/types/omada/clientBlockStatus.d.ts +11 -0
- package/dist/types/omada/clientBlockStatus.js +2 -0
- package/dist/types/omada/clientBlockStatus.js.map +1 -0
- package/dist/types/omada/index.d.ts +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/CHANGELOG.md +9 -0
- package/openapi.json +1 -1
- package/package.json +1 -1
- package/src/omadaClient/client.ts +34 -0
- package/src/omadaClient/index.ts +10 -0
- package/src/omadaClient/request.ts +7 -0
- package/src/tools/omada/blockClient.ts +26 -0
- package/src/tools/omada/index.ts +7 -0
- package/src/tools/omada/unblockClient.ts +26 -0
- package/src/types/omada/clientBlockStatus.ts +11 -0
- package/src/types/omada/index.ts +1 -0
- package/src/version.ts +1 -1
- package/tests/tools/omada/handlers.test.ts +52 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# mcp-ha-connect -- Claude Code Agent
|
|
2
|
+
|
|
3
|
+
## Identity & Scope
|
|
4
|
+
|
|
5
|
+
This agent owns the **mcp-ha-connect MCP server** — a Model Context Protocol server for
|
|
6
|
+
Home Assistant, TP-Link Omada, and Local AI integration.
|
|
7
|
+
|
|
8
|
+
**Repo:** `github.com/coffeerunhobby/mcp-ha-connect`
|
|
9
|
+
**npm:** `@coffeerunhobby/mcp-ha-connect`
|
|
10
|
+
**Docker:** `ghcr.io/coffeerunhobby/mcp-ha-connect`
|
|
11
|
+
**Live endpoint:** Cloudflare domain → NAS Docker port 3000 (domain in NAS `.env`)
|
|
12
|
+
|
|
13
|
+
**Working directory:** `C:\workspace\mcp` — this is the canonical copy.
|
|
14
|
+
`W:\mcp-homeassistant` is a stale export at v0.8.0 — ignore it.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Stack
|
|
19
|
+
|
|
20
|
+
- **Runtime:** Node.js 20+ (dev machine uses nvm)
|
|
21
|
+
- **Language:** TypeScript, compiled to `dist/` via `tsc`
|
|
22
|
+
- **MCP SDK:** `@modelcontextprotocol/sdk`
|
|
23
|
+
- **Transport:** Streamable HTTP (port 3000, path `/mcp`)
|
|
24
|
+
- **Auth:** JWT bearer tokens with RBAC permission system
|
|
25
|
+
- **Plugins:** Home Assistant · TP-Link Omada SDN · Local AI (Ollama/OpenAI-compat)
|
|
26
|
+
- **Tests:** Vitest (829 unit tests) + integration tests in `tests/integration/`
|
|
27
|
+
- **Container:** Alpine Node image, deployed on Synology NAS via Docker Compose
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Infrastructure
|
|
32
|
+
|
|
33
|
+
| Resource | Address | Notes |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| **MCP server** | `mcpserver.10.0.0.18.nip.io:3000` | NAS Docker container |
|
|
36
|
+
| **Home Assistant** | `homeassistant.10.0.0.19.nip.io:8123` | |
|
|
37
|
+
| **Omada controller** | `omada.10.0.0.18.nip.io:8043` | HTTPS, self-signed cert |
|
|
38
|
+
| **Ollama** | `ollama.10.0.0.17.nip.io:11434` | model `phi4:14b` |
|
|
39
|
+
| **n8n** | `n8n.10.0.0.18.nip.io:5678` | also exposed via Cloudflare |
|
|
40
|
+
| **NAS Docker path** | `/volume1/docker/mcp-ha-connect/` | compose.yaml + .env |
|
|
41
|
+
| **Cloudflare** | proxies public domain → NAS port 3000 | domain stored in `.env` |
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Secrets & Credentials
|
|
46
|
+
|
|
47
|
+
All secrets live in the NAS `.env` file and as **Windows User environment variables**.
|
|
48
|
+
Never store token values in source files, commit messages, or this file.
|
|
49
|
+
|
|
50
|
+
| Variable | Purpose |
|
|
51
|
+
|---|---|
|
|
52
|
+
| `NPM_MCP_HA_TOKEN` | npm Granular token for publishing |
|
|
53
|
+
| `GHCR_TOKEN` | GitHub PAT with `write:packages` scope |
|
|
54
|
+
|
|
55
|
+
### Retrieve for use
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
$npmToken = [Environment]::GetEnvironmentVariable('NPM_MCP_HA_TOKEN', 'User')
|
|
59
|
+
$ghcrToken = [Environment]::GetEnvironmentVariable('GHCR_TOKEN', 'User')
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### npm token requirements
|
|
63
|
+
|
|
64
|
+
The npm token must be **Granular type** with:
|
|
65
|
+
- Scope `@coffeerunhobby` → **Read and write** (scope-level, not per-package)
|
|
66
|
+
- **Bypass two-factor authentication** ✅ checked
|
|
67
|
+
|
|
68
|
+
Create at: npmjs.com → Access Tokens → Generate New Token → Granular Access Token
|
|
69
|
+
|
|
70
|
+
**Critical:** Never run `npm logout` — it revokes the token server-side and deletes it
|
|
71
|
+
from npmjs.com. If the token disappears from the web UI, that's why.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Release Process
|
|
76
|
+
|
|
77
|
+
### 1. Pre-flight
|
|
78
|
+
|
|
79
|
+
```powershell
|
|
80
|
+
cd C:\workspace\mcp
|
|
81
|
+
npm test # all tests must pass
|
|
82
|
+
npm run build # must compile clean
|
|
83
|
+
npm run lint # ZERO errors AND zero warnings (see Code Quality policy)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 2. Version bump
|
|
87
|
+
|
|
88
|
+
Update **both** files to the new version:
|
|
89
|
+
- `package.json` → `"version": "X.Y.Z"`
|
|
90
|
+
- `src/version.ts` → `export const VERSION = 'X.Y.Z';`
|
|
91
|
+
|
|
92
|
+
Update `docs/CHANGELOG.md` with the new version section.
|
|
93
|
+
|
|
94
|
+
### 3. Commit & tag
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
git add .
|
|
98
|
+
git commit -m "vX.Y.Z - <short description>"
|
|
99
|
+
git tag vX.Y.Z
|
|
100
|
+
git push origin main
|
|
101
|
+
git push origin vX.Y.Z
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Create the GitHub Release at:
|
|
105
|
+
`https://github.com/coffeerunhobby/mcp-ha-connect/releases/new?tag=vX.Y.Z`
|
|
106
|
+
|
|
107
|
+
### 4. npm publish
|
|
108
|
+
|
|
109
|
+
**Preferred: interactive login (browser).** Granular tokens keep getting revoked, so the
|
|
110
|
+
reliable path is an interactive `npm login`, which opens the browser for auth. The agent
|
|
111
|
+
**cannot** complete this alone — it MUST ask the user to run/confirm the browser login,
|
|
112
|
+
then publish together:
|
|
113
|
+
|
|
114
|
+
```powershell
|
|
115
|
+
cd C:\workspace\mcp
|
|
116
|
+
npm login # opens browser — USER completes this, agent waits
|
|
117
|
+
npm whoami # must print the account name, not 403
|
|
118
|
+
npm publish --access public
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Do NOT run `npm logout`** afterward — it revokes any granular token server-side.
|
|
122
|
+
|
|
123
|
+
> Agent rule: when a release reaches this step, STOP and ask the user to help with
|
|
124
|
+
> `npm login` and `npm publish --access public` (browser-based). Do not silently fall
|
|
125
|
+
> back to a stored token — if `npm whoami` returns 403, the token is dead.
|
|
126
|
+
|
|
127
|
+
### 5. Docker build & push
|
|
128
|
+
|
|
129
|
+
Docker Desktop must be running.
|
|
130
|
+
|
|
131
|
+
```powershell
|
|
132
|
+
$ghcrToken = [Environment]::GetEnvironmentVariable('GHCR_TOKEN', 'User')
|
|
133
|
+
$ghcrToken | docker login ghcr.io -u coffeerunhobby --password-stdin
|
|
134
|
+
|
|
135
|
+
cd C:\workspace\mcp
|
|
136
|
+
docker build --no-cache `
|
|
137
|
+
-t ghcr.io/coffeerunhobby/mcp-ha-connect:X.Y.Z `
|
|
138
|
+
-t ghcr.io/coffeerunhobby/mcp-ha-connect:latest .
|
|
139
|
+
|
|
140
|
+
docker push ghcr.io/coffeerunhobby/mcp-ha-connect:X.Y.Z
|
|
141
|
+
docker push ghcr.io/coffeerunhobby/mcp-ha-connect:latest
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Use `docker build`, not `docker buildx build --platform`. The NAS is amd64 and a plain
|
|
145
|
+
build on a Windows/amd64 host produces the correct image.
|
|
146
|
+
|
|
147
|
+
### 6. Deploy to NAS
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
cd /volume1/docker/mcp-ha-connect
|
|
151
|
+
docker compose pull && docker compose up -d
|
|
152
|
+
docker compose logs --tail=30
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## NAS `.env` — critical settings
|
|
158
|
+
|
|
159
|
+
```env
|
|
160
|
+
MCP_HTTP_BIND_ADDR=0.0.0.0
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Must be `0.0.0.0`, not `127.0.0.1`. Docker port mapping requires the server to listen on
|
|
164
|
+
all interfaces inside the container — loopback only means Cloudflare gets a 502.
|
|
165
|
+
|
|
166
|
+
```env
|
|
167
|
+
MCP_HTTP_ALLOWED_ORIGINS=...,<cloudflare-domain>,https://<cloudflare-domain>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Must include both the bare hostname AND the `https://` form of the Cloudflare domain.
|
|
171
|
+
The MCP SDK checks the `host` header (no protocol) for DNS rebinding protection AND
|
|
172
|
+
the `origin` header (with protocol) for CORS.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Omada SDN — known issues
|
|
177
|
+
|
|
178
|
+
**After upgrading the Omada controller version**, the `OMADA_OMADAC_ID` changes.
|
|
179
|
+
Error code `-44106` is returned for BOTH wrong credentials AND wrong `OMADA_OMADAC_ID` —
|
|
180
|
+
the API does not distinguish between them.
|
|
181
|
+
|
|
182
|
+
**To get the new Omada ID:**
|
|
183
|
+
Omada web UI → Settings → Open API → click the eye icon → copy **Omada ID**.
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
sed -i 's/OMADA_OMADAC_ID=.*/OMADA_OMADAC_ID=<new-id>/' /volume1/docker/mcp-ha-connect/.env
|
|
187
|
+
docker compose up -d
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
If Omada is unreachable or credentials are wrong, the server **gracefully degrades** —
|
|
191
|
+
Omada tools are disabled but HA and AI keep working. Set `OMADA_PLUGIN_ENABLED=false`
|
|
192
|
+
to disable Omada entirely while troubleshooting.
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## Code Quality — fix every error and warning
|
|
197
|
+
|
|
198
|
+
**Always fix errors AND warnings. Never label something "pre-existing debt" and move on.**
|
|
199
|
+
|
|
200
|
+
- `npm run lint`, `npm run build`, and `npm test` must all be **completely clean** —
|
|
201
|
+
zero errors, zero warnings — before a change is considered done.
|
|
202
|
+
- If you touch a file (or a release surfaces lint output) and find existing errors or
|
|
203
|
+
warnings, they are now yours to fix. "It was already broken" is not an acceptable
|
|
204
|
+
reason to leave it.
|
|
205
|
+
- **Exception — release timing:** do not cut a patch release *solely* to clean up lint.
|
|
206
|
+
If quality issues are found right after a release has shipped, fold the fixes into the
|
|
207
|
+
**next feature's** commit rather than churning a `vX.Y.(Z+1)`. Outstanding cleanup of
|
|
208
|
+
this kind is tracked in `.claude/NEXT-SESSION.md` so it isn't forgotten.
|
|
209
|
+
|
|
210
|
+
> Currently outstanding: `Function`-type lint warnings in the test mock helpers
|
|
211
|
+
> (`tests/tools/**/handlers.test.ts`). Fix these as part of the next feature change —
|
|
212
|
+
> NOT as a standalone patch release.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Development
|
|
217
|
+
|
|
218
|
+
```powershell
|
|
219
|
+
cd C:\workspace\mcp
|
|
220
|
+
npm run dev # tsx watch with .env
|
|
221
|
+
npm test # vitest (excludes integration)
|
|
222
|
+
npm run test:watch # watch mode
|
|
223
|
+
npm run lint # eslint
|
|
224
|
+
npm run build # tsc compile to dist/
|
|
225
|
+
npm run generate:jwt # generate a test JWT token
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Integration tests (requires live .env)
|
|
229
|
+
|
|
230
|
+
```powershell
|
|
231
|
+
npm run test:integration
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## Never assume. Always verify.
|
|
237
|
+
|
|
238
|
+
- **Cloudflare 502**: check the container is running (`docker compose ps`) and
|
|
239
|
+
`MCP_HTTP_BIND_ADDR=0.0.0.0` is set.
|
|
240
|
+
- **MCP client connects but tools fail**: check `MCP_HTTP_ALLOWED_ORIGINS` includes
|
|
241
|
+
the Cloudflare domain in both bare and `https://` form.
|
|
242
|
+
- **Claude Desktop shows "Server disconnected" but `/health` is 200**: the client's
|
|
243
|
+
mcp-remote auth header is malformed. A `"Authorization: Bearer ${MCP_AUTH_TOKEN}"`
|
|
244
|
+
placeholder does NOT expand on Windows (`cmd /c` uses `%VAR%`, mcp-remote doesn't
|
|
245
|
+
substitute `${VAR}`) → literal text is sent → server 401 → mcp-remote drops into a
|
|
246
|
+
failing OAuth flow. Fix: inline the literal JWT in `claude_desktop_config.json`'s
|
|
247
|
+
`--header` arg, and add `-y` to `npx` so first run doesn't hang. Verify the server
|
|
248
|
+
side first with a direct `curl` POST to `/mcp` carrying the token.
|
|
249
|
+
- **npm publish returns 404 on PUT**: token likely has per-package scope instead of
|
|
250
|
+
scope-level access, or "Bypass 2FA" is not ticked. Delete token and recreate.
|
|
251
|
+
- **Omada auth error -44106**: check `OMADA_OMADAC_ID` first, not just credentials —
|
|
252
|
+
this error code covers both cases.
|
|
253
|
+
- **Before a release**: always run `npm test` and `npm run build` clean.
|
|
254
|
+
- **On release, bump the version everywhere**: `package.json`, `src/version.ts`,
|
|
255
|
+
`docs/CHANGELOG.md`, AND `openapi.json` (`info.version`) — the last one drifts easily.
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Known gaps
|
|
260
|
+
|
|
261
|
+
- **`MCP_TOOL_REGISTRATION_MODE` is NOT implemented.** Lazy/meta-tool registration
|
|
262
|
+
(`list_tools` + `execute` instead of all ~60 tool schemas, to save context on small
|
|
263
|
+
models) was designed but never built — `config.ts` doesn't parse the var and there is
|
|
264
|
+
no `src/tools/registry.ts` / `metaTools.ts` / `allMetadata.ts`. Setting it in `.env`
|
|
265
|
+
is a silent no-op; the server always registers every tool eagerly. Either build the
|
|
266
|
+
feature or drop the var from the NAS `.env`.
|
package/README.md
CHANGED
|
@@ -550,24 +550,40 @@ Use the HTTP transport with your MCP-compatible web client:
|
|
|
550
550
|
3. Set transport to Streamable HTTP (MCP 2025-03-26)
|
|
551
551
|
4. Enable CORS by adding your origin to `MCP_HTTP_ALLOWED_ORIGINS`
|
|
552
552
|
|
|
553
|
-
### With Remote MCP Proxy (
|
|
553
|
+
### With Remote MCP Proxy (mcp-remote)
|
|
554
554
|
|
|
555
|
-
Connect to a remote MCP
|
|
555
|
+
Connect a stdio-only client (Claude Desktop, LM Studio) to a remote HTTP MCP
|
|
556
|
+
server using [`mcp-remote`](https://www.npmjs.com/package/mcp-remote). On Windows,
|
|
557
|
+
launch it through `cmd /c` and include `-y` so the first run never blocks on the
|
|
558
|
+
npx install prompt:
|
|
556
559
|
|
|
557
560
|
```json
|
|
558
561
|
{
|
|
559
562
|
"mcpServers": {
|
|
560
563
|
"homeassistant": {
|
|
561
|
-
"command": "
|
|
564
|
+
"command": "cmd",
|
|
562
565
|
"args": [
|
|
566
|
+
"/c",
|
|
567
|
+
"npx",
|
|
568
|
+
"-y",
|
|
563
569
|
"mcp-remote",
|
|
564
|
-
"
|
|
570
|
+
"https://your-server.example/mcp",
|
|
571
|
+
"--header",
|
|
572
|
+
"Authorization: Bearer <your-jwt-token>"
|
|
565
573
|
]
|
|
566
574
|
}
|
|
567
575
|
}
|
|
568
576
|
}
|
|
569
577
|
```
|
|
570
578
|
|
|
579
|
+
> ⚠️ **Do not use `${VAR}` placeholders in the `--header` value.** A config like
|
|
580
|
+
> `"Authorization: Bearer ${MCP_AUTH_TOKEN}"` with a matching `env` block does **not**
|
|
581
|
+
> work on Windows: `cmd /c` only expands `%VAR%` (not `${VAR}`), and mcp-remote does
|
|
582
|
+
> not substitute it either. The literal text `${MCP_AUTH_TOKEN}` is sent as the token,
|
|
583
|
+
> the server replies `401`, and mcp-remote then falls into a failing OAuth flow that
|
|
584
|
+
> surfaces as **"Server disconnected"**. Inline the actual JWT instead. (On macOS/Linux
|
|
585
|
+
> you can instead let your shell expand the variable before the client launches.)
|
|
586
|
+
|
|
571
587
|
## Network Configuration Notes
|
|
572
588
|
|
|
573
589
|
- **`host.docker.internal`** - Use this to access services on your host machine from Docker
|
|
@@ -637,6 +653,25 @@ docker run --rm -i \
|
|
|
637
653
|
ghcr.io/coffeerunhobby/mcp-ha-connect:latest
|
|
638
654
|
```
|
|
639
655
|
|
|
656
|
+
### mcp-remote Shows "Server disconnected" (401)
|
|
657
|
+
|
|
658
|
+
If `/health` returns `200` but the client shows **"Server disconnected"**, the
|
|
659
|
+
auth header is almost certainly malformed. Most common cause: a `${VAR}`
|
|
660
|
+
placeholder in the `--header` value that never got expanded (see the warning under
|
|
661
|
+
[With Remote MCP Proxy](#with-remote-mcp-proxy-mcp-remote)). Verify the endpoint
|
|
662
|
+
accepts your token directly:
|
|
663
|
+
|
|
664
|
+
```bash
|
|
665
|
+
curl -i -X POST https://your-server.example/mcp \
|
|
666
|
+
-H "Authorization: Bearer <your-jwt-token>" \
|
|
667
|
+
-H "Content-Type: application/json" \
|
|
668
|
+
-H "Accept: application/json, text/event-stream" \
|
|
669
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"diag","version":"1.0"}}}'
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
A `200` with an `initialize` result means the server and token are fine — fix the
|
|
673
|
+
client config (inline the literal token). A `401` means the token itself is wrong.
|
|
674
|
+
|
|
640
675
|
### Docker `host.docker.internal` Not Working (Linux)
|
|
641
676
|
|
|
642
677
|
Add host gateway:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActiveClientInfo, ClientActivity, ClientPastConnection, ClientRateLimitSetting, GetClientActivityOptions, ListClientsPastConnectionsOptions, OmadaClientInfo, RateLimitProfile } from '../types/index.js';
|
|
1
|
+
import type { ActiveClientInfo, ClientActivity, ClientBlockStatus, ClientPastConnection, ClientRateLimitSetting, GetClientActivityOptions, ListClientsPastConnectionsOptions, OmadaClientInfo, RateLimitProfile } from '../types/index.js';
|
|
2
2
|
import type { RequestHandler } from './request.js';
|
|
3
3
|
import type { SiteOperations } from './site.js';
|
|
4
4
|
/**
|
|
@@ -79,4 +79,21 @@ export declare class ClientOperations {
|
|
|
79
79
|
* @returns Updated rate limit setting
|
|
80
80
|
*/
|
|
81
81
|
disableClientRateLimit(clientMac: string, siteId?: string): Promise<ClientRateLimitSetting>;
|
|
82
|
+
/**
|
|
83
|
+
* Block a client from the network.
|
|
84
|
+
* The client is denied network access until it is unblocked.
|
|
85
|
+
*
|
|
86
|
+
* @param clientMac - MAC address of the client to block
|
|
87
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
88
|
+
* @returns Status object confirming the client was blocked
|
|
89
|
+
*/
|
|
90
|
+
blockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus>;
|
|
91
|
+
/**
|
|
92
|
+
* Unblock a previously blocked client, restoring its network access.
|
|
93
|
+
*
|
|
94
|
+
* @param clientMac - MAC address of the client to unblock
|
|
95
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
96
|
+
* @returns Status object confirming the client was unblocked
|
|
97
|
+
*/
|
|
98
|
+
unblockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus>;
|
|
82
99
|
}
|
|
@@ -169,5 +169,32 @@ export class ClientOperations {
|
|
|
169
169
|
const response = await this.request.patch(this.buildPath(`/sites/${encodeURIComponent(resolvedSiteId)}/clients/${encodeURIComponent(clientMac)}/ratelimit`), requestBody);
|
|
170
170
|
return this.request.ensureSuccess(response);
|
|
171
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Block a client from the network.
|
|
174
|
+
* The client is denied network access until it is unblocked.
|
|
175
|
+
*
|
|
176
|
+
* @param clientMac - MAC address of the client to block
|
|
177
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
178
|
+
* @returns Status object confirming the client was blocked
|
|
179
|
+
*/
|
|
180
|
+
async blockClient(clientMac, siteId) {
|
|
181
|
+
const resolvedSiteId = this.site.resolveSiteId(siteId);
|
|
182
|
+
const response = await this.request.post(this.buildPath(`/sites/${encodeURIComponent(resolvedSiteId)}/clients/${encodeURIComponent(clientMac)}/block`));
|
|
183
|
+
this.request.ensureSuccess(response);
|
|
184
|
+
return { mac: clientMac, siteId: resolvedSiteId, blocked: true };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Unblock a previously blocked client, restoring its network access.
|
|
188
|
+
*
|
|
189
|
+
* @param clientMac - MAC address of the client to unblock
|
|
190
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
191
|
+
* @returns Status object confirming the client was unblocked
|
|
192
|
+
*/
|
|
193
|
+
async unblockClient(clientMac, siteId) {
|
|
194
|
+
const resolvedSiteId = this.site.resolveSiteId(siteId);
|
|
195
|
+
const response = await this.request.post(this.buildPath(`/sites/${encodeURIComponent(resolvedSiteId)}/clients/${encodeURIComponent(clientMac)}/unblock`));
|
|
196
|
+
this.request.ensureSuccess(response);
|
|
197
|
+
return { mac: clientMac, siteId: resolvedSiteId, blocked: false };
|
|
198
|
+
}
|
|
172
199
|
}
|
|
173
200
|
//# sourceMappingURL=client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/omadaClient/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/omadaClient/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActiveClientInfo, ClientActivity, ClientPastConnection, ClientRateLimitSetting, GetClientActivityOptions, GetDeviceStatsOptions, GetThreatListOptions, ListClientsPastConnectionsOptions, OmadaClientInfo, OmadaDeviceInfo, OmadaDeviceStats, OmadaSiteSummary, OswStackDetail, PaginatedResult, RateLimitProfile, ThreatInfo } from '../types/index.js';
|
|
1
|
+
import type { ActiveClientInfo, ClientActivity, ClientBlockStatus, ClientPastConnection, ClientRateLimitSetting, GetClientActivityOptions, GetDeviceStatsOptions, GetThreatListOptions, ListClientsPastConnectionsOptions, OmadaClientInfo, OmadaDeviceInfo, OmadaDeviceStats, OmadaSiteSummary, OswStackDetail, PaginatedResult, RateLimitProfile, ThreatInfo } from '../types/index.js';
|
|
2
2
|
import { type RequestOptions } from './request.js';
|
|
3
3
|
export interface OmadaClientOptions {
|
|
4
4
|
baseUrl: string;
|
|
@@ -38,6 +38,8 @@ export declare class OmadaClient {
|
|
|
38
38
|
setClientRateLimit(clientMac: string, downLimit: number, upLimit: number, siteId?: string): Promise<ClientRateLimitSetting>;
|
|
39
39
|
setClientRateLimitProfile(clientMac: string, profileId: string, siteId?: string): Promise<ClientRateLimitSetting>;
|
|
40
40
|
disableClientRateLimit(clientMac: string, siteId?: string): Promise<ClientRateLimitSetting>;
|
|
41
|
+
blockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus>;
|
|
42
|
+
unblockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus>;
|
|
41
43
|
getThreatList(options: GetThreatListOptions): Promise<PaginatedResult<ThreatInfo>>;
|
|
42
44
|
getInternetInfo(siteId?: string): Promise<unknown>;
|
|
43
45
|
getPortForwardingStatus(type: 'User' | 'UPnP', siteId?: string, page?: number, pageSize?: number): Promise<PaginatedResult<unknown>>;
|
|
@@ -90,6 +90,13 @@ export class OmadaClient {
|
|
|
90
90
|
async disableClientRateLimit(clientMac, siteId) {
|
|
91
91
|
return await this.clientOps.disableClientRateLimit(clientMac, siteId);
|
|
92
92
|
}
|
|
93
|
+
// Client block operations
|
|
94
|
+
async blockClient(clientMac, siteId) {
|
|
95
|
+
return await this.clientOps.blockClient(clientMac, siteId);
|
|
96
|
+
}
|
|
97
|
+
async unblockClient(clientMac, siteId) {
|
|
98
|
+
return await this.clientOps.unblockClient(clientMac, siteId);
|
|
99
|
+
}
|
|
93
100
|
// Security operations
|
|
94
101
|
async getThreatList(options) {
|
|
95
102
|
return await this.securityOps.getThreatList(options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/omadaClient/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/omadaClient/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,10 @@ export declare class RequestHandler {
|
|
|
29
29
|
* Make a PATCH request to the Omada API.
|
|
30
30
|
*/
|
|
31
31
|
patch<T>(path: string, data?: unknown): Promise<T>;
|
|
32
|
+
/**
|
|
33
|
+
* Make a POST request to the Omada API.
|
|
34
|
+
*/
|
|
35
|
+
post<T>(path: string, data?: unknown): Promise<T>;
|
|
32
36
|
/**
|
|
33
37
|
* Make an arbitrary HTTP request to the Omada API.
|
|
34
38
|
*/
|
|
@@ -26,6 +26,12 @@ export class RequestHandler {
|
|
|
26
26
|
async patch(path, data) {
|
|
27
27
|
return await this.request({ method: 'PATCH', url: path, data });
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* Make a POST request to the Omada API.
|
|
31
|
+
*/
|
|
32
|
+
async post(path, data) {
|
|
33
|
+
return await this.request({ method: 'POST', url: path, data });
|
|
34
|
+
}
|
|
29
35
|
/**
|
|
30
36
|
* Make an arbitrary HTTP request to the Omada API.
|
|
31
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/omadaClient/request.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAI5C,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAgB9B;;GAEG;AACH,MAAM,OAAO,cAAc;IAOF;IANJ,OAAO,CAAS;IAChB,OAAO,CAAS;IAChB,SAAS,CAAU;IAEpC,YACI,MAA4B,EACX,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;QAElC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC;IAC9C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,GAAG,CAAI,IAAY,EAAE,MAAgC;QAC9D,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,KAAK,CAAI,IAAY,EAAE,IAAc;QAC9C,OAAO,MAAM,IAAI,CAAC,OAAO,CAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,OAAO,CAAI,MAAsB,EAAE,KAAK,GAAG,IAAI;QACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAErD,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAE9C,uBAAuB;QACvB,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBACxC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAA2B;YACpC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;YAC1B,aAAa,EAAE,eAAe,WAAW,EAAE;YAC3C,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC5B,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,MAAM;YACN,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS;SAC7C,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;YAClC,MAAM;YACN,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;YACtC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;YAC7B,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC;SAC1C,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,8EAA8E;YAC9E,gFAAgF;YAChF,MAAM,0BAA0B,GAAG,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;YAC5E,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC;YACnD,CAAC;YAED,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;oBACnC,MAAM;oBACN,OAAO;oBACP,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3D,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;iBAC5C,CAAC,CAAC;YACP,CAAC;oBAAS,CAAC;gBACP,2BAA2B;gBAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBAClB,IAAI,0BAA0B,KAAK,SAAS,EAAE,CAAC;wBAC3C,OAAO,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC;oBACpD,CAAC;yBAAM,CAAC;wBACJ,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,0BAA0B,CAAC;oBAC1E,CAAC;gBACL,CAAC;YACL,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1B,MAAM;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,sBAAsB;YACtB,MAAM,YAAY,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;YAElD,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACnC,MAAM;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;aAC3C,CAAC,CAAC;YAEH,+DAA+D;YAC/D,MAAM,SAAS,GAAI,YAAmD,EAAE,SAAS,CAAC;YAClF,MAAM,QAAQ,GAAI,YAA6C,EAAE,GAAG,CAAC;YAErE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACrF,MAAM,CAAC,IAAI,CAAC,mEAAmE,EAAE;oBAC7E,MAAM;oBACN,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,SAAS;oBACT,OAAO,EAAE,QAAQ;iBACpB,CAAC,CAAC;gBACH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YAED,4DAA4D;YAC5D,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnD,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;oBACjC,MAAM;oBACN,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;iBAClC,CAAC,CAAC;gBACH,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC3F,CAAC;YAED,OAAO,YAAY,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;gBACjC,MAAM;gBACN,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAClE,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,MAAM,KAAK,CAAC;YAChB,CAAC;YAED,mEAAmE;YACnE,MAAM,cAAc,GAAG,KAAK,YAAY,SAAS;gBAC7C,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAE5D,IAAI,cAAc,EAAE,CAAC;gBACjB,MAAM,KAAK,CAAC;YAChB,CAAC;YAED,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,cAAc,CAAI,IAAY,EAAE,SAAkC,EAAE;QAC7E,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,IAAI,SAA6B,CAAC;QAElC,kFAAkF;QAClF,GAAG,CAAC;YACA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAuC,IAAI,EAAE;gBACxE,GAAG,MAAM;gBACT,IAAI;gBACJ,QAAQ,EAAE,iBAAiB;aAC9B,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACnC,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC;YAE1C,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;YAC1B,IAAI,IAAI,CAAC,CAAC;YAEV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM;YACV,CAAC;QACL,CAAC,QAAQ,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,EAAE;QAEnD,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,aAAa,CAAI,QAA6B;QACjD,IAAI,QAAQ,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE;gBAC5B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,GAAG;aACxB,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,CAAC,QAAQ,CAAC,MAAM,IAAK,EAAQ,CAAM,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,SAAkB;QACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,OAAgB;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,OAAO,CACH,QAAQ,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC7C,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACtC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC;YAClC,QAAQ,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CACpD,CAAC;IACN,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAA2C;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACrB,CAAC;QAED,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,OAAgB;QACpC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,OAAO,OAAO,CAAC;QACnB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,SAAS,GAA4B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QACpG,CAAC;QAED,OAAO,SAAS,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAW;QAC9B,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,CACH,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC;YACpC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5B,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CACnC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAc;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,UAAU,CAAC;YACtB,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,iBAAiB,CAAC;QAC7B,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/omadaClient/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
3
|
+
export function registerBlockClientTool(server, client) {
|
|
4
|
+
const inputSchema = z.object({
|
|
5
|
+
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
6
|
+
siteId: z.string().min(1).optional(),
|
|
7
|
+
});
|
|
8
|
+
server.registerTool('omada_blockClient', {
|
|
9
|
+
description: 'Block a client from the network by MAC address. The client is denied all network access until unblocked. ' +
|
|
10
|
+
'Use omada_listClients first to find the exact MAC. This affects real network connectivity - confirm with the user before applying.',
|
|
11
|
+
inputSchema: inputSchema.shape,
|
|
12
|
+
}, wrapToolHandler('omada_blockClient', async ({ clientMac, siteId }) => toToolResult(await client.blockClient(clientMac, siteId)), Permission.CONTROL));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=blockClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockClient.js","sourceRoot":"","sources":["../../../src/tools/omada/blockClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzE,MAAM,UAAU,uBAAuB,CAAC,MAAiB,EAAE,MAAmB;IAC1E,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACf,mBAAmB,EACnB;QACI,WAAW,EACP,2GAA2G;YAC3G,oIAAoI;QACxI,WAAW,EAAE,WAAW,CAAC,KAAK;KACjC,EACD,eAAe,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CACjE,YAAY,CAAC,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EACzD,UAAU,CAAC,OAAO,CACrB,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Omada tools index - registers all Omada MCP tools
|
|
3
3
|
*/
|
|
4
4
|
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import { registerBlockClientTool } from './blockClient.js';
|
|
5
6
|
import { registerDisableClientRateLimitTool } from './disableClientRateLimit.js';
|
|
6
7
|
import { registerGetClientTool } from './getClient.js';
|
|
7
8
|
import { registerGetDeviceTool } from './getDevice.js';
|
|
@@ -26,6 +27,7 @@ import { registerListSitesTool } from './listSites.js';
|
|
|
26
27
|
import { registerSearchDevicesTool } from './searchDevices.js';
|
|
27
28
|
import { registerSetClientRateLimitTool } from './setClientRateLimit.js';
|
|
28
29
|
import { registerSetClientRateLimitProfileTool } from './setClientRateLimitProfile.js';
|
|
30
|
+
import { registerUnblockClientTool } from './unblockClient.js';
|
|
29
31
|
export function registerOmadaTools(server, client) {
|
|
30
32
|
logger.debug('Registering Omada tools');
|
|
31
33
|
let toolCount = 0;
|
|
@@ -52,6 +54,10 @@ export function registerOmadaTools(server, client) {
|
|
|
52
54
|
registerSetClientRateLimitProfileTool(server, client);
|
|
53
55
|
registerDisableClientRateLimitTool(server, client);
|
|
54
56
|
toolCount += 4;
|
|
57
|
+
// Client block tools
|
|
58
|
+
registerBlockClientTool(server, client);
|
|
59
|
+
registerUnblockClientTool(server, client);
|
|
60
|
+
toolCount += 2;
|
|
55
61
|
// Security tools
|
|
56
62
|
registerGetThreatListTool(server, client);
|
|
57
63
|
toolCount += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/omada/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAAE,mCAAmC,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,sCAAsC,EAAE,MAAM,iCAAiC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,iCAAiC,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,qCAAqC,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/omada/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
3
|
+
export function registerUnblockClientTool(server, client) {
|
|
4
|
+
const inputSchema = z.object({
|
|
5
|
+
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
6
|
+
siteId: z.string().min(1).optional(),
|
|
7
|
+
});
|
|
8
|
+
server.registerTool('omada_unblockClient', {
|
|
9
|
+
description: 'Unblock a previously blocked client by MAC address, restoring its network access. ' +
|
|
10
|
+
'Use omada_listClients first to find the exact MAC.',
|
|
11
|
+
inputSchema: inputSchema.shape,
|
|
12
|
+
}, wrapToolHandler('omada_unblockClient', async ({ clientMac, siteId }) => toToolResult(await client.unblockClient(clientMac, siteId)), Permission.CONTROL));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=unblockClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unblockClient.js","sourceRoot":"","sources":["../../../src/tools/omada/unblockClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEzE,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAmB;IAC5E,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;QACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;QACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACvC,CAAC,CAAC;IAEH,MAAM,CAAC,YAAY,CACf,qBAAqB,EACrB;QACI,WAAW,EACP,oFAAoF;YACpF,oDAAoD;QACxD,WAAW,EAAE,WAAW,CAAC,KAAK;KACjC,EACD,eAAe,CAAC,qBAAqB,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CACnE,YAAY,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,EAC3D,UAAU,CAAC,OAAO,CACrB,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of a client block/unblock operation.
|
|
3
|
+
*/
|
|
4
|
+
export interface ClientBlockStatus {
|
|
5
|
+
/** MAC address of the client that was blocked or unblocked. */
|
|
6
|
+
mac: string;
|
|
7
|
+
/** Site the operation was applied to. */
|
|
8
|
+
siteId: string;
|
|
9
|
+
/** True if the client is now blocked, false if it was unblocked. */
|
|
10
|
+
blocked: boolean;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clientBlockStatus.js","sourceRoot":"","sources":["../../../src/types/omada/clientBlockStatus.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { ActiveClientInfo } from './activeClientInfo.js';
|
|
2
2
|
export type { ClientActivity, GetClientActivityOptions } from './clientActivity.js';
|
|
3
|
+
export type { ClientBlockStatus } from './clientBlockStatus.js';
|
|
3
4
|
export type { ClientPastConnection, ListClientsPastConnectionsOptions } from './clientPastConnection.js';
|
|
4
5
|
export type { OmadaApiResponse } from './omadaApiResponse.js';
|
|
5
6
|
export type { OmadaClientInfo } from './omadaClientInfo.js';
|
package/dist/version.d.ts
CHANGED
package/dist/version.js
CHANGED
package/docs/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
### 1.2.0
|
|
2
|
+
- **Omada Client Block/Unblock**: Block or unblock a network client by MAC address
|
|
3
|
+
- New tool `omada_blockClient`: denies a client all network access until unblocked
|
|
4
|
+
- New tool `omada_unblockClient`: restores a previously blocked client's access
|
|
5
|
+
- Backed by the Omada Open API `POST .../clients/{mac}/block` and `/unblock` endpoints
|
|
6
|
+
- Both require the `CONTROL` permission and return a `{ mac, siteId, blocked }` status object
|
|
7
|
+
- Total Omada tools: 23 → 25
|
|
8
|
+
- All tests passing
|
|
9
|
+
|
|
1
10
|
### 1.1.0
|
|
2
11
|
- **Performance: Paginated Entity Queries**: Reduced response sizes by ~98% for entity queries
|
|
3
12
|
- New `LightweightEntity` type returns only essential fields (entity_id, state, friendly_name, unit_of_measurement, last_changed)
|
package/openapi.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"openapi": "3.1.0",
|
|
3
3
|
"info": {
|
|
4
4
|
"title": "Home Assistant MCP Wrapper",
|
|
5
|
-
"version": "
|
|
5
|
+
"version": "1.2.0",
|
|
6
6
|
"description": "REST endpoints that wrap MCP tools for Home Assistant integration. Raw JSON-RPC passthrough available at POST / for n8n compatibility."
|
|
7
7
|
},
|
|
8
8
|
"servers": [
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
ActiveClientInfo,
|
|
3
3
|
ClientActivity,
|
|
4
|
+
ClientBlockStatus,
|
|
4
5
|
ClientPastConnection,
|
|
5
6
|
ClientRateLimitSetting,
|
|
6
7
|
GetClientActivityOptions,
|
|
@@ -222,4 +223,37 @@ export class ClientOperations {
|
|
|
222
223
|
);
|
|
223
224
|
return this.request.ensureSuccess(response);
|
|
224
225
|
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Block a client from the network.
|
|
229
|
+
* The client is denied network access until it is unblocked.
|
|
230
|
+
*
|
|
231
|
+
* @param clientMac - MAC address of the client to block
|
|
232
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
233
|
+
* @returns Status object confirming the client was blocked
|
|
234
|
+
*/
|
|
235
|
+
public async blockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus> {
|
|
236
|
+
const resolvedSiteId = this.site.resolveSiteId(siteId);
|
|
237
|
+
const response = await this.request.post<OmadaApiResponse<unknown>>(
|
|
238
|
+
this.buildPath(`/sites/${encodeURIComponent(resolvedSiteId)}/clients/${encodeURIComponent(clientMac)}/block`)
|
|
239
|
+
);
|
|
240
|
+
this.request.ensureSuccess(response);
|
|
241
|
+
return { mac: clientMac, siteId: resolvedSiteId, blocked: true };
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Unblock a previously blocked client, restoring its network access.
|
|
246
|
+
*
|
|
247
|
+
* @param clientMac - MAC address of the client to unblock
|
|
248
|
+
* @param siteId - Optional site ID, uses default from config if not provided
|
|
249
|
+
* @returns Status object confirming the client was unblocked
|
|
250
|
+
*/
|
|
251
|
+
public async unblockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus> {
|
|
252
|
+
const resolvedSiteId = this.site.resolveSiteId(siteId);
|
|
253
|
+
const response = await this.request.post<OmadaApiResponse<unknown>>(
|
|
254
|
+
this.buildPath(`/sites/${encodeURIComponent(resolvedSiteId)}/clients/${encodeURIComponent(clientMac)}/unblock`)
|
|
255
|
+
);
|
|
256
|
+
this.request.ensureSuccess(response);
|
|
257
|
+
return { mac: clientMac, siteId: resolvedSiteId, blocked: false };
|
|
258
|
+
}
|
|
225
259
|
}
|
package/src/omadaClient/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
ActiveClientInfo,
|
|
3
3
|
ClientActivity,
|
|
4
|
+
ClientBlockStatus,
|
|
4
5
|
ClientPastConnection,
|
|
5
6
|
ClientRateLimitSetting,
|
|
6
7
|
GetClientActivityOptions,
|
|
@@ -151,6 +152,15 @@ export class OmadaClient {
|
|
|
151
152
|
return await this.clientOps.disableClientRateLimit(clientMac, siteId);
|
|
152
153
|
}
|
|
153
154
|
|
|
155
|
+
// Client block operations
|
|
156
|
+
public async blockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus> {
|
|
157
|
+
return await this.clientOps.blockClient(clientMac, siteId);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
public async unblockClient(clientMac: string, siteId?: string): Promise<ClientBlockStatus> {
|
|
161
|
+
return await this.clientOps.unblockClient(clientMac, siteId);
|
|
162
|
+
}
|
|
163
|
+
|
|
154
164
|
// Security operations
|
|
155
165
|
public async getThreatList(options: GetThreatListOptions): Promise<PaginatedResult<ThreatInfo>> {
|
|
156
166
|
return await this.securityOps.getThreatList(options);
|
|
@@ -50,6 +50,13 @@ export class RequestHandler {
|
|
|
50
50
|
return await this.request<T>({ method: 'PATCH', url: path, data });
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Make a POST request to the Omada API.
|
|
55
|
+
*/
|
|
56
|
+
public async post<T>(path: string, data?: unknown): Promise<T> {
|
|
57
|
+
return await this.request<T>({ method: 'POST', url: path, data });
|
|
58
|
+
}
|
|
59
|
+
|
|
53
60
|
/**
|
|
54
61
|
* Make an arbitrary HTTP request to the Omada API.
|
|
55
62
|
*/
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
+
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
+
|
|
7
|
+
export function registerBlockClientTool(server: McpServer, client: OmadaClient): void {
|
|
8
|
+
const inputSchema = z.object({
|
|
9
|
+
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
10
|
+
siteId: z.string().min(1).optional(),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
server.registerTool(
|
|
14
|
+
'omada_blockClient',
|
|
15
|
+
{
|
|
16
|
+
description:
|
|
17
|
+
'Block a client from the network by MAC address. The client is denied all network access until unblocked. ' +
|
|
18
|
+
'Use omada_listClients first to find the exact MAC. This affects real network connectivity - confirm with the user before applying.',
|
|
19
|
+
inputSchema: inputSchema.shape,
|
|
20
|
+
},
|
|
21
|
+
wrapToolHandler('omada_blockClient', async ({ clientMac, siteId }) =>
|
|
22
|
+
toToolResult(await client.blockClient(clientMac, siteId)),
|
|
23
|
+
Permission.CONTROL
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
}
|
package/src/tools/omada/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
6
6
|
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
7
7
|
import { logger } from '../../utils/logger.js';
|
|
8
8
|
|
|
9
|
+
import { registerBlockClientTool } from './blockClient.js';
|
|
9
10
|
import { registerDisableClientRateLimitTool } from './disableClientRateLimit.js';
|
|
10
11
|
import { registerGetClientTool } from './getClient.js';
|
|
11
12
|
import { registerGetDeviceTool } from './getDevice.js';
|
|
@@ -30,6 +31,7 @@ import { registerListSitesTool } from './listSites.js';
|
|
|
30
31
|
import { registerSearchDevicesTool } from './searchDevices.js';
|
|
31
32
|
import { registerSetClientRateLimitTool } from './setClientRateLimit.js';
|
|
32
33
|
import { registerSetClientRateLimitProfileTool } from './setClientRateLimitProfile.js';
|
|
34
|
+
import { registerUnblockClientTool } from './unblockClient.js';
|
|
33
35
|
|
|
34
36
|
export function registerOmadaTools(server: McpServer, client: OmadaClient): number {
|
|
35
37
|
logger.debug('Registering Omada tools');
|
|
@@ -62,6 +64,11 @@ export function registerOmadaTools(server: McpServer, client: OmadaClient): numb
|
|
|
62
64
|
registerDisableClientRateLimitTool(server, client);
|
|
63
65
|
toolCount += 4;
|
|
64
66
|
|
|
67
|
+
// Client block tools
|
|
68
|
+
registerBlockClientTool(server, client);
|
|
69
|
+
registerUnblockClientTool(server, client);
|
|
70
|
+
toolCount += 2;
|
|
71
|
+
|
|
65
72
|
// Security tools
|
|
66
73
|
registerGetThreatListTool(server, client);
|
|
67
74
|
toolCount += 1;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
import type { OmadaClient } from '../../omadaClient/index.js';
|
|
5
|
+
import { toToolResult, wrapToolHandler, Permission } from '../common.js';
|
|
6
|
+
|
|
7
|
+
export function registerUnblockClientTool(server: McpServer, client: OmadaClient): void {
|
|
8
|
+
const inputSchema = z.object({
|
|
9
|
+
clientMac: z.string().min(1, 'clientMac (MAC address) is required'),
|
|
10
|
+
siteId: z.string().min(1).optional(),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
server.registerTool(
|
|
14
|
+
'omada_unblockClient',
|
|
15
|
+
{
|
|
16
|
+
description:
|
|
17
|
+
'Unblock a previously blocked client by MAC address, restoring its network access. ' +
|
|
18
|
+
'Use omada_listClients first to find the exact MAC.',
|
|
19
|
+
inputSchema: inputSchema.shape,
|
|
20
|
+
},
|
|
21
|
+
wrapToolHandler('omada_unblockClient', async ({ clientMac, siteId }) =>
|
|
22
|
+
toToolResult(await client.unblockClient(clientMac, siteId)),
|
|
23
|
+
Permission.CONTROL
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of a client block/unblock operation.
|
|
3
|
+
*/
|
|
4
|
+
export interface ClientBlockStatus {
|
|
5
|
+
/** MAC address of the client that was blocked or unblocked. */
|
|
6
|
+
mac: string;
|
|
7
|
+
/** Site the operation was applied to. */
|
|
8
|
+
siteId: string;
|
|
9
|
+
/** True if the client is now blocked, false if it was unblocked. */
|
|
10
|
+
blocked: boolean;
|
|
11
|
+
}
|
package/src/types/omada/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export type { ActiveClientInfo } from './activeClientInfo.js';
|
|
2
2
|
export type { ClientActivity, GetClientActivityOptions } from './clientActivity.js';
|
|
3
|
+
export type { ClientBlockStatus } from './clientBlockStatus.js';
|
|
3
4
|
export type { ClientPastConnection, ListClientsPastConnectionsOptions } from './clientPastConnection.js';
|
|
4
5
|
export type { OmadaApiResponse } from './omadaApiResponse.js';
|
|
5
6
|
export type { OmadaClientInfo } from './omadaClientInfo.js';
|
package/src/version.ts
CHANGED
|
@@ -22,6 +22,8 @@ import { registerGetRateLimitProfilesTool } from '../../../src/tools/omada/getRa
|
|
|
22
22
|
import { registerSetClientRateLimitTool } from '../../../src/tools/omada/setClientRateLimit.js';
|
|
23
23
|
import { registerSetClientRateLimitProfileTool } from '../../../src/tools/omada/setClientRateLimitProfile.js';
|
|
24
24
|
import { registerDisableClientRateLimitTool } from '../../../src/tools/omada/disableClientRateLimit.js';
|
|
25
|
+
import { registerBlockClientTool } from '../../../src/tools/omada/blockClient.js';
|
|
26
|
+
import { registerUnblockClientTool } from '../../../src/tools/omada/unblockClient.js';
|
|
25
27
|
import { registerGetThreatListTool } from '../../../src/tools/omada/getThreatList.js';
|
|
26
28
|
import { registerGetInternetInfoTool } from '../../../src/tools/omada/getInternetInfo.js';
|
|
27
29
|
import { registerGetPortForwardingStatusTool } from '../../../src/tools/omada/getPortForwardingStatus.js';
|
|
@@ -61,6 +63,8 @@ function createMockClient() {
|
|
|
61
63
|
setClientRateLimit: vi.fn(),
|
|
62
64
|
setClientRateLimitProfile: vi.fn(),
|
|
63
65
|
disableClientRateLimit: vi.fn(),
|
|
66
|
+
blockClient: vi.fn(),
|
|
67
|
+
unblockClient: vi.fn(),
|
|
64
68
|
getThreatList: vi.fn(),
|
|
65
69
|
getInternetInfo: vi.fn(),
|
|
66
70
|
getPortForwardingStatus: vi.fn(),
|
|
@@ -523,6 +527,54 @@ describe('Omada Tool Handlers - Rate Limit Tools', () => {
|
|
|
523
527
|
expect(client.disableClientRateLimit).toHaveBeenCalledWith('AA:BB:CC:DD:EE:FF', 'site1');
|
|
524
528
|
});
|
|
525
529
|
});
|
|
530
|
+
|
|
531
|
+
describe('omada_blockClient', () => {
|
|
532
|
+
it('should register the tool', () => {
|
|
533
|
+
registerBlockClientTool(server, client as OmadaClient);
|
|
534
|
+
expect(server.registerTool).toHaveBeenCalledWith(
|
|
535
|
+
'omada_blockClient',
|
|
536
|
+
expect.objectContaining({ description: expect.any(String) }),
|
|
537
|
+
expect.any(Function)
|
|
538
|
+
);
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
it('should block a client', async () => {
|
|
542
|
+
const mockResult = { mac: 'AA:BB:CC:DD:EE:FF', siteId: 'site1', blocked: true };
|
|
543
|
+
(client.blockClient as ReturnType<typeof vi.fn>).mockResolvedValue(mockResult);
|
|
544
|
+
|
|
545
|
+
registerBlockClientTool(server, client as OmadaClient);
|
|
546
|
+
const handler = server.handlers.get('omada_blockClient')!.handler;
|
|
547
|
+
const result = await handler({ clientMac: 'AA:BB:CC:DD:EE:FF', siteId: 'site1' }, mockExtra);
|
|
548
|
+
const parsed = parseResult(result);
|
|
549
|
+
|
|
550
|
+
expect(parsed).toEqual(mockResult);
|
|
551
|
+
expect(client.blockClient).toHaveBeenCalledWith('AA:BB:CC:DD:EE:FF', 'site1');
|
|
552
|
+
});
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
describe('omada_unblockClient', () => {
|
|
556
|
+
it('should register the tool', () => {
|
|
557
|
+
registerUnblockClientTool(server, client as OmadaClient);
|
|
558
|
+
expect(server.registerTool).toHaveBeenCalledWith(
|
|
559
|
+
'omada_unblockClient',
|
|
560
|
+
expect.objectContaining({ description: expect.any(String) }),
|
|
561
|
+
expect.any(Function)
|
|
562
|
+
);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it('should unblock a client', async () => {
|
|
566
|
+
const mockResult = { mac: 'AA:BB:CC:DD:EE:FF', siteId: 'site1', blocked: false };
|
|
567
|
+
(client.unblockClient as ReturnType<typeof vi.fn>).mockResolvedValue(mockResult);
|
|
568
|
+
|
|
569
|
+
registerUnblockClientTool(server, client as OmadaClient);
|
|
570
|
+
const handler = server.handlers.get('omada_unblockClient')!.handler;
|
|
571
|
+
const result = await handler({ clientMac: 'AA:BB:CC:DD:EE:FF', siteId: 'site1' }, mockExtra);
|
|
572
|
+
const parsed = parseResult(result);
|
|
573
|
+
|
|
574
|
+
expect(parsed).toEqual(mockResult);
|
|
575
|
+
expect(client.unblockClient).toHaveBeenCalledWith('AA:BB:CC:DD:EE:FF', 'site1');
|
|
576
|
+
});
|
|
577
|
+
});
|
|
526
578
|
});
|
|
527
579
|
|
|
528
580
|
describe('Omada Tool Handlers - Security Tools', () => {
|