@exileum/meta-mcp 6.0.0 → 8.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 (108) hide show
  1. package/README.md +44 -18
  2. package/dist/constants/fields.d.ts +6 -0
  3. package/dist/constants/fields.d.ts.map +1 -0
  4. package/dist/constants/fields.js +25 -0
  5. package/dist/constants/fields.js.map +1 -0
  6. package/dist/http-transport.d.ts +20 -0
  7. package/dist/http-transport.d.ts.map +1 -0
  8. package/dist/http-transport.js +228 -0
  9. package/dist/http-transport.js.map +1 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +77 -82
  12. package/dist/index.js.map +1 -1
  13. package/dist/prompts/index.d.ts +56 -0
  14. package/dist/prompts/index.d.ts.map +1 -1
  15. package/dist/prompts/index.js +264 -41
  16. package/dist/prompts/index.js.map +1 -1
  17. package/dist/register-all.d.ts +4 -0
  18. package/dist/register-all.d.ts.map +1 -0
  19. package/dist/register-all.js +41 -0
  20. package/dist/register-all.js.map +1 -0
  21. package/dist/resources/instagram.d.ts.map +1 -1
  22. package/dist/resources/instagram.js +13 -4
  23. package/dist/resources/instagram.js.map +1 -1
  24. package/dist/resources/threads.d.ts.map +1 -1
  25. package/dist/resources/threads.js +13 -4
  26. package/dist/resources/threads.js.map +1 -1
  27. package/dist/services/meta-client.d.ts +76 -3
  28. package/dist/services/meta-client.d.ts.map +1 -1
  29. package/dist/services/meta-client.js +330 -46
  30. package/dist/services/meta-client.js.map +1 -1
  31. package/dist/shutdown.d.ts +18 -0
  32. package/dist/shutdown.d.ts.map +1 -0
  33. package/dist/shutdown.js +60 -0
  34. package/dist/shutdown.js.map +1 -0
  35. package/dist/tools/annotations.d.ts +6 -0
  36. package/dist/tools/annotations.d.ts.map +1 -0
  37. package/dist/tools/annotations.js +27 -0
  38. package/dist/tools/annotations.js.map +1 -0
  39. package/dist/tools/instagram/comments.d.ts.map +1 -1
  40. package/dist/tools/instagram/comments.js +75 -50
  41. package/dist/tools/instagram/comments.js.map +1 -1
  42. package/dist/tools/instagram/hashtags.d.ts +1 -0
  43. package/dist/tools/instagram/hashtags.d.ts.map +1 -1
  44. package/dist/tools/instagram/hashtags.js +54 -36
  45. package/dist/tools/instagram/hashtags.js.map +1 -1
  46. package/dist/tools/instagram/media.d.ts.map +1 -1
  47. package/dist/tools/instagram/media.js +53 -34
  48. package/dist/tools/instagram/media.js.map +1 -1
  49. package/dist/tools/instagram/mentions.d.ts.map +1 -1
  50. package/dist/tools/instagram/mentions.js +22 -17
  51. package/dist/tools/instagram/mentions.js.map +1 -1
  52. package/dist/tools/instagram/messaging.d.ts.map +1 -1
  53. package/dist/tools/instagram/messaging.js +74 -50
  54. package/dist/tools/instagram/messaging.js.map +1 -1
  55. package/dist/tools/instagram/profile.d.ts +2 -0
  56. package/dist/tools/instagram/profile.d.ts.map +1 -1
  57. package/dist/tools/instagram/profile.js +63 -43
  58. package/dist/tools/instagram/profile.js.map +1 -1
  59. package/dist/tools/instagram/publishing.d.ts.map +1 -1
  60. package/dist/tools/instagram/publishing.js +202 -139
  61. package/dist/tools/instagram/publishing.js.map +1 -1
  62. package/dist/tools/meta/auth.d.ts.map +1 -1
  63. package/dist/tools/meta/auth.js +63 -21
  64. package/dist/tools/meta/auth.js.map +1 -1
  65. package/dist/tools/threads/insights.d.ts.map +1 -1
  66. package/dist/tools/threads/insights.js +22 -15
  67. package/dist/tools/threads/insights.js.map +1 -1
  68. package/dist/tools/threads/media.d.ts.map +1 -1
  69. package/dist/tools/threads/media.js +42 -70
  70. package/dist/tools/threads/media.js.map +1 -1
  71. package/dist/tools/threads/mentions.d.ts.map +1 -1
  72. package/dist/tools/threads/mentions.js +15 -16
  73. package/dist/tools/threads/mentions.js.map +1 -1
  74. package/dist/tools/threads/profile.d.ts +2 -0
  75. package/dist/tools/threads/profile.d.ts.map +1 -1
  76. package/dist/tools/threads/profile.js +18 -3
  77. package/dist/tools/threads/profile.js.map +1 -1
  78. package/dist/tools/threads/publishing.d.ts.map +1 -1
  79. package/dist/tools/threads/publishing.js +260 -157
  80. package/dist/tools/threads/publishing.js.map +1 -1
  81. package/dist/tools/threads/replies.d.ts.map +1 -1
  82. package/dist/tools/threads/replies.js +55 -45
  83. package/dist/tools/threads/replies.js.map +1 -1
  84. package/dist/utils/container.d.ts +16 -4
  85. package/dist/utils/container.d.ts.map +1 -1
  86. package/dist/utils/container.js +36 -6
  87. package/dist/utils/container.js.map +1 -1
  88. package/dist/utils/errors.d.ts +23 -3
  89. package/dist/utils/errors.d.ts.map +1 -1
  90. package/dist/utils/errors.js +32 -2
  91. package/dist/utils/errors.js.map +1 -1
  92. package/dist/utils/logger.d.ts +28 -0
  93. package/dist/utils/logger.d.ts.map +1 -0
  94. package/dist/utils/logger.js +32 -0
  95. package/dist/utils/logger.js.map +1 -0
  96. package/dist/utils/params.d.ts +3 -0
  97. package/dist/utils/params.d.ts.map +1 -0
  98. package/dist/utils/params.js +14 -0
  99. package/dist/utils/params.js.map +1 -0
  100. package/dist/utils/progress.d.ts +42 -0
  101. package/dist/utils/progress.d.ts.map +1 -0
  102. package/dist/utils/progress.js +35 -0
  103. package/dist/utils/progress.js.map +1 -0
  104. package/dist/utils/response.d.ts +11 -0
  105. package/dist/utils/response.d.ts.map +1 -0
  106. package/dist/utils/response.js +6 -0
  107. package/dist/utils/response.js.map +1 -0
  108. package/package.json +5 -4
