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.
- package/CHANGELOG.md +62 -0
- package/LICENSE +21 -0
- package/README.md +377 -2
- package/dist/config.d.ts +23 -0
- package/dist/config.js +113 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/evolution-client.d.ts +34 -0
- package/dist/evolution-client.js +84 -0
- package/dist/evolution-client.js.map +1 -0
- package/dist/guards/recipients.d.ts +40 -0
- package/dist/guards/recipients.js +135 -0
- package/dist/guards/recipients.js.map +1 -0
- package/dist/guards/tools.d.ts +16 -0
- package/dist/guards/tools.js +154 -0
- package/dist/guards/tools.js.map +1 -0
- package/dist/http.d.ts +19 -0
- package/dist/http.js +103 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +36 -0
- package/dist/registry.js +68 -0
- package/dist/registry.js.map +1 -0
- package/dist/schemas.d.ts +4 -0
- package/dist/schemas.js +16 -0
- package/dist/schemas.js.map +1 -0
- package/dist/server.d.ts +5 -0
- package/dist/server.js +74 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/accept-invite.d.ts +2 -0
- package/dist/tools/accept-invite.js +23 -0
- package/dist/tools/accept-invite.js.map +1 -0
- package/dist/tools/archive-chat.d.ts +2 -0
- package/dist/tools/archive-chat.js +35 -0
- package/dist/tools/archive-chat.js.map +1 -0
- package/dist/tools/check-number.d.ts +2 -0
- package/dist/tools/check-number.js +25 -0
- package/dist/tools/check-number.js.map +1 -0
- package/dist/tools/connection-state.d.ts +2 -0
- package/dist/tools/connection-state.js +19 -0
- package/dist/tools/connection-state.js.map +1 -0
- package/dist/tools/create-group.d.ts +2 -0
- package/dist/tools/create-group.js +31 -0
- package/dist/tools/create-group.js.map +1 -0
- package/dist/tools/delete-message.d.ts +2 -0
- package/dist/tools/delete-message.js +33 -0
- package/dist/tools/delete-message.js.map +1 -0
- package/dist/tools/download-media.d.ts +2 -0
- package/dist/tools/download-media.js +59 -0
- package/dist/tools/download-media.js.map +1 -0
- package/dist/tools/fetch-business-profile.d.ts +2 -0
- package/dist/tools/fetch-business-profile.js +25 -0
- package/dist/tools/fetch-business-profile.js.map +1 -0
- package/dist/tools/fetch-invite-code.d.ts +2 -0
- package/dist/tools/fetch-invite-code.js +23 -0
- package/dist/tools/fetch-invite-code.js.map +1 -0
- package/dist/tools/fetch-privacy.d.ts +2 -0
- package/dist/tools/fetch-privacy.js +19 -0
- package/dist/tools/fetch-privacy.js.map +1 -0
- package/dist/tools/fetch-profile-picture.d.ts +2 -0
- package/dist/tools/fetch-profile-picture.js +25 -0
- package/dist/tools/fetch-profile-picture.js.map +1 -0
- package/dist/tools/find-chats.d.ts +2 -0
- package/dist/tools/find-chats.js +74 -0
- package/dist/tools/find-chats.js.map +1 -0
- package/dist/tools/find-contacts.d.ts +2 -0
- package/dist/tools/find-contacts.js +74 -0
- package/dist/tools/find-contacts.js.map +1 -0
- package/dist/tools/find-group-by-invite.d.ts +2 -0
- package/dist/tools/find-group-by-invite.js +56 -0
- package/dist/tools/find-group-by-invite.js.map +1 -0
- package/dist/tools/find-labels.d.ts +2 -0
- package/dist/tools/find-labels.js +22 -0
- package/dist/tools/find-labels.js.map +1 -0
- package/dist/tools/find-messages.d.ts +2 -0
- package/dist/tools/find-messages.js +55 -0
- package/dist/tools/find-messages.js.map +1 -0
- package/dist/tools/find-webhook.d.ts +2 -0
- package/dist/tools/find-webhook.js +19 -0
- package/dist/tools/find-webhook.js.map +1 -0
- package/dist/tools/get-chat-history.d.ts +2 -0
- package/dist/tools/get-chat-history.js +55 -0
- package/dist/tools/get-chat-history.js.map +1 -0
- package/dist/tools/get-group-info.d.ts +2 -0
- package/dist/tools/get-group-info.js +58 -0
- package/dist/tools/get-group-info.js.map +1 -0
- package/dist/tools/get-group-resolved-participants.d.ts +2 -0
- package/dist/tools/get-group-resolved-participants.js +170 -0
- package/dist/tools/get-group-resolved-participants.js.map +1 -0
- package/dist/tools/get-settings.d.ts +2 -0
- package/dist/tools/get-settings.js +19 -0
- package/dist/tools/get-settings.js.map +1 -0
- package/dist/tools/handle-label.d.ts +2 -0
- package/dist/tools/handle-label.js +30 -0
- package/dist/tools/handle-label.js.map +1 -0
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +131 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/leave-group.d.ts +2 -0
- package/dist/tools/leave-group.js +23 -0
- package/dist/tools/leave-group.js.map +1 -0
- package/dist/tools/list-groups.d.ts +2 -0
- package/dist/tools/list-groups.js +53 -0
- package/dist/tools/list-groups.js.map +1 -0
- package/dist/tools/list-instances.d.ts +2 -0
- package/dist/tools/list-instances.js +37 -0
- package/dist/tools/list-instances.js.map +1 -0
- package/dist/tools/logout-instance.d.ts +2 -0
- package/dist/tools/logout-instance.js +19 -0
- package/dist/tools/logout-instance.js.map +1 -0
- package/dist/tools/mark-as-read.d.ts +2 -0
- package/dist/tools/mark-as-read.js +30 -0
- package/dist/tools/mark-as-read.js.map +1 -0
- package/dist/tools/remove-profile-picture.d.ts +2 -0
- package/dist/tools/remove-profile-picture.js +19 -0
- package/dist/tools/remove-profile-picture.js.map +1 -0
- package/dist/tools/restart-instance.d.ts +2 -0
- package/dist/tools/restart-instance.js +19 -0
- package/dist/tools/restart-instance.js.map +1 -0
- package/dist/tools/revoke-invite-code.d.ts +2 -0
- package/dist/tools/revoke-invite-code.js +23 -0
- package/dist/tools/revoke-invite-code.js.map +1 -0
- package/dist/tools/send-audio.d.ts +2 -0
- package/dist/tools/send-audio.js +32 -0
- package/dist/tools/send-audio.js.map +1 -0
- package/dist/tools/send-button.d.ts +2 -0
- package/dist/tools/send-button.js +43 -0
- package/dist/tools/send-button.js.map +1 -0
- package/dist/tools/send-contact.d.ts +2 -0
- package/dist/tools/send-contact.js +36 -0
- package/dist/tools/send-contact.js.map +1 -0
- package/dist/tools/send-group-invite.d.ts +2 -0
- package/dist/tools/send-group-invite.js +29 -0
- package/dist/tools/send-group-invite.js.map +1 -0
- package/dist/tools/send-list.d.ts +2 -0
- package/dist/tools/send-list.js +47 -0
- package/dist/tools/send-list.js.map +1 -0
- package/dist/tools/send-location.d.ts +2 -0
- package/dist/tools/send-location.js +37 -0
- package/dist/tools/send-location.js.map +1 -0
- package/dist/tools/send-media.d.ts +2 -0
- package/dist/tools/send-media.js +45 -0
- package/dist/tools/send-media.js.map +1 -0
- package/dist/tools/send-poll.d.ts +2 -0
- package/dist/tools/send-poll.js +32 -0
- package/dist/tools/send-poll.js.map +1 -0
- package/dist/tools/send-presence.d.ts +2 -0
- package/dist/tools/send-presence.js +33 -0
- package/dist/tools/send-presence.js.map +1 -0
- package/dist/tools/send-reaction.d.ts +2 -0
- package/dist/tools/send-reaction.js +31 -0
- package/dist/tools/send-reaction.js.map +1 -0
- package/dist/tools/send-status.d.ts +2 -0
- package/dist/tools/send-status.js +40 -0
- package/dist/tools/send-status.js.map +1 -0
- package/dist/tools/send-sticker.d.ts +2 -0
- package/dist/tools/send-sticker.js +28 -0
- package/dist/tools/send-sticker.js.map +1 -0
- package/dist/tools/send-text.d.ts +2 -0
- package/dist/tools/send-text.js +31 -0
- package/dist/tools/send-text.js.map +1 -0
- package/dist/tools/set-settings.d.ts +2 -0
- package/dist/tools/set-settings.js +44 -0
- package/dist/tools/set-settings.js.map +1 -0
- package/dist/tools/set-webhook.d.ts +2 -0
- package/dist/tools/set-webhook.js +39 -0
- package/dist/tools/set-webhook.js.map +1 -0
- package/dist/tools/update-block-status.d.ts +2 -0
- package/dist/tools/update-block-status.js +28 -0
- package/dist/tools/update-block-status.js.map +1 -0
- package/dist/tools/update-group-description.d.ts +2 -0
- package/dist/tools/update-group-description.js +24 -0
- package/dist/tools/update-group-description.js.map +1 -0
- package/dist/tools/update-group-picture.d.ts +2 -0
- package/dist/tools/update-group-picture.js +24 -0
- package/dist/tools/update-group-picture.js.map +1 -0
- package/dist/tools/update-group-setting.d.ts +2 -0
- package/dist/tools/update-group-setting.js +25 -0
- package/dist/tools/update-group-setting.js.map +1 -0
- package/dist/tools/update-group-subject.d.ts +2 -0
- package/dist/tools/update-group-subject.js +24 -0
- package/dist/tools/update-group-subject.js.map +1 -0
- package/dist/tools/update-participants.d.ts +2 -0
- package/dist/tools/update-participants.js +26 -0
- package/dist/tools/update-participants.js.map +1 -0
- package/dist/tools/update-privacy.d.ts +2 -0
- package/dist/tools/update-privacy.js +45 -0
- package/dist/tools/update-privacy.js.map +1 -0
- package/dist/tools/update-profile-name.d.ts +2 -0
- package/dist/tools/update-profile-name.js +25 -0
- package/dist/tools/update-profile-name.js.map +1 -0
- package/dist/tools/update-profile-picture.d.ts +2 -0
- package/dist/tools/update-profile-picture.js +25 -0
- package/dist/tools/update-profile-picture.js.map +1 -0
- package/dist/tools/update-profile-status.d.ts +2 -0
- package/dist/tools/update-profile-status.js +25 -0
- package/dist/tools/update-profile-status.js.map +1 -0
- package/dist/util/db.d.ts +3 -0
- package/dist/util/db.js +23 -0
- package/dist/util/db.js.map +1 -0
- package/dist/util/normalize.d.ts +44 -0
- package/dist/util/normalize.js +68 -0
- package/dist/util/normalize.js.map +1 -0
- package/dist/util/redact.d.ts +11 -0
- package/dist/util/redact.js +54 -0
- package/dist/util/redact.js.map +1 -0
- package/package.json +53 -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,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,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":"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"}
|
|
@@ -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,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,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,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,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,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,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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"}
|