@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.
Files changed (44) hide show
  1. package/.cursorrules/no-summaries.mdc +1 -0
  2. package/.cursorrules/update-website.mdc +8 -0
  3. package/.husky/README.md +37 -0
  4. package/.husky/commit-msg +3 -0
  5. package/.husky/pre-commit +12 -0
  6. package/.husky/pre-push +31 -0
  7. package/CHANGELOG.md +49 -0
  8. package/LICENSE +22 -0
  9. package/README.md +336 -0
  10. package/commitlint.config.js +27 -0
  11. package/dist/client/enhanced-threads-client.d.ts +49 -0
  12. package/dist/client/enhanced-threads-client.d.ts.map +1 -0
  13. package/dist/client/enhanced-threads-client.js +175 -0
  14. package/dist/client/enhanced-threads-client.js.map +1 -0
  15. package/dist/client/threads-client.d.ts +23 -0
  16. package/dist/client/threads-client.d.ts.map +1 -0
  17. package/dist/client/threads-client.js +208 -0
  18. package/dist/client/threads-client.js.map +1 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +41 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/server.d.ts +10 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +382 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/types/threads.d.ts +298 -0
  28. package/dist/types/threads.d.ts.map +1 -0
  29. package/dist/types/threads.js +76 -0
  30. package/dist/types/threads.js.map +1 -0
  31. package/dist/utils/cache.d.ts +42 -0
  32. package/dist/utils/cache.d.ts.map +1 -0
  33. package/dist/utils/cache.js +147 -0
  34. package/dist/utils/cache.js.map +1 -0
  35. package/dist/utils/rate-limiter.d.ts +31 -0
  36. package/dist/utils/rate-limiter.d.ts.map +1 -0
  37. package/dist/utils/rate-limiter.js +99 -0
  38. package/dist/utils/rate-limiter.js.map +1 -0
  39. package/dist/utils/webhook.d.ts +67 -0
  40. package/dist/utils/webhook.d.ts.map +1 -0
  41. package/dist/utils/webhook.js +187 -0
  42. package/dist/utils/webhook.js.map +1 -0
  43. package/llms.txt +197 -0
  44. 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":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AA4BrD,MAAM,OAAO,qBAAsB,SAAQ,aAAa;IAC9C,WAAW,CAAe;IAC1B,KAAK,CAAkB;IACvB,cAAc,CAAkB;IAExC,YAAY,MAA6B;QACvC,KAAK,CAAC,MAAM,CAAC,CAAC;QAGd,IAAI,MAAM,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,gBAAgB,EAAE,SAAS,IAAI,GAAG;gBACpD,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,UAAU,IAAI,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC;gBAC9B,GAAG,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,IAAI,KAAK;gBACtC,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE,OAAO,IAAI,GAAG;gBAC5C,iBAAiB,EAAE,KAAK;aACzB,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,cAAc,CAAC;gBACvC,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAKQ,KAAK,CAAC,UAAU,CAAC,MAAiB;QACzC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,WAAW,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEnC,OAAO,OAAO,CAAC;IACjB,CAAC;IAKQ,KAAK,CAAC,UAAU,CAAC,MAAuB;QAC/C,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAKQ,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,MAAiB;QAC1D,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,UAAU,QAAQ,IAAI,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAElC,OAAO,MAAM,CAAC;IAChB,CAAC;IAKQ,KAAK,CAAC,YAAY,CAAC,MAA0B;QACpD,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAGhD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE;gBAClD,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAEjC,OAAO,MAAM,CAAC;IAChB,CAAC;IAKQ,KAAK,CAAC,iBAAiB,CAC9B,QAAgB,EAChB,MAAyB;QAEzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,YAAY,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE5C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKQ,KAAK,CAAC,eAAe,CAAC,MAAyB;QACtD,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,iBAAiB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrD,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE5C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAKQ,KAAK,CAAC,UAAU,CACvB,QAAgB,EAChB,MAAyB;QAEzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,WAAW,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAE1C,OAAO,OAAO,CAAC;IACjB,CAAC;IAKQ,KAAK,CAAC,eAAe,CAC5B,QAAgB,EAChB,MAAyB;QAEzB,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,gBAAgB,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAE/C,OAAO,YAAY,CAAC;IACtB,CAAC;IAKQ,KAAK,CAAC,aAAa,CAC1B,QAAgB,EAChB,IAAY,EACZ,YAAiD;QAEjD,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAE7B,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;QAGvE,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,eAAe,EAAE;gBACjD,OAAO,EAAE,MAAM,CAAC,EAAE;gBAClB,QAAQ;gBACR,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,CAAC,eAAe,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,eAAe,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;QAEjD,OAAO,MAAM,CAAC;IAChB,CAAC;IAKO,KAAK,CAAC,cAAc,CAAC,SAAiB,CAAC;QAC7C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAKO,eAAe,CAAC,MAAc;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAKD,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAKD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAKD,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAKD,UAAU;QACR,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;IACtB,CAAC;IAKD,cAAc;QACZ,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAKD,QAAQ;QAKN,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE;YAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC3B,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE;gBAC1C,CAAC,CAAC,SAAS;YACb,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE;SACvC,CAAC;IACJ,CAAC;CACF"}
@@ -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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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}
@@ -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"}