discord-ops 0.14.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # discord-ops
2
2
 
3
+ ## 0.14.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 9fb0d4b: Fix stale npx cache — use `discord-ops@latest` in MCP config
8
+
9
+ 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`.
10
+
11
+ ## 0.14.1
12
+
13
+ ### Patch Changes
14
+
15
+ - a17e500: Comprehensive README documentation update
16
+ - Document `send_embed` tool (OG metadata unfurling with field overrides)
17
+ - Document auto-embed behavior for `send_message` and `raw: true` opt-out
18
+ - Document tool profiles (`--profile`, `--tools`, built-in profiles, per-project config)
19
+ - Document owner pings (`owners`, `notify_owners_on`, safety behavior for "dev")
20
+ - Document smart channel resolution (4-layer: alias → fuzzy → Discord API → error)
21
+ - Document HTTP transport authentication (`DISCORD_OPS_HTTP_TOKEN`)
22
+ - Document `edit_channel` support for categories and voice channels, `position` field
23
+ - Document ISO 8601 timestamp support for `get_messages`
24
+ - Add full advanced config reference table with all `~/.discord-ops.json` fields
25
+ - Add `send_embed` to messaging tools table (fixing count to correctly show 46 tools)
26
+ - Add on-call handoff template example
27
+ - Add "Channel not found" troubleshooting entry
28
+
3
29
  ## 0.14.0
4
30
 
5
31
  ### Minor Changes
package/README.md CHANGED
@@ -8,13 +8,19 @@ 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, project introspection
11
+ - **46 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
- - **Notification routing** — map notification types (ci_build, deploy, error) to channels per project
13
+ - **Notification routing** — map notification types (`ci_build`, `deploy`, `error`) to channels per project
14
+ - **Owner pings** — configure project owners so releases, errors, and alerts auto-mention the right people
14
15
  - **Multi-bot support** — manage multiple Discord bots from a single MCP server with per-project tokens
15
- - **Flexible token configuration** — configurable default token env var, optional default token when all projects use per-project tokens
16
+ - **Tool profiles** — load only the tools an agent needs; cut schema overhead by 85% with slim profiles
17
+ - **Smart channel resolution** — channel params accept channel name or snowflake ID, with 4-layer fuzzy fallback
18
+ - **Auto-embed for send_message** — every message gets a branded embed by default; `raw: true` for plain text
19
+ - **OG metadata unfurling** — `send_embed` fetches Open Graph metadata server-side and renders rich link previews
20
+ - **Flexible token configuration** — configurable default token env var, optional default when all projects use per-project tokens
16
21
  - **Config validation** — `discord-ops validate` detects duplicate guilds, missing tokens, invalid channel refs without connecting to Discord
17
22
  - **HTTP/SSE + stdio transports** — stdio for Claude Code, HTTP/SSE for remote MCP clients
23
+ - **HTTP transport auth** — bearer token auth via `DISCORD_OPS_HTTP_TOKEN` with constant-time comparison
18
24
  - **Dry-run mode** — simulate destructive operations without calling Discord API
19
25
  - **Interactive setup wizard** — `discord-ops setup` supports single-bot and multi-bot configuration
20
26
  - **Security hardening** — rate limiting, permission pre-flight checks, snowflake ID validation, self-protection guards
@@ -22,7 +28,6 @@ Agency-grade Discord MCP server with multi-guild project routing.
22
28
  - **Zod validation** — all inputs validated before execution
23
29
  - **Error sanitization** — tokens, webhook URLs, and snowflake IDs stripped from error output
24
30
  - **Audit logging** — every tool call logged to stderr
25
- - **Fuzzy name resolution** — find channels/roles/members by name, normalized name, or substring
26
31
 
27
32
  ## Quick Start
28
33
 
@@ -46,14 +51,14 @@ discord-ops serve --port 3000
46
51
 
47
52
  ## Claude Code Integration
48
53
 
49
- Add to your project's `.mcp.json`. Use `npx` without a version pin so every session automatically uses the latest published release:
54
+ Add to your project's `.mcp.json`. Use `npx` with `@latest` so every session automatically uses the latest published release — without it, npx may serve a stale cached version indefinitely:
50
55
 
51
56
  ```json
