social-mcp 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +56 -1
  2. package/dist/index.js +41 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/config.d.ts +17 -0
  5. package/dist/lib/config.js +17 -0
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/services/reddit-service.d.ts +87 -0
  8. package/dist/services/reddit-service.js +188 -0
  9. package/dist/services/reddit-service.js.map +1 -0
  10. package/dist/services/threads-service.d.ts +35 -0
  11. package/dist/services/threads-service.js +86 -0
  12. package/dist/services/threads-service.js.map +1 -0
  13. package/dist/services/tiktok-service.d.ts +79 -0
  14. package/dist/services/tiktok-service.js +138 -0
  15. package/dist/services/tiktok-service.js.map +1 -0
  16. package/dist/tools/reddit-tools/comment.d.ts +16 -0
  17. package/dist/tools/reddit-tools/comment.js +30 -0
  18. package/dist/tools/reddit-tools/comment.js.map +1 -0
  19. package/dist/tools/reddit-tools/get-posts.d.ts +28 -0
  20. package/dist/tools/reddit-tools/get-posts.js +36 -0
  21. package/dist/tools/reddit-tools/get-posts.js.map +1 -0
  22. package/dist/tools/reddit-tools/get-user-info.d.ts +14 -0
  23. package/dist/tools/reddit-tools/get-user-info.js +37 -0
  24. package/dist/tools/reddit-tools/get-user-info.js.map +1 -0
  25. package/dist/tools/reddit-tools/search.d.ts +28 -0
  26. package/dist/tools/reddit-tools/search.js +40 -0
  27. package/dist/tools/reddit-tools/search.js.map +1 -0
  28. package/dist/tools/reddit-tools/submit-post.d.ts +28 -0
  29. package/dist/tools/reddit-tools/submit-post.js +31 -0
  30. package/dist/tools/reddit-tools/submit-post.js.map +1 -0
  31. package/dist/tools/reddit-tools/vote.d.ts +24 -0
  32. package/dist/tools/reddit-tools/vote.js +30 -0
  33. package/dist/tools/reddit-tools/vote.js.map +1 -0
  34. package/dist/tools/threads-tools/create-post.d.ts +14 -0
  35. package/dist/tools/threads-tools/create-post.js +23 -0
  36. package/dist/tools/threads-tools/create-post.js.map +1 -0
  37. package/dist/tools/threads-tools/delete-post.d.ts +14 -0
  38. package/dist/tools/threads-tools/delete-post.js +23 -0
  39. package/dist/tools/threads-tools/delete-post.js.map +1 -0
  40. package/dist/tools/threads-tools/get-posts.d.ts +14 -0
  41. package/dist/tools/threads-tools/get-posts.js +31 -0
  42. package/dist/tools/threads-tools/get-posts.js.map +1 -0
  43. package/dist/tools/threads-tools/get-profile.d.ts +7 -0
  44. package/dist/tools/threads-tools/get-profile.js +31 -0
  45. package/dist/tools/threads-tools/get-profile.js.map +1 -0
  46. package/dist/tools/threads-tools/reply.d.ts +16 -0
  47. package/dist/tools/threads-tools/reply.js +24 -0
  48. package/dist/tools/threads-tools/reply.js.map +1 -0
  49. package/dist/tools/tiktok-tools/direct-post-video.d.ts +34 -0
  50. package/dist/tools/tiktok-tools/direct-post-video.js +34 -0
  51. package/dist/tools/tiktok-tools/direct-post-video.js.map +1 -0
  52. package/dist/tools/tiktok-tools/get-post-status.d.ts +14 -0
  53. package/dist/tools/tiktok-tools/get-post-status.js +36 -0
  54. package/dist/tools/tiktok-tools/get-post-status.js.map +1 -0
  55. package/dist/tools/tiktok-tools/get-user-info.d.ts +7 -0
  56. package/dist/tools/tiktok-tools/get-user-info.js +36 -0
  57. package/dist/tools/tiktok-tools/get-user-info.js.map +1 -0
  58. package/dist/tools/tiktok-tools/photo-post.d.ts +30 -0
  59. package/dist/tools/tiktok-tools/photo-post.js +36 -0
  60. package/dist/tools/tiktok-tools/photo-post.js.map +1 -0
  61. package/dist/tools/tiktok-tools/query-creator-info.d.ts +7 -0
  62. package/dist/tools/tiktok-tools/query-creator-info.js +39 -0
  63. package/dist/tools/tiktok-tools/query-creator-info.js.map +1 -0
  64. package/package.json +5 -2
