discord-ops 0.2.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 (60) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/README.md +106 -69
  3. package/dist/cli/index.js +40 -3
  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/server.d.ts +4 -1
  10. package/dist/server.d.ts.map +1 -1
  11. package/dist/server.js +30 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/tools/channels/index.d.ts +1 -0
  14. package/dist/tools/channels/index.d.ts.map +1 -1
  15. package/dist/tools/channels/index.js +1 -0
  16. package/dist/tools/channels/index.js.map +1 -1
  17. package/dist/tools/channels/permissions.d.ts +3 -0
  18. package/dist/tools/channels/permissions.d.ts.map +1 -0
  19. package/dist/tools/channels/permissions.js +34 -0
  20. package/dist/tools/channels/permissions.js.map +1 -0
  21. package/dist/tools/guilds/index.d.ts +1 -0
  22. package/dist/tools/guilds/index.d.ts.map +1 -1
  23. package/dist/tools/guilds/index.js +1 -0
  24. package/dist/tools/guilds/index.js.map +1 -1
  25. package/dist/tools/guilds/invites.d.ts +4 -0
  26. package/dist/tools/guilds/invites.d.ts.map +1 -0
  27. package/dist/tools/guilds/invites.js +93 -0
  28. package/dist/tools/guilds/invites.js.map +1 -0
  29. package/dist/tools/index.d.ts.map +1 -1
  30. package/dist/tools/index.js +14 -0
  31. package/dist/tools/index.js.map +1 -1
  32. package/dist/tools/messaging/index.d.ts +3 -0
  33. package/dist/tools/messaging/index.d.ts.map +1 -1
  34. package/dist/tools/messaging/index.js +3 -0
  35. package/dist/tools/messaging/index.js.map +1 -1
  36. package/dist/tools/messaging/pin.d.ts +3 -0
  37. package/dist/tools/messaging/pin.d.ts.map +1 -0
  38. package/dist/tools/messaging/pin.js +24 -0
  39. package/dist/tools/messaging/pin.js.map +1 -0
  40. package/dist/tools/messaging/search.d.ts +3 -0
  41. package/dist/tools/messaging/search.d.ts.map +1 -0
  42. package/dist/tools/messaging/search.js +61 -0
  43. package/dist/tools/messaging/search.js.map +1 -0
  44. package/dist/tools/messaging/unpin.d.ts +3 -0
  45. package/dist/tools/messaging/unpin.d.ts.map +1 -0
  46. package/dist/tools/messaging/unpin.js +24 -0
  47. package/dist/tools/messaging/unpin.js.map +1 -0
  48. package/dist/tools/threads/archive.d.ts +3 -0
  49. package/dist/tools/threads/archive.d.ts.map +1 -0
  50. package/dist/tools/threads/archive.js +33 -0
  51. package/dist/tools/threads/archive.js.map +1 -0
  52. package/dist/tools/threads/index.d.ts +1 -0
  53. package/dist/tools/threads/index.d.ts.map +1 -1
  54. package/dist/tools/threads/index.js +1 -0
  55. package/dist/tools/threads/index.js.map +1 -1
  56. package/dist/transport/http.d.ts +6 -0
  57. package/dist/transport/http.d.ts.map +1 -0
  58. package/dist/transport/http.js +81 -0
  59. package/dist/transport/http.js.map +1 -0
  60. package/package.json +1 -1
