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,34 @@
1
+ import { type Redactor } from "./util/redact.js";
2
+ export interface EvolutionClientOptions {
3
+ apiUrl: string;
4
+ apiKey: string;
5
+ basicAuth?: string;
6
+ /** Instances this client may address. Omit to allow any (tests only). */
7
+ instances?: readonly string[];
8
+ /** Extra secrets to mask in error messages (e.g. DB URL). */
9
+ dbUrl?: string;
10
+ }
11
+ /**
12
+ * Stateless HTTP client for Evolution API. It holds only immutable connection settings;
13
+ * the target instance is chosen per call via forInstance(), checked against the allowlist.
14
+ */
15
+ export declare class EvolutionClient {
16
+ private readonly baseUrl;
17
+ private readonly apiKey;
18
+ private readonly basicAuth?;
19
+ private readonly instances?;
20
+ readonly redact: Redactor;
21
+ constructor(opts: EvolutionClientOptions);
22
+ /** Immutable view bound to one allowlisted instance. */
23
+ forInstance(instance: string): InstanceClient;
24
+ request<T = unknown>(method: string, path: string, body?: unknown): Promise<T>;
25
+ }
26
+ /** Per-call, per-instance client handed to tool handlers. */
27
+ export declare class InstanceClient {
28
+ private readonly http;
29
+ readonly instanceName: string;
30
+ constructor(http: EvolutionClient, instanceName: string);
31
+ get<T = unknown>(path: string): Promise<T>;
32
+ post<T = unknown>(path: string, body: unknown): Promise<T>;
33
+ delete<T = unknown>(path: string, body?: unknown): Promise<T>;
34
+ }
@@ -0,0 +1,84 @@
1
+ import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
2
+ import { GuardError } from "./errors.js";
3
+ import { createRedactor } from "./util/redact.js";
4
+ /**
5
+ * Stateless HTTP client for Evolution API. It holds only immutable connection settings;
6
+ * the target instance is chosen per call via forInstance(), checked against the allowlist.
7
+ */
8
+ export class EvolutionClient {
9
+ baseUrl;
10
+ apiKey;
11
+ basicAuth;
12
+ instances;
13
+ redact;
14
+ constructor(opts) {
15
+ // Strip trailing slash to keep URL building consistent
16
+ this.baseUrl = opts.apiUrl.replace(/\/$/, "");
17
+ this.apiKey = opts.apiKey;
18
+ this.basicAuth = opts.basicAuth;
19
+ this.instances = opts.instances ? new Set(opts.instances) : undefined;
20
+ this.redact = createRedactor({
21
+ apiKey: opts.apiKey,
22
+ basicAuth: opts.basicAuth,
23
+ apiUrl: opts.apiUrl,
24
+ dbUrl: opts.dbUrl,
25
+ });
26
+ }
27
+ /** Immutable view bound to one allowlisted instance. */
28
+ forInstance(instance) {
29
+ if (this.instances && !this.instances.has(instance)) {
30
+ throw new GuardError(`Instance "${instance}" is not configured. Use list_instances to see the allowed ones.`);
31
+ }
32
+ return new InstanceClient(this, instance);
33
+ }
34
+ async request(method, path, body) {
35
+ const url = `${this.baseUrl}${path}`;
36
+ const headers = {
37
+ apikey: this.apiKey,
38
+ "Content-Type": "application/json",
39
+ };
40
+ if (this.basicAuth)
41
+ headers.Authorization = `Basic ${this.basicAuth}`;
42
+ let res;
43
+ try {
44
+ res = await fetch(url, {
45
+ method,
46
+ headers,
47
+ body: body !== undefined ? JSON.stringify(body) : undefined,
48
+ });
49
+ }
50
+ catch (err) {
51
+ const msg = err instanceof Error ? err.message : String(err);
52
+ throw new McpError(ErrorCode.InternalError, this.redact(`Evolution API request failed: ${msg}`));
53
+ }
54
+ const text = await res.text();
55
+ if (!res.ok) {
56
+ throw new McpError(ErrorCode.InternalError, this.redact(`Evolution API error ${res.status}: ${text}`));
57
+ }
58
+ try {
59
+ return JSON.parse(text);
60
+ }
61
+ catch {
62
+ return text;
63
+ }
64
+ }
65
+ }
66
+ /** Per-call, per-instance client handed to tool handlers. */
67
+ export class InstanceClient {
68
+ http;
69
+ instanceName;
70
+ constructor(http, instanceName) {
71
+ this.http = http;
72
+ this.instanceName = instanceName;
73
+ }
74
+ get(path) {
75
+ return this.http.request("GET", path);
76
+ }
77
+ post(path, body) {
78
+ return this.http.request("POST", path, body);
79
+ }
80
+ delete(path, body) {
81
+ return this.http.request("DELETE", path, body);
82
+ }
83
+ }
84
+ //# sourceMappingURL=evolution-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolution-client.js","sourceRoot":"","sources":["../src/evolution-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Recipient allowlist.
3
+ *
4
+ * Values are compared by their numeric identity: the local part before "@" (without a
5
+ * ":device" suffix), digits only. Accepted forms: "5511999999999", "+55 (11) 99999-9999",
6
+ * "5511999999999@s.whatsapp.net", "...@c.us", "123456789012345@lid", "120363...@g.us".
7
+ * Brazilian mobiles: list them in full (55 DD 9XXXXXXXX); a legacy JID without the extra "9"
8
+ * (55 DD XXXXXXXX@s.whatsapp.net, common for area codes >= 31) is then matched too.
9
+ * "*@g.us" admits every group (any "...@g.us" JID) while direct chats stay restricted to the list.
10
+ */
11
+ export type RecipientRule = {
12
+ unrestricted: true;
13
+ } | {
14
+ unrestricted: false;
15
+ keys: ReadonlySet<string>;
16
+ allGroups: boolean;
17
+ };
18
+ /** Returns the comparable keys for a recipient value, or null if it is not a recognisable id. */
19
+ export declare function recipientKeys(value: string): string[] | null;
20
+ /** Canonical (digits-only) form, or null. */
21
+ export declare function normalizeRecipient(value: string): string | null;
22
+ /**
23
+ * Env var name holding the per-instance override:
24
+ * EVOLUTION_ALLOWED_RECIPIENTS__ + instance upper-cased with every non [A-Z0-9] char → "_".
25
+ * e.g. "billy-franklim.2" → EVOLUTION_ALLOWED_RECIPIENTS__BILLY_FRANKLIM_2
26
+ */
27
+ export declare function recipientEnvName(instance: string): string;
28
+ /** Parse a comma-separated allowlist. "*" means unrestricted; "*@g.us" admits every group. */
29
+ export declare function parseRecipientList(raw: string, envName: string): RecipientRule;
30
+ export declare class RecipientPolicy {
31
+ private readonly rule?;
32
+ constructor(rule?: RecipientRule | undefined);
33
+ get restricted(): boolean;
34
+ isAllowed(value: string | undefined | null): boolean;
35
+ assertAllowed(values: string[]): void;
36
+ }
37
+ /** Recursively collect every recipient-like value from tool arguments. */
38
+ export declare function collectRecipients(args: unknown): string[];
39
+ /** Enforce the recipient allowlist for one tool call. No-op when unrestricted. */
40
+ export declare function enforceRecipients(tool: string, args: Record<string, unknown>, policy: RecipientPolicy): void;
@@ -0,0 +1,135 @@
1
+ import { ConfigError, GuardError } from "../errors.js";
2
+ const ALL_GROUPS = "*@g.us";
3
+ const PHONE_DOMAINS = new Set(["", "s.whatsapp.net", "c.us"]);
4
+ const OTHER_DOMAINS = new Set(["lid", "g.us"]);
5
+ /** Keys that identify a chat/recipient anywhere inside tool arguments. */
6
+ const RECIPIENT_KEYS = new Set([
7
+ "number",
8
+ "numbers",
9
+ "remoteJid",
10
+ "jid",
11
+ "groupJid",
12
+ "chat",
13
+ "participants",
14
+ "statusJidList",
15
+ ]);
16
+ /** Returns the comparable keys for a recipient value, or null if it is not a recognisable id. */
17
+ export function recipientKeys(value) {
18
+ const trimmed = value.trim().toLowerCase();
19
+ const at = trimmed.indexOf("@");
20
+ const local = at === -1 ? trimmed : trimmed.slice(0, at);
21
+ const domain = at === -1 ? "" : trimmed.slice(at + 1);
22
+ if (!PHONE_DOMAINS.has(domain) && !OTHER_DOMAINS.has(domain))
23
+ return null;
24
+ const digits = local.split(":")[0].replace(/\D/g, "");
25
+ if (!digits)
26
+ return null;
27
+ const keys = [digits];
28
+ if (PHONE_DOMAINS.has(domain)) {
29
+ // Legacy BR JID without the mobile "9" (55 DD XXXXXXXX) also matches 55 DD 9XXXXXXXX.
30
+ // One direction only, so a 12-digit (landline) entry never admits a 13-digit mobile.
31
+ const legacy = /^55(\d{2})(\d{8})$/.exec(digits);
32
+ if (legacy)
33
+ keys.push(`55${legacy[1]}9${legacy[2]}`);
34
+ }
35
+ return keys;
36
+ }
37
+ /** Canonical (digits-only) form, or null. */
38
+ export function normalizeRecipient(value) {
39
+ return recipientKeys(value)?.[0] ?? null;
40
+ }
41
+ /**
42
+ * Env var name holding the per-instance override:
43
+ * EVOLUTION_ALLOWED_RECIPIENTS__ + instance upper-cased with every non [A-Z0-9] char → "_".
44
+ * e.g. "billy-franklim.2" → EVOLUTION_ALLOWED_RECIPIENTS__BILLY_FRANKLIM_2
45
+ */
46
+ export function recipientEnvName(instance) {
47
+ return `EVOLUTION_ALLOWED_RECIPIENTS__${instance.toUpperCase().replace(/[^A-Z0-9]/g, "_")}`;
48
+ }
49
+ /** Parse a comma-separated allowlist. "*" means unrestricted; "*@g.us" admits every group. */
50
+ export function parseRecipientList(raw, envName) {
51
+ const entries = raw.split(",").map((s) => s.trim()).filter(Boolean);
52
+ if (entries.length === 1 && entries[0] === "*")
53
+ return { unrestricted: true };
54
+ const keys = new Set();
55
+ let allGroups = false;
56
+ for (const entry of entries) {
57
+ if (entry.toLowerCase() === ALL_GROUPS) {
58
+ allGroups = true;
59
+ continue;
60
+ }
61
+ // Store only the canonical form; Brazilian 9-digit variants are expanded on the
62
+ // value side, and only for phone JIDs (never for @lid / @g.us).
63
+ const k = normalizeRecipient(entry);
64
+ if (!k)
65
+ throw new ConfigError(`${envName} has an invalid entry "${entry}"`);
66
+ keys.add(k);
67
+ }
68
+ if (keys.size === 0 && !allGroups)
69
+ throw new ConfigError(`${envName} is set but lists no recipients`);
70
+ return { unrestricted: false, keys, allGroups };
71
+ }
72
+ export class RecipientPolicy {
73
+ rule;
74
+ constructor(rule) {
75
+ this.rule = rule;
76
+ }
77
+ get restricted() {
78
+ return this.rule !== undefined && !this.rule.unrestricted;
79
+ }
80
+ isAllowed(value) {
81
+ if (!this.rule || this.rule.unrestricted)
82
+ return true;
83
+ if (!value)
84
+ return false;
85
+ if (this.rule.allGroups && value.trim().toLowerCase().endsWith("@g.us") && recipientKeys(value))
86
+ return true;
87
+ const keys = recipientKeys(value);
88
+ const allowed = this.rule.keys;
89
+ return keys !== null && keys.some((k) => allowed.has(k));
90
+ }
91
+ assertAllowed(values) {
92
+ for (const v of values) {
93
+ if (!this.isAllowed(v)) {
94
+ throw new GuardError(`Recipient "${v}" is not allowed for this instance (EVOLUTION_ALLOWED_RECIPIENTS).`);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ /** Recursively collect every recipient-like value from tool arguments. */
100
+ export function collectRecipients(args) {
101
+ const out = [];
102
+ const visit = (node, key) => {
103
+ if (Array.isArray(node)) {
104
+ node.forEach((item) => visit(item, key));
105
+ return;
106
+ }
107
+ if (typeof node === "string") {
108
+ if (key !== undefined && RECIPIENT_KEYS.has(key))
109
+ out.push(node);
110
+ return;
111
+ }
112
+ if (node && typeof node === "object") {
113
+ for (const [k, v] of Object.entries(node))
114
+ visit(v, k);
115
+ }
116
+ };
117
+ visit(args);
118
+ return out;
119
+ }
120
+ /** Enforce the recipient allowlist for one tool call. No-op when unrestricted. */
121
+ export function enforceRecipients(tool, args, policy) {
122
+ if (!policy.restricted)
123
+ return;
124
+ if (tool === "accept_invite") {
125
+ throw new GuardError("accept_invite is not available while EVOLUTION_ALLOWED_RECIPIENTS is set.");
126
+ }
127
+ if (tool === "send_status") {
128
+ const list = args["statusJidList"];
129
+ if (!Array.isArray(list) || list.length === 0) {
130
+ throw new GuardError("send_status requires an explicit statusJidList while EVOLUTION_ALLOWED_RECIPIENTS is set.");
131
+ }
132
+ }
133
+ policy.assertAllowed(collectRecipients(args));
134
+ }
135
+ //# sourceMappingURL=recipients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../src/guards/recipients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** Every tool this server knows how to register. */
2
+ export declare const ALL_TOOLS: readonly ["list_instances", "connection_state", "list_groups", "find_chats", "find_contacts", "find_messages", "find_labels", "find_webhook", "find_group_by_invite", "get_chat_history", "get_group_info", "get_group_resolved_participants", "get_settings", "check_number", "download_media", "fetch_business_profile", "fetch_invite_code", "fetch_privacy", "fetch_profile_picture", "send_text", "send_media", "send_audio", "send_sticker", "send_location", "send_contact", "send_reaction", "send_poll", "send_list", "send_button", "send_presence", "send_group_invite", "send_status", "mark_as_read", "archive_chat", "handle_label", "delete_message", "update_profile_name", "update_profile_status", "update_profile_picture", "remove_profile_picture", "update_privacy", "update_block_status", "create_group", "update_group_subject", "update_group_description", "update_group_picture", "update_group_setting", "update_participants", "revoke_invite_code", "accept_invite", "leave_group", "restart_instance", "logout_instance", "set_settings", "set_webhook"];
3
+ export type ToolName = (typeof ALL_TOOLS)[number];
4
+ /**
5
+ * Tools disabled unless named explicitly in EVOLUTION_ALLOWED_TOOLS (or via @dangerous).
6
+ * They change account/group state irreversibly, broadcast, or redirect traffic.
7
+ */
8
+ export declare const DANGEROUS_TOOLS: readonly ToolName[];
9
+ export declare const TOOL_GROUPS: Readonly<Record<string, readonly ToolName[]>>;
10
+ export declare function isDangerous(tool: string): boolean;
11
+ /**
12
+ * Resolve EVOLUTION_ALLOWED_TOOLS into the set of tools to register.
13
+ * - unset/blank → every non-dangerous tool (@default)
14
+ * - set → exactly the listed tools/groups; unknown names are a startup error.
15
+ */
16
+ export declare function resolveAllowedTools(raw: string | undefined): Set<string>;
@@ -0,0 +1,154 @@
1
+ import { ConfigError } from "../errors.js";
2
+ /** Every tool this server knows how to register. */
3
+ export const ALL_TOOLS = [
4
+ // Read
5
+ "list_instances",
6
+ "connection_state",
7
+ "list_groups",
8
+ "find_chats",
9
+ "find_contacts",
10
+ "find_messages",
11
+ "find_labels",
12
+ "find_webhook",
13
+ "find_group_by_invite",
14
+ "get_chat_history",
15
+ "get_group_info",
16
+ "get_group_resolved_participants",
17
+ "get_settings",
18
+ "check_number",
19
+ "download_media",
20
+ "fetch_business_profile",
21
+ "fetch_invite_code",
22
+ "fetch_privacy",
23
+ "fetch_profile_picture",
24
+ // Send / interact
25
+ "send_text",
26
+ "send_media",
27
+ "send_audio",
28
+ "send_sticker",
29
+ "send_location",
30
+ "send_contact",
31
+ "send_reaction",
32
+ "send_poll",
33
+ "send_list",
34
+ "send_button",
35
+ "send_presence",
36
+ "send_group_invite",
37
+ "send_status",
38
+ "mark_as_read",
39
+ "archive_chat",
40
+ "handle_label",
41
+ // State-changing / administrative
42
+ "delete_message",
43
+ "update_profile_name",
44
+ "update_profile_status",
45
+ "update_profile_picture",
46
+ "remove_profile_picture",
47
+ "update_privacy",
48
+ "update_block_status",
49
+ "create_group",
50
+ "update_group_subject",
51
+ "update_group_description",
52
+ "update_group_picture",
53
+ "update_group_setting",
54
+ "update_participants",
55
+ "revoke_invite_code",
56
+ "accept_invite",
57
+ "leave_group",
58
+ "restart_instance",
59
+ "logout_instance",
60
+ "set_settings",
61
+ "set_webhook",
62
+ ];
63
+ /**
64
+ * Tools disabled unless named explicitly in EVOLUTION_ALLOWED_TOOLS (or via @dangerous).
65
+ * They change account/group state irreversibly, broadcast, or redirect traffic.
66
+ */
67
+ export const DANGEROUS_TOOLS = [
68
+ "send_status", // broadcasts to all contacts; can drop all linked devices (evolution-api #2196)
69
+ "delete_message",
70
+ "update_privacy",
71
+ "update_profile_name",
72
+ "update_profile_status",
73
+ "update_profile_picture",
74
+ "remove_profile_picture",
75
+ "update_block_status",
76
+ "create_group",
77
+ "update_group_subject",
78
+ "update_group_description",
79
+ "update_group_picture",
80
+ "update_group_setting",
81
+ "update_participants",
82
+ "revoke_invite_code",
83
+ "accept_invite",
84
+ "leave_group",
85
+ "restart_instance",
86
+ "logout_instance",
87
+ "set_settings",
88
+ "set_webhook", // can redirect every incoming message to an arbitrary URL
89
+ ];
90
+ const DANGEROUS = new Set(DANGEROUS_TOOLS);
91
+ export const TOOL_GROUPS = {
92
+ "@read": [
93
+ "list_instances",
94
+ "connection_state",
95
+ "list_groups",
96
+ "find_chats",
97
+ "find_contacts",
98
+ "find_messages",
99
+ "find_labels",
100
+ "find_webhook",
101
+ "find_group_by_invite",
102
+ "get_chat_history",
103
+ "get_group_info",
104
+ "get_group_resolved_participants",
105
+ "get_settings",
106
+ "check_number",
107
+ "download_media",
108
+ "fetch_business_profile",
109
+ "fetch_invite_code",
110
+ "fetch_privacy",
111
+ "fetch_profile_picture",
112
+ ],
113
+ "@send": ["send_text", "send_media", "send_audio", "send_presence", "mark_as_read"],
114
+ "@default": ALL_TOOLS.filter((t) => !DANGEROUS.has(t)),
115
+ "@dangerous": DANGEROUS_TOOLS,
116
+ };
117
+ export function isDangerous(tool) {
118
+ return DANGEROUS.has(tool);
119
+ }
120
+ /**
121
+ * Resolve EVOLUTION_ALLOWED_TOOLS into the set of tools to register.
122
+ * - unset/blank → every non-dangerous tool (@default)
123
+ * - set → exactly the listed tools/groups; unknown names are a startup error.
124
+ */
125
+ export function resolveAllowedTools(raw) {
126
+ if (!raw || !raw.trim())
127
+ return new Set(TOOL_GROUPS["@default"]);
128
+ const known = new Set(ALL_TOOLS);
129
+ const result = new Set();
130
+ const unknown = [];
131
+ for (const token of raw.split(",").map((s) => s.trim()).filter(Boolean)) {
132
+ if (token.startsWith("@")) {
133
+ const group = TOOL_GROUPS[token];
134
+ if (!group)
135
+ unknown.push(token);
136
+ else
137
+ group.forEach((t) => result.add(t));
138
+ }
139
+ else if (known.has(token)) {
140
+ result.add(token);
141
+ }
142
+ else {
143
+ unknown.push(token);
144
+ }
145
+ }
146
+ if (unknown.length > 0) {
147
+ throw new ConfigError(`EVOLUTION_ALLOWED_TOOLS has unknown entries: ${unknown.join(", ")}. ` +
148
+ `Groups: ${Object.keys(TOOL_GROUPS).join(", ")}`);
149
+ }
150
+ if (result.size === 0)
151
+ throw new ConfigError("EVOLUTION_ALLOWED_TOOLS resolved to no tools");
152
+ return result;
153
+ }
154
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/guards/tools.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import { type Server } from "node:http";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ export interface HttpOptions {
4
+ port: number;
5
+ host: string;
6
+ /** Path the MCP endpoint is served on (default "/mcp"). */
7
+ path: string;
8
+ /** Bearer token every MCP request must present. Always required. */
9
+ authToken: string;
10
+ }
11
+ /** Parse HTTP transport options from env. Throws ConfigError. */
12
+ export declare function loadHttpOptions(env?: NodeJS.ProcessEnv): HttpOptions;
13
+ /** Constant-time check of the `Authorization: Bearer <token>` header. */
14
+ export declare function isAuthorized(header: string | undefined, token: string): boolean;
15
+ /**
16
+ * Build the HTTP server. Stateless Streamable HTTP: every POST gets a fresh
17
+ * MCP server + transport, so there is no session state to leak between clients.
18
+ */
19
+ export declare function createHttpApp(buildServer: () => McpServer, opts: HttpOptions): Server;
package/dist/http.js ADDED
@@ -0,0 +1,103 @@
1
+ import { createServer as createHttpServer } from "node:http";
2
+ import { createHash, timingSafeEqual } from "node:crypto";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { ConfigError } from "./errors.js";
5
+ const MIN_TOKEN_LENGTH = 32;
6
+ const MAX_BODY_BYTES = 25 * 1024 * 1024; // media payloads can be large base64 strings
7
+ /** Parse HTTP transport options from env. Throws ConfigError. */
8
+ export function loadHttpOptions(env = process.env) {
9
+ const authToken = env.MCP_AUTH_TOKEN?.trim();
10
+ if (!authToken) {
11
+ throw new ConfigError("MCP_AUTH_TOKEN is required when MCP_TRANSPORT=http (the endpoint can send WhatsApp messages)");
12
+ }
13
+ if (authToken.length < MIN_TOKEN_LENGTH) {
14
+ throw new ConfigError(`MCP_AUTH_TOKEN must be at least ${MIN_TOKEN_LENGTH} characters`);
15
+ }
16
+ const port = Number(env.PORT?.trim() || "3000");
17
+ if (!Number.isInteger(port) || port <= 0 || port > 65535)
18
+ throw new ConfigError("PORT must be a valid TCP port");
19
+ let path = env.MCP_HTTP_PATH?.trim() || "/mcp";
20
+ if (!path.startsWith("/"))
21
+ path = `/${path}`;
22
+ return { port, host: env.HOST?.trim() || "0.0.0.0", path, authToken };
23
+ }
24
+ function digest(value) {
25
+ return createHash("sha256").update(value).digest();
26
+ }
27
+ /** Constant-time check of the `Authorization: Bearer <token>` header. */
28
+ export function isAuthorized(header, token) {
29
+ const match = /^Bearer\s+(.+)$/i.exec(header ?? "");
30
+ if (!match)
31
+ return false;
32
+ return timingSafeEqual(digest((match[1] ?? "").trim()), digest(token));
33
+ }
34
+ function sendJson(res, status, body, headers = {}) {
35
+ res.writeHead(status, { "Content-Type": "application/json", ...headers });
36
+ res.end(JSON.stringify(body));
37
+ }
38
+ function jsonRpcError(res, status, message, headers) {
39
+ sendJson(res, status, { jsonrpc: "2.0", error: { code: -32000, message }, id: null }, headers);
40
+ }
41
+ async function readJsonBody(req) {
42
+ const chunks = [];
43
+ let size = 0;
44
+ for await (const chunk of req) {
45
+ size += chunk.length;
46
+ if (size > MAX_BODY_BYTES)
47
+ throw new Error("Request body too large");
48
+ chunks.push(chunk);
49
+ }
50
+ const raw = Buffer.concat(chunks).toString("utf8");
51
+ return raw ? JSON.parse(raw) : undefined;
52
+ }
53
+ /**
54
+ * Build the HTTP server. Stateless Streamable HTTP: every POST gets a fresh
55
+ * MCP server + transport, so there is no session state to leak between clients.
56
+ */
57
+ export function createHttpApp(buildServer, opts) {
58
+ return createHttpServer(async (req, res) => {
59
+ const url = new URL(req.url ?? "/", "http://localhost");
60
+ if (url.pathname === "/health" && req.method === "GET") {
61
+ sendJson(res, 200, { status: "ok" });
62
+ return;
63
+ }
64
+ if (url.pathname !== opts.path) {
65
+ sendJson(res, 404, { error: "Not found" });
66
+ return;
67
+ }
68
+ if (!isAuthorized(req.headers.authorization, opts.authToken)) {
69
+ jsonRpcError(res, 401, "Unauthorized", { "WWW-Authenticate": 'Bearer realm="mcp-evolution"' });
70
+ return;
71
+ }
72
+ if (req.method !== "POST") {
73
+ // Stateless mode: no server-initiated SSE stream and no sessions to delete.
74
+ jsonRpcError(res, 405, "Method not allowed", { Allow: "POST" });
75
+ return;
76
+ }
77
+ let body;
78
+ try {
79
+ body = await readJsonBody(req);
80
+ }
81
+ catch (err) {
82
+ const tooLarge = err instanceof Error && err.message === "Request body too large";
83
+ jsonRpcError(res, tooLarge ? 413 : 400, tooLarge ? "Request body too large" : "Invalid JSON body");
84
+ return;
85
+ }
86
+ const server = buildServer();
87
+ const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
88
+ res.on("close", () => {
89
+ void transport.close();
90
+ void server.close();
91
+ });
92
+ try {
93
+ await server.connect(transport);
94
+ await transport.handleRequest(req, res, body);
95
+ }
96
+ catch (err) {
97
+ console.error("[mcp-evolution] Error handling MCP request:", err instanceof Error ? err.message : err);
98
+ if (!res.headersSent)
99
+ jsonRpcError(res, 500, "Internal server error");
100
+ }
101
+ });
102
+ }
103
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { startServer } from "./server.js";
3
+ startServer().catch((err) => {
4
+ console.error("[mcp-evolution] Fatal error:", err);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACnC,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}