@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,25 @@
1
+ import { MetaConfig } from "../config.js";
2
+ import { RateLimit } from "../types.js";
3
+ interface ClientResponse {
4
+ data: unknown;
5
+ rateLimit?: RateLimit;
6
+ }
7
+ export declare class MetaClient {
8
+ private config;
9
+ constructor(config: MetaConfig);
10
+ private parseRateLimit;
11
+ private request;
12
+ ig(method: string, path: string, params?: Record<string, unknown>): Promise<ClientResponse>;
13
+ threads(method: string, path: string, params?: Record<string, unknown>): Promise<ClientResponse>;
14
+ meta(method: string, path: string, params?: Record<string, unknown>): Promise<ClientResponse>;
15
+ /** Exchange short-lived token for long-lived token */
16
+ exchangeToken(shortToken: string): Promise<ClientResponse>;
17
+ /** Refresh a long-lived token */
18
+ refreshToken(longToken: string): Promise<ClientResponse>;
19
+ /** Debug a token */
20
+ debugToken(inputToken: string): Promise<ClientResponse>;
21
+ get igUserId(): string;
22
+ get threadsUserId(): string;
23
+ }
24
+ export {};
25
+ //# sourceMappingURL=meta-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-client.d.ts","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAKxC,UAAU,cAAc;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B,OAAO,CAAC,cAAc;YAUR,OAAO;IA+Cf,EAAE,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC;IAOpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC;IAOpB,IAAI,CACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,cAAc,CAAC;IAQ1B,sDAAsD;IAChD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAYhE,iCAAiC;IAC3B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAM9D,oBAAoB;IACd,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU7D,IAAI,QAAQ,IAAI,MAAM,CAKrB;IAED,IAAI,aAAa,IAAI,MAAM,CAK1B;CACF"}
@@ -0,0 +1,115 @@
1
+ const IG_BASE = "https://graph.facebook.com/v25.0";
2
+ const THREADS_BASE = "https://graph.threads.net/v1.0";
3
+ export class MetaClient {
4
+ config;
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ parseRateLimit(headers) {
9
+ const usage = headers.get("x-app-usage");
10
+ if (!usage)
11
+ return undefined;
12
+ try {
13
+ return JSON.parse(usage);
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ async request(baseUrl, token, method, path, params) {
20
+ let url = `${baseUrl}${path}`;
21
+ const init = { method, signal: AbortSignal.timeout(30_000) };
22
+ const qs = new URLSearchParams();
23
+ qs.set("access_token", token);
24
+ if (params) {
25
+ for (const [k, v] of Object.entries(params)) {
26
+ if (v !== undefined && v !== null && v !== "") {
27
+ qs.set(k, String(v));
28
+ }
29
+ }
30
+ }
31
+ if (method === "GET" || method === "DELETE") {
32
+ url += `?${qs.toString()}`;
33
+ }
34
+ else {
35
+ init.headers = { "Content-Type": "application/x-www-form-urlencoded" };
36
+ init.body = qs.toString();
37
+ }
38
+ const res = await fetch(url, init);
39
+ if (!res.ok) {
40
+ const text = await res.text().catch(() => "");
41
+ throw new Error(`Meta API ${method} ${path} (${res.status}): ${text}`);
42
+ }
43
+ const rateLimit = this.parseRateLimit(res.headers);
44
+ const contentType = res.headers.get("content-type") || "";
45
+ if (contentType.includes("application/json")) {
46
+ const data = await res.json();
47
+ if (data.error) {
48
+ throw new Error(`Meta API error: ${data.error.message} (code ${data.error.code})`);
49
+ }
50
+ return { data, rateLimit };
51
+ }
52
+ const text = await res.text();
53
+ return { data: text || { success: true }, rateLimit };
54
+ }
55
+ async ig(method, path, params) {
56
+ if (!this.config.instagramAccessToken) {
57
+ throw new Error("INSTAGRAM_ACCESS_TOKEN is not configured.");
58
+ }
59
+ return this.request(IG_BASE, this.config.instagramAccessToken, method, path, params);
60
+ }
61
+ async threads(method, path, params) {
62
+ if (!this.config.threadsAccessToken) {
63
+ throw new Error("THREADS_ACCESS_TOKEN is not configured.");
64
+ }
65
+ return this.request(THREADS_BASE, this.config.threadsAccessToken, method, path, params);
66
+ }
67
+ async meta(method, path, params) {
68
+ if (!this.config.appId || !this.config.appSecret) {
69
+ throw new Error("META_APP_ID and META_APP_SECRET are required.");
70
+ }
71
+ const appToken = `${this.config.appId}|${this.config.appSecret}`;
72
+ return this.request(IG_BASE, appToken, method, path, params);
73
+ }
74
+ /** Exchange short-lived token for long-lived token */
75
+ async exchangeToken(shortToken) {
76
+ if (!this.config.appId || !this.config.appSecret) {
77
+ throw new Error("META_APP_ID and META_APP_SECRET are required for token exchange.");
78
+ }
79
+ return this.request(IG_BASE, shortToken, "GET", "/oauth/access_token", {
80
+ grant_type: "fb_exchange_token",
81
+ client_id: this.config.appId,
82
+ client_secret: this.config.appSecret,
83
+ fb_exchange_token: shortToken,
84
+ });
85
+ }
86
+ /** Refresh a long-lived token */
87
+ async refreshToken(longToken) {
88
+ return this.request(IG_BASE, longToken, "GET", "/oauth/access_token", {
89
+ grant_type: "fb_exchange_token",
90
+ });
91
+ }
92
+ /** Debug a token */
93
+ async debugToken(inputToken) {
94
+ if (!this.config.appId || !this.config.appSecret) {
95
+ throw new Error("META_APP_ID and META_APP_SECRET are required for token debug.");
96
+ }
97
+ const appToken = `${this.config.appId}|${this.config.appSecret}`;
98
+ return this.request(IG_BASE, appToken, "GET", "/debug_token", {
99
+ input_token: inputToken,
100
+ });
101
+ }
102
+ get igUserId() {
103
+ if (!this.config.instagramUserId) {
104
+ throw new Error("INSTAGRAM_USER_ID is not configured.");
105
+ }
106
+ return this.config.instagramUserId;
107
+ }
108
+ get threadsUserId() {
109
+ if (!this.config.threadsUserId) {
110
+ throw new Error("THREADS_USER_ID is not configured.");
111
+ }
112
+ return this.config.threadsUserId;
113
+ }
114
+ }
115
+ //# sourceMappingURL=meta-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-client.js","sourceRoot":"","sources":["../../src/services/meta-client.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 registerIgCommentTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA0IlF"}
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ export function registerIgCommentTools(server, client) {
3
+ // ─── ig_get_comments ─────────────────────────────────────────
4
+ server.tool("ig_get_comments", "Get comments on a specific Instagram media post.", {
5
+ media_id: z.string().describe("Media ID"),
6
+ limit: z.number().optional().describe("Number of comments to return"),
7
+ after: z.string().optional().describe("Pagination cursor"),
8
+ }, async ({ media_id, limit, after }) => {
9
+ try {
10
+ const params = {
11
+ fields: "id,text,username,timestamp,like_count,replies{id,text,username,timestamp}",
12
+ };
13
+ if (limit)
14
+ params.limit = limit;
15
+ if (after)
16
+ params.after = after;
17
+ const { data, rateLimit } = await client.ig("GET", `/${media_id}/comments`, params);
18
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
19
+ }
20
+ catch (error) {
21
+ return { content: [{ type: "text", text: `Get comments failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
22
+ }
23
+ });
24
+ // ─── ig_get_comment ──────────────────────────────────────────
25
+ server.tool("ig_get_comment", "Get details of a specific comment.", {
26
+ comment_id: z.string().describe("Comment ID"),
27
+ }, async ({ comment_id }) => {
28
+ try {
29
+ const { data, rateLimit } = await client.ig("GET", `/${comment_id}`, {
30
+ fields: "id,text,username,timestamp,like_count,parent_id,media",
31
+ });
32
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
33
+ }
34
+ catch (error) {
35
+ return { content: [{ type: "text", text: `Get comment failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
36
+ }
37
+ });
38
+ // ─── ig_post_comment ─────────────────────────────────────────
39
+ server.tool("ig_post_comment", "Post a top-level comment on a media post.", {
40
+ media_id: z.string().describe("Media ID to comment on"),
41
+ message: z.string().describe("Comment text"),
42
+ }, async ({ media_id, message }) => {
43
+ try {
44
+ const { data, rateLimit } = await client.ig("POST", `/${media_id}/comments`, { message });
45
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
46
+ }
47
+ catch (error) {
48
+ return { content: [{ type: "text", text: `Post comment failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
49
+ }
50
+ });
51
+ // ─── ig_get_replies ──────────────────────────────────────────
52
+ server.tool("ig_get_replies", "Get replies to a specific comment.", {
53
+ comment_id: z.string().describe("Comment ID to get replies for"),
54
+ limit: z.number().optional().describe("Number of replies to return"),
55
+ after: z.string().optional().describe("Pagination cursor"),
56
+ }, async ({ comment_id, limit, after }) => {
57
+ try {
58
+ const params = {
59
+ fields: "id,text,username,timestamp,like_count",
60
+ };
61
+ if (limit)
62
+ params.limit = limit;
63
+ if (after)
64
+ params.after = after;
65
+ const { data, rateLimit } = await client.ig("GET", `/${comment_id}/replies`, params);
66
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
67
+ }
68
+ catch (error) {
69
+ return { content: [{ type: "text", text: `Get replies failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
70
+ }
71
+ });
72
+ // ─── ig_reply_to_comment ─────────────────────────────────────
73
+ server.tool("ig_reply_to_comment", "Reply to a specific comment.", {
74
+ comment_id: z.string().describe("Comment ID to reply to"),
75
+ message: z.string().describe("Reply text"),
76
+ }, async ({ comment_id, message }) => {
77
+ try {
78
+ const { data, rateLimit } = await client.ig("POST", `/${comment_id}/replies`, { message });
79
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
80
+ }
81
+ catch (error) {
82
+ return { content: [{ type: "text", text: `Reply failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
83
+ }
84
+ });
85
+ // ─── ig_hide_comment ─────────────────────────────────────────
86
+ server.tool("ig_hide_comment", "Hide or unhide a comment on your post.", {
87
+ comment_id: z.string().describe("Comment ID"),
88
+ hide: z.boolean().describe("true to hide, false to unhide"),
89
+ }, async ({ comment_id, hide }) => {
90
+ try {
91
+ const { data, rateLimit } = await client.ig("POST", `/${comment_id}`, { hide });
92
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, hidden: hide, ...data, _rateLimit: rateLimit }, null, 2) }] };
93
+ }
94
+ catch (error) {
95
+ return { content: [{ type: "text", text: `Hide comment failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
96
+ }
97
+ });
98
+ // ─── ig_delete_comment ───────────────────────────────────────
99
+ server.tool("ig_delete_comment", "Delete a comment from your media post. This action is irreversible.", {
100
+ comment_id: z.string().describe("Comment ID to delete"),
101
+ }, async ({ comment_id }) => {
102
+ try {
103
+ const { data, rateLimit } = await client.ig("DELETE", `/${comment_id}`);
104
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
105
+ }
106
+ catch (error) {
107
+ return { content: [{ type: "text", text: `Delete comment failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/tools/instagram/comments.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 registerIgHashtagTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=hashtags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashtags.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAyFlF"}
@@ -0,0 +1,77 @@
1
+ import { z } from "zod";
2
+ export function registerIgHashtagTools(server, client) {
3
+ // ─── ig_search_hashtag ───────────────────────────────────────
4
+ server.tool("ig_search_hashtag", "Search for a hashtag ID by name. Required before querying hashtag media. Limited to 30 unique hashtags per 7-day rolling window.", {
5
+ q: z.string().describe("Hashtag name to search (without #)"),
6
+ }, async ({ q }) => {
7
+ try {
8
+ const { data, rateLimit } = await client.ig("GET", "/ig_hashtag_search", {
9
+ q,
10
+ user_id: client.igUserId,
11
+ });
12
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
13
+ }
14
+ catch (error) {
15
+ return { content: [{ type: "text", text: `Hashtag search failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
16
+ }
17
+ });
18
+ // ─── ig_get_hashtag ──────────────────────────────────────────
19
+ server.tool("ig_get_hashtag", "Get hashtag information by ID.", {
20
+ hashtag_id: z.string().describe("Hashtag ID (from ig_search_hashtag)"),
21
+ }, async ({ hashtag_id }) => {
22
+ try {
23
+ const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}`, {
24
+ fields: "id,name,media_count",
25
+ });
26
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
27
+ }
28
+ catch (error) {
29
+ return { content: [{ type: "text", text: `Get hashtag failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
30
+ }
31
+ });
32
+ // ─── ig_get_hashtag_recent ───────────────────────────────────
33
+ server.tool("ig_get_hashtag_recent", "Get recent media tagged with a specific hashtag.", {
34
+ hashtag_id: z.string().describe("Hashtag ID"),
35
+ limit: z.number().optional().describe("Number of results"),
36
+ after: z.string().optional().describe("Pagination cursor"),
37
+ }, async ({ hashtag_id, limit, after }) => {
38
+ try {
39
+ const params = {
40
+ user_id: client.igUserId,
41
+ fields: "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count",
42
+ };
43
+ if (limit)
44
+ params.limit = limit;
45
+ if (after)
46
+ params.after = after;
47
+ const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/recent_media`, params);
48
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
49
+ }
50
+ catch (error) {
51
+ return { content: [{ type: "text", text: `Get hashtag recent failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
52
+ }
53
+ });
54
+ // ─── ig_get_hashtag_top ──────────────────────────────────────
55
+ server.tool("ig_get_hashtag_top", "Get top (most popular) media tagged with a specific hashtag.", {
56
+ hashtag_id: z.string().describe("Hashtag ID"),
57
+ limit: z.number().optional().describe("Number of results"),
58
+ after: z.string().optional().describe("Pagination cursor"),
59
+ }, async ({ hashtag_id, limit, after }) => {
60
+ try {
61
+ const params = {
62
+ user_id: client.igUserId,
63
+ fields: "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count",
64
+ };
65
+ if (limit)
66
+ params.limit = limit;
67
+ if (after)
68
+ params.after = after;
69
+ const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/top_media`, params);
70
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
71
+ }
72
+ catch (error) {
73
+ return { content: [{ type: "text", text: `Get hashtag top failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=hashtags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashtags.js","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.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 registerIgMediaTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/media.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAoGhF"}
@@ -0,0 +1,82 @@
1
+ import { z } from "zod";
2
+ export function registerIgMediaTools(server, client) {
3
+ // ─── ig_get_media_list ───────────────────────────────────────
4
+ server.tool("ig_get_media_list", "Get list of media published on the Instagram account.", {
5
+ limit: z.number().optional().describe("Number of results (max 100, default 25)"),
6
+ after: z.string().optional().describe("Pagination cursor for next page"),
7
+ before: z.string().optional().describe("Pagination cursor for previous page"),
8
+ }, async ({ limit, after, before }) => {
9
+ try {
10
+ const params = {
11
+ fields: "id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,like_count,comments_count",
12
+ };
13
+ if (limit)
14
+ params.limit = limit;
15
+ if (after)
16
+ params.after = after;
17
+ if (before)
18
+ params.before = before;
19
+ const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/media`, params);
20
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
21
+ }
22
+ catch (error) {
23
+ return { content: [{ type: "text", text: `Get media list failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
24
+ }
25
+ });
26
+ // ─── ig_get_media ────────────────────────────────────────────
27
+ server.tool("ig_get_media", "Get details of a specific Instagram media post.", {
28
+ media_id: z.string().describe("Media ID"),
29
+ fields: z.string().optional().describe("Comma-separated fields (default: id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count)"),
30
+ }, async ({ media_id, fields }) => {
31
+ try {
32
+ const f = fields || "id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,like_count,comments_count";
33
+ const { data, rateLimit } = await client.ig("GET", `/${media_id}`, { fields: f });
34
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
35
+ }
36
+ catch (error) {
37
+ return { content: [{ type: "text", text: `Get media failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
38
+ }
39
+ });
40
+ // ─── ig_delete_media ─────────────────────────────────────────
41
+ server.tool("ig_delete_media", "Delete an Instagram media post (posts, carousels, reels, stories). This action is irreversible. Requires instagram_manage_contents permission.", {
42
+ media_id: z.string().describe("Media ID to delete"),
43
+ }, async ({ media_id }) => {
44
+ try {
45
+ const { data, rateLimit } = await client.ig("DELETE", `/${media_id}`);
46
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
47
+ }
48
+ catch (error) {
49
+ return { content: [{ type: "text", text: `Delete media failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
50
+ }
51
+ });
52
+ // ─── ig_get_media_insights ───────────────────────────────────
53
+ server.tool("ig_get_media_insights", "Get insights/analytics for a specific media post. Note: 'impressions' and 'video_views' were deprecated in v22.0 — use 'views' instead. Available metrics: views, reach, saved, shares, likes, comments, reposts, reels_skip_rate.", {
54
+ media_id: z.string().describe("Media ID"),
55
+ metric: z.string().optional().describe("Comma-separated metrics (default: views,reach,saved,shares). For REEL add: likes,comments,reposts,reels_skip_rate"),
56
+ }, async ({ media_id, metric }) => {
57
+ try {
58
+ const m = metric || "views,reach,saved,shares";
59
+ const { data, rateLimit } = await client.ig("GET", `/${media_id}/insights`, { metric: m });
60
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
61
+ }
62
+ catch (error) {
63
+ return { content: [{ type: "text", text: `Get media insights failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
64
+ }
65
+ });
66
+ // ─── ig_toggle_comments ──────────────────────────────────────
67
+ server.tool("ig_toggle_comments", "Enable or disable comments on an Instagram media post.", {
68
+ media_id: z.string().describe("Media ID"),
69
+ enabled: z.boolean().describe("true to enable comments, false to disable"),
70
+ }, async ({ media_id, enabled }) => {
71
+ try {
72
+ const { data, rateLimit } = await client.ig("POST", `/${media_id}`, {
73
+ comment_enabled: enabled,
74
+ });
75
+ return { content: [{ type: "text", text: JSON.stringify({ success: true, comment_enabled: enabled, ...data, _rateLimit: rateLimit }, null, 2) }] };
76
+ }
77
+ catch (error) {
78
+ return { content: [{ type: "text", text: `Toggle comments failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
79
+ }
80
+ });
81
+ }
82
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/instagram/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 registerIgMentionTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=mentions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/mentions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA6ClF"}
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ export function registerIgMentionTools(server, client) {
3
+ // ─── ig_get_mentioned_comments ───────────────────────────────
4
+ server.tool("ig_get_mentioned_comments", "Get comments where the account was @mentioned. Returns the media and comment details.", {
5
+ comment_id: z.string().describe("Comment ID from a mention notification"),
6
+ fields: z.string().optional().describe("Fields to return (default: id,text,timestamp,username,media)"),
7
+ }, async ({ comment_id, fields }) => {
8
+ try {
9
+ const f = fields || "id,text,timestamp,username,media{id,media_url,media_type}";
10
+ const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/mentioned_comment`, {
11
+ comment_id,
12
+ fields: f,
13
+ });
14
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
15
+ }
16
+ catch (error) {
17
+ return { content: [{ type: "text", text: `Get mentioned comments failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
18
+ }
19
+ });
20
+ // ─── ig_get_tagged_media ─────────────────────────────────────
21
+ server.tool("ig_get_tagged_media", "Get media where the account is tagged (photo tags, not @mentions).", {
22
+ limit: z.number().optional().describe("Number of results"),
23
+ after: z.string().optional().describe("Pagination cursor"),
24
+ }, async ({ limit, after }) => {
25
+ try {
26
+ const params = {
27
+ fields: "id,caption,media_type,media_url,permalink,timestamp,username",
28
+ };
29
+ if (limit)
30
+ params.limit = limit;
31
+ if (after)
32
+ params.after = after;
33
+ const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/tags`, params);
34
+ return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
35
+ }
36
+ catch (error) {
37
+ return { content: [{ type: "text", text: `Get tagged media failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true };
38
+ }
39
+ });
40
+ }
41
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/tools/instagram/mentions.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 registerIgMessagingTools(server: McpServer, client: MetaClient): void;
4
+ //# sourceMappingURL=messaging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messaging.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/messaging.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAE3D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA2FpF"}