@@ -0,0 +1,93 @@
1
+ import { z } from "zod";
2
+ import { toolResultJson } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const getInvitesSchema = z.object({
6
+ guild_id: snowflakeId.describe("Guild ID to fetch invites for"),
7
+ project: z.string().optional().describe("Project name for token resolution"),
8
+ });
9
+ export const getInvites = {
10
+ name: "get_invites",
11
+ description: "Get all active invites for a guild.",
12
+ category: "guilds",
13
+ inputSchema: getInvitesSchema,
14
+ permissions: ["ManageGuild"],
15
+ requiresGuild: true,
16
+ handle: async (input, ctx) => {
17
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
18
+ const guild = await ctx.discord.getGuild(input.guild_id, token);
19
+ const invites = await guild.invites.fetch();
20
+ return toolResultJson({
21
+ guild: guild.name,
22
+ guild_id: guild.id,
23
+ count: invites.size,
24
+ invites: invites.map((inv) => ({
25
+ code: inv.code,
26
+ url: `https://discord.gg/${inv.code}`,
27
+ channel: inv.channel?.name ?? "unknown",
28
+ channel_id: inv.channelId,
29
+ inviter: inv.inviter?.tag ?? "unknown",
30
+ uses: inv.uses,
31
+ max_uses: inv.maxUses,
32
+ max_age: inv.maxAge,
33
+ temporary: inv.temporary,
34
+ created_at: inv.createdAt?.toISOString(),
35
+ expires_at: inv.expiresAt?.toISOString(),
36
+ })),
37
+ });
38
+ },
39
+ };
40
+ const createInviteSchema = z.object({
41
+ channel_id: snowflakeId.describe("Channel ID to create invite for"),
42
+ max_age: z
43
+ .number()
44
+ .int()
45
+ .min(0)
46
+ .max(604800)
47
+ .default(86400)
48
+ .describe("Invite duration in seconds (0 = never, max 604800 = 7 days, default 86400 = 24h)"),
49
+ max_uses: z
50
+ .number()
51
+ .int()
52
+ .min(0)
53
+ .max(100)
54
+ .default(0)
55
+ .describe("Max uses (0 = unlimited, default 0)"),
56
+ temporary: z
57
+ .boolean()
58
+ .default(false)
59
+ .describe("Whether membership is temporary (kicked when offline)"),
60
+ unique: z
61
+ .boolean()
62
+ .default(false)
63
+ .describe("Whether to create a new unique invite even if one exists"),
64
+ project: z.string().optional().describe("Project name for token resolution"),
65
+ });
66
+ export const createInvite = {
67
+ name: "create_invite",
68
+ description: "Create an invite link for a Discord channel.",
69
+ category: "guilds",
70
+ inputSchema: createInviteSchema,
71
+ permissions: ["CreateInstantInvite"],
72
+ handle: async (input, ctx) => {
73
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
74
+ const channel = await ctx.discord.getChannel(input.channel_id, token);
75
+ const invite = await channel.createInvite({
76
+ maxAge: input.max_age,
77
+ maxUses: input.max_uses,
78
+ temporary: input.temporary,
79
+ unique: input.unique,
80
+ });
81
+ return toolResultJson({
82
+ code: invite.code,
83
+ url: `https://discord.gg/${invite.code}`,
84
+ channel: channel.name,
85
+ channel_id: channel.id,
86
+ max_age: invite.maxAge,
87
+ max_uses: invite.maxUses,
88
+ temporary: invite.temporary,
89
+ expires_at: invite.expiresAt?.toISOString(),
90
+ });
91
+ },
92
+ };
93
+ //# sourceMappingURL=invites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invites.js","sourceRoot":"","sources":["../../../src/tools/guilds/invites.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC/D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,gBAAgB;IAC7B,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,aAAa,EAAE,IAAI;IACnB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAE5C,OAAO,cAAc,CAAC;YACpB,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,QAAQ,EAAE,KAAK,CAAC,EAAE;YAClB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,sBAAsB,GAAG,CAAC,IAAI,EAAE;gBACrC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS;gBACvC,UAAU,EAAE,GAAG,CAAC,SAAS;gBACzB,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,SAAS;gBACtC,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,QAAQ,EAAE,GAAG,CAAC,OAAO;gBACrB,OAAO,EAAE,GAAG,CAAC,MAAM;gBACnB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE;gBACxC,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE;aACzC,CAAC,CAAC;SACJ,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACnE,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,MAAM,CAAC;SACX,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,kFAAkF,CAAC;IAC/F,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,qCAAqC,CAAC;IAClD,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,uDAAuD,CAAC;IACpE,MAAM,EAAE,CAAC;SACN,OAAO,EAAE;SACT,OAAO,CAAC,KAAK,CAAC;SACd,QAAQ,CAAC,0DAA0D,CAAC;IACvE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,8CAA8C;IAC3D,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,kBAAkB;IAC/B,WAAW,EAAE,CAAC,qBAAqB,CAAC;IACpC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;YACxC,MAAM,EAAE,KAAK,CAAC,OAAO;YACrB,OAAO,EAAE,KAAK,CAAC,QAAQ;YACvB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAC,CAAC;QAEH,OAAO,cAAc,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,sBAAsB,MAAM,CAAC,IAAI,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,QAAQ,EAAE,MAAM,CAAC,OAAO;YACxB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAyDjD,eAAO,MAAM,QAAQ,EAAE,cAAc,EAuDpC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgEjD,eAAO,MAAM,QAAQ,EAAE,cAAc,EA8DpC,CAAC"}
@@ -4,6 +4,9 @@ import { getMessages } from "./messaging/get-messages.js";
4
4
  import { editMessage } from "./messaging/edit-message.js";