@@ -0,0 +1,18 @@
1
+ export declare const SHUTDOWN_SIGNALS: readonly ["SIGINT", "SIGTERM"];
2
+ export type ShutdownSignal = (typeof SHUTDOWN_SIGNALS)[number];
3
+ export declare const SHUTDOWN_TIMEOUT_MS = 5000;
4
+ export interface Closeable {
5
+ close(): Promise<void>;
6
+ }
7
+ export interface ShutdownOptions {
8
+ exit?: (code: number) => never;
9
+ log?: (msg: string) => void;
10
+ timeoutMs?: number;
11
+ }
12
+ export declare function setupShutdownHandlers(closeable: Closeable, options?: ShutdownOptions): void;
13
+ export interface FatalErrorOptions {
14
+ exit?: (code: number) => never;
15
+ log?: (msg: string) => void;
16
+ }
17
+ export declare function setupFatalErrorHandlers(options?: FatalErrorOptions): void;
18
+ //# sourceMappingURL=shutdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.d.ts","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,gCAAiC,CAAC;AAC/D,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE/D,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAGzC,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,eAAoB,GAC5B,IAAI,CA4CN;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC;IAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,iBAAsB,GAAG,IAAI,CAkB7E"}
@@ -0,0 +1,60 @@
1
+ export const SHUTDOWN_SIGNALS = ["SIGINT", "SIGTERM"];
2
+ export const SHUTDOWN_TIMEOUT_MS = 5_000;
3
+ export function setupShutdownHandlers(closeable, options = {}) {
4
+ const exit = options.exit ?? ((code) => process.exit(code));
5
+ const log = options.log ?? ((msg) => console.error(msg));
6
+ const timeoutMs = options.timeoutMs ?? SHUTDOWN_TIMEOUT_MS;
7
+ let shuttingDown = false;
8
+ const closeWithDeadline = async () => {
9
+ let timer;
10
+ const deadline = new Promise((_, reject) => {
11
+ timer = setTimeout(() => reject(new Error(`shutdown timed out after ${timeoutMs}ms`)), timeoutMs);
12
+ });
13
+ try {
14
+ await Promise.race([closeable.close(), deadline]);
15
+ }
16
+ finally {
17
+ if (timer)
18
+ clearTimeout(timer);
19
+ }
20
+ };
21
+ const shutdown = async (signal) => {
22
+ if (shuttingDown) {
23
+ log(`[meta-mcp] ${signal} received during shutdown — ignoring`);
24
+ return;
25
+ }
26
+ shuttingDown = true;
27
+ log(`[meta-mcp] ${signal} received — shutting down gracefully`);
28
+ try {
29
+ await closeWithDeadline();
30
+ exit(0);
31
+ }
32
+ catch (err) {
33
+ const message = err instanceof Error ? err.message : String(err);
34
+ log(`[meta-mcp] Error during shutdown: ${message}`);
35
+ exit(1);
36
+ }
37
+ };
38
+ for (const signal of SHUTDOWN_SIGNALS) {
39
+ process.on(signal, () => {
40
+ void shutdown(signal);
41
+ });
42
+ }
43
+ }
44
+ export function setupFatalErrorHandlers(options = {}) {
45
+ const exit = options.exit ?? ((code) => process.exit(code));
46
+ const log = options.log ?? ((msg) => console.error(msg));
47
+ process.on("unhandledRejection", (reason) => {
48
+ const detail = reason instanceof Error ? (reason.stack ?? reason.message) : String(reason);
49
+ log(`[meta-mcp] Unhandled promise rejection — ${detail}`);
50
+ exit(1);
51
+ });
52
+ process.on("uncaughtException", (err, origin) => {
53
+ const prefix = origin === "unhandledRejection"
54
+ ? "Unhandled promise rejection (via uncaughtException)"
55
+ : "Uncaught exception";
56
+ log(`[meta-mcp] ${prefix} — ${err.stack ?? err.message}`);
57
+ exit(1);
58
+ });
59
+ }
60
+ //# sourceMappingURL=shutdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shutdown.js","sourceRoot":"","sources":["../src/shutdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const READ_ONLY_TOOL: ToolAnnotations;
3
+ export declare const DESTRUCTIVE_TOOL: ToolAnnotations;
4
+ export declare const WRITE_TOOL: ToolAnnotations;
5
+ export declare const WRITE_IDEMPOTENT_TOOL: ToolAnnotations;
6
+ //# sourceMappingURL=annotations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAO1E,eAAO,MAAM,cAAc,EAAE,eAG5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAK9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAKxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,eAKnC,CAAC"}
@@ -0,0 +1,27 @@
1
+ // Every tool in this project calls the Meta Graph API (Instagram + Threads),
2
+ // so openWorldHint is always true. The four presets below cover every Meta
3
+ // endpoint shape we expose; see https://modelcontextprotocol.io for the
4
+ // canonical hint semantics.
5
+ export const READ_ONLY_TOOL = {
6
+ readOnlyHint: true,
7
+ openWorldHint: true,
8
+ };
9
+ export const DESTRUCTIVE_TOOL = {
10
+ readOnlyHint: false,
11
+ destructiveHint: true,
12
+ idempotentHint: true,
13
+ openWorldHint: true,
14
+ };
15
+ export const WRITE_TOOL = {
16
+ readOnlyHint: false,
17
+ destructiveHint: false,
18
+ idempotentHint: false,
19
+ openWorldHint: true,
20
+ };
21
+ export const WRITE_IDEMPOTENT_TOOL = {
22
+ readOnlyHint: false,
23
+ destructiveHint: false,
24
+ idempotentHint: true,
25
+ openWorldHint: true,
26
+ };
27
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/tools/annotations.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,2EAA2E;AAC3E,wEAAwE;AACxE,4BAA4B;AAE5B,MAAM,CAAC,MAAM,cAAc,GAAoB;IAC7C,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAoB;IAC/C,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAoB;IACzC,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAoB;IACpD,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;CACpB,CAAC"}
@@ -1 +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,EAAc,MAAM,+BAA+B,CAAC;AAQvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA2IlF"}
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;AAW3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAgKlF"}
@@ -1,115 +1,140 @@
1
1
  import { z } from "zod";
