ig_publish_photo
Publish photos to Instagram using a two-step container creation and publishing process. Requires a publicly accessible HTTPS image URL and supports captions, location tags, user tags, and alt text.
Instructions
Publish a photo to Instagram. Two-step process: creates container then publishes. Requires image_url (publicly accessible HTTPS URL).
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| image_url | Yes | Public HTTPS URL of the image (JPEG only) | |
| caption | No | Post caption (max 2200 chars) | |
| location_id | No | Facebook Page location ID | |
| user_tags | No | JSON array of user tags: [{username, x, y}] | |
| alt_text | No | Alt text for accessibility |
Implementation Reference
- src/tools/instagram/publishing.ts:31-49 (handler)Handler function for the ig_publish_photo tool.
async ({ image_url, caption, location_id, user_tags, alt_text }) => { try { const params: Record<string, unknown> = { image_url }; if (caption) params.caption = caption; if (location_id) params.location_id = location_id; if (user_tags) params.user_tags = user_tags; if (alt_text) params.alt_text = alt_text; // Step 1: Create container const { data: container } = await client.ig("POST", `/${client.igUserId}/media`, params); const containerId = (container as { id: string }).id; // Step 2: Publish const { data, rateLimit } = await client.ig("POST", `/${client.igUserId}/media_publish`, { creation_id: containerId, }); return { content: [{ type: "text", text: JSON.stringify({ ...data as object, _rateLimit: rateLimit }, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Publish photo failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } } - Input schema definition for ig_publish_photo.
{ image_url: z.string().url().describe("Public HTTPS URL of the image (JPEG only)"), caption: z.string().optional().describe("Post caption (max 2200 chars)"), location_id: z.string().optional().describe("Facebook Page location ID"), user_tags: z.string().optional().describe("JSON array of user tags: [{username, x, y}]"), alt_text: z.string().optional().describe("Alt text for accessibility"), }, - src/tools/instagram/publishing.ts:21-50 (registration)Registration of the ig_publish_photo tool.
server.tool( "ig_publish_photo", "Publish a photo to Instagram. Two-step process: creates container then publishes. Requires image_url (publicly accessible HTTPS URL).", { image_url: z.string().url().describe("Public HTTPS URL of the image (JPEG only)"), caption: z.string().optional().describe("Post caption (max 2200 chars)"), location_id: z.string().optional().describe("Facebook Page location ID"), user_tags: z.string().optional().describe("JSON array of user tags: [{username, x, y}]"), alt_text: z.string().optional().describe("Alt text for accessibility"), }, async ({ image_url, caption, location_id, user_tags, alt_text }) => { try { const params: Record<string, unknown> = { image_url }; if (caption) params.caption = caption; if (location_id) params.location_id = location_id; if (user_tags) params.user_tags = user_tags; if (alt_text) params.alt_text = alt_text; // Step 1: Create container const { data: container } = await client.ig("POST", `/${client.igUserId}/media`, params); const containerId = (container as { id: string }).id; // Step 2: Publish const { data, rateLimit } = await client.ig("POST", `/${client.igUserId}/media_publish`, { creation_id: containerId, }); return { content: [{ type: "text", text: JSON.stringify({ ...data as object, _rateLimit: rateLimit }, null, 2) }] }; } catch (error) { return { content: [{ type: "text", text: `Publish photo failed: ${error instanceof Error ? error.message : String(error)}` }], isError: true }; } } );