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,170 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { getPool, isDbConfigured } from "../util/db.js";
|
|
4
|
+
const schema = {
|
|
5
|
+
groupJid: z
|
|
6
|
+
.string()
|
|
7
|
+
.min(1)
|
|
8
|
+
.describe("Group JID (e.g. 120363xxxxxxxx@g.us)"),
|
|
9
|
+
sinceDays: z
|
|
10
|
+
.number()
|
|
11
|
+
.int()
|
|
12
|
+
.min(1)
|
|
13
|
+
.max(365)
|
|
14
|
+
.default(180)
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Lookback window in days for message history used to resolve LIDs. Default 180. " +
|
|
17
|
+
"Larger window = more LIDs resolved but slower query."),
|
|
18
|
+
onlyResolved: z
|
|
19
|
+
.boolean()
|
|
20
|
+
.default(false)
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("When true, omits participants without phone or pushName from response. " +
|
|
23
|
+
"Useful when caller only wants actionable contacts."),
|
|
24
|
+
};
|
|
25
|
+
export function registerGetGroupResolvedParticipants(server) {
|
|
26
|
+
server.registerTool("get_group_resolved_participants", {
|
|
27
|
+
title: "Get Group Resolved Participants (LID → phone + name)",
|
|
28
|
+
description: "Resolve a group's LID participants to phone JID + pushName by cross-referencing " +
|
|
29
|
+
"the Evolution Postgres Message history (key->>'participantAlt' field). " +
|
|
30
|
+
"Returns: { groupJid, total, resolved, unresolved, participants: [{ lid, phone, name, isAdmin, lastSeen }] }. " +
|
|
31
|
+
"Coverage depends on how many participants sent messages in the lookback window — " +
|
|
32
|
+
"silent members stay unresolved. Phone field is ready to use with send_text. " +
|
|
33
|
+
"Requires EVOLUTION_DB_URL env var pointing to Evolution's Postgres.",
|
|
34
|
+
inputSchema: schema,
|
|
35
|
+
}, async (args, { client }) => {
|
|
36
|
+
try {
|
|
37
|
+
if (!isDbConfigured()) {
|
|
38
|
+
return {
|
|
39
|
+
isError: true,
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: "EVOLUTION_DB_URL not configured. Set it in the MCP env to enable DB-backed " +
|
|
44
|
+
"LID resolution (e.g. postgresql://user:pass@host:5432/evolution_api).",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const pool = getPool();
|
|
50
|
+
if (!pool) {
|
|
51
|
+
return {
|
|
52
|
+
isError: true,
|
|
53
|
+
content: [
|
|
54
|
+
{ type: "text", text: "Postgres pool unavailable." },
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const groupJid = args.groupJid;
|
|
59
|
+
const sinceDays = args.sinceDays ?? 180;
|
|
60
|
+
const onlyResolved = args.onlyResolved === true;
|
|
61
|
+
const data = (await client.get(`/group/findGroupInfos/${client.instanceName}?groupJid=${encodeURIComponent(groupJid)}`));
|
|
62
|
+
const participants = Array.isArray(data.participants)
|
|
63
|
+
? data.participants
|
|
64
|
+
: [];
|
|
65
|
+
if (participants.length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
content: [
|
|
68
|
+
{
|
|
69
|
+
type: "text",
|
|
70
|
+
text: JSON.stringify({
|
|
71
|
+
groupJid,
|
|
72
|
+
subject: data.subject,
|
|
73
|
+
total: 0,
|
|
74
|
+
resolved: 0,
|
|
75
|
+
unresolved: 0,
|
|
76
|
+
participants: [],
|
|
77
|
+
}, null, 2),
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const lidIds = participants.map((p) => p.id ?? "").filter(Boolean);
|
|
83
|
+
let resolvedMap = new Map();
|
|
84
|
+
if (lidIds.length > 0) {
|
|
85
|
+
const sql = `
|
|
86
|
+
SELECT DISTINCT ON (participant)
|
|
87
|
+
participant,
|
|
88
|
+
participant_alt,
|
|
89
|
+
push_name,
|
|
90
|
+
last_seen
|
|
91
|
+
FROM (
|
|
92
|
+
SELECT
|
|
93
|
+
key->>'participant' AS participant,
|
|
94
|
+
key->>'participantAlt' AS participant_alt,
|
|
95
|
+
"pushName" AS push_name,
|
|
96
|
+
"messageTimestamp" AS last_seen
|
|
97
|
+
FROM "Message"
|
|
98
|
+
WHERE key->>'remoteJid' = $1
|
|
99
|
+
AND key->>'participant' = ANY($2::text[])
|
|
100
|
+
AND "messageTimestamp" > EXTRACT(EPOCH FROM (NOW() - ($3 || ' days')::interval))
|
|
101
|
+
AND (key->>'participantAlt' IS NOT NULL OR "pushName" IS NOT NULL)
|
|
102
|
+
AND "instanceId" = (SELECT id FROM "Instance" WHERE name = $4 LIMIT 1)
|
|
103
|
+
ORDER BY "messageTimestamp" DESC
|
|
104
|
+
) t
|
|
105
|
+
ORDER BY participant, last_seen DESC NULLS LAST
|
|
106
|
+
`;
|
|
107
|
+
const params = [groupJid, lidIds, String(sinceDays), client.instanceName];
|
|
108
|
+
const res = await pool.query(sql, params);
|
|
109
|
+
for (const row of res.rows) {
|
|
110
|
+
resolvedMap.set(row.participant, row);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const enriched = participants
|
|
114
|
+
.map((p) => {
|
|
115
|
+
const id = p.id ?? "";
|
|
116
|
+
const r = resolvedMap.get(id);
|
|
117
|
+
const phoneJid = r?.participant_alt ?? null;
|
|
118
|
+
const phone = phoneJid && phoneJid.endsWith("@s.whatsapp.net")
|
|
119
|
+
? phoneJid.split("@")[0]
|
|
120
|
+
: null;
|
|
121
|
+
const isLid = id.endsWith("@lid");
|
|
122
|
+
const fallbackPhone = !isLid && id.endsWith("@s.whatsapp.net") ? id.split("@")[0] : null;
|
|
123
|
+
const name = r?.push_name && !/^\d+$/.test(r.push_name) ? r.push_name : null;
|
|
124
|
+
return {
|
|
125
|
+
lid: id,
|
|
126
|
+
phone: phone ?? fallbackPhone,
|
|
127
|
+
name,
|
|
128
|
+
isAdmin: p.admin != null && p.admin !== "",
|
|
129
|
+
lastSeen: r?.last_seen ? Number(r.last_seen) : null,
|
|
130
|
+
};
|
|
131
|
+
})
|
|
132
|
+
.filter((p) => (onlyResolved ? p.phone || p.name : true));
|
|
133
|
+
const resolvedCount = enriched.filter((p) => p.phone).length;
|
|
134
|
+
const namedCount = enriched.filter((p) => p.name).length;
|
|
135
|
+
return {
|
|
136
|
+
content: [
|
|
137
|
+
{
|
|
138
|
+
type: "text",
|
|
139
|
+
text: JSON.stringify({
|
|
140
|
+
groupJid,
|
|
141
|
+
subject: data.subject,
|
|
142
|
+
total: participants.length,
|
|
143
|
+
resolvedPhone: resolvedCount,
|
|
144
|
+
resolvedName: namedCount,
|
|
145
|
+
unresolved: participants.length - resolvedCount,
|
|
146
|
+
sinceDays,
|
|
147
|
+
participants: enriched,
|
|
148
|
+
}, null, 2),
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
if (e instanceof McpError) {
|
|
155
|
+
return {
|
|
156
|
+
isError: true,
|
|
157
|
+
content: [{ type: "text", text: e.message }],
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
161
|
+
return {
|
|
162
|
+
isError: true,
|
|
163
|
+
content: [
|
|
164
|
+
{ type: "text", text: `DB resolution failed: ${msg}` },
|
|
165
|
+
],
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=get-group-resolved-participants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-group-resolved-participants.js","sourceRoot":"","sources":["../../src/tools/get-group-resolved-participants.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export function registerGetSettings(server) {
|
|
3
|
+
server.registerTool("get_settings", {
|
|
4
|
+
title: "Get Settings",
|
|
5
|
+
description: "Get the current settings of the selected WhatsApp instance.",
|
|
6
|
+
inputSchema: {},
|
|
7
|
+
}, async (_args, { client }) => {
|
|
8
|
+
try {
|
|
9
|
+
const data = await client.get(`/settings/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=get-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-settings.js","sourceRoot":"","sources":["../../src/tools/get-settings.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,6DAA6D;QAC1E,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,kBAAkB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YACvE,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,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import { PhoneOrJidSchema } from "../schemas.js";
|
|
4
|
+
const schema = {
|
|
5
|
+
number: PhoneOrJidSchema,
|
|
6
|
+
labelId: z.string().min(1).describe("Label ID to add or remove (get IDs from find_labels)"),
|
|
7
|
+
action: z.enum(["add", "remove"]).describe("add: assign label to chat; remove: unassign label from chat"),
|
|
8
|
+
};
|
|
9
|
+
export function registerHandleLabel(server) {
|
|
10
|
+
server.registerTool("handle_label", {
|
|
11
|
+
title: "Handle Label",
|
|
12
|
+
description: "Add or remove a WhatsApp label from a chat via the selected instance (requires WhatsApp Business).",
|
|
13
|
+
inputSchema: schema,
|
|
14
|
+
}, async (args, { client }) => {
|
|
15
|
+
try {
|
|
16
|
+
const data = await client.post(`/label/handleLabel/${client.instanceName}`, {
|
|
17
|
+
number: args.number,
|
|
18
|
+
labelId: args.labelId,
|
|
19
|
+
action: args.action,
|
|
20
|
+
});
|
|
21
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
if (e instanceof McpError)
|
|
25
|
+
return { isError: true, content: [{ type: "text", text: e.message }] };
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=handle-label.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle-label.js","sourceRoot":"","sources":["../../src/tools/handle-label.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,MAAM,GAAG;IACb,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,sDAAsD,CAAC;IAC3F,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,6DAA6D,CAAC;CAC1G,CAAC;AAEF,MAAM,UAAU,mBAAmB,CAAC,MAAoB;IACtD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,oGAAoG;QACjH,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,sBAAsB,MAAM,CAAC,YAAY,EAAE,EAAE;gBAC1E,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,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,131 @@
|
|
|
1
|
+
import { registerListInstances } from "./list-instances.js";
|
|
2
|
+
// Original tools
|
|
3
|
+
import { registerListGroups } from "./list-groups.js";
|
|
4
|
+
import { registerFindChats } from "./find-chats.js";
|
|
5
|
+
import { registerFindContacts } from "./find-contacts.js";
|
|
6
|
+
import { registerFindMessages } from "./find-messages.js";
|
|
7
|
+
import { registerGetChatHistory } from "./get-chat-history.js";
|
|
8
|
+
import { registerSendText } from "./send-text.js";
|
|
9
|
+
import { registerSendMedia } from "./send-media.js";
|
|
10
|
+
import { registerGetGroupInfo } from "./get-group-info.js";
|
|
11
|
+
import { registerGetGroupResolvedParticipants } from "./get-group-resolved-participants.js";
|
|
12
|
+
// Message
|
|
13
|
+
import { registerSendAudio } from "./send-audio.js";
|
|
14
|
+
import { registerSendSticker } from "./send-sticker.js";
|
|
15
|
+
import { registerSendLocation } from "./send-location.js";
|
|
16
|
+
import { registerSendContact } from "./send-contact.js";
|
|
17
|
+
import { registerSendReaction } from "./send-reaction.js";
|
|
18
|
+
import { registerSendPoll } from "./send-poll.js";
|
|
19
|
+
import { registerSendList } from "./send-list.js";
|
|
20
|
+
import { registerSendButton } from "./send-button.js";
|
|
21
|
+
import { registerSendStatus } from "./send-status.js";
|
|
22
|
+
// Chat
|
|
23
|
+
import { registerMarkAsRead } from "./mark-as-read.js";
|
|
24
|
+
import { registerArchiveChat } from "./archive-chat.js";
|
|
25
|
+
import { registerDeleteMessage } from "./delete-message.js";
|
|
26
|
+
import { registerFetchProfilePicture } from "./fetch-profile-picture.js";
|
|
27
|
+
import { registerDownloadMedia } from "./download-media.js";
|
|
28
|
+
import { registerSendPresence } from "./send-presence.js";
|
|
29
|
+
// Profile
|
|
30
|
+
import { registerFetchBusinessProfile } from "./fetch-business-profile.js";
|
|
31
|
+
import { registerUpdateProfileName } from "./update-profile-name.js";
|
|
32
|
+
import { registerUpdateProfileStatus } from "./update-profile-status.js";
|
|
33
|
+
import { registerUpdateProfilePicture } from "./update-profile-picture.js";
|
|
34
|
+
import { registerRemoveProfilePicture } from "./remove-profile-picture.js";
|
|
35
|
+
import { registerFetchPrivacy } from "./fetch-privacy.js";
|
|
36
|
+
import { registerUpdatePrivacy } from "./update-privacy.js";
|
|
37
|
+
// Group
|
|
38
|
+
import { registerCreateGroup } from "./create-group.js";
|
|
39
|
+
import { registerUpdateGroupSubject } from "./update-group-subject.js";
|
|
40
|
+
import { registerUpdateGroupDescription } from "./update-group-description.js";
|
|
41
|
+
import { registerUpdateGroupPicture } from "./update-group-picture.js";
|
|
42
|
+
import { registerFetchInviteCode } from "./fetch-invite-code.js";
|
|
43
|
+
import { registerRevokeInviteCode } from "./revoke-invite-code.js";
|
|
44
|
+
import { registerAcceptInvite } from "./accept-invite.js";
|
|
45
|
+
import { registerSendGroupInvite } from "./send-group-invite.js";
|
|
46
|
+
import { registerUpdateParticipants } from "./update-participants.js";
|
|
47
|
+
import { registerUpdateGroupSetting } from "./update-group-setting.js";
|
|
48
|
+
import { registerLeaveGroup } from "./leave-group.js";
|
|
49
|
+
import { registerFindGroupByInvite } from "./find-group-by-invite.js";
|
|
50
|
+
// Instance
|
|
51
|
+
import { registerConnectionState } from "./connection-state.js";
|
|
52
|
+
import { registerRestartInstance } from "./restart-instance.js";
|
|
53
|
+
import { registerLogoutInstance } from "./logout-instance.js";
|
|
54
|
+
import { registerGetSettings } from "./get-settings.js";
|
|
55
|
+
import { registerSetSettings } from "./set-settings.js";
|
|
56
|
+
// Webhook
|
|
57
|
+
import { registerFindWebhook } from "./find-webhook.js";
|
|
58
|
+
import { registerSetWebhook } from "./set-webhook.js";
|
|
59
|
+
// Label
|
|
60
|
+
import { registerFindLabels } from "./find-labels.js";
|
|
61
|
+
import { registerHandleLabel } from "./handle-label.js";
|
|
62
|
+
// Block & Misc
|
|
63
|
+
import { registerUpdateBlockStatus } from "./update-block-status.js";
|
|
64
|
+
import { registerCheckNumber } from "./check-number.js";
|
|
65
|
+
export function registerAllTools(server) {
|
|
66
|
+
registerListInstances(server);
|
|
67
|
+
// Original
|
|
68
|
+
registerListGroups(server);
|
|
69
|
+
registerFindChats(server);
|
|
70
|
+
registerFindContacts(server);
|
|
71
|
+
registerFindMessages(server);
|
|
72
|
+
registerGetChatHistory(server);
|
|
73
|
+
registerSendText(server);
|
|
74
|
+
registerSendMedia(server);
|
|
75
|
+
registerGetGroupInfo(server);
|
|
76
|
+
registerGetGroupResolvedParticipants(server);
|
|
77
|
+
// Message
|
|
78
|
+
registerSendAudio(server);
|
|
79
|
+
registerSendSticker(server);
|
|
80
|
+
registerSendLocation(server);
|
|
81
|
+
registerSendContact(server);
|
|
82
|
+
registerSendReaction(server);
|
|
83
|
+
registerSendPoll(server);
|
|
84
|
+
registerSendList(server);
|
|
85
|
+
registerSendButton(server);
|
|
86
|
+
registerSendStatus(server);
|
|
87
|
+
// Chat
|
|
88
|
+
registerMarkAsRead(server);
|
|
89
|
+
registerArchiveChat(server);
|
|
90
|
+
registerDeleteMessage(server);
|
|
91
|
+
registerFetchProfilePicture(server);
|
|
92
|
+
registerDownloadMedia(server);
|
|
93
|
+
registerSendPresence(server);
|
|
94
|
+
// Profile
|
|
95
|
+
registerFetchBusinessProfile(server);
|
|
96
|
+
registerUpdateProfileName(server);
|
|
97
|
+
registerUpdateProfileStatus(server);
|
|
98
|
+
registerUpdateProfilePicture(server);
|
|
99
|
+
registerRemoveProfilePicture(server);
|
|
100
|
+
registerFetchPrivacy(server);
|
|
101
|
+
registerUpdatePrivacy(server);
|
|
102
|
+
// Group
|
|
103
|
+
registerCreateGroup(server);
|
|
104
|
+
registerUpdateGroupSubject(server);
|
|
105
|
+
registerUpdateGroupDescription(server);
|
|
106
|
+
registerUpdateGroupPicture(server);
|
|
107
|
+
registerFetchInviteCode(server);
|
|
108
|
+
registerRevokeInviteCode(server);
|
|
109
|
+
registerAcceptInvite(server);
|
|
110
|
+
registerSendGroupInvite(server);
|
|
111
|
+
registerUpdateParticipants(server);
|
|
112
|
+
registerUpdateGroupSetting(server);
|
|
113
|
+
registerLeaveGroup(server);
|
|
114
|
+
registerFindGroupByInvite(server);
|
|
115
|
+
// Instance
|
|
116
|
+
registerConnectionState(server);
|
|
117
|
+
registerRestartInstance(server);
|
|
118
|
+
registerLogoutInstance(server);
|
|
119
|
+
registerGetSettings(server);
|
|
120
|
+
registerSetSettings(server);
|
|
121
|
+
// Webhook
|
|
122
|
+
registerFindWebhook(server);
|
|
123
|
+
registerSetWebhook(server);
|
|
124
|
+
// Label
|
|
125
|
+
registerFindLabels(server);
|
|
126
|
+
registerHandleLabel(server);
|
|
127
|
+
// Block & Misc
|
|
128
|
+
registerUpdateBlockStatus(server);
|
|
129
|
+
registerCheckNumber(server);
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 to leave (e.g. 120363000000000000@g.us)"),
|
|
5
|
+
};
|
|
6
|
+
export function registerLeaveGroup(server) {
|
|
7
|
+
server.registerTool("leave_group", {
|
|
8
|
+
title: "Leave Group",
|
|
9
|
+
description: "Leave a WhatsApp group via the selected instance.",
|
|
10
|
+
inputSchema: schema,
|
|
11
|
+
}, async (args, { client }) => {
|
|
12
|
+
try {
|
|
13
|
+
const data = await client.delete(`/group/leaveGroup/${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=leave-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"leave-group.js","sourceRoot":"","sources":["../../src/tools/leave-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,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;CAC1F,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,mDAAmD;QAChE,WAAW,EAAE,MAAM;KACpB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAC9B,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,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
const schema = {
|
|
4
|
+
search: z
|
|
5
|
+
.string()
|
|
6
|
+
.optional()
|
|
7
|
+
.describe("Case-insensitive substring match against group subject. Omit for no filter."),
|
|
8
|
+
limit: z
|
|
9
|
+
.number()
|
|
10
|
+
.int()
|
|
11
|
+
.min(1)
|
|
12
|
+
.max(500)
|
|
13
|
+
.default(50)
|
|
14
|
+
.optional()
|
|
15
|
+
.describe("Max results to return (default 50, max 500)."),
|
|
16
|
+
};
|
|
17
|
+
export function registerListGroups(server) {
|
|
18
|
+
server.registerTool("list_groups", {
|
|
19
|
+
title: "List Groups",
|
|
20
|
+
description: "List WhatsApp groups for the selected instance. Supports search and limit to prevent large payloads.",
|
|
21
|
+
inputSchema: schema,
|
|
22
|
+
}, async (args, { client, recipients }) => {
|
|
23
|
+
try {
|
|
24
|
+
const data = await client.get(`/group/fetchAllGroups/${client.instanceName}?getParticipants=false`);
|
|
25
|
+
let groups = Array.isArray(data) ? data : [];
|
|
26
|
+
// Recipient allowlist: never expose groups outside it
|
|
27
|
+
if (recipients.restricted)
|
|
28
|
+
groups = groups.filter((g) => recipients.isAllowed(g.id));
|
|
29
|
+
// Client-side search filter (Evolution API has no query filter)
|
|
30
|
+
if (args.search) {
|
|
31
|
+
const needle = args.search.toLowerCase();
|
|
32
|
+
groups = groups.filter((g) => g.subject?.toLowerCase().includes(needle));
|
|
33
|
+
}
|
|
34
|
+
// Sort by subject asc for stable results
|
|
35
|
+
groups.sort((a, b) => (a.subject ?? "").localeCompare(b.subject ?? ""));
|
|
36
|
+
// Cap results
|
|
37
|
+
const limit = args.limit ?? 50;
|
|
38
|
+
groups = groups.slice(0, limit);
|
|
39
|
+
// Normalize to compact shape — drop owner to shrink payload
|
|
40
|
+
const normalized = groups.map(({ id, subject, size }) => ({ id, subject, size }));
|
|
41
|
+
return {
|
|
42
|
+
content: [{ type: "text", text: JSON.stringify(normalized, null, 2) }],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
if (e instanceof McpError) {
|
|
47
|
+
return { isError: true, content: [{ type: "text", text: e.message }] };
|
|
48
|
+
}
|
|
49
|
+
throw e;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=list-groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-groups.js","sourceRoot":"","sources":["../../src/tools/list-groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const schema = {
|
|
3
|
+
includeState: z
|
|
4
|
+
.boolean()
|
|
5
|
+
.optional()
|
|
6
|
+
.describe("When true, also fetch the connection state (open/close/connecting) of each instance."),
|
|
7
|
+
};
|
|
8
|
+
export function registerListInstances(server) {
|
|
9
|
+
server.registerTool("list_instances", {
|
|
10
|
+
title: "List Instances",
|
|
11
|
+
description: "List the WhatsApp instances this server is allowed to use (names only) and which one is the default. " +
|
|
12
|
+
"Pass one of these names as `instance` to other tools. Set includeState=true to also get each connection state.",
|
|
13
|
+
inputSchema: schema,
|
|
14
|
+
instanceScoped: false,
|
|
15
|
+
}, async (args, { http, config }) => {
|
|
16
|
+
const instances = await Promise.all(config.instances.map(async (name) => {
|
|
17
|
+
const item = {
|
|
18
|
+
name,
|
|
19
|
+
default: name === config.defaultInstance,
|
|
20
|
+
};
|
|
21
|
+
if (args.includeState) {
|
|
22
|
+
try {
|
|
23
|
+
const data = await http
|
|
24
|
+
.forInstance(name)
|
|
25
|
+
.get(`/instance/connectionState/${name}`);
|
|
26
|
+
item.state = data?.instance?.state ?? data?.state ?? "unknown";
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
item.error = e instanceof Error ? e.message : String(e);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return item;
|
|
33
|
+
}));
|
|
34
|
+
return { content: [{ type: "text", text: JSON.stringify({ instances }, null, 2) }] };
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=list-instances.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-instances.js","sourceRoot":"","sources":["../../src/tools/list-instances.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,MAAM,GAAG;IACb,YAAY,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,sFAAsF,CAAC;CACpG,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,uGAAuG;YACvG,gHAAgH;QAClH,WAAW,EAAE,MAAM;QACnB,cAAc,EAAE,KAAK;KACtB,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,GAAG,CACjC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClC,MAAM,IAAI,GAAuE;gBAC/E,IAAI;gBACJ,OAAO,EAAE,IAAI,KAAK,MAAM,CAAC,eAAe;aACzC,CAAC;YACF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,IAAI;yBACpB,WAAW,CAAC,IAAI,CAAC;yBACjB,GAAG,CAAoD,6BAA6B,IAAI,EAAE,CAAC,CAAC;oBAC/F,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC;gBACjE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,IAAI,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CACH,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAChG,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export function registerLogoutInstance(server) {
|
|
3
|
+
server.registerTool("logout_instance", {
|
|
4
|
+
title: "Logout Instance",
|
|
5
|
+
description: "Logout the selected WhatsApp instance (disconnects and clears session — requires QR scan to reconnect).",
|
|
6
|
+
inputSchema: {},
|
|
7
|
+
}, async (_args, { client }) => {
|
|
8
|
+
try {
|
|
9
|
+
const data = await client.delete(`/instance/logout/${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=logout-instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout-instance.js","sourceRoot":"","sources":["../../src/tools/logout-instance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,UAAU,sBAAsB,CAAC,MAAoB;IACzD,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,yGAAyG;QACtH,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,oBAAoB,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC5E,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,30 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
const MessageKeySchema = z.object({
|
|
4
|
+
remoteJid: z.string().min(1).describe("JID of the chat"),
|
|
5
|
+
fromMe: z.boolean().describe("Whether the message was sent by this instance"),
|
|
6
|
+
id: z.string().min(1).describe("Message ID"),
|
|
7
|
+
});
|
|
8
|
+
const schema = {
|
|
9
|
+
readMessages: z.array(MessageKeySchema).min(1).describe("Array of message keys to mark as read"),
|
|
10
|
+
};
|
|
11
|
+
export function registerMarkAsRead(server) {
|
|
12
|
+
server.registerTool("mark_as_read", {
|
|
13
|
+
title: "Mark as Read",
|
|
14
|
+
description: "Mark one or more messages as read via the selected WhatsApp instance.",
|
|
15
|
+
inputSchema: schema,
|
|
16
|
+
}, async (args, { client }) => {
|
|
17
|
+
try {
|
|
18
|
+
const data = await client.post(`/chat/markMessageAsRead/${client.instanceName}`, {
|
|
19
|
+
readMessages: args.readMessages,
|
|
20
|
+
});
|
|
21
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
if (e instanceof McpError)
|
|
25
|
+
return { isError: true, content: [{ type: "text", text: e.message }] };
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=mark-as-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mark-as-read.js","sourceRoot":"","sources":["../../src/tools/mark-as-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACxD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IAC7E,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC7C,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG;IACb,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,uCAAuC,CAAC;CACjG,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,MAAoB;IACrD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,uEAAuE;QACpF,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,2BAA2B,MAAM,CAAC,YAAY,EAAE,EAAE;gBAC/E,YAAY,EAAE,IAAI,CAAC,YAAY;aAChC,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,19 @@
|
|
|
1
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
export function registerRemoveProfilePicture(server) {
|
|
3
|
+
server.registerTool("remove_profile_picture", {
|
|
4
|
+
title: "Remove Profile Picture",
|
|
5
|
+
description: "Remove the profile picture of the selected WhatsApp instance.",
|
|
6
|
+
inputSchema: {},
|
|
7
|
+
}, async (_args, { client }) => {
|
|
8
|
+
try {
|
|
9
|
+
const data = await client.delete(`/chat/removeProfilePicture/${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=remove-profile-picture.js.map
|