discord-ops 0.1.0 → 0.3.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 (214) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +121 -30
  3. package/dist/cli/index.js +71 -16
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/setup.d.ts +7 -0
  6. package/dist/cli/setup.d.ts.map +1 -0
  7. package/dist/cli/setup.js +397 -0
  8. package/dist/cli/setup.js.map +1 -0
  9. package/dist/client.d.ts +13 -11
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +65 -25
  12. package/dist/client.js.map +1 -1
  13. package/dist/config/index.d.ts +7 -1
  14. package/dist/config/index.d.ts.map +1 -1
  15. package/dist/config/index.js +18 -3
  16. package/dist/config/index.js.map +1 -1
  17. package/dist/config/schema.d.ts +8 -0
  18. package/dist/config/schema.d.ts.map +1 -1
  19. package/dist/config/schema.js +1 -0
  20. package/dist/config/schema.js.map +1 -1
  21. package/dist/routing/resolver.d.ts +2 -1
  22. package/dist/routing/resolver.d.ts.map +1 -1
  23. package/dist/routing/resolver.js +2 -0
  24. package/dist/routing/resolver.js.map +1 -1
  25. package/dist/server.d.ts +4 -1
  26. package/dist/server.d.ts.map +1 -1
  27. package/dist/server.js +76 -2
  28. package/dist/server.js.map +1 -1
  29. package/dist/tools/audit/index.d.ts +2 -0
  30. package/dist/tools/audit/index.d.ts.map +1 -0
  31. package/dist/tools/audit/index.js +2 -0
  32. package/dist/tools/audit/index.js.map +1 -0
  33. package/dist/tools/audit/query-audit-log.d.ts +3 -0
  34. package/dist/tools/audit/query-audit-log.d.ts.map +1 -0
  35. package/dist/tools/audit/query-audit-log.js +60 -0
  36. package/dist/tools/audit/query-audit-log.js.map +1 -0
  37. package/dist/tools/channels/create-channel.d.ts.map +1 -1
  38. package/dist/tools/channels/create-channel.js +4 -1
  39. package/dist/tools/channels/create-channel.js.map +1 -1
  40. package/dist/tools/channels/delete-channel.d.ts.map +1 -1
  41. package/dist/tools/channels/delete-channel.js +4 -1
  42. package/dist/tools/channels/delete-channel.js.map +1 -1
  43. package/dist/tools/channels/edit-channel.d.ts.map +1 -1
  44. package/dist/tools/channels/edit-channel.js +4 -1
  45. package/dist/tools/channels/edit-channel.js.map +1 -1
  46. package/dist/tools/channels/get-channel.d.ts.map +1 -1
  47. package/dist/tools/channels/get-channel.js +4 -1
  48. package/dist/tools/channels/get-channel.js.map +1 -1
  49. package/dist/tools/channels/index.d.ts +3 -0
  50. package/dist/tools/channels/index.d.ts.map +1 -1
  51. package/dist/tools/channels/index.js +3 -0
  52. package/dist/tools/channels/index.js.map +1 -1
  53. package/dist/tools/channels/list-channels.d.ts.map +1 -1
  54. package/dist/tools/channels/list-channels.js +4 -1
  55. package/dist/tools/channels/list-channels.js.map +1 -1
  56. package/dist/tools/channels/permissions.d.ts +3 -0
  57. package/dist/tools/channels/permissions.d.ts.map +1 -0
  58. package/dist/tools/channels/permissions.js +34 -0
  59. package/dist/tools/channels/permissions.js.map +1 -0
  60. package/dist/tools/channels/purge-messages.d.ts +3 -0
  61. package/dist/tools/channels/purge-messages.d.ts.map +1 -0
  62. package/dist/tools/channels/purge-messages.js +41 -0
  63. package/dist/tools/channels/purge-messages.js.map +1 -0
  64. package/dist/tools/channels/set-slowmode.d.ts +3 -0
  65. package/dist/tools/channels/set-slowmode.d.ts.map +1 -0
  66. package/dist/tools/channels/set-slowmode.js +36 -0
  67. package/dist/tools/channels/set-slowmode.js.map +1 -0
  68. package/dist/tools/guilds/get-guild.d.ts.map +1 -1
  69. package/dist/tools/guilds/get-guild.js +4 -1
  70. package/dist/tools/guilds/get-guild.js.map +1 -1
  71. package/dist/tools/guilds/index.d.ts +1 -0
  72. package/dist/tools/guilds/index.d.ts.map +1 -1
  73. package/dist/tools/guilds/index.js +1 -0
  74. package/dist/tools/guilds/index.js.map +1 -1
  75. package/dist/tools/guilds/invites.d.ts +4 -0
  76. package/dist/tools/guilds/invites.d.ts.map +1 -0
  77. package/dist/tools/guilds/invites.js +93 -0
  78. package/dist/tools/guilds/invites.js.map +1 -0
  79. package/dist/tools/guilds/list-guilds.d.ts.map +1 -1
  80. package/dist/tools/guilds/list-guilds.js +11 -4
  81. package/dist/tools/guilds/list-guilds.js.map +1 -1
  82. package/dist/tools/health-check.d.ts.map +1 -1
  83. package/dist/tools/health-check.js +15 -2
  84. package/dist/tools/health-check.js.map +1 -1
  85. package/dist/tools/index.d.ts.map +1 -1
  86. package/dist/tools/index.js +61 -0
  87. package/dist/tools/index.js.map +1 -1
  88. package/dist/tools/members/get-member.d.ts.map +1 -1
  89. package/dist/tools/members/get-member.js +4 -1
  90. package/dist/tools/members/get-member.js.map +1 -1
  91. package/dist/tools/members/list-members.d.ts.map +1 -1
  92. package/dist/tools/members/list-members.js +4 -1
  93. package/dist/tools/members/list-members.js.map +1 -1
  94. package/dist/tools/messaging/add-reaction.js +1 -1
  95. package/dist/tools/messaging/add-reaction.js.map +1 -1
  96. package/dist/tools/messaging/delete-message.d.ts.map +1 -1
  97. package/dist/tools/messaging/delete-message.js +1 -1
  98. package/dist/tools/messaging/delete-message.js.map +1 -1
  99. package/dist/tools/messaging/edit-message.js +1 -1
  100. package/dist/tools/messaging/edit-message.js.map +1 -1
  101. package/dist/tools/messaging/get-messages.js +1 -1
  102. package/dist/tools/messaging/get-messages.js.map +1 -1
  103. package/dist/tools/messaging/index.d.ts +3 -0
  104. package/dist/tools/messaging/index.d.ts.map +1 -1
  105. package/dist/tools/messaging/index.js +3 -0
  106. package/dist/tools/messaging/index.js.map +1 -1
  107. package/dist/tools/messaging/pin.d.ts +3 -0
  108. package/dist/tools/messaging/pin.d.ts.map +1 -0
  109. package/dist/tools/messaging/pin.js +24 -0
  110. package/dist/tools/messaging/pin.js.map +1 -0
  111. package/dist/tools/messaging/search.d.ts +3 -0
  112. package/dist/tools/messaging/search.d.ts.map +1 -0
  113. package/dist/tools/messaging/search.js +61 -0
  114. package/dist/tools/messaging/search.js.map +1 -0
  115. package/dist/tools/messaging/send-message.d.ts.map +1 -1
  116. package/dist/tools/messaging/send-message.js +2 -4
  117. package/dist/tools/messaging/send-message.js.map +1 -1
  118. package/dist/tools/messaging/unpin.d.ts +3 -0
  119. package/dist/tools/messaging/unpin.d.ts.map +1 -0
  120. package/dist/tools/messaging/unpin.js +24 -0
  121. package/dist/tools/messaging/unpin.js.map +1 -0
  122. package/dist/tools/moderation/ban-member.d.ts +3 -0
  123. package/dist/tools/moderation/ban-member.d.ts.map +1 -0
  124. package/dist/tools/moderation/ban-member.js +48 -0
  125. package/dist/tools/moderation/ban-member.js.map +1 -0
  126. package/dist/tools/moderation/index.d.ts +5 -0
  127. package/dist/tools/moderation/index.d.ts.map +1 -0
  128. package/dist/tools/moderation/index.js +5 -0
  129. package/dist/tools/moderation/index.js.map +1 -0
  130. package/dist/tools/moderation/kick-member.d.ts +3 -0
  131. package/dist/tools/moderation/kick-member.d.ts.map +1 -0
  132. package/dist/tools/moderation/kick-member.js +40 -0
  133. package/dist/tools/moderation/kick-member.js.map +1 -0
  134. package/dist/tools/moderation/timeout-member.d.ts +3 -0
  135. package/dist/tools/moderation/timeout-member.d.ts.map +1 -0
  136. package/dist/tools/moderation/timeout-member.js +47 -0
  137. package/dist/tools/moderation/timeout-member.js.map +1 -0
  138. package/dist/tools/moderation/unban-member.d.ts +3 -0
  139. package/dist/tools/moderation/unban-member.d.ts.map +1 -0
  140. package/dist/tools/moderation/unban-member.js +30 -0
  141. package/dist/tools/moderation/unban-member.js.map +1 -0
  142. package/dist/tools/roles/assign-role.d.ts +3 -0
  143. package/dist/tools/roles/assign-role.d.ts.map +1 -0
  144. package/dist/tools/roles/assign-role.js +40 -0
  145. package/dist/tools/roles/assign-role.js.map +1 -0
  146. package/dist/tools/roles/create-role.d.ts +3 -0
  147. package/dist/tools/roles/create-role.d.ts.map +1 -0
  148. package/dist/tools/roles/create-role.js +50 -0
  149. package/dist/tools/roles/create-role.js.map +1 -0
  150. package/dist/tools/roles/delete-role.d.ts +3 -0
  151. package/dist/tools/roles/delete-role.d.ts.map +1 -0
  152. package/dist/tools/roles/delete-role.js +32 -0
  153. package/dist/tools/roles/delete-role.js.map +1 -0
  154. package/dist/tools/roles/edit-role.d.ts +3 -0
  155. package/dist/tools/roles/edit-role.d.ts.map +1 -0
  156. package/dist/tools/roles/edit-role.js +52 -0
  157. package/dist/tools/roles/edit-role.js.map +1 -0
  158. package/dist/tools/roles/index.d.ts +4 -0
  159. package/dist/tools/roles/index.d.ts.map +1 -1
  160. package/dist/tools/roles/index.js +4 -0
  161. package/dist/tools/roles/index.js.map +1 -1
  162. package/dist/tools/roles/list-roles.d.ts.map +1 -1
  163. package/dist/tools/roles/list-roles.js +6 -2
  164. package/dist/tools/roles/list-roles.js.map +1 -1
  165. package/dist/tools/schema.d.ts +9 -0
  166. package/dist/tools/schema.d.ts.map +1 -0
  167. package/dist/tools/schema.js +13 -0
  168. package/dist/tools/schema.js.map +1 -0
  169. package/dist/tools/threads/archive.d.ts +3 -0
  170. package/dist/tools/threads/archive.d.ts.map +1 -0
  171. package/dist/tools/threads/archive.js +33 -0
  172. package/dist/tools/threads/archive.js.map +1 -0
  173. package/dist/tools/threads/create-thread.js +1 -1
  174. package/dist/tools/threads/create-thread.js.map +1 -1
  175. package/dist/tools/threads/index.d.ts +1 -0
  176. package/dist/tools/threads/index.d.ts.map +1 -1
  177. package/dist/tools/threads/index.js +1 -0
  178. package/dist/tools/threads/index.js.map +1 -1
  179. package/dist/tools/threads/list-threads.d.ts.map +1 -1
  180. package/dist/tools/threads/list-threads.js +4 -1
  181. package/dist/tools/threads/list-threads.js.map +1 -1
  182. package/dist/tools/webhooks/create-webhook.d.ts +3 -0
  183. package/dist/tools/webhooks/create-webhook.d.ts.map +1 -0
  184. package/dist/tools/webhooks/create-webhook.js +38 -0
  185. package/dist/tools/webhooks/create-webhook.js.map +1 -0
  186. package/dist/tools/webhooks/delete-webhook.d.ts +3 -0
  187. package/dist/tools/webhooks/delete-webhook.d.ts.map +1 -0
  188. package/dist/tools/webhooks/delete-webhook.js +27 -0
  189. package/dist/tools/webhooks/delete-webhook.js.map +1 -0
  190. package/dist/tools/webhooks/edit-webhook.d.ts +3 -0
  191. package/dist/tools/webhooks/edit-webhook.d.ts.map +1 -0
  192. package/dist/tools/webhooks/edit-webhook.js +36 -0
  193. package/dist/tools/webhooks/edit-webhook.js.map +1 -0
  194. package/dist/tools/webhooks/execute-webhook.d.ts +3 -0
  195. package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -0
  196. package/dist/tools/webhooks/execute-webhook.js +63 -0
  197. package/dist/tools/webhooks/execute-webhook.js.map +1 -0
  198. package/dist/tools/webhooks/get-webhook.d.ts +3 -0
  199. package/dist/tools/webhooks/get-webhook.d.ts.map +1 -0
  200. package/dist/tools/webhooks/get-webhook.js +33 -0
  201. package/dist/tools/webhooks/get-webhook.js.map +1 -0
  202. package/dist/tools/webhooks/index.d.ts +7 -0
  203. package/dist/tools/webhooks/index.d.ts.map +1 -0
  204. package/dist/tools/webhooks/index.js +7 -0
  205. package/dist/tools/webhooks/index.js.map +1 -0
  206. package/dist/tools/webhooks/list-webhooks.d.ts +3 -0
  207. package/dist/tools/webhooks/list-webhooks.d.ts.map +1 -0
  208. package/dist/tools/webhooks/list-webhooks.js +47 -0
  209. package/dist/tools/webhooks/list-webhooks.js.map +1 -0
  210. package/dist/transport/http.d.ts +6 -0
  211. package/dist/transport/http.d.ts.map +1 -0
  212. package/dist/transport/http.js +81 -0
  213. package/dist/transport/http.js.map +1 -0
  214. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # discord-ops
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 6e421f2: Add 8 new tools (pin/unpin message, search messages, archive thread, set channel permissions, get/create invites), HTTP/SSE transport, dry-run mode for destructive operations, and interactive CLI setup wizard.
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 17 new tools: moderation (kick, ban, unban, timeout), role CRUD + assign, webhook CRUD + execute, audit log query, channel moderation (purge, slowmode, edit, delete)
14
+ - Security hardening: rate limiting, permission pre-flight checks, snowflake validation, self-protection guards, error sanitization
15
+ - Local CI infrastructure (act-ci.sh + act-ci.yml)
16
+
3
17
  ## 0.1.0
