@exileum/meta-mcp 3.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +335 -0
  3. package/dist/config.d.ts +10 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +11 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +4 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +93 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/prompts/index.d.ts +3 -0
  12. package/dist/prompts/index.d.ts.map +1 -0
  13. package/dist/prompts/index.js +61 -0
  14. package/dist/prompts/index.js.map +1 -0
  15. package/dist/resources/instagram.d.ts +4 -0
  16. package/dist/resources/instagram.d.ts.map +1 -0
  17. package/dist/resources/instagram.js +17 -0
  18. package/dist/resources/instagram.js.map +1 -0
  19. package/dist/resources/threads.d.ts +4 -0
  20. package/dist/resources/threads.d.ts.map +1 -0
  21. package/dist/resources/threads.js +17 -0
  22. package/dist/resources/threads.js.map +1 -0
  23. package/dist/services/meta-client.d.ts +25 -0
  24. package/dist/services/meta-client.d.ts.map +1 -0
  25. package/dist/services/meta-client.js +115 -0
  26. package/dist/services/meta-client.js.map +1 -0
  27. package/dist/tools/instagram/comments.d.ts +4 -0
  28. package/dist/tools/instagram/comments.d.ts.map +1 -0
  29. package/dist/tools/instagram/comments.js +111 -0
  30. package/dist/tools/instagram/comments.js.map +1 -0
  31. package/dist/tools/instagram/hashtags.d.ts +4 -0
  32. package/dist/tools/instagram/hashtags.d.ts.map +1 -0
  33. package/dist/tools/instagram/hashtags.js +77 -0
  34. package/dist/tools/instagram/hashtags.js.map +1 -0
  35. package/dist/tools/instagram/media.d.ts +4 -0
  36. package/dist/tools/instagram/media.d.ts.map +1 -0
  37. package/dist/tools/instagram/media.js +82 -0
  38. package/dist/tools/instagram/media.js.map +1 -0
  39. package/dist/tools/instagram/mentions.d.ts +4 -0
  40. package/dist/tools/instagram/mentions.d.ts.map +1 -0
  41. package/dist/tools/instagram/mentions.js +41 -0
  42. package/dist/tools/instagram/mentions.js.map +1 -0
  43. package/dist/tools/instagram/messaging.d.ts +4 -0
  44. package/dist/tools/instagram/messaging.d.ts.map +1 -0
  45. package/dist/tools/instagram/messaging.js +80 -0
  46. package/dist/tools/instagram/messaging.js.map +1 -0
  47. package/dist/tools/instagram/profile.d.ts +4 -0
  48. package/dist/tools/instagram/profile.d.ts.map +1 -0
  49. package/dist/tools/instagram/profile.js +86 -0
  50. package/dist/tools/instagram/profile.js.map +1 -0
  51. package/dist/tools/instagram/publishing.d.ts +4 -0
  52. package/dist/tools/instagram/publishing.d.ts.map +1 -0
  53. package/dist/tools/instagram/publishing.js +202 -0
  54. package/dist/tools/instagram/publishing.js.map +1 -0
  55. package/dist/tools/meta/auth.d.ts +4 -0
  56. package/dist/tools/meta/auth.d.ts.map +1 -0
  57. package/dist/tools/meta/auth.js +82 -0
  58. package/dist/tools/meta/auth.js.map +1 -0
  59. package/dist/tools/threads/insights.d.ts +4 -0
  60. package/dist/tools/threads/insights.d.ts.map +1 -0
  61. package/dist/tools/threads/insights.js +37 -0
  62. package/dist/tools/threads/insights.js.map +1 -0
  63. package/dist/tools/threads/media.d.ts +4 -0
  64. package/dist/tools/threads/media.d.ts.map +1 -0
  65. package/dist/tools/threads/media.js +84 -0
  66. package/dist/tools/threads/media.js.map +1 -0
  67. package/dist/tools/threads/profile.d.ts +4 -0
  68. package/dist/tools/threads/profile.d.ts.map +1 -0
  69. package/dist/tools/threads/profile.js +42 -0
  70. package/dist/tools/threads/profile.js.map +1 -0
  71. package/dist/tools/threads/publishing.d.ts +4 -0
  72. package/dist/tools/threads/publishing.d.ts.map +1 -0
  73. package/dist/tools/threads/publishing.js +223 -0
  74. package/dist/tools/threads/publishing.js.map +1 -0
  75. package/dist/tools/threads/replies.d.ts +4 -0
  76. package/dist/tools/threads/replies.d.ts.map +1 -0
  77. package/dist/tools/threads/replies.js +99 -0
  78. package/dist/tools/threads/replies.js.map +1 -0
  79. package/dist/types.d.ts +45 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +60 -0
