@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
@@ -1,84 +1,103 @@
1
1
  import { z } from "zod";
2
2
  import { metaId } from "../../schemas.js";
3
+ import { IG_MEDIA_FIELDS } from "../../constants/fields.js";
3
4
  import { formatErrorResponse } from "../../utils/errors.js";
4
- const GET_MEDIA_DEFAULT_FIELDS = "id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,like_count,comments_count";
5
+ import { formatResponse } from "../../utils/response.js";
6
+ import { buildParams } from "../../utils/params.js";
7
+ import { READ_ONLY_TOOL, DESTRUCTIVE_TOOL, WRITE_IDEMPOTENT_TOOL } from "../annotations.js";
8
+ import { IG_PROFILE_CACHE_PREFIX } from "./profile.js";
5
9
  const GET_MEDIA_INSIGHTS_DEFAULT_METRIC = "views,reach";
6
10
  export function registerIgMediaTools(server, client) {
7
11
  // ─── ig_get_media_list ───────────────────────────────────────
8
- server.tool("ig_get_media_list", "Get list of media published on the Instagram account.", {
9
- limit: z.number().optional().describe("Number of results (max 100, default 25)"),
10
- after: z.string().optional().describe("Pagination cursor for next page"),
11
- before: z.string().optional().describe("Pagination cursor for previous page"),
12
+ server.registerTool("ig_get_media_list", {
13
+ description: "Get list of media published on the Instagram account.",
14
+ inputSchema: {
15
+ limit: z.number().optional().describe("Number of results (max 100, default 25)"),
16
+ after: z.string().optional().describe("Pagination cursor for next page"),
17
+ before: z.string().optional().describe("Pagination cursor for previous page"),
18
+ },
19
+ annotations: READ_ONLY_TOOL,
12
20
  }, async ({ limit, after, before }) => {
13
21
  try {
14
- const params = {
15
- fields: "id,caption,media_type,media_url,permalink,thumbnail_url,timestamp,like_count,comments_count",
16
- };
17
- if (limit !== undefined)
18
- params.limit = limit;
19
- if (after)
20
- params.after = after;
21
- if (before)
22
- params.before = before;
22
+ const params = buildParams({
23
+ fields: IG_MEDIA_FIELDS,
24
+ }, { limit, after, before });
23
25
  const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/media`, params);
24
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
26
+ return formatResponse(data, rateLimit);
25
27
  }
26
28
  catch (error) {
27
29
  return formatErrorResponse(error, "Get media list");
28
30
  }
29
31
  });
30
32
  // ─── ig_get_media ────────────────────────────────────────────
31
- server.tool("ig_get_media", "Get details of a specific Instagram media post.", {
32
- media_id: metaId.describe("Media ID"),
33
- fields: z.string().optional().default(GET_MEDIA_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_MEDIA_DEFAULT_FIELDS})`),
33
+ server.registerTool("ig_get_media", {
34
+ description: "Get details of a specific Instagram media post.",
35
+ inputSchema: {
36
+ media_id: metaId.describe("Media ID"),
37
+ fields: z.string().optional().default(IG_MEDIA_FIELDS).describe(`Comma-separated fields (default: ${IG_MEDIA_FIELDS})`),
38
+ },
39
+ annotations: READ_ONLY_TOOL,
34
40
  }, async ({ media_id, fields }) => {
35
41
  try {
36
42
  const { data, rateLimit } = await client.ig("GET", `/${media_id}`, { fields });
37
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
43
+ return formatResponse(data, rateLimit);
38
44
  }
39
45
  catch (error) {
40
46
  return formatErrorResponse(error, "Get media");
41
47
  }
42
48
  });
43
49
  // ─── ig_delete_media ─────────────────────────────────────────
44
- server.tool("ig_delete_media", "Delete an Instagram media post (posts, carousels, reels, stories). This action is irreversible. Requires instagram_manage_contents permission (Facebook Login only — not available with Instagram Login).", {
45
- media_id: metaId.describe("Media ID to delete"),
50
+ server.registerTool("ig_delete_media", {
51
+ description: "Delete an Instagram media post (posts, carousels, reels, stories). This action is irreversible. Requires instagram_manage_contents permission (Facebook Login only — not available with Instagram Login).",
52
+ inputSchema: {
53
+ media_id: metaId.describe("Media ID to delete"),
54
+ },
55
+ annotations: DESTRUCTIVE_TOOL,
46
56
  }, async ({ media_id }) => {
47
57
  try {
48
58
  const { data, rateLimit } = await client.ig("DELETE", `/${media_id}`);
49
- return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
59
+ client.invalidateCache(IG_PROFILE_CACHE_PREFIX);
60
+ return formatResponse({ success: true, ...data }, rateLimit);
50
61
  }
51
62
  catch (error) {
52
63
  return formatErrorResponse(error, "Delete media");
53
64
  }
54
65
  });
55
66
  // ─── ig_get_media_insights ───────────────────────────────────
56
- server.tool("ig_get_media_insights", "Get insights/analytics for a specific media post. Default metrics 'views,reach' are safe for every media type. Metric availability differs by media type — request more selectively to avoid (#100) errors:\n" +
57
- "- IMAGE / VIDEO / CAROUSEL: views, reach, saved, total_interactions, likes, comments (note: 'shares' may return (#100) on IMAGEtest before relying on it)\n" +
58
- "- REEL: views, reach, saved, total_interactions, likes, comments, shares, reposts, reels_skip_rate\n" +
59
- "- STORY: views, reach, total_interactions, navigation, replies, profile_activity, profile_visits, follows\n" +
60
- "Note: 'impressions' and 'video_views' were deprecated in v22.0 — use 'views' instead. See https://developers.facebook.com/docs/instagram-platform/reference/instagram-media/insights/ for the authoritative per-type matrix.", {
61
- media_id: metaId.describe("Media ID"),
62
- metric: z.string().optional().default(GET_MEDIA_INSIGHTS_DEFAULT_METRIC).describe(`Comma-separated metrics. Default '${GET_MEDIA_INSIGHTS_DEFAULT_METRIC}' is universally supported; override per media type per the tool description.`),
67
+ server.registerTool("ig_get_media_insights", {
68
+ description: "Get insights/analytics for a specific media post. Default metrics 'views,reach' are safe for every media type. Metric availability differs by media type request more selectively to avoid (#100) errors:\n" +
69
+ "- IMAGE / VIDEO / CAROUSEL: views, reach, saved, total_interactions, likes, comments (note: 'shares' may return (#100) on IMAGE — test before relying on it)\n" +
70
+ "- REEL: views, reach, saved, total_interactions, likes, comments, shares, reposts, reels_skip_rate\n" +
71
+ "- STORY: views, reach, total_interactions, navigation, replies, profile_activity, profile_visits, follows\n" +
72
+ "Note: 'impressions' and 'video_views' were deprecated in v22.0 — use 'views' instead. See https://developers.facebook.com/docs/instagram-platform/reference/instagram-media/insights/ for the authoritative per-type matrix.",
73
+ inputSchema: {
74
+ media_id: metaId.describe("Media ID"),
75
+ metric: z.string().optional().default(GET_MEDIA_INSIGHTS_DEFAULT_METRIC).describe(`Comma-separated metrics. Default '${GET_MEDIA_INSIGHTS_DEFAULT_METRIC}' is universally supported; override per media type per the tool description.`),
76
+ },
77
+ annotations: READ_ONLY_TOOL,
63
78
  }, async ({ media_id, metric }) => {
64
79
  try {
65
80
  const { data, rateLimit } = await client.ig("GET", `/${media_id}/insights`, { metric });
66
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
81
+ return formatResponse(data, rateLimit);
67
82
  }
68
83
  catch (error) {
69
84
  return formatErrorResponse(error, "Get media insights");
70
85
  }
71
86
  });
72
87
  // ─── ig_toggle_comments ──────────────────────────────────────
73
- server.tool("ig_toggle_comments", "Enable or disable comments on an Instagram media post.", {
74
- media_id: metaId.describe("Media ID"),
75
- enabled: z.boolean().describe("true to enable comments, false to disable"),
88
+ server.registerTool("ig_toggle_comments", {
89
+ description: "Enable or disable comments on an Instagram media post.",
90
+ inputSchema: {
91
+ media_id: metaId.describe("Media ID"),
92
+ enabled: z.boolean().describe("true to enable comments, false to disable"),
93
+ },
94
+ annotations: WRITE_IDEMPOTENT_TOOL,
76
95
  }, async ({ media_id, enabled }) => {
77
96
  try {
78
97
  const { data, rateLimit } = await client.ig("POST", `/${media_id}`, {
79
98
  comment_enabled: enabled,
80
99
  });
81
- return { content: [{ type: "text", text: JSON.stringify({ success: true, comment_enabled: enabled, ...data, _rateLimit: rateLimit }, null, 2) }] };
100
+ return formatResponse({ success: true, comment_enabled: enabled, ...data }, rateLimit);
82
101
  }
83
102
  catch (error) {
84
103
  return formatErrorResponse(error, "Toggle comments");
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/instagram/media.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../src/tools/instagram/media.ts"],"names":[],"mappings":"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"}
@@ -1 +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,EAAc,MAAM,+BAA+B,CAAC;AAOvE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA6ClF"}
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;AAU3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAgDlF"}
@@ -1,42 +1,47 @@
1
1
  import { z } from "zod";
2
2
  import { metaId } from "../../schemas.js";
3
3
  import { formatErrorResponse } from "../../utils/errors.js";
4
+ import { formatResponse } from "../../utils/response.js";
5
+ import { buildParams } from "../../utils/params.js";
6
+ import { READ_ONLY_TOOL } from "../annotations.js";
4
7
  const MENTIONED_COMMENT_DEFAULT_FIELDS = "id,text,timestamp,username,media{id,media_url,media_type}";
5
8
  const TAGGED_MEDIA_DEFAULT_FIELDS = "id,caption,media_type,media_url,permalink,timestamp,username";
6
9
  export function registerIgMentionTools(server, client) {
7
10
  // ─── ig_get_mentioned_comment ────────────────────────────────
8
- server.tool("ig_get_mentioned_comment", "Get details of a specific comment where the account was @mentioned. Requires the comment_id from a mention webhook notification. Returns a single comment with its associated media.", {
9
- comment_id: metaId.describe("Comment ID from a mention webhook notification"),
10
- fields: z.string().optional().default(MENTIONED_COMMENT_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MENTIONED_COMMENT_DEFAULT_FIELDS})`),
11
+ server.registerTool("ig_get_mentioned_comment", {
12
+ description: "Get details of a specific comment where the account was @mentioned. Requires the comment_id from a mention webhook notification. Returns a single comment with its associated media.",
13
+ inputSchema: {
14
+ comment_id: metaId.describe("Comment ID from a mention webhook notification"),
15
+ fields: z.string().optional().default(MENTIONED_COMMENT_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MENTIONED_COMMENT_DEFAULT_FIELDS})`),
16
+ },
17
+ annotations: READ_ONLY_TOOL,
11
18
  }, async ({ comment_id, fields }) => {
12
19
  try {
13
20
  const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/mentioned_comment`, {
14
21
  comment_id,
15
22
  fields,
16
23
  });
17
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
24
+ return formatResponse(data, rateLimit);
18
25
  }
19
26
  catch (error) {
20
27
  return formatErrorResponse(error, "Get mentioned comment");
21
28
  }
22
29
  });
23
30
  // ─── ig_get_tagged_media ─────────────────────────────────────
24
- server.tool("ig_get_tagged_media", "Get media where the account is tagged (photo tags, not @mentions).", {
25
- limit: z.number().optional().describe("Number of results"),
26
- after: z.string().optional().describe("Pagination cursor for next page"),
27
- before: z.string().optional().describe("Pagination cursor for previous page"),
28
- fields: z.string().optional().default(TAGGED_MEDIA_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${TAGGED_MEDIA_DEFAULT_FIELDS})`),
31
+ server.registerTool("ig_get_tagged_media", {
32
+ description: "Get media where the account is tagged (photo tags, not @mentions).",
33
+ inputSchema: {
34
+ limit: z.number().optional().describe("Number of results"),
35
+ after: z.string().optional().describe("Pagination cursor for next page"),
36
+ before: z.string().optional().describe("Pagination cursor for previous page"),
37
+ fields: z.string().optional().default(TAGGED_MEDIA_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${TAGGED_MEDIA_DEFAULT_FIELDS})`),
38
+ },
39
+ annotations: READ_ONLY_TOOL,
29
40
  }, async ({ limit, after, before, fields }) => {
30
41
  try {
31
- const params = { fields };
32
- if (limit !== undefined)
33
- params.limit = limit;
34
- if (after)
35
- params.after = after;
36
- if (before)
37
- params.before = before;
42
+ const params = buildParams({ fields }, { limit, after, before });
38
43
  const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/tags`, params);
39
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
44
+ return formatResponse(data, rateLimit);
40
45
  }
41
46
  catch (error) {
42
47
  return formatErrorResponse(error, "Get tagged media");
@@ -1 +1 @@
1
- {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/tools/instagram/mentions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../../src/tools/instagram/mentions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,gCAAgC,GAAG,2DAA2D,CAAC;AACrG,MAAM,2BAA2B,GAAG,8DAA8D,CAAC;AAEnG,MAAM,UAAU,sBAAsB,CAAC,MAAiB,EAAE,MAAkB;IAC1E,gEAAgE;IAChE,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,WAAW,EAAE,sLAAsL;QACnM,WAAW,EAAE;YACX,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAC7E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,QAAQ,CAAC,oCAAoC,gCAAgC,GAAG,CAAC;SAC1J;QACD,WAAW,EAAE,cAAc;KAC5B,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,oBAAoB,EAAE;gBAC1F,UAAU;gBACV,MAAM;aACP,CAAC,CAAC;YACH,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gEAAgE;IAChE,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YAC1D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACxE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;YAC7E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,oCAAoC,2BAA2B,GAAG,CAAC;SAChJ;QACD,WAAW,EAAE,cAAc;KAC5B,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,OAAO,EAAE,MAAM,CAAC,CAAC;YACvF,OAAO,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +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,EAAc,MAAM,+BAA+B,CAAC;AAQvE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAgGpF"}
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;AAa3D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAyHpF"}
@@ -1,88 +1,112 @@
1
1
  import { z } from "zod";
2
2
  import { metaId } from "../../schemas.js";
3
- import { formatErrorResponse } from "../../utils/errors.js";
3
+ import { formatErrorResponse, validationError } from "../../utils/errors.js";
4
+ import { formatResponse } from "../../utils/response.js";
5
+ import { buildParams } from "../../utils/params.js";
6
+ import { READ_ONLY_TOOL, WRITE_TOOL } from "../annotations.js";
4
7
  const GET_CONVERSATIONS_DEFAULT_FIELDS = "id,updated_time,participants,messages{id,message,from,created_time}";
5
8
  // Both /conversations/{id}/messages and /messages/{id} share the same Message resource shape, so they reuse the same default field set.
6
9
  const MESSAGE_DEFAULT_FIELDS = "id,message,from,created_time,attachments";
10
+ const textEncoder = new TextEncoder();
7
11
  export function registerIgMessagingTools(server, client) {
8
12
  // ─── ig_get_conversations ────────────────────────────────────
9
- server.tool("ig_get_conversations", "Get Instagram DM conversations list. Requires 'instagram_business_manage_messages' permission and the Instagram Messaging API.", {
10
- folder: z.enum(["inbox", "spam"]).optional().describe("Folder to retrieve (default: inbox)"),
11
- limit: z.number().optional().describe("Number of conversations"),
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_CONVERSATIONS_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_CONVERSATIONS_DEFAULT_FIELDS})`),
13
+ server.registerTool("ig_get_conversations", {
14
+ description: "Get Instagram DM conversations list. Requires 'instagram_business_manage_messages' permission and the Instagram Messaging API.",
15
+ inputSchema: {
16
+ folder: z.enum(["inbox", "spam"]).optional().describe("Folder to retrieve (default: inbox)"),
17
+ limit: z.number().optional().describe("Number of conversations"),
18
+ after: z.string().optional().describe("Pagination cursor for next page"),
19
+ before: z.string().optional().describe("Pagination cursor for previous page"),
20
+ fields: z.string().optional().default(GET_CONVERSATIONS_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_CONVERSATIONS_DEFAULT_FIELDS})`),
21
+ },
22
+ annotations: READ_ONLY_TOOL,
15
23
  }, async ({ folder, limit, after, before, fields }) => {
16
24
  try {
17
- const params = {
18
- platform: "instagram",
19
- fields,
20
- };
21
- if (folder)
22
- params.folder = folder;
23
- if (limit !== undefined)
24
- params.limit = limit;
25
- if (after)
26
- params.after = after;
27
- if (before)
28
- params.before = before;
25
+ const params = buildParams({ platform: "instagram", fields }, { folder, limit, after, before });
29
26
  const { data, rateLimit } = await client.ig("GET", `/${client.igUserId}/conversations`, params);
30
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
27
+ return formatResponse(data, rateLimit);
31
28
  }
32
29
  catch (error) {
33
30
  return formatErrorResponse(error, "Get conversations");
34
31
  }
35
32
  });
36
33
  // ─── ig_get_messages ─────────────────────────────────────────
37
- server.tool("ig_get_messages", "Get messages in a specific DM conversation.", {
38
- conversation_id: metaId.describe("Conversation ID"),
39
- limit: z.number().optional().describe("Number of messages"),
40
- after: z.string().optional().describe("Pagination cursor for next page"),
41
- before: z.string().optional().describe("Pagination cursor for previous page"),
42
- fields: z.string().optional().default(MESSAGE_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MESSAGE_DEFAULT_FIELDS})`),
34
+ server.registerTool("ig_get_messages", {
35
+ description: "Get messages in a specific DM conversation.",
36
+ inputSchema: {
37
+ conversation_id: metaId.describe("Conversation ID"),
38
+ limit: z.number().optional().describe("Number of messages"),
39
+ after: z.string().optional().describe("Pagination cursor for next page"),
40
+ before: z.string().optional().describe("Pagination cursor for previous page"),
41
+ fields: z.string().optional().default(MESSAGE_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MESSAGE_DEFAULT_FIELDS})`),
42
+ },
43
+ annotations: READ_ONLY_TOOL,
43
44
  }, async ({ conversation_id, limit, after, before, fields }) => {
44
45
  try {
45
- const params = { fields };
46
- if (limit !== undefined)
47
- params.limit = limit;
48
- if (after)
49
- params.after = after;
50
- if (before)
51
- params.before = before;
46
+ const params = buildParams({ fields }, { limit, after, before });
52
47
  const { data, rateLimit } = await client.ig("GET", `/${conversation_id}/messages`, params);
53
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
48
+ return formatResponse(data, rateLimit);
54
49
  }
55
50
  catch (error) {
56
51
  return formatErrorResponse(error, "Get messages");
57
52
  }
58
53
  });
59
54
  // ─── ig_send_message ─────────────────────────────────────────
60
- server.tool("ig_send_message", "Send a DM to a user. Requires 'instagram_business_manage_messages' permission. Can only message users who have messaged you first (24hr window).", {
61
- recipient_id: z.string().describe("Instagram-scoped user ID of the recipient"),
62
- message: z.string().describe("Message text to send"),
63
- }, async ({ recipient_id, message }) => {
55
+ server.registerTool("ig_send_message", {
56
+ description: "Send a DM to a user. Requires 'instagram_business_manage_messages' permission. The recipient must have messaged the account first. Messaging window depends on messaging_type: RESPONSE/UPDATE allow replies within 24 hours of the user's last message; MESSAGE_TAG with tag=HUMAN_AGENT extends the window to 7 days (human-sent support replies only the HUMAN_AGENT feature requires App Review and forbids automated use, per https://developers.facebook.com/docs/features-reference/human-agent). Other tag values are Messenger-oriented; HUMAN_AGENT is the documented reliable choice on Instagram.",
57
+ inputSchema: {
58
+ recipient_id: z.string().describe("Instagram-scoped user ID of the recipient"),
59
+ message: z.string()
60
+ .min(1)
61
+ .refine((s) => textEncoder.encode(s).length <= 1000, {
62
+ message: "Message text must be 1000 UTF-8 bytes or less",
63
+ })
64
+ .describe("Message text to send (max 1000 UTF-8 bytes per Meta's Instagram Messaging API)"),
65
+ messaging_type: z
66
+ .enum(["RESPONSE", "UPDATE", "MESSAGE_TAG"])
67
+ .optional()
68
+ .default("RESPONSE")
69
+ .describe("Send API messaging classification. RESPONSE = reply within the 24-hour window (default). UPDATE = proactive update within the 24-hour window. MESSAGE_TAG = send outside the 24-hour window using one of the tag values below (Instagram reliably supports HUMAN_AGENT for the 7-day window). See https://developers.facebook.com/docs/messenger-platform/reference/send-api/."),
70
+ tag: z
71
+ .enum(["HUMAN_AGENT", "CONFIRMED_EVENT_UPDATE", "POST_PURCHASE_UPDATE", "ACCOUNT_UPDATE", "CUSTOMER_FEEDBACK"])
72
+ .optional()
73
+ .describe("Message tag, required when messaging_type=MESSAGE_TAG and forbidden otherwise. HUMAN_AGENT extends the window to 7 days for human-sent support replies and is the only tag with documented Instagram support; the remaining values are Messenger-oriented and may be silently rejected on Instagram."),
74
+ },
75
+ annotations: WRITE_TOOL,
76
+ }, async ({ recipient_id, message, messaging_type, tag }) => {
64
77
  try {
65
- const { data, rateLimit } = await client.ig("POST", `/${client.igUserId}/messages`, undefined, {
66
- jsonBody: {
67
- recipient: { id: recipient_id },
68
- message: { text: message },
69
- messaging_type: "RESPONSE",
70
- },
71
- });
72
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
78
+ if (messaging_type === "MESSAGE_TAG" && tag === undefined) {
79
+ return validationError("messaging_type=MESSAGE_TAG requires a tag (e.g., HUMAN_AGENT for the 7-day window).");
80
+ }
81
+ if (tag !== undefined && messaging_type !== "MESSAGE_TAG") {
82
+ return validationError("tag is only valid when messaging_type=MESSAGE_TAG. Omit tag or set messaging_type=MESSAGE_TAG.");
83
+ }
84
+ const jsonBody = {
85
+ recipient: { id: recipient_id },
86
+ message: { text: message },
87
+ messaging_type,
88
+ };
89
+ if (tag !== undefined)
90
+ jsonBody.tag = tag;
91
+ const { data, rateLimit } = await client.ig("POST", `/${client.igUserId}/messages`, undefined, { jsonBody });
92
+ return formatResponse(data, rateLimit);
73
93
  }
74
94
  catch (error) {
75
95
  return formatErrorResponse(error, "Send message");
76
96
  }
77
97
  });
78
98
  // ─── ig_get_message ──────────────────────────────────────────
79
- server.tool("ig_get_message", "Get details of a specific DM message.", {
80
- message_id: metaId.describe("Message ID"),
81
- fields: z.string().optional().default(MESSAGE_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MESSAGE_DEFAULT_FIELDS})`),
99
+ server.registerTool("ig_get_message", {
100
+ description: "Get details of a specific DM message.",
101
+ inputSchema: {
102
+ message_id: metaId.describe("Message ID"),
103
+ fields: z.string().optional().default(MESSAGE_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${MESSAGE_DEFAULT_FIELDS})`),
104
+ },
105
+ annotations: READ_ONLY_TOOL,
82
106
  }, async ({ message_id, fields }) => {
83
107
  try {
84
108
  const { data, rateLimit } = await client.ig("GET", `/${message_id}`, { fields });
85
- return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
109
+ return formatResponse(data, rateLimit);
86
110
  }
87
111
  catch (error) {
88
112
  return formatErrorResponse(error, "Get message");
@@ -1 +1 @@
1
- {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/tools/instagram/messaging.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/tools/instagram/messaging.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
3
  import { MetaClient } from "../../services/meta-client.js";
4
+ export declare const IG_PROFILE_CACHE_PREFIX = "ig:profile:";
5
+ export declare const igProfileCacheKey: (userId: string) => string;
4
6
  export declare const igBusinessDiscoveryUsernameSchema: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
5
7
  export declare function registerIgProfileTools(server: McpServer, client: MetaClient): void;
6
8
  //# sourceMappingURL=profile.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAc,MAAM,+BAA+B,CAAC;AAIvE,eAAO,MAAM,iCAAiC,wDAa3C,CAAC;AAIJ,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAoHlF"}
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAwB,MAAM,+BAA+B,CAAC;AAQjF,eAAO,MAAM,uBAAuB,gBAAgB,CAAC;AACrD,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,KAAG,MAA+C,CAAC;AAEnG,eAAO,MAAM,iCAAiC,wDAa3C,CAAC;AAIJ,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAiIlF"}