52
57
  {
53
58
  "mcpServers": {
54
59
  "discord-ops": {
55
60
  "command": "npx",
56
- "args": ["-y", "discord-ops"],
61
+ "args": ["-y", "discord-ops@latest"],
57
62
  "env": {
58
63
  "DISCORD_TOKEN": "${DISCORD_TOKEN}"
59
64
  }
@@ -73,7 +78,7 @@ When each project has its own bot, pass all token env vars and let `~/.discord-o
73
78
  "mcpServers": {
74
79
  "discord-ops": {
75
80
  "command": "npx",
76
- "args": ["-y", "discord-ops"],
81
+ "args": ["-y", "discord-ops@latest"],
77
82
  "env": {
78
83
  "ORG_A_DISCORD_TOKEN": "${ORG_A_DISCORD_TOKEN}",
79
84
  "ORG_B_DISCORD_TOKEN": "${ORG_B_DISCORD_TOKEN}"
@@ -94,7 +99,7 @@ If all your projects share one bot, just pass that token:
94
99
  "mcpServers": {
95
100
  "discord-ops": {
96
101
  "command": "npx",
97
- "args": ["-y", "discord-ops"],
102
+ "args": ["-y", "discord-ops@latest"],
98
103
  "env": {
99
104
  "DISCORD_TOKEN": "${DISCORD_TOKEN}"
100
105
  }
@@ -112,7 +117,7 @@ If another tool already claims `DISCORD_TOKEN`, use `DISCORD_OPS_TOKEN_ENV` to p
112
117
  "mcpServers": {
113
118
  "discord-ops": {
114
119
  "command": "npx",
115
- "args": ["-y", "discord-ops"],
120
+ "args": ["-y", "discord-ops@latest"],
116
121
  "env": {
117
122
  "DISCORD_OPS_TOKEN_ENV": "MY_BOT_TOKEN",
118
123
  "MY_BOT_TOKEN": "${MY_BOT_TOKEN}"
@@ -136,7 +141,8 @@ The killer feature: route messages by project name and channel alias instead of
136
141
  "channels": {
137
142
  "dev": "CHANNEL_ID",
138
143
  "builds": "CHANNEL_ID",
139
- "alerts": "CHANNEL_ID"
144
+ "alerts": "CHANNEL_ID",
145
+ "releases": "CHANNEL_ID"
140
146
  },
141
147
  "default_channel": "dev"
142
148
  }
@@ -144,6 +150,8 @@ The killer feature: route messages by project name and channel alias instead of
144
150
  "default_project": "my-app",
145
151
  "notification_routing": {
146
152
  "ci_build": "builds",
153
+ "deploy": "builds",
154
+ "release": "releases",
147
155
  "error": "alerts",
148
156
  "dev": "dev"
149
157
  }
@@ -175,6 +183,40 @@ Projects can specify their own bot token via `token_env`:
175
183
 
176
184
  When all projects have `token_env`, the default `DISCORD_TOKEN` is optional. Each project connects with its own bot.
177
185
 
186
+ ### Owner pings
187
+
188
+ 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.
189
+
190
+ ```json
191
+ {
192
+ "projects": {
193
+ "my-app": {
194
+ "guild_id": "123456789012345678",
195
+ "channels": { "releases": "CHANNEL_ID", "alerts": "CHANNEL_ID" },
196
+ "owners": ["820027414902079548"],
197
+ "notify_owners_on": ["release", "error", "alert"]
198
+ }
199
+ }
200
+ }
201
+ ```
202
+
203
+ **`notify_owners_on` values:** any notification type (`release`, `error`, `alert`, `ci_build`, `deploy`, etc.)
204
+
205
+ **Safety:** `"dev"` is hardcoded to never trigger owner pings regardless of config — dev noise stays quiet.
206
+
207
+ When a `send_message` or `send_embed` call uses a matching `notification_type`, the owner mentions are automatically prepended to the message. No other changes needed.
208
+
209
+ ### Smart channel resolution
210
+
211
+ The `channel` param accepts a channel name or snowflake ID anywhere a channel is needed. Resolution happens in four layers:
212
+
213
+ 1. **Exact alias match** — `"builds"` hits the `builds` alias in your project config
214
+ 2. **Fuzzy alias match** — `"build"` or `"blds"` resolves to the closest alias
215
+ 3. **Live Discord API lookup** — `"general"` resolves even with no configured alias
216
+ 4. **Error** — if none of the above find a match
217
+
218
+ This means you can pass `channel: "general"` and it will work even for channels that aren't in your config. You can also pass a raw snowflake ID directly — `channel: "1234567890"` bypasses alias resolution entirely.
219
+
178
220
  ### Per-project config (`.discord-ops.json` in repo root)
179
221
 
180
222
  ```json
@@ -193,42 +235,78 @@ When all projects have `token_env`, the default `DISCORD_TOKEN` is optional. Eac
193
235
  # By project + channel alias
194
236
  send_message({ project: "my-app", channel: "builds", content: "Build passed!" })
195
237
 
196
- # By notification type (auto-routed)
197
- send_message({ notification_type: "ci_build", content: "CI green" })
238
+ # By notification type (auto-routed to channel, owner pinged if configured)
239
+ send_message({ project: "my-app", notification_type: "release", content: "v1.0.0 shipped" })
198
240
 
199
241
  # Direct channel ID (always works)
200
242
  send_message({ channel_id: "123456789", content: "Hello" })
243
+
244
+ # Channel by name (live lookup — no alias needed)
245
+ send_message({ project: "my-app", channel: "general", content: "Hello" })
246
+ ```
247
+
248
+ ## Messaging
249
+
250
+ ### Auto-embed
251
+
252
+ `send_message` automatically wraps messages in a polished embed with a color bar, description, and timestamp. Pass `raw: true` to send plain text instead.
253
+
254
+ ```
255
+ # Branded embed (default)
256
+ send_message({ project: "my-app", channel: "dev", content: "Deploy complete" })
257
+
258
+ # Plain text
259
+ send_message({ project: "my-app", channel: "dev", content: "pong", raw: true })
260
+ ```
261
+
262
+ ### send_embed — OG metadata unfurling
263
+
264
+ `send_embed` fetches Open Graph metadata server-side from any URL and renders a rich preview embed. All OG fields can be overridden.
265
+
266
+ ```
267
+ send_embed({
268
+ url: "https://www.npmjs.com/package/discord-ops/v/0.14.0",
269
+ project: "my-app",
270
+ channel: "releases",
271
+ title: "discord-ops v0.14.0",
272
+ description: "Owner pings, smart channel resolution, category editing",
273
+ color: 5763719,
274
+ footer: "Released April 3, 2026"
275
+ })
201
276
  ```
202
277
 
278
+ Useful for sharing GitHub PRs, npm releases, blog posts, or any URL with rich previews — the bot fetches the metadata so Discord's CDN doesn't cache-bust client-side unfurls.
279
+
203
280
  ## Tools
204
281
 
205
- ### Messaging (10 tools)
206
-
207
- | Tool | Description |
208
- | ----------------- | ------------------------------------------------- |
209
- | `send_message` | Send a message with project routing |
210
- | `get_messages` | Fetch recent messages |
211
- | `edit_message` | Edit a bot message |
212
- | `delete_message` | Delete a message |
213
- | `add_reaction` | React to a message |
214
- | `pin_message` | Pin a message in a channel |
215
- | `unpin_message` | Unpin a message |
216
- | `search_messages` | Search messages by content, author, or date range |
217
- | `send_template` | Send a styled embed using a built-in template |
218
- | `list_templates` | List available templates with required variables |
282
+ ### Messaging (11 tools)
283
+
284
+ | Tool | Description |
285
+ | ----------------- | ----------------------------------------------------------- |
286
+ | `send_message` | Send a message with project routing (auto-embed by default) |
287
+ | `send_embed` | Fetch OG metadata from a URL and post a rich embed |
288
+ | `get_messages` | Fetch recent messages (supports ISO 8601 timestamps) |
289
+ | `edit_message` | Edit a bot message |
290
+ | `delete_message` | Delete a message |
291
+ | `add_reaction` | React to a message |
292
+ | `pin_message` | Pin a message in a channel |
293
+ | `unpin_message` | Unpin a message |
294
+ | `search_messages` | Search messages by content, author, or date range |
295
+ | `send_template` | Send a styled embed using a built-in template |
296
+ | `list_templates` | List available templates with required variables |
219
297
 
220
298
  ### Channels (8 tools)
221
299
 
222
- | Tool | Description |
223
- | ----------------- | ----------------------------------------------------- |
224
- | `list_channels` | List guild channels |
225
- | `get_channel` | Get channel details |
226
- | `create_channel` | Create a channel |
227
- | `edit_channel` | Edit channel properties |
228
- | `delete_channel` | Delete a channel |
229
- | `purge_messages` | Bulk-delete messages (max 100, < 14 days old) |
230
- | `set_slowmode` | Set or disable slowmode |
231
- | `set_permissions` | Set channel permission overrides for a role or member |
300
+ | Tool | Description |
301
+ | ----------------- | ----------------------------------------------------------------------------- |
302
+ | `list_channels` | List guild channels |
303
+ | `get_channel` | Get channel details |
304
+ | `create_channel` | Create a channel |
305
+ | `edit_channel` | Edit channel name, topic, category, or position (text, voice, and categories) |
306
+ | `delete_channel` | Delete a channel |
307
+ | `purge_messages` | Bulk-delete messages (max 100, < 14 days old) |
308
+ | `set_slowmode` | Set or disable slowmode |
309
+ | `set_permissions` | Set channel permission overrides for a role or member |
232
310
 
233
311
  ### Moderation (4 tools)
234
312
 
@@ -289,9 +367,57 @@ send_message({ channel_id: "123456789", content: "Hello" })
289
367
 
290
368
  | Tool | Description |
291
369
  | --------------- | ------------------------------------------------------------------- |
292
- | `health_check` | Bot status + permissions |
370
+ | `health_check` | Bot status, version, connected guilds, and permission audit |
293
371
  | `list_projects` | List all projects with guild mappings, token status, and validation |
294
372
 
373
+ ## Tool Profiles
374
+
375
+ Load only the tools an agent needs. Reduces schema token overhead by up to 85% for narrow use cases.
376
+
377
+ ### Built-in profiles
378
+
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) |
385
+
386
+ ### Using profiles
387
+
388
+ ```bash
389
+ # Via CLI flag
390
+ discord-ops --profile monitoring
391
+
392
+ # Load specific tools
393
+ discord-ops --tools "send_message,send_template,health_check"
394
+
395
+ # Combined (profile as base + add tools)
396
+ discord-ops --profile readonly --tools "send_message"
397
+ ```
398
+
399
+ ### Per-project profile config
400
+
401
+ Profiles can be set per project in `~/.discord-ops.json` so each agent gets only what it needs:
402
+
403
+ ```json
404
+ {
405
+ "projects": {
406
+ "my-app": {
407
+ "guild_id": "123456789012345678",
408
+ "channels": { "dev": "CHANNEL_ID", "alerts": "CHANNEL_ID" },
409
+ "tool_profile": "monitoring",
410
+ "tool_profile_add": ["send_message"],
411
+ "tool_profile_remove": ["list_members"]
412
+ }
413
+ }
414
+ }
415
+ ```
416
+
417
+ - **`tool_profile`** — base profile to use for this project
418
+ - **`tool_profile_add`** — add tools not included in the base profile
419
+ - **`tool_profile_remove`** — remove tools from the base profile
420
+
295
421
  ## CLI
296
422
 
297
423
  ```
@@ -300,6 +426,8 @@ discord-ops serve Start MCP server (HTTP/SSE transport)
300
426
  discord-ops setup Interactive setup wizard (single + multi-bot)
301
427
  discord-ops health Run health check + permission audit
302
428
  discord-ops validate Validate config without connecting to Discord
429
+ discord-ops --profile Load a built-in tool profile (monitoring/readonly/moderation/full)
430
+ discord-ops --tools Load specific tools by name (comma-separated)
303
431
  discord-ops --dry-run Simulate destructive operations
304
432
  discord-ops --help Show help
305
433
  discord-ops --version Show version
@@ -307,15 +435,16 @@ discord-ops --version Show version
307
435
 
308
436
  ## Environment Variables
309
437
 
310
- | Variable | Required | Description |
311
- | ----------------------- | -------- | --------------------------------------------------------------------------- |
312
- | `DISCORD_TOKEN` | No\* | Default Discord bot token (\*required unless all projects have `token_env`) |
313
- | `DISCORD_OPS_TOKEN_ENV` | No | Override which env var holds the default token (default: `DISCORD_TOKEN`) |
314
- | `<PROJECT>_TOKEN` | No | Per-project bot tokens (configured via `token_env` in project config) |
315
- | `DISCORD_OPS_CONFIG` | No | Path to global config file (default: `~/.discord-ops.json`) |
316
- | `DISCORD_OPS_LOG_LEVEL` | No | `debug`, `info`, `warn`, `error` (default: `info`) |
317
- | `DISCORD_OPS_DRY_RUN` | No | Enable dry-run mode (any truthy value) |
318
- | `DRY_RUN` | No | Enable dry-run mode (any truthy value, alias) |
438
+ | Variable | Required | Description |
439
+ | ------------------------ | -------- | --------------------------------------------------------------------------- |
440
+ | `DISCORD_TOKEN` | No\* | Default Discord bot token (\*required unless all projects have `token_env`) |
441
+ | `DISCORD_OPS_TOKEN_ENV` | No | Override which env var holds the default token (default: `DISCORD_TOKEN`) |
442
+ | `<PROJECT>_TOKEN` | No | Per-project bot tokens (configured via `token_env` in project config) |
443
+ | `DISCORD_OPS_CONFIG` | No | Path to global config file (default: `~/.discord-ops.json`) |
444
+ | `DISCORD_OPS_LOG_LEVEL` | No | `debug`, `info`, `warn`, `error` (default: `info`) |
445
+ | `DISCORD_OPS_DRY_RUN` | No | Enable dry-run mode (any truthy value) |
446
+ | `DRY_RUN` | No | Enable dry-run mode (any truthy value, alias) |
447
+ | `DISCORD_OPS_HTTP_TOKEN` | No | Bearer token for HTTP transport authentication (strongly recommended) |
319
448
 
320
449
  ### Token resolution
321
450
 
@@ -324,6 +453,24 @@ discord-ops --version Show version
324
453
  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`.
325
454
  4. If all projects have `token_env` set with valid values, no default token is needed at all.
326
455
 
456
+ ## HTTP Transport Security
457
+
458
+ When running `discord-ops serve`, the HTTP endpoint is unauthenticated by default with a loud startup warning. Set `DISCORD_OPS_HTTP_TOKEN` to require bearer auth:
459
+
460
+ ```bash
461
+ DISCORD_OPS_HTTP_TOKEN=your-secret-token discord-ops serve --port 3000
462
+ ```
463
+
464
+ All requests must include:
465
+
466
+ ```
467
+ Authorization: Bearer your-secret-token
468
+ ```
469
+
470
+ The health endpoint (`GET /health`) is always exempt from auth — load balancers and Docker healthchecks can reach it without a token.
471
+
472
+ Token comparison uses constant-time comparison to prevent timing attacks.
473
+
327
474
  ## Dry-Run Mode
328
475
 
329
476
  Enable dry-run to simulate destructive operations (delete, ban, kick, etc.) without actually calling the Discord API:
@@ -357,7 +504,7 @@ In dry-run mode, destructive tools return a simulated success response showing w
357
504
  - **Syntax-highlighted code** — code examples with language-specific highlighting
358
505
  - **Progress bars** — visual Unicode block progress indicators
359
506
 
360
- ### DevOps Templates (10)
507
+ ### DevOps Templates (11)
361
508
 
362
509
  | Template | Description | Key Features |
363
510
  | ------------------- | ---------------------------------------------- | -------------------------------------------- |
@@ -390,27 +537,29 @@ In dry-run mode, destructive tools return a simulated success response showing w
390
537
  | `standup` | Daily standup summary | Yesterday/today/blockers sections |
391
538
  | `retro` | Sprint retrospective | Went-well/improve/actions, velocity |
392
539
 
393
- ### Example
540
+ ### Examples
541
+
542
+ **Release announcement:**
394
543
 
395
544
  ```
396
545
  send_template({
397
546
  template: "release",
398
547
  vars: {
399
- version: "0.7.0",
548
+ version: "v0.14.0",
400
549
  name: "discord-ops",
401
- notes: "Cutting-edge template system with native Discord features",
402
- highlights: "23 templates, native polls, link buttons, Discord timestamps",
403
- npm: "discord-ops@0.7.0",
404
- link: "https://github.com/bookedsolidtech/discord-ops/releases",
405
- author_name: "Clarity CI",
406
- author_icon: "https://example.com/logo.png"
550
+ highlights: " Owner pings\n• Smart channel resolution\n• Category channel editing",
551
+ npm: "npm install discord-ops@0.14.0",
552
+ npm_url: "https://www.npmjs.com/package/discord-ops/v/0.14.0",
553
+ link: "https://github.com/bookedsolidtech/discord-ops/pull/20",
554
+ footer: "Released April 3, 2026",
555
+ author_name: "Booked Solid Technology"
407
556
  },
408
557
  project: "my-app",
409
558
  channel: "releases"
410
559
  })
411
560
  ```
412
561
 
413
- ### Native Discord Poll
562
+ **Native Discord Poll:**
414
563
 
415
564
  ```
416
565
  send_template({
@@ -426,7 +575,7 @@ send_template({
426
575
  })
427
576
  ```
428
577
 
429
- ### Multi-Embed Dashboard
578
+ **Multi-Embed Status Dashboard:**
430
579
 
431
580
  ```
432
581
  send_template({
@@ -442,8 +591,81 @@ send_template({
442
591
  })
443
592
  ```
444
593
 
594
+ **On-call handoff:**
595
+
596
+ ```
597
+ send_template({
598
+ template: "oncall",
599
+ vars: {
600
+ outgoing: "alice",
601
+ incoming: "bob",
602
+ shift_start: "2026-04-04T09:00:00Z",
603
+ notes: "Payment service latency elevated — watch grafana/d/payments",
604
+ active_incidents: "INC-342: elevated error rate on /checkout",
605
+ runbook_url: "https://wiki.example.com/oncall",
606
+ mention: "<@BOB_USER_ID>"
607
+ },
608
+ project: "my-app",
609
+ channel: "team-chat"
610
+ })
611
+ ```
612
+
445
613
  All templates support project routing (`project`, `channel`, `notification_type`, `channel_id`) and author branding (`author_name`, `author_icon`).
446
614
 
615
+ ## Advanced Config Reference
616
+
617
+ Full `~/.discord-ops.json` schema with all options:
618
+
619
+ ```json
620
+ {
621
+ "projects": {
622
+ "my-app": {
623
+ "guild_id": "123456789012345678",
624
+ "token_env": "MY_APP_DISCORD_TOKEN",
625
+ "channels": {
626
+ "dev": "CHANNEL_ID",
627
+ "builds": "CHANNEL_ID",
628
+ "releases": "CHANNEL_ID",
629
+ "alerts": "CHANNEL_ID"
630
+ },
631
+ "default_channel": "dev",
632
+ "owners": ["USER_SNOWFLAKE_ID"],
633
+ "notify_owners_on": ["release", "error", "alert"],
634
+ "tool_profile": "full",
635
+ "tool_profile_add": [],
636
+ "tool_profile_remove": [],
637
+ "notification_routing": {
638
+ "ci_build": "builds",
639
+ "deploy": "builds",
640
+ "release": "releases",
641
+ "error": "alerts"
642
+ }
643
+ }
644
+ },
645
+ "default_project": "my-app",
646
+ "notification_routing": {
647
+ "ci_build": "builds",
648
+ "deploy": "builds",
649
+ "release": "releases",
650
+ "error": "alerts",
651
+ "dev": "dev"
652
+ }
653
+ }
654
+ ```
655
+
656
+ | Field | Description |
657
+ | ---------------------- | ----------------------------------------------------------------- |
658
+ | `guild_id` | Discord server (guild) snowflake ID |
659
+ | `token_env` | Env var name for this project's bot token |
660
+ | `channels` | Alias → channel ID map; `channel: "builds"` resolves here first |
661
+ | `default_channel` | Channel used when no `channel` param is provided |
662
+ | `owners` | User snowflake IDs to mention on matching notification types |
663
+ | `notify_owners_on` | Notification types that trigger owner pings (`"dev"` never pings) |
664
+ | `tool_profile` | Base tool profile for this project (`full`, `monitoring`, etc.) |
665
+ | `tool_profile_add` | Additional tools to load on top of the base profile |
666
+ | `tool_profile_remove` | Tools to exclude from the base profile |
667
+ | `notification_routing` | Per-project override of global notification → channel routing |
668
+
447
669
  ## Multi-Organization Troubleshooting
448
670
 
449
671
  ### Validating your config
@@ -478,6 +700,9 @@ If a project uses `token_env` for a different bot, that bot must be invited to t
478
700
  **Token rotation**
479
701
  Update the env var value and restart the MCP server. No config changes needed — `token_env` reads from the environment at runtime.
480
702
 
703
+ **Channel not found**
704
+ Channel resolution tries 4 layers in order: exact alias → fuzzy alias → live Discord name lookup → error. If a channel is still not found, verify the bot has access to the channel and `list_channels` returns it.
705
+
481
706
  ## Development
482
707
 
483
708
  ```bash
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAmExG;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,UAAU,CAA4B;gBAElC,YAAY,CAAC,EAAE,MAAM;IAUjC,OAAO,CAAC,aAAa;IAqBrB;;;OAGG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAWzD,UAAU,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAY3F,aAAa,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;YAYvF,kBAAkB;IAehC;;;OAGG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAUxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,IAAI,WAAW,IAAI,OAAO,CAGzB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,KAAK,KAAK,EACV,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AAmEpB;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,UAAU,CAA4B;gBAElC,YAAY,CAAC,EAAE,MAAM;IAUjC,OAAO,CAAC,aAAa;IAqBrB;;;OAGG;IACG,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAWzD,UAAU,CACd,eAAe,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IAYjB,aAAa,CACjB,eAAe,EAAE,MAAM,EACvB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,YAAY,CAAC;YAYV,kBAAkB;IAmBhC;;;OAGG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAUxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,IAAI,WAAW,IAAI,OAAO,CAGzB;CACF"}
package/dist/client.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Client, GatewayIntentBits } from "discord.js";
1
+ import { Client, GatewayIntentBits, } from "discord.js";
2
2
  import { logger } from "./utils/logger.js";
3
3
  import { validateTokenFormat } from "./security/token-validator.js";
4
4
  import { TTLCache } from "./utils/cache.js";
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "discord-ops",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Agency-grade Discord MCP server with multi-guild project routing",
5
5
  "type": "module",
6
6
  "license": "MIT",