2
2
  import { metaId } from "../../schemas.js";
3
3
  import { formatErrorResponse } from "../../utils/errors.js";
4
- const GET_COMMENTS_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,replies{id,text,username,timestamp}";
5
- const GET_COMMENT_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,parent_id,media";
6
- const GET_REPLIES_DEFAULT_FIELDS = "id,text,username,timestamp,like_count";
4
+ import { formatResponse } from "../../utils/response.js";
5
+ import { buildParams } from "../../utils/params.js";
6
+ import { READ_ONLY_TOOL, DESTRUCTIVE_TOOL, WRITE_TOOL, WRITE_IDEMPOTENT_TOOL } from "../annotations.js";
7
+ const GET_COMMENTS_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,hidden,from,replies{id,text,username,timestamp,like_count,hidden,from}";
8
+ const GET_COMMENT_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,hidden,from,parent_id,media";
9
+ const GET_REPLIES_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,hidden,from";
7
10
  export function registerIgCommentTools(server, client) {
8
11
  // ─── ig_get_comments ─────────────────────────────────────────
9
- server.tool("ig_get_comments", "Get comments on a specific Instagram media post.", {
10
- media_id: metaId.describe("Media ID"),
11
- limit: z.number().optional().describe("Number of comments to return"),
12
- after: z.string().optional().describe("Pagination cursor for next page"),
13
- before: z.string().optional().describe("Pagination cursor for previous page"),
14
- fields: z.string().optional().default(GET_COMMENTS_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENTS_DEFAULT_FIELDS})`),
12
+ server.registerTool("ig_get_comments", {
13
+ description: "Get comments on a specific Instagram media post.",
14
+ inputSchema: {
15
+ media_id: metaId.describe("Media ID"),
16
+ limit: z.number().optional().describe("Number of comments to return"),
17
+ after: z.string().optional().describe("Pagination cursor for next page"),
18
+ before: z.string().optional().describe("Pagination cursor for previous page"),
19
+ fields: z.string().optional().default(GET_COMMENTS_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENTS_DEFAULT_FIELDS})`),
20
+ },
21
+ annotations: READ_ONLY_TOOL,
15
22
  }, async ({ media_id, limit, after, before, fields }) => {
16
23
  try {
17
- const params = { fields };
18
- if (limit !== undefined)
19
- params.limit = limit;
20
- if (after)
21
- params.after = after;
22
- if (before)
23
- params.before = before;
24
+ const params = buildParams({ fields }, { limit, after, before });
24
25
  const { data, rateLimit } = await client.ig("GET", `/${media_id}/comments`, params);
25
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
26
+ return formatResponse(data, rateLimit);
26
27
  }
27
28
  catch (error) {
28
29
  return formatErrorResponse(error, "Get comments");
29
30
  }
30
31
  });