5
5
  import { deleteMessage } from "./messaging/delete-message.js";
6
6
  import { addReaction } from "./messaging/add-reaction.js";
7
+ import { pinMessage } from "./messaging/pin.js";
8
+ import { unpinMessage } from "./messaging/unpin.js";
9
+ import { searchMessages } from "./messaging/search.js";
7
10
  // Channels
8
11
  import { listChannels } from "./channels/list-channels.js";
9
12
  import { getChannel } from "./channels/get-channel.js";
@@ -12,9 +15,12 @@ import { editChannel } from "./channels/edit-channel.js";
12
15
  import { deleteChannel } from "./channels/delete-channel.js";
13
16
  import { purgeMessages } from "./channels/purge-messages.js";
14
17
  import { setSlowmode } from "./channels/set-slowmode.js";
18
+ import { setPermissions } from "./channels/permissions.js";
15
19
  // Guilds
16
20
  import { listGuilds } from "./guilds/list-guilds.js";
17
21
  import { getGuild } from "./guilds/get-guild.js";
22
+ import { getInvites } from "./guilds/invites.js";
23
+ import { createInvite } from "./guilds/invites.js";
18
24
  // Members
19
25
  import { listMembers } from "./members/list-members.js";
20
26
  import { getMember } from "./members/get-member.js";
@@ -27,6 +33,7 @@ import { assignRole } from "./roles/assign-role.js";
27
33
  // Threads
28
34
  import { createThread } from "./threads/create-thread.js";
29
35
  import { listThreads } from "./threads/list-threads.js";
36
+ import { archiveThread } from "./threads/archive.js";
30
37
  // Moderation
31
38
  import { kickMember } from "./moderation/kick-member.js";
32
39
  import { banMember } from "./moderation/ban-member.js";