4
18
 
5
19
  ### Features
package/README.md CHANGED
@@ -8,9 +8,14 @@ Agency-grade Discord MCP server with multi-guild project routing.
8
8
 
9
9
  ## Features
10
10
 
11
- - **18 MCP tools** — messaging, channels, guilds, members, roles, threads, health check
11
+ - **42 MCP tools** — messaging, channels, moderation, roles, webhooks, audit log, threads, guilds, invites, permissions, search
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
+ - **Multi-bot support** — manage multiple Discord bots from a single MCP server
15
+ - **HTTP/SSE + stdio transports** — stdio for Claude Code, HTTP/SSE for remote MCP clients
16
+ - **Dry-run mode** — simulate destructive operations without calling Discord API
17
+ - **Interactive setup wizard** — `discord-ops setup` walks through config creation
18
+ - **Security hardening** — rate limiting, permission pre-flight checks, snowflake ID validation, self-protection guards
14
19
  - **Lazy login** — tools enumerate before Discord connects; first tool call triggers login
15
20
  - **Zod validation** — all inputs validated before execution
16
21
  - **Error sanitization** — tokens, webhook URLs, and snowflake IDs stripped from error output
@@ -23,14 +28,18 @@ Agency-grade Discord MCP server with multi-guild project routing.
23
28
  # Install