31
32
  // ─── ig_get_comment ──────────────────────────────────────────
32
- server.tool("ig_get_comment", "Get details of a specific comment.", {
33
- comment_id: metaId.describe("Comment ID"),
34
- fields: z.string().optional().default(GET_COMMENT_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENT_DEFAULT_FIELDS})`),
33
+ server.registerTool("ig_get_comment", {
34
+ description: "Get details of a specific comment.",
35
+ inputSchema: {
36
+ comment_id: metaId.describe("Comment ID"),
37
+ fields: z.string().optional().default(GET_COMMENT_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENT_DEFAULT_FIELDS})`),
38
+ },
39
+ annotations: READ_ONLY_TOOL,
35
40
  }, async ({ comment_id, fields }) => {
36
41
  try {
37
42
  const { data, rateLimit } = await client.ig("GET", `/${comment_id}`, { fields });
38
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
43
+ return formatResponse(data, rateLimit);
39
44
  }
40
45
  catch (error) {
41
46
  return formatErrorResponse(error, "Get comment");
42
47
  }
43
48
  });
44
49
  // ─── ig_post_comment ─────────────────────────────────────────
45
- server.tool("ig_post_comment", "Post a top-level comment on a media post.", {
46
- media_id: metaId.describe("Media ID to comment on"),
47
- message: z.string().describe("Comment text"),
50
+ server.registerTool("ig_post_comment", {
51
+ description: "Post a top-level comment on a media post.",
52
+ inputSchema: {
53
+ media_id: metaId.describe("Media ID to comment on"),
54
+ message: z.string()
55
+ .min(1)
56
+ .refine((s) => [...s].length <= 2200, { message: "Comment text must be 2200 characters or fewer" })
57
+ .describe("Comment text (max 2200 chars per Meta's Instagram caption/comment limit)"),
58
+ },
59
+ annotations: WRITE_TOOL,
48
60
  }, async ({ media_id, message }) => {
49
61
  try {
50
62
  const { data, rateLimit } = await client.ig("POST", `/${media_id}/comments`, { message });
51
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
63
+ return formatResponse(data, rateLimit);
52
64
  }
53
65
  catch (error) {
54
66
  return formatErrorResponse(error, "Post comment");
55
67
  }
56
68
  });
57
69
  // ─── ig_get_replies ──────────────────────────────────────────
58
- server.tool("ig_get_replies", "Get replies to a specific comment.", {
59
- comment_id: metaId.describe("Comment ID to get replies for"),
60
- limit: z.number().optional().describe("Number of replies to return"),
61
- after: z.string().optional().describe("Pagination cursor for next page"),
62
- before: z.string().optional().describe("Pagination cursor for previous page"),
63
- fields: z.string().optional().default(GET_REPLIES_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_REPLIES_DEFAULT_FIELDS})`),
70
+ server.registerTool("ig_get_replies", {
71
+ description: "Get replies to a specific comment.",
72
+ inputSchema: {
73
+ comment_id: metaId.describe("Comment ID to get replies for"),
74
+ limit: z.number().optional().describe("Number of replies to return"),
75
+ after: z.string().optional().describe("Pagination cursor for next page"),
76
+ before: z.string().optional().describe("Pagination cursor for previous page"),
77
+ fields: z.string().optional().default(GET_REPLIES_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_REPLIES_DEFAULT_FIELDS})`),
78
+ },
79
+ annotations: READ_ONLY_TOOL,
64
80
  }, async ({ comment_id, limit, after, before, fields }) => {
65
81
  try {
66
- const params = { fields };
67
- if (limit !== undefined)
68
- params.limit = limit;
69
- if (after)
70
- params.after = after;
71
- if (before)
72
- params.before = before;
82
+ const params = buildParams({ fields }, { limit, after, before });
73
83
  const { data, rateLimit } = await client.ig("GET", `/${comment_id}/replies`, params);
74
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
84
+ return formatResponse(data, rateLimit);
75
85
  }
76
86
  catch (error) {
77
87
  return formatErrorResponse(error, "Get replies");
78
88
  }
79
89
  });
