mcp-evolution 0.0.0-stage → 0.8.1

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 (211) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/LICENSE +21 -0
  3. package/README.md +379 -2
  4. package/dist/config.d.ts +23 -0
  5. package/dist/config.js +113 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/errors.d.ts +8 -0
  8. package/dist/errors.js +15 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/evolution-client.d.ts +34 -0
  11. package/dist/evolution-client.js +84 -0
  12. package/dist/evolution-client.js.map +1 -0
  13. package/dist/guards/recipients.d.ts +40 -0
  14. package/dist/guards/recipients.js +135 -0
  15. package/dist/guards/recipients.js.map +1 -0
  16. package/dist/guards/tools.d.ts +16 -0
  17. package/dist/guards/tools.js +154 -0
  18. package/dist/guards/tools.js.map +1 -0
  19. package/dist/http.d.ts +19 -0
  20. package/dist/http.js +103 -0
  21. package/dist/http.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +7 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/registry.d.ts +36 -0
  26. package/dist/registry.js +68 -0
  27. package/dist/registry.js.map +1 -0
  28. package/dist/schemas.d.ts +4 -0
  29. package/dist/schemas.js +16 -0
  30. package/dist/schemas.js.map +1 -0
  31. package/dist/server.d.ts +5 -0
  32. package/dist/server.js +74 -0
  33. package/dist/server.js.map +1 -0
  34. package/dist/tools/accept-invite.d.ts +2 -0
  35. package/dist/tools/accept-invite.js +23 -0
  36. package/dist/tools/accept-invite.js.map +1 -0
  37. package/dist/tools/archive-chat.d.ts +2 -0
  38. package/dist/tools/archive-chat.js +35 -0
  39. package/dist/tools/archive-chat.js.map +1 -0
  40. package/dist/tools/check-number.d.ts +2 -0
  41. package/dist/tools/check-number.js +25 -0
  42. package/dist/tools/check-number.js.map +1 -0
  43. package/dist/tools/connection-state.d.ts +2 -0
  44. package/dist/tools/connection-state.js +19 -0
  45. package/dist/tools/connection-state.js.map +1 -0
  46. package/dist/tools/create-group.d.ts +2 -0
  47. package/dist/tools/create-group.js +31 -0
  48. package/dist/tools/create-group.js.map +1 -0
  49. package/dist/tools/delete-message.d.ts +2 -0
  50. package/dist/tools/delete-message.js +33 -0
  51. package/dist/tools/delete-message.js.map +1 -0
  52. package/dist/tools/download-media.d.ts +2 -0
  53. package/dist/tools/download-media.js +59 -0
  54. package/dist/tools/download-media.js.map +1 -0
  55. package/dist/tools/fetch-business-profile.d.ts +2 -0
  56. package/dist/tools/fetch-business-profile.js +25 -0
  57. package/dist/tools/fetch-business-profile.js.map +1 -0
  58. package/dist/tools/fetch-invite-code.d.ts +2 -0
  59. package/dist/tools/fetch-invite-code.js +23 -0
  60. package/dist/tools/fetch-invite-code.js.map +1 -0
  61. package/dist/tools/fetch-privacy.d.ts +2 -0
  62. package/dist/tools/fetch-privacy.js +19 -0
  63. package/dist/tools/fetch-privacy.js.map +1 -0
  64. package/dist/tools/fetch-profile-picture.d.ts +2 -0
  65. package/dist/tools/fetch-profile-picture.js +25 -0
  66. package/dist/tools/fetch-profile-picture.js.map +1 -0
  67. package/dist/tools/find-chats.d.ts +2 -0
  68. package/dist/tools/find-chats.js +74 -0
  69. package/dist/tools/find-chats.js.map +1 -0
  70. package/dist/tools/find-contacts.d.ts +2 -0
  71. package/dist/tools/find-contacts.js +74 -0
  72. package/dist/tools/find-contacts.js.map +1 -0
  73. package/dist/tools/find-group-by-invite.d.ts +2 -0
  74. package/dist/tools/find-group-by-invite.js +56 -0
  75. package/dist/tools/find-group-by-invite.js.map +1 -0
  76. package/dist/tools/find-labels.d.ts +2 -0
  77. package/dist/tools/find-labels.js +22 -0
  78. package/dist/tools/find-labels.js.map +1 -0
  79. package/dist/tools/find-messages.d.ts +2 -0
  80. package/dist/tools/find-messages.js +55 -0
  81. package/dist/tools/find-messages.js.map +1 -0
  82. package/dist/tools/find-webhook.d.ts +2 -0
  83. package/dist/tools/find-webhook.js +19 -0
  84. package/dist/tools/find-webhook.js.map +1 -0
  85. package/dist/tools/get-chat-history.d.ts +2 -0
  86. package/dist/tools/get-chat-history.js +55 -0
  87. package/dist/tools/get-chat-history.js.map +1 -0
  88. package/dist/tools/get-group-info.d.ts +2 -0
  89. package/dist/tools/get-group-info.js +58 -0
  90. package/dist/tools/get-group-info.js.map +1 -0
  91. package/dist/tools/get-group-resolved-participants.d.ts +2 -0
  92. package/dist/tools/get-group-resolved-participants.js +170 -0
  93. package/dist/tools/get-group-resolved-participants.js.map +1 -0
  94. package/dist/tools/get-settings.d.ts +2 -0
  95. package/dist/tools/get-settings.js +19 -0
  96. package/dist/tools/get-settings.js.map +1 -0
  97. package/dist/tools/handle-label.d.ts +2 -0
  98. package/dist/tools/handle-label.js +30 -0
  99. package/dist/tools/handle-label.js.map +1 -0
  100. package/dist/tools/index.d.ts +2 -0
  101. package/dist/tools/index.js +131 -0
  102. package/dist/tools/index.js.map +1 -0
  103. package/dist/tools/leave-group.d.ts +2 -0
  104. package/dist/tools/leave-group.js +23 -0
  105. package/dist/tools/leave-group.js.map +1 -0
  106. package/dist/tools/list-groups.d.ts +2 -0
  107. package/dist/tools/list-groups.js +53 -0
  108. package/dist/tools/list-groups.js.map +1 -0
  109. package/dist/tools/list-instances.d.ts +2 -0
  110. package/dist/tools/list-instances.js +37 -0
  111. package/dist/tools/list-instances.js.map +1 -0
  112. package/dist/tools/logout-instance.d.ts +2 -0
  113. package/dist/tools/logout-instance.js +19 -0
  114. package/dist/tools/logout-instance.js.map +1 -0
  115. package/dist/tools/mark-as-read.d.ts +2 -0
  116. package/dist/tools/mark-as-read.js +30 -0
  117. package/dist/tools/mark-as-read.js.map +1 -0
  118. package/dist/tools/remove-profile-picture.d.ts +2 -0
  119. package/dist/tools/remove-profile-picture.js +19 -0
  120. package/dist/tools/remove-profile-picture.js.map +1 -0
  121. package/dist/tools/restart-instance.d.ts +2 -0
  122. package/dist/tools/restart-instance.js +19 -0
  123. package/dist/tools/restart-instance.js.map +1 -0
  124. package/dist/tools/revoke-invite-code.d.ts +2 -0
  125. package/dist/tools/revoke-invite-code.js +23 -0
  126. package/dist/tools/revoke-invite-code.js.map +1 -0
  127. package/dist/tools/send-audio.d.ts +2 -0
  128. package/dist/tools/send-audio.js +32 -0
  129. package/dist/tools/send-audio.js.map +1 -0
  130. package/dist/tools/send-button.d.ts +2 -0
  131. package/dist/tools/send-button.js +43 -0
  132. package/dist/tools/send-button.js.map +1 -0
  133. package/dist/tools/send-contact.d.ts +2 -0
  134. package/dist/tools/send-contact.js +36 -0
  135. package/dist/tools/send-contact.js.map +1 -0
  136. package/dist/tools/send-group-invite.d.ts +2 -0
  137. package/dist/tools/send-group-invite.js +29 -0
  138. package/dist/tools/send-group-invite.js.map +1 -0
  139. package/dist/tools/send-list.d.ts +2 -0
  140. package/dist/tools/send-list.js +47 -0
  141. package/dist/tools/send-list.js.map +1 -0
  142. package/dist/tools/send-location.d.ts +2 -0
  143. package/dist/tools/send-location.js +37 -0
  144. package/dist/tools/send-location.js.map +1 -0
  145. package/dist/tools/send-media.d.ts +2 -0
  146. package/dist/tools/send-media.js +45 -0
  147. package/dist/tools/send-media.js.map +1 -0
  148. package/dist/tools/send-poll.d.ts +2 -0
  149. package/dist/tools/send-poll.js +32 -0
  150. package/dist/tools/send-poll.js.map +1 -0
  151. package/dist/tools/send-presence.d.ts +2 -0
  152. package/dist/tools/send-presence.js +33 -0
  153. package/dist/tools/send-presence.js.map +1 -0
  154. package/dist/tools/send-reaction.d.ts +2 -0
  155. package/dist/tools/send-reaction.js +31 -0
  156. package/dist/tools/send-reaction.js.map +1 -0
  157. package/dist/tools/send-status.d.ts +2 -0
  158. package/dist/tools/send-status.js +40 -0
  159. package/dist/tools/send-status.js.map +1 -0
  160. package/dist/tools/send-sticker.d.ts +2 -0
  161. package/dist/tools/send-sticker.js +28 -0
  162. package/dist/tools/send-sticker.js.map +1 -0
  163. package/dist/tools/send-text.d.ts +2 -0
  164. package/dist/tools/send-text.js +31 -0
  165. package/dist/tools/send-text.js.map +1 -0
  166. package/dist/tools/set-settings.d.ts +2 -0
  167. package/dist/tools/set-settings.js +44 -0
  168. package/dist/tools/set-settings.js.map +1 -0
  169. package/dist/tools/set-webhook.d.ts +2 -0
  170. package/dist/tools/set-webhook.js +39 -0
  171. package/dist/tools/set-webhook.js.map +1 -0
  172. package/dist/tools/update-block-status.d.ts +2 -0
  173. package/dist/tools/update-block-status.js +28 -0
  174. package/dist/tools/update-block-status.js.map +1 -0
  175. package/dist/tools/update-group-description.d.ts +2 -0
  176. package/dist/tools/update-group-description.js +24 -0
  177. package/dist/tools/update-group-description.js.map +1 -0
  178. package/dist/tools/update-group-picture.d.ts +2 -0
  179. package/dist/tools/update-group-picture.js +24 -0
  180. package/dist/tools/update-group-picture.js.map +1 -0
  181. package/dist/tools/update-group-setting.d.ts +2 -0
  182. package/dist/tools/update-group-setting.js +25 -0
  183. package/dist/tools/update-group-setting.js.map +1 -0
  184. package/dist/tools/update-group-subject.d.ts +2 -0
  185. package/dist/tools/update-group-subject.js +24 -0
  186. package/dist/tools/update-group-subject.js.map +1 -0
  187. package/dist/tools/update-participants.d.ts +2 -0
  188. package/dist/tools/update-participants.js +26 -0
  189. package/dist/tools/update-participants.js.map +1 -0
  190. package/dist/tools/update-privacy.d.ts +2 -0
  191. package/dist/tools/update-privacy.js +45 -0
  192. package/dist/tools/update-privacy.js.map +1 -0
  193. package/dist/tools/update-profile-name.d.ts +2 -0
  194. package/dist/tools/update-profile-name.js +25 -0
  195. package/dist/tools/update-profile-name.js.map +1 -0
  196. package/dist/tools/update-profile-picture.d.ts +2 -0
  197. package/dist/tools/update-profile-picture.js +25 -0
  198. package/dist/tools/update-profile-picture.js.map +1 -0
  199. package/dist/tools/update-profile-status.d.ts +2 -0
  200. package/dist/tools/update-profile-status.js +25 -0
  201. package/dist/tools/update-profile-status.js.map +1 -0
  202. package/dist/util/db.d.ts +3 -0
  203. package/dist/util/db.js +23 -0
  204. package/dist/util/db.js.map +1 -0
  205. package/dist/util/normalize.d.ts +44 -0
  206. package/dist/util/normalize.js +68 -0
  207. package/dist/util/normalize.js.map +1 -0
  208. package/dist/util/redact.d.ts +11 -0
  209. package/dist/util/redact.js +54 -0
  210. package/dist/util/redact.js.map +1 -0
  211. package/package.json +59 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-privacy.js","sourceRoot":"","sources":["../../src/tools/fetch-privacy.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,uEAAuE;QACpF,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,8BAA8B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC3G,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFetchProfilePicture(server: ToolRegistry): void;
