Skip to main content
Glama
facebook-mcp

facebook-mcp

by IvanBBaev

Reel Insights

facebook_reel_insights
Read-onlyIdempotent

Reads Graph insights for a single Facebook Reel by video ID, retrieving plays, watch time, and reactions that post-level insights cannot access.

Instructions

Read Graph insights for one Reel from /{video-id}/video_insights — the edge Reel metrics actually live on, which facebook_post_insights cannot reach. Takes the VIDEO id (digits only, as listed by facebook_list_reels or returned by facebook_create_reel), NOT a "{page-id}_{post-id}" post ID. Same compact shape as the other insights tools: flat rows plus one semantics-aware summary per metric (total removed; read value and aggregation), or summaries only with aggregate:true (output:{format} writes every row to a CSV/JSON file instead). The default period is "lifetime", because plays and watch time are cumulative counters rather than a daily series. Metric names are their own vocabulary — page/post names do not transfer — and Meta's reference lists blue_reels_play_count, post_video_avg_time_watched, post_video_view_time, post_video_likes_by_reaction_type and post_video_social_actions among others; they are examples, not a whitelist, so a name Graph never mentions is reported as unavailable rather than silently dropped. Empty series usually mean the wrong ID, a Reel that is not PUBLISHED yet, or the usual insights lag — the result says which to check.

Input Schema

