@pegasusheavy/threads-mcp 1.0.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/.cursorrules/no-summaries.mdc +1 -0
- package/.cursorrules/update-website.mdc +8 -0
- package/.husky/README.md +37 -0
- package/.husky/commit-msg +3 -0
- package/.husky/pre-commit +12 -0
- package/.husky/pre-push +31 -0
- package/CHANGELOG.md +49 -0
- package/LICENSE +22 -0
- package/README.md +336 -0
- package/commitlint.config.js +27 -0
- package/dist/client/enhanced-threads-client.d.ts +49 -0
- package/dist/client/enhanced-threads-client.d.ts.map +1 -0
- package/dist/client/enhanced-threads-client.js +175 -0
- package/dist/client/enhanced-threads-client.js.map +1 -0
- package/dist/client/threads-client.d.ts +23 -0
- package/dist/client/threads-client.d.ts.map +1 -0
- package/dist/client/threads-client.js +208 -0
- package/dist/client/threads-client.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +382 -0
- package/dist/server.js.map +1 -0
- package/dist/types/threads.d.ts +298 -0
- package/dist/types/threads.d.ts.map +1 -0
- package/dist/types/threads.js +76 -0
- package/dist/types/threads.js.map +1 -0
- package/dist/utils/cache.d.ts +42 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +147 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +31 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +99 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/webhook.d.ts +67 -0
- package/dist/utils/webhook.d.ts.map +1 -0
- package/dist/utils/webhook.js +187 -0
- package/dist/utils/webhook.js.map +1 -0
- package/llms.txt +197 -0
- package/package.json +65 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ThreadsClient } from './threads-client.js';
|
|
2
|
+
import { RateLimiter } from '../utils/rate-limiter.js';
|
|
3
|
+
import { AutoCleanCache } from '../utils/cache.js';
|
|
4
|
+
import { WebhookManager } from '../utils/webhook.js';
|
|
5
|
+
export class EnhancedThreadsClient extends ThreadsClient {
|
|
6
|
+
rateLimiter;
|
|
7
|
+
cache;
|
|
8
|
+
webhookManager;
|
|
9
|
+
constructor(config) {
|
|
10
|
+
super(config);
|
|
11
|
+
if (config.enableRateLimiting !== false) {
|
|
12
|
+
this.rateLimiter = new RateLimiter({
|
|
13
|
+
maxTokens: config.rateLimitOptions?.maxTokens || 100,
|
|
14
|
+
refillRate: config.rateLimitOptions?.refillRate || 10,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (config.enableCaching !== false) {
|
|
18
|
+
this.cache = new AutoCleanCache({
|
|
19
|
+
ttl: config.cacheOptions?.ttl || 60000,
|
|
20
|
+
maxSize: config.cacheOptions?.maxSize || 100,
|
|
21
|
+
cleanupIntervalMs: 30000,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
if (config.enableWebhooks) {
|
|
25
|
+
this.webhookManager = new WebhookManager({
|
|
26
|
+
maxRetries: 3,
|
|
27
|
+
retryDelay: 1000,
|
|
28
|
+
timeout: 5000,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async getProfile(fields) {
|
|
33
|
+
await this.checkRateLimit();
|
|
34
|
+
const cacheKey = `profile:${fields?.join(',') || 'default'}`;
|
|
35
|
+
const cached = this.cache?.get(cacheKey);
|
|
36
|
+
if (cached) {
|
|
37
|
+
return cached;
|
|
38
|
+
}
|
|
39
|
+
const profile = await super.getProfile(fields);
|
|
40
|
+
this.cache?.set(cacheKey, profile);
|
|
41
|
+
return profile;
|
|
42
|
+
}
|
|
43
|
+
async getThreads(params) {
|
|
44
|
+
await this.checkRateLimit();
|
|
45
|
+
const cacheKey = `threads:${JSON.stringify(params || {})}`;
|
|
46
|
+
const cached = this.cache?.get(cacheKey);
|
|
47
|
+
if (cached) {
|
|
48
|
+
return cached;
|
|
49
|
+
}
|
|
50
|
+
const threads = await super.getThreads(params);
|
|
51
|
+
this.cache?.set(cacheKey, threads, 30000);
|
|
52
|
+
return threads;
|
|
53
|
+
}
|
|
54
|
+
async getThread(threadId, fields) {
|
|
55
|
+
await this.checkRateLimit();
|
|
56
|
+
const cacheKey = `thread:${threadId}:${fields?.join(',') || 'default'}`;
|
|
57
|
+
const cached = this.cache?.get(cacheKey);
|
|
58
|
+
if (cached) {
|
|
59
|
+
return cached;
|
|
60
|
+
}
|
|
61
|
+
const thread = await super.getThread(threadId, fields);
|
|
62
|
+
this.cache?.set(cacheKey, thread);
|
|
63
|
+
return thread;
|
|
64
|
+
}
|
|
65
|
+
async createThread(params) {
|
|
66
|
+
await this.checkRateLimit(2);
|
|
67
|
+
const result = await super.createThread(params);
|
|
68
|
+
if (this.webhookManager) {
|
|
69
|
+
await this.webhookManager.trigger('thread.created', {
|
|
70
|
+
threadId: result.id,
|
|
71
|
+
params,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
this.invalidateCache('threads:');
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
async getThreadInsights(threadId, params) {
|
|
78
|
+
await this.checkRateLimit();
|
|
79
|
+
const cacheKey = `insights:${threadId}:${JSON.stringify(params)}`;
|
|
80
|
+
const cached = this.cache?.get(cacheKey);
|
|
81
|
+
if (cached) {
|
|
82
|
+
return cached;
|
|
83
|
+
}
|
|
84
|
+
const insights = await super.getThreadInsights(threadId, params);
|
|
85
|
+
this.cache?.set(cacheKey, insights, 300000);
|
|
86
|
+
return insights;
|
|
87
|
+
}
|
|
88
|
+
async getUserInsights(params) {
|
|
89
|
+
await this.checkRateLimit();
|
|
90
|
+
const cacheKey = `user-insights:${JSON.stringify(params)}`;
|
|
91
|
+
const cached = this.cache?.get(cacheKey);
|
|
92
|
+
if (cached) {
|
|
93
|
+
return cached;
|
|
94
|
+
}
|
|
95
|
+
const insights = await super.getUserInsights(params);
|
|
96
|
+
this.cache?.set(cacheKey, insights, 300000);
|
|
97
|
+
return insights;
|
|
98
|
+
}
|
|
99
|
+
async getReplies(threadId, params) {
|
|
100
|
+
await this.checkRateLimit();
|
|
101
|
+
const cacheKey = `replies:${threadId}:${JSON.stringify(params || {})}`;
|
|
102
|
+
const cached = this.cache?.get(cacheKey);
|
|
103
|
+
if (cached) {
|
|
104
|
+
return cached;
|
|
105
|
+
}
|
|
106
|
+
const replies = await super.getReplies(threadId, params);
|
|
107
|
+
this.cache?.set(cacheKey, replies, 30000);
|
|
108
|
+
return replies;
|
|
109
|
+
}
|
|
110
|
+
async getConversation(threadId, params) {
|
|
111
|
+
await this.checkRateLimit();
|
|
112
|
+
const cacheKey = `conversation:${threadId}:${JSON.stringify(params || {})}`;
|
|
113
|
+
const cached = this.cache?.get(cacheKey);
|
|
114
|
+
if (cached) {
|
|
115
|
+
return cached;
|
|
116
|
+
}
|
|
117
|
+
const conversation = await super.getConversation(threadId, params);
|
|
118
|
+
this.cache?.set(cacheKey, conversation, 30000);
|
|
119
|
+
return conversation;
|
|
120
|
+
}
|
|
121
|
+
async replyToThread(threadId, text, replyControl) {
|
|
122
|
+
await this.checkRateLimit(2);
|
|
123
|
+
const result = await super.replyToThread(threadId, text, replyControl);
|
|
124
|
+
if (this.webhookManager) {
|
|
125
|
+
await this.webhookManager.trigger('reply.created', {
|
|
126
|
+
replyId: result.id,
|
|
127
|
+
threadId,
|
|
128
|
+
text,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
this.invalidateCache(`replies:${threadId}`);
|
|
132
|
+
this.invalidateCache(`conversation:${threadId}`);
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
async checkRateLimit(tokens = 1) {
|
|
136
|
+
if (this.rateLimiter) {
|
|
137
|
+
await this.rateLimiter.consume(tokens);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
invalidateCache(prefix) {
|
|
141
|
+
if (!this.cache)
|
|
142
|
+
return;
|
|
143
|
+
const keys = this.cache.keys();
|
|
144
|
+
keys.forEach((key) => {
|
|
145
|
+
if (key.startsWith(prefix)) {
|
|
146
|
+
this.cache.delete(key);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
getWebhookManager() {
|
|
151
|
+
return this.webhookManager;
|
|
152
|
+
}
|
|
153
|
+
getCache() {
|
|
154
|
+
return this.cache;
|
|
155
|
+
}
|
|
156
|
+
getRateLimiter() {
|
|
157
|
+
return this.rateLimiter;
|
|
158
|
+
}
|
|
159
|
+
clearCache() {
|
|
160
|
+
this.cache?.clear();
|
|
161
|
+
}
|
|
162
|
+
resetRateLimit() {
|
|
163
|
+
this.rateLimiter?.reset();
|
|
164
|
+
}
|
|
165
|
+
getStats() {
|
|
166
|
+
return {
|
|
167
|
+
cache: this.cache?.stats(),
|
|
168
|
+
rateLimiter: this.rateLimiter
|
|
169
|
+
? { tokens: this.rateLimiter.getTokens() }
|
|
170
|
+
: undefined,
|
|
171
|
+
webhooks: this.webhookManager?.stats(),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=enhanced-threads-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhanced-threads-client.js","sourceRoot":"","sources":["../../src/client/enhanced-threads-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ThreadsConfig, ThreadsUser, ThreadsMedia, ThreadsInsights, ThreadsReplies, ThreadsConversation, CreateThreadResponse, CreateThreadParams, GetMediaParams, GetInsightsParams, GetRepliesParams } from '../types/threads.js';
|
|
2
|
+
export declare class ThreadsAPIError extends Error {
|
|
3
|
+
statusCode?: number | undefined;
|
|
4
|
+
response?: unknown | undefined;
|
|
5
|
+
constructor(message: string, statusCode?: number | undefined, response?: unknown | undefined);
|
|
6
|
+
}
|
|
7
|
+
export declare class ThreadsClient {
|
|
8
|
+
private client;
|
|
9
|
+
private config;
|
|
10
|
+
private baseUrl;
|
|
11
|
+
constructor(config: ThreadsConfig);
|
|
12
|
+
getProfile(fields?: string[]): Promise<ThreadsUser>;
|
|
13
|
+
getThreads(params?: GetMediaParams): Promise<ThreadsMedia[]>;
|
|
14
|
+
getThread(threadId: string, fields?: string[]): Promise<ThreadsMedia>;
|
|
15
|
+
createThread(params: CreateThreadParams): Promise<CreateThreadResponse>;
|
|
16
|
+
getThreadInsights(threadId: string, params: GetInsightsParams): Promise<ThreadsInsights[]>;
|
|
17
|
+
getUserInsights(params: GetInsightsParams): Promise<ThreadsInsights[]>;
|
|
18
|
+
getReplies(threadId: string, params?: GetRepliesParams): Promise<ThreadsReplies>;
|
|
19
|
+
getConversation(threadId: string, params?: GetRepliesParams): Promise<ThreadsConversation>;
|
|
20
|
+
replyToThread(threadId: string, text: string, replyControl?: CreateThreadParams['replyControl']): Promise<CreateThreadResponse>;
|
|
21
|
+
validateToken(): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=threads-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-client.d.ts","sourceRoot":"","sources":["../../src/client/threads-client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,WAAW,EACX,YAAY,EACZ,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAOjB,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,eAAgB,SAAQ,KAAK;IAG/B,UAAU,CAAC,EAAE,MAAM;IACnB,QAAQ,CAAC,EAAE,OAAO;gBAFzB,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,QAAQ,CAAC,EAAE,OAAO,YAAA;CAK5B;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,aAAa;IAiD3B,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IAgBnD,UAAU,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAmC5D,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC;IA8BrE,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmDvE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAmB1F,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAmBtE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiBhF,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAiB1F,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAW/H,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;CAQxC"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { ThreadsUserSchema, ThreadsMediaSchema, ThreadsInsightsSchema, ThreadsRepliesSchema, ThreadsConversationSchema, CreateThreadResponseSchema, } from '../types/threads.js';
|
|
3
|
+
export class ThreadsAPIError extends Error {
|
|
4
|
+
statusCode;
|
|
5
|
+
response;
|
|
6
|
+
constructor(message, statusCode, response) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.statusCode = statusCode;
|
|
9
|
+
this.response = response;
|
|
10
|
+
this.name = 'ThreadsAPIError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class ThreadsClient {
|
|
14
|
+
client;
|
|
15
|
+
config;
|
|
16
|
+
baseUrl;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = {
|
|
19
|
+
apiVersion: 'v1.0',
|
|
20
|
+
...config,
|
|
21
|
+
};
|
|
22
|
+
this.baseUrl = `https://graph.threads.net/${this.config.apiVersion}`;
|
|
23
|
+
this.client = axios.create({
|
|
24
|
+
baseURL: this.baseUrl,
|
|
25
|
+
timeout: 30000,
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
this.client.interceptors.request.use((config) => {
|
|
31
|
+
config.params = {
|
|
32
|
+
...config.params,
|
|
33
|
+
access_token: this.config.accessToken,
|
|
34
|
+
};
|
|
35
|
+
return config;
|
|
36
|
+
});
|
|
37
|
+
this.client.interceptors.response.use((response) => response, (error) => {
|
|
38
|
+
if (error.response) {
|
|
39
|
+
throw new ThreadsAPIError(error.response.data
|
|
40
|
+
? JSON.stringify(error.response.data)
|
|
41
|
+
: 'Unknown API error', error.response.status, error.response.data);
|
|
42
|
+
}
|
|
43
|
+
else if (error.request) {
|
|
44
|
+
throw new ThreadsAPIError('No response received from Threads API');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
throw new ThreadsAPIError(`Request failed: ${error.message}`);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async getProfile(fields) {
|
|
52
|
+
const defaultFields = ['id', 'username', 'name', 'threads_profile_picture_url', 'threads_biography'];
|
|
53
|
+
const requestFields = fields || defaultFields;
|
|
54
|
+
const response = await this.client.get(`/${this.config.userId}`, {
|
|
55
|
+
params: {
|
|
56
|
+
fields: requestFields.join(','),
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
return ThreadsUserSchema.parse(response.data);
|
|
60
|
+
}
|
|
61
|
+
async getThreads(params) {
|
|
62
|
+
const defaultFields = [
|
|
63
|
+
'id',
|
|
64
|
+
'media_product_type',
|
|
65
|
+
'media_type',
|
|
66
|
+
'media_url',
|
|
67
|
+
'permalink',
|
|
68
|
+
'username',
|
|
69
|
+
'text',
|
|
70
|
+
'timestamp',
|
|
71
|
+
'shortcode',
|
|
72
|
+
'thumbnail_url',
|
|
73
|
+
'children',
|
|
74
|
+
'is_quote_post',
|
|
75
|
+
];
|
|
76
|
+
const requestFields = params?.fields || defaultFields;
|
|
77
|
+
const response = await this.client.get(`/${this.config.userId}/threads`, {
|
|
78
|
+
params: {
|
|
79
|
+
fields: requestFields.join(','),
|
|
80
|
+
limit: params?.limit || 25,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
if (!response.data.data) {
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
return response.data.data.map((item) => ThreadsMediaSchema.parse(item));
|
|
87
|
+
}
|
|
88
|
+
async getThread(threadId, fields) {
|
|
89
|
+
const defaultFields = [
|
|
90
|
+
'id',
|
|
91
|
+
'media_product_type',
|
|
92
|
+
'media_type',
|
|
93
|
+
'media_url',
|
|
94
|
+
'permalink',
|
|
95
|
+
'username',
|
|
96
|
+
'text',
|
|
97
|
+
'timestamp',
|
|
98
|
+
'shortcode',
|
|
99
|
+
'thumbnail_url',
|
|
100
|
+
'children',
|
|
101
|
+
'is_quote_post',
|
|
102
|
+
];
|
|
103
|
+
const requestFields = fields || defaultFields;
|
|
104
|
+
const response = await this.client.get(`/${threadId}`, {
|
|
105
|
+
params: {
|
|
106
|
+
fields: requestFields.join(','),
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
return ThreadsMediaSchema.parse(response.data);
|
|
110
|
+
}
|
|
111
|
+
async createThread(params) {
|
|
112
|
+
const containerParams = {
|
|
113
|
+
media_type: 'TEXT',
|
|
114
|
+
};
|
|
115
|
+
if (params.text) {
|
|
116
|
+
containerParams.text = params.text;
|
|
117
|
+
}
|
|
118
|
+
if (params.imageUrl) {
|
|
119
|
+
containerParams.media_type = 'IMAGE';
|
|
120
|
+
containerParams.image_url = params.imageUrl;
|
|
121
|
+
}
|
|
122
|
+
if (params.videoUrl) {
|
|
123
|
+
containerParams.media_type = 'VIDEO';
|
|
124
|
+
containerParams.video_url = params.videoUrl;
|
|
125
|
+
}
|
|
126
|
+
if (params.replyToId) {
|
|
127
|
+
containerParams.reply_to_id = params.replyToId;
|
|
128
|
+
}
|
|
129
|
+
if (params.replyControl) {
|
|
130
|
+
containerParams.reply_control = params.replyControl;
|
|
131
|
+
}
|
|
132
|
+
const containerResponse = await this.client.post(`/${this.config.userId}/threads`, null, {
|
|
133
|
+
params: containerParams,
|
|
134
|
+
});
|
|
135
|
+
const containerId = containerResponse.data.id;
|
|
136
|
+
const publishResponse = await this.client.post(`/${this.config.userId}/threads_publish`, null, {
|
|
137
|
+
params: {
|
|
138
|
+
creation_id: containerId,
|
|
139
|
+
},
|
|
140
|
+
});
|
|
141
|
+
return CreateThreadResponseSchema.parse(publishResponse.data);
|
|
142
|
+
}
|
|
143
|
+
async getThreadInsights(threadId, params) {
|
|
144
|
+
const response = await this.client.get(`/${threadId}/insights`, {
|
|
145
|
+
params: {
|
|
146
|
+
metric: params.metric.join(','),
|
|
147
|
+
...(params.since && { since: params.since }),
|
|
148
|
+
...(params.until && { until: params.until }),
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
if (!response.data.data) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
return response.data.data.map((item) => ThreadsInsightsSchema.parse(item));
|
|
155
|
+
}
|
|
156
|
+
async getUserInsights(params) {
|
|
157
|
+
const response = await this.client.get(`/${this.config.userId}/threads_insights`, {
|
|
158
|
+
params: {
|
|
159
|
+
metric: params.metric.join(','),
|
|
160
|
+
...(params.since && { since: params.since }),
|
|
161
|
+
...(params.until && { until: params.until }),
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
if (!response.data.data) {
|
|
165
|
+
return [];
|
|
166
|
+
}
|
|
167
|
+
return response.data.data.map((item) => ThreadsInsightsSchema.parse(item));
|
|
168
|
+
}
|
|
169
|
+
async getReplies(threadId, params) {
|
|
170
|
+
const defaultFields = ['id', 'text', 'username', 'permalink', 'timestamp'];
|
|
171
|
+
const requestFields = params?.fields || defaultFields;
|
|
172
|
+
const response = await this.client.get(`/${threadId}/replies`, {
|
|
173
|
+
params: {
|
|
174
|
+
fields: requestFields.join(','),
|
|
175
|
+
...(params?.reverse !== undefined && { reverse: params.reverse }),
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
return ThreadsRepliesSchema.parse(response.data);
|
|
179
|
+
}
|
|
180
|
+
async getConversation(threadId, params) {
|
|
181
|
+
const defaultFields = ['id', 'text', 'username', 'permalink', 'timestamp'];
|
|
182
|
+
const requestFields = params?.fields || defaultFields;
|
|
183
|
+
const response = await this.client.get(`/${threadId}/conversation`, {
|
|
184
|
+
params: {
|
|
185
|
+
fields: requestFields.join(','),
|
|
186
|
+
...(params?.reverse !== undefined && { reverse: params.reverse }),
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
return ThreadsConversationSchema.parse(response.data);
|
|
190
|
+
}
|
|
191
|
+
async replyToThread(threadId, text, replyControl) {
|
|
192
|
+
return this.createThread({
|
|
193
|
+
text,
|
|
194
|
+
replyToId: threadId,
|
|
195
|
+
replyControl,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
async validateToken() {
|
|
199
|
+
try {
|
|
200
|
+
await this.getProfile(['id']);
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=threads-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-client.js","sourceRoot":"","sources":["../../src/client/threads-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ThreadsMCPServer } from './server.js';
|
|
3
|
+
import { ThreadsClient } from './client/threads-client.js';
|
|
4
|
+
async function main() {
|
|
5
|
+
const accessToken = process.env.THREADS_ACCESS_TOKEN;
|
|
6
|
+
const userId = process.env.THREADS_USER_ID;
|
|
7
|
+
if (!accessToken || !userId) {
|
|
8
|
+
console.error('Error: THREADS_ACCESS_TOKEN and THREADS_USER_ID environment variables are required');
|
|
9
|
+
console.error('');
|
|
10
|
+
console.error('Please set these environment variables:');
|
|
11
|
+
console.error(' export THREADS_ACCESS_TOKEN="your-access-token"');
|
|
12
|
+
console.error(' export THREADS_USER_ID="your-user-id"');
|
|
13
|
+
console.error('');
|
|
14
|
+
console.error('Get your access token from: https://developers.facebook.com/docs/threads');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const client = new ThreadsClient({
|
|
19
|
+
accessToken,
|
|
20
|
+
userId,
|
|
21
|
+
});
|
|
22
|
+
const isValid = await client.validateToken();
|
|
23
|
+
if (!isValid) {
|
|
24
|
+
console.error('Error: Invalid access token or user ID');
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
const server = new ThreadsMCPServer();
|
|
28
|
+
server.setClient(client);
|
|
29
|
+
console.error('Threads MCP Server starting...');
|
|
30
|
+
await server.run();
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('Failed to start server:', error);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
main().catch((error) => {
|
|
38
|
+
console.error('Unhandled error:', error);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,KAAK,UAAU,IAAI;IACjB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;IACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE3C,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QACpG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC;YAC/B,WAAW;YACX,MAAM;SACP,CAAC,CAAC;QAGH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEzB,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAChD,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ThreadsClient } from './client/threads-client.js';
|
|
2
|
+
export declare class ThreadsMCPServer {
|
|
3
|
+
private server;
|
|
4
|
+
private client;
|
|
5
|
+
constructor();
|
|
6
|
+
private setupHandlers;
|
|
7
|
+
setClient(client: ThreadsClient): void;
|
|
8
|
+
run(): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAmD3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAA8B;;IAkB5C,OAAO,CAAC,aAAa;IA8UrB,SAAS,CAAC,MAAM,EAAE,aAAa;IAIzB,GAAG;CAIV"}
|