80
90
  // ─── ig_reply_to_comment ─────────────────────────────────────
81
- server.tool("ig_reply_to_comment", "Reply to a specific comment.", {
82
- comment_id: metaId.describe("Comment ID to reply to"),
83
- message: z.string().describe("Reply text"),
91
+ server.registerTool("ig_reply_to_comment", {
92
+ description: "Reply to a specific comment.",
93
+ inputSchema: {
94
+ comment_id: metaId.describe("Comment ID to reply to"),
95
+ message: z.string()
96
+ .min(1)
97
+ .refine((s) => [...s].length <= 2200, { message: "Reply text must be 2200 characters or fewer" })
98
+ .describe("Reply text (max 2200 chars per Meta's Instagram caption/comment limit)"),
99
+ },
100
+ annotations: WRITE_TOOL,
84
101
  }, async ({ comment_id, message }) => {
85
102
  try {
86
103
  const { data, rateLimit } = await client.ig("POST", `/${comment_id}/replies`, { message });
87
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
104
+ return formatResponse(data, rateLimit);
88
105
  }
89
106
  catch (error) {
90
107
  return formatErrorResponse(error, "Reply");
91
108
  }
92
109
  });
93
110
  // ─── ig_hide_comment ─────────────────────────────────────────
94
- server.tool("ig_hide_comment", "Hide or unhide a comment on your post.", {
95
- comment_id: metaId.describe("Comment ID"),
96
- hide: z.boolean().describe("true to hide, false to unhide"),
111
+ server.registerTool("ig_hide_comment", {
112
+ description: "Hide or unhide a comment on your post.",
113
+ inputSchema: {
114
+ comment_id: metaId.describe("Comment ID"),
115
+ hide: z.boolean().describe("true to hide, false to unhide"),
116
+ },
117
+ annotations: WRITE_IDEMPOTENT_TOOL,
97
118
  }, async ({ comment_id, hide }) => {
98
119
  try {
99
120
  const { data, rateLimit } = await client.ig("POST", `/${comment_id}`, { hide });
100
- return { content: [{ type: "text", text: JSON.stringify({ success: true, hidden: hide, ...data, _rateLimit: rateLimit }, null, 2) }] };
121
+ return formatResponse({ success: true, hidden: hide, ...data }, rateLimit);
101
122
  }
102
123
  catch (error) {
103
124
  return formatErrorResponse(error, "Hide comment");
104
125
  }
105
126
  });
106
127
  // ─── ig_delete_comment ───────────────────────────────────────
107
- server.tool("ig_delete_comment", "Delete a comment from your media post. This action is irreversible.", {
108
- comment_id: metaId.describe("Comment ID to delete"),
128
+ server.registerTool("ig_delete_comment", {
129
+ description: "Delete a comment from your media post. This action is irreversible.",
130
+ inputSchema: {
131
+ comment_id: metaId.describe("Comment ID to delete"),
132
+ },
133
+ annotations: DESTRUCTIVE_TOOL,
109
134
  }, async ({ comment_id }) => {
110
135
  try {
111
136
  const { data, rateLimit } = await client.ig("DELETE", `/${comment_id}`);
112
- return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
137
+ return formatResponse({ success: true, ...data }, rateLimit);
113
138
  }
114
139
  catch (error) {
115
140
  return formatErrorResponse(error, "Delete comment");
@@ -1 +1 @@
1
- {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/tools/instagram/comments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/tools/instagram/comments.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { MetaClient } from "../../services/meta-client.js";
3
+ export declare const igHashtagCacheKey: (userId: string, q: string) => string;
3
4
  export declare function registerIgHashtagTools(server: McpServer, client: MetaClient): void;
4
5
  //# sourceMappingURL=hashtags.d.ts.map
@@ -1 +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,EAAc,MAAM,+BAA+B,CAAC;AAIvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA6FlF"}
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,EAAwB,MAAM,+BAA+B,CAAC;AAWjF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,EAAE,GAAG,MAAM,KAAG,MACnB,CAAC;AAE5C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA6GlF"}
@@ -1,81 +1,99 @@
1
1
  import { z } from "zod";
2
+ import { HASHTAG_CACHE_TTL_MS } from "../../services/meta-client.js";
2
3
  import { metaId } from "../../schemas.js";
4
+ import { IG_HASHTAG_MEDIA_FIELDS } from "../../constants/fields.js";
3
5
  import { formatErrorResponse } from "../../utils/errors.js";
6
+ import { formatResponse } from "../../utils/response.js";
7
+ import { buildParams } from "../../utils/params.js";
8
+ import { READ_ONLY_TOOL } from "../annotations.js";
9
+ // Meta's hashtag search is case-insensitive — `"Puppies"` and `"puppies"`
10
+ // resolve to the same hashtag ID. Lowercase the query so both spellings share
11
+ // one cache slot against the 30-unique-per-7-days quota.
12
+ export const igHashtagCacheKey = (userId, q) => `ig:hashtag:${userId}:${q.toLowerCase()}`;
4
13
  export function registerIgHashtagTools(server, client) {
5
14
  // ─── ig_search_hashtag ───────────────────────────────────────
6
- 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.", {
7
- q: z.string().describe("Hashtag name to search (without #)"),
15
+ server.registerTool("ig_search_hashtag", {
16
+ description: "Search for a hashtag ID by name. Required before querying hashtag media. Limited to 30 unique hashtags per 7-day rolling window — meta-mcp caches results in-process to maximize quota utilization on repeated lookups.",
17
+ inputSchema: {
18
+ q: z.string().describe("Hashtag name to search (without #)"),
19
+ },
20
+ annotations: READ_ONLY_TOOL,
8
21
  }, async ({ q }) => {
9
22
  try {
23
+ const cacheKey = igHashtagCacheKey(client.igUserId, q);
24
+ const cached = client.getCached(cacheKey);
25
+ if (cached)
26
+ return formatResponse(cached);
10
27
  const { data, rateLimit } = await client.ig("GET", "/ig_hashtag_search", {
11
28
  q,
12
29
  user_id: client.igUserId,
13
30
  });
14
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
31
+ client.setCache(cacheKey, data, HASHTAG_CACHE_TTL_MS);
32
+ return formatResponse(data, rateLimit);
15
33
  }
16
34
  catch (error) {
17
35
  return formatErrorResponse(error, "Hashtag search");
18
36
  }
19
37
  });
20
38
  // ─── ig_get_hashtag ──────────────────────────────────────────
21
- server.tool("ig_get_hashtag", "Get hashtag information by ID.", {
22
- hashtag_id: metaId.describe("Hashtag ID (from ig_search_hashtag)"),
39
+ server.registerTool("ig_get_hashtag", {
40
+ description: "Get hashtag information by ID.",
41
+ inputSchema: {
42
+ hashtag_id: metaId.describe("Hashtag ID (from ig_search_hashtag)"),
43
+ },
44
+ annotations: READ_ONLY_TOOL,
23
45
  }, async ({ hashtag_id }) => {
24
46
  try {
25
47
  const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}`, {
26
48
  fields: "id,name,media_count",
27
49
  });
28
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
50
+ return formatResponse(data, rateLimit);
29
51
  }
30
52
  catch (error) {
31
53
  return formatErrorResponse(error, "Get hashtag");
32
54
  }
33
55
  });
34
56
  // ─── ig_get_hashtag_recent ───────────────────────────────────
35
- server.tool("ig_get_hashtag_recent", "Get recent media tagged with a specific hashtag.", {
36
- hashtag_id: metaId.describe("Hashtag ID"),
37
- limit: z.number().optional().describe("Number of results"),
38
- after: z.string().optional().describe("Pagination cursor for next page"),
39
- before: z.string().optional().describe("Pagination cursor for previous page"),
57
+ server.registerTool("ig_get_hashtag_recent", {
58
+ description: "Get recent media tagged with a specific hashtag.",
59
+ inputSchema: {
60
+ hashtag_id: metaId.describe("Hashtag ID"),
61
+ limit: z.number().optional().describe("Number of results"),
62
+ after: z.string().optional().describe("Pagination cursor for next page"),
63
+ before: z.string().optional().describe("Pagination cursor for previous page"),
64
+ },
65
+ annotations: READ_ONLY_TOOL,
40
66
  }, async ({ hashtag_id, limit, after, before }) => {
41
67
  try {
42
- const params = {
68
+ const params = buildParams({
43
69
  user_id: client.igUserId,
44
- fields: "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count",
45
- };
46
- if (limit !== undefined)
47
- params.limit = limit;
48
- if (after)
49
- params.after = after;
50
- if (before)
51
- params.before = before;
70
+ fields: IG_HASHTAG_MEDIA_FIELDS,
71
+ }, { limit, after, before });
52
72
  const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/recent_media`, params);
53
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
73
+ return formatResponse(data, rateLimit);
54
74
  }
55
75
  catch (error) {
56
76
  return formatErrorResponse(error, "Get hashtag recent");
57
77
  }
58
78
  });
59
79
  // ─── ig_get_hashtag_top ──────────────────────────────────────
60
- server.tool("ig_get_hashtag_top", "Get top (most popular) media tagged with a specific hashtag.", {
61
- hashtag_id: metaId.describe("Hashtag ID"),
62
- limit: z.number().optional().describe("Number of results"),
63
- after: z.string().optional().describe("Pagination cursor for next page"),
64
- before: z.string().optional().describe("Pagination cursor for previous page"),
80
+ server.registerTool("ig_get_hashtag_top", {
81
+ description: "Get top (most popular) media tagged with a specific hashtag.",
82
+ inputSchema: {
83
+ hashtag_id: metaId.describe("Hashtag ID"),
84
+ limit: z.number().optional().describe("Number of results"),
85
+ after: z.string().optional().describe("Pagination cursor for next page"),
86
+ before: z.string().optional().describe("Pagination cursor for previous page"),
87
+ },
88
+ annotations: READ_ONLY_TOOL,
65
89
  }, async ({ hashtag_id, limit, after, before }) => {
66
90
  try {
67
- const params = {
91
+ const params = buildParams({
68
92
  user_id: client.igUserId,
69
- fields: "id,caption,media_type,media_url,permalink,timestamp,like_count,comments_count",
70
- };
71
- if (limit !== undefined)
72
- params.limit = limit;
73
- if (after)
74
- params.after = after;
75
- if (before)
76
- params.before = before;
93
+ fields: IG_HASHTAG_MEDIA_FIELDS,
94
+ }, { limit, after, before });
77
95
  const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/top_media`, params);
78
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
96
+ return formatResponse(data, rateLimit);
79
97
  }
80
98
  catch (error) {
81
99
  return formatErrorResponse(error, "Get hashtag top");
@@ -1 +1 @@
1
- {"version":3,"file":"hashtags.js","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hashtags.js","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.ts"],"names":[],"mappings":"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"}
@@ -1 +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,EAAc,MAAM,+BAA+B,CAAC;AAOvE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAsGhF"}
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;AAW3D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAsHhF"}