@@ -50,6 +57,9 @@ export const allTools = [
50
57
  editMessage,
51
58
  deleteMessage,
52
59
  addReaction,
60
+ pinMessage,
61
+ unpinMessage,
62
+ searchMessages,
53
63
  // Channels
54
64
  listChannels,
55
65
  getChannel,
@@ -58,9 +68,12 @@ export const allTools = [
58
68
  deleteChannel,
59
69
  purgeMessages,
60
70
  setSlowmode,
71
+ setPermissions,
61
72
  // Guilds
62
73
  listGuilds,
63
74
  getGuild,
75
+ getInvites,
76
+ createInvite,
64
77
  // Members
65
78
  listMembers,
66
79
  getMember,
@@ -73,6 +86,7 @@ export const allTools = [
73
86
  // Threads
74
87
  createThread,
75
88
  listThreads,
89
+ archiveThread,
76
90
  // Moderation
77
91
  kickMember,
78
92
  banMember,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,7 @@ export { getMessages } from "./get-messages.js";
3
3
  export { editMessage } from "./edit-message.js";
4
4
  export { deleteMessage } from "./delete-message.js";
5
5
  export { addReaction } from "./add-reaction.js";
6
+ export { pinMessage } from "./pin.js";
7
+ export { unpinMessage } from "./unpin.js";
8
+ export { searchMessages } from "./search.js";
6
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -3,4 +3,7 @@ export { getMessages } from "./get-messages.js";
3
3
  export { editMessage } from "./edit-message.js";
4
4
  export { deleteMessage } from "./delete-message.js";
5
5
  export { addReaction } from "./add-reaction.js";
6
+ export { pinMessage } from "./pin.js";
7
+ export { unpinMessage } from "./unpin.js";
8
+ export { searchMessages } from "./search.js";
6
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/messaging/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const pinMessage: ToolDefinition;
3
+ //# sourceMappingURL=pin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin.d.ts","sourceRoot":"","sources":["../../../src/tools/messaging/pin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,eAAO,MAAM,UAAU,EAAE,cAaxB,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ channel_id: snowflakeId.describe("Channel containing the message to pin"),
7
+ message_id: snowflakeId.describe("Message ID to pin"),
8
+ project: z.string().optional().describe("Project name for token resolution"),
9
+ });
10
+ export const pinMessage = {
11
+ name: "pin_message",
12
+ description: "Pin a message in a Discord channel. Channels can have up to 50 pinned messages.",
13
+ category: "messaging",
14
+ inputSchema,
15
+ permissions: ["ManageMessages"],
16
+ handle: async (input, ctx) => {
17
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
18
+ const channel = await ctx.discord.getChannel(input.channel_id, token);
19
+ const message = await channel.messages.fetch(input.message_id);
20
+ await message.pin();
21
+ return toolResult(`Pinned message ${input.message_id} in #${channel.name}`);
22
+ },
23
+ };
24
+ //# sourceMappingURL=pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pin.js","sourceRoot":"","sources":["../../../src/tools/messaging/pin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACzE,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAmB;IACxC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,iFAAiF;IAC9F,QAAQ,EAAE,WAAW;IACrB,WAAW;IACX,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;QACpB,OAAO,UAAU,CAAC,kBAAkB,KAAK,CAAC,UAAU,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const searchMessages: ToolDefinition;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/messaging/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAkBlD,eAAO,MAAM,cAAc,EAAE,cA6C5B,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { z } from "zod";
2
+ import { toolResultJson } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { resolveTarget } from "../../routing/resolver.js";
5
+ const inputSchema = z.object({
6
+ channel_id: z.string().optional().describe("Direct channel ID"),
7
+ guild_id: z.string().optional().describe("Direct guild ID"),
8
+ project: z.string().optional().describe("Project name for routing"),
9
+ channel: z.string().optional().describe("Channel alias within project"),
10
+ notification_type: z.string().optional().describe("Notification type for auto-routing"),
11
+ query: z.string().min(1).describe("Text to search for in message content"),
12
+ author_id: snowflakeId.optional().describe("Filter by author user ID"),
13
+ limit: z.number().min(1).max(100).default(50).describe("Max messages to scan (default 50)"),
14
+ before: z.string().optional().describe("Fetch messages before this message ID"),
15
+ after: z.string().optional().describe("Fetch messages after this message ID"),
16
+ });
17
+ export const searchMessages = {
18
+ name: "search_messages",
19
+ description: "Search for messages containing specific text in a channel. Scans recent messages and filters by content, optionally by author. Supports project routing.",
20
+ category: "messaging",
21
+ inputSchema,
22
+ handle: async (input, ctx) => {
23
+ const target = resolveTarget(input, ctx.config);
24
+ if ("error" in target) {
25
+ return { content: [{ type: "text", text: target.error }], isError: true };
26
+ }
27
+ const channel = await ctx.discord.getChannel(target.channelId, target.token);
28
+ const fetchOptions = { limit: input.limit };
29
+ if (input.before)
30
+ fetchOptions.before = input.before;
31
+ if (input.after)
32
+ fetchOptions.after = input.after;
33
+ const messages = await channel.messages.fetch(fetchOptions);
34
+ const queryLower = input.query.toLowerCase();
35
+ const matches = [...messages.values()]
36
+ .filter((msg) => {
37
+ if (!msg.content.toLowerCase().includes(queryLower))
38
+ return false;
39
+ if (input.author_id && msg.author.id !== input.author_id)
40
+ return false;
41
+ return true;
42
+ })
43
+ .map((msg) => ({
44
+ id: msg.id,
45
+ content: msg.content.length > 200 ? msg.content.slice(0, 200) + "..." : msg.content,
46
+ author: msg.author.tag,
47
+ author_id: msg.author.id,
48
+ timestamp: msg.createdAt.toISOString(),
49
+ pinned: msg.pinned,
50
+ }));
51
+ return toolResultJson({
52
+ channel: channel.name,
53
+ channel_id: channel.id,
54
+ query: input.query,
55
+ scanned: messages.size,
56
+ matches: matches.length,
57
+ results: matches,
58
+ });
59
+ },
60
+ };
61
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/tools/messaging/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const unpinMessage: ToolDefinition;
3
+ //# sourceMappingURL=unpin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../src/tools/messaging/unpin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,eAAO,MAAM,YAAY,EAAE,cAa1B,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ channel_id: snowflakeId.describe("Channel containing the message to unpin"),
7
+ message_id: snowflakeId.describe("Message ID to unpin"),
8
+ project: z.string().optional().describe("Project name for token resolution"),
9
+ });
10
+ export const unpinMessage = {
11
+ name: "unpin_message",
12
+ description: "Unpin a message from a Discord channel.",
13
+ category: "messaging",
14
+ inputSchema,
15
+ permissions: ["ManageMessages"],
16
+ handle: async (input, ctx) => {
17
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
18
+ const channel = await ctx.discord.getChannel(input.channel_id, token);
19
+ const message = await channel.messages.fetch(input.message_id);
20
+ await message.unpin();
21
+ return toolResult(`Unpinned message ${input.message_id} from #${channel.name}`);
22
+ },
23
+ };
24
+ //# sourceMappingURL=unpin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpin.js","sourceRoot":"","sources":["../../../src/tools/messaging/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAC3E,UAAU,EAAE,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACvD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,yCAAyC;IACtD,QAAQ,EAAE,WAAW;IACrB,WAAW;IACX,WAAW,EAAE,CAAC,gBAAgB,CAAC;IAC/B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,UAAU,CAAC,oBAAoB,KAAK,CAAC,UAAU,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ToolDefinition } from "../types.js";
2
+ export declare const archiveThread: ToolDefinition;
3
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/archive.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAWlD,eAAO,MAAM,aAAa,EAAE,cA0B3B,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { toolResult } from "../types.js";
3
+ import { snowflakeId } from "../schema.js";
4
+ import { getTokenForProject } from "../../config/index.js";
5
+ const inputSchema = z.object({
6
+ thread_id: snowflakeId.describe("Thread ID to archive"),
7
+ locked: z.boolean().default(false).describe("Whether to lock the thread (prevent new messages)"),
8
+ project: z.string().optional().describe("Project name for token resolution"),
9
+ });
10
+ export const archiveThread = {
11
+ name: "archive_thread",
12
+ description: "Archive a thread, optionally locking it to prevent new messages. Archived threads are hidden from the channel list but can be unarchived.",
13
+ category: "threads",
14
+ inputSchema,
15
+ permissions: ["ManageThreads"],
16
+ handle: async (input, ctx) => {
17
+ const token = input.project ? getTokenForProject(input.project, ctx.config) : undefined;
18
+ const channel = await ctx.discord.getChannel(input.thread_id, token);
19
+ if (!("setArchived" in channel)) {
20
+ return {
21
+ content: [{ type: "text", text: `Channel ${input.thread_id} is not a thread` }],
22
+ isError: true,
23
+ };
24
+ }
25
+ const thread = channel;
26
+ await thread.setArchived(true);
27
+ if (input.locked) {
28
+ await thread.setLocked(true);
29
+ }
30
+ return toolResult(`Archived thread "${channel.name}"${input.locked ? " (locked)" : ""}`);
31
+ },
32
+ };
33
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/tools/threads/archive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,SAAS,EAAE,WAAW,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IAChG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;CAC7E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,2IAA2I;IAC7I,QAAQ,EAAE,SAAS;IACnB,WAAW;IACX,WAAW,EAAE,CAAC,eAAe,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAErE,IAAI,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,CAAC,SAAS,kBAAkB,EAAE,CAAC;gBAC/E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,OAAc,CAAC;QAC9B,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QAED,OAAO,UAAU,CAAC,oBAAoB,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;CACF,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { createThread } from "./create-thread.js";
2
2
  export { listThreads } from "./list-threads.js";
