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.
- package/README.md +56 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.js +17 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/services/reddit-service.d.ts +87 -0
- package/dist/services/reddit-service.js +188 -0
- package/dist/services/reddit-service.js.map +1 -0
- package/dist/services/threads-service.d.ts +35 -0
- package/dist/services/threads-service.js +86 -0
- package/dist/services/threads-service.js.map +1 -0
- package/dist/services/tiktok-service.d.ts +79 -0
- package/dist/services/tiktok-service.js +138 -0
- package/dist/services/tiktok-service.js.map +1 -0
- package/dist/tools/reddit-tools/comment.d.ts +16 -0
- package/dist/tools/reddit-tools/comment.js +30 -0
- package/dist/tools/reddit-tools/comment.js.map +1 -0
- package/dist/tools/reddit-tools/get-posts.d.ts +28 -0
- package/dist/tools/reddit-tools/get-posts.js +36 -0
- package/dist/tools/reddit-tools/get-posts.js.map +1 -0
- package/dist/tools/reddit-tools/get-user-info.d.ts +14 -0
- package/dist/tools/reddit-tools/get-user-info.js +37 -0
- package/dist/tools/reddit-tools/get-user-info.js.map +1 -0
- package/dist/tools/reddit-tools/search.d.ts +28 -0
- package/dist/tools/reddit-tools/search.js +40 -0
- package/dist/tools/reddit-tools/search.js.map +1 -0
- package/dist/tools/reddit-tools/submit-post.d.ts +28 -0
- package/dist/tools/reddit-tools/submit-post.js +31 -0
- package/dist/tools/reddit-tools/submit-post.js.map +1 -0
- package/dist/tools/reddit-tools/vote.d.ts +24 -0
- package/dist/tools/reddit-tools/vote.js +30 -0
- package/dist/tools/reddit-tools/vote.js.map +1 -0
- package/dist/tools/threads-tools/create-post.d.ts +14 -0
- package/dist/tools/threads-tools/create-post.js +23 -0
- package/dist/tools/threads-tools/create-post.js.map +1 -0
- package/dist/tools/threads-tools/delete-post.d.ts +14 -0
- package/dist/tools/threads-tools/delete-post.js +23 -0
- package/dist/tools/threads-tools/delete-post.js.map +1 -0
- package/dist/tools/threads-tools/get-posts.d.ts +14 -0
- package/dist/tools/threads-tools/get-posts.js +31 -0
- package/dist/tools/threads-tools/get-posts.js.map +1 -0
- package/dist/tools/threads-tools/get-profile.d.ts +7 -0
- package/dist/tools/threads-tools/get-profile.js +31 -0
- package/dist/tools/threads-tools/get-profile.js.map +1 -0
- package/dist/tools/threads-tools/reply.d.ts +16 -0
- package/dist/tools/threads-tools/reply.js +24 -0
- package/dist/tools/threads-tools/reply.js.map +1 -0
- package/dist/tools/tiktok-tools/direct-post-video.d.ts +34 -0
- package/dist/tools/tiktok-tools/direct-post-video.js +34 -0
- package/dist/tools/tiktok-tools/direct-post-video.js.map +1 -0
- package/dist/tools/tiktok-tools/get-post-status.d.ts +14 -0
- package/dist/tools/tiktok-tools/get-post-status.js +36 -0
- package/dist/tools/tiktok-tools/get-post-status.js.map +1 -0
- package/dist/tools/tiktok-tools/get-user-info.d.ts +7 -0
- package/dist/tools/tiktok-tools/get-user-info.js +36 -0
- package/dist/tools/tiktok-tools/get-user-info.js.map +1 -0
- package/dist/tools/tiktok-tools/photo-post.d.ts +30 -0
- package/dist/tools/tiktok-tools/photo-post.js +36 -0
- package/dist/tools/tiktok-tools/photo-post.js.map +1 -0
- package/dist/tools/tiktok-tools/query-creator-info.d.ts +7 -0
- package/dist/tools/tiktok-tools/query-creator-info.js +39 -0
- package/dist/tools/tiktok-tools/query-creator-info.js.map +1 -0
- 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":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -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
|
};
|
package/dist/lib/config.js
CHANGED
|
@@ -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
|
package/dist/lib/config.js.map
CHANGED
|
@@ -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
|