24
29
  npm install -g discord-ops
25
30
 
26
- # Set your bot token
27
- export DISCORD_TOKEN="your-bot-token"
31
+ # Interactive setup (creates ~/.discord-ops.json)
32
+ discord-ops setup
28
33
 
29
- # Run health check
34
+ # Or manual setup
35
+ export DISCORD_TOKEN="your-bot-token"
30
36
  discord-ops health
31
37
 
32
38
  # Start MCP server (stdio)
33
39
  discord-ops
40
+
41
+ # Start MCP server (HTTP/SSE)
42
+ discord-ops serve --port 3000
34
43
  ```
35
44
 
36
45
  ## Claude Code Integration
@@ -104,36 +113,115 @@ send_message({ notification_type: "ci_build", content: "CI green" })
104
113
  send_message({ channel_id: "123456789", content: "Hello" })
105
114
  ```
106
115
 
107
- ## Tools (v0.1.0)
108
-
109
- | Tool | Description |
110
- |------|-------------|
111
- | `send_message` | Send a message with project routing |
112
- | `get_messages` | Fetch recent messages |
113
- | `edit_message` | Edit a bot message |
114
- | `delete_message` | Delete a message |
115
- | `add_reaction` | React to a message |
116
- | `list_channels` | List guild channels |
117
- | `get_channel` | Get channel details |
118
- | `create_channel` | Create a channel |
119
- | `edit_channel` | Edit channel properties |
120
- | `delete_channel` | Delete a channel |
121
- | `list_guilds` | List bot's guilds |
122
- | `get_guild` | Get guild details |
123
- | `list_members` | List guild members |
124
- | `get_member` | Get member details |
125
- | `list_roles` | List guild roles |
126
- | `create_thread` | Create a thread |
127
- | `list_threads` | List active threads |
116
+ ## Tools
117
+
118
+ ### Messaging (8 tools)
119
+
120
+ | Tool | Description |
121
+ | ----------------- | ------------------------------------------------- |
122
+ | `send_message` | Send a message with project routing |
123
+ | `get_messages` | Fetch recent messages |
124
+ | `edit_message` | Edit a bot message |
125
+ | `delete_message` | Delete a message |
126
+ | `add_reaction` | React to a message |
127
+ | `pin_message` | Pin a message in a channel |
128
+ | `unpin_message` | Unpin a message |
129
+ | `search_messages` | Search messages by content, author, or date range |
130
+
131
+ ### Channels (8 tools)
132
+
133
+ | Tool | Description |
134
+ | ----------------- | ----------------------------------------------------- |
135
+ | `list_channels` | List guild channels |
136
+ | `get_channel` | Get channel details |
137
+ | `create_channel` | Create a channel |
138
+ | `edit_channel` | Edit channel properties |
139
+ | `delete_channel` | Delete a channel |
140
+ | `purge_messages` | Bulk-delete messages (max 100, < 14 days old) |
141
+ | `set_slowmode` | Set or disable slowmode |
142
+ | `set_permissions` | Set channel permission overrides for a role or member |
143
+
144
+ ### Moderation (4 tools)
145
+
146
+ | Tool | Description |
147
+ | ---------------- | -------------------------- |
148
+ | `kick_member` | Kick a member from a guild |
149
+ | `ban_member` | Ban a user from a guild |
150
+ | `unban_member` | Unban a user |
151
+ | `timeout_member` | Timeout (mute) a member |
152
+
153
+ ### Roles (5 tools)
154
+
155
+ | Tool | Description |
156
+ | ------------- | ---------------------------------- |
157
+ | `list_roles` | List guild roles |
158
+ | `create_role` | Create a new role |
159
+ | `edit_role` | Edit role properties |
160
+ | `delete_role` | Delete a role |
161
+ | `assign_role` | Add or remove a role from a member |
162
+
163
+ ### Webhooks (6 tools)
164
+
165
+ | Tool | Description |
166
+ | ----------------- | ------------------------------------ |
167
+ | `create_webhook` | Create a webhook on a channel |
168
+ | `get_webhook` | Get webhook details |
169
+ | `list_webhooks` | List webhooks for a guild or channel |
170
+ | `edit_webhook` | Edit webhook properties |
171
+ | `delete_webhook` | Delete a webhook |
172
+ | `execute_webhook` | Send a message via webhook |
173
+
174
+ ### Audit (1 tool)
175
+
176
+ | Tool | Description |
177
+ | ----------------- | ---------------------------------- |
178
+ | `query_audit_log` | Query guild audit log with filters |
179
+
180
+ ### Guilds & Members (6 tools)
181
+
182
+ | Tool | Description |
183
+ | --------------- | ----------------------------------- |
184
+ | `list_guilds` | List bot's guilds |
185
+ | `get_guild` | Get guild details |
186
+ | `get_invites` | Get all active invites for a guild |
187
+ | `create_invite` | Create an invite link for a channel |
188
+ | `list_members` | List guild members |
189
+ | `get_member` | Get member details |
190
+
191
+ ### Threads (3 tools)
192
+
193
+ | Tool | Description |
194
+ | ---------------- | -------------------------------------- |
195
+ | `create_thread` | Create a thread |
196
+ | `list_threads` | List active threads |
197
+ | `archive_thread` | Archive (and optionally lock) a thread |
198
+
199
+ ### System (1 tool)
200
+
201
+ | Tool | Description |
202
+ | -------------- | ------------------------ |
128
203
  | `health_check` | Bot status + permissions |
