social-mcp 1.0.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 (101) hide show
  1. package/README.md +165 -0
  2. package/dist/constants.d.ts +2 -0
  3. package/dist/constants.js +4 -0
  4. package/dist/constants.js.map +1 -0
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.js +62 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/lib/config.d.ts +19 -0
  9. package/dist/lib/config.js +20 -0
  10. package/dist/lib/config.js.map +1 -0
  11. package/dist/lib/http.d.ts +7 -0
  12. package/dist/lib/http.js +27 -0
  13. package/dist/lib/http.js.map +1 -0
  14. package/dist/run_tools_discord.d.ts +19 -0
  15. package/dist/run_tools_discord.js +49 -0
  16. package/dist/run_tools_discord.js.map +1 -0
  17. package/dist/run_tools_facebook.d.ts +19 -0
  18. package/dist/run_tools_facebook.js +49 -0
  19. package/dist/run_tools_facebook.js.map +1 -0
  20. package/dist/run_tools_instagram.d.ts +20 -0
  21. package/dist/run_tools_instagram.js +54 -0
  22. package/dist/run_tools_instagram.js.map +1 -0
  23. package/dist/run_tools_slack.d.ts +19 -0
  24. package/dist/run_tools_slack.js +49 -0
  25. package/dist/run_tools_slack.js.map +1 -0
  26. package/dist/run_tools_telegram.d.ts +20 -0
  27. package/dist/run_tools_telegram.js +107 -0
  28. package/dist/run_tools_telegram.js.map +1 -0
  29. package/dist/run_tools_twitter.d.ts +23 -0
  30. package/dist/run_tools_twitter.js +74 -0
  31. package/dist/run_tools_twitter.js.map +1 -0
  32. package/dist/run_tools_whatsapp.d.ts +20 -0
  33. package/dist/run_tools_whatsapp.js +58 -0
  34. package/dist/run_tools_whatsapp.js.map +1 -0
  35. package/dist/services/discord-service.d.ts +10 -0
  36. package/dist/services/discord-service.js +24 -0
  37. package/dist/services/discord-service.js.map +1 -0
  38. package/dist/services/facebook-service.d.ts +8 -0
  39. package/dist/services/facebook-service.js +22 -0
  40. package/dist/services/facebook-service.js.map +1 -0
  41. package/dist/services/instagram-service.d.ts +7 -0
  42. package/dist/services/instagram-service.js +28 -0
  43. package/dist/services/instagram-service.js.map +1 -0
  44. package/dist/services/slack-service.d.ts +9 -0
  45. package/dist/services/slack-service.js +31 -0
  46. package/dist/services/slack-service.js.map +1 -0
  47. package/dist/services/telegram-service.d.ts +29 -0
  48. package/dist/services/telegram-service.js +80 -0
  49. package/dist/services/telegram-service.js.map +1 -0
  50. package/dist/services/twitter-service.d.ts +10 -0
  51. package/dist/services/twitter-service.js +58 -0
  52. package/dist/services/twitter-service.js.map +1 -0
  53. package/dist/services/whatsapp-service.d.ts +23 -0
  54. package/dist/services/whatsapp-service.js +72 -0
  55. package/dist/services/whatsapp-service.js.map +1 -0
  56. package/dist/tools/discord-tools/send-message.d.ts +16 -0
  57. package/dist/tools/discord-tools/send-message.js +35 -0
  58. package/dist/tools/discord-tools/send-message.js.map +1 -0
  59. package/dist/tools/facebook-tools/create-post.d.ts +16 -0
  60. package/dist/tools/facebook-tools/create-post.js +34 -0
  61. package/dist/tools/facebook-tools/create-post.js.map +1 -0
  62. package/dist/tools/instagram-tools/create-post.d.ts +18 -0
  63. package/dist/tools/instagram-tools/create-post.js +35 -0
  64. package/dist/tools/instagram-tools/create-post.js.map +1 -0
  65. package/dist/tools/slack-tools/send-message.d.ts +16 -0
  66. package/dist/tools/slack-tools/send-message.js +34 -0
  67. package/dist/tools/slack-tools/send-message.js.map +1 -0
  68. package/dist/tools/telegram-tools/forward-message.d.ts +20 -0
  69. package/dist/tools/telegram-tools/forward-message.js +44 -0
  70. package/dist/tools/telegram-tools/forward-message.js.map +1 -0
  71. package/dist/tools/telegram-tools/get-channel-info.d.ts +14 -0
  72. package/dist/tools/telegram-tools/get-channel-info.js +39 -0
  73. package/dist/tools/telegram-tools/get-channel-info.js.map +1 -0
  74. package/dist/tools/telegram-tools/get-channel-members.d.ts +16 -0
  75. package/dist/tools/telegram-tools/get-channel-members.js +56 -0
  76. package/dist/tools/telegram-tools/get-channel-members.js.map +1 -0
  77. package/dist/tools/telegram-tools/pin-message.d.ts +18 -0
  78. package/dist/tools/telegram-tools/pin-message.js +41 -0
  79. package/dist/tools/telegram-tools/pin-message.js.map +1 -0
  80. package/dist/tools/telegram-tools/send-message.d.ts +16 -0
  81. package/dist/tools/telegram-tools/send-message.js +38 -0
  82. package/dist/tools/telegram-tools/send-message.js.map +1 -0
  83. package/dist/tools/twitter-tools/get-user-info.d.ts +14 -0
  84. package/dist/tools/twitter-tools/get-user-info.js +38 -0
  85. package/dist/tools/twitter-tools/get-user-info.js.map +1 -0
  86. package/dist/tools/twitter-tools/search-tweets.d.ts +16 -0
  87. package/dist/tools/twitter-tools/search-tweets.js +51 -0
  88. package/dist/tools/twitter-tools/search-tweets.js.map +1 -0
  89. package/dist/tools/twitter-tools/send-tweet.d.ts +14 -0
  90. package/dist/tools/twitter-tools/send-tweet.js +33 -0
  91. package/dist/tools/twitter-tools/send-tweet.js.map +1 -0
  92. package/dist/tools/whatsapp-tools/get-messages.d.ts +14 -0
  93. package/dist/tools/whatsapp-tools/get-messages.js +54 -0
  94. package/dist/tools/whatsapp-tools/get-messages.js.map +1 -0
  95. package/dist/tools/whatsapp-tools/send-message.d.ts +16 -0
  96. package/dist/tools/whatsapp-tools/send-message.js +34 -0
  97. package/dist/tools/whatsapp-tools/send-message.js.map +1 -0
  98. package/dist/types.d.ts +4 -0
  99. package/dist/types.js +4 -0
  100. package/dist/types.js.map +1 -0
  101. package/package.json +74 -0
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telegram Tools Test Runner
4
+ *
5
+ * Tests all Telegram MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:telegram
10
+ * -- or after build --
11
+ * node dist/run_tools_telegram.js
12
+ *
13
+ * Required env vars:
14
+ * TELEGRAM_BOT_TOKEN - Your Telegram bot token from @BotFather
15
+ *
16
+ * Optional env vars (for testing):
17
+ * TEST_TELEGRAM_CHAT_ID - Chat ID or @username to send messages to
18
+ * TEST_TELEGRAM_CHANNEL_ID - Channel ID or @username to query
19
+ */
20
+ import "dotenv/config";
@@ -0,0 +1,107 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Telegram Tools Test Runner
4
+ *
5
+ * Tests all Telegram MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:telegram
10
+ * -- or after build --
11
+ * node dist/run_tools_telegram.js
12
+ *
13
+ * Required env vars:
14
+ * TELEGRAM_BOT_TOKEN - Your Telegram bot token from @BotFather
15
+ *
16
+ * Optional env vars (for testing):
17
+ * TEST_TELEGRAM_CHAT_ID - Chat ID or @username to send messages to
18
+ * TEST_TELEGRAM_CHANNEL_ID - Channel ID or @username to query
19
+ */
20
+ import "dotenv/config";
21
+ import { sendMessageTool } from "./tools/telegram-tools/send-message.js";
22
+ import { getChannelInfoTool } from "./tools/telegram-tools/get-channel-info.js";
23
+ import { getChannelMembersTool } from "./tools/telegram-tools/get-channel-members.js";
24
+ import { pinMessageTool } from "./tools/telegram-tools/pin-message.js";
25
+ import { forwardMessageTool } from "./tools/telegram-tools/forward-message.js";
26
+ const CHAT_ID = process.env.TEST_TELEGRAM_CHAT_ID ?? "";
27
+ const CHANNEL_ID = process.env.TEST_TELEGRAM_CHANNEL_ID ?? CHAT_ID;
28
+ function printSeparator(title) {
29
+ console.log(`\n${"─".repeat(60)}`);
30
+ console.log(` ${title}`);
31
+ console.log("─".repeat(60));
32
+ }
33
+ async function runTelegramTests() {
34
+ console.log("🚀 Telegram Tools Test Runner");
35
+ console.log(` Bot Token: ${process.env.TELEGRAM_BOT_TOKEN ? "✅ Set" : "❌ Missing"}`);
36
+ console.log(` Chat ID: ${CHAT_ID || "(not set — some tests will be skipped)"}`);
37
+ // ── 1. SEND_MESSAGE ─────────────────────────────────────────
38
+ printSeparator("1. SEND_MESSAGE");
39
+ if (CHAT_ID) {
40
+ const result = await sendMessageTool.execute({
41
+ chatId: CHAT_ID,
42
+ text: "👋 Hello from social-mcp! This is a test message.",
43
+ });
44
+ console.log(result);
45
+ }
46
+ else {
47
+ console.log("⚠️ Skipped: set TEST_TELEGRAM_CHAT_ID to run this test.");
48
+ }
49
+ // ── 2. GET_CHANNEL_INFO ─────────────────────────────────────
50
+ printSeparator("2. GET_CHANNEL_INFO");
51
+ if (CHANNEL_ID) {
52
+ const result = await getChannelInfoTool.execute({ channelId: CHANNEL_ID });
53
+ console.log(result);
54
+ }
55
+ else {
56
+ console.log("⚠️ Skipped: set TEST_TELEGRAM_CHANNEL_ID to run this test.");
57
+ }
58
+ // ── 3. GET_CHANNEL_MEMBERS ──────────────────────────────────
59
+ printSeparator("3. GET_CHANNEL_MEMBERS");
60
+ if (CHANNEL_ID) {
61
+ const result = await getChannelMembersTool.execute({
62
+ channelId: CHANNEL_ID,
63
+ limit: 5,
64
+ });
65
+ console.log(result);
66
+ }
67
+ else {
68
+ console.log("⚠️ Skipped: set TEST_TELEGRAM_CHANNEL_ID to run this test.");
69
+ }
70
+ // ── 4. PIN_MESSAGE (requires a known message ID) ────────────
71
+ printSeparator("4. PIN_MESSAGE");
72
+ console.log("⚠️ Skipped: requires a known message ID. Set TEST_TELEGRAM_MESSAGE_ID to enable.");
73
+ const pinMessageId = process.env.TEST_TELEGRAM_MESSAGE_ID
74
+ ? Number(process.env.TEST_TELEGRAM_MESSAGE_ID)
75
+ : null;
76
+ if (pinMessageId && CHAT_ID) {
77
+ const result = await pinMessageTool.execute({
78
+ chatId: CHAT_ID,
79
+ messageId: pinMessageId,
80
+ disableNotification: true,
81
+ });
82
+ console.log(result);
83
+ }
84
+ // ── 5. FORWARD_MESSAGE (requires source + destination) ──────
85
+ printSeparator("5. FORWARD_MESSAGE");
86
+ const fromChatId = process.env.TEST_TELEGRAM_FROM_CHAT_ID;
87
+ const fwdMessageId = process.env.TEST_TELEGRAM_FWD_MESSAGE_ID
88
+ ? Number(process.env.TEST_TELEGRAM_FWD_MESSAGE_ID)
89
+ : null;
90
+ if (fromChatId && CHAT_ID && fwdMessageId) {
91
+ const result = await forwardMessageTool.execute({
92
+ fromChatId,
93
+ toChatId: CHAT_ID,
94
+ messageId: fwdMessageId,
95
+ });
96
+ console.log(result);
97
+ }
98
+ else {
99
+ console.log("⚠️ Skipped: set TEST_TELEGRAM_FROM_CHAT_ID and TEST_TELEGRAM_FWD_MESSAGE_ID to run this test.");
100
+ }
101
+ console.log("\n✅ Telegram test runner complete.");
102
+ }
103
+ runTelegramTests().catch((err) => {
104
+ console.error("❌ Telegram test runner failed:", err);
105
+ process.exit(1);
106
+ });
107
+ //# sourceMappingURL=run_tools_telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_tools_telegram.js","sourceRoot":"","sources":["../src/run_tools_telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Twitter Tools Test Runner
4
+ *
5
+ * Tests all Twitter MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:twitter
10
+ * -- or after build --
11
+ * node dist/run_tools_twitter.js
12
+ *
13
+ * Required env vars:
14
+ * TWITTER_APP_KEY - Twitter API app key (consumer key)
15
+ * TWITTER_APP_SECRET - Twitter API app secret (consumer secret)
16
+ * TWITTER_ACCESS_TOKEN - Access token for your account
17
+ * TWITTER_ACCESS_SECRET - Access token secret for your account
18
+ *
19
+ * Optional env vars (for testing):
20
+ * TEST_TWITTER_USERNAME - Twitter username to look up (without @)
21
+ * TEST_TWITTER_QUERY - Search query to use for SEARCH_TWEETS
22
+ */
23
+ import "dotenv/config";
@@ -0,0 +1,74 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Twitter Tools Test Runner
4
+ *
5
+ * Tests all Twitter MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:twitter
10
+ * -- or after build --
11
+ * node dist/run_tools_twitter.js
12
+ *
13
+ * Required env vars:
14
+ * TWITTER_APP_KEY - Twitter API app key (consumer key)
15
+ * TWITTER_APP_SECRET - Twitter API app secret (consumer secret)
16
+ * TWITTER_ACCESS_TOKEN - Access token for your account
17
+ * TWITTER_ACCESS_SECRET - Access token secret for your account
18
+ *
19
+ * Optional env vars (for testing):
20
+ * TEST_TWITTER_USERNAME - Twitter username to look up (without @)
21
+ * TEST_TWITTER_QUERY - Search query to use for SEARCH_TWEETS
22
+ */
23
+ import "dotenv/config";
24
+ import { sendTweetTool } from "./tools/twitter-tools/send-tweet.js";
25
+ import { getUserInfoTool } from "./tools/twitter-tools/get-user-info.js";
26
+ import { searchTweetsTool } from "./tools/twitter-tools/search-tweets.js";
27
+ const TEST_USERNAME = process.env.TEST_TWITTER_USERNAME ?? "twitter";
28
+ const TEST_QUERY = process.env.TEST_TWITTER_QUERY ?? "MCP server";
29
+ function printSeparator(title) {
30
+ console.log(`\n${"─".repeat(60)}`);
31
+ console.log(` ${title}`);
32
+ console.log("─".repeat(60));
33
+ }
34
+ function checkCreds() {
35
+ const keys = [
36
+ "TWITTER_APP_KEY",
37
+ "TWITTER_APP_SECRET",
38
+ "TWITTER_ACCESS_TOKEN",
39
+ "TWITTER_ACCESS_SECRET",
40
+ ];
41
+ return keys.map((k) => ` ${k}: ${process.env[k] ? "✅ Set" : "❌ Missing"}`).join("\n");
42
+ }
43
+ async function runTwitterTests() {
44
+ console.log("🚀 Twitter Tools Test Runner");
45
+ console.log(checkCreds());
46
+ // ── 1. GET_USER_INFO ────────────────────────────────────────
47
+ printSeparator(`1. GET_USER_INFO (@${TEST_USERNAME})`);
48
+ const userResult = await getUserInfoTool.execute({ username: TEST_USERNAME });
49
+ console.log(userResult);
50
+ // ── 2. SEARCH_TWEETS ────────────────────────────────────────
51
+ printSeparator(`2. SEARCH_TWEETS ("${TEST_QUERY}")`);
52
+ const searchResult = await searchTweetsTool.execute({
53
+ query: TEST_QUERY,
54
+ maxResults: 10,
55
+ });
56
+ console.log(searchResult);
57
+ // ── 3. SEND_TWEET ───────────────────────────────────────────
58
+ printSeparator("3. SEND_TWEET");
59
+ if (process.env.ENABLE_SEND_TWEET === "true") {
60
+ const tweetResult = await sendTweetTool.execute({
61
+ text: "🤖 Test tweet from social-mcp! #mcp #test",
62
+ });
63
+ console.log(tweetResult);
64
+ }
65
+ else {
66
+ console.log("⚠️ Skipped: set ENABLE_SEND_TWEET=true in .env to actually post a tweet.");
67
+ }
68
+ console.log("\n✅ Twitter test runner complete.");
69
+ }
70
+ runTwitterTests().catch((err) => {
71
+ console.error("❌ Twitter test runner failed:", err);
72
+ process.exit(1);
73
+ });
74
+ //# sourceMappingURL=run_tools_twitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_tools_twitter.js","sourceRoot":"","sources":["../src/run_tools_twitter.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAE1E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,SAAS,CAAC;AACrE,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,YAAY,CAAC;AAElE,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU;IAClB,MAAM,IAAI,GAAG;QACZ,iBAAiB;QACjB,oBAAoB;QACpB,sBAAsB;QACtB,uBAAuB;KACvB,CAAC;IACF,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAE1B,+DAA+D;IAC/D,cAAc,CAAC,sBAAsB,aAAa,GAAG,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9E,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAExB,+DAA+D;IAC/D,cAAc,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC;QACnD,KAAK,EAAE,UAAU;QACjB,UAAU,EAAE,EAAE;KACd,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAE1B,+DAA+D;IAC/D,cAAc,CAAC,eAAe,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,MAAM,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC;YAC/C,IAAI,EAAE,2CAA2C;SACjD,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CACV,2EAA2E,CAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;AAClD,CAAC;AAED,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC/B,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * WhatsApp Tools Test Runner
4
+ *
5
+ * Tests all WhatsApp MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:whatsapp
10
+ * -- or after build --
11
+ * node dist/run_tools_whatsapp.js
12
+ *
13
+ * Required env vars:
14
+ * WHATSAPP_ACCESS_TOKEN - WhatsApp Business API access token
15
+ * WHATSAPP_PHONE_NUMBER_ID - Your WhatsApp Business phone number ID
16
+ *
17
+ * Optional env vars (for testing):
18
+ * TEST_WHATSAPP_TO - Recipient phone number in E.164 format (e.g. +1234567890)
19
+ */
20
+ import "dotenv/config";
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * WhatsApp Tools Test Runner
4
+ *
5
+ * Tests all WhatsApp MCP tools against the real API.
6
+ * Set environment variables in .env before running.
7
+ *
8
+ * Usage:
9
+ * pnpm run:whatsapp
10
+ * -- or after build --
11
+ * node dist/run_tools_whatsapp.js
12
+ *
13
+ * Required env vars:
14
+ * WHATSAPP_ACCESS_TOKEN - WhatsApp Business API access token
15
+ * WHATSAPP_PHONE_NUMBER_ID - Your WhatsApp Business phone number ID
16
+ *
17
+ * Optional env vars (for testing):
18
+ * TEST_WHATSAPP_TO - Recipient phone number in E.164 format (e.g. +1234567890)
19
+ */
20
+ import "dotenv/config";
21
+ import { sendMessageTool } from "./tools/whatsapp-tools/send-message.js";
22
+ import { getMessagesTool } from "./tools/whatsapp-tools/get-messages.js";
23
+ const RECIPIENT = process.env.TEST_WHATSAPP_TO ?? "";
24
+ function printSeparator(title) {
25
+ console.log(`\n${"─".repeat(60)}`);
26
+ console.log(` ${title}`);
27
+ console.log("─".repeat(60));
28
+ }
29
+ async function runWhatsAppTests() {
30
+ console.log("🚀 WhatsApp Tools Test Runner");
31
+ console.log(` WHATSAPP_ACCESS_TOKEN: ${process.env.WHATSAPP_ACCESS_TOKEN ? "✅ Set" : "❌ Missing"}`);
32
+ console.log(` WHATSAPP_PHONE_NUMBER_ID: ${process.env.WHATSAPP_PHONE_NUMBER_ID ? "✅ Set" : "❌ Missing"}`);
33
+ console.log(` Recipient: ${RECIPIENT || "(not set — SEND test will be skipped)"}`);
34
+ // ── 1. SEND_WHATSAPP_MESSAGE ────────────────────────────────
35
+ printSeparator("1. SEND_WHATSAPP_MESSAGE");
36
+ if (RECIPIENT) {
37
+ const result = await sendMessageTool.execute({
38
+ to: RECIPIENT,
39
+ text: "👋 Hello from social-mcp! This is a test message.",
40
+ });
41
+ console.log(result);
42
+ }
43
+ else {
44
+ console.log("⚠️ Skipped: set TEST_WHATSAPP_TO in .env to run this test.");
45
+ }
46
+ // ── 2. GET_WHATSAPP_MESSAGES ────────────────────────────────
47
+ printSeparator("2. GET_WHATSAPP_MESSAGES");
48
+ console.log("ℹ️ Note: WhatsApp Business API does not support fetching message history");
49
+ console.log(" via a simple GET endpoint — this tool uses webhooks in production.");
50
+ const result = await getMessagesTool.execute({ limit: 5 });
51
+ console.log(result);
52
+ console.log("\n✅ WhatsApp test runner complete.");
53
+ }
54
+ runWhatsAppTests().catch((err) => {
55
+ console.error("❌ WhatsApp test runner failed:", err);
56
+ process.exit(1);
57
+ });
58
+ //# sourceMappingURL=run_tools_whatsapp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_tools_whatsapp.js","sourceRoot":"","sources":["../src/run_tools_whatsapp.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC;AAErD,SAAS,cAAc,CAAC,KAAa;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC9B,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CACV,gCAAgC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAC3F,CAAC;IACF,OAAO,CAAC,GAAG,CACV,gCAAgC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAC9F,CAAC;IACF,OAAO,CAAC,GAAG,CACV,iBAAiB,SAAS,IAAI,uCAAuC,EAAE,CACvE,CAAC;IAEF,+DAA+D;IAC/D,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC;YAC5C,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,mDAAmD;SACzD,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,GAAG,CACV,6DAA6D,CAC7D,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,cAAc,CAAC,0BAA0B,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CACV,2EAA2E,CAC3E,CAAC;IACF,OAAO,CAAC,GAAG,CACV,uEAAuE,CACvE,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEpB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;AACnD,CAAC;AAED,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAChC,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare class DiscordService {
2
+ private baseUrl;
3
+ private headers;
4
+ sendMessage(channelId: string, content: string): Promise<{
5
+ id: string;
6
+ channel_id: string;
7
+ content: string;
8
+ timestamp: string;
9
+ }>;
10
+ }
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { fetchJson } from "../lib/http.js";
3
+ import { config } from "../lib/config.js";
4
+ const discordMessageSchema = z.object({
5
+ id: z.string(),
6
+ channel_id: z.string(),
7
+ content: z.string(),
8
+ timestamp: z.string(),
9
+ });
10
+ export class DiscordService {
11
+ baseUrl = config.discord.baseUrl;
12
+ headers = {
13
+ "Content-Type": "application/json",
14
+ Authorization: `Bot ${config.discord.botToken}`,
15
+ };
16
+ async sendMessage(channelId, content) {
17
+ return fetchJson(`${this.baseUrl}/channels/${channelId}/messages`, {
18
+ method: "POST",
19
+ headers: this.headers,
20
+ body: JSON.stringify({ content }),
21
+ }, discordMessageSchema);
22
+ }
23
+ }
24
+ //# sourceMappingURL=discord-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discord-service.js","sourceRoot":"","sources":["../../src/services/discord-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,OAAO,cAAc;IACjB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;IACjC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;KAChD,CAAC;IAEF,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAe;QAClD,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,aAAa,SAAS,WAAW,EAChD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,EACD,oBAAoB,CACrB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ export declare class FacebookService {
2
+ private baseUrl;
3
+ private headers;
4
+ createPost(pageId: string, message: string): Promise<{
5
+ id: string;
6
+ post_id: string;
7
+ }>;
8
+ }
@@ -0,0 +1,22 @@
1
+ import { z } from "zod";
2
+ import { fetchJson } from "../lib/http.js";
3
+ import { config } from "../lib/config.js";
4
+ const facebookPostSchema = z.object({
5
+ id: z.string(),
6
+ post_id: z.string(),
7
+ });
8
+ export class FacebookService {
9
+ baseUrl = config.facebook.baseUrl;
10
+ headers = {
11
+ "Content-Type": "application/json",
12
+ Authorization: `Bearer ${config.facebook.accessToken}`,
13
+ };
14
+ async createPost(pageId, message) {
15
+ return fetchJson(`${this.baseUrl}/${pageId}/feed`, {
16
+ method: "POST",
17
+ headers: this.headers,
18
+ body: JSON.stringify({ message }),
19
+ }, facebookPostSchema);
20
+ }
21
+ }
22
+ //# sourceMappingURL=facebook-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facebook-service.js","sourceRoot":"","sources":["../../src/services/facebook-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;IAClC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE;KACvD,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,OAAe;QAC9C,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,OAAO,EAChC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,EACD,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export declare class InstagramService {
2
+ private baseUrl;
3
+ private headers;
4
+ createPost(userId: string, imageUrl: string, caption: string): Promise<{
5
+ id: string;
6
+ }>;
7
+ }
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import { fetchJson } from "../lib/http.js";
3
+ import { config } from "../lib/config.js";
4
+ const instagramMediaSchema = z.object({
5
+ id: z.string(),
6
+ });
7
+ export class InstagramService {
8
+ baseUrl = config.instagram.baseUrl;
9
+ headers = {
10
+ "Content-Type": "application/json",
11
+ Authorization: `Bearer ${config.instagram.accessToken}`,
12
+ };
13
+ async createPost(userId, imageUrl, caption) {
14
+ // First, create the media container
15
+ const containerResponse = await fetchJson(`${this.baseUrl}/${userId}/media`, {
16
+ method: "POST",
17
+ headers: this.headers,
18
+ body: JSON.stringify({ image_url: imageUrl, caption }),
19
+ }, z.object({ id: z.string() }));
20
+ // Then, publish the media
21
+ return fetchJson(`${this.baseUrl}/${userId}/media_publish`, {
22
+ method: "POST",
23
+ headers: this.headers,
24
+ body: JSON.stringify({ creation_id: containerResponse.id }),
25
+ }, instagramMediaSchema);
26
+ }
27
+ }
28
+ //# sourceMappingURL=instagram-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instagram-service.js","sourceRoot":"","sources":["../../src/services/instagram-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1C,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;CACf,CAAC,CAAC;AAEH,MAAM,OAAO,gBAAgB;IACnB,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;IACnC,OAAO,GAAG;QAChB,cAAc,EAAE,kBAAkB;QAClC,aAAa,EAAE,UAAU,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;KACxD,CAAC;IAEF,KAAK,CAAC,UAAU,CAAC,MAAc,EAAE,QAAgB,EAAE,OAAe;QAChE,oCAAoC;QACpC,MAAM,iBAAiB,GAAG,MAAM,SAAS,CACvC,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,QAAQ,EACjC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;SACvD,EACD,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC7B,CAAC;QAEF,0BAA0B;QAC1B,OAAO,SAAS,CACd,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,gBAAgB,EACzC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC;SAC5D,EACD,oBAAoB,CACrB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export declare class SlackService {
2
+ private web;
3
+ constructor();
4
+ sendMessage(channelId: string, text: string): Promise<{
5
+ messageId: string | undefined;
6
+ channelId: string | undefined;
7
+ text: string;
8
+ }>;
9
+ }
@@ -0,0 +1,31 @@
1
+ import { WebClient } from "@slack/web-api";
2
+ export class SlackService {
3
+ web;
4
+ constructor() {
5
+ const token = process.env.SLACK_BOT_TOKEN;
6
+ if (!token) {
7
+ throw new Error("SLACK_BOT_TOKEN is not configured. Please set the SLACK_BOT_TOKEN environment variable.");
8
+ }
9
+ this.web = new WebClient(token);
10
+ }
11
+ async sendMessage(channelId, text) {
12
+ try {
13
+ const result = await this.web.chat.postMessage({
14
+ channel: channelId,
15
+ text: text,
16
+ });
17
+ // The result object from Slack's API has a 'ts' field which is the message timestamp (ID)
18
+ // and 'channel' field which is the channel ID.
19
+ return {
20
+ messageId: result.ts,
21
+ channelId: result.channel,
22
+ text: text,
23
+ };
24
+ }
25
+ catch (error) {
26
+ console.error("Error sending Slack message:", error);
27
+ throw error; // Re-throw to be caught by the tool's execute function
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=slack-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack-service.js","sourceRoot":"","sources":["../../src/services/slack-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,OAAO,YAAY;IAChB,GAAG,CAAY;IAEvB;QACC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CACd,yFAAyF,CACzF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,IAAY;QAChD,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC9C,OAAO,EAAE,SAAS;gBAClB,IAAI,EAAE,IAAI;aACV,CAAC,CAAC;YACH,0FAA0F;YAC1F,+CAA+C;YAC/C,OAAO;gBACN,SAAS,EAAE,MAAM,CAAC,EAAE;gBACpB,SAAS,EAAE,MAAM,CAAC,OAAO;gBACzB,IAAI,EAAE,IAAI;aACV,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;YACrD,MAAM,KAAK,CAAC,CAAC,uDAAuD;QACrE,CAAC;IACF,CAAC;CAGD"}
@@ -0,0 +1,29 @@
1
+ export interface ChannelInfo {
2
+ id: number;
3
+ title: string;
4
+ username?: string;
5
+ description?: string;
6
+ memberCount?: number;
7
+ type: string;
8
+ }
9
+ export interface MessageInfo {
10
+ messageId: number;
11
+ chatId: number;
12
+ text?: string;
13
+ date: number;
14
+ }
15
+ export declare class TelegramService {
16
+ private bot;
17
+ constructor();
18
+ sendMessage(chatId: string | number, text: string): Promise<MessageInfo>;
19
+ getChannelInfo(channelId: string | number): Promise<ChannelInfo>;
20
+ forwardMessage(fromChatId: string | number, toChatId: string | number, messageId: number): Promise<MessageInfo>;
21
+ pinMessage(chatId: string | number, messageId: number): Promise<boolean>;
22
+ getChannelMembers(channelId: string | number, limit?: number): Promise<Array<{
23
+ userId: number;
24
+ username?: string;
25
+ firstName?: string;
26
+ lastName?: string;
27
+ status: string;
28
+ }>>;
29
+ }
@@ -0,0 +1,80 @@
1
+ import { Telegraf } from "telegraf";
2
+ export class TelegramService {
3
+ bot;
4
+ constructor() {
5
+ const botToken = process.env.TELEGRAM_BOT_TOKEN;
6
+ if (!botToken) {
7
+ throw new Error("TELEGRAM_BOT_TOKEN environment variable is required");
8
+ }
9
+ this.bot = new Telegraf(botToken);
10
+ }
11
+ async sendMessage(chatId, text) {
12
+ try {
13
+ const message = await this.bot.telegram.sendMessage(chatId, text);
14
+ return {
15
+ messageId: message.message_id,
16
+ chatId: message.chat.id,
17
+ text: message.text,
18
+ date: message.date,
19
+ };
20
+ }
21
+ catch (error) {
22
+ throw new Error(`Failed to send message: ${error instanceof Error ? error.message : "Unknown error"}`);
23
+ }
24
+ }
25
+ async getChannelInfo(channelId) {
26
+ try {
27
+ const chat = await this.bot.telegram.getChat(channelId);
28
+ const memberCount = await this.bot.telegram.getChatMembersCount(channelId);
29
+ return {
30
+ id: chat.id,
31
+ title: "title" in chat ? chat.title : "Private Chat",
32
+ username: "username" in chat ? chat.username : undefined,
33
+ description: "description" in chat ? chat.description : undefined,
34
+ memberCount,
35
+ type: chat.type,
36
+ };
37
+ }
38
+ catch (error) {
39
+ throw new Error(`Failed to get channel info: ${error instanceof Error ? error.message : "Unknown error"}`);
40
+ }
41
+ }
42
+ async forwardMessage(fromChatId, toChatId, messageId) {
43
+ try {
44
+ const message = await this.bot.telegram.forwardMessage(toChatId, fromChatId, messageId);
45
+ return {
46
+ messageId: message.message_id,
47
+ chatId: message.chat.id,
48
+ date: message.date,
49
+ };
50
+ }
51
+ catch (error) {
52
+ throw new Error(`Failed to forward message: ${error instanceof Error ? error.message : "Unknown error"}`);
53
+ }
54
+ }
55
+ async pinMessage(chatId, messageId) {
56
+ try {
57
+ await this.bot.telegram.pinChatMessage(chatId, messageId);
58
+ return true;
59
+ }
60
+ catch (error) {
61
+ throw new Error(`Failed to pin message: ${error instanceof Error ? error.message : "Unknown error"}`);
62
+ }
63
+ }
64
+ async getChannelMembers(channelId, limit = 10) {
65
+ try {
66
+ const administrators = await this.bot.telegram.getChatAdministrators(channelId);
67
+ return administrators.slice(0, limit).map((member) => ({
68
+ userId: member.user.id,
69
+ username: member.user.username,
70
+ firstName: member.user.first_name,
71
+ lastName: member.user.last_name,
72
+ status: member.status,
73
+ }));
74
+ }
75
+ catch (error) {
76
+ throw new Error(`Failed to get channel members: ${error instanceof Error ? error.message : "Unknown error"}`);
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=telegram-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram-service.js","sourceRoot":"","sources":["../../src/services/telegram-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class TwitterService {
2
+ private client;
3
+ constructor();
4
+ sendTweet(text: string): Promise<{
5
+ id: string;
6
+ text: string;
7
+ }>;
8
+ getUserInfo(username: string): Promise<import("twitter-api-v2").UserV2>;
9
+ searchTweets(query: string, maxResults?: number): Promise<import("twitter-api-v2").TweetSearchRecentV2Paginator>;
10
+ }