3
+ export { archiveThread } from "./archive.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { createThread } from "./create-thread.js";
2
2
  export { listThreads } from "./list-threads.js";
3
+ export { archiveThread } from "./archive.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/threads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/threads/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export interface HttpTransportOptions {
3
+ port?: number;
4
+ }
5
+ export declare function startHttpTransport(server: McpServer, options?: HttpTransportOptions): Promise<void>;
6
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASzE,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAuFf"}
@@ -0,0 +1,81 @@
1
+ import { createServer as createHttpServer, } from "node:http";
2
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
3
+ import { logger } from "../utils/logger.js";
4
+ const CORS_HEADERS = {
5
+ "Access-Control-Allow-Origin": "*",
6
+ "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
7
+ "Access-Control-Allow-Headers": "Content-Type",
8
+ };
9
+ export async function startHttpTransport(server, options = {}) {
10
+ const port = options.port ?? 3000;
11
+ // Track active transports by session ID for message routing
12
+ const transports = new Map();
13
+ const httpServer = createHttpServer(async (req, res) => {
14
+ // Handle CORS preflight
15
+ if (req.method === "OPTIONS") {
16
+ res.writeHead(204, CORS_HEADERS);
17
+ res.end();
18
+ return;
19
+ }
20
+ // Apply CORS headers to all responses
21
+ for (const [key, value] of Object.entries(CORS_HEADERS)) {
22
+ res.setHeader(key, value);
23
+ }
24
+ const url = new URL(req.url ?? "/", `http://localhost:${port}`);
25
+ // SSE connection endpoint — client GETs this to open the stream
26
+ if (req.method === "GET" && url.pathname === "/sse") {
27
+ logger.info("SSE client connected");
28
+ const transport = new SSEServerTransport("/messages", res);
29
+ transports.set(transport.sessionId, transport);
30
+ transport.onclose = () => {
31
+ logger.info("SSE client disconnected", { sessionId: transport.sessionId });
32
+ transports.delete(transport.sessionId);
33
+ };
34
+ await server.connect(transport);
35
+ return;
36
+ }
37
+ // Message endpoint — client POSTs JSON-RPC messages here
38
+ if (req.method === "POST" && url.pathname === "/messages") {
39
+ const sessionId = url.searchParams.get("sessionId");
40
+ if (!sessionId) {
41
+ res.writeHead(400).end("Missing sessionId query parameter");
42
+ return;
43
+ }
44
+ const transport = transports.get(sessionId);
45
+ if (!transport) {
46
+ res.writeHead(404).end("Unknown session");
47
+ return;
48
+ }
49
+ await transport.handlePostMessage(req, res);
50
+ return;
51
+ }
52
+ // Health probe
53
+ if (req.method === "GET" && url.pathname === "/health") {
54
+ res.writeHead(200, { "Content-Type": "application/json" });
55
+ res.end(JSON.stringify({ status: "ok", sessions: transports.size }));
56
+ return;
57
+ }
58
+ res.writeHead(404).end("Not found");
59
+ });
60
+ // Graceful shutdown helper
61
+ const shutdown = () => {
62
+ logger.info("Shutting down HTTP transport...");
63
+ for (const transport of transports.values()) {
64
+ transport.close().catch(() => { });
65
+ }
66
+ transports.clear();
67
+ httpServer.close();
68
+ };
69
+ process.on("SIGINT", shutdown);
70
+ process.on("SIGTERM", shutdown);
71
+ await new Promise((resolve) => {
72
+ httpServer.listen(port, () => {
73
+ logger.info(`MCP server started on HTTP transport`, { port });
74
+ logger.info(` SSE endpoint: http://localhost:${port}/sse`);
75
+ logger.info(` Message endpoint: http://localhost:${port}/messages`);
76
+ logger.info(` Health endpoint: http://localhost:${port}/health`);
77
+ resolve();
78
+ });
79
+ });
80
+ }
81
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.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.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Agency-grade Discord MCP server with multi-guild project routing",
5
5
  "type": "module",
6
6
  "license": "MIT",