Skip to main content
Glama

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
NameRequiredDescriptionDefault
image_urlYesPublic HTTPS URL of the image (JPEG only)
captionNoPost caption (max 2200 chars)
location_idNoFacebook Page location ID
user_tagsNoJSON array of user tags: [{username, x, y}]
alt_textNoAlt text for accessibility

Implementation Reference

  • 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"),
    },
  • 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 };
        }
      }
    );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mikusnuz/meta-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server