@@ -0,0 +1,84 @@
1
+ import { z } from "zod";
2
+ export function registerThreadsMediaTools(server, client) {
3
+ // ─── threads_get_posts ───────────────────────────────────────
4
+ server.tool("threads_get_posts", "Get a list of published Threads posts.", {
5
+ limit: z.number().optional().describe("Number of results (default 25)"),
6
+ since: z.string().optional().describe("Start date (ISO 8601 or Unix timestamp)"),
7
+ until: z.string().optional().describe("End date (ISO 8601 or Unix timestamp)"),
8
+ after: z.string().optional().describe("Pagination cursor"),
9
+ before: z.string().optional().describe("Pagination cursor"),
10
+ }, async ({ limit, since, until, after, before }) => {
11
+ try {
12
+ const params = {
13
+ fields: "id,media_product_type,media_type,media_url,permalink,text,timestamp,shortcode,is_quote_post,has_replies,reply_audience,topic_tag,link_attachment_url,poll_attachment,gif_attachment,alt_text",
14
+ };
15
+ if (limit)
16
+ params.limit = limit;
17
+ if (since)
18
+ params.since = since;
19
+ if (until)
20
+ params.until = until;
21
+ if (after)
22
+ params.after = after;
23
+ if (before)
24
+ params.before = before;
25
+ const { data, rateLimit } = await client.threads("GET", `/${client.threadsUserId}/threads`, params);
26
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
27
+ }
28
+ catch (error) {
29
+ return { content: [{ type: "text", text: `Get posts failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
30
+ }
31
+ });
32
+ // ─── threads_get_post ────────────────────────────────────────
33
+ server.tool("threads_get_post", "Get details of a specific Threads post.", {
34
+ post_id: z.string().describe("Threads post ID"),
35
+ fields: z.string().optional().describe("Comma-separated fields"),
36
+ }, async ({ post_id, fields }) => {
37
+ try {
38
+ const f = fields || "id,media_product_type,media_type,media_url,permalink,text,timestamp,shortcode,is_quote_post,has_replies,reply_audience,topic_tag,link_attachment_url,poll_attachment,gif_attachment,alt_text";
39
+ const { data, rateLimit } = await client.threads("GET", `/${post_id}`, { fields: f });
40
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
41
+ }
42
+ catch (error) {
43
+ return { content: [{ type: "text", text: `Get post failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
44
+ }
45
+ });
46
+ // ─── threads_search_posts ────────────────────────────────────
47
+ server.tool("threads_search_posts", "Search for public Threads posts by keyword or topic tag. Results can be filtered by media type and author.", {
48
+ q: z.string().describe("Search keyword or query"),
49
+ search_type: z.enum(["keyword", "tag"]).optional().describe("Search by keyword or topic tag (default: keyword)"),
50
+ media_type: z.enum(["TEXT", "IMAGE", "VIDEO", "CAROUSEL"]).optional().describe("Filter results by media type"),
51
+ author_username: z.string().optional().describe("Filter results by author username"),
52
+ since: z.string().optional().describe("Start date (Unix timestamp)"),
53
+ until: z.string().optional().describe("End date (Unix timestamp)"),
54
+ limit: z.number().optional().describe("Number of results"),
55
+ after: z.string().optional().describe("Pagination cursor"),
56
+ }, async ({ q, search_type, media_type, author_username, since, until, limit, after }) => {
57
+ try {
58
+ const params = {
59
+ q,
60
+ fields: "id,text,username,permalink,timestamp,media_type,media_url,topic_tag",
61
+ };
62
+ if (search_type)
63
+ params.search_type = search_type;
64
+ if (media_type)
65
+ params.media_type = media_type;
66
+ if (author_username)
67
+ params.author_username = author_username;
68
+ if (since)
69
+ params.since = since;
70
+ if (until)
71
+ params.until = until;
72
+ if (limit)
73
+ params.limit = limit;
74
+ if (after)
75
+ params.after = after;
76
+ const { data, rateLimit } = await client.threads("GET", `/${client.threadsUserId}/threads_search`, params);
77
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
78
+ }
79
+ catch (error) {
80
+ return { content: [{ type: "text", text: `Search posts failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
81
+ }
82
+ });
83
+ }
84
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/threads/media.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MetaClient } from "../../services/meta-client.js";
3
+ export declare function registerThreadsProfileTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/profile.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA4CvF"}
@@ -0,0 +1,42 @@
1
+ import { z } from "zod";
2
+ export function registerThreadsProfileTools(server, client) {
3
+ // ─── threads_get_profile ─────────────────────────────────────
4
+ server.tool("threads_get_profile", "Get Threads user profile information including verification status.", {}, async () => {
5
+ try {
6
+ const { data, rateLimit } = await client.threads("GET", `/${client.threadsUserId}`, {
7
+ fields: "id,username,name,threads_profile_picture_url,threads_biography,is_verified",
8
+ });
9
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
10
+ }
11
+ catch (error) {
12
+ return { content: [{ type: "text", text: `Get profile failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
13
+ }
14
+ });
15
+ // ─── threads_get_user_threads ────────────────────────────────
16
+ server.tool("threads_get_user_threads", "Get all threads published by the user (alias for threads_get_posts with user context).", {
17
+ limit: z.number().optional().describe("Number of results"),
18
+ since: z.string().optional().describe("Start date (ISO 8601 or Unix timestamp)"),
19
+ until: z.string().optional().describe("End date (ISO 8601 or Unix timestamp)"),
20
+ after: z.string().optional().describe("Pagination cursor"),
21
+ }, async ({ limit, since, until, after }) => {
22
+ try {
23
+ const params = {
24
+ fields: "id,media_product_type,media_type,text,permalink,timestamp,shortcode,is_quote_post,topic_tag",
25
+ };
26
+ if (limit)
27
+ params.limit = limit;
28
+ if (since)
29
+ params.since = since;
30
+ if (until)
31
+ params.until = until;
32
+ if (after)
33
+ params.after = after;
34
+ const { data, rateLimit } = await client.threads("GET", `/${client.threadsUserId}/threads`, params);
35
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
36
+ }
37
+ catch (error) {
38
+ return { content: [{ type: "text", text: `Get user threads failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/tools/threads/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MetaClient } from "../../services/meta-client.js";
3
+ export declare function registerThreadsPublishingTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=publishing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/publishing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAe3D,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAwN1F"}
@@ -0,0 +1,223 @@
1
+ import { z } from "zod";
2
+ async function waitForThreadsContainer(client, containerId, maxWait = 30) {
3
+ const interval = 2000;
4
+ const maxAttempts = Math.ceil((maxWait * 1000) / interval);
5
+ for (let i = 0; i < maxAttempts; i++) {
6
+ const { data } = await client.threads("GET", `/${containerId}`, { fields: "status" });
7
+ const status = data.status;
8
+ if (status === "FINISHED")
9
+ return;
10
+ if (status === "ERROR")
11
+ throw new Error("Threads container processing failed (ERROR status)");
12
+ await new Promise((r) => setTimeout(r, interval));
13
+ }
14
+ throw new Error(`Threads container processing timed out after ${maxWait}s`);
15
+ }
16
+ export function registerThreadsPublishingTools(server, client) {
17
+ // ─── threads_publish_text ────────────────────────────────────
18
+ server.tool("threads_publish_text", "Publish a text-only post on Threads. Supports optional link attachment, poll, GIF, topic tag, and quote post.", {
19
+ text: z.string().max(500).describe("Post text (max 500 chars)"),
20
+ reply_control: z.enum(["everyone", "accounts_you_follow", "mentioned_only", "parent_post_author_only", "followers_only"]).optional().describe("Who can reply"),
21
+ link_attachment: z.string().url().optional().describe("URL to attach as a link preview card (max 5 links per post)"),
22
+ topic_tag: z.string().max(50).optional().describe("Topic tag for the post (1-50 chars, no periods or ampersands)"),
23
+ quote_post_id: z.string().optional().describe("ID of a post to quote"),
24
+ poll_options: z.array(z.string()).min(2).max(4).optional().describe("Poll options (2-4 choices). Creates a poll attachment."),
25
+ gif_id: z.string().optional().describe("GIF ID from GIPHY or Tenor"),
26
+ gif_provider: z.enum(["GIPHY", "TENOR"]).optional().describe("GIF provider (GIPHY or TENOR). Tenor sunsets March 31, 2026."),
27
+ alt_text: z.string().max(1000).optional().describe("Alt text for accessibility (max 1000 chars)"),
28
+ is_spoiler: z.boolean().optional().describe("Mark content as spoiler"),
29
+ }, async ({ text, reply_control, link_attachment, topic_tag, quote_post_id, poll_options, gif_id, gif_provider, alt_text, is_spoiler }) => {
30
+ try {
31
+ const params = { media_type: "TEXT", text };
32
+ if (reply_control)
33
+ params.reply_control = reply_control;
34
+ if (link_attachment)
35
+ params.link_attachment = link_attachment;
36
+ if (topic_tag)
37
+ params.topic_tag = topic_tag;
38
+ if (quote_post_id)
39
+ params.quote_post_id = quote_post_id;
40
+ if (poll_options) {
41
+ params.poll_attachment = JSON.stringify({ options: poll_options.map(o => ({ option_text: o })) });
42
+ }
43
+ if (gif_id && gif_provider) {
44
+ params.gif_attachment = JSON.stringify({ gif_id, provider: gif_provider });
45
+ }
46
+ if (alt_text)
47
+ params.alt_text = alt_text;
48
+ if (is_spoiler)
49
+ params.is_spoiler_media = true;
50
+ const { data: container } = await client.threads("POST", `/${client.threadsUserId}/threads`, params);
51
+ const containerId = container.id;
52
+ const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
53
+ creation_id: containerId,
54
+ });
55
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
56
+ }
57
+ catch (error) {
58
+ return { content: [{ type: "text", text: `Publish text failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
59
+ }
60
+ });
61
+ // ─── threads_publish_image ───────────────────────────────────
62
+ server.tool("threads_publish_image", "Publish an image post on Threads. Supports topic tag, quote post, alt text, and spoiler flag.", {
63
+ image_url: z.string().url().describe("Public HTTPS URL of the image (JPEG/PNG, max 8MB)"),
64
+ text: z.string().max(500).optional().describe("Caption text"),
65
+ reply_control: z.enum(["everyone", "accounts_you_follow", "mentioned_only", "parent_post_author_only", "followers_only"]).optional().describe("Who can reply"),
66
+ topic_tag: z.string().max(50).optional().describe("Topic tag for the post"),
67
+ quote_post_id: z.string().optional().describe("ID of a post to quote"),
68
+ alt_text: z.string().max(1000).optional().describe("Alt text for accessibility (max 1000 chars)"),
69
+ is_spoiler: z.boolean().optional().describe("Mark content as spoiler"),
70
+ }, async ({ image_url, text, reply_control, topic_tag, quote_post_id, alt_text, is_spoiler }) => {
71
+ try {
72
+ const params = { media_type: "IMAGE", image_url };
73
+ if (text)
74
+ params.text = text;
75
+ if (reply_control)
76
+ params.reply_control = reply_control;
77
+ if (topic_tag)
78
+ params.topic_tag = topic_tag;
79
+ if (quote_post_id)
80
+ params.quote_post_id = quote_post_id;
81
+ if (alt_text)
82
+ params.alt_text = alt_text;
83
+ if (is_spoiler)
84
+ params.is_spoiler_media = true;
85
+ const { data: container } = await client.threads("POST", `/${client.threadsUserId}/threads`, params);
86
+ const containerId = container.id;
87
+ const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
88
+ creation_id: containerId,
89
+ });
90
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
91
+ }
92
+ catch (error) {
93
+ return { content: [{ type: "text", text: `Publish image failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
94
+ }
95
+ });
96
+ // ─── threads_publish_video ───────────────────────────────────
97
+ server.tool("threads_publish_video", "Publish a video post on Threads. Waits for video processing. Supports topic tag, quote post, alt text, and spoiler flag.", {
98
+ video_url: z.string().url().describe("Public HTTPS URL of the video (MP4/MOV, max 1GB, up to 5 min)"),
99
+ text: z.string().max(500).optional().describe("Caption text"),
100
+ reply_control: z.enum(["everyone", "accounts_you_follow", "mentioned_only", "parent_post_author_only", "followers_only"]).optional().describe("Who can reply"),
101
+ topic_tag: z.string().max(50).optional().describe("Topic tag for the post"),
102
+ quote_post_id: z.string().optional().describe("ID of a post to quote"),
103
+ alt_text: z.string().max(1000).optional().describe("Alt text for accessibility (max 1000 chars)"),
104
+ is_spoiler: z.boolean().optional().describe("Mark content as spoiler"),
105
+ }, async ({ video_url, text, reply_control, topic_tag, quote_post_id, alt_text, is_spoiler }) => {
106
+ try {
107
+ const params = { media_type: "VIDEO", video_url };
108
+ if (text)
109
+ params.text = text;
110
+ if (reply_control)
111
+ params.reply_control = reply_control;
112
+ if (topic_tag)
113
+ params.topic_tag = topic_tag;
114
+ if (quote_post_id)
115
+ params.quote_post_id = quote_post_id;
116
+ if (alt_text)
117
+ params.alt_text = alt_text;
118
+ if (is_spoiler)
119
+ params.is_spoiler_media = true;
120
+ const { data: container } = await client.threads("POST", `/${client.threadsUserId}/threads`, params);
121
+ const containerId = container.id;
122
+ await waitForThreadsContainer(client, containerId);
123
+ const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
124
+ creation_id: containerId,
125
+ });
126
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
127
+ }
128
+ catch (error) {
129
+ return { content: [{ type: "text", text: `Publish video failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
130
+ }
131
+ });
132
+ // ─── threads_publish_carousel ────────────────────────────────
133
+ server.tool("threads_publish_carousel", "Publish a carousel post on Threads with 2-20 images/videos.", {
134
+ items: z.array(z.object({
135
+ type: z.enum(["IMAGE", "VIDEO"]).describe("Media type"),
136
+ url: z.string().url().describe("Public HTTPS URL"),
137
+ alt_text: z.string().max(1000).optional().describe("Alt text for this item"),
138
+ })).min(2).max(20).describe("Array of media items"),
139
+ text: z.string().max(500).optional().describe("Caption text"),
140
+ reply_control: z.enum(["everyone", "accounts_you_follow", "mentioned_only", "parent_post_author_only", "followers_only"]).optional().describe("Who can reply"),
141
+ topic_tag: z.string().max(50).optional().describe("Topic tag for the post"),
142
+ quote_post_id: z.string().optional().describe("ID of a post to quote"),
143
+ }, async ({ items, text, reply_control, topic_tag, quote_post_id }) => {
144
+ try {
145
+ const childIds = [];
146
+ for (const item of items) {
147
+ const params = { media_type: item.type, is_carousel_item: true };
148
+ if (item.type === "IMAGE") {
149
+ params.image_url = item.url;
150
+ }
151
+ else {
152
+ params.video_url = item.url;
153
+ }
154
+ if (item.alt_text)
155
+ params.alt_text = item.alt_text;
156
+ const { data: child } = await client.threads("POST", `/${client.threadsUserId}/threads`, params);
157
+ const childId = child.id;
158
+ await waitForThreadsContainer(client, childId);
159
+ childIds.push(childId);
160
+ }
161
+ const carouselParams = {
162
+ media_type: "CAROUSEL",
163
+ children: childIds.join(","),
164
+ };
165
+ if (text)
166
+ carouselParams.text = text;
167
+ if (reply_control)
168
+ carouselParams.reply_control = reply_control;
169
+ if (topic_tag)
170
+ carouselParams.topic_tag = topic_tag;
171
+ if (quote_post_id)
172
+ carouselParams.quote_post_id = quote_post_id;
173
+ const { data: carousel } = await client.threads("POST", `/${client.threadsUserId}/threads`, carouselParams);
174
+ const carouselId = carousel.id;
175
+ const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
176
+ creation_id: carouselId,
177
+ });
178
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
179
+ }
180
+ catch (error) {
181
+ return { content: [{ type: "text", text: `Publish carousel failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
182
+ }
183
+ });
184
+ // ─── threads_delete_post ──────────────────────────────────────
185
+ server.tool("threads_delete_post", "Delete a Threads post. This action is irreversible. Rate limited to 100 deletions per 24 hours.", {
186
+ post_id: z.string().describe("Threads post ID to delete"),
187
+ }, async ({ post_id }) => {
188
+ try {
189
+ const { data, rateLimit } = await client.threads("DELETE", `/${post_id}`);
190
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
191
+ }
192
+ catch (error) {
193
+ return { content: [{ type: "text", text: `Delete post failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
194
+ }
195
+ });
196
+ // ─── threads_get_container_status ────────────────────────────
197
+ server.tool("threads_get_container_status", "Check the processing status of a Threads media container.", {
198
+ container_id: z.string().describe("Container ID to check"),
199
+ }, async ({ container_id }) => {
200
+ try {
201
+ const { data, rateLimit } = await client.threads("GET", `/${container_id}`, {
202
+ fields: "id,status,error_message",
203
+ });
204
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
205
+ }
206
+ catch (error) {
207
+ return { content: [{ type: "text", text: `Get container status failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
208
+ }
209
+ });
210
+ // ─── threads_get_publishing_limit ────────────────────────────
211
+ server.tool("threads_get_publishing_limit", "Check how many posts you can still publish within the current 24-hour window (max 250 posts/day).", {}, async () => {
212
+ try {
213
+ const { data, rateLimit } = await client.threads("GET", `/${client.threadsUserId}/threads_publishing_limit`, {
214
+ fields: "quota_usage,config",
215
+ });
216
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
217
+ }
218
+ catch (error) {
219
+ return { content: [{ type: "text", text: `Get publishing limit failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
220
+ }
221
+ });
222
+ }
223
+ //# sourceMappingURL=publishing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishing.js","sourceRoot":"","sources":["../../../src/tools/threads/publishing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { MetaClient } from "../../services/meta-client.js";
3
+ export declare function registerThreadsReplyTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=replies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replies.d.ts","sourceRoot":"","sources":["../../../src/tools/threads/replies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA0GrF"}
@@ -0,0 +1,99 @@
1
+ import { z } from "zod";
2
+ export function registerThreadsReplyTools(server, client) {
3
+ // ─── threads_get_replies ─────────────────────────────────────
4
+ server.tool("threads_get_replies", "Get replies (conversation) for a specific Threads post.", {
5
+ post_id: z.string().describe("Threads post ID to get replies for"),
6
+ reverse: z.boolean().optional().describe("Reverse chronological order"),
7
+ limit: z.number().optional().describe("Number of replies"),
8
+ after: z.string().optional().describe("Pagination cursor"),
9
+ }, async ({ post_id, reverse, limit, after }) => {
10
+ try {
11
+ const params = {
12
+ fields: "id,text,username,permalink,timestamp,media_type,media_url,has_replies,hide_status,is_verified,profile_picture_url",
13
+ };
14
+ if (reverse !== undefined)
15
+ params.reverse = reverse;
16
+ if (limit)
17
+ params.limit = limit;
18
+ if (after)
19
+ params.after = after;
20
+ const { data, rateLimit } = await client.threads("GET", `/${post_id}/replies`, params);
21
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
22
+ }
23
+ catch (error) {
24
+ return { content: [{ type: "text", text: `Get replies failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
25
+ }
26
+ });
27
+ // ─── threads_reply ───────────────────────────────────────────
28
+ server.tool("threads_reply", "Reply to a Threads post or another reply.", {
29
+ reply_to_id: z.string().describe("Post ID to reply to"),
30
+ text: z.string().max(500).describe("Reply text"),
31
+ image_url: z.string().url().optional().describe("Optional image URL to attach"),
32
+ video_url: z.string().url().optional().describe("Optional video URL to attach"),
33
+ }, async ({ reply_to_id, text, image_url, video_url }) => {
34
+ try {
35
+ let mediaType = "TEXT";
36
+ if (image_url)
37
+ mediaType = "IMAGE";
38
+ if (video_url)
39
+ mediaType = "VIDEO";
40
+ const params = {
41
+ media_type: mediaType,
42
+ text,
43
+ reply_to_id,
44
+ };
45
+ if (image_url)
46
+ params.image_url = image_url;
47
+ if (video_url)
48
+ params.video_url = video_url;
49
+ const { data: container } = await client.threads("POST", `/${client.threadsUserId}/threads`, params);
50
+ const containerId = container.id;
51
+ if (video_url) {
52
+ // Wait for video processing
53
+ const interval = 2000;
54
+ const maxAttempts = 15;
55
+ for (let i = 0; i < maxAttempts; i++) {
56
+ const { data: status } = await client.threads("GET", `/${containerId}`, { fields: "status" });
57
+ const s = status.status;
58
+ if (s === "FINISHED")
59
+ break;
60
+ if (s === "ERROR")
61
+ throw new Error("Video processing failed");
62
+ await new Promise((r) => setTimeout(r, interval));
63
+ }
64
+ }
65
+ const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
66
+ creation_id: containerId,
67
+ });
68
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
69
+ }
70
+ catch (error) {
71
+ return { content: [{ type: "text", text: `Reply failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
72
+ }
73
+ });
74
+ // ─── threads_hide_reply ──────────────────────────────────────
75
+ server.tool("threads_hide_reply", "Hide a reply on your Threads post. Hidden replies are still visible if directly accessed.", {
76
+ reply_id: z.string().describe("Reply ID to hide"),
77
+ }, async ({ reply_id }) => {
78
+ try {
79
+ const { data, rateLimit } = await client.threads("POST", `/${reply_id}/manage_reply`, { hide: true });
80
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, hidden: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
81
+ }
82
+ catch (error) {
83
+ return { content: [{ type: "text", text: `Hide reply failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
84
+ }
85
+ });
86
+ // ─── threads_unhide_reply ────────────────────────────────────
87
+ server.tool("threads_unhide_reply", "Unhide a previously hidden reply on your Threads post.", {
88
+ reply_id: z.string().describe("Reply ID to unhide"),
89
+ }, async ({ reply_id }) => {
90
+ try {
91
+ const { data, rateLimit } = await client.threads("POST", `/${reply_id}/manage_reply`, { hide: false });
92
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, hidden: false, ...data, _rateLimit: rateLimit }, null, 2) }] };
93
+ }
94
+ catch (error) {
95
+ return { content: [{ type: "text", text: `Unhide reply failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=replies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replies.js","sourceRoot":"","sources":["../../../src/tools/threads/replies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface RateLimit {
2
+ callCount?: number;
3
+ totalCpuTime?: number;
4
+ totalTime?: number;
5
+ }
6
+ export interface ApiResponse<T = unknown> {
7
+ data: T;
8
+ rateLimit?: RateLimit;
9
+ }
10
+ export interface PaginatedResponse<T = unknown> {
11
+ data: T[];
12
+ paging?: {
13
+ cursors?: {
14
+ before?: string;
15
+ after?: string;
16
+ };
17
+ next?: string;
18
+ previous?: string;
19
+ };
20
+ }
21
+ export interface MediaContainer {
22
+ id: string;
23
+ status?: string;
24
+ status_code?: string;
25
+ }
26
+ export interface InstagramMedia {
27
+ id: string;
28
+ caption?: string;
29
+ media_type?: string;
30
+ media_url?: string;
31
+ permalink?: string;
32
+ timestamp?: string;
33
+ like_count?: number;
34
+ comments_count?: number;
35
+ }
36
+ export interface ThreadsPost {
37
+ id: string;
38
+ text?: string;
39
+ media_type?: string;
40
+ media_url?: string;
41
+ permalink?: string;
42
+ timestamp?: string;
43
+ shortcode?: string;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,IAAI,EAAE,CAAC,CAAC;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC5C,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}