@lizzythelizard/whatsapp-mcp 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +157 -33
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +78 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/dataDir.d.ts +4 -0
  7. package/dist/dataDir.d.ts.map +1 -0
  8. package/dist/dataDir.js +20 -0
  9. package/dist/dataDir.js.map +1 -0
  10. package/dist/extTypes.d.ts +41 -0
  11. package/dist/extTypes.d.ts.map +1 -0
  12. package/dist/extTypes.js +222 -0
  13. package/dist/extTypes.js.map +1 -0
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/logger.d.ts +10 -0
  18. package/dist/logger.d.ts.map +1 -0
  19. package/dist/logger.js +15 -0
  20. package/dist/logger.js.map +1 -0
  21. package/dist/{main.d.ts → mcp.d.ts} +1 -1
  22. package/dist/mcp.d.ts.map +1 -0
  23. package/dist/{main.js → mcp.js} +8 -24
  24. package/dist/mcp.js.map +1 -0
  25. package/dist/store.d.ts +17 -21
  26. package/dist/store.d.ts.map +1 -1
  27. package/dist/store.js +44 -32
  28. package/dist/store.js.map +1 -1
  29. package/dist/sync.d.ts +9 -4
  30. package/dist/sync.d.ts.map +1 -1
  31. package/dist/sync.js +51 -17
  32. package/dist/sync.js.map +1 -1
  33. package/dist/tools/authTools.d.ts.map +1 -1
  34. package/dist/tools/authTools.js +31 -23
  35. package/dist/tools/authTools.js.map +1 -1
  36. package/dist/tools/chatTools.d.ts.map +1 -1
  37. package/dist/tools/chatTools.js +15 -6
  38. package/dist/tools/chatTools.js.map +1 -1
  39. package/dist/tools/common.d.ts +3 -3
  40. package/dist/tools/common.d.ts.map +1 -1
  41. package/dist/tools/common.js +16 -8
  42. package/dist/tools/common.js.map +1 -1
  43. package/dist/tools/contactTools.d.ts.map +1 -1
  44. package/dist/tools/contactTools.js +8 -2
  45. package/dist/tools/contactTools.js.map +1 -1
  46. package/dist/tools/messageTools.d.ts.map +1 -1
  47. package/dist/tools/messageTools.js +18 -5
  48. package/dist/tools/messageTools.js.map +1 -1
  49. package/package.json +10 -16
  50. package/dist/main.d.ts.map +0 -1
  51. package/dist/main.js.map +0 -1
@@ -1,44 +1,52 @@
1
1
  import { toCallError } from './common.js';
