mcp-evolution 0.0.0-stage → 0.8.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 (211) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/LICENSE +21 -0
  3. package/README.md +377 -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 +53 -4
@@ -0,0 +1,36 @@
1
+ import { z, type ZodRawShape } from "zod";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
4
+ import type { Config } from "./config.js";
5
+ import type { EvolutionClient, InstanceClient } from "./evolution-client.js";
6
+ import { RecipientPolicy } from "./guards/recipients.js";
7
+ /** Per-call context handed to every tool handler. */
8
+ export interface ToolContext {
9
+ /** Client bound to the (allowlisted) instance chosen for this call. */
10
+ client: InstanceClient;
11
+ /** Recipient policy in force for that instance (use to filter listing results). */
12
+ recipients: RecipientPolicy;
13
+ /** Shared, stateless HTTP client (instance-agnostic helpers such as list_instances). */
14
+ http: EvolutionClient;
15
+ config: Config;
16
+ }
17
+ type ToolResult = CallToolResult;
18
+ export interface ToolDefinition<S extends ZodRawShape> {
19
+ title?: string;
20
+ description: string;
21
+ inputSchema: S;
22
+ /** false = tool is not bound to an instance (no `instance` param, no recipient checks). */
23
+ instanceScoped?: boolean;
24
+ }
25
+ export interface ToolRegistry {
26
+ registerTool<S extends ZodRawShape>(name: string, def: ToolDefinition<S>, handler: (args: z.objectOutputType<S, z.ZodTypeAny>, ctx: ToolContext) => Promise<ToolResult>): void;
27
+ }
28
+ /** Resolve which instance a call targets. Never returns a value outside the allowlist. */
29
+ export declare function resolveInstance(config: Config, requested: unknown): string;
30
+ export declare function recipientPolicyFor(config: Config, instance: string): RecipientPolicy;
31
+ /**
32
+ * Wrap an McpServer so every tool registration goes through the guards:
33
+ * tool allowlist, instance allowlist/selection, recipient allowlist and secret redaction.
34
+ */
35
+ export declare function createToolRegistry(server: McpServer, http: EvolutionClient, config: Config): ToolRegistry;
36
+ export {};
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { GuardError } from "./errors.js";
3
+ import { enforceRecipients, RecipientPolicy } from "./guards/recipients.js";
4
+ const INSTANCE_ERROR = "Instance is not configured. Use list_instances to see the allowed instances.";
5
+ /** Resolve which instance a call targets. Never returns a value outside the allowlist. */
6
+ export function resolveInstance(config, requested) {
7
+ if (requested !== undefined && requested !== null && requested !== "") {
8
+ if (typeof requested !== "string" || !config.instances.includes(requested)) {
9
+ throw new GuardError(INSTANCE_ERROR);
10
+ }
11
+ return requested;
12
+ }
13
+ if (config.defaultInstance)
14
+ return config.defaultInstance;
15
+ throw new GuardError("Multiple instances are configured and no default is set: pass the `instance` parameter " +
16
+ "(see list_instances) or set EVOLUTION_DEFAULT_INSTANCE.");
17
+ }
18
+ export function recipientPolicyFor(config, instance) {
19
+ return new RecipientPolicy(config.instanceRecipients.get(instance) ?? config.globalRecipients);
20
+ }
21
+ function redactResult(result, redact) {
22
+ return {
23
+ ...result,
24
+ content: result.content.map((c) => (c.type === "text" ? { ...c, text: redact(c.text) } : c)),
25
+ };
26
+ }
27
+ /**
28
+ * Wrap an McpServer so every tool registration goes through the guards:
29
+ * tool allowlist, instance allowlist/selection, recipient allowlist and secret redaction.
30
+ */
31
+ export function createToolRegistry(server, http, config) {
32
+ const multi = config.instances.length > 1;
33
+ const instanceParam = multi
34
+ ? z
35
+ .enum(config.instances, { errorMap: () => ({ message: INSTANCE_ERROR }) })
36
+ .optional()
37
+ .describe(config.defaultInstance
38
+ ? `WhatsApp instance to use (default: ${config.defaultInstance}). See list_instances.`
39
+ : "WhatsApp instance to use (required: no default configured). See list_instances.")
40
+ : undefined;
41
+ return {
42
+ registerTool(name, def, handler) {
43
+ if (!config.allowedTools.has(name))
44
+ return;
45
+ const scoped = def.instanceScoped !== false;
46
+ const inputSchema = scoped && instanceParam ? { ...def.inputSchema, instance: instanceParam } : def.inputSchema;
47
+ server.registerTool(name, { title: def.title, description: def.description, inputSchema }, async (rawArgs) => {
48
+ try {
49
+ const { instance: requested, ...args } = rawArgs ?? {};
50
+ const instance = scoped
51
+ ? resolveInstance(config, requested)
52
+ : (config.defaultInstance ?? config.instances[0]);
53
+ const recipients = recipientPolicyFor(config, instance);
54
+ if (scoped)
55
+ enforceRecipients(name, args, recipients);
56
+ const client = http.forInstance(instance);
57
+ const result = await handler(args, { client, recipients, http, config });
58
+ return redactResult(result, http.redact);
59
+ }
60
+ catch (e) {
61
+ const msg = e instanceof Error ? e.message : String(e);
62
+ return { isError: true, content: [{ type: "text", text: http.redact(msg) }] };
63
+ }
64
+ });
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const JidSchema: z.ZodString;
3
+ export declare const PhoneOrJidSchema: z.ZodString;
4
+ export declare const LimitSchema: z.ZodOptional<z.ZodNumber>;
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export const JidSchema = z
3
+ .string()
4
+ .min(1)
5
+ .describe("WhatsApp JID (e.g. 5511999999999@s.whatsapp.net or group@g.us)");
6
+ export const PhoneOrJidSchema = z
7
+ .string()
8
+ .min(1)
9
+ .describe("Recipient JID or phone number (e.g. 5511999999999 or group@g.us)");
10
+ export const LimitSchema = z
11
+ .number()
12
+ .int()
13
+ .positive()
14
+ .optional()
15
+ .describe("Max items to return (default 50)");
16
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,QAAQ,CAAC,gEAAgE,CAAC,CAAC;AAE9E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,QAAQ,CAAC,kEAAkE,CAAC,CAAC;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,EAAE;KACR,GAAG,EAAE;KACL,QAAQ,EAAE;KACV,QAAQ,EAAE;KACV,QAAQ,CAAC,kCAAkC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type Config } from "./config.js";
3
+ /** Build a fully-guarded MCP server for the given config (no transport attached). */
4
+ export declare function createServer(config: Config): McpServer;
5
+ export declare function startServer(): Promise<void>;
package/dist/server.js ADDED
@@ -0,0 +1,74 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createRequire } from "node:module";
4
+ import { parseConfig, ConfigError } from "./config.js";
5
+ import { EvolutionClient } from "./evolution-client.js";
6
+ import { createHttpApp, loadHttpOptions } from "./http.js";
7
+ import { createToolRegistry } from "./registry.js";
8
+ import { registerAllTools } from "./tools/index.js";
9
+ const require = createRequire(import.meta.url);
10
+ const { version } = require("../package.json");
11
+ /** Build a fully-guarded MCP server for the given config (no transport attached). */
12
+ export function createServer(config) {
13
+ const http = new EvolutionClient({
14
+ apiUrl: config.apiUrl,
15
+ apiKey: config.apiKey,
16
+ basicAuth: config.basicAuth,
17
+ dbUrl: config.dbUrl,
18
+ instances: config.instances,
19
+ });
20
+ const server = new McpServer({ name: "mcp-evolution", version });
21
+ registerAllTools(createToolRegistry(server, http, config));
22
+ return server;
23
+ }
24
+ function describeConfig(config) {
25
+ return (`instances: ${config.instances.join(", ")}; ` +
26
+ `default: ${config.defaultInstance ?? "none"}; tools: ${config.allowedTools.size}; ` +
27
+ `recipient allowlist: ${config.globalRecipients || config.instanceRecipients.size > 0 ? "on" : "off"}`);
28
+ }
29
+ export async function startServer() {
30
+ const mode = (process.env.MCP_TRANSPORT?.trim() || "stdio").toLowerCase();
31
+ if (mode === "http")
32
+ return startHttpServer();
33
+ if (mode !== "stdio") {
34
+ console.error(`[mcp-evolution] MCP_TRANSPORT must be "stdio" or "http" (got "${mode}")`);
35
+ process.exit(1);
36
+ }
37
+ const config = parseConfig();
38
+ const server = createServer(config);
39
+ const transport = new StdioServerTransport();
40
+ // Graceful shutdown — close transport cleanly on SIGINT/SIGTERM
41
+ const shutdown = async (signal) => {
42
+ console.error(`[mcp-evolution] Received ${signal}, shutting down...`);
43
+ await server.close();
44
+ process.exit(0);
45
+ };
46
+ process.on("SIGINT", () => void shutdown("SIGINT"));
47
+ process.on("SIGTERM", () => void shutdown("SIGTERM"));
48
+ await server.connect(transport);
49
+ console.error(`[mcp-evolution] Started (${describeConfig(config)})`);
50
+ }
51
+ async function startHttpServer() {
52
+ const config = parseConfig();
53
+ let opts;
54
+ try {
55
+ opts = loadHttpOptions(process.env);
56
+ }
57
+ catch (err) {
58
+ if (err instanceof ConfigError) {
59
+ console.error(`[mcp-evolution] ${err.message}`);
60
+ process.exit(1);
61
+ }
62
+ throw err;
63
+ }
64
+ const app = createHttpApp(() => createServer(config), opts);
65
+ const shutdown = (signal) => {
66
+ console.error(`[mcp-evolution] Received ${signal}, shutting down...`);
67
+ app.close(() => process.exit(0));
68
+ };
69
+ process.on("SIGINT", () => shutdown("SIGINT"));
70
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
71
+ await new Promise((resolve) => app.listen(opts.port, opts.host, resolve));
72
+ console.error(`[mcp-evolution] HTTP listening on ${opts.host}:${opts.port}${opts.path} (${describeConfig(config)})`);
73
+ }
74
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAoB,MAAM,WAAW,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,OAAO,CACL,cAAc,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;QAC7C,YAAY,MAAM,CAAC,eAAe,IAAI,MAAM,YAAY,MAAM,CAAC,YAAY,CAAC,IAAI,IAAI;QACpF,wBAAwB,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CACvG,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC1E,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,eAAe,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,iEAAiE,IAAI,IAAI,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE7C,gEAAgE;IAChE,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;QACvD,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,oBAAoB,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEtD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,4BAA4B,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACvE,CAAC;AAED,KAAK,UAAU,eAAe;IAC5B,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,IAAI,IAAiB,CAAC;IACtB,IAAI,CAAC;QACH,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAQ,EAAE;QACxC,OAAO,CAAC,KAAK,CAAC,4BAA4B,MAAM,oBAAoB,CAAC,CAAC;QACtE,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAEjD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACvH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerAcceptInvite(server: ToolRegistry): void;
@@ -0,0 +1,23 @@
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
+ };
6
+ export function registerAcceptInvite(server) {
7
+ server.registerTool("accept_invite", {
8
+ title: "Accept Invite",
9
+ description: "Accept a WhatsApp group invite by invite code via the selected instance.",
10
+ inputSchema: schema,
11
+ }, async (args, { client }) => {
12
+ try {
13
+ const data = await client.get(`/group/acceptInviteCode/${client.instanceName}?inviteCode=${encodeURIComponent(args.inviteCode)}`);
14
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
15
+ }
16
+ catch (e) {
17
+ if (e instanceof McpError)
18
+ return { isError: true, content: [{ type: "text", text: e.message }] };
19
+ throw e;
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=accept-invite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accept-invite.js","sourceRoot":"","sources":["../../src/tools/accept-invite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+DAA+D,CAAC;CACxG,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,MAAoB;IACvD,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,2BAA2B,MAAM,CAAC,YAAY,eAAe,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CACnG,CAAC;YACF,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 registerArchiveChat(server: ToolRegistry): void;
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ lastMessage: z.object({
5
+ key: z.object({
6
+ remoteJid: z.string().optional(),
7
+ fromMe: z.boolean().optional(),
8
+ id: z.string().optional(),
9
+ }),
10
+ }).describe("Last message object of the chat"),
11
+ chat: z.string().min(1).describe("JID of the chat to archive/unarchive"),
12
+ archive: z.boolean().describe("true to archive, false to unarchive"),
13
+ };
14
+ export function registerArchiveChat(server) {
15
+ server.registerTool("archive_chat", {
16
+ title: "Archive Chat",
17
+ description: "Archive or unarchive a WhatsApp chat via the selected instance.",
18
+ inputSchema: schema,
19
+ }, async (args, { client }) => {
20
+ try {
21
+ const data = await client.post(`/chat/archiveChat/${client.instanceName}`, {
22
+ lastMessage: args.lastMessage,
23
+ chat: args.chat,
24
+ archive: args.archive,
25
+ });
26
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
27
+ }
28
+ catch (e) {
29
+ if (e instanceof McpError)
30
+ return { isError: true, content: [{ type: "text", text: e.message }] };
31
+ throw e;
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=archive-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-chat.js","sourceRoot":"","sources":["../../src/tools/archive-chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;YACZ,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;YAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC1B,CAAC;KACH,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACxE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACrE,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,iEAAiE;QAC9E,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,qBAAqB,MAAM,CAAC,YAAY,EAAE,EAAE;gBACzE,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,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 registerCheckNumber(server: ToolRegistry): void;
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ numbers: z.array(z.string().min(1)).min(1).describe("Array of phone numbers to check (e.g. ['5511999999999']). Returns whether each number has WhatsApp and their JID."),
5
+ };
6
+ export function registerCheckNumber(server) {
7
+ server.registerTool("check_number", {
8
+ title: "Check Number",
9
+ description: "Check whether phone numbers have WhatsApp accounts. Returns exists, jid, and number for each.",
10
+ inputSchema: schema,
11
+ }, async (args, { client }) => {
12
+ try {
13
+ const data = await client.post(`/chat/whatsappNumbers/${client.instanceName}`, {
14
+ numbers: args.numbers,
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=check-number.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-number.js","sourceRoot":"","sources":["../../src/tools/check-number.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CACjD,mHAAmH,CACpH;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,+FAA+F;QAC5G,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,yBAAyB,MAAM,CAAC,YAAY,EAAE,EAAE;gBAC7E,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,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 registerConnectionState(server: ToolRegistry): void;
@@ -0,0 +1,19 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ export function registerConnectionState(server) {
3
+ server.registerTool("connection_state", {
4
+ title: "Connection State",
5
+ description: "Get the current connection state of the selected WhatsApp instance (open, close, connecting).",
6
+ inputSchema: {},
7
+ }, async (_args, { client }) => {
8
+ try {
9
+ const data = await client.get(`/instance/connectionState/${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=connection-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-state.js","sourceRoot":"","sources":["../../src/tools/connection-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,+FAA+F;QAC5G,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,6BAA6B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAClF,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 registerCreateGroup(server: ToolRegistry): void;
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ subject: z.string().min(1).describe("Group name/subject"),
5
+ description: z.string().optional().describe("Optional group description"),
6
+ participants: z.array(z.string().min(1)).min(1).describe("Array of participant phone numbers or JIDs"),
7
+ };
8
+ export function registerCreateGroup(server) {
9
+ server.registerTool("create_group", {
10
+ title: "Create Group",
11
+ description: "Create a new WhatsApp group via the selected instance.",
12
+ inputSchema: schema,
13
+ }, async (args, { client }) => {
14
+ try {
15
+ const payload = {
16
+ subject: args.subject,
17
+ participants: args.participants,
18
+ };
19
+ if (args.description)
20
+ payload["description"] = args.description;
21
+ const data = await client.post(`/group/create/${client.instanceName}`, payload);
22
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
23
+ }
24
+ catch (e) {
25
+ if (e instanceof McpError)
26
+ return { isError: true, content: [{ type: "text", text: e.message }] };
27
+ throw e;
28
+ }
29
+ });
30
+ }
31
+ //# sourceMappingURL=create-group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-group.js","sourceRoot":"","sources":["../../src/tools/create-group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;IACzE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;CACvG,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAA4B;gBACvC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,CAAC;YACF,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YAChF,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 registerDeleteMessage(server: ToolRegistry): void;
@@ -0,0 +1,33 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ id: z.string().min(1).describe("Message ID to delete"),
5
+ remoteJid: z.string().min(1).describe("JID of the chat containing the message"),
6
+ fromMe: z.boolean().describe("Whether the message was sent by this instance"),
7
+ participant: z.string().optional().describe("Participant JID (required for group messages)"),
8
+ };
9
+ export function registerDeleteMessage(server) {
10
+ server.registerTool("delete_message", {
11
+ title: "Delete Message",
12
+ description: "Delete a message for everyone via the selected WhatsApp instance.",
13
+ inputSchema: schema,
14
+ }, async (args, { client }) => {
15
+ try {
16
+ const payload = {
17
+ id: args.id,
18
+ remoteJid: args.remoteJid,
19
+ fromMe: args.fromMe,
20
+ };
21
+ if (args.participant)
22
+ payload["participant"] = args.participant;
23
+ const data = await client.delete(`/chat/deleteMessageForEveryone/${client.instanceName}`, payload);
24
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
25
+ }
26
+ catch (e) {
27
+ if (e instanceof McpError)
28
+ return { isError: true, content: [{ type: "text", text: e.message }] };
29
+ throw e;
30
+ }
31
+ });
32
+ }
33
+ //# sourceMappingURL=delete-message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-message.js","sourceRoot":"","sources":["../../src/tools/delete-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACtD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC/E,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC7E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CAC7F,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,mEAAmE;QAChF,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAA4B;gBACvC,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC;YACF,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;YAChE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,kCAAkC,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,CAAC,CAAC;YACnG,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 registerDownloadMedia(server: ToolRegistry): void;
@@ -0,0 +1,59 @@
1
+ import { z } from "zod";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
5
+ import { mimeToExt } from "../util/normalize.js";
6
+ const MEDIA_DIR = "/tmp/mcp-evolution-media";
7
+ const schema = {
8
+ message: z.object({
9
+ key: z.object({
10
+ remoteJid: z.string().min(1).describe("Chat JID"),
11
+ fromMe: z.boolean().describe("Whether sent by this instance"),
12
+ id: z.string().min(1).describe("Message ID"),
13
+ }),
14
+ }).describe("Message object containing the media"),
15
+ convertToMp4: z.boolean().optional().describe("Convert audio to mp4 format (forwarded to Evolution)"),
16
+ };
17
+ export function registerDownloadMedia(server) {
18
+ server.registerTool("download_media", {
19
+ title: "Download Media",
20
+ description: "Download media from a WhatsApp message and write it to disk. " +
21
+ "Returns { path, mimetype, size, messageId } — NOT raw base64 (prevents context overflow). " +
22
+ "File is written to /tmp/mcp-evolution-media/<instance>-<messageId>.<ext>. " +
23
+ "Caller is responsible for cleanup (rm the file when done).",
24
+ inputSchema: schema,
25
+ }, async (args, { client }) => {
26
+ try {
27
+ const payload = { message: args.message };
28
+ if (args.convertToMp4 !== undefined)
29
+ payload["convertToMp4"] = args.convertToMp4;
30
+ const data = await client.post(`/chat/getBase64FromMediaMessage/${client.instanceName}`, payload);
31
+ const base64 = data.base64;
32
+ if (!base64) {
33
+ return {
34
+ isError: true,
35
+ content: [{ type: "text", text: "Evolution returned no base64 data for this message." }],
36
+ };
37
+ }
38
+ const mimetype = data.mimetype ?? data.mediaType ?? "application/octet-stream";
39
+ const ext = mimeToExt(mimetype);
40
+ const messageId = args.message.key.id;
41
+ const filename = `${client.instanceName}-${messageId}.${ext}`;
42
+ const filePath = path.join(MEDIA_DIR, filename);
43
+ // Ensure media dir exists (mode 0700 — only root/owner readable)
44
+ await fs.mkdir(MEDIA_DIR, { recursive: true, mode: 0o700 });
45
+ const buf = Buffer.from(base64, "base64");
46
+ await fs.writeFile(filePath, buf, { mode: 0o600 });
47
+ const result = { path: filePath, mimetype, size: buf.length, messageId };
48
+ return {
49
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
50
+ };
51
+ }
52
+ catch (e) {
53
+ if (e instanceof McpError)
54
+ return { isError: true, content: [{ type: "text", text: e.message }] };
55
+ throw e;
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=download-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download-media.js","sourceRoot":"","sources":["../../src/tools/download-media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistry } from "../registry.js";
2
+ export declare function registerFetchBusinessProfile(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 registerFetchBusinessProfile(server) {
7
+ server.registerTool("fetch_business_profile", {
8
+ title: "Fetch Business Profile",
9
+ description: "Fetch the WhatsApp Business profile information of a contact via the selected instance.",
10
+ inputSchema: schema,
11
+ }, async (args, { client }) => {
12
+ try {
13
+ const data = await client.post(`/chat/fetchBusinessProfile/${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-business-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-business-profile.js","sourceRoot":"","sources":["../../src/tools/fetch-business-profile.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,4BAA4B,CAAC,MAAoB;IAC/D,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EAAE,yFAAyF;QACtG,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,8BAA8B,MAAM,CAAC,YAAY,EAAE,EAAE;gBAClF,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 registerFetchInviteCode(server: ToolRegistry): void;
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
3
+ const schema = {
4
+ groupJid: z.string().min(1).describe("Group JID (e.g. 120363000000000000@g.us)"),
5
+ };
6
+ export function registerFetchInviteCode(server) {
7
+ server.registerTool("fetch_invite_code", {
8
+ title: "Fetch Invite Code",
9
+ description: "Fetch the invite code/link for a WhatsApp group via the selected instance.",
10
+ inputSchema: schema,
11
+ }, async (args, { client }) => {
12
+ try {
13
+ const data = await client.get(`/group/inviteCode/${client.instanceName}?groupJid=${encodeURIComponent(args.groupJid)}`);
14
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
15
+ }
16
+ catch (e) {
17
+ if (e instanceof McpError)
18
+ return { isError: true, content: [{ type: "text", text: e.message }] };
19
+ throw e;
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=fetch-invite-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-invite-code.js","sourceRoot":"","sources":["../../src/tools/fetch-invite-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,MAAM,GAAG;IACb,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,0CAA0C,CAAC;CACjF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAC3B,qBAAqB,MAAM,CAAC,YAAY,aAAa,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CACzF,CAAC;YACF,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 registerFetchPrivacy(server: ToolRegistry): void;
@@ -0,0 +1,19 @@
1
+ import { McpError } from "@modelcontextprotocol/sdk/types.js";
2
+ export function registerFetchPrivacy(server) {
3
+ server.registerTool("fetch_privacy", {
4
+ title: "Fetch Privacy Settings",
5
+ description: "Fetch the current privacy settings of the selected WhatsApp instance.",
6
+ inputSchema: {},
7
+ }, async (_args, { client }) => {
8
+ try {
9
+ const data = await client.get(`/chat/fetchPrivacySettings/${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=fetch-privacy.js.map