@exileum/meta-mcp 5.0.0 → 7.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/README.md +83 -12
- package/dist/config.d.ts +10 -8
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +65 -8
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -59
- package/dist/index.js.map +1 -1
- package/dist/register-all.d.ts +4 -0
- package/dist/register-all.d.ts.map +1 -0
- package/dist/register-all.js +41 -0
- package/dist/register-all.js.map +1 -0
- package/dist/resources/instagram.d.ts.map +1 -1
- package/dist/resources/instagram.js +18 -12
- package/dist/resources/instagram.js.map +1 -1
- package/dist/resources/threads.d.ts.map +1 -1
- package/dist/resources/threads.js +18 -12
- package/dist/resources/threads.js.map +1 -1
- package/dist/schemas.d.ts +14 -0
- package/dist/schemas.d.ts.map +1 -1
- package/dist/schemas.js +14 -0
- package/dist/schemas.js.map +1 -1
- package/dist/services/meta-client.d.ts +101 -5
- package/dist/services/meta-client.d.ts.map +1 -1
- package/dist/services/meta-client.js +273 -69
- package/dist/services/meta-client.js.map +1 -1
- package/dist/tools/annotations.d.ts +6 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +27 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/instagram/comments.d.ts.map +1 -1
- package/dist/tools/instagram/comments.js +64 -33
- package/dist/tools/instagram/comments.js.map +1 -1
- package/dist/tools/instagram/hashtags.d.ts.map +1 -1
- package/dist/tools/instagram/hashtags.js +37 -18
- package/dist/tools/instagram/hashtags.js.map +1 -1
- package/dist/tools/instagram/media.d.ts.map +1 -1
- package/dist/tools/instagram/media.js +47 -24
- package/dist/tools/instagram/media.js.map +1 -1
- package/dist/tools/instagram/mentions.d.ts.map +1 -1
- package/dist/tools/instagram/mentions.js +21 -10
- package/dist/tools/instagram/mentions.js.map +1 -1
- package/dist/tools/instagram/messaging.d.ts.map +1 -1
- package/dist/tools/instagram/messaging.js +64 -27
- package/dist/tools/instagram/messaging.js.map +1 -1
- package/dist/tools/instagram/profile.d.ts.map +1 -1
- package/dist/tools/instagram/profile.js +54 -31
- package/dist/tools/instagram/profile.js.map +1 -1
- package/dist/tools/instagram/publishing.d.ts.map +1 -1
- package/dist/tools/instagram/publishing.js +83 -57
- package/dist/tools/instagram/publishing.js.map +1 -1
- package/dist/tools/meta/auth.d.ts.map +1 -1
- package/dist/tools/meta/auth.js +47 -21
- package/dist/tools/meta/auth.js.map +1 -1
- package/dist/tools/threads/insights.d.ts.map +1 -1
- package/dist/tools/threads/insights.js +21 -10
- package/dist/tools/threads/insights.js.map +1 -1
- package/dist/tools/threads/media.d.ts.map +1 -1
- package/dist/tools/threads/media.js +38 -23
- package/dist/tools/threads/media.js.map +1 -1
- package/dist/tools/threads/mentions.d.ts.map +1 -1
- package/dist/tools/threads/mentions.js +12 -6
- package/dist/tools/threads/mentions.js.map +1 -1
- package/dist/tools/threads/profile.d.ts.map +1 -1
- package/dist/tools/threads/profile.js +8 -2
- package/dist/tools/threads/profile.js.map +1 -1
- package/dist/tools/threads/publishing.d.ts +7 -0
- package/dist/tools/threads/publishing.d.ts.map +1 -1
- package/dist/tools/threads/publishing.js +168 -76
- package/dist/tools/threads/publishing.js.map +1 -1
- package/dist/tools/threads/replies.d.ts.map +1 -1
- package/dist/tools/threads/replies.js +48 -27
- package/dist/tools/threads/replies.js.map +1 -1
- package/dist/utils/container.d.ts +4 -2
- package/dist/utils/container.d.ts.map +1 -1
- package/dist/utils/container.js +8 -3
- package/dist/utils/container.js.map +1 -1
- package/dist/utils/errors.d.ts +2 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +27 -10
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/response.d.ts +11 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +6 -0
- package/dist/utils/response.js.map +1 -0
- package/package.json +10 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { httpsUrl } from "../../schemas.js";
|
|
3
|
-
import { waitForThreadsContainer } from "../../utils/container.js";
|
|
4
|
-
import { formatErrorResponse } from "../../utils/errors.js";
|
|
2
|
+
import { httpsUrl, metaId } from "../../schemas.js";
|
|
3
|
+
import { waitForThreadsContainer, IMAGE_PROCESSING_TIMEOUT, VIDEO_PROCESSING_TIMEOUT } from "../../utils/container.js";
|
|
4
|
+
import { formatErrorResponse, validationError } from "../../utils/errors.js";
|
|
5
|
+
import { formatResponse } from "../../utils/response.js";
|
|
6
|
+
import { READ_ONLY_TOOL, WRITE_TOOL, WRITE_IDEMPOTENT_TOOL } from "../annotations.js";
|
|
5
7
|
const REPLIES_BASE_FIELDS = "id,text,username,permalink,timestamp,media_type,media_url,has_replies,hide_status,root_post,replied_to,is_reply,is_quote_post";
|
|
6
8
|
// is_verified / profile_picture_url are documented as "Only available on direct
|
|
7
9
|
// replies." Populated for /{post}/replies (top_level), but undefined for nested
|
|
@@ -11,13 +13,17 @@ export const REPLIES_TOP_LEVEL_DEFAULT_FIELDS = `${REPLIES_BASE_FIELDS},is_verif
|
|
|
11
13
|
export const REPLIES_FULL_TREE_DEFAULT_FIELDS = REPLIES_BASE_FIELDS;
|
|
12
14
|
export function registerThreadsReplyTools(server, client) {
|
|
13
15
|
// ─── threads_get_replies ─────────────────────────────────────
|
|
14
|
-
server.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
server.registerTool("threads_get_replies", {
|
|
17
|
+
description: "Get replies for a specific Threads post. By default returns only top-level replies (mode='top_level', endpoint /{post}/replies). Set mode='full_tree' to get the entire conversation flattened — every reply at every nesting level (endpoint /{post}/conversation). Both modes share the same response shape; full_tree additionally populates root_post, replied_to, is_reply so the caller can reconstruct the tree. The default fields differ by mode: top_level requests is_verified and profile_picture_url (always populated for direct replies); full_tree drops them since they are 'Only available on direct replies' per the Threads Replies/Conversations docs and would be undefined for every nested entry. Pass an explicit fields override to re-request them in full_tree if needed.",
|
|
18
|
+
inputSchema: {
|
|
19
|
+
post_id: metaId.describe("Threads post ID to get replies for"),
|
|
20
|
+
mode: z.enum(["top_level", "full_tree"]).optional().describe("'top_level' (default) returns only direct replies; 'full_tree' returns the full conversation tree flattened"),
|
|
21
|
+
reverse: z.boolean().optional().describe("Reverse chronological order"),
|
|
22
|
+
limit: z.number().optional().describe("Number of replies"),
|
|
23
|
+
after: z.string().optional().describe("Pagination cursor"),
|
|
24
|
+
fields: z.string().min(1).optional().describe("Comma-separated fields override. Default depends on mode: top_level adds is_verified,profile_picture_url, full_tree omits them because they are 'Only available on direct replies' per the Threads Replies/Conversations docs."),
|
|
25
|
+
},
|
|
26
|
+
annotations: READ_ONLY_TOOL,
|
|
21
27
|
}, async ({ post_id, mode, reverse, limit, after, fields }) => {
|
|
22
28
|
try {
|
|
23
29
|
const defaultFields = mode === "full_tree"
|
|
@@ -34,21 +40,28 @@ export function registerThreadsReplyTools(server, client) {
|
|
|
34
40
|
params.after = after;
|
|
35
41
|
const edge = mode === "full_tree" ? "conversation" : "replies";
|
|
36
42
|
const { data, rateLimit } = await client.threads("GET", `/${post_id}/${edge}`, params);
|
|
37
|
-
return
|
|
43
|
+
return formatResponse(data, rateLimit);
|
|
38
44
|
}
|
|
39
45
|
catch (error) {
|
|
40
46
|
return formatErrorResponse(error, "Get replies");
|
|
41
47
|
}
|
|
42
48
|
});
|
|
43
49
|
// ─── threads_reply ───────────────────────────────────────────
|
|
44
|
-
server.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
server.registerTool("threads_reply", {
|
|
51
|
+
description: "Reply to a Threads post or another reply. Text-only replies publish in a single API call by default (auto_publish_text=true); media replies always use the two-step create-then-publish flow. image_url and video_url are mutually exclusive — provide at most one.",
|
|
52
|
+
inputSchema: {
|
|
53
|
+
reply_to_id: z.string().describe("Post ID to reply to"),
|
|
54
|
+
text: z.string().max(500).describe("Reply text"),
|
|
55
|
+
image_url: httpsUrl.optional().describe("Optional image HTTPS URL to attach. Mutually exclusive with video_url."),
|
|
56
|
+
video_url: httpsUrl.optional().describe("Optional video HTTPS URL to attach. Mutually exclusive with image_url."),
|
|
57
|
+
auto_publish: z.boolean().optional().default(true).describe("When true (default) and the reply is text-only (no image_url/video_url), combine container creation and publishing into a single API call via auto_publish_text=true — one HTTP request instead of two, and no risk of the 4279009 'container not propagated yet' race. Ignored for media replies. Set to false to force the legacy two-step flow for text replies."),
|
|
58
|
+
},
|
|
59
|
+
annotations: WRITE_TOOL,
|
|
50
60
|
}, async ({ reply_to_id, text, image_url, video_url, auto_publish }) => {
|
|
51
61
|
try {
|
|
62
|
+
if (image_url && video_url) {
|
|
63
|
+
return validationError("image_url and video_url cannot be combined on a single reply");
|
|
64
|
+
}
|
|
52
65
|
let mediaType = "TEXT";
|
|
53
66
|
if (image_url)
|
|
54
67
|
mediaType = "IMAGE";
|
|
@@ -76,39 +89,47 @@ export function registerThreadsReplyTools(server, client) {
|
|
|
76
89
|
if (typeof createResponse.id !== "string")
|
|
77
90
|
throw new Error("Container creation did not return a valid id");
|
|
78
91
|
if (useAutoPublish) {
|
|
79
|
-
return
|
|
92
|
+
return formatResponse(createResponse, createRateLimit);
|
|
80
93
|
}
|
|
81
|
-
if (video_url) {
|
|
82
|
-
await waitForThreadsContainer(client, createResponse.id);
|
|
94
|
+
if (image_url || video_url) {
|
|
95
|
+
await waitForThreadsContainer(client, createResponse.id, video_url ? VIDEO_PROCESSING_TIMEOUT : IMAGE_PROCESSING_TIMEOUT);
|
|
83
96
|
}
|
|
84
97
|
const { data, rateLimit } = await client.threads("POST", `/${client.threadsUserId}/threads_publish`, {
|
|
85
98
|
creation_id: createResponse.id,
|
|
86
99
|
});
|
|
87
|
-
return
|
|
100
|
+
return formatResponse(data, rateLimit);
|
|
88
101
|
}
|
|
89
102
|
catch (error) {
|
|
90
103
|
return formatErrorResponse(error, "Reply");
|
|
91
104
|
}
|
|
92
105
|
});
|
|
93
106
|
// ─── threads_hide_reply ──────────────────────────────────────
|
|
94
|
-
server.
|
|
95
|
-
|
|
107
|
+
server.registerTool("threads_hide_reply", {
|
|
108
|
+
description: "Hide a reply on your Threads post. Hidden replies are still visible if directly accessed.",
|
|
109
|
+
inputSchema: {
|
|
110
|
+
reply_id: metaId.describe("Reply ID to hide"),
|
|
111
|
+
},
|
|
112
|
+
annotations: WRITE_IDEMPOTENT_TOOL,
|
|
96
113
|
}, async ({ reply_id }) => {
|
|
97
114
|
try {
|
|
98
115
|
const { data, rateLimit } = await client.threads("POST", `/${reply_id}/manage_reply`, { hide: true });
|
|
99
|
-
return
|
|
116
|
+
return formatResponse({ success: true, hidden: true, ...data }, rateLimit);
|
|
100
117
|
}
|
|
101
118
|
catch (error) {
|
|
102
119
|
return formatErrorResponse(error, "Hide reply");
|
|
103
120
|
}
|
|
104
121
|
});
|
|
105
122
|
// ─── threads_unhide_reply ────────────────────────────────────
|
|
106
|
-
server.
|
|
107
|
-
|
|
123
|
+
server.registerTool("threads_unhide_reply", {
|
|
124
|
+
description: "Unhide a previously hidden reply on your Threads post.",
|
|
125
|
+
inputSchema: {
|
|
126
|
+
reply_id: metaId.describe("Reply ID to unhide"),
|
|
127
|
+
},
|
|
128
|
+
annotations: WRITE_IDEMPOTENT_TOOL,
|
|
108
129
|
}, async ({ reply_id }) => {
|
|
109
130
|
try {
|
|
110
131
|
const { data, rateLimit } = await client.threads("POST", `/${reply_id}/manage_reply`, { hide: false });
|
|
111
|
-
return
|
|
132
|
+
return formatResponse({ success: true, hidden: false, ...data }, rateLimit);
|
|
112
133
|
}
|
|
113
134
|
catch (error) {
|
|
114
135
|
return formatErrorResponse(error, "Unhide reply");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replies.js","sourceRoot":"","sources":["../../../src/tools/threads/replies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"replies.js","sourceRoot":"","sources":["../../../src/tools/threads/replies.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { MetaClient, ClientResponse } from "../services/meta-client.js";
|
|
2
|
-
type ApiCallFn = (method: string, path: string, params?:
|
|
1
|
+
import { MetaClient, ClientResponse, FormParams } from "../services/meta-client.js";
|
|
2
|
+
type ApiCallFn = (method: string, path: string, params?: FormParams) => Promise<ClientResponse>;
|
|
3
|
+
export declare const IMAGE_PROCESSING_TIMEOUT = 30;
|
|
4
|
+
export declare const VIDEO_PROCESSING_TIMEOUT = 300;
|
|
3
5
|
export interface PollContainerOptions {
|
|
4
6
|
apiCall: ApiCallFn;
|
|
5
7
|
statusField: "status" | "status_code";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/utils/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/utils/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAEpF,KAAK,SAAS,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;AAKhG,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,CAAC;IACnB,WAAW,EAAE,QAAQ,GAAG,aAAa,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,8DAA8D;AAC9D,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3G;AAED,2EAA2E;AAC3E,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,SAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAOnI;AAED,yEAAyE;AACzE,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,SAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxI"}
|
package/dist/utils/container.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
// Image containers typically finish in a single poll. Video containers can need
|
|
2
|
+
// up to 5 minutes — Meta recommends "querying a container's status once per minute,
|
|
3
|
+
// for no more than 5 minutes" per the Instagram content publishing docs.
|
|
4
|
+
export const IMAGE_PROCESSING_TIMEOUT = 30;
|
|
5
|
+
export const VIDEO_PROCESSING_TIMEOUT = 300;
|
|
1
6
|
/** Poll container status until FINISHED or terminal status */
|
|
2
7
|
export async function pollContainerStatus(containerId, options) {
|
|
3
|
-
const { apiCall, statusField, label, maxWait =
|
|
8
|
+
const { apiCall, statusField, label, maxWait = IMAGE_PROCESSING_TIMEOUT, interval = 5000 } = options;
|
|
4
9
|
const maxAttempts = Math.ceil((maxWait * 1000) / interval);
|
|
5
10
|
let lastStatus;
|
|
6
11
|
for (let i = 0; i < maxAttempts; i++) {
|
|
@@ -24,7 +29,7 @@ export async function pollContainerStatus(containerId, options) {
|
|
|
24
29
|
throw new Error(`${label} processing timed out after ${maxWait}s (last status: ${lastStatus ?? "unknown"})`);
|
|
25
30
|
}
|
|
26
31
|
/** Instagram container polling — uses client.ig() and status_code field */
|
|
27
|
-
export async function waitForIgContainer(client, containerId, maxWait =
|
|
32
|
+
export async function waitForIgContainer(client, containerId, maxWait = IMAGE_PROCESSING_TIMEOUT) {
|
|
28
33
|
return pollContainerStatus(containerId, {
|
|
29
34
|
apiCall: client.ig.bind(client),
|
|
30
35
|
statusField: "status_code",
|
|
@@ -33,7 +38,7 @@ export async function waitForIgContainer(client, containerId, maxWait = 30) {
|
|
|
33
38
|
});
|
|
34
39
|
}
|
|
35
40
|
/** Threads container polling — uses client.threads() and status field */
|
|
36
|
-
export async function waitForThreadsContainer(client, containerId, maxWait =
|
|
41
|
+
export async function waitForThreadsContainer(client, containerId, maxWait = IMAGE_PROCESSING_TIMEOUT) {
|
|
37
42
|
return pollContainerStatus(containerId, {
|
|
38
43
|
apiCall: client.threads.bind(client),
|
|
39
44
|
statusField: "status",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/utils/container.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/utils/container.ts"],"names":[],"mappings":"AAIA,gFAAgF;AAChF,oFAAoF;AACpF,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,CAAC;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAU5C,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,OAA6B;IAC1F,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,GAAG,wBAAwB,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IACrG,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC3D,IAAI,UAA8B,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAuB,CAAC;QACvD,UAAU,GAAG,MAAM,CAAC;QACpB,IAAI,MAAM,KAAK,UAAU;YAAE,OAAO;QAClC,IAAI,MAAM,KAAK,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mCAAmC,CAAC,CAAC;QACrF,IAAI,MAAM,KAAK,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,uEAAuE,CAAC,CAAC;QAC3H,IAAI,MAAM,KAAK,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yCAAyC,CAAC,CAAC;QAChF,IAAI,MAAM,KAAK,aAAa;YAAE,MAAM,IAAI,KAAK,CAAC,cAAc,KAAK,CAAC,WAAW,EAAE,YAAY,MAAM,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,OAAO,mBAAmB,UAAU,IAAI,SAAS,GAAG,CAAC,CAAC;AAC/G,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB,EAAE,WAAmB,EAAE,OAAO,GAAG,wBAAwB;IAClH,OAAO,mBAAmB,CAAC,WAAW,EAAE;QACtC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC;QAC/B,WAAW,EAAE,aAAa;QAC1B,KAAK,EAAE,WAAW;QAClB,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,MAAkB,EAAE,WAAmB,EAAE,OAAO,GAAG,wBAAwB;IACvH,OAAO,mBAAmB,CAAC,WAAW,EAAE;QACtC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,WAAW,EAAE,QAAQ;QACrB,KAAK,EAAE,mBAAmB;QAC1B,OAAO;KACR,CAAC,CAAC;AACL,CAAC"}
|
package/dist/utils/errors.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
1
2
|
export type ErrorType = "auth" | "validation" | "rate_limit" | "server" | "network" | "internal";
|
|
2
3
|
interface MetaApiErrorInit {
|
|
3
4
|
message: string;
|
|
@@ -31,6 +32,7 @@ export interface McpErrorResult {
|
|
|
31
32
|
isError: true;
|
|
32
33
|
}
|
|
33
34
|
export declare function formatErrorResponse(error: unknown, label: string): McpErrorResult;
|
|
35
|
+
export declare function toMcpResourceError(error: unknown, label: string): McpError;
|
|
34
36
|
export declare function validationError(message: string): McpErrorResult;
|
|
35
37
|
export {};
|
|
36
38
|
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjG,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,gBAAgB;CAYnC;AA6DD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShD;AAeD,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjG,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;gBAEX,IAAI,EAAE,gBAAgB;CAYnC;AA6DD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShD;AAeD,MAAM,WAAW,cAAc;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;CACf;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAkBjF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAW1E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CAU/D"}
|
package/dist/utils/errors.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
|
|
1
2
|
export class MetaApiError extends Error {
|
|
2
3
|
httpStatus;
|
|
3
4
|
apiCode;
|
|
@@ -85,6 +86,18 @@ export function sanitizeRaw(text) {
|
|
|
85
86
|
}
|
|
86
87
|
return result;
|
|
87
88
|
}
|
|
89
|
+
function assignMetaApiFields(target, error) {
|
|
90
|
+
if (error.httpStatus !== undefined)
|
|
91
|
+
target.http_status = error.httpStatus;
|
|
92
|
+
if (error.apiCode !== undefined)
|
|
93
|
+
target.code = error.apiCode;
|
|
94
|
+
if (error.apiSubcode !== undefined)
|
|
95
|
+
target.subcode = error.apiSubcode;
|
|
96
|
+
if (error.apiType)
|
|
97
|
+
target.type = error.apiType;
|
|
98
|
+
if (error.fbtraceId)
|
|
99
|
+
target.fbtrace_id = error.fbtraceId;
|
|
100
|
+
}
|
|
88
101
|
export function formatErrorResponse(error, label) {
|
|
89
102
|
const errorType = categorize(error);
|
|
90
103
|
const original = error instanceof Error ? error.message : String(error);
|
|
@@ -94,16 +107,7 @@ export function formatErrorResponse(error, label) {
|
|
|
94
107
|
message: `${label} failed: ${original}`,
|
|
95
108
|
};
|
|
96
109
|
if (error instanceof MetaApiError) {
|
|
97
|
-
|
|
98
|
-
payload.http_status = error.httpStatus;
|
|
99
|
-
if (error.apiCode !== undefined)
|
|
100
|
-
payload.code = error.apiCode;
|
|
101
|
-
if (error.apiSubcode !== undefined)
|
|
102
|
-
payload.subcode = error.apiSubcode;
|
|
103
|
-
if (error.apiType)
|
|
104
|
-
payload.type = error.apiType;
|
|
105
|
-
if (error.fbtraceId)
|
|
106
|
-
payload.fbtrace_id = error.fbtraceId;
|
|
110
|
+
assignMetaApiFields(payload, error);
|
|
107
111
|
}
|
|
108
112
|
const remediation = REMEDIATION[errorType];
|
|
109
113
|
if (remediation)
|
|
@@ -114,6 +118,19 @@ export function formatErrorResponse(error, label) {
|
|
|
114
118
|
isError: true,
|
|
115
119
|
};
|
|
116
120
|
}
|
|
121
|
+
export function toMcpResourceError(error, label) {
|
|
122
|
+
const errorType = categorize(error);
|
|
123
|
+
const original = error instanceof Error ? error.message : String(error);
|
|
124
|
+
const message = sanitizeRaw(`${label} failed: ${original}`);
|
|
125
|
+
const data = { error_type: errorType };
|
|
126
|
+
if (error instanceof MetaApiError) {
|
|
127
|
+
assignMetaApiFields(data, error);
|
|
128
|
+
}
|
|
129
|
+
const remediation = REMEDIATION[errorType];
|
|
130
|
+
if (remediation)
|
|
131
|
+
data.remediation = remediation;
|
|
132
|
+
return new McpError(ErrorCode.InternalError, message, data);
|
|
133
|
+
}
|
|
117
134
|
export function validationError(message) {
|
|
118
135
|
const payload = {
|
|
119
136
|
error: true,
|
package/dist/utils/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { RateLimit } from "../services/meta-client.js";
|
|
2
|
+
export interface McpToolResult {
|
|
3
|
+
[key: string]: unknown;
|
|
4
|
+
content: {
|
|
5
|
+
type: "text";
|
|
6
|
+
text: string;
|
|
7
|
+
}[];
|
|
8
|
+
isError?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function formatResponse(data: Record<string, unknown>, rateLimit?: RateLimit): McpToolResult;
|
|
11
|
+
//# sourceMappingURL=response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,CAAC,EAAE,SAAS,GACpB,aAAa,CAIf"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,cAAc,CAC5B,IAA6B,EAC7B,SAAqB;IAErB,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;KAC/F,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exileum/meta-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"mcpName": "io.github.exileum/meta",
|
|
5
5
|
"description": "Enables AI assistants to manage Instagram and Threads accounts — publish content, handle comments, view insights, search hashtags, and manage DMs through the Meta Graph API",
|
|
6
6
|
"type": "module",
|
|
@@ -27,6 +27,8 @@
|
|
|
27
27
|
"build": "tsc",
|
|
28
28
|
"start": "node dist/index.js",
|
|
29
29
|
"dev": "tsx src/index.ts",
|
|
30
|
+
"lint": "eslint . --max-warnings 0",
|
|
31
|
+
"lint:fix": "eslint . --fix",
|
|
30
32
|
"test": "vitest run",
|
|
31
33
|
"test:watch": "vitest"
|
|
32
34
|
},
|
|
@@ -58,10 +60,17 @@
|
|
|
58
60
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
59
61
|
"zod": "^4.4.3"
|
|
60
62
|
},
|
|
63
|
+
"overrides": {
|
|
64
|
+
"ip-address": "^10.1.1"
|
|
65
|
+
},
|
|
61
66
|
"devDependencies": {
|
|
67
|
+
"@eslint/js": "^10.0.1",
|
|
62
68
|
"@types/node": "^25.6.0",
|
|
69
|
+
"eslint": "^10.4.0",
|
|
70
|
+
"globals": "^17.6.0",
|
|
63
71
|
"tsx": "^4.21.0",
|
|
64
72
|
"typescript": "^6.0.3",
|
|
73
|
+
"typescript-eslint": "^8.59.2",
|
|
65
74
|
"vitest": "^4.1.5"
|
|
66
75
|
}
|
|
67
76
|
}
|