Skip to main content
Glama

Read post performance

posts_performance
Read-onlyIdempotent

How published posts are performing, one row per destination: views, likes, comments, shares and saves, each with how far it has moved over the period. Best first, so the default answers "what did well" in one call rather than by listing everything. Sort by change instead to find what is moving now. Numbers are as of the last sweep, and every row carries the time it was measured — a delivery nobody has measured yet has no metrics at all rather than zeroes, and sorts last.

Each row also carries insights: what the platform's own analytics said on that delivery, never summed across deliveries. reach (distinct accounts), totalWatchMs and avgWatchMs, replays, follows (gained from the post), completionRate and skipRate as fractions 0..1, retention — the full audience-retention curve as Facebook sends it, points[i] being the share still watching at i twentieths of the video and bucketMs one twentieth in milliseconds — and breakdowns such as clicks by type. retentionAt3s and retentionAtHalf are read off that curve, interpolated between buckets, so hooks can be ranked by how many viewers they held; null without a curve or a known video length. Null means the platform does not report it; a name listed in unavailable means it would have and refused this time. Compare watch time across platforms as totalWatchMs / views: Facebook averages per play and Instagram per viewer, so avgWatchMs is not comparable between them.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
byNoRank by the running total, or by how much it moved over the period. Defaults to the total. A post with no observation in the window has no change and sorts last either way.
limitNoHow many to return. Defaults to 10. Ask for more only when you need them — every row carries its post and account.
periodNoThe window a change is measured over. Defaults to 24h.
sort_byNoWhich counter or insight to rank by. Defaults to views. Insights rank by value only; deliveries without one sort last.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
postsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / sort_by / description
      Previous value: -"Which counter to rank by. Defaults to views."New value: +"Which counter or insight to rank by. Defaults to views. Insights rank by value only; deliveries without one sort last."
    • changedInput schema / properties / sort_by / enum
      Previous value: -[
      -  "views",
      -  "likes",
      -  "comments",
      -  "shares",
      -  "saves"
      -]New value: +[
      +  "views",
      +  "likes",
      +  "comments",
      +  "shares",
      +  "saves",
      +  "reach",
      +  "totalWatchMs",
      +  "avgWatchMs",
      +  "replays",
      +  "follows",
      +  "completionRate",
      +  "retentionAt3s",
      +  "retentionAtHalf"
      +]
    • addedOutput schema / properties / posts / items / properties / insights
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "avgWatchMs": {
      +          "anyOf": [
      +            {
      +              "maximum": 2147483647,
      +              "minimum": -2147483648,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "breakdowns": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": {
      +                "additionalProperties": {
      +                  "type": "number"
      +                },
      +                "propertyNames": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              },
      +              "propertyNames": {
      +                "type": "string"
      +              },
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "completionRate": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "follows": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "reach": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "replays": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "retention": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": false,
      +              "properties": {
      +                "bucketMs": {
      +                  "anyOf": [
      +                    {
      +                      "type": "number"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ]
      +                },
      +                "points": {
      +                  "items": {
      +                    "type": "number"
      +                  },
      +                  "type": "array"
      +                }
      +              },
      +              "required": [
      +                "points",
      +                "bucketMs"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "retentionAt3s": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "retentionAtHalf": {
      +          "anyOf": [
      +            {
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "skipRate": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "number"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "totalWatchMs": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "unavailable": {
      +          "anyOf": [
      +            {
      +              "items": {
      +                "type": "string"
      +              },
      +              "type": "array"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "reach",
      +        "totalWatchMs",
      +        "avgWatchMs",
      +        "replays",
      +        "follows",
      +        "completionRate",
      +        "skipRate",
      +        "retention",
      +        "breakdowns",
      +        "unavailable",
      +        "retentionAt3s",
      +        "retentionAtHalf"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / posts / items / required
      Previous value: -[
      -  "id",
      -  "socialAccountId",
      -  "status",
      -  "externalUrl",
      -  "publishedAt",
      -  "lastError",
      -  "post",
      -  "account",
      -  "metrics",
      -  "thumbnail",
      -  "finalizedAt",
      -  "postedAt"
      -]New value: +[
      +  "id",
      +  "socialAccountId",
      +  "status",
      +  "externalUrl",
      +  "publishedAt",
      +  "lastError",
      +  "post",
      +  "account",
      +  "metrics",
      +  "insights",
      +  "thumbnail",
      +  "finalizedAt",
      +  "postedAt"
      +]
  2. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description explains data freshness ('as of the last sweep'), absence semantics ('no metrics at all rather than zeroes, sorts last'), the distinction between null and 'unavailable', and the cross-platform comparability caveat for avgWatchMs. No contradiction with annotations.

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?

The description is long but dense; the first paragraph front-loads the core result set and ranking behavior, and the second paragraph organizes the insights object, null handling, and platform caveats. Every sentence adds necessary context for interpreting performance data.

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?

For a complex performance-read tool, the description covers measurement timing, missing data semantics, per-platform analytics aggregation, video retention details, and cross-platform comparison pitfalls. With an output schema present and annotations declaring read-only/idempotent behavior, nothing essential is left unexplained.

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 baseline is 3, but the description adds operational meaning: 'Best first' explains the default by=value behavior, and 'Sort by change instead' clarifies when to choose by=change. It reinforces delivery-absence semantics for ranking without duplicating the schema.

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?

The first sentence clearly identifies the resource ('published posts') and the kind of information ('how they are performing, one row per destination') with specific metrics. It doesn't explicitly name or contrast with sibling tools like accounts_performance or posts_list, so it stops short of full sibling differentiation.

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?

It gives clear guidance on choosing ranking behavior: 'Best first, so the default answers what did well in one call' and 'Sort by change instead to find what is moving now.' It lacks explicit when-not/use-this-other-tool instructions, but the context is clear.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources