discord-ops 0.21.2 → 0.23.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.
Files changed (94) hide show
  1. package/CHANGELOG.md +36 -129
  2. package/README.md +119 -33
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +36 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/validate-flags.d.ts.map +1 -1
  7. package/dist/cli/validate-flags.js +5 -0
  8. package/dist/cli/validate-flags.js.map +1 -1
  9. package/dist/cli/validate.d.ts +6 -0
  10. package/dist/cli/validate.d.ts.map +1 -0
  11. package/dist/cli/validate.js +78 -0
  12. package/dist/cli/validate.js.map +1 -0
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/client.js +13 -5
  15. package/dist/client.js.map +1 -1
  16. package/dist/config/index.d.ts +23 -4
  17. package/dist/config/index.d.ts.map +1 -1
  18. package/dist/config/index.js +84 -4
  19. package/dist/config/index.js.map +1 -1
  20. package/dist/config/profiles.d.ts +7 -0
  21. package/dist/config/profiles.d.ts.map +1 -1
  22. package/dist/config/profiles.js +23 -1
  23. package/dist/config/profiles.js.map +1 -1
  24. package/dist/config/schema.d.ts +166 -15
  25. package/dist/config/schema.d.ts.map +1 -1
  26. package/dist/config/schema.js +33 -2
  27. package/dist/config/schema.js.map +1 -1
  28. package/dist/config/validate.d.ts.map +1 -1
  29. package/dist/config/validate.js +25 -6
  30. package/dist/config/validate.js.map +1 -1
  31. package/dist/profiles/index.d.ts +5 -0
  32. package/dist/profiles/index.d.ts.map +1 -1
  33. package/dist/profiles/index.js +16 -0
  34. package/dist/profiles/index.js.map +1 -1
  35. package/dist/routing/fuzzy.d.ts +0 -1
  36. package/dist/routing/fuzzy.d.ts.map +1 -1
  37. package/dist/routing/fuzzy.js +0 -25
  38. package/dist/routing/fuzzy.js.map +1 -1
  39. package/dist/routing/resolver.d.ts +11 -1
  40. package/dist/routing/resolver.d.ts.map +1 -1
  41. package/dist/routing/resolver.js +80 -17
  42. package/dist/routing/resolver.js.map +1 -1
  43. package/dist/security/rate-limiter.d.ts.map +1 -1
  44. package/dist/security/rate-limiter.js +4 -0
  45. package/dist/security/rate-limiter.js.map +1 -1
  46. package/dist/server.d.ts.map +1 -1
  47. package/dist/server.js +69 -5
  48. package/dist/server.js.map +1 -1
  49. package/dist/tools/channels/index.d.ts +1 -0
  50. package/dist/tools/channels/index.d.ts.map +1 -1
  51. package/dist/tools/channels/index.js +1 -0
  52. package/dist/tools/channels/index.js.map +1 -1
  53. package/dist/tools/guilds/create-invite.d.ts.map +1 -1
  54. package/dist/tools/guilds/create-invite.js +4 -10
  55. package/dist/tools/guilds/create-invite.js.map +1 -1
  56. package/dist/tools/guilds/index.d.ts +1 -0
  57. package/dist/tools/guilds/index.d.ts.map +1 -1
  58. package/dist/tools/guilds/index.js +1 -0
  59. package/dist/tools/guilds/index.js.map +1 -1
  60. package/dist/tools/index.d.ts.map +1 -1
  61. package/dist/tools/index.js +14 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/tools/messaging/get-messages.d.ts.map +1 -1
  64. package/dist/tools/messaging/get-messages.js +21 -2
  65. package/dist/tools/messaging/get-messages.js.map +1 -1
  66. package/dist/tools/messaging/index.d.ts +5 -0
  67. package/dist/tools/messaging/index.d.ts.map +1 -1
  68. package/dist/tools/messaging/index.js +5 -0
  69. package/dist/tools/messaging/index.js.map +1 -1
  70. package/dist/tools/messaging/send-template.d.ts.map +1 -1
  71. package/dist/tools/messaging/send-template.js +14 -0
  72. package/dist/tools/messaging/send-template.js.map +1 -1
  73. package/dist/tools/moderation/timeout-member.d.ts.map +1 -1
  74. package/dist/tools/moderation/timeout-member.js +1 -0
  75. package/dist/tools/moderation/timeout-member.js.map +1 -1
  76. package/dist/tools/system/list-bots.d.ts +2 -0
  77. package/dist/tools/system/list-bots.d.ts.map +1 -0
  78. package/dist/tools/system/list-bots.js +49 -0
  79. package/dist/tools/system/list-bots.js.map +1 -0
  80. package/dist/tools/threads/list-threads.d.ts.map +1 -1
  81. package/dist/tools/threads/list-threads.js +22 -1
  82. package/dist/tools/threads/list-threads.js.map +1 -1
  83. package/dist/transport/http.d.ts +4 -2
  84. package/dist/transport/http.d.ts.map +1 -1
  85. package/dist/transport/http.js +20 -3
  86. package/dist/transport/http.js.map +1 -1
  87. package/dist/utils/cache.d.ts +3 -1
  88. package/dist/utils/cache.d.ts.map +1 -1
  89. package/dist/utils/cache.js +28 -1
  90. package/dist/utils/cache.js.map +1 -1
  91. package/dist/utils/og-fetch.d.ts.map +1 -1
  92. package/dist/utils/og-fetch.js +35 -10
  93. package/dist/utils/og-fetch.js.map +1 -1
  94. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,41 @@
1
1
  # discord-ops
2
2
 
3
+ ## 0.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - bbc870b: Multi-bot architecture: bot personas, per-channel bot assignment, and per-project tool profile enforcement.
8
+
9
+ **Bot personas:** Named bots with identity metadata (`name`, `role`, `description`) configured in a top-level `bots` section. Each bot references a `token_env` and can have a `default_profile` restricting which tools it can use.
10
+
11
+ **Channel-level bot assignment:** Channels accept `{ "id": "...", "bot": "bot-name" }` to override which bot operates in that channel. Token resolution follows: channel bot → project bot → project `token_env` → default token.
12
+
13
+ **Per-project tool profile enforcement:** Runtime gate in the MCP server checks per-project `tool_profile` and per-bot `default_profile` on every tool call. Tools not in the effective profile return an error. Supports `profile_add`/`profile_remove` overrides.
14
+
15
+ **New tool:** `list_bots` — returns all configured bot personas with project assignments, channel overrides, and connection status. Does not expose token values.
16
+
17
+ **Validation:** `discord-ops validate` now checks bot references, profile names, and bot token availability.
18
+
19
+ Backwards compatible — existing configs without `bots` work unchanged. Channels accept both plain snowflake strings and `{ id, bot }` objects.
20
+
21
+ ## 0.22.0
22
+
23
+ ### Minor Changes
24
+
25
+ - a7f7218: Engineering audit remediation: 32 findings fixed across 5 epics.
26
+
27
+ **Breaking:** `get_messages` now returns full embed and attachment objects instead of counts. `embeds` changes from `number` to `array`, `attachments` from `number` to `array`. Update consumers checking `embeds > 0` to `embeds.length > 0`.
28
+
29
+ **New tools:** `send_template`, `list_templates`, `pin_message`, `unpin_message`, `notify_owners`, `get_invites` (42 → 48 tools).
30
+
31
+ **CLI:** `setup`, `run`, `validate` subcommands now wired. Flags `--allow-unauthenticated`, `--profile`, `--tools`, `--dry-run`, `--args` accepted. Version reads from package.json dynamically.
32
+
33
+ **Bug fixes:** `list_threads` respects `archived` param. `timeout_member` marked destructive. `resolveTarget` returns `undefined` instead of `""` for missing guild. Permission pre-flight logs errors.
34
+
35
+ **Security:** SSRF DNS pinning prevents rebinding. Template URL vars validated. X-Forwarded-For parsed right-to-left. Per-project rate limit buckets. Extended reserved IP blocking. Token hashing for cache keys. IP counter hard cap.
36
+
37
+ **Code quality:** Dead code removed. TTLCache max-size eviction. Profile tool name validation at startup. Rate limiter bucket pruning.
38
+
3
39
  ## 0.21.2
4
40
 
5
41
  ### Patch Changes
@@ -150,14 +186,6 @@
150
186
  - `move_channel` — reposition a channel or category relative to another channel using `before_id`/`after_id` instead of fragile raw position integers. Resolves sibling positions automatically.
151
187
  - `notify_owners` — standalone owner ping tool. Sends `<@mention>`s to a channel based on `notification_type` without a full message or embed. No-ops silently if the type isn't in the project's `notify_owners_on` list. Supports optional message text appended after mentions.
152
188
 
153
- ## 0.18.0
154
-
155
- ### Minor Changes
156
-
157
- - 637362e: feat: add move_channel and notify_owners tools
158
- - `move_channel` — reposition a channel or category relative to another channel using `before_id`/`after_id` instead of fragile raw position integers. Resolves sibling positions automatically.
159
- - `notify_owners` — standalone owner ping tool. Sends `<@mention>`s to a channel based on `notification_type` without a full message or embed. No-ops silently if the type isn't in the project's `notify_owners_on` list. Supports optional message text appended after mentions.
160
-
161
189
  ## 0.17.0
162
190
 
163
191
  ### Minor Changes
@@ -178,58 +206,6 @@
178
206
 
179
207
  - 350cb59: fix: release workflow — truncate highlights to Discord 1024-char field limit, auto-sync main back to staging after publish
180
208
 
181
- ## 0.16.0
182
-
183
- ### Minor Changes
184
-
185
- - b42d0fe: feat: add `run` CLI subcommand and inline JSON support for `DISCORD_OPS_CONFIG`
186
- - `discord-ops run <tool> --args '<json>'` — execute any tool directly from shell, no AI/MCP required. Supports the full tool suite including `send_template`, `send_message`, `send_embed`, and all 46 tools.
187
- - `DISCORD_OPS_CONFIG` now accepts an inline JSON string in addition to a file path — if the value starts with `{` it is parsed directly. Eliminates the need to write config files in CI environments.
188
- - `release.yml` GitHub Actions workflow — automatically posts a rich Discord release notification to `#releases` after every successful npm publish via changesets.
189
- - README — new CLI `run` docs with examples, CI/CD integration section with config shape, GitHub Actions example, and updated `DISCORD_OPS_CONFIG` env var description.
190
-
191
- ### Patch Changes
192
-
193
- - b42d0fe: fix: add "alert" to NotificationType enum — global config with alert in notify_owners_on caused config parse failure and MCP startup crash
194
- - b42d0fe: fix: clean up changelog formatting in Discord release notifications — section headers now render as bold text, commit hashes stripped from bullet lines
195
- - b42d0fe: Fix stale npx cache — use `discord-ops@latest` in MCP config
196
-
197
- Without `@latest`, npx may serve a cached older version indefinitely, causing MCP clients to run stale code even after new releases are published. All MCP config examples in the README updated to use `discord-ops@latest`.
198
-
199
- ## 0.15.0
200
-
201
- ### Minor Changes
202
-
203
- - 01c3e44: feat: add `run` CLI subcommand and inline JSON support for `DISCORD_OPS_CONFIG`
204
- - `discord-ops run <tool> --args '<json>'` — execute any tool directly from shell, no AI/MCP required. Supports the full tool suite including `send_template`, `send_message`, `send_embed`, and all 46 tools.
205
- - `DISCORD_OPS_CONFIG` now accepts an inline JSON string in addition to a file path — if the value starts with `{` it is parsed directly. Eliminates the need to write config files in CI environments.
206
- - `release.yml` GitHub Actions workflow — automatically posts a rich Discord release notification to `#releases` after every successful npm publish via changesets.
207
- - README — new CLI `run` docs with examples, CI/CD integration section with config shape, GitHub Actions example, and updated `DISCORD_OPS_CONFIG` env var description.
208
-
209
- ### Patch Changes
210
-
211
- - 01c3e44: fix: add "alert" to NotificationType enum — global config with alert in notify_owners_on caused config parse failure and MCP startup crash
212
- - 01c3e44: Fix stale npx cache — use `discord-ops@latest` in MCP config
213
-
214
- Without `@latest`, npx may serve a cached older version indefinitely, causing MCP clients to run stale code even after new releases are published. All MCP config examples in the README updated to use `discord-ops@latest`.
215
-
216
- ## 0.14.3
217
-
218
- ### Patch Changes
219
-
220
- - 6bd5a54: fix: add "alert" to NotificationType enum — global config with alert in notify_owners_on caused config parse failure and MCP startup crash
221
- - 6bd5a54: Fix stale npx cache — use `discord-ops@latest` in MCP config
222
-
223
- Without `@latest`, npx may serve a cached older version indefinitely, causing MCP clients to run stale code even after new releases are published. All MCP config examples in the README updated to use `discord-ops@latest`.
224
-
225
- ## 0.14.2
226
-
227
- ### Patch Changes
228
-
229
- - 9fb0d4b: Fix stale npx cache — use `discord-ops@latest` in MCP config
230
-
231
- Without `@latest`, npx may serve a cached older version indefinitely, causing MCP clients to run stale code even after new releases are published. All MCP config examples in the README updated to use `discord-ops@latest`.
232
-
233
209
  ## 0.14.1
234
210
 
235
211
  ### Patch Changes
@@ -286,75 +262,6 @@
286
262
 
287
263
  When `channel_id` was passed directly to `resolveTarget`, the returned `ResolvedTarget` was missing the `token` field even if a `project` was specified. This caused direct-channel-ID calls in multi-bot setups to fall back to the default bot token instead of the project-specific one.
288
264
 
289
- ## 0.13.0
290
-
291
- ### Minor Changes
292
-
293
- - 4928e5e: Auto-embed for send_message and health endpoint version field
294
- - **Auto-embed for `send_message`**: Messages are now automatically wrapped in a polished embed (color bar, description, timestamp) via the new `simple` template. Set `raw: true` to send plain text. Every message looks professional by default.
295
- - **`simple` template**: New minimal utility template — just a branded embed with optional title, color, author, and footer. Used automatically by `send_message`, also available via `send_template`.
296
- - **Health endpoint `version` field**: `GET /health` now includes the `discord-ops` package version for deployment verification.
297
-
298
- - 4928e5e: feat: add position parameter to edit_channel
299
-
300
- `edit_channel` now accepts an optional `position` integer (0-indexed) to reorder channels and categories within a guild. This enables programmatic channel ordering without needing separate Discord admin UI access.
301
-
302
- - 4928e5e: Live channel name resolution — fuzzy.ts was dead code, now it works
303
- - **Channel fuzzy resolution**: The `channel` param now resolves in four layers — exact alias match, fuzzy alias match (e.g. `"build"` hits `"builds"`), then a live Discord API lookup that finds channels by their actual Discord name (e.g. `channel: "general"` now works even with no configured alias).
304
- - **Fuzzy alias matching**: Configured channel aliases are now fuzzy-matched before falling back to Discord, so near-misses on alias names resolve correctly.
305
- - **`list_templates` fix**: Internal `simple` template (used for auto-embed) no longer appears in `list_templates` output — count now correctly shows 23.
306
-
307
- - 4928e5e: New send_embed tool with server-side OG metadata fetching
308
-
309
- ### Patch Changes
310
-
311
- - 4928e5e: fix: isConnected no longer throws in multi-bot setups
312
-
313
- `DiscordClient.isConnected` was calling `getConnection()` with no token, which throws when no default `DISCORD_TOKEN` is set. Any setup that uses only per-project `token_env` (the standard multi-bot pattern) would immediately crash with "No Discord token available" on the first `health_check` call — before per-project tokens were ever checked. `isConnected` now returns `false` instead of throwing when there is no default token.
314
-
315
- - 4928e5e: fix: resolver now includes bot token when channel_id is provided directly
316
-
317
- When `channel_id` was passed directly to `resolveTarget`, the returned `ResolvedTarget` was missing the `token` field even if a `project` was specified. This caused direct-channel-ID calls in multi-bot setups to fall back to the default bot token instead of the project-specific one.
318
-
319
- ## 0.12.0
320
-
321
- ### Minor Changes
322
-
323
- - e70b6ac: Auto-embed for send_message and health endpoint version field
324
- - **Auto-embed for `send_message`**: Messages are now automatically wrapped in a polished embed (color bar, description, timestamp) via the new `simple` template. Set `raw: true` to send plain text. Every message looks professional by default.
325
- - **`simple` template**: New minimal utility template — just a branded embed with optional title, color, author, and footer. Used automatically by `send_message`, also available via `send_template`.
326
- - **Health endpoint `version` field**: `GET /health` now includes the `discord-ops` package version for deployment verification.
327
-
328
- - e70b6ac: Live channel name resolution — fuzzy.ts was dead code, now it works
329
- - **Channel fuzzy resolution**: The `channel` param now resolves in four layers — exact alias match, fuzzy alias match (e.g. `"build"` hits `"builds"`), then a live Discord API lookup that finds channels by their actual Discord name (e.g. `channel: "general"` now works even with no configured alias).
330
- - **Fuzzy alias matching**: Configured channel aliases are now fuzzy-matched before falling back to Discord, so near-misses on alias names resolve correctly.
331
- - **`list_templates` fix**: Internal `simple` template (used for auto-embed) no longer appears in `list_templates` output — count now correctly shows 23.
332
-
333
- - e70b6ac: New send_embed tool with server-side OG metadata fetching
334
-
335
- ## 0.11.0
336
-
337
- ### Minor Changes
338
-
339
- - c53ebcd: Auto-embed for send_message and health endpoint version field
340
- - **Auto-embed for `send_message`**: Messages are now automatically wrapped in a polished embed (color bar, description, timestamp) via the new `simple` template. Set `raw: true` to send plain text. Every message looks professional by default.
341
- - **`simple` template**: New minimal utility template — just a branded embed with optional title, color, author, and footer. Used automatically by `send_message`, also available via `send_template`.
342
- - **Health endpoint `version` field**: `GET /health` now includes the `discord-ops` package version for deployment verification.
343
-
344
- - c53ebcd: Live channel name resolution — fuzzy.ts was dead code, now it works
345
- - **Channel fuzzy resolution**: The `channel` param now resolves in four layers — exact alias match, fuzzy alias match (e.g. `"build"` hits `"builds"`), then a live Discord API lookup that finds channels by their actual Discord name (e.g. `channel: "general"` now works even with no configured alias).
346
- - **Fuzzy alias matching**: Configured channel aliases are now fuzzy-matched before falling back to Discord, so near-misses on alias names resolve correctly.
347
- - **`list_templates` fix**: Internal `simple` template (used for auto-embed) no longer appears in `list_templates` output — count now correctly shows 23.
348
-
349
- ## 0.10.0
350
-
351
- ### Minor Changes
352
-
353
- - 6c4ef2a: Auto-embed for send_message and health endpoint version field
354
- - **Auto-embed for `send_message`**: Messages are now automatically wrapped in a polished embed (color bar, description, timestamp) via the new `simple` template. Set `raw: true` to send plain text. Every message looks professional by default.
355
- - **`simple` template**: New minimal utility template — just a branded embed with optional title, color, author, and footer. Used automatically by `send_message`, also available via `send_template`.
356
- - **Health endpoint `version` field**: `GET /health` now includes the `discord-ops` package version for deployment verification.
357
-
358
265
  ## 0.9.0
359
266
 
360
267
  ### Minor Changes
package/README.md CHANGED
@@ -8,10 +8,11 @@ Agency-grade Discord MCP server with multi-guild project routing.
8
8
 
9
9
  ## Features
10
10
 
11
- - **46 MCP tools** — messaging, channels, moderation, roles, webhooks, audit log, threads, guilds, invites, permissions, search, 23 templates, OG embed unfurling, project introspection
11
+ - **49 MCP tools** — messaging, channels, moderation, roles, webhooks, audit log, threads, guilds, invites, permissions, search, 23 templates, OG embed unfurling, project introspection
12
12
  - **Multi-guild project routing** — `send_message({ project: "my-app", channel: "builds" })` instead of raw channel IDs
13
13
  - **Notification routing** — map notification types (`ci_build`, `deploy`, `error`) to channels per project
14
14
  - **Owner pings** — configure project owners so releases, errors, and alerts auto-mention the right people
15
+ - **Bot personas** — named bots with identity metadata, per-channel bot assignment, and per-bot tool profiles
15
16
  - **Multi-bot support** — manage multiple Discord bots from a single MCP server with per-project tokens
16
17
  - **Tool profiles** — load only the tools an agent needs; cut schema overhead by 85% with slim profiles
17
18
  - **Smart channel resolution** — channel params accept channel name or snowflake ID, with 4-layer fuzzy fallback
@@ -183,6 +184,56 @@ Projects can specify their own bot token via `token_env`:
183
184
 
184
185
  When all projects have `token_env`, the default `DISCORD_TOKEN` is optional. Each project connects with its own bot.
185
186
 
187
+ ### Bot personas
188
+
189
+ Give bots names, roles, and per-channel assignment. This is ideal when your Discord server runs multiple bots with distinct personas (e.g., a community helper vs. a tech ops bot).
190
+
191
+ ```json
192
+ {
193
+ "bots": {
194
+ "claire": {
195
+ "name": "Claire",
196
+ "role": "Community helper",
197
+ "description": "Handles support and community channels",
198
+ "token_env": "CLAIRE_TOKEN",
199
+ "default_profile": "messaging"
200
+ },
201
+ "courier": {
202
+ "name": "Clarity Courier",
203
+ "role": "Technical operations",
204
+ "token_env": "COURIER_TOKEN",
205
+ "default_profile": "full"
206
+ }
207
+ },
208
+ "projects": {
209
+ "clarity-house": {
210
+ "guild_id": "123456789012345678",
211
+ "bot": "courier",
212
+ "channels": {
213
+ "general": "111111111111111111",
214
+ "support": { "id": "222222222222222222", "bot": "claire" },
215
+ "dev-ops": "333333333333333333",
216
+ "ai-testing": { "id": "444444444444444444", "bot": "claire" }
217
+ },
218
+ "default_channel": "dev-ops",
219
+ "tool_profile": "full"
220
+ }
221
+ }
222
+ }
223
+ ```
224
+
225
+ **How it works:**
226
+
227
+ - **`bots`** — named bot definitions with identity metadata and `token_env`
228
+ - **`project.bot`** — default bot for the project (all channels use this bot unless overridden)
229
+ - **Channel `bot` override** — individual channels can use a different bot: `{ "id": "...", "bot": "claire" }`
230
+ - **`default_profile`** — per-bot tool profile (restricts which tools a bot can use at runtime)
231
+ - **Token resolution** — channel bot → project bot → project `token_env` → default `DISCORD_TOKEN`
232
+ - **Bot persona in routing** — resolved targets include `bot: { name, role }` metadata for agent context
233
+ - **Backwards compatible** — `bots` is optional; channels accept both `"ID"` and `{ "id": "ID", "bot": "name" }` formats
234
+
235
+ Use `list_bots` to see all configured bots, their project assignments, channel overrides, and connection status.
236
+
186
237
  ### Owner pings
187
238
 
188
239
  Configure project owners so that releases, errors, and alerts automatically prepend `@mentions`. This ensures the right people are always paged for critical events without hardcoding mentions in every message.
@@ -279,7 +330,7 @@ Useful for sharing GitHub PRs, npm releases, blog posts, or any URL with rich pr
279
330
 
280
331
  ## Tools
281
332
 
282
- ### Messaging (11 tools)
333
+ ### Messaging (12 tools)
283
334
 
284
335
  | Tool | Description |
285
336
  | ----------------- | ----------------------------------------------------------- |
@@ -294,8 +345,9 @@ Useful for sharing GitHub PRs, npm releases, blog posts, or any URL with rich pr
294
345
  | `search_messages` | Search messages by content, author, or date range |
295
346
  | `send_template` | Send a styled embed using a built-in template |
296
347
  | `list_templates` | List available templates with required variables |
348
+ | `notify_owners` | Ping project owners based on notification type |
297
349
 
298
- ### Channels (8 tools)
350
+ ### Channels (9 tools)
299
351
 
300
352
  | Tool | Description |
301
353
  | ----------------- | ----------------------------------------------------------------------------- |
@@ -306,6 +358,7 @@ Useful for sharing GitHub PRs, npm releases, blog posts, or any URL with rich pr
306
358
  | `delete_channel` | Delete a channel |
307
359
  | `purge_messages` | Bulk-delete messages (max 100, < 14 days old) |
308
360
  | `set_slowmode` | Set or disable slowmode |
361
+ | `move_channel` | Move a channel to a different category or position |
309
362
  | `set_permissions` | Set channel permission overrides for a role or member |
310
363
 
311
364
  ### Moderation (4 tools)
@@ -363,12 +416,13 @@ Useful for sharing GitHub PRs, npm releases, blog posts, or any URL with rich pr
363
416
  | `list_threads` | List active threads |
364
417
  | `archive_thread` | Archive (and optionally lock) a thread |
365
418
 
366
- ### System (2 tools)
419
+ ### System (3 tools)
367
420
 
368
- | Tool | Description |
369
- | --------------- | ------------------------------------------------------------------- |
370
- | `health_check` | Bot status, version, connected guilds, and permission audit |
371
- | `list_projects` | List all projects with guild mappings, token status, and validation |
421
+ | Tool | Description |
422
+ | --------------- | -------------------------------------------------------------------- |
423
+ | `health_check` | Bot status, version, connected guilds, and permission audit |
424
+ | `list_projects` | List all projects with guild mappings, token status, and validation |
425
+ | `list_bots` | List all bot personas with project assignments and channel overrides |
372
426
 
373
427
  ## Tool Profiles
374
428
 
@@ -376,12 +430,15 @@ Load only the tools an agent needs. Reduces schema token overhead by up to 85% f
376
430
 
377
431
  ### Built-in profiles
378
432
 
379
- | Profile | Tools | Description |
380
- | ------------ | ----- | -------------------------------------------------------------------------------------------------- |
381
- | `monitoring` | 6 | health_check, list_guilds, get_guild, get_messages, list_channels, list_members |
382
- | `readonly` | 6 | get_messages, get_channel, get_guild, get_member, list_roles, search_messages |
383
- | `moderation` | 7 | kick_member, ban_member, unban_member, timeout_member, purge_messages, get_member, query_audit_log |
384
- | `full` | 46 | All tools (default) |
433
+ | Profile | Tools | Description |
434
+ | ------------ | ----- | ------------------------------------------------------------------------------------------------------ |
435
+ | `full` | 49 | All tools (default) |
436
+ | `monitoring` | 7 | get_messages, send_message, add_reaction, create_thread, health_check, list_projects, list_bots |
437
+ | `readonly` | 7 | get_messages, list_channels, list_members, get_guild, health_check, list_projects, list_bots |
438
+ | `moderation` | 7 | get_messages, kick_member, ban_member, timeout_member, delete_message, purge_messages, query_audit_log |
439
+ | `messaging` | 5 | add_reaction, delete_message, edit_message, get_messages, send_message |
440
+ | `channels` | 7 | create_channel, delete_channel, edit_channel, get_channel, list_channels, purge_messages, set_slowmode |
441
+ | `webhooks` | 6 | create_webhook, delete_webhook, edit_webhook, execute_webhook, get_webhook, list_webhooks |
385
442
 
386
443
  ### Using profiles
387
444
 
@@ -479,10 +536,12 @@ Any tool name accepted by the MCP server works here — `send_message`, `send_te
479
536
 
480
537
  ### Token resolution
481
538
 
482
- 1. If `DISCORD_OPS_TOKEN_ENV` is set, its value names the env var holding the default token (e.g., `DISCORD_OPS_TOKEN_ENV=MY_BOT_TOKEN` reads `MY_BOT_TOKEN`).
483
- 2. Otherwise, the default token comes from `DISCORD_TOKEN`.
484
- 3. Per-project tokens override the default: if a project config has `"token_env": "ORG_A_TOKEN"`, that project's bot uses `ORG_A_TOKEN`.
485
- 4. If all projects have `token_env` set with valid values, no default token is needed at all.
539
+ 1. **Channel-level bot** if the channel has a `bot` override, use that bot's `token_env`
540
+ 2. **Project-level bot** — if the project has a `bot`, use that bot's `token_env`
541
+ 3. **Project-level `token_env`** project's own token env var
542
+ 4. **Default token** `DISCORD_TOKEN` (or custom via `DISCORD_OPS_TOKEN_ENV`)
543
+
544
+ If `DISCORD_OPS_TOKEN_ENV` is set, its value names the env var holding the default token (e.g., `DISCORD_OPS_TOKEN_ENV=MY_BOT_TOKEN` reads `MY_BOT_TOKEN`). If all projects have `token_env` or `bot` set, no default token is needed.
486
545
 
487
546
  ## CI/CD Integration
488
547
 
@@ -715,22 +774,33 @@ Full `~/.discord-ops.json` schema with all options:
715
774
 
716
775
  ```json