2
- import QRCode from 'qrcode';
2
+ import z from 'zod';
3
3
  export function registerAuthTools(server, store, sync) {
4
- server.registerTool('get_auth_qr', { description: 'Get a QR code for WhatsApp authentication' }, async () => {
4
+ server.registerTool('get_auth_qr', { description: 'Get a QR code to authenticate with WhatsApp. Call this tool when authentication is required.', outputSchema: QrCodeResultSchema }, async () => {
5
5
  try {
6
- const status = sync.getStatus();
6
+ let status = sync.getStatus();
7
+ if (status.type === 'closed')
8
+ await sync.start();
9
+ status = sync.getStatus();
10
+ if (status.type === 'closed')
11
+ throw new Error('WhatsApp sync is closed. Please restart the server.');
7
12
  if (status.type !== 'needAuth')
8
13
  throw new Error('Authentication is not required at this time.');
9
- const pngBuffer = await QRCode.toBuffer(status.qr, { type: 'png', width: 400, margin: 2 });
10
14
  return {
11
- content: [
12
- { type: 'text', text: qrExplanation },
13
- { type: 'image', data: pngBuffer.toString('base64'), mimeType: 'image/png' },
14
- { type: 'text', text: status.qr },
15
- ],
15
+ structuredContent: {
16
+ url: `https://public-api.qr-code-generator.com/v1/create/extended?image_format=PNG&image_width=300&qr_code_text=${encodeURIComponent(status.qr)}&foreground_color=%23000000&background_color=%23FFFFFF&frame_name=no-frame`,
17
+ code: status.qr,
18
+ },
19
+ content: [],
16
20
  isError: false,
17
21
  };
18
22
  }
19
23
  catch (e) {
20
- return toCallError(e);
24
+ return toCallError(e instanceof Error ? e.message : String(e));
21
25
  }
22
26
  });
23
27
  server.registerTool('get_status', { description: 'Get the current server status.' }, () => {
24
28
  try {
25
29
  const status = sync.getStatus();
26
- return { content: [{ type: 'text', text: status.type }], isError: false };
30
+ switch (status.type) {
31
+ case 'needAuth':
32
+ return { content: [{ type: 'text', text: 'Authentication is required. Please call get_auth_qr to retrieve a QR code for authentication.' }], isError: false };
33
+ case 'connecting':
34
+ return { content: [{ type: 'text', text: 'Server is still connecting to WhatsApp, please wait...' }], isError: false };
35
+ case 'closed':
36
+ return { content: [{ type: 'text', text: `Server connection closed. Error: ${status.error?.message ?? 'Unknown error'}` }], isError: false };
37
+ case 'ready':
38
+ return { content: [{ type: 'text', text: 'Server is ready and authenticated.' }], isError: false };
39
+ default:
40
+ return { content: [{ type: 'text', text: 'Unknown server status.' }], isError: false };
41
+ }
27
42
  }
28
43
  catch (e) {
29
- return toCallError(e);
44
+ return toCallError(e instanceof Error ? e.message : String(e));
30
45
  }
31
46
  });
32
47
  }
33
- const qrExplanation = `⚠️ Authentication Required
34
-
35
- To use this WhatsApp MCP server, you need to link it to your WhatsApp account.
36
-
37
- 1. Open WhatsApp on your phone
38
- 2. Tap the three dots menu (⋮) or Settings
39
- 3. Select "Linked Devices"
40
- 4. Tap "Link a Device"
41
- 5. Scan the QR code below with your phone
42
-
43
- The raw QR code string is also provided below for clients that render QR codes themselves.`;
48
+ const QrCodeResultSchema = z.object({
49
+ url: z.string().describe('URL to a PNG image of the QR code. Download and show this image to the user to scan with their WhatsApp mobile app.'),
50
+ code: z.string().describe('Text representation of the QR code. If you cannot show the user the QR code image or url, you can generate a QR code from this text using any QR code generator.'),
51
+ });
44
52
  //# sourceMappingURL=authTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authTools.js","sourceRoot":"","sources":["../../src/tools/authTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAGzC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IAC9F,MAAM,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,2CAA2C,EAAE,EAC7F,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;YAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;YAC/F,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1F,OAAO;gBACL,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE;oBACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE;oBAC5E,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;iBAClC;gBACD,OAAO,EAAE,KAAK;aACf,CAAA;QACH,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,WAAW,CAAC,CAAU,CAAC,CAAA;QAChC,CAAC;IACH,CAAC,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,EACjF,GAAG,EAAE;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;YAC/B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;QAC3E,CAAC;QACD,OAAO,CAAC,EAAE,CAAC;YACT,OAAO,WAAW,CAAC,CAAU,CAAC,CAAA;QAChC,CAAC;IACH,CAAC,CACF,CAAA;AACH,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;2FAUqE,CAAA"}
1
+ {"version":3,"file":"authTools.js","sourceRoot":"","sources":["../../src/tools/authTools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chatTools.d.ts","sourceRoot":"","sources":["../../src/tools/chatTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAwB/F"}
1
+ {"version":3,"file":"chatTools.d.ts","sourceRoot":"","sources":["../../src/tools/chatTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAY/F"}
@@ -1,18 +1,27 @@
1
1
  import z from 'zod';
2
- import { JidSchema, toCallError, toStructuredOutput, toTextResult, withErrorHandling } from './common.js';
2
+ import { JidSchema, withErrorHandling } from './common.js';
3
3
  export function registerChatTools(server, store, sync) {
4
- server.registerTool('get_all_chats', { description: 'Get all WhatsApp chats' }, async () => withErrorHandling(() => sync.getStatus(), () => toStructuredOutput({ chats: store.getChats() }), e => toCallError(e)));
5
- server.registerTool('set_chat_archived', { description: 'Set a WhatsApp chat as archived or unarchived', inputSchema: ArchiveChatSchema }, async (args) => withErrorHandling(() => sync.getStatus(), async () => { await sync.setArchived(args.jid, args.archived); return toTextResult(`Chat ${args.jid}: archived status set to ${String(args.archived)}`); }, e => toCallError(e)));
6
- server.registerTool('set_chat_read', { description: 'Set a WhatsApp chat as read or unread', inputSchema: ReadChatSchema }, async (args) => withErrorHandling(() => sync.getStatus(), async () => { await sync.setRead(args.jid, args.read); return toTextResult(`Chat ${args.jid}: read status set to ${String(args.read)}`); }, e => toCallError(e)));
4
+ server.registerTool('get_all_chats', { description: 'Retrieve all WhatsApp chats with their metadata', outputSchema: AllChatsSchema }, () => withErrorHandling(sync, () => store.getChats()));
5
+ server.registerTool('set_chat_archived', { description: 'Set a WhatsApp chat as archived or unarchived', inputSchema: ArchiveChatSchema }, args => withErrorHandling(sync, () => sync.setArchived(args.jid, args.archived).then(() => `Chat ${args.jid}: archived status set to ${String(args.archived)}`)));
6
+ server.registerTool('set_chat_read', { description: 'Set a WhatsApp chat as read or unread', inputSchema: ReadChatSchema }, args => withErrorHandling(sync, () => sync.setRead(args.jid, args.read).then(() => `Chat ${args.jid}: read status set to ${String(args.read)}`)));
7
7
  }
8
8
  const ArchiveChatSchema = z.object({
9
- jid: JidSchema,
9
+ jid: JidSchema.describe('The unique identifier (JID) of the chat'),
10
10
  archived: z.boolean()
11
11
  .describe('Whether the chat should be archived (true) or unarchived (false).'),
12
12
  });
13
13
  const ReadChatSchema = z.object({
14
- jid: JidSchema,
14
+ jid: JidSchema.describe('The unique identifier (JID) of the chat'),
15
15
  read: z.boolean()
16
16
  .describe('Whether the chat should be marked as read (true) or unread (false).'),
17
17
  });
18
+ const AllChatsSchema = z.array(z.object({
19
+ jid: JidSchema.describe('The unique identifier (JID) of the chat'),
20
+ unreadCount: z.number().describe('Number of unread messages in this chat'),
21
+ readOnly: z.boolean().describe('Whether the chat is read-only'),
22
+ name: z.string().describe('Display name of the chat'),
23
+ archived: z.boolean().describe('Whether the chat is archived'),
24
+ lastMessageTimestamp: z.number().describe('Unix timestamp of the last message'),
25
+ isGroup: z.boolean().describe('Whether this is a group chat'),
26
+ })).describe('List of all WhatsApp chats');
18
27
  //# sourceMappingURL=chatTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatTools.js","sourceRoot":"","sources":["../../src/tools/chatTools.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEzG,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IAC9F,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,wBAAwB,EAAE,EAC5E,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,EACrD,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,WAAW,EAAE,iBAAiB,EAAE,EACvI,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC,QAAQ,IAAI,CAAC,GAAG,4BAA4B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,EACzJ,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,WAAW,EAAE,cAAc,EAAE,EACxH,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC,QAAQ,IAAI,CAAC,GAAG,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,EACzI,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,GAAG,EAAE,SAAS;IACd,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;SAClB,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;SACd,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC,CAAA"}
1
+ {"version":3,"file":"chatTools.js","sourceRoot":"","sources":["../../src/tools/chatTools.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE1D,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IAC9F,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,iDAAiD,EAAE,YAAY,EAAE,cAAc,EAAE,EACnI,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CACtD,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,mBAAmB,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,WAAW,EAAE,iBAAiB,EAAE,EACvI,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,CAAC,GAAG,4BAA4B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACjK,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,WAAW,EAAE,uCAAuC,EAAE,WAAW,EAAE,cAAc,EAAE,EACxH,IAAI,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,IAAI,CAAC,GAAG,wBAAwB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACjJ,CAAA;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAClE,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;SAClB,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAClE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;SACd,QAAQ,CAAC,qEAAqE,CAAC;CACnF,CAAC,CAAA;AAEF,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,yCAAyC,CAAC;IAClE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;IAC1E,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;IAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC9D,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;IAC/E,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;CAC9D,CAAC,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAA"}
@@ -1,9 +1,9 @@
1
1
  import { type CallToolResult } from '@modelcontextprotocol/sdk/types.js';
2
- import { type SyncStatus } from '../sync.js';
2
+ import { WhatsAppHandler } from '../sync.js';
3
3
  import z from 'zod';
4
4
  export declare const JidSchema: z.ZodUnion<readonly [z.ZodString, z.ZodString]>;
5
- export declare function withErrorHandling<R>(getStatus: () => SyncStatus, action: () => R | Promise<R>, onError: (error: Error) => R | Promise<R>): Promise<R>;
6
- export declare const toCallError: (error: Error) => CallToolResult;
5
+ export declare function withErrorHandling<R = string | Record<string, unknown>>(sync: WhatsAppHandler, action: () => R | Promise<R>): Promise<CallToolResult>;
6
+ export declare const toCallError: (errorMessage: string) => CallToolResult;
7
7
  export declare const toTextResult: (text: string) => CallToolResult;
8
8
  export declare const toStructuredOutput: (structuredContent: Record<string, unknown>) => CallToolResult;
9
9
  //# sourceMappingURL=common.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,eAAO,MAAM,SAAS,iDAG6H,CAAA;AAEnJ,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,SAAS,EAAE,MAAM,UAAU,EAC3B,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAC5B,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,CAAC,CAWZ;AAED,eAAO,MAAM,WAAW,GAAI,OAAO,KAAK,KAAG,cAAmG,CAAA;AAC9I,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,cAAyE,CAAA;AACrH,eAAO,MAAM,kBAAkB,GAAI,mBAAmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,cAAsE,CAAA"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oCAAoC,CAAA;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,eAAO,MAAM,SAAS,iDAGpB,CAAA;AAEF,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAkB1J;AAED,eAAO,MAAM,WAAW,GAAI,cAAc,MAAM,KAAG,cAAkG,CAAA;AACrJ,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,cAAyE,CAAA;AACrH,eAAO,MAAM,kBAAkB,GAAI,mBAAmB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,cAAsE,CAAA"}
@@ -2,23 +2,31 @@ import z from 'zod';
2
2
  export const JidSchema = z.union([
3
3
  z.string().min(1, 'JID is required').endsWith('@s.whatsapp.net', 'JID not a valid WhatsApp JID)'),
4
4
  z.string().min(1, 'JID is required').endsWith('@g.us', 'JID not a valid WhatsApp JID)'),
5
- ]).describe('The JID of the recipient or chat. For example 41791234567@s.whatsapp.net for an individual or 1234567890-1234567890@g.us for a group');
6
- export async function withErrorHandling(getStatus, action, onError) {
5
+ ]);
6
+ export async function withErrorHandling(sync, action) {
7
7
  try {
8
- const status = getStatus();
8
+ let status = sync.getStatus();
9
+ if (status.type === 'closed')
10
+ await sync.start();
11
+ status = sync.getStatus();
12
+ if (status.type === 'closed')
13
+ throw new Error('Connection closed, please restart server');
9
14
  if (status.type === 'needAuth')
10
15
  throw new Error('Authentication required, please call the "get_auth_qr" tool to get a QR code for authentication');
11
16
  if (status.type === 'connecting')
12
17
  throw new Error('Server still connecting, please wait');
13
- if (status.type === 'closed')
14
- throw new Error('Connection closed, please restart server');
15
- return await action();
18
+ const result = await action();
19
+ if (typeof result === 'string') {
20
+ return toTextResult(result);
21
+ }
22
+ return toStructuredOutput(result);
16
23
  }
17
24
  catch (error) {
18
- return await onError(error);
25
+ const message = error instanceof Error ? error.message : String(error);
26
+ return toCallError(message);
19
27
  }
20
28
  }
21
- export const toCallError = (error) => ({ content: [{ type: 'text', text: `Error: ${error.message}` }], isError: true });
29
+ export const toCallError = (errorMessage) => ({ content: [{ type: 'text', text: `Error: ${errorMessage}` }], isError: true });
22
30
  export const toTextResult = (text) => ({ content: [{ type: 'text', text }], isError: false });
23
31
  export const toStructuredOutput = (structuredContent) => ({ content: [], structuredContent, isError: false });
24
32
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;IAC/B,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;IACjG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC;CACxF,CAAC,CAAC,QAAQ,CAAC,sIAAsI,CAAC,CAAA;AAEnJ,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAA2B,EAC3B,MAA4B,EAC5B,OAAyC;IAEzC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAA;QAC1B,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAA;QAClJ,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACzF,OAAO,MAAM,MAAM,EAAE,CAAA;IACvB,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,MAAM,OAAO,CAAC,KAAc,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAY,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AAC9I,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AACrH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,iBAA0C,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/tools/common.ts"],"names":[],"mappings":"AAEA,OAAO,CAAC,MAAM,KAAK,CAAA;AAEnB,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;IAC/B,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;IACjG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,+BAA+B,CAAC;CACxF,CAAC,CAAA;AAEF,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAuC,IAAqB,EAAE,MAA4B;IAC/H,IAAI,CAAC;QACH,IAAI,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QAC7B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAChD,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;QACzB,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;QACzF,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAA;QAClJ,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QACzF,MAAM,MAAM,GAAG,MAAM,MAAM,EAAE,CAAA;QAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,kBAAkB,CAAC,MAAiC,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,KAAc,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACtE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,YAAoB,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,YAAY,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;AACrJ,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;AACrH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,iBAA0C,EAAkB,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"contactTools.d.ts","sourceRoot":"","sources":["../../src/tools/contactTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAGjD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAQtG"}
1
+ {"version":3,"file":"contactTools.d.ts","sourceRoot":"","sources":["../../src/tools/contactTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAA;AAIjD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAItG"}
@@ -1,5 +1,11 @@
1
- import { toCallError, toStructuredOutput, withErrorHandling } from './common.js';
1
+ import z from 'zod';
2
+ import { JidSchema, withErrorHandling } from './common.js';
2
3
  export function registerContactResources(server, store, sync) {
3
- server.registerTool('get_all_contacts', { description: 'Get all WhatsApp contacts' }, async () => withErrorHandling(() => sync.getStatus(), () => toStructuredOutput({ contacts: store.getContacts() }), e => toCallError(e)));
4
+ server.registerTool('get_all_contacts', { description: 'Retrieve all WhatsApp contacts', outputSchema: AllContactsSchema }, async () => withErrorHandling(sync, () => store.getContacts()));
4
5
  }
6
+ const AllContactsSchema = z.array(z.object({
7
+ jid: JidSchema.describe('The unique identifier (JID) of the contact'),
8
+ name: z.string().describe('Display name of the contact'),
9
+ phone: z.string().describe('Phone number in international format'),
10
+ })).describe('List of all WhatsApp contacts');
5
11
  //# sourceMappingURL=contactTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"contactTools.js","sourceRoot":"","sources":["../../src/tools/contactTools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEhF,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IACrG,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,EAClF,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,EAC3D,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"contactTools.js","sourceRoot":"","sources":["../../src/tools/contactTools.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE1D,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IACrG,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,YAAY,EAAE,iBAAiB,EAAE,EACxH,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACrE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CACnE,CAAC,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"messageTools.d.ts","sourceRoot":"","sources":["../../src/tools/messageTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAwBlG"}
1
+ {"version":3,"file":"messageTools.d.ts","sourceRoot":"","sources":["../../src/tools/messageTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI5C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,QAYlG"}
@@ -1,14 +1,27 @@
1
1
  import z from 'zod';
2
- import { JidSchema, toCallError, toStructuredOutput, toTextResult, withErrorHandling } from './common.js';
2
+ import { JidSchema, withErrorHandling } from './common.js';
3
3
  export function registerMessageTools(server, store, sync) {
4
- server.registerTool('send_message', { description: 'Send a WhatsApp-Message to a given JID', inputSchema: SendMessageSchema }, async (args) => withErrorHandling(() => sync.getStatus(), async () => { await sync.sendMessage(args.jid, args.message); return toTextResult(`Message sent to ${args.jid}: "${args.message}"`); }, e => toCallError(e)));
5
- server.registerTool('get_all_messages', { description: 'Get all WhatsApp messages' }, async () => withErrorHandling(() => sync.getStatus(), () => toStructuredOutput({ messages: store.getMessages() }), e => toCallError(e)));
6
- server.registerTool('get_all_messages_for_chat', { description: 'Get all WhatsApp messages for a specific chat', inputSchema: JidSchema }, async (args) => withErrorHandling(() => sync.getStatus(), () => toStructuredOutput({ messages: store.getMessages().filter(m => m.key.remoteJid === args) }), e => toCallError(e)));
4
+ server.registerTool('send_message', { description: 'Send a WhatsApp-Message to a given JID', inputSchema: SendMessageSchema }, async (args) => withErrorHandling(sync, () => sync.sendMessage(args.jid, args.message).then(() => `Message sent to ${args.jid}: "${args.message}"`)));
5
+ server.registerTool('get_all_messages', { description: 'Retrieve all WhatsApp messages across all chats. This can return a large amount of data.', outputSchema: AllMessagesSchema }, async () => withErrorHandling(sync, () => store.getMessages()));
6
+ server.registerTool('get_all_messages_for_chat', { description: 'Retrieve all WhatsApp messages for a specific chat.', inputSchema: GetChatMessagesSchema, outputSchema: AllMessagesSchema }, async (args) => withErrorHandling(sync, () => store.getMessagesForChat(args.jid)));
7
7
  }
8
8
  const SendMessageSchema = z.object({
9
- jid: JidSchema,
9
+ jid: JidSchema.describe('The JID of the recipient. For example 41791234567@s.whatsapp.net for an individual or 1234567890-1234567890@g.us for a group'),
10
10
  message: z.string()
11
11
  .min(1, 'Message body is required')
12
12
  .describe('The body of the message to be sent. Can contain unicode characters like emojis.'),
13
13
  });
14
+ const GetChatMessagesSchema = z.object({
15
+ jid: JidSchema.describe('The JID of the chat. For example 41791234567@s.whatsapp.net for an individual or 1234567890-1234567890@g.us for a group'),
16
+ });
17
+ const AllMessagesSchema = z.array(z.object({
18
+ id: z.string().describe('Unique identifier of the message'),
19
+ from: z.object({
20
+ jid: JidSchema.describe('The JID of the sender'),
21
+ name: z.string().describe('Display name of the sender'),
22
+ phone: z.string().optional().describe('Phone number of the sender in international format'),
23
+ }).describe('Sender information (undefined if the message was sent by you)').optional(),
24
+ message: z.string().describe('Text content of the message'),
25
+ messageTimestamp: z.number().describe('Unix timestamp of when the message was sent'),
26
+ })).describe('List of all WhatsApp messages across all chats');
14
27
  //# sourceMappingURL=messageTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageTools.js","sourceRoot":"","sources":["../../src/tools/messageTools.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEzG,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IACjG,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAC3H,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,YAAY,CAAC,mBAAmB,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,GAAG,CAAC,CAAA,CAAC,CAAC,EACrI,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,2BAA2B,EAAE,EAClF,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAC3B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC,EAC3D,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,+CAA+C,EAAE,WAAW,EAAE,SAAS,EAAE,EACvI,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAC7B,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EACtB,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC,EACjG,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CACpB,CACF,CAAA;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,QAAQ,CAAC,iFAAiF,CAAC;CAC/F,CAAC,CAAA"}
1
+ {"version":3,"file":"messageTools.js","sourceRoot":"","sources":["../../src/tools/messageTools.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAA;AACnB,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE1D,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,KAAoB,EAAE,IAAqB;IACjG,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,WAAW,EAAE,wCAAwC,EAAE,WAAW,EAAE,iBAAiB,EAAE,EAC3H,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,mBAAmB,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CACnJ,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,0FAA0F,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAClL,KAAK,IAAI,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAC/D,CAAA;IAED,MAAM,CAAC,YAAY,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,qDAAqD,EAAE,WAAW,EAAE,qBAAqB,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAC1L,KAAK,EAAC,IAAI,EAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAChF,CAAA;AACH,CAAC;AAED,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,8HAA8H,CAAC;IACvJ,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,QAAQ,CAAC,iFAAiF,CAAC;CAC/F,CAAC,CAAA;AAEF,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,yHAAyH,CAAC;CACnJ,CAAC,CAAA;AAEF,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC3D,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,GAAG,EAAE,SAAS,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAChD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;KAC5F,CAAC,CAAC,QAAQ,CAAC,+DAA+D,CAAC,CAAC,QAAQ,EAAE;IACvF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC3D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;CACrF,CAAC,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lizzythelizard/whatsapp-mcp",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "MCP server for WhatsApp integration",
5
5
  "author": {
6
6
  "name": "Matthias Graf"
@@ -26,21 +26,19 @@
26
26
  "access": "public"
27
27
  },
28
28
  "bin": {
29
- "whatsapp-mcp": "dist/main.js"
29
+ "whatsapp-mcp": "dist/mcp.js"
30
30
  },
31
31
  "scripts": {
32
32
  "build": "tsc",
33
- "start": "node dist/main.js",
34
- "dev": "tsx watch src/main.ts",
35
- "inspect": "npx @modelcontextprotocol/inspector npm run --silent start",
33
+ "start": "node dist/mcp.js",
34
+ "dev": "tsx watch src/mcp.ts",
35
+ "cli": "tsx src/cli.ts",
36
+ "inspect": "npx @modelcontextprotocol/inspector node dist/mcp.js",
36
37
  "test": "vitest run",
37
38
  "test:watch": "vitest",
38
- "lint": "eslint src/",
39
- "lint:fix": "eslint src/ --fix",
40
- "typecheck": "tsc --noEmit",
41
- "mcpb:manifest": "node scripts/create-mcpb-manifest.mjs",
42
- "mcpb:pack": "npx mcpb pack",
43
- "mcpb": "npm run mcpb:manifest && npm run mcpb:pack"
39
+ "lint": "eslint .",
40
+ "lint:fix": "eslint . --fix",
41
+ "mcpb": "tsc && node scripts/create-mcpb.mjs"
44
42
  },
45
43
  "keywords": [
46
44
  "mcp",
@@ -50,17 +48,13 @@
50
48
  "license": "MIT",
51
49
  "dependencies": {
52
50
  "@modelcontextprotocol/sdk": "^1.29.0",
53
- "@stylistic/eslint-plugin": "^5.10.0",
54
51
  "@whiskeysockets/baileys": "^7.0.0-rc13",
55
- "qrcode": "^1.5.4",
56
52
  "zod": "^4.4.3"
57
53
  },
58
54
  "devDependencies": {
59
- "@anthropic-ai/mcpb": "^2.1.2",
60
55
  "@eslint/js": "^10.0.1",
61
- "@modelcontextprotocol/inspector": "^0.22.0",
56
+ "@stylistic/eslint-plugin": "^5.10.0",
62
57
  "@types/node": "^26.0.1",
63
- "@types/qrcode": "^1.5.6",
64
58
  "@typescript-eslint/eslint-plugin": "^8.62.0",
65
59
  "eslint": "^10.5.0",
66
60
  "eslint-plugin-import-x": "^4.17.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAWzE,wBAAsB,WAAW,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAcpF"}
package/dist/main.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}