package/README.md CHANGED
@@ -14,6 +14,9 @@ An MCP (Model Context Protocol) server that lets AI assistants post and interact
14
14
  | Instagram | Create post, get posts |
15
15
  | Slack | Send message, get messages, list channels |
16
16
  | LinkedIn | Get profile, create post, get posts, like post, add comment, search people |
17
+ | Reddit | Submit post, get posts, comment, vote, search, get user info |
18
+ | Threads | Get profile, create post, reply, get posts, delete post |
19
+ | TikTok | Query creator info, get user info, post video, photo post, get post status |
17
20
 
18
21
  ## Quick Start
19
22
 
@@ -54,7 +57,14 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
54
57
  "FACEBOOK_ACCESS_TOKEN": "your_token",
55
58
  "INSTAGRAM_ACCESS_TOKEN": "your_token",
56
59
  "SLACK_BOT_TOKEN": "your_token",
57
- "LINKEDIN_ACCESS_TOKEN": "your_token"
60
+ "LINKEDIN_ACCESS_TOKEN": "your_token",
61
+ "REDDIT_CLIENT_ID": "your_client_id",
62
+ "REDDIT_CLIENT_SECRET": "your_client_secret",
63
+ "REDDIT_USERNAME": "your_username",
64
+ "REDDIT_PASSWORD": "your_password",
65
+ "THREADS_ACCESS_TOKEN": "your_token",
66
+ "THREADS_USER_ID": "your_user_id",
67
+ "TIKTOK_ACCESS_TOKEN": "your_token"
58
68
  }
59
69
  }
60
70
  }
@@ -127,6 +137,25 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
127
137
  |----------|-------------|
