Skip to main content
Glama
facebook-mcp

facebook-mcp

by IvanBBaev

Create Post

facebook_create_post

Create Facebook Page posts with text, links, photo or multi-link carousels, then publish, schedule, or save as a draft. Run a dry-run preview first, then set apply:true to perform the write.

Instructions

Create a Page post: plain text, a link, a multi-link card carousel, or a multi-photo carousel. Publishes now, keeps it as a draft (published:false), or schedules it (scheduled_publish_time). Dry run by default — repeat the call with apply:true to actually publish.

Input Schema

NameRequiredDescriptionDefault
linkNoA URL to attach. Facebook renders its own preview from the URL's Open Graph tags — the title/image cannot be overridden here. Cannot be combined with photos.
applyNoSet true to actually perform the write. Omitted or false ⇒ the server decides from its configured write mode: usually a dry run that returns a plan preview and changes nothing, but a server (or package) configured apply-first performs the write. To be certain nothing happens, read the result: a dry run always reports the plan and says the write was NOT performed.
photosNoPhoto sources for a photo post: each is an https:// URL Meta fetches itself, or a local file path inside FB_MEDIA_DIR — either as a plain string or as {source, alt_text}. Uploaded sequentially as UNPUBLISHED children, then attached to one feed post. Cannot be combined with link or child_attachments.
messageNoThe post text (up to 63206 characters). Unicode and emoji pass through byte-for-byte; no escaping is applied. At least one of message, link or photos is required.
plan_idNoThe `planId` returned by a preceding dry-run preview of this same tool. Required for irreversible and spend-tier writes; plans expire a few minutes after they are created.
profileNoPage profile key (e.g. "brand-a") or a raw Page ID. Omitted ⇒ the default Page (FB_PAGE_ID).
publishedNofalse ⇒ create the post UNPUBLISHED (a draft that stays invisible until facebook_update_post action:"publish_now"). Omitted or true ⇒ publish immediately. Must be omitted when scheduled_publish_time is set.
targetingNoWho sees the post in Feed: geo_locations and/or age_min. Narrows distribution only — the post stays publicly reachable by link and on the Page.
page_timezoneNoIANA timezone name of the Page (e.g. "Europe/Sofia"), used only to echo a scheduled instant in Page-local time next to UTC. Omitted ⇒ the server reads the Page's own timezone; if that read fails the echo is UTC-only.
child_attachmentsNoCards of a multi-LINK carousel (a different post type from photos): between 2 and 5 entries, and the parent `link` must be set as well.
scheduled_publish_timeNoWhen to publish, as an ISO-8601 instant WITH an explicit offset — "2026-08-01T09:30:00+03:00" or "2026-08-01T06:30:00Z". A bare local time ("2026-08-01T09:30:00") and a raw epoch number are both REFUSED, because they have no unambiguous meaning. Must be at least 10 minutes and at most 75 days ahead. Setting this creates the post unpublished; do NOT also pass published:true.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changedv0.8.0
    • changedInput schema / properties / photos / description
      Previous value: -"Photo sources for a photo post: each is an https:// URL Meta fetches itself, or a local file path inside FB_MEDIA_DIR. Uploaded sequentially as UNPUBLISHED children, then attached to one feed post. Cannot be combined with link or child_attachments."New value: +"Photo sources for a photo post: each is an https:// URL Meta fetches itself, or a local file path inside FB_MEDIA_DIR — either as a plain string or as {source, alt_text}. Uploaded sequentially as UNPUBLISHED children, then attached to one feed post. Cannot be combined with link or child_attachments."
    • addedInput schema / properties / photos / items / anyOf
      Added value: +[
      +  {
      +    "minLength": 1,
      +    "type": "string"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "alt_text": {
      +        "description": "Alt text for screen readers, up to 1000 characters. Omitted ⇒ no custom alt text is sent.",
      +        "maxLength": 1000,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "source": {
      +        "description": "The photo source, as in the string form.",
      +        "minLength": 1,
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "source"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / photos / items / minLength
      Removed value: -1
    • removedInput schema / properties / photos / items / type
      Removed value: -"string"
    • changedInput schema / properties / scheduled_publish_time / description
      Previous value: -"When to publish, as an ISO-8601 instant WITH an explicit offset — \"2026-08-01T09:30:00+03:00\" or \"2026-08-01T06:30:00Z\". A bare local time (\"2026-08-01T09:30:00\") and a raw epoch number are both REFUSED, because they have no unambiguous meaning. Must be more than 10 minutes and at most 75 days ahead. Setting this creates the post unpublished; do NOT also pass published:true."New value: +"When to publish, as an ISO-8601 instant WITH an explicit offset — \"2026-08-01T09:30:00+03:00\" or \"2026-08-01T06:30:00Z\". A bare local time (\"2026-08-01T09:30:00\") and a raw epoch number are both REFUSED, because they have no unambiguous meaning. Must be at least 10 minutes and at most 75 days ahead. Setting this creates the post unpublished; do NOT also pass published:true."
    • addedInput schema / properties / targeting
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Who sees the post in Feed: geo_locations and/or age_min. Narrows distribution only — the post stays publicly reachable by link and on the Page.",
      +  "properties": {
      +    "age_min": {
      +      "anyOf": [
      +        {
      +          "const": 13,
      +          "type": "number"
      +        },
      +        {
      +          "const": 15,
      +          "type": "number"
      +        },
      +        {
      +          "const": 18,
      +          "type": "number"
      +        },
      +        {
      +          "const": 21,
      +          "type": "number"
      +        },
      +        {
      +          "const": 25,
      +          "type": "number"
      +        }
      +      ],
      +      "description": "Minimum viewer age: 13, 15, 18, 21 or 25."
      +    },
      +    "geo_locations": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "cities": {
      +          "description": "City location ids as [{key:\"...\"}], from Ads Manager targeting search.",
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "key": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "key"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 250,
      +          "type": "array"
      +        },
      +        "countries": {
      +          "description": "Uppercase ISO country codes, e.g. [\"BG\",\"RO\"].",
      +          "items": {
      +            "pattern": "^[A-Z]{2}$",
      +            "type": "string"
      +          },
      +          "maxItems": 25,
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "regions": {
      +          "description": "Region location ids as [{key:\"...\"}], from Ads Manager targeting search.",
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "key": {
      +                "pattern": "^\\d+$",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "key"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 200,
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observedv0.7.0

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic write profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds a genuinely non-obvious trait: the call is a dry run by default and only performs the write on a repeat with apply:true. That is important behavioral context an agent cannot infer from annotations. It does not warn that repeated non-idempotent calls can create duplicate posts, which is the one annotation-implied trait left unexplained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, and the content types and publishing modes are front-loaded before the dry-run caveat. Every clause carries information an agent needs to choose a mode.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter creation tool with nested targeting and attachments but no output schema, the description covers the modes an agent must pick between and the dry-run/apply contract. The plan_id and apply interplay is pushed to the schema rather than the description, which is acceptable given 100% coverage but leaves the flow slightly fragmented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents every parameter, including apply, published, scheduled_publish_time and plan_id. The description only name-drops published:false and scheduled_publish_time as the scheduling knobs without adding format or constraint detail beyond the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Create) and resource (a Page post) and enumerates the content modes it supports: text, link, multi-link carousel, multi-photo carousel. That distinguishes it from most siblings, but it never names facebook_create_photo_post, which overlaps with the photos path, so the boundary is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies the practical selection guidance an agent needs for this tool: publish now, keep as draft via published:false, or schedule via scheduled_publish_time, plus the dry-run-then-apply:true workflow. It stops short of saying when to prefer a sibling such as facebook_create_photo_post or facebook_create_reel instead, so there are no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.