@exileum/meta-mcp 3.9.0 → 5.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 +19 -19
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +3 -2
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/instagram.js +2 -2
- package/dist/resources/instagram.js.map +1 -1
- package/dist/resources/threads.js +2 -2
- package/dist/resources/threads.js.map +1 -1
- package/dist/services/meta-client.d.ts +5 -1
- package/dist/services/meta-client.d.ts.map +1 -1
- package/dist/services/meta-client.js +49 -2
- package/dist/services/meta-client.js.map +1 -1
- package/dist/tools/instagram/comments.d.ts.map +1 -1
- package/dist/tools/instagram/comments.js +28 -21
- 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 +15 -8
- 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 +17 -12
- 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 +17 -13
- 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 +25 -16
- package/dist/tools/instagram/messaging.js.map +1 -1
- package/dist/tools/instagram/profile.d.ts +2 -0
- package/dist/tools/instagram/profile.d.ts.map +1 -1
- package/dist/tools/instagram/profile.js +39 -15
- package/dist/tools/instagram/profile.js.map +1 -1
- package/dist/tools/instagram/publishing.d.ts +2 -0
- package/dist/tools/instagram/publishing.d.ts.map +1 -1
- package/dist/tools/instagram/publishing.js +59 -25
- 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 +7 -6
- 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 +8 -8
- package/dist/tools/threads/insights.js.map +1 -1
- package/dist/tools/threads/media.d.ts +2 -0
- package/dist/tools/threads/media.d.ts.map +1 -1
- package/dist/tools/threads/media.js +18 -12
- 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 +2 -1
- 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 +4 -30
- package/dist/tools/threads/profile.js.map +1 -1
- package/dist/tools/threads/publishing.d.ts +1 -0
- package/dist/tools/threads/publishing.d.ts.map +1 -1
- package/dist/tools/threads/publishing.js +54 -33
- package/dist/tools/threads/publishing.js.map +1 -1
- package/dist/tools/threads/replies.d.ts +2 -0
- package/dist/tools/threads/replies.d.ts.map +1 -1
- package/dist/tools/threads/replies.js +19 -7
- package/dist/tools/threads/replies.js.map +1 -1
- package/dist/utils/container.js +1 -1
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +128 -0
- package/dist/utils/errors.js.map +1 -0
- package/package.json +5 -5
- package/dist/types.d.ts +0 -45
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -80,13 +80,14 @@ npm run build
|
|
|
80
80
|
|
|
81
81
|
## Features
|
|
82
82
|
|
|
83
|
-
- **
|
|
83
|
+
- **58 tools** across Instagram (33), Threads (19), and Meta platform (6)
|
|
84
84
|
- **Instagram**: Publish photos/videos/reels/stories/carousels with alt text, manage comments, view insights, search hashtags, handle DMs, manage collaboration invites
|
|
85
85
|
- **Threads**: Publish text/images/videos/carousels with polls, GIFs, topic tags, link attachments, alt text, spoiler flags; manage replies; search posts; delete posts; view insights
|
|
86
86
|
- **Meta**: Token exchange/refresh/debug, webhook management
|
|
87
87
|
- **2 resources**: Instagram profile, Threads profile
|
|
88
88
|
- **2 prompts**: Cross-platform content publishing, analytics report
|
|
89
89
|
- Rate limit tracking via `x-app-usage` header
|
|
90
|
+
- **Structured error responses** with `error_type` (`auth`, `validation`, `rate_limit`, `server`, `network`, `internal`), HTTP status, Meta API code/subcode/type, and a `remediation` hint where actionable — see [`CHANGELOG.md`](./CHANGELOG.md) for the JSON shape
|
|
90
91
|
|
|
91
92
|
## Tools
|
|
92
93
|
|
|
@@ -105,10 +106,10 @@ npm run build
|
|
|
105
106
|
|
|
106
107
|
| Tool | Description |
|
|
107
108
|
|------|-------------|
|
|
108
|
-
| `ig_publish_photo` | Publish a photo post (supports alt_text) |
|
|
109
|
-
| `ig_publish_video` |
|
|
110
|
-
| `ig_publish_carousel` | Publish a carousel/album (2-10 items, supports alt_text per item) |
|
|
111
|
-
| `ig_publish_reel` | Publish a Reel (supports
|
|
109
|
+
| `ig_publish_photo` | Publish a photo post (supports alt_text, collaborators) |
|
|
110
|
+
| `ig_publish_video` | **[DEPRECATED]** Use `ig_publish_reel` — publishes as a Reel (legacy VIDEO media_type retired by Meta Nov 9, 2023; supports collaborators) |
|
|
111
|
+
| `ig_publish_carousel` | Publish a carousel/album (2-10 items, supports alt_text per IMAGE item, collaborators) |
|
|
112
|
+
| `ig_publish_reel` | Publish a Reel (supports collaborators) |
|
|
112
113
|
| `ig_publish_story` | Publish a Story (24hr) |
|
|
113
114
|
| `ig_get_container_status` | Check media container processing status |
|
|
114
115
|
|
|
@@ -119,7 +120,7 @@ npm run build
|
|
|
119
120
|
| `ig_get_media_list` | List published media |
|
|
120
121
|
| `ig_get_media` | Get media details |
|
|
121
122
|
| `ig_delete_media` | Delete a media post (requires Facebook Login) |
|
|
122
|
-
| `ig_get_media_insights` | Get media analytics (views, reach
|
|
123
|
+
| `ig_get_media_insights` | Get media analytics (default views, reach — override `metric` per media type) |
|
|
123
124
|
| `ig_toggle_comments` | Enable/disable comments on a post |
|
|
124
125
|
|
|
125
126
|
### Instagram — Comments (7)
|
|
@@ -139,7 +140,7 @@ npm run build
|
|
|
139
140
|
| Tool | Description |
|
|
140
141
|
|------|-------------|
|
|
141
142
|
| `ig_get_profile` | Get account profile info |
|
|
142
|
-
| `ig_get_account_insights` | Get account-level analytics (views, reach, follower_count) |
|
|
143
|
+
| `ig_get_account_insights` | Get account-level analytics (views, reach, follower_count). Optional `metric_type` (`total_value` or `time_series`) controls aggregation shape |
|
|
143
144
|
| `ig_business_discovery` | Look up another business account |
|
|
144
145
|
| `ig_get_collaboration_invites` | Get pending collaboration invites |
|
|
145
146
|
| `ig_respond_collaboration_invite` | Accept or decline collaboration invites |
|
|
@@ -157,7 +158,7 @@ npm run build
|
|
|
157
158
|
|
|
158
159
|
| Tool | Description |
|
|
159
160
|
|------|-------------|
|
|
160
|
-
| `
|
|
161
|
+
| `ig_get_mentioned_comment` | Get details of a specific comment mentioning you (by comment_id from a mention webhook) |
|
|
161
162
|
| `ig_get_tagged_media` | Get media you're tagged in |
|
|
162
163
|
|
|
163
164
|
### Instagram — Messaging (4)
|
|
@@ -173,10 +174,10 @@ npm run build
|
|
|
173
174
|
|
|
174
175
|
| Tool | Description |
|
|
175
176
|
|------|-------------|
|
|
176
|
-
| `threads_publish_text` | Publish a text post in a single API call (`auto_publish_text=true`, default; set `auto_publish=false` for the legacy two-step flow). Supports polls, GIFs, link attachments, topic tags, quote posts, spoiler flag, cross-share to IG Stories, text attachments up to 10K chars with styling |
|
|
177
|
-
| `threads_publish_image` | Publish an image post (supports alt_text, topic tags, spoiler flag, cross-share to IG Stories) |
|
|
178
|
-
| `threads_publish_video` | Publish a video post (supports alt_text, topic tags, spoiler flag, cross-share to IG Stories) |
|
|
179
|
-
| `threads_publish_carousel` | Publish a carousel (2-20 items, supports alt_text per item, cross-share to IG Stories) |
|
|
177
|
+
| `threads_publish_text` | Publish a text post in a single API call (`auto_publish_text=true`, default; set `auto_publish=false` for the legacy two-step flow). Supports polls, GIFs, link attachments, topic tags, quote posts, spoiler flag, cross-share to IG Stories, geo-gating via `allowlisted_country_codes`, text attachments up to 10K chars with styling |
|
|
178
|
+
| `threads_publish_image` | Publish an image post (supports alt_text, topic tags, spoiler flag, cross-share to IG Stories, geo-gating via `allowlisted_country_codes`) |
|
|
179
|
+
| `threads_publish_video` | Publish a video post (supports alt_text, topic tags, spoiler flag, cross-share to IG Stories, geo-gating via `allowlisted_country_codes`) |
|
|
180
|
+
| `threads_publish_carousel` | Publish a carousel (2-20 items, supports alt_text per item, cross-share to IG Stories, geo-gating via `allowlisted_country_codes` on the parent container) |
|
|
180
181
|
| `threads_delete_post` | Delete a post (max 100/day) |
|
|
181
182
|
| `threads_get_container_status` | Check container processing status (unpublished containers only) |
|
|
182
183
|
| `threads_get_publishing_limit` | Check remaining publishing quota (250 posts/day) |
|
|
@@ -186,7 +187,7 @@ npm run build
|
|
|
186
187
|
|
|
187
188
|
| Tool | Description |
|
|
188
189
|
|------|-------------|
|
|
189
|
-
| `threads_get_posts` | List published posts (includes topic_tag, poll, GIF fields) |
|
|
190
|
+
| `threads_get_posts` | List published posts (includes topic_tag, poll, GIF fields; optional `fields` param to override the default field list) |
|
|
190
191
|
| `threads_get_post` | Get post details |
|
|
191
192
|
| `threads_search_posts` | Search public posts by keyword or tag (requires `threads_keyword_search` permission) |
|
|
192
193
|
|
|
@@ -205,26 +206,25 @@ npm run build
|
|
|
205
206
|
|------|-------------|
|
|
206
207
|
| `threads_get_mentions` | List posts where the user was @mentioned (requires `threads_manage_mentions`) |
|
|
207
208
|
|
|
208
|
-
### Threads — Profile (
|
|
209
|
+
### Threads — Profile (1)
|
|
209
210
|
|
|
210
211
|
| Tool | Description |
|
|
211
212
|
|------|-------------|
|
|
212
|
-
| `threads_get_profile` | Get Threads profile info (includes is_verified) |
|
|
213
|
-
| `threads_get_user_threads` | List user's threads |
|
|
213
|
+
| `threads_get_profile` | Get Threads profile info (includes `is_verified` and `is_eligible_for_geo_gating`) |
|
|
214
214
|
|
|
215
215
|
### Threads — Insights (2)
|
|
216
216
|
|
|
217
217
|
| Tool | Description |
|
|
218
218
|
|------|-------------|
|
|
219
|
-
| `threads_get_post_insights` | Get post analytics (views, likes, replies, reposts, quotes) |
|
|
219
|
+
| `threads_get_post_insights` | Get post analytics (views, likes, replies, reposts, quotes, shares) |
|
|
220
220
|
| `threads_get_user_insights` | Get account-level analytics (period: day/lifetime; `since`/`until` required for `day`) |
|
|
221
221
|
|
|
222
222
|
## Resources
|
|
223
223
|
|
|
224
224
|
| Resource URI | Description |
|
|
225
225
|
|-------------|-------------|
|
|
226
|
-
| `instagram
|
|
227
|
-
| `threads
|
|
226
|
+
| `meta-mcp://instagram/profile` | Instagram account profile data |
|
|
227
|
+
| `meta-mcp://threads/profile` | Threads account profile data (includes is_verified) |
|
|
228
228
|
|
|
229
229
|
## Prompts
|
|
230
230
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QAuEhD"}
|
package/dist/prompts/index.js
CHANGED
|
@@ -10,7 +10,7 @@ export function registerPrompts(server) {
|
|
|
10
10
|
"",
|
|
11
11
|
"Please follow these steps:",
|
|
12
12
|
"1. Ask me what content I want to post (text, image URL, video URL)",
|
|
13
|
-
"2. Use ig_publish_photo or
|
|
13
|
+
"2. Use ig_publish_photo or ig_publish_reel to post on Instagram",
|
|
14
14
|
"3. Use threads_publish_text, threads_publish_image, or threads_publish_video to post on Threads",
|
|
15
15
|
"4. Report back the permalink for each platform",
|
|
16
16
|
"",
|
|
@@ -19,7 +19,8 @@ export function registerPrompts(server) {
|
|
|
19
19
|
"- Threads posts are limited to 500 characters",
|
|
20
20
|
"- Both platforms require publicly accessible HTTPS URLs for media",
|
|
21
21
|
"- Video uploads may take time to process",
|
|
22
|
-
"- You can add alt_text for accessibility on
|
|
22
|
+
"- You can add alt_text for accessibility on Instagram photo posts and Threads media; Reels, Stories, and IG videos do not support it",
|
|
23
|
+
"- On Instagram, ig_publish_photo / ig_publish_reel / ig_publish_carousel (and the deprecated ig_publish_video) accept an optional `collaborators` array of up to 3 usernames to invite collaborators on the post; Stories do not support collaborators",
|
|
23
24
|
"- On Threads, you can add a topic_tag, poll, or GIF attachment",
|
|
24
25
|
"- On Threads, you can set reply_control (everyone, accounts_you_follow, mentioned_only, parent_post_author_only, followers_only)",
|
|
25
26
|
].join("\n"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,4DAA4D,EAC5D,EAAE,EACF,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;wBACJ,uDAAuD;wBACvD,EAAE;wBACF,4BAA4B;wBAC5B,oEAAoE;wBACpE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,MAAM,CACX,iBAAiB,EACjB,4DAA4D,EAC5D,EAAE,EACF,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;wBACJ,uDAAuD;wBACvD,EAAE;wBACF,4BAA4B;wBAC5B,oEAAoE;wBACpE,iEAAiE;wBACjE,iGAAiG;wBACjG,gDAAgD;wBAChD,EAAE;wBACF,OAAO;wBACP,mDAAmD;wBACnD,+CAA+C;wBAC/C,mEAAmE;wBACnE,0CAA0C;wBAC1C,sIAAsI;wBACtI,wPAAwP;wBACxP,gEAAgE;wBAChE,kIAAkI;qBACnI,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF;KACF,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,kBAAkB,EAClB,gEAAgE,EAChE,EAAE,EACF,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAe;gBACrB,OAAO,EAAE;oBACP,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE;wBACJ,kFAAkF;wBAClF,EAAE;wBACF,iCAAiC;wBACjC,0EAA0E;wBAC1E,2HAA2H;wBAC3H,kEAAkE;wBAClE,mDAAmD;wBACnD,sHAAsH;wBACtH,oDAAoD;wBACpD,EAAE;wBACF,iCAAiC;wBACjC,oCAAoC;wBACpC,2CAA2C;wBAC3C,wDAAwD;wBACxD,wCAAwC;wBACxC,EAAE;wBACF,mFAAmF;wBACnF,kCAAkC;qBACnC,CAAC,IAAI,CAAC,IAAI,CAAC;iBACb;aACF;SACF;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export function registerInstagramResources(server, client) {
|
|
2
|
-
server.resource("instagram-profile", "instagram
|
|
2
|
+
server.resource("instagram-profile", "meta-mcp://instagram/profile", { description: "Instagram Business/Creator account profile information", mimeType: "application/json" }, async () => {
|
|
3
3
|
const { data } = await client.ig("GET", `/${client.igUserId}`, {
|
|
4
4
|
fields: "id,name,username,biography,followers_count,follows_count,media_count,profile_picture_url,website",
|
|
5
5
|
});
|
|
6
6
|
return {
|
|
7
7
|
contents: [
|
|
8
8
|
{
|
|
9
|
-
uri: "instagram
|
|
9
|
+
uri: "meta-mcp://instagram/profile",
|
|
10
10
|
mimeType: "application/json",
|
|
11
11
|
text: JSON.stringify(data, null, 2),
|
|
12
12
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/resources/instagram.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAkB;IAC9E,MAAM,CAAC,QAAQ,CACb,mBAAmB,EACnB,
|
|
1
|
+
{"version":3,"file":"instagram.js","sourceRoot":"","sources":["../../src/resources/instagram.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,0BAA0B,CAAC,MAAiB,EAAE,MAAkB;IAC9E,MAAM,CAAC,QAAQ,CACb,mBAAmB,EACnB,8BAA8B,EAC9B,EAAE,WAAW,EAAE,wDAAwD,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACvG,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE;YAC7D,MAAM,EAAE,kGAAkG;SAC3G,CAAC,CAAC;QACH,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,8BAA8B;oBACnC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export function registerThreadsResources(server, client) {
|
|
2
|
-
server.resource("threads-profile", "threads
|
|
2
|
+
server.resource("threads-profile", "meta-mcp://threads/profile", { description: "Threads user profile information", mimeType: "application/json" }, async () => {
|
|
3
3
|
const { data } = await client.threads("GET", `/${client.threadsUserId}`, {
|
|
4
4
|
fields: "id,username,name,threads_profile_picture_url,threads_biography,is_verified",
|
|
5
5
|
});
|
|
6
6
|
return {
|
|
7
7
|
contents: [
|
|
8
8
|
{
|
|
9
|
-
uri: "threads
|
|
9
|
+
uri: "meta-mcp://threads/profile",
|
|
10
10
|
mimeType: "application/json",
|
|
11
11
|
text: JSON.stringify(data, null, 2),
|
|
12
12
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/resources/threads.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAkB;IAC5E,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"threads.js","sourceRoot":"","sources":["../../src/resources/threads.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAkB;IAC5E,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,4BAA4B,EAC5B,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EACjF,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,aAAa,EAAE,EAAE;YACvE,MAAM,EAAE,4EAA4E;SACrF,CAAC,CAAC;QACH,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,4BAA4B;oBACjC,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { MetaConfig } from "../config.js";
|
|
2
|
-
|
|
2
|
+
export interface RateLimit {
|
|
3
|
+
callCount?: number;
|
|
4
|
+
totalCpuTime?: number;
|
|
5
|
+
totalTime?: number;
|
|
6
|
+
}
|
|
3
7
|
export interface ClientResponse {
|
|
4
8
|
data: Record<string, unknown>;
|
|
5
9
|
rateLimit?: RateLimit;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-client.d.ts","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"meta-client.d.ts","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA4BD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B,OAAO,CAAC,cAAc;YAeR,OAAO;IAyFf,EAAE,CACN,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC;IAOpB,OAAO,CACX,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC;IAOpB,IAAI,CACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,cAAc,CAAC;IAQ1B,0EAA0E;IACpE,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUlE,sFAAsF;IAChF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMhE,wEAAwE;IAClE,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAUvE,oFAAoF;IAC9E,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAMrE,oBAAoB;IACd,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAU7D,IAAI,QAAQ,IAAI,MAAM,CAKrB;IAED,IAAI,aAAa,IAAI,MAAM,CAK1B;CACF"}
|
|
@@ -1,9 +1,30 @@
|
|
|
1
|
+
import { MetaApiError } from "../utils/errors.js";
|
|
1
2
|
const IG_BASE = "https://graph.instagram.com/v25.0";
|
|
2
3
|
const FB_BASE = "https://graph.facebook.com/v25.0";
|
|
3
4
|
const THREADS_BASE = "https://graph.threads.net/v1.0";
|
|
4
5
|
// Unversioned bases for OAuth token endpoints
|
|
5
6
|
const IG_TOKEN_BASE = "https://graph.instagram.com";
|
|
6
7
|
const THREADS_TOKEN_BASE = "https://graph.threads.net";
|
|
8
|
+
function parseMetaErrorBody(text) {
|
|
9
|
+
if (!text)
|
|
10
|
+
return undefined;
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(text);
|
|
13
|
+
const err = parsed.error;
|
|
14
|
+
if (!err)
|
|
15
|
+
return undefined;
|
|
16
|
+
return {
|
|
17
|
+
message: typeof err.message === "string" ? err.message : undefined,
|
|
18
|
+
code: typeof err.code === "number" ? err.code : undefined,
|
|
19
|
+
subcode: typeof err.error_subcode === "number" ? err.error_subcode : undefined,
|
|
20
|
+
type: typeof err.type === "string" ? err.type : undefined,
|
|
21
|
+
fbtraceId: typeof err.fbtrace_id === "string" ? err.fbtrace_id : undefined,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
7
28
|
export class MetaClient {
|
|
8
29
|
config;
|
|
9
30
|
constructor(config) {
|
|
@@ -61,7 +82,19 @@ export class MetaClient {
|
|
|
61
82
|
const res = await fetch(url, init);
|
|
62
83
|
if (!res.ok) {
|
|
63
84
|
const text = await res.text().catch(() => "");
|
|
64
|
-
|
|
85
|
+
const parsed = parseMetaErrorBody(text);
|
|
86
|
+
const detail = parsed?.message ?? text;
|
|
87
|
+
throw new MetaApiError({
|
|
88
|
+
message: `Meta API ${method} ${path} (${res.status}): ${detail}`,
|
|
89
|
+
httpStatus: res.status,
|
|
90
|
+
apiCode: parsed?.code,
|
|
91
|
+
apiSubcode: parsed?.subcode,
|
|
92
|
+
apiType: parsed?.type,
|
|
93
|
+
fbtraceId: parsed?.fbtraceId,
|
|
94
|
+
endpoint: path,
|
|
95
|
+
method,
|
|
96
|
+
body: text,
|
|
97
|
+
});
|
|
65
98
|
}
|
|
66
99
|
const rateLimit = this.parseRateLimit(res.headers);
|
|
67
100
|
const contentType = res.headers.get("content-type") || "";
|
|
@@ -69,7 +102,21 @@ export class MetaClient {
|
|
|
69
102
|
const data = (await res.json());
|
|
70
103
|
if (data.error) {
|
|
71
104
|
const err = data.error;
|
|
72
|
-
|
|
105
|
+
const apiCode = typeof err.code === "number" ? err.code : undefined;
|
|
106
|
+
const apiSubcode = typeof err.error_subcode === "number" ? err.error_subcode : undefined;
|
|
107
|
+
const apiType = typeof err.type === "string" ? err.type : undefined;
|
|
108
|
+
const apiMessage = typeof err.message === "string" ? err.message : String(err.message ?? "");
|
|
109
|
+
const fbtraceId = typeof err.fbtrace_id === "string" ? err.fbtrace_id : undefined;
|
|
110
|
+
throw new MetaApiError({
|
|
111
|
+
message: `Meta API error: ${apiMessage} (code ${apiCode ?? "?"})`,
|
|
112
|
+
apiCode,
|
|
113
|
+
apiSubcode,
|
|
114
|
+
apiType,
|
|
115
|
+
fbtraceId,
|
|
116
|
+
endpoint: path,
|
|
117
|
+
method,
|
|
118
|
+
body: JSON.stringify(err),
|
|
119
|
+
});
|
|
73
120
|
}
|
|
74
121
|
return { data, rateLimit };
|
|
75
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meta-client.js","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meta-client.js","sourceRoot":"","sources":["../../src/services/meta-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,EAAE,MAAM,+BAA+B,CAAC;
|
|
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;AAO3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA2IlF"}
|
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { formatErrorResponse } from "../../utils/errors.js";
|
|
3
|
+
const GET_COMMENTS_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,replies{id,text,username,timestamp}";
|
|
4
|
+
const GET_COMMENT_DEFAULT_FIELDS = "id,text,username,timestamp,like_count,parent_id,media";
|
|
5
|
+
const GET_REPLIES_DEFAULT_FIELDS = "id,text,username,timestamp,like_count";
|
|
2
6
|
export function registerIgCommentTools(server, client) {
|
|
3
7
|
// ─── ig_get_comments ─────────────────────────────────────────
|
|
4
8
|
server.tool("ig_get_comments", "Get comments on a specific Instagram media post.", {
|
|
5
9
|
media_id: z.string().describe("Media ID"),
|
|
6
10
|
limit: z.number().optional().describe("Number of comments to return"),
|
|
7
|
-
after: z.string().optional().describe("Pagination cursor"),
|
|
8
|
-
|
|
11
|
+
after: z.string().optional().describe("Pagination cursor for next page"),
|
|
12
|
+
before: z.string().optional().describe("Pagination cursor for previous page"),
|
|
13
|
+
fields: z.string().optional().default(GET_COMMENTS_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENTS_DEFAULT_FIELDS})`),
|
|
14
|
+
}, async ({ media_id, limit, after, before, fields }) => {
|
|
9
15
|
try {
|
|
10
|
-
const params = {
|
|
11
|
-
fields: "id,text,username,timestamp,like_count,replies{id,text,username,timestamp}",
|
|
12
|
-
};
|
|
16
|
+
const params = { fields };
|
|
13
17
|
if (limit !== undefined)
|
|
14
18
|
params.limit = limit;
|
|
15
19
|
if (after)
|
|
16
20
|
params.after = after;
|
|
21
|
+
if (before)
|
|
22
|
+
params.before = before;
|
|
17
23
|
const { data, rateLimit } = await client.ig("GET", `/${media_id}/comments`, params);
|
|
18
24
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
19
25
|
}
|
|
20
26
|
catch (error) {
|
|
21
|
-
return
|
|
27
|
+
return formatErrorResponse(error, "Get comments");
|
|
22
28
|
}
|
|
23
29
|
});
|
|
24
30
|
// ─── ig_get_comment ──────────────────────────────────────────
|
|
25
31
|
server.tool("ig_get_comment", "Get details of a specific comment.", {
|
|
26
32
|
comment_id: z.string().describe("Comment ID"),
|
|
27
|
-
|
|
33
|
+
fields: z.string().optional().default(GET_COMMENT_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_COMMENT_DEFAULT_FIELDS})`),
|
|
34
|
+
}, async ({ comment_id, fields }) => {
|
|
28
35
|
try {
|
|
29
|
-
const { data, rateLimit } = await client.ig("GET", `/${comment_id}`, {
|
|
30
|
-
fields: "id,text,username,timestamp,like_count,parent_id,media",
|
|
31
|
-
});
|
|
36
|
+
const { data, rateLimit } = await client.ig("GET", `/${comment_id}`, { fields });
|
|
32
37
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
33
38
|
}
|
|
34
39
|
catch (error) {
|
|
35
|
-
return
|
|
40
|
+
return formatErrorResponse(error, "Get comment");
|
|
36
41
|
}
|
|
37
42
|
});
|
|
38
43
|
// ─── ig_post_comment ─────────────────────────────────────────
|
|
@@ -45,28 +50,30 @@ export function registerIgCommentTools(server, client) {
|
|
|
45
50
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
46
51
|
}
|
|
47
52
|
catch (error) {
|
|
48
|
-
return
|
|
53
|
+
return formatErrorResponse(error, "Post comment");
|
|
49
54
|
}
|
|
50
55
|
});
|
|
51
56
|
// ─── ig_get_replies ──────────────────────────────────────────
|
|
52
57
|
server.tool("ig_get_replies", "Get replies to a specific comment.", {
|
|
53
58
|
comment_id: z.string().describe("Comment ID to get replies for"),
|
|
54
59
|
limit: z.number().optional().describe("Number of replies to return"),
|
|
55
|
-
after: z.string().optional().describe("Pagination cursor"),
|
|
56
|
-
|
|
60
|
+
after: z.string().optional().describe("Pagination cursor for next page"),
|
|
61
|
+
before: z.string().optional().describe("Pagination cursor for previous page"),
|
|
62
|
+
fields: z.string().optional().default(GET_REPLIES_DEFAULT_FIELDS).describe(`Comma-separated fields (default: ${GET_REPLIES_DEFAULT_FIELDS})`),
|
|
63
|
+
}, async ({ comment_id, limit, after, before, fields }) => {
|
|
57
64
|
try {
|
|
58
|
-
const params = {
|
|
59
|
-
fields: "id,text,username,timestamp,like_count",
|
|
60
|
-
};
|
|
65
|
+
const params = { fields };
|
|
61
66
|
if (limit !== undefined)
|
|
62
67
|
params.limit = limit;
|
|
63
68
|
if (after)
|
|
64
69
|
params.after = after;
|
|
70
|
+
if (before)
|
|
71
|
+
params.before = before;
|
|
65
72
|
const { data, rateLimit } = await client.ig("GET", `/${comment_id}/replies`, params);
|
|
66
73
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
67
74
|
}
|
|
68
75
|
catch (error) {
|
|
69
|
-
return
|
|
76
|
+
return formatErrorResponse(error, "Get replies");
|
|
70
77
|
}
|
|
71
78
|
});
|
|
72
79
|
// ─── ig_reply_to_comment ─────────────────────────────────────
|
|
@@ -79,7 +86,7 @@ export function registerIgCommentTools(server, client) {
|
|
|
79
86
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
80
87
|
}
|
|
81
88
|
catch (error) {
|
|
82
|
-
return
|
|
89
|
+
return formatErrorResponse(error, "Reply");
|
|
83
90
|
}
|
|
84
91
|
});
|
|
85
92
|
// ─── ig_hide_comment ─────────────────────────────────────────
|
|
@@ -92,7 +99,7 @@ export function registerIgCommentTools(server, client) {
|
|
|
92
99
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, hidden: hide, ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
93
100
|
}
|
|
94
101
|
catch (error) {
|
|
95
|
-
return
|
|
102
|
+
return formatErrorResponse(error, "Hide comment");
|
|
96
103
|
}
|
|
97
104
|
});
|
|
98
105
|
// ─── ig_delete_comment ───────────────────────────────────────
|
|
@@ -104,7 +111,7 @@ export function registerIgCommentTools(server, client) {
|
|
|
104
111
|
return { content: [{ type: "text", text: JSON.stringify({ success: true, ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
105
112
|
}
|
|
106
113
|
catch (error) {
|
|
107
|
-
return
|
|
114
|
+
return formatErrorResponse(error, "Delete comment");
|
|
108
115
|
}
|
|
109
116
|
});
|
|
110
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/tools/instagram/comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"comments.js","sourceRoot":"","sources":["../../../src/tools/instagram/comments.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"hashtags.d.ts","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAG3D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA6FlF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { formatErrorResponse } from "../../utils/errors.js";
|
|
2
3
|
export function registerIgHashtagTools(server, client) {
|
|
3
4
|
// ─── ig_search_hashtag ───────────────────────────────────────
|
|
4
5
|
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.", {
|
|
@@ -12,7 +13,7 @@ export function registerIgHashtagTools(server, client) {
|
|
|
12
13
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
13
14
|
}
|
|
14
15
|
catch (error) {
|
|
15
|
-
return
|
|
16
|
+
return formatErrorResponse(error, "Hashtag search");
|
|
16
17
|
}
|
|
17
18
|
});
|
|
18
19
|
// ─── ig_get_hashtag ──────────────────────────────────────────
|
|
@@ -26,15 +27,16 @@ export function registerIgHashtagTools(server, client) {
|
|
|
26
27
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
27
28
|
}
|
|
28
29
|
catch (error) {
|
|
29
|
-
return
|
|
30
|
+
return formatErrorResponse(error, "Get hashtag");
|
|
30
31
|
}
|
|
31
32
|
});
|
|
32
33
|
// ─── ig_get_hashtag_recent ───────────────────────────────────
|
|
33
34
|
server.tool("ig_get_hashtag_recent", "Get recent media tagged with a specific hashtag.", {
|
|
34
35
|
hashtag_id: z.string().describe("Hashtag ID"),
|
|
35
36
|
limit: z.number().optional().describe("Number of results"),
|
|
36
|
-
after: z.string().optional().describe("Pagination cursor"),
|
|
37
|
-
|
|
37
|
+
after: z.string().optional().describe("Pagination cursor for next page"),
|
|
38
|
+
before: z.string().optional().describe("Pagination cursor for previous page"),
|
|
39
|
+
}, async ({ hashtag_id, limit, after, before }) => {
|
|
38
40
|
try {
|
|
39
41
|
const params = {
|
|
40
42
|
user_id: client.igUserId,
|
|
@@ -44,19 +46,22 @@ export function registerIgHashtagTools(server, client) {
|
|
|
44
46
|
params.limit = limit;
|
|
45
47
|
if (after)
|
|
46
48
|
params.after = after;
|
|
49
|
+
if (before)
|
|
50
|
+
params.before = before;
|
|
47
51
|
const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/recent_media`, params);
|
|
48
52
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
49
53
|
}
|
|
50
54
|
catch (error) {
|
|
51
|
-
return
|
|
55
|
+
return formatErrorResponse(error, "Get hashtag recent");
|
|
52
56
|
}
|
|
53
57
|
});
|
|
54
58
|
// ─── ig_get_hashtag_top ──────────────────────────────────────
|
|
55
59
|
server.tool("ig_get_hashtag_top", "Get top (most popular) media tagged with a specific hashtag.", {
|
|
56
60
|
hashtag_id: z.string().describe("Hashtag ID"),
|
|
57
61
|
limit: z.number().optional().describe("Number of results"),
|
|
58
|
-
after: z.string().optional().describe("Pagination cursor"),
|
|
59
|
-
|
|
62
|
+
after: z.string().optional().describe("Pagination cursor for next page"),
|
|
63
|
+
before: z.string().optional().describe("Pagination cursor for previous page"),
|
|
64
|
+
}, async ({ hashtag_id, limit, after, before }) => {
|
|
60
65
|
try {
|
|
61
66
|
const params = {
|
|
62
67
|
user_id: client.igUserId,
|
|
@@ -66,11 +71,13 @@ export function registerIgHashtagTools(server, client) {
|
|
|
66
71
|
params.limit = limit;
|
|
67
72
|
if (after)
|
|
68
73
|
params.after = after;
|
|
74
|
+
if (before)
|
|
75
|
+
params.before = before;
|
|
69
76
|
const { data, rateLimit } = await client.ig("GET", `/${hashtag_id}/top_media`, params);
|
|
70
77
|
return { content: [{ type: "text", text: JSON.stringify({ ...data, _rateLimit: rateLimit }, null, 2) }] };
|
|
71
78
|
}
|
|
72
79
|
catch (error) {
|
|
73
|
-
return
|
|
80
|
+
return formatErrorResponse(error, "Get hashtag top");
|
|
74
81
|
}
|
|
75
82
|
});
|
|
76
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashtags.js","sourceRoot":"","sources":["../../../src/tools/instagram/hashtags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
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,EAAE,MAAM,+BAA+B,CAAC;
|
|
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;AAM3D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAsGhF"}
|