@@ -0,0 +1,25 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ import { PhoneOrJidSchema } from "../schemas.js";
3
+ const schema = {
4
+ number: PhoneOrJidSchema,
5
+ };
6
+ export function registerFetchProfilePicture(server) {
7
+ server.registerTool("fetch_profile_picture", {
8
+ title: "Fetch Profile Picture",
9
+ description: "Fetch the profile picture URL of a WhatsApp contact via the selected instance.",
10
+ inputSchema: schema,
11
+ }, async (args, { client }) => {
12
+ try {
13
+ const data = await client.post(`/chat/fetchProfilePictureUrl/${client.instanceName}`, {
14
+ number: args.number,
15
+ });
16
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
17
+ }
18
+ catch (e) {
19
+ if (e instanceof McpError)
20
+ return { isError: true, content: [{ type: "text", text: e.message }] };
21
+ throw e;
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=fetch-profile-picture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-profile-picture.js","sourceRoot":"","sources":["../../src/tools/fetch-profile-picture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,GAAG;IACb,MAAM,EAAE,gBAAgB;CACzB,CAAC;AAEF,MAAM,UAAU,2BAA2B,CAAC,MAAoB;IAC9D,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,gFAAgF;QAC7F,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gCAAgC,MAAM,CAAC,YAAY,EAAE,EAAE;gBACpF,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC3G,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindChats(server: ToolRegistry): void;
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ where: z
5
+ .record(z.unknown())
6
+ .optional()
7
+ .describe("Optional Prisma-style filter object (power-user). If supplied, search is ignored."),
8
+ search: z
9
+ .string()
10
+ .optional()
11
+ .describe("Convenience substring filter against pushName or remoteJid (case-insensitive). Ignored when where is provided."),
12
+ limit: z
13
+ .number()
14
+ .int()
15
+ .min(1)
16
+ .max(500)
17
+ .default(50)
18
+ .optional()
19
+ .describe("Max results to return (default 50, max 500)."),
20
+ offset: z
21
+ .number()
22
+ .int()
23
+ .min(0)
24
+ .default(0)
25
+ .optional()
26
+ .describe("Skip first N results (default 0)."),
27
+ };
28
+ export function registerFindChats(server) {
29
+ server.registerTool("find_chats", {
30
+ title: "Find Chats",
31
+ description: "Find chats for the selected instance. Supports search, limit, and offset to prevent large payloads.",
32
+ inputSchema: schema,
33
+ }, async (args, { client, recipients }) => {
34
+ try {
35
+ const limit = args.limit ?? 50;
36
+ const offset = args.offset ?? 0;
37
+ // Build Evolution request body — pass limit/offset as top-level keys (Evolution v2)
38
+ const payload = args.where
39
+ ? { where: args.where, limit, offset }
40
+ : { limit, offset };
41
+ const raw = await client.post(`/chat/findChats/${client.instanceName}`, payload);
42
+ let chats = Array.isArray(raw) ? raw : [];
43
+ // Recipient allowlist: never expose chats outside it
44
+ if (recipients.restricted)
45
+ chats = chats.filter((c) => recipients.isAllowed(c.remoteJid));
46
+ // Client-side search only when no custom where was supplied
47
+ if (!args.where && args.search) {
48
+ const needle = args.search.toLowerCase();
49
+ chats = chats.filter((c) => c.pushName?.toLowerCase().includes(needle) ||
50
+ c.remoteJid?.toLowerCase().includes(needle));
51
+ }
52
+ // Client-side safety net for limit/offset (in case Evolution ignores them)
53
+ chats = chats.slice(offset, offset + limit);
54
+ // Normalize to compact shape — drop all extra fields to shrink payload
55
+ const normalized = chats.map(({ remoteJid, pushName, name, unreadCount, updatedAt }) => ({
56
+ remoteJid,
57
+ pushName,
58
+ name,
59
+ unreadCount,
60
+ updatedAt,
61
+ }));
62
+ return {
63
+ content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
64
+ };
65
+ }
66
+ catch (e) {
67
+ if (e instanceof McpError) {
68
+ return { isError: true, content: [{ type: "text", text: e.message }] };
69
+ }
70
+ throw e;
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=find-chats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-chats.js","sourceRoot":"","sources":["../../src/tools/find-chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAW9D,MAAM,MAAM,GAAG;IACb,KAAK,EAAE,CAAC;SACL,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACnB,QAAQ,EAAE;SACV,QAAQ,CAAC,mFAAmF,CAAC;IAChG,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,gHAAgH,CAAC;IAC7H,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CAAC,8CAA8C,CAAC;IAC3D,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,mCAAmC,CAAC;CACjD,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,YAAY;QACnB,WAAW,EACT,qGAAqG;QACvG,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAEhC,oFAAoF;YACpF,MAAM,OAAO,GAA4B,IAAI,CAAC,KAAK;gBACjD,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;gBACtC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAEtB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YAEjF,IAAI,KAAK,GAAe,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAEtD,qDAAqD;YACrD,IAAI,UAAU,CAAC,UAAU;gBAAE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YAE1F,4DAA4D;YAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;gBACzC,KAAK,GAAG,KAAK,CAAC,MAAM,CAClB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;oBAC1C,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAC9C,CAAC;YACJ,CAAC;YAED,2EAA2E;YAC3E,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YAE5C,uEAAuE;YACvE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvF,SAAS;gBACT,QAAQ;gBACR,IAAI;gBACJ,WAAW;gBACX,SAAS;aACV,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAChF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClF,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindContacts(server: ToolRegistry): void;
@@ -0,0 +1,74 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ where: z
5
+ .record(z.unknown())
6
+ .optional()
7
+ .describe("Optional Prisma-style filter object (power-user). If supplied, search is ignored."),
8
+ search: z
9
+ .string()
10
+ .optional()
11
+ .describe("Convenience substring filter against pushName, name, or remoteJid (case-insensitive). Ignored when where is provided."),
12
+ limit: z
13
+ .number()
14
+ .int()
15
+ .min(1)
16
+ .max(2000)
17
+ .default(200)
18
+ .optional()
19
+ .describe("Max results to return (default 200, max 2000)."),
20
+ offset: z
21
+ .number()
22
+ .int()
23
+ .min(0)
24
+ .default(0)
25
+ .optional()
26
+ .describe("Skip first N results (default 0)."),
27
+ };
28
+ export function registerFindContacts(server) {
29
+ server.registerTool("find_contacts", {
30
+ title: "Find Contacts",
31
+ description: "Find contacts for the selected instance. Supports search (substring on pushName/name/remoteJid), limit, and offset to prevent large payloads. " +
32
+ "Returns normalized { remoteJid, pushName, profilePicUrl, isBusiness } — extra fields dropped.",
33
+ inputSchema: schema,
34
+ }, async (args, { client, recipients }) => {
35
+ try {
36
+ const limit = args.limit ?? 200;
37
+ const offset = args.offset ?? 0;
38
+ const payload = args.where
39
+ ? { where: args.where, limit, offset }
40
+ : { limit, offset };
41
+ const raw = await client.post(`/chat/findContacts/${client.instanceName}`, payload);
42
+ let contacts = Array.isArray(raw) ? raw : [];
43
+ // Recipient allowlist: never expose contacts outside it
44
+ if (recipients.restricted)
45
+ contacts = contacts.filter((c) => recipients.isAllowed(c.remoteJid));
46
+ // Client-side search only when no custom where was supplied
47
+ if (!args.where && args.search) {
48
+ const needle = args.search.toLowerCase();
49
+ contacts = contacts.filter((c) => c.pushName?.toLowerCase().includes(needle) ||
50
+ c.name?.toLowerCase().includes(needle) ||
51
+ c.remoteJid?.toLowerCase().includes(needle));
52
+ }
53
+ // Client-side safety net for limit/offset (in case Evolution ignores them)
54
+ contacts = contacts.slice(offset, offset + limit);
55
+ // Normalize to compact shape — drop everything else
56
+ const normalized = contacts.map(({ remoteJid, pushName, profilePicUrl, isBusiness }) => ({
57
+ remoteJid,
58
+ pushName,
59
+ profilePicUrl,
60
+ isBusiness,
61
+ }));
62
+ return {
63
+ content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
64
+ };
65
+ }
66
+ catch (e) {
67
+ if (e instanceof McpError) {
68
+ return { isError: true, content: [{ type: "text", text: e.message }] };
69
+ }
70
+ throw e;
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=find-contacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-contacts.js","sourceRoot":"","sources":["../../src/tools/find-contacts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindGroupByInvite(server: ToolRegistry): void;
@@ -0,0 +1,56 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ inviteCode: z.string().min(1).describe("Group invite code (the part after https://chat.whatsapp.com/)"),
5
+ includeParticipants: z
6
+ .boolean()
7
+ .default(false)
8
+ .optional()
9
+ .describe("When true, includes the full participant list in the response (may be large for big groups). " +
10
+ "Default false returns only admins + size, which covers 95% of use cases."),
11
+ };
12
+ export function registerFindGroupByInvite(server) {
13
+ server.registerTool("find_group_by_invite", {
14
+ title: "Find Group by Invite",
15
+ description: "Get group information from an invite code without joining via the selected instance. " +
16
+ "Returns { id, subject, subjectOwner, subjectTime, size, desc, descId, creation, owner, admins } by default. " +
17
+ "Set includeParticipants=true to also get the full participant list.",
18
+ inputSchema: schema,
19
+ }, async (args, { client, recipients }) => {
20
+ try {
21
+ const data = await client.get(`/group/inviteInfo/${client.instanceName}?inviteCode=${encodeURIComponent(args.inviteCode)}`);
22
+ if (recipients.restricted && !recipients.isAllowed(typeof data.id === "string" ? data.id : undefined)) {
23
+ return {
24
+ isError: true,
25
+ content: [{ type: "text", text: "This group is not in the allowed recipients for this instance." }],
26
+ };
27
+ }
28
+ const participants = Array.isArray(data.participants) ? data.participants : [];
29
+ const admins = participants
30
+ .filter((p) => p.admin != null && p.admin !== "")
31
+ .map((p) => ({ jid: p.id ?? "", admin: p.admin }));
32
+ const normalized = {
33
+ id: data.id,
34
+ subject: data.subject,
35
+ subjectOwner: data.subjectOwner,
36
+ subjectTime: data.subjectTime,
37
+ size: participants.length,
38
+ desc: data.desc,
39
+ descId: data.descId,
40
+ creation: data.creation,
41
+ owner: data.owner,
42
+ admins,
43
+ };
44
+ if (args.includeParticipants) {
45
+ normalized["participants"] = participants.map((p) => ({ jid: p.id, admin: p.admin ?? null }));
46
+ }
47
+ return { content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }] };
48
+ }
49
+ catch (e) {
50
+ if (e instanceof McpError)
51
+ return { isError: true, content: [{ type: "text", text: e.message }] };
52
+ throw e;
53
+ }
54
+ });
55
+ }
56
+ //# sourceMappingURL=find-group-by-invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-group-by-invite.js","sourceRoot":"","sources":["../../src/tools/find-group-by-invite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindLabels(server: ToolRegistry): void;
@@ -0,0 +1,22 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ export function registerFindLabels(server) {
3
+ server.registerTool("find_labels", {
4
+ title: "Find Labels",
5
+ description: "List all WhatsApp labels for the selected instance (requires WhatsApp Business). " +
6
+ "Returns normalized { id, name, color } array — nested chat blobs dropped to prevent overflow.",
7
+ inputSchema: {},
8
+ }, async (_args, { client }) => {
9
+ try {
10
+ const data = await client.get(`/label/findLabels/${client.instanceName}`);
11
+ const raw = Array.isArray(data) ? data : [];
12
+ const normalized = raw.map(({ id, name, color }) => ({ id, name, color }));
13
+ return { content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }] };
14
+ }
15
+ catch (e) {
16
+ if (e instanceof McpError)
17
+ return { isError: true, content: [{ type: "text", text: e.message }] };
18
+ throw e;
19
+ }
20
+ });
21
+ }
22
+ //# sourceMappingURL=find-labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-labels.js","sourceRoot":"","sources":["../../src/tools/find-labels.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAS9D,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,mFAAmF;YACnF,+FAA+F;QACjG,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAe,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAExD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAE3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC7F,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC3G,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindMessages(server: ToolRegistry): void;
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ import { JidSchema } from "../schemas.js";
4
+ import { normalizeMessage, extractMessages } from "../util/normalize.js";
5
+ const schema = {
6
+ remoteJid: JidSchema,
7
+ limit: z
8
+ .number()
9
+ .int()
10
+ .min(1)
11
+ .max(200)
12
+ .default(50)
13
+ .optional()
14
+ .describe("Max messages to return (default 50, max 200)."),
15
+ offset: z
16
+ .number()
17
+ .int()
18
+ .min(0)
19
+ .default(0)
20
+ .optional()
21
+ .describe("Skip first N messages (default 0)."),
22
+ };
23
+ export function registerFindMessages(server) {
24
+ server.registerTool("find_messages", {
25
+ title: "Find Messages",
26
+ description: "Find messages by remoteJid (phone number or group JID) for the selected instance. " +
27
+ "Returns normalized { id, fromMe, remoteJid, timestamp, type, text, mediaKey?, quotedMessageId? } — raw payload dropped to prevent overflow.",
28
+ inputSchema: schema,
29
+ }, async (args, { client }) => {
30
+ try {
31
+ const limit = args.limit ?? 50;
32
+ const offset = args.offset ?? 0;
33
+ const payload = {
34
+ where: { key: { remoteJid: args.remoteJid } },
35
+ limit,
36
+ offset,
37
+ };
38
+ const data = await client.post(`/chat/findMessages/${client.instanceName}`, payload);
39
+ const rawArr = extractMessages(data);
40
+ // Client-side offset/limit safety net
41
+ const sliced = rawArr.slice(offset, offset + limit);
42
+ const normalized = sliced.map((m) => normalizeMessage(m));
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
45
+ };
46
+ }
47
+ catch (e) {
48
+ if (e instanceof McpError) {
49
+ return { isError: true, content: [{ type: "text", text: e.message }] };
50
+ }
51
+ throw e;
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=find-messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-messages.js","sourceRoot":"","sources":["../../src/tools/find-messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,oFAAoF;YACpF,6IAA6I;QAC/I,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;gBAC7C,KAAK;gBACL,MAAM;aACP,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YAErF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAErC,sCAAsC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAA2C,CAAC,CAAC,CAAC;YAEpG,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAChF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClF,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFindWebhook(server: ToolRegistry): void;
@@ -0,0 +1,19 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ export function registerFindWebhook(server) {
3
+ server.registerTool("find_webhook", {
4
+ title: "Find Webhook",
5
+ description: "Get the current webhook configuration for the selected WhatsApp instance.",
6
+ inputSchema: {},
7
+ }, async (_args, { client }) => {
8
+ try {
9
+ const data = await client.get(`/webhook/find/${client.instanceName}`);
10
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
11
+ }
12
+ catch (e) {
13
+ if (e instanceof McpError)
14
+ return { isError: true, content: [{ type: "text", text: e.message }] };
15
+ throw e;
16
+ }
17
+ });
18
+ }
19
+ //# sourceMappingURL=find-webhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-webhook.js","sourceRoot":"","sources":["../../src/tools/find-webhook.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACvF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ;gBAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC3G,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerGetChatHistory(server: ToolRegistry): void;
@@ -0,0 +1,55 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ import { JidSchema } from "../schemas.js";
4
+ import { normalizeMessage, extractMessages } from "../util/normalize.js";
5
+ const schema = {
6
+ remoteJid: JidSchema,
7
+ limit: z
8
+ .number()
9
+ .int()
10
+ .min(1)
11
+ .max(200)
12
+ .default(50)
13
+ .optional()
14
+ .describe("Max messages to return (default 50, max 200)."),
15
+ offset: z
16
+ .number()
17
+ .int()
18
+ .min(0)
19
+ .default(0)
20
+ .optional()
21
+ .describe("Skip first N messages (default 0)."),
22
+ };
23
+ export function registerGetChatHistory(server) {
24
+ server.registerTool("get_chat_history", {
25
+ title: "Get Chat History",
26
+ description: "Get chat history for a specific contact or group JID. " +
27
+ "Returns normalized { id, fromMe, remoteJid, timestamp, type, text, mediaKey?, quotedMessageId? } — raw payload dropped to prevent overflow.",
28
+ inputSchema: schema,
29
+ }, async (args, { client }) => {
30
+ try {
31
+ const limit = args.limit ?? 50;
32
+ const offset = args.offset ?? 0;
33
+ const payload = {
34
+ where: { key: { remoteJid: args.remoteJid } },
35
+ limit,
36
+ offset,
37
+ };
38
+ const data = await client.post(`/chat/findMessages/${client.instanceName}`, payload);
39
+ const rawArr = extractMessages(data);
40
+ // Client-side offset/limit safety net
41
+ const sliced = rawArr.slice(offset, offset + limit);
42
+ const normalized = sliced.map((m) => normalizeMessage(m));
43
+ return {
44
+ content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
45
+ };
46
+ }
47
+ catch (e) {
48
+ if (e instanceof McpError) {
49
+ return { isError: true, content: [{ type: "text", text: e.message }] };
50
+ }
51
+ throw e;
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=get-chat-history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-chat-history.js","sourceRoot":"","sources":["../../src/tools/get-chat-history.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,MAAM,GAAG;IACb,SAAS,EAAE,SAAS;IACpB,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,EAAE;SACV,QAAQ,CAAC,+CAA+C,CAAC;IAC5D,MAAM,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,EAAE;SACV,QAAQ,CAAC,oCAAoC,CAAC;CAClD,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,wDAAwD;YACxD,6IAA6I;QAC/I,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAEhC,MAAM,OAAO,GAAG;gBACd,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;gBAC7C,KAAK;gBACL,MAAM;aACP,CAAC;YACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YAErF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAErC,sCAAsC;YACtC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;YACpD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAA2C,CAAC,CAAC,CAAC;YAEpG,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aAChF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClF,CAAC;YACD,MAAM,CAAC,CAAC;QACV,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerGetGroupInfo(server: ToolRegistry): void;
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ groupJid: z
5
+ .string()
6
+ .min(1)
7
+ .describe("The group JID (e.g. 120363xxxxxxxx@g.us)"),
8
+ includeParticipants: z
9
+ .boolean()
10
+ .default(false)
11
+ .optional()
12
+ .describe("When true, includes the full participant list in the response (may be large for big groups). " +
13
+ "Default false returns only admins + size, which covers 95% of use cases."),
14
+ };
15
+ export function registerGetGroupInfo(server) {
16
+ server.registerTool("get_group_info", {
17
+ title: "Get Group Info",
18
+ description: "Get detailed info for a specific WhatsApp group. " +
19
+ "By default returns { id, subject, subjectOwner, subjectTime, size, desc, descId, creation, owner, admins } — " +
20
+ "participant list is dropped to prevent payload overflow. " +
21
+ "Set includeParticipants=true to get the full list (use sparingly for large groups).",
22
+ inputSchema: schema,
23
+ }, async (args, { client }) => {
24
+ try {
25
+ const data = await client.get(`/group/findGroupInfos/${client.instanceName}?groupJid=${encodeURIComponent(args.groupJid)}`);
26
+ const participants = Array.isArray(data.participants) ? data.participants : [];
27
+ const admins = participants
28
+ .filter((p) => p.admin != null && p.admin !== "")
29
+ .map((p) => ({ jid: p.id ?? "", admin: p.admin }));
30
+ const normalized = {
31
+ id: data.id,
32
+ subject: data.subject,
33
+ subjectOwner: data.subjectOwner,
34
+ subjectTime: data.subjectTime,
35
+ size: participants.length,
36
+ desc: data.desc,
37
+ descId: data.descId,
38
+ creation: data.creation,
39
+ owner: data.owner,
40
+ admins,
41
+ };
42
+ if (args.includeParticipants) {
43
+ // Full list — only expose id and admin role
44
+ normalized["participants"] = participants.map((p) => ({ jid: p.id, admin: p.admin ?? null }));
45
+ }
46
+ return {
47
+ content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
48
+ };
49
+ }
50
+ catch (e) {
51
+ if (e instanceof McpError) {
52
+ return { isError: true, content: [{ type: "text", text: e.message }] };
53
+ }
54
+ throw e;
55
+ }
56
+ });
57
+ }
58
+ //# sourceMappingURL=get-group-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-group-info.js","sourceRoot":"","sources":["../../src/tools/get-group-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerGetGroupResolvedParticipants(server: ToolRegistry): void;