NameRequiredDescriptionDefault
sinceNoInclusive start boundary as a calendar date "YYYY-MM-DD". The range is [since, until); Page period=day boundaries are Pacific Time (America/Los_Angeles), post and Reel boundaries UTC. Omitted ⇒ Graph's own default window. The since..until boundary span may not exceed 90 days per call (checked before the request); read longer histories in slices.
untilNoEXCLUSIVE end boundary as a calendar date "YYYY-MM-DD": for Page period=day, until=2026-08-30 includes the 2026-08-29 Pacific day but not 2026-08-30, and since = until is refused as an empty window. Each returned `date` is Graph's exclusive end boundary of its period, so a window reaching today ends in a partial, still-being-computed bucket. Omitted ⇒ today (Pacific Time for a Page, UTC otherwise).
outputNoWrite the FULL series to a local file in FB_EXPORT_DIR instead of returning rows. The row cap does not apply to the file; the inline result is the aggregate-mode summary (no rows, max_rows and aggregate are ignored) plus `export: {path, format, rows, bytes, sha256}`. Use it for long daily series that would otherwise be truncated.
periodNoAggregation window Graph applies per data point. "day" is a daily series (the Page default); "lifetime" is one cumulative value per metric (the post default); "week"/"days_28" are rolling windows; "month" is calendar-monthly; "total_over_range" collapses since..until into a single value. Not every metric supports every period — a metric queried with an unsupported period comes back empty, which the notes call out.
metricsYesGraph insights metric names to read, e.g. ["page_media_view","page_follows"] (1-20 per call; trimmed and lower-cased). Names are Graph-version dependent and Meta renamed most of them in the 2024-09, 2025-11 and 2026-06 waves: pre-wave names such as "page_impressions" or "page_fans" are dropped before the request and answered with their replacement instead of an error. Graph fails the WHOLE call when one surviving name is invalid: when Graph says which entry it rejected, that name is dropped, the rest are re-read and it is reported in rejectedMetrics; otherwise isolate a suspect name by requesting it alone. Page metrics (page_*) are read on the Page, post metrics (post_*) on a post or Reel.
profileNoPage profile key (e.g. "brand-a") or a raw Page ID. Omitted ⇒ the default Page (FB_PAGE_ID).
max_rowsNoLower the per-point row cap for this call (1-250; the default and the ceiling are both 250 — this argument can only shrink it). Rows past the cap are dropped and the result reports how many; prefer aggregate:true over a tiny cap when you only need per-metric summaries.
video_idYesThe Reel to read, as its VIDEO id — the item `id` from facebook_list_reels, or the `videoId` returned by facebook_create_reel (also echoed by facebook_get_video_status). A "{page-id}_{post-id}" value is a post, not a video, and does not resolve on the /video_insights edge. The Reel must belong to the resolved Page, whose token authorizes the read.
aggregateNoTrue ⇒ return per-metric summaries only and NO per-point rows. Each summary states its `kind` (flow, gauge, unique, unknown) and its `aggregation`, and carries `value` only when one scalar is safe: known flows over disjoint day/month buckets are summed, gauges such as page_follows take the latest value (plus `change`), week/days_28 rolling windows and lifetime counters take the latest window, and unique-audience or unknown day/month series and breakdown maps get aggregation "none" rather than a guess. Use it for wide windows or many metrics when the daily rows would otherwise be truncated.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv0.8.0
    • changedInput schema / properties / aggregate / description
      Previous value: -"True ⇒ return per-metric totals only (period, points, total, first/last boundary) and NO per-point rows. Use it for wide windows or many metrics: it is the cheapest way to stay inside the result budget when a daily series would otherwise be truncated."New value: +"True ⇒ return per-metric summaries only and NO per-point rows. Each summary states its `kind` (flow, gauge, unique, unknown) and its `aggregation`, and carries `value` only when one scalar is safe: known flows over disjoint day/month buckets are summed, gauges such as page_follows take the latest value (plus `change`), week/days_28 rolling windows and lifetime counters take the latest window, and unique-audience or unknown day/month series and breakdown maps get aggregation \"none\" rather than a guess. Use it for wide windows or many metrics when the daily rows would otherwise be truncated."
    • changedInput schema / properties / max_rows / description
      Previous value: -"Lower the per-point row cap for this call (1-250; the default and the ceiling are both 250 — this argument can only shrink it). Rows past the cap are dropped and the result reports how many; prefer aggregate:true over a tiny cap when you only need totals."New value: +"Lower the per-point row cap for this call (1-250; the default and the ceiling are both 250 — this argument can only shrink it). Rows past the cap are dropped and the result reports how many; prefer aggregate:true over a tiny cap when you only need per-metric summaries."
    • changedInput schema / properties / metrics / description
      Previous value: -"Graph insights metric names to read, e.g. [\"page_media_view\",\"page_follows\"] (1-20 per call; trimmed and lower-cased). Names are Graph-version dependent and Meta renamed most of them in the 2024-09, 2025-11 and 2026-06 waves: pre-wave names such as \"page_impressions\" or \"page_fans\" are dropped before the request and answered with their replacement instead of an error. Graph fails the WHOLE call when one surviving name is invalid, so isolate a suspect name by requesting it alone."New value: +"Graph insights metric names to read, e.g. [\"page_media_view\",\"page_follows\"] (1-20 per call; trimmed and lower-cased). Names are Graph-version dependent and Meta renamed most of them in the 2024-09, 2025-11 and 2026-06 waves: pre-wave names such as \"page_impressions\" or \"page_fans\" are dropped before the request and answered with their replacement instead of an error. Graph fails the WHOLE call when one surviving name is invalid: when Graph says which entry it rejected, that name is dropped, the rest are re-read and it is reported in rejectedMetrics; otherwise isolate a suspect name by requesting it alone. Page metrics (page_*) are read on the Page, post metrics (post_*) on a post or Reel."
    • addedInput schema / properties / metrics / items / pattern
      Added value: +"^[^,]+$"
    • addedInput schema / properties / output
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Write the FULL series to a local file in FB_EXPORT_DIR instead of returning rows. The row cap does not apply to the file; the inline result is the aggregate-mode summary (no rows, max_rows and aggregate are ignored) plus `export: {path, format, rows, bytes, sha256}`. Use it for long daily series that would otherwise be truncated.",
      +  "properties": {
      +    "file_name": {
      +      "description": "Optional bare file name (1-80 of A-Z a-z 0-9 . _ -, no path, no leading dot). The extension is added when missing. Omitted ⇒ <scope>-<objectId>-<since>-<until>-<timestamp>. An existing file is never overwritten; a numeric suffix is added instead.",
      +      "pattern": "^[A-Za-z0-9_-][A-Za-z0-9._-]{0,79}$",
      +      "type": "string"
      +    },
      +    "format": {
      +      "description": "File format: \"csv\" (one row per data point, spreadsheet-ready) or \"json\" (the summaries plus every row).",
      +      "enum": [
      +        "csv",
      +        "json"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "format"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / since / description
      Previous value: -"Start of the window as a calendar date \"YYYY-MM-DD\" (inclusive, Page timezone). Omitted ⇒ Graph's own default window. The since..until span may not exceed 90 days per call (checked before the request); read longer histories in slices."New value: +"Inclusive start boundary as a calendar date \"YYYY-MM-DD\". The range is [since, until); Page period=day boundaries are Pacific Time (America/Los_Angeles), post and Reel boundaries UTC. Omitted ⇒ Graph's own default window. The since..until boundary span may not exceed 90 days per call (checked before the request); read longer histories in slices."
    • changedInput schema / properties / until / description
      Previous value: -"End of the window as a calendar date \"YYYY-MM-DD\". Each returned `date` is the END of the period the value covers, so a window reaching today ends in a partial, still-being-computed bucket. Omitted ⇒ today."New value: +"EXCLUSIVE end boundary as a calendar date \"YYYY-MM-DD\": for Page period=day, until=2026-08-30 includes the 2026-08-29 Pacific day but not 2026-08-30, and since = until is refused as an empty window. Each returned `date` is Graph's exclusive end boundary of its period, so a window reaching today ends in a partial, still-being-computed bucket. Omitted ⇒ today (Pacific Time for a Page, UTC otherwise)."
    • changedInput schema / properties / video_id / description
      Previous value: -"The Reel to read, as its VIDEO id — the `videoId` returned by facebook_create_reel (also echoed by facebook_get_video_status). A \"{page-id}_{post-id}\" value is a post, not a video, and does not resolve on the /video_insights edge. The Reel must belong to the resolved Page, whose token authorizes the read."New value: +"The Reel to read, as its VIDEO id — the item `id` from facebook_list_reels, or the `videoId` returned by facebook_create_reel (also echoed by facebook_get_video_status). A \"{page-id}_{post-id}\" value is a post, not a video, and does not resolve on the /video_insights edge. The Reel must belong to the resolved Page, whose token authorizes the read."
  2. First observedv0.7.0

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already establish that this is a safe read-only, idempotent, non-destructive operation, but the description adds substantial context beyond them: the Graph edge used, default lifetime period and why, metric-name handling and rename waves, rejection behavior, aggregate semantics, file export behavior, and likely causes of empty series. Nothing contradicts the annotations.

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

Conciseness4/5

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

The description is front-loaded with purpose, ID requirements, and output shape before moving into period, metrics, and empty-series diagnostics. It is long but mostly earns its length given the tool's complexity; a few clauses repeat schema details and could be tightened.

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

Completeness5/5

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

With no output schema and nine parameters, the description still covers output shape, aggregate mode, export behavior, default period, metric vocabulary, ID type, and empty-result diagnosis. An agent has enough information to invoke it correctly and interpret common failure modes.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all parameters, but the description adds meaningful semantics: metrics are examples rather than a whitelist, page/post metric names do not transfer, the default period is lifetime because plays and watch time are cumulative, and video_id must be a video ID. Some details duplicate the schema, but the added interpretation is useful.

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

Purpose5/5

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

States a specific verb and resource — read Graph insights for one Reel from /{video-id}/video_insights — and explicitly distinguishes it from facebook_post_insights, which cannot reach that edge. It also clarifies the required ID type, so an agent can identify the correct tool without opening sibling schemas.

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

Usage Guidelines5/5

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

The description gives explicit usage guidance: use this for Reel metrics, pass a VIDEO id rather than a page_post id, and use facebook_list_reels or facebook_create_reel to obtain that ID. It also explains when to use aggregate:true and output:{format}, and diagnoses empty series.

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