717
776
  {
777
+ "bots": {
778
+ "my-bot": {
779
+ "name": "My Bot",
780
+ "role": "General purpose",
781
+ "description": "Handles all operations",
782
+ "token_env": "MY_BOT_TOKEN",
783
+ "default_profile": "full"
784
+ }
785
+ },
718
786
  "projects": {
719
787
  "my-app": {
720
788
  "guild_id": "123456789012345678",
721
789
  "token_env": "MY_APP_DISCORD_TOKEN",
790
+ "bot": "my-bot",
722
791
  "channels": {
723
792
  "dev": "CHANNEL_ID",
724
793
  "builds": "CHANNEL_ID",
725
794
  "releases": "CHANNEL_ID",
726
- "alerts": "CHANNEL_ID"
795
+ "alerts": "CHANNEL_ID",
796
+ "support": { "id": "CHANNEL_ID", "bot": "my-bot" }
727
797
  },
728
798
  "default_channel": "dev",
729
799
  "owners": ["USER_SNOWFLAKE_ID"],
730
800
  "notify_owners_on": ["release", "error", "alert"],
731
801
  "tool_profile": "full",
732
- "tool_profile_add": [],
733
- "tool_profile_remove": [],
802
+ "profile_add": [],
803
+ "profile_remove": [],
734
804
  "notification_routing": {
735
805
  "ci_build": "builds",
736
806
  "deploy": "builds",
@@ -750,18 +820,31 @@ Full `~/.discord-ops.json` schema with all options:
750
820
  }
751
821
  ```
752
822
 
753
- | Field | Description |
754
- | ---------------------- | ----------------------------------------------------------------- |
755
- | `guild_id` | Discord server (guild) snowflake ID |
756
- | `token_env` | Env var name for this project's bot token |
757
- | `channels` | Alias channel ID map; `channel: "builds"` resolves here first |
758
- | `default_channel` | Channel used when no `channel` param is provided |
759
- | `owners` | User snowflake IDs to mention on matching notification types |
760
- | `notify_owners_on` | Notification types that trigger owner pings (`"dev"` never pings) |
761
- | `tool_profile` | Base tool profile for this project (`full`, `monitoring`, etc.) |
762
- | `tool_profile_add` | Additional tools to load on top of the base profile |
763
- | `tool_profile_remove` | Tools to exclude from the base profile |
764
- | `notification_routing` | Per-project override of global notification → channel routing |
823
+ **Global fields:**
824
+
825
+ | Field | Description |
826
+ | ---------------------- | ------------------------------------------------------------------------------------- |
827
+ | `bots` | Named bot personas with `name`, `role`, `description`, `token_env`, `default_profile` |
828
+ | `default_project` | Project used when no `project` param is provided |
829
+ | `notification_routing` | Global notification type channel alias routing |
830
+
831
+ **Project fields:**
832
+
833
+ | Field | Description |
834
+ | ---------------------- | ------------------------------------------------------------------------------------- |
835
+ | `guild_id` | Discord server (guild) snowflake ID |
836
+ | `token_env` | Env var name for this project's bot token |
837
+ | `bot` | Default bot persona for this project (references a key in `bots`) |
838
+ | `channels` | Alias → channel ID or `{ id, bot }` map; `channel: "builds"` resolves here first |
839
+ | `default_channel` | Channel used when no `channel` param is provided |
840
+ | `owners` | User snowflake IDs to mention on matching notification types |
841
+ | `notify_owners_on` | Notification types that trigger owner pings (`"dev"` never pings) |
842
+ | `tool_profile` | Base tool profile for this project (`full`, `monitoring`, etc.) — enforced at runtime |
843
+ | `profile_add` | Additional tools to load on top of the base profile |
844
+ | `profile_remove` | Tools to exclude from the base profile |
845
+ | `notification_routing` | Per-project override of global notification → channel routing |
846
+
847
+ Per-project profiles are enforced at runtime — all tools stay registered on the MCP server, but tool calls are filtered when the resolved project or bot has a profile set. This means agents can discover all tools via MCP schema, but per-project restrictions are applied on each call.
765
848
 
766
849
  ## Multi-Organization Troubleshooting
767
850
 
@@ -770,6 +853,9 @@ Full `~/.discord-ops.json` schema with all options:
770
853
  Run `discord-ops validate` to check your config without connecting to Discord. It detects:
771
854
 
772
855
  - Missing `token_env` values (env var not set)
856
+ - Bot references (`project.bot`, channel `bot`) pointing to undefined bots
857
+ - Invalid `default_profile` or `tool_profile` values
858
+ - Missing bot `token_env` environment variables
773
859
  - Duplicate guild IDs across projects with different tokens
774
860
  - `default_channel` referencing a nonexistent alias
775
861
  - `default_project` pointing to a nonexistent project
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAYA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAmBA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/cli/index.js CHANGED
@@ -5,8 +5,14 @@ import { createServer } from "../server.js";
5
5
  import { startStdioTransport } from "../transport/stdio.js";
6
6
  import { startHttpTransport } from "../transport/http.js";
7
7
  import { logger, setLogLevel } from "../utils/logger.js";
8
+ import { createRequire } from "node:module";
8
9
  import { runInit } from "./init.js";
10
+ import { runSetup } from "./setup.js";
11
+ import { runTool } from "./run.js";
12
+ import { runValidate } from "./validate.js";
9
13
  import { validateFlags } from "./validate-flags.js";
14
+ const require = createRequire(import.meta.url);
15
+ const pkg = require("../../package.json");
10
16
  export { validateFlags } from "./validate-flags.js";
11
17
  async function main() {
12
18
  const args = process.argv.slice(2);
@@ -19,7 +25,7 @@ async function main() {
19
25
  }
20
26
  // Handle --version
21
27
  if (args.includes("--version") || args.includes("-v")) {
22
- console.log("discord-ops 0.21.0");
28
+ console.log(`discord-ops ${pkg.version}`);
23
29
  process.exit(0);
24
30
  }
25
31
  // Handle init subcommand (does not require DISCORD_TOKEN)
@@ -32,6 +38,28 @@ async function main() {
32
38
  await runHealthCheck();
33
39
  return;
34
40
  }
41
+ // Handle setup subcommand (interactive wizard)
42
+ if (args[0] === "setup") {
43
+ await runSetup();
44
+ return;
45
+ }
46
+ // Handle run subcommand (execute a single tool)
47
+ if (args[0] === "run") {
48
+ const toolName = args[1];
49
+ if (!toolName) {
50
+ console.error("Usage: discord-ops run <tool-name> --args '<json>'");
51
+ process.exit(1);
52
+ }
53
+ const argsIndex = args.indexOf("--args");
54
+ const rawArgs = argsIndex !== -1 ? args[argsIndex + 1] : "{}";
55
+ await runTool(toolName, rawArgs);
56
+ return;
57
+ }
58
+ // Handle validate subcommand (validate config)
59
+ if (args[0] === "validate") {
60
+ await runValidate();
61
+ return;
62
+ }
35
63
  // Configure log level
36
64
  const logLevel = process.env.DISCORD_OPS_LOG_LEVEL;
37
65
  if (logLevel)
@@ -130,6 +158,9 @@ USAGE:
130
158
  discord-ops serve Start MCP server (HTTP/SSE transport)
131
159
  discord-ops health Run health check + permission audit
132
160
  discord-ops init Scaffold a per-project .discord-ops.json
161
+ discord-ops setup Interactive setup wizard for config
162
+ discord-ops run <tool> Run a single tool from the CLI
163
+ discord-ops validate Validate configuration files
133
164
  discord-ops --help Show this help
134
165
  discord-ops --version Show version
135
166
 
@@ -137,6 +168,10 @@ OPTIONS:
137
168
  --port <port> HTTP port for serve mode (default: 3000)
138
169
  --allowed-origin <origin> Allowed CORS origin (default: http://localhost)
139
170
  --allow-unauthenticated Allow serve mode without DISCORD_OPS_HTTP_TOKEN (insecure)
171
+ --args <json> JSON arguments for the run subcommand
172
+ --profile <name> Tool profile: full, monitoring, readonly, moderation
173
+ --tools <list> Comma-separated list of tools to enable
174
+ --dry-run Preview actions without executing
140
175
 
141
176
  INIT FLAGS:
142
177
  --project <name> Project name (required)
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate-flags.d.ts","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,eAAO,MAAM,WAAW,aAYtB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CASlD"}
1
+ {"version":3,"file":"validate-flags.d.ts","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,eAAO,MAAM,WAAW,aAiBtB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CASlD"}
@@ -4,6 +4,11 @@ export const KNOWN_FLAGS = new Set([
4
4
  "--version",
5
5
  "--port",
6
6
  "--allowed-origin",
7
+ "--allow-unauthenticated",
8
+ "--profile",
9
+ "--tools",
10
+ "--dry-run",
11
+ "--args",
7
12
  // init subcommand flags
8
13
  "--project",
9
14
  "--guild-id",
@@ -1 +1 @@
1
- {"version":3,"file":"validate-flags.js","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,kBAAkB;IAClB,wBAAwB;IACxB,WAAW;IACX,YAAY;IACZ,aAAa;IACb,WAAW;IACX,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QACxB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validate-flags.js","sourceRoot":"","sources":["../../src/cli/validate-flags.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,QAAQ;IACR,WAAW;IACX,QAAQ;IACR,kBAAkB;IAClB,yBAAyB;IACzB,WAAW;IACX,SAAS;IACT,WAAW;IACX,QAAQ;IACR,wBAAwB;IACxB,WAAW;IACX,YAAY;IACZ,aAAa;IACb,WAAW;IACX,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI;YAAE,MAAM;QACxB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Validates the discord-ops configuration files.
3
+ * Loads global and per-project configs and reports any issues.
4
+ */
5
+ export declare function runValidate(): Promise<void>;
6
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/cli/validate.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyFjD"}