129
204
 
205
+ ## CLI
206
+
207
+ ```
208
+ discord-ops Start MCP server (stdio transport)
209
+ discord-ops serve Start MCP server (HTTP/SSE transport)
210
+ discord-ops setup Interactive setup wizard
211
+ discord-ops health Run health check + permission audit
212
+ discord-ops --dry-run Simulate destructive operations
213
+ discord-ops --help Show help
214
+ discord-ops --version Show version
215
+ ```
216
+
130
217
  ## Environment Variables
131
218
 
132
- | Variable | Required | Description |
133
- |----------|----------|-------------|
134
- | `DISCORD_TOKEN` | Yes | Discord bot token |
135
- | `DISCORD_OPS_CONFIG` | No | Path to global config (default: `~/.discord-ops.json`) |
136
- | `DISCORD_OPS_LOG_LEVEL` | No | `debug`, `info`, `warn`, `error` (default: `info`) |
219
+ | Variable | Required | Description |
220
+ | ----------------------- | -------- | ------------------------------------------------------ |
221
+ | `DISCORD_TOKEN` | Yes | Discord bot token |
222
+ | `DISCORD_OPS_CONFIG` | No | Path to global config (default: `~/.discord-ops.json`) |
223
+ | `DISCORD_OPS_LOG_LEVEL` | No | `debug`, `info`, `warn`, `error` (default: `info`) |
224
+ | `DISCORD_OPS_DRY_RUN` | No | Enable dry-run mode (any truthy value) |
137
225
 
