@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.
- package/LICENSE +21 -0
- package/README.md +335 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +11 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +3 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +61 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/instagram.d.ts +4 -0
- package/dist/resources/instagram.d.ts.map +1 -0
- package/dist/resources/instagram.js +17 -0
- package/dist/resources/instagram.js.map +1 -0
- package/dist/resources/threads.d.ts +4 -0
- package/dist/resources/threads.d.ts.map +1 -0
- package/dist/resources/threads.js +17 -0
- package/dist/resources/threads.js.map +1 -0
- package/dist/services/meta-client.d.ts +25 -0
- package/dist/services/meta-client.d.ts.map +1 -0
- package/dist/services/meta-client.js +115 -0
- package/dist/services/meta-client.js.map +1 -0
- package/dist/tools/instagram/comments.d.ts +4 -0
- package/dist/tools/instagram/comments.d.ts.map +1 -0
- package/dist/tools/instagram/comments.js +111 -0
- package/dist/tools/instagram/comments.js.map +1 -0
- package/dist/tools/instagram/hashtags.d.ts +4 -0
- package/dist/tools/instagram/hashtags.d.ts.map +1 -0
- package/dist/tools/instagram/hashtags.js +77 -0
- package/dist/tools/instagram/hashtags.js.map +1 -0
- package/dist/tools/instagram/media.d.ts +4 -0
- package/dist/tools/instagram/media.d.ts.map +1 -0
- package/dist/tools/instagram/media.js +82 -0
- package/dist/tools/instagram/media.js.map +1 -0
- package/dist/tools/instagram/mentions.d.ts +4 -0
- package/dist/tools/instagram/mentions.d.ts.map +1 -0
- package/dist/tools/instagram/mentions.js +41 -0
- package/dist/tools/instagram/mentions.js.map +1 -0
- package/dist/tools/instagram/messaging.d.ts +4 -0
- package/dist/tools/instagram/messaging.d.ts.map +1 -0
- package/dist/tools/instagram/messaging.js +80 -0
- package/dist/tools/instagram/messaging.js.map +1 -0
- package/dist/tools/instagram/profile.d.ts +4 -0
- package/dist/tools/instagram/profile.d.ts.map +1 -0
- package/dist/tools/instagram/profile.js +86 -0
- package/dist/tools/instagram/profile.js.map +1 -0
- package/dist/tools/instagram/publishing.d.ts +4 -0
- package/dist/tools/instagram/publishing.d.ts.map +1 -0
- package/dist/tools/instagram/publishing.js +202 -0
- package/dist/tools/instagram/publishing.js.map +1 -0
- package/dist/tools/meta/auth.d.ts +4 -0
- package/dist/tools/meta/auth.d.ts.map +1 -0
- package/dist/tools/meta/auth.js +82 -0
- package/dist/tools/meta/auth.js.map +1 -0
- package/dist/tools/threads/insights.d.ts +4 -0
- package/dist/tools/threads/insights.d.ts.map +1 -0
- package/dist/tools/threads/insights.js +37 -0
- package/dist/tools/threads/insights.js.map +1 -0
- package/dist/tools/threads/media.d.ts +4 -0
- package/dist/tools/threads/media.d.ts.map +1 -0
- package/dist/tools/threads/media.js +84 -0
- package/dist/tools/threads/media.js.map +1 -0
- package/dist/tools/threads/profile.d.ts +4 -0
- package/dist/tools/threads/profile.d.ts.map +1 -0
- package/dist/tools/threads/profile.js +42 -0
- package/dist/tools/threads/profile.js.map +1 -0
- package/dist/tools/threads/publishing.d.ts +4 -0
- package/dist/tools/threads/publishing.d.ts.map +1 -0
- package/dist/tools/threads/publishing.js +223 -0
- package/dist/tools/threads/publishing.js.map +1 -0
- package/dist/tools/threads/replies.d.ts +4 -0
- package/dist/tools/threads/replies.d.ts.map +1 -0
- package/dist/tools/threads/replies.js +99 -0
- package/dist/tools/threads/replies.js.map +1 -0
- package/dist/types.d.ts +45 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|