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.
- package/CHANGELOG.md +14 -0
- package/README.md +121 -30
- package/dist/cli/index.js +71 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts +7 -0
- package/dist/cli/setup.d.ts.map +1 -0
- package/dist/cli/setup.js +397 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/client.d.ts +13 -11
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +65 -25
- package/dist/client.js.map +1 -1
- package/dist/config/index.d.ts +7 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +18 -3
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +8 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +1 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/routing/resolver.d.ts +2 -1
- package/dist/routing/resolver.d.ts.map +1 -1
- package/dist/routing/resolver.js +2 -0
- package/dist/routing/resolver.js.map +1 -1
- package/dist/server.d.ts +4 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +76 -2
- package/dist/server.js.map +1 -1
- package/dist/tools/audit/index.d.ts +2 -0
- package/dist/tools/audit/index.d.ts.map +1 -0
- package/dist/tools/audit/index.js +2 -0
- package/dist/tools/audit/index.js.map +1 -0
- package/dist/tools/audit/query-audit-log.d.ts +3 -0
- package/dist/tools/audit/query-audit-log.d.ts.map +1 -0
- package/dist/tools/audit/query-audit-log.js +60 -0
- package/dist/tools/audit/query-audit-log.js.map +1 -0
- package/dist/tools/channels/create-channel.d.ts.map +1 -1
- package/dist/tools/channels/create-channel.js +4 -1
- package/dist/tools/channels/create-channel.js.map +1 -1
- package/dist/tools/channels/delete-channel.d.ts.map +1 -1
- package/dist/tools/channels/delete-channel.js +4 -1
- package/dist/tools/channels/delete-channel.js.map +1 -1
- package/dist/tools/channels/edit-channel.d.ts.map +1 -1
- package/dist/tools/channels/edit-channel.js +4 -1
- package/dist/tools/channels/edit-channel.js.map +1 -1
- package/dist/tools/channels/get-channel.d.ts.map +1 -1
- package/dist/tools/channels/get-channel.js +4 -1
- package/dist/tools/channels/get-channel.js.map +1 -1
- package/dist/tools/channels/index.d.ts +3 -0
- package/dist/tools/channels/index.d.ts.map +1 -1
- package/dist/tools/channels/index.js +3 -0
- package/dist/tools/channels/index.js.map +1 -1
- package/dist/tools/channels/list-channels.d.ts.map +1 -1
- package/dist/tools/channels/list-channels.js +4 -1
- package/dist/tools/channels/list-channels.js.map +1 -1
- package/dist/tools/channels/permissions.d.ts +3 -0
- package/dist/tools/channels/permissions.d.ts.map +1 -0
- package/dist/tools/channels/permissions.js +34 -0
- package/dist/tools/channels/permissions.js.map +1 -0
- package/dist/tools/channels/purge-messages.d.ts +3 -0
- package/dist/tools/channels/purge-messages.d.ts.map +1 -0
- package/dist/tools/channels/purge-messages.js +41 -0
- package/dist/tools/channels/purge-messages.js.map +1 -0
- package/dist/tools/channels/set-slowmode.d.ts +3 -0
- package/dist/tools/channels/set-slowmode.d.ts.map +1 -0
- package/dist/tools/channels/set-slowmode.js +36 -0
- package/dist/tools/channels/set-slowmode.js.map +1 -0
- package/dist/tools/guilds/get-guild.d.ts.map +1 -1
- package/dist/tools/guilds/get-guild.js +4 -1
- package/dist/tools/guilds/get-guild.js.map +1 -1
- package/dist/tools/guilds/index.d.ts +1 -0
- package/dist/tools/guilds/index.d.ts.map +1 -1
- package/dist/tools/guilds/index.js +1 -0
- package/dist/tools/guilds/index.js.map +1 -1
- package/dist/tools/guilds/invites.d.ts +4 -0
- package/dist/tools/guilds/invites.d.ts.map +1 -0
- package/dist/tools/guilds/invites.js +93 -0
- package/dist/tools/guilds/invites.js.map +1 -0
- package/dist/tools/guilds/list-guilds.d.ts.map +1 -1
- package/dist/tools/guilds/list-guilds.js +11 -4
- package/dist/tools/guilds/list-guilds.js.map +1 -1
- package/dist/tools/health-check.d.ts.map +1 -1
- package/dist/tools/health-check.js +15 -2
- package/dist/tools/health-check.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +61 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/members/get-member.d.ts.map +1 -1
- package/dist/tools/members/get-member.js +4 -1
- package/dist/tools/members/get-member.js.map +1 -1
- package/dist/tools/members/list-members.d.ts.map +1 -1
- package/dist/tools/members/list-members.js +4 -1
- package/dist/tools/members/list-members.js.map +1 -1
- package/dist/tools/messaging/add-reaction.js +1 -1
- package/dist/tools/messaging/add-reaction.js.map +1 -1
- package/dist/tools/messaging/delete-message.d.ts.map +1 -1
- package/dist/tools/messaging/delete-message.js +1 -1
- package/dist/tools/messaging/delete-message.js.map +1 -1
- package/dist/tools/messaging/edit-message.js +1 -1
- package/dist/tools/messaging/edit-message.js.map +1 -1
- package/dist/tools/messaging/get-messages.js +1 -1
- package/dist/tools/messaging/get-messages.js.map +1 -1
- package/dist/tools/messaging/index.d.ts +3 -0
- package/dist/tools/messaging/index.d.ts.map +1 -1
- package/dist/tools/messaging/index.js +3 -0
- package/dist/tools/messaging/index.js.map +1 -1
- package/dist/tools/messaging/pin.d.ts +3 -0
- package/dist/tools/messaging/pin.d.ts.map +1 -0
- package/dist/tools/messaging/pin.js +24 -0
- package/dist/tools/messaging/pin.js.map +1 -0
- package/dist/tools/messaging/search.d.ts +3 -0
- package/dist/tools/messaging/search.d.ts.map +1 -0
- package/dist/tools/messaging/search.js +61 -0
- package/dist/tools/messaging/search.js.map +1 -0
- package/dist/tools/messaging/send-message.d.ts.map +1 -1
- package/dist/tools/messaging/send-message.js +2 -4
- package/dist/tools/messaging/send-message.js.map +1 -1
- package/dist/tools/messaging/unpin.d.ts +3 -0
- package/dist/tools/messaging/unpin.d.ts.map +1 -0
- package/dist/tools/messaging/unpin.js +24 -0
- package/dist/tools/messaging/unpin.js.map +1 -0
- package/dist/tools/moderation/ban-member.d.ts +3 -0
- package/dist/tools/moderation/ban-member.d.ts.map +1 -0
- package/dist/tools/moderation/ban-member.js +48 -0
- package/dist/tools/moderation/ban-member.js.map +1 -0
- package/dist/tools/moderation/index.d.ts +5 -0
- package/dist/tools/moderation/index.d.ts.map +1 -0
- package/dist/tools/moderation/index.js +5 -0
- package/dist/tools/moderation/index.js.map +1 -0
- package/dist/tools/moderation/kick-member.d.ts +3 -0
- package/dist/tools/moderation/kick-member.d.ts.map +1 -0
- package/dist/tools/moderation/kick-member.js +40 -0
- package/dist/tools/moderation/kick-member.js.map +1 -0
- package/dist/tools/moderation/timeout-member.d.ts +3 -0
- package/dist/tools/moderation/timeout-member.d.ts.map +1 -0
- package/dist/tools/moderation/timeout-member.js +47 -0
- package/dist/tools/moderation/timeout-member.js.map +1 -0
- package/dist/tools/moderation/unban-member.d.ts +3 -0
- package/dist/tools/moderation/unban-member.d.ts.map +1 -0
- package/dist/tools/moderation/unban-member.js +30 -0
- package/dist/tools/moderation/unban-member.js.map +1 -0
- package/dist/tools/roles/assign-role.d.ts +3 -0
- package/dist/tools/roles/assign-role.d.ts.map +1 -0
- package/dist/tools/roles/assign-role.js +40 -0
- package/dist/tools/roles/assign-role.js.map +1 -0
- package/dist/tools/roles/create-role.d.ts +3 -0
- package/dist/tools/roles/create-role.d.ts.map +1 -0
- package/dist/tools/roles/create-role.js +50 -0
- package/dist/tools/roles/create-role.js.map +1 -0
- package/dist/tools/roles/delete-role.d.ts +3 -0
- package/dist/tools/roles/delete-role.d.ts.map +1 -0
- package/dist/tools/roles/delete-role.js +32 -0
- package/dist/tools/roles/delete-role.js.map +1 -0
- package/dist/tools/roles/edit-role.d.ts +3 -0
- package/dist/tools/roles/edit-role.d.ts.map +1 -0
- package/dist/tools/roles/edit-role.js +52 -0
- package/dist/tools/roles/edit-role.js.map +1 -0
- package/dist/tools/roles/index.d.ts +4 -0
- package/dist/tools/roles/index.d.ts.map +1 -1
- package/dist/tools/roles/index.js +4 -0
- package/dist/tools/roles/index.js.map +1 -1
- package/dist/tools/roles/list-roles.d.ts.map +1 -1
- package/dist/tools/roles/list-roles.js +6 -2
- package/dist/tools/roles/list-roles.js.map +1 -1
- package/dist/tools/schema.d.ts +9 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +13 -0
- package/dist/tools/schema.js.map +1 -0
- package/dist/tools/threads/archive.d.ts +3 -0
- package/dist/tools/threads/archive.d.ts.map +1 -0
- package/dist/tools/threads/archive.js +33 -0
- package/dist/tools/threads/archive.js.map +1 -0
- package/dist/tools/threads/create-thread.js +1 -1
- package/dist/tools/threads/create-thread.js.map +1 -1
- package/dist/tools/threads/index.d.ts +1 -0
- package/dist/tools/threads/index.d.ts.map +1 -1
- package/dist/tools/threads/index.js +1 -0
- package/dist/tools/threads/index.js.map +1 -1
- package/dist/tools/threads/list-threads.d.ts.map +1 -1
- package/dist/tools/threads/list-threads.js +4 -1
- package/dist/tools/threads/list-threads.js.map +1 -1
- package/dist/tools/webhooks/create-webhook.d.ts +3 -0
- package/dist/tools/webhooks/create-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/create-webhook.js +38 -0
- package/dist/tools/webhooks/create-webhook.js.map +1 -0
- package/dist/tools/webhooks/delete-webhook.d.ts +3 -0
- package/dist/tools/webhooks/delete-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/delete-webhook.js +27 -0
- package/dist/tools/webhooks/delete-webhook.js.map +1 -0
- package/dist/tools/webhooks/edit-webhook.d.ts +3 -0
- package/dist/tools/webhooks/edit-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/edit-webhook.js +36 -0
- package/dist/tools/webhooks/edit-webhook.js.map +1 -0
- package/dist/tools/webhooks/execute-webhook.d.ts +3 -0
- package/dist/tools/webhooks/execute-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/execute-webhook.js +63 -0
- package/dist/tools/webhooks/execute-webhook.js.map +1 -0
- package/dist/tools/webhooks/get-webhook.d.ts +3 -0
- package/dist/tools/webhooks/get-webhook.d.ts.map +1 -0
- package/dist/tools/webhooks/get-webhook.js +33 -0
- package/dist/tools/webhooks/get-webhook.js.map +1 -0
- package/dist/tools/webhooks/index.d.ts +7 -0
- package/dist/tools/webhooks/index.d.ts.map +1 -0
- package/dist/tools/webhooks/index.js +7 -0
- package/dist/tools/webhooks/index.js.map +1 -0
- package/dist/tools/webhooks/list-webhooks.d.ts +3 -0
- package/dist/tools/webhooks/list-webhooks.d.ts.map +1 -0
- package/dist/tools/webhooks/list-webhooks.js +47 -0
- package/dist/tools/webhooks/list-webhooks.js.map +1 -0
- package/dist/transport/http.d.ts +6 -0
- package/dist/transport/http.d.ts.map +1 -0
- package/dist/transport/http.js +81 -0
- package/dist/transport/http.js.map +1 -0
- 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
|
-
- **
|
|
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
|
-
#
|
|
27
|
-
|
|
31
|
+
# Interactive setup (creates ~/.discord-ops.json)
|
|
32
|
+
discord-ops setup
|
|
28
33
|
|
|
29
|
-
#
|
|
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
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
118
|
-
| `
|
|
119
|
-
| `
|
|
120
|
-
| `
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
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
|
|
133
|
-
|
|
134
|
-
| `DISCORD_TOKEN`
|
|
135
|
-
| `DISCORD_OPS_CONFIG`
|
|
136
|
-
| `DISCORD_OPS_LOG_LEVEL` | No
|
|
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.
|
|
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.
|
|
41
|
+
const discord = new DiscordClient(config.defaultToken);
|
|
32
42
|
// Create MCP server with tool context
|
|
33
|
-
const server = createServer({ discord, config });
|
|
34
|
-
//
|
|
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.
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
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"}
|