138
226
  ## Development
139
227
 
@@ -143,6 +231,9 @@ cd discord-ops
143
231
  npm install
144
232
  npm run build
145
233
  npm test
234
+
235
+ # Local CI
236
+ ./scripts/act-ci.sh --local
146
237
  ```
147
238
 
148
239
  ## License
package/dist/cli/index.js CHANGED
@@ -3,7 +3,9 @@ import { loadConfig } from "../config/index.js";
3
3
  import { DiscordClient } from "../client.js";
4
4
  import { createServer } from "../server.js";
5
5
  import { startStdioTransport } from "../transport/stdio.js";
6
+ import { startHttpTransport } from "../transport/http.js";
6
7
  import { logger, setLogLevel } from "../utils/logger.js";
8
+ import { runSetup } from "./setup.js";
7
9
  async function main() {
8
10
  const args = process.argv.slice(2);
9
11
  // Handle --help
@@ -13,7 +15,7 @@ async function main() {
13
15
  }
14
16
  // Handle --version
15
17
  if (args.includes("--version") || args.includes("-v")) {
16
- console.log("discord-ops 0.1.0");
18
+ console.log("discord-ops 0.2.0");
17
19
  process.exit(0);
18
20
  }
19
21
  // Handle health subcommand
@@ -21,6 +23,14 @@ async function main() {
21
23
  await runHealthCheck();
22
24
  return;
23
25
  }
26
+ // Handle setup subcommand
27
+ if (args[0] === "setup") {
28
+ await runSetup();
29
+ return;
30
+ }
31
+ // Parse global flags
32
+ const dryRun = args.includes("--dry-run");
33
+ const serverOptions = { dryRun };
24
34
  // Configure log level
25
35
  const logLevel = process.env.DISCORD_OPS_LOG_LEVEL;
26
36
  if (logLevel)
@@ -28,10 +38,29 @@ async function main() {
28
38
  // Load config (does NOT require Discord connection)
29
39
  const config = loadConfig();
30
40
  // Create lazy Discord client
31
- const discord = new DiscordClient(config.token);
41
+ const discord = new DiscordClient(config.defaultToken);
32
42
  // Create MCP server with tool context
33
- const server = createServer({ discord, config });
34
- // Start stdio transport
43
+ const server = createServer({ discord, config }, serverOptions);
44
+ // Handle serve subcommand (HTTP/SSE transport)
45
+ if (args[0] === "serve") {
46
+ const portIndex = args.indexOf("--port");
47
+ const port = portIndex !== -1 ? parseInt(args[portIndex + 1], 10) : undefined;
48
+ if (portIndex !== -1 && (!port || isNaN(port))) {
49
+ console.error("Invalid --port value");
50
+ process.exit(1);
51
+ }
52
+ await startHttpTransport(server, { port });
53
+ // Graceful shutdown
54
+ const shutdown = async () => {
55
+ logger.info("Shutting down...");
56
+ await discord.destroy();
57
+ process.exit(0);
58
+ };
59
+ process.on("SIGINT", shutdown);
60
+ process.on("SIGTERM", shutdown);
61
+ return;
62
+ }
63
+ // Default: start stdio transport
35
64
  await startStdioTransport(server);
36
65
  // Graceful shutdown
37
66
  const shutdown = async () => {
@@ -45,20 +74,37 @@ async function main() {
45
74
  async function runHealthCheck() {
46
75
  try {
47
76
  const config = loadConfig();
48
- const discord = new DiscordClient(config.token);
49
- console.log("Connecting to Discord...");
50
- const client = await discord.getClient();
51
- console.log(`\nBot: ${client.user?.tag}`);
52
- console.log(`Guilds: ${client.guilds.cache.size}`);
53
- for (const [id, guild] of client.guilds.cache) {
54
- const me = await guild.members.fetchMe();
55
- console.log(`\n ${guild.name} (${id})`);
56
- console.log(` Members: ${guild.memberCount}`);
57
- console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
77
+ const discord = new DiscordClient(config.defaultToken);
78
+ // Collect unique tokens: default + any project-specific ones
79
+ const tokens = new Map(); // token → project names
80
+ tokens.set(config.defaultToken, ["(default)"]);
81
+ for (const [name, project] of Object.entries(config.global.projects)) {
82
+ if (project.token_env) {
83
+ const t = process.env[project.token_env];
84
+ if (t && t !== config.defaultToken) {
85
+ const names = tokens.get(t) ?? [];
86
+ names.push(name);
87
+ tokens.set(t, names);
88
+ }
89
+ }
90
+ }
91
+ console.log(`Bots configured: ${tokens.size}`);
92
+ for (const [token, projects] of tokens) {
93
+ console.log(`\nConnecting bot for: ${projects.join(", ")}...`);
94
+ const client = await discord.getClient(token);
95
+ console.log(` Bot: ${client.user?.tag}`);
96
+ console.log(` Guilds: ${client.guilds.cache.size}`);
97
+ for (const [id, guild] of client.guilds.cache) {
98
+ const me = await guild.members.fetchMe();
99
+ console.log(`\n ${guild.name} (${id})`);
100
+ console.log(` Members: ${guild.memberCount}`);
101
+ console.log(` Permissions: ${me.permissions.toArray().join(", ")}`);
102
+ }
58
103
  }
59
104
  console.log(`\nProjects configured: ${Object.keys(config.global.projects).length}`);
60
105
  for (const [name, project] of Object.entries(config.global.projects)) {
61
- console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}`);
106
+ const tokenInfo = project.token_env ? ` [${project.token_env}]` : "";
107
+ console.log(` ${name}: guild=${project.guild_id}, channels=${Object.keys(project.channels).join(", ")}${tokenInfo}`);
62
108
  }