128
138
  | `LINKEDIN_ACCESS_TOKEN` | OAuth 2.0 access token from the [LinkedIn Developer Portal](https://www.linkedin.com/developers/apps) — requires `r_liteprofile`, `w_member_social` scopes |
129
139
 
140
+ ### Reddit
141
+ | Variable | Description |
142
+ |----------|-------------|
143
+ | `REDDIT_CLIENT_ID` | App client ID from [reddit.com/prefs/apps](https://www.reddit.com/prefs/apps) (create a "script" type app) |
144
+ | `REDDIT_CLIENT_SECRET` | App client secret |
145
+ | `REDDIT_USERNAME` | Reddit account username |
146
+ | `REDDIT_PASSWORD` | Reddit account password |
147
+
148
+ ### Threads
149
+ | Variable | Description |
150
+ |----------|-------------|
151
+ | `THREADS_ACCESS_TOKEN` | OAuth 2.0 access token from the [Meta for Developers](https://developers.facebook.com) — requires `threads_basic`, `threads_content_publish` scopes |
152
+ | `THREADS_USER_ID` | Your Threads user ID (returned from the Threads API `/me` endpoint) |
153
+
154
+ ### TikTok
155
+ | Variable | Description |
156
+ |----------|-------------|
157
+ | `TIKTOK_ACCESS_TOKEN` | OAuth 2.0 access token from the [TikTok for Developers](https://developers.tiktok.com) — requires `user.info.basic`, `video.publish`, `video.upload` scopes |
158
+
130
159
  ## Available Tools
131
160
 
132
161
  ### Telegram
@@ -179,6 +208,32 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
179
208
 
180
209
  > **Note:** `SEARCH_LINKEDIN_PEOPLE` uses the LinkedIn People Search API which requires [Partner Program](https://learn.microsoft.com/en-us/linkedin/talent/recruiter-system-connect/getting-access) access. Most developer apps will receive a 403. All other tools work with a standard OAuth 2.0 token.
181
210
 
211
+ ### Reddit
212
+ - **REDDIT_SUBMIT_POST** — Submit a text or link post to a subreddit (`subreddit`, `title`, `kind`, `text`, `url`)
213
+ - **REDDIT_GET_POSTS** — Get posts from a subreddit (`subreddit`, `sort`, `limit`)
214
+ - **REDDIT_COMMENT** — Comment on a post or reply to a comment (`parentId`, `text`)
215
+ - **REDDIT_VOTE** — Upvote, downvote, or remove a vote (`id`, `direction`)
216
+ - **REDDIT_SEARCH** — Search Reddit across all or a specific subreddit (`query`, `subreddit`, `sort`, `limit`)
217
+ - **REDDIT_GET_USER_INFO** — Get public info about a Reddit user (`username`)
218
+
219
+ > **Note:** Reddit requires a "script" type app in [reddit.com/prefs/apps](https://www.reddit.com/prefs/apps). The password grant flow is used — 2FA must be disabled on the account.
220
+
221
+ ### Threads
222
+ - **THREADS_GET_PROFILE** — Get your Threads profile information
223
+ - **THREADS_CREATE_POST** — Create a new text post (`text`)
224
+ - **THREADS_REPLY** — Reply to a Threads post (`replyToId`, `text`)
225
+ - **THREADS_GET_POSTS** — Get recent posts from your account (`limit`)
226
+ - **THREADS_DELETE_POST** — Delete a post by ID (`mediaId`)
227
+
228
+ ### TikTok
229
+ - **TIKTOK_QUERY_CREATOR_INFO** — Query creator info including posting permissions and privacy options
230
+ - **TIKTOK_GET_USER_INFO** — Get TikTok account profile and stats
231
+ - **TIKTOK_DIRECT_POST_VIDEO** — Post a video by URL (`videoUrl`, `title`, `privacyLevel`, ...)
232
+ - **TIKTOK_PHOTO_POST** — Create a photo/carousel post (`photoUrls`, `title`, `description`, `privacyLevel`)
233
+ - **TIKTOK_GET_POST_STATUS** — Check the publishing status of a video or photo post (`publishId`)
234
+
235
+ > **Note:** TikTok's Content Posting API requires app approval from [TikTok for Developers](https://developers.tiktok.com). Videos are pulled from a public URL by TikTok's servers rather than uploaded directly.
236
+
182
237
  ## Development
183
238
 
184
239
  ```bash
package/dist/index.js CHANGED
@@ -6,8 +6,11 @@ import { getDiscordService } from "./services/discord-service.js";
6
6
  import { getFacebookService } from "./services/facebook-service.js";
7
7
  import { getInstagramService } from "./services/instagram-service.js";
8
8
  import { getLinkedInService } from "./services/linkedin-service.js";
9
+ import { getRedditService } from "./services/reddit-service.js";
9
10
  import { getSlackService } from "./services/slack-service.js";
10
11
  import { getTelegramService } from "./services/telegram-service.js";
12
+ import { getThreadsService } from "./services/threads-service.js";
13
+ import { getTikTokService } from "./services/tiktok-service.js";
11
14
  import { getTwitterService } from "./services/twitter-service.js";
12
15
  import { getWhatsappService } from "./services/whatsapp-service.js";
13
16
  import { getMessagesTool as discordGetMessagesTool } from "./tools/discord-tools/get-messages.js";
@@ -23,6 +26,12 @@ import { getPostsTool as linkedInGetPostsTool } from "./tools/linkedin-tools/get
23
26
  import { getProfileTool as linkedInGetProfileTool } from "./tools/linkedin-tools/get-profile.js";
24
27
  import { likePostTool as linkedInLikePostTool } from "./tools/linkedin-tools/like-post.js";
25
28
  import { searchPeopleTool as linkedInSearchPeopleTool } from "./tools/linkedin-tools/search-people.js";
29
+ import { commentTool as redditCommentTool } from "./tools/reddit-tools/comment.js";
30
+ import { getUserInfoTool as redditGetUserInfoTool } from "./tools/reddit-tools/get-user-info.js";
31
+ import { getPostsTool as redditGetPostsTool } from "./tools/reddit-tools/get-posts.js";
32
+ import { searchTool as redditSearchTool } from "./tools/reddit-tools/search.js";
33
+ import { submitPostTool as redditSubmitPostTool } from "./tools/reddit-tools/submit-post.js";
34
+ import { voteTool as redditVoteTool } from "./tools/reddit-tools/vote.js";
26
35
  import { getMessagesTool as slackGetMessagesTool } from "./tools/slack-tools/get-messages.js";
27
36
  import { listChannelsTool as slackListChannelsTool } from "./tools/slack-tools/list-channels.js";
28
37
  import { sendMessageTool as slackSendMessageTool } from "./tools/slack-tools/send-message.js";
@@ -33,6 +42,16 @@ import { getChannelInfoTool } from "./tools/telegram-tools/get-channel-info.js";
33
42
  import { getChannelMembersTool } from "./tools/telegram-tools/get-channel-members.js";
34
43
  import { pinMessageTool } from "./tools/telegram-tools/pin-message.js";
35
44
  import { sendMessageTool } from "./tools/telegram-tools/send-message.js";
45
+ import { createPostTool as threadsCreatePostTool } from "./tools/threads-tools/create-post.js";
46
+ import { deletePostTool as threadsDeletePostTool } from "./tools/threads-tools/delete-post.js";
47
+ import { getPostsTool as threadsGetPostsTool } from "./tools/threads-tools/get-posts.js";
48
+ import { getProfileTool as threadsGetProfileTool } from "./tools/threads-tools/get-profile.js";
49
+ import { replyTool as threadsReplyTool } from "./tools/threads-tools/reply.js";
50
+ import { directPostVideoTool as tiktokDirectPostVideoTool } from "./tools/tiktok-tools/direct-post-video.js";
51
+ import { getPostStatusTool as tiktokGetPostStatusTool } from "./tools/tiktok-tools/get-post-status.js";
52
+ import { getUserInfoTool as tiktokGetUserInfoTool } from "./tools/tiktok-tools/get-user-info.js";
53
+ import { photoPostTool as tiktokPhotoPostTool } from "./tools/tiktok-tools/photo-post.js";
54
+ import { queryCreatorInfoTool as tiktokQueryCreatorInfoTool } from "./tools/tiktok-tools/query-creator-info.js";
36
55
  import { deleteTweetTool } from "./tools/twitter-tools/delete-tweet.js";
37
56
  import { getUserInfoTool } from "./tools/twitter-tools/get-user-info.js";
38
57
  import { likeTweetTool } from "./tools/twitter-tools/like-tweet.js";
@@ -66,6 +85,9 @@ async function main() {
66
85
  checkPlatform("Instagram", getInstagramService);
67
86
  checkPlatform("Slack", getSlackService);
68
87
  checkPlatform("LinkedIn", getLinkedInService);
88
+ checkPlatform("Reddit", getRedditService);
89
+ checkPlatform("Threads", getThreadsService);
90
+ checkPlatform("TikTok", getTikTokService);
69
91
  console.error("");
70
92
  const server = new FastMCP({ name: "Social MCP Server", version });
71
93
  // Telegram
@@ -106,6 +128,25 @@ async function main() {
106
128
  server.addTool(linkedInLikePostTool);
107
129
  server.addTool(linkedInAddCommentTool);
108
130
  server.addTool(linkedInSearchPeopleTool);
131
+ // Reddit
132
+ server.addTool(redditSubmitPostTool);
133
+ server.addTool(redditGetPostsTool);
134
+ server.addTool(redditCommentTool);
135
+ server.addTool(redditVoteTool);
136
+ server.addTool(redditSearchTool);
137
+ server.addTool(redditGetUserInfoTool);
138
+ // Threads
139
+ server.addTool(threadsGetProfileTool);
140
+ server.addTool(threadsCreatePostTool);
141
+ server.addTool(threadsReplyTool);
142
+ server.addTool(threadsGetPostsTool);
143
+ server.addTool(threadsDeletePostTool);
144
+ // TikTok
145
+ server.addTool(tiktokQueryCreatorInfoTool);
146
+ server.addTool(tiktokGetUserInfoTool);
147
+ server.addTool(tiktokDirectPostVideoTool);
148
+ server.addTool(tiktokPhotoPostTool);
149
+ server.addTool(tiktokGetPostStatusTool);
109
150
  try {
110
151
  await server.start({ transportType: "stdio" });
111
152
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gBAAgB,IAAI,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,cAAc,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC/F,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,IAAI,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AAC7G,OAAO,EAAE,iBAAiB,IAAI,uBAAuB,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,aAAa,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAC1F,OAAO,EAAE,oBAAoB,IAAI,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAChH,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEpG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAE5C,CAAC;AAEF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAmB;IACvD,IAAI,CAAC;QACJ,IAAI,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACZ,UAAU,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC9C,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAChD,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACxC,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC1C,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5C,aAAa,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAC1C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEvC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAErC,YAAY;IACZ,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,QAAQ;IACR,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEzC,SAAS;IACT,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,SAAS;IACT,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;IAC3C,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC1C,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpC,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -21,4 +21,21 @@ export declare const config: {
21
21
  baseUrl: string;
22
22
  accessToken: string;
23
23
  };
24
+ reddit: {
25
+ baseUrl: string;
26
+ clientId: string;
27
+ clientSecret: string;
28
+ username: string;
29
+ password: string;
30
+ userAgent: string;
31
+ };
32
+ threads: {
33
+ baseUrl: string;
34
+ accessToken: string;
35
+ userId: string;
36
+ };
37
+ tiktok: {
38
+ baseUrl: string;
39
+ accessToken: string;
40
+ };
24
41
  };
@@ -22,5 +22,22 @@ export const config = {
22
22
  baseUrl: "https://api.linkedin.com/v2",
23
23
  accessToken: process.env.LINKEDIN_ACCESS_TOKEN || "",
24
24
  },
25
+ reddit: {
26
+ baseUrl: "https://oauth.reddit.com",
27
+ clientId: process.env.REDDIT_CLIENT_ID || "",
28
+ clientSecret: process.env.REDDIT_CLIENT_SECRET || "",
29
+ username: process.env.REDDIT_USERNAME || "",
30
+ password: process.env.REDDIT_PASSWORD || "",
31
+ userAgent: "social-mcp/1.0 (by /u/social_mcp_bot)",
32
+ },
33
+ threads: {
34
+ baseUrl: "https://graph.threads.net/v1.0",
35
+ accessToken: process.env.THREADS_ACCESS_TOKEN || "",
36
+ userId: process.env.THREADS_USER_ID || "",
37
+ },
38
+ tiktok: {
39
+ baseUrl: "https://open.tiktokapis.com/v2",
40
+ accessToken: process.env.TIKTOK_ACCESS_TOKEN || "",
41
+ },
25
42
  };
26
43
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;CACD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,MAAM,EAAE;QACP,OAAO,EAAE,0BAA0B;QACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE;QAC5C,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACpD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;QAC3C,SAAS,EAAE,uCAAuC;KAClD;IACD,OAAO,EAAE;QACR,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE;QACnD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE;KACzC;IACD,MAAM,EAAE;QACP,OAAO,EAAE,gCAAgC;QACzC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE;KAClD;CACD,CAAC"}
@@ -0,0 +1,87 @@
1
+ export declare class RedditService {
2
+ private baseUrl;
3
+ private userAgent;
4
+ private _accessToken;
5
+ constructor();
6
+ private authenticate;
7
+ private headers;
8
+ submitPost(subreddit: string, title: string, kind: "self" | "link", text?: string, url?: string): Promise<{
9
+ json: {
10
+ errors: unknown[];
11
+ data?: {
12
+ name?: string | undefined;
13
+ url?: string | undefined;
14
+ id?: string | undefined;
15
+ } | undefined;
16
+ };
17
+ }>;
18
+ getPosts(subreddit: string, sort?: "hot" | "new" | "top" | "rising", limit?: number): Promise<{
19
+ data: {
20
+ children: {
21
+ data: {
22
+ id: string;
23
+ name: string;
24
+ title?: string | undefined;
25
+ selftext?: string | undefined;
26
+ url?: string | undefined;
27
+ score?: number | undefined;
28
+ author?: string | undefined;
29
+ created_utc?: number | undefined;
30
+ num_comments?: number | undefined;
31
+ subreddit?: string | undefined;
32
+ permalink?: string | undefined;
33
+ body?: string | undefined;
34
+ };
35
+ }[];
36
+ after?: string | null | undefined;
37
+ };
38
+ }>;
39
+ comment(parentId: string, text: string): Promise<{
40
+ json: {
41
+ errors: unknown[];
42
+ data?: {
43
+ name?: string | undefined;
44
+ url?: string | undefined;
45
+ id?: string | undefined;
46
+ } | undefined;
47
+ };
48
+ }>;
49
+ vote(id: string, dir: 1 | 0 | -1): Promise<void>;
50
+ search(query: string, subreddit?: string, sort?: "relevance" | "new" | "top", limit?: number): Promise<{
51
+ data: {
52
+ children: {
53
+ data: {
54
+ id: string;
55
+ name: string;
56
+ title?: string | undefined;
57
+ selftext?: string | undefined;
58
+ url?: string | undefined;
59
+ score?: number | undefined;
60
+ author?: string | undefined;
61
+ created_utc?: number | undefined;
62
+ num_comments?: number | undefined;
63
+ subreddit?: string | undefined;
64
+ permalink?: string | undefined;
65
+ body?: string | undefined;
66
+ };
67
+ }[];
68
+ after?: string | null | undefined;
69
+ };
70
+ }>;
71
+ getUserInfo(username: string): Promise<{
72
+ data: {
73
+ name: string;
74
+ id: string;
75
+ icon_img?: string | undefined;
76
+ link_karma?: number | undefined;
77
+ comment_karma?: number | undefined;
78
+ created_utc?: number | undefined;
79
+ is_gold?: boolean | undefined;
80
+ subreddit?: {
81
+ title?: string | undefined;
82
+ public_description?: string | undefined;
83
+ } | undefined;
84
+ };
85
+ }>;
86
+ }
87
+ export declare function getRedditService(): RedditService;
@@ -0,0 +1,188 @@
1
+ import { z } from "zod";
2
+ import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ const redditTokenSchema = z.object({
5
+ access_token: z.string(),
6
+ token_type: z.string(),
7
+ expires_in: z.number().optional(),
8
+ });
9
+ const redditPostSchema = z.object({
10
+ json: z.object({
11
+ errors: z.array(z.unknown()),
12
+ data: z
13
+ .object({
14
+ name: z.string().optional(),
15
+ url: z.string().optional(),
16
+ id: z.string().optional(),
17
+ })
18
+ .optional(),
19
+ }),
20
+ });
21
+ const redditListingSchema = z.object({
22
+ data: z.object({
23
+ children: z.array(z.object({
24
+ data: z.object({
25
+ id: z.string(),
26
+ name: z.string(),
27
+ title: z.string().optional(),
28
+ selftext: z.string().optional(),
29
+ url: z.string().optional(),
30
+ score: z.number().optional(),
31
+ author: z.string().optional(),
32
+ created_utc: z.number().optional(),
33
+ num_comments: z.number().optional(),
34
+ subreddit: z.string().optional(),
35
+ permalink: z.string().optional(),
36
+ body: z.string().optional(),
37
+ }),
38
+ })),
39
+ after: z.string().nullable().optional(),
40
+ }),
41
+ });
42
+ const redditUserSchema = z.object({
43
+ data: z.object({
44
+ name: z.string(),
45
+ id: z.string(),
46
+ icon_img: z.string().optional(),
47
+ link_karma: z.number().optional(),
48
+ comment_karma: z.number().optional(),
49
+ created_utc: z.number().optional(),
50
+ is_gold: z.boolean().optional(),
51
+ subreddit: z
52
+ .object({
53
+ title: z.string().optional(),
54
+ public_description: z.string().optional(),
55
+ })
56
+ .optional(),
57
+ }),
58
+ });
59
+ export class RedditService {
60
+ baseUrl = config.reddit.baseUrl;
61
+ userAgent = config.reddit.userAgent;
62
+ _accessToken = null;
63
+ constructor() {
64
+ if (!config.reddit.clientId ||
65
+ !config.reddit.clientSecret ||
66
+ !config.reddit.username ||
67
+ !config.reddit.password) {
68
+ throw new CredentialsError("Reddit", [
69
+ "REDDIT_CLIENT_ID",
70
+ "REDDIT_CLIENT_SECRET",
71
+ "REDDIT_USERNAME",
72
+ "REDDIT_PASSWORD",
73
+ ]);
74
+ }
75
+ }
76
+ async authenticate() {
77
+ if (this._accessToken)
78
+ return this._accessToken;
79
+ const credentials = Buffer.from(`${config.reddit.clientId}:${config.reddit.clientSecret}`).toString("base64");
80
+ const response = await fetch("https://www.reddit.com/api/v1/access_token", {
81
+ method: "POST",
82
+ headers: {
83
+ Authorization: `Basic ${credentials}`,
84
+ "Content-Type": "application/x-www-form-urlencoded",
85
+ "User-Agent": this.userAgent,
86
+ },
87
+ body: new URLSearchParams({
88
+ grant_type: "password",
89
+ username: config.reddit.username,
90
+ password: config.reddit.password,
91
+ }),
92
+ });
93
+ if (!response.ok) {
94
+ throw new Error(`Reddit auth failed: ${response.status} ${await response.text()}`);
95
+ }
96
+ const data = redditTokenSchema.parse(await response.json());
97
+ this._accessToken = data.access_token;
98
+ return this._accessToken;
99
+ }
100
+ async headers() {
101
+ const token = await this.authenticate();
102
+ return {
103
+ Authorization: `Bearer ${token}`,
104
+ "User-Agent": this.userAgent,
105
+ "Content-Type": "application/x-www-form-urlencoded",
106
+ };
107
+ }
108
+ async submitPost(subreddit, title, kind, text, url) {
109
+ const headers = await this.headers();
110
+ const body = new URLSearchParams({ sr: subreddit, title, kind });
111
+ if (kind === "self" && text)
112
+ body.set("text", text);
113
+ if (kind === "link" && url)
114
+ body.set("url", url);
115
+ const response = await fetch(`${this.baseUrl}/api/submit`, {
116
+ method: "POST",
117
+ headers,
118
+ body,
119
+ });
120
+ if (!response.ok) {
121
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
122
+ }
123
+ return redditPostSchema.parse(await response.json());
124
+ }
125
+ async getPosts(subreddit, sort = "hot", limit = 10) {
126
+ const headers = await this.headers();
127
+ const response = await fetch(`${this.baseUrl}/r/${subreddit}/${sort}?limit=${limit}`, { method: "GET", headers });
128
+ if (!response.ok) {
129
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
130
+ }
131
+ return redditListingSchema.parse(await response.json());
132
+ }
133
+ async comment(parentId, text) {
134
+ const headers = await this.headers();
135
+ const body = new URLSearchParams({ thing_id: parentId, text });
136
+ const response = await fetch(`${this.baseUrl}/api/comment`, {
137
+ method: "POST",
138
+ headers,
139
+ body,
140
+ });
141
+ if (!response.ok) {
142
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
143
+ }
144
+ return redditPostSchema.parse(await response.json());
145
+ }
146
+ async vote(id, dir) {
147
+ const headers = await this.headers();
148
+ const body = new URLSearchParams({ id, dir: String(dir) });
149
+ const response = await fetch(`${this.baseUrl}/api/vote`, {
150
+ method: "POST",
151
+ headers,
152
+ body,
153
+ });
154
+ if (!response.ok) {
155
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
156
+ }
157
+ }
158
+ async search(query, subreddit, sort = "relevance", limit = 10) {
159
+ const headers = await this.headers();
160
+ const params = new URLSearchParams({ q: query, sort, limit: String(limit) });
161
+ const base = subreddit
162
+ ? `${this.baseUrl}/r/${subreddit}/search?${params}&restrict_sr=1`
163
+ : `${this.baseUrl}/search?${params}`;
164
+ const response = await fetch(base, { method: "GET", headers });
165
+ if (!response.ok) {
166
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
167
+ }
168
+ return redditListingSchema.parse(await response.json());
169
+ }
170
+ async getUserInfo(username) {
171
+ const headers = await this.headers();
172
+ const response = await fetch(`${this.baseUrl}/user/${username}/about`, {
173
+ method: "GET",
174
+ headers,
175
+ });
176
+ if (!response.ok) {
177
+ throw new Error(`Reddit API error ${response.status}: ${await response.text()}`);
178
+ }
179
+ return redditUserSchema.parse(await response.json());
180
+ }
181
+ }
182
+ let _instance;
183
+ export function getRedditService() {
184
+ if (!_instance)
185
+ _instance = new RedditService();
186
+ return _instance;
187
+ }
188
+ //# sourceMappingURL=reddit-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reddit-service.js","sourceRoot":"","sources":["../../src/services/reddit-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export declare class ThreadsService {
2
+ private baseUrl;
3
+ private headers;
4
+ constructor();
5
+ getProfile(): Promise<{
6
+ id: string;
7
+ username?: string | undefined;
8
+ name?: string | undefined;
9
+ biography?: string | undefined;
10
+ followers_count?: number | undefined;
11
+ profile_picture_url?: string | undefined;
12
+ }>;
13
+ createPost(text: string, replyToId?: string): Promise<{
14
+ id: string;
15
+ }>;
16
+ getPosts(limit?: number): Promise<{
17
+ data: {
18
+ id: string;
19
+ text?: string | undefined;
20
+ media_type?: string | undefined;
21
+ timestamp?: string | undefined;
22
+ permalink?: string | undefined;
23
+ like_count?: number | undefined;
24
+ replies_count?: number | undefined;
25
+ }[];
26
+ paging?: {
27
+ cursors?: {
28
+ before?: string | undefined;
29
+ after?: string | undefined;
30
+ } | undefined;
31
+ } | undefined;
32
+ }>;
33
+ deletePost(mediaId: string): Promise<void>;
34
+ }
35
+ export declare function getThreadsService(): ThreadsService;
@@ -0,0 +1,86 @@
1
+ import { z } from "zod";
2
+ import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ import { fetchJson } from "../lib/http.js";
5
+ const threadsMediaSchema = z.object({
6
+ id: z.string(),
7
+ });
8
+ const threadsPublishSchema = z.object({
9
+ id: z.string(),
10
+ });
11
+ const threadsProfileSchema = z.object({
12
+ id: z.string(),
13
+ username: z.string().optional(),
14
+ name: z.string().optional(),
15
+ biography: z.string().optional(),
16
+ followers_count: z.number().optional(),
17
+ profile_picture_url: z.string().optional(),
18
+ });
19
+ const threadsPostsSchema = z.object({
20
+ data: z.array(z.object({
21
+ id: z.string(),
22
+ text: z.string().optional(),
23
+ media_type: z.string().optional(),
24
+ timestamp: z.string().optional(),
25
+ permalink: z.string().optional(),
26
+ like_count: z.number().optional(),
27
+ replies_count: z.number().optional(),
28
+ })),
29
+ paging: z
30
+ .object({
31
+ cursors: z.object({ before: z.string().optional(), after: z.string().optional() }).optional(),
32
+ })
33
+ .optional(),
34
+ });
35
+ export class ThreadsService {
36
+ baseUrl = config.threads.baseUrl;
37
+ headers;
38
+ constructor() {
39
+ if (!config.threads.accessToken || !config.threads.userId) {
40
+ throw new CredentialsError("Threads", ["THREADS_ACCESS_TOKEN", "THREADS_USER_ID"]);
41
+ }
42
+ this.headers = {
43
+ "Content-Type": "application/json",
44
+ Authorization: `Bearer ${config.threads.accessToken}`,
45
+ };
46
+ }
47
+ async getProfile() {
48
+ const fields = "id,username,name,biography,followers_count,profile_picture_url";
49
+ return fetchJson(`${this.baseUrl}/me?fields=${fields}&access_token=${config.threads.accessToken}`, { method: "GET", headers: this.headers }, threadsProfileSchema);
50
+ }
51
+ async createPost(text, replyToId) {
52
+ const body = {
53
+ media_type: "TEXT",
54
+ text,
55
+ access_token: config.threads.accessToken,
56
+ };
57
+ if (replyToId)
58
+ body.reply_to_id = replyToId;
59
+ const container = await fetchJson(`${this.baseUrl}/${config.threads.userId}/threads`, { method: "POST", headers: this.headers, body: JSON.stringify(body) }, threadsMediaSchema);
60
+ return fetchJson(`${this.baseUrl}/${config.threads.userId}/threads_publish`, {
61
+ method: "POST",
62
+ headers: this.headers,
63
+ body: JSON.stringify({
64
+ creation_id: container.id,
65
+ access_token: config.threads.accessToken,
66
+ }),
67
+ }, threadsPublishSchema);
68
+ }
69
+ async getPosts(limit = 10) {
70
+ const fields = "id,text,media_type,timestamp,permalink,like_count,replies_count";
71
+ return fetchJson(`${this.baseUrl}/${config.threads.userId}/threads?fields=${fields}&limit=${limit}&access_token=${config.threads.accessToken}`, { method: "GET", headers: this.headers }, threadsPostsSchema);
72
+ }
73
+ async deletePost(mediaId) {
74
+ const response = await fetch(`${this.baseUrl}/${mediaId}?access_token=${config.threads.accessToken}`, { method: "DELETE", headers: this.headers });
75
+ if (!response.ok) {
76
+ throw new Error(`Threads API error ${response.status}: ${await response.text()}`);
77
+ }
78
+ }
79
+ }
80
+ let _instance;
81
+ export function getThreadsService() {
82
+ if (!_instance)
83
+ _instance = new ThreadsService();
84
+ return _instance;
85
+ }
86
+ //# sourceMappingURL=threads-service.js.map