63
109
  console.log("\nHealth check passed.");
64
110
  await discord.destroy();
@@ -74,14 +120,23 @@ discord-ops - Agency-grade Discord MCP server
74
120
 
75
121
  USAGE:
76
122
  discord-ops Start MCP server (stdio transport)
123
+ discord-ops serve Start MCP server (HTTP/SSE transport)
124
+ discord-ops setup Interactive setup wizard
77
125
  discord-ops health Run health check + permission audit
78
126
  discord-ops --help Show this help
79
127
  discord-ops --version Show version
80
128
 
129
+ OPTIONS:
130
+ --dry-run Simulate destructive operations without calling Discord API
131
+ --port <port> HTTP port for serve mode (default: 3000)
132
+
81
133
  ENVIRONMENT:
82
- DISCORD_TOKEN Discord bot token (required)
134
+ DISCORD_TOKEN Default Discord bot token (required)
135
+ <PROJECT>_TOKEN Per-project bot tokens (configured via token_env in config)
83
136
  DISCORD_OPS_CONFIG Path to global config file (default: ~/.discord-ops.json)
84
137
  DISCORD_OPS_LOG_LEVEL Log level: debug, info, warn, error (default: info)
138
+ DISCORD_OPS_DRY_RUN Enable dry-run mode (any truthy value)
139
+ DRY_RUN Enable dry-run mode (any truthy value, alias)
85
140
 
86
141
  CONFIG FILES:
87
142
  ~/.discord-ops.json Global project routing config
@@ -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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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Interactive setup wizard for discord-ops configuration.
3
+ * Walks users through bot token verification, guild selection,
4
+ * channel aliasing, and notification routing.
5
+ */
6
+ export declare function runSetup(): Promise<void>;
7
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"AA2CA;;;;GAIG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAqH9C"}