Skip to main content
Glama

HubVibe: Pay-per-Call Agent Tools: Web Search, Email Verify, KYC Screening, Stocks, Crypto, News

X (Twitter) topic pulse: volume and engagement as aggregates

hubvibe_social_x_pulse
Read-onlyIdempotent

Twitter / X sentiment and volume for any topic, as numbers, live: post volume per hour or day over the last 1-7 days, and over a sample of recent posts the engagement totals and rate (likes, reposts, replies, quotes, impressions), language mix, top hashtags and link/media share. Aggregates only: no post text or authors. Input: query (X operators allowed); optional days, granularity, sample, lang. $0.50 per call. Returns: query, effective_query, window{}, granularity, volume{total, buckets[]}, sample{requested, read, pages, x_cost_usd}, engagement{likes_total, ..., languages{}, top_hashtags[]}, source, as_of, checked_at.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
daysNoWindow ending now, default 7 (X's recent limit).
langNoRestrict to a language (en, ja...).
queryYesWords or X search operators ("machine learning" from:nasa has:links).
sampleNoRecent posts read for the engagement aggregates, default 40; 0 = volume only.
languageNoOptional BCP-47 language tag (en, ja, ko, pt-BR): the human-readable strings of the result (notes, details, reasons) are translated into this language; data, codes, numbers and URLs are untouched. Default: as produced.
granularityNoVolume buckets, default day.
include_retweetsNoDefault false: reposts are excluded from volume and sample.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes
statusYes
workerYes
price_usdYes
provenanceYes
receipt_idYes
attributionNo
receipt_urlYes
billing_warningNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed23 schema fields changed
    • removedOutput schema / description
      Removed value: -"The 200 body of every paid /work call. `result` is the worker's own output (its schema is per route); everything else is the same on every /work route. A receipt for the job is at `receipt_url`."
    • removedOutput schema / properties / attribution / description
      Removed value: -"Present only when the result's text was machine-translated: the credit to show with it."
    • removedOutput schema / properties / attribution / items / description
      Removed value: -"A credit."
    • removedOutput schema / properties / attribution / items / properties
      Removed value: -{
      -  "text": {
      -    "description": "Credit.",
      -    "examples": [
      -      "Translated by Google"
      -    ],
      -    "type": "string"
      -  },
      -  "url": {
      -    "description": "Link.",
      -    "examples": [
      -      "https://translate.google.com"
      -    ],
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / attribution / items / required
      Removed value: -[
      -  "text",
      -  "url"
      -]
    • removedOutput schema / properties / attribution / items / type
      Removed value: -"object"
    • removedOutput schema / properties / billing_warning / description
      Removed value: -"Present only when the charge was recorded with a caveat."
    • removedOutput schema / properties / billing_warning / examples
      Removed value: -[
      -  "settlement pending"
      -]
    • removedOutput schema / properties / price_usd / description
      Removed value: -"What this call cost, in USD."
    • removedOutput schema / properties / price_usd / examples
      Removed value: -[
      -  0.02
      -]
    • removedOutput schema / properties / provenance / description
      Removed value: -"How the result was produced: which providers ran and how long each took."
    • removedOutput schema / properties / provenance / properties
      Removed value: -{
      -  "attempts": {
      -    "description": "Provider attempts made, including retries and failovers.",
      -    "examples": [
      -      1
      -    ],
      -    "type": "integer"
      -  },
      -  "elapsed_ms": {
      -    "description": "Wall-clock milliseconds for the whole job.",
      -    "examples": [
      -      340
      -    ],
      -    "type": "integer"
      -  },
      -  "providers_used": {
      -    "description": "Providers that served the job.",
      -    "examples": [
      -      [
      -        "coinbase-advanced-trade-public"
      -      ]
      -    ],
      -    "items": {
      -      "description": "Provider name.",
      -      "examples": [
      -        "coinbase-advanced-trade-public"
      -      ],
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "steps": {
      -    "description": "Every step the job ran, in order.",
      -    "items": {
      -      "description": "One step of the job.",
      -      "properties": {
      -        "ms": {
      -          "description": "Milliseconds the step took.",
      -          "examples": [
      -            312
      -          ],
      -          "type": "integer"
      -        },
      -        "ok": {
      -          "description": "Whether the step succeeded.",
      -          "examples": [
      -            true
      -          ],
      -          "type": "boolean"
      -        },
      -        "provider": {
      -          "description": "Provider that served the step.",
      -          "examples": [
      -            "coinbase-advanced-trade-public"
      -          ],
      -          "type": "string"
      -        },
      -        "reason": {
      -          "description": "Failure reason, on a failed step.",
      -          "examples": [
      -            "provider_timeout"
      -          ],
      -          "type": "string"
      -        },
      -        "step": {
      -          "description": "Step name inside the worker.",
      -          "examples": [
      -            "quote"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "step",
      -        "ok",
      -        "ms"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  }
      -}
    • removedOutput schema / properties / provenance / required
      Removed value: -[
      -  "steps",
      -  "providers_used",
      -  "attempts",
      -  "elapsed_ms"
      -]
    • removedOutput schema / properties / receipt_id / description
      Removed value: -"Receipt id for this job."
    • removedOutput schema / properties / receipt_id / examples
      Removed value: -[
      -  "rcpt_9f1c2b3a4d5e6f70"
      -]
    • removedOutput schema / properties / receipt_url / description
      Removed value: -"Where to fetch the machine-readable receipt (free, no payment)."
    • removedOutput schema / properties / receipt_url / examples
      Removed value: -[
      -  "/work/receipts/rcpt_9f1c2b3a4d5e6f70"
      -]
    • removedOutput schema / properties / result / properties
      Removed value: -{
      -  "as_of": {
      -    "description": "End of the window analysed.",
      -    "examples": [
      -      "2026-09-27T08:59:45Z"
      -    ],
      -    "type": "string"
      -  },
      -  "checked_at": {
      -    "description": "When this node read the source (UTC). Nothing here is cached.",
      -    "examples": [
      -      "2026-09-26T18:00:00Z"
      -    ],
      -    "format": "date-time",
      -    "type": "string"
      -  },
      -  "effective_query": {
      -    "description": "The query sent to X (lang: and -is:retweet added unless given).",
      -    "examples": [
      -      "open source lang:en -is:retweet"
      -    ],
      -    "type": "string"
      -  },
      -  "engagement": {
      -    "description": "Engagement aggregates over the sample; null when sample is 0.",
      -    "properties": {
      -      "bookmarks_total": {
      -        "description": "Bookmarks summed.",
      -        "examples": [
      -          12
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "engagement_rate_pct": {
      -        "description": "(likes+reposts+replies+quotes)/impressions, percent.",
      -        "examples": [
      -          0.807
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "impressions_total": {
      -        "description": "Impressions summed.",
      -        "examples": [
      -          51200
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "languages": {
      -        "additionalProperties": {
      -          "type": "integer"
      -        },
      -        "description": "Posts per language code.",
      -        "examples": [
      -          {
      -            "en": 20
      -          }
      -        ],
      -        "properties": {},
      -        "required": [],
      -        "type": "object"
      -      },
      -      "likes_total": {
      -        "description": "Likes summed.",
      -        "examples": [
      -          340
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "max_impressions": {
      -        "description": "Most-seen post's impressions.",
      -        "examples": [
      -          18000
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "max_likes": {
      -        "description": "Most-liked post's likes.",
      -        "examples": [
      -          120
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "mean_impressions": {
      -        "description": "Mean impressions per post.",
      -        "examples": [
      -          2560
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "mean_likes": {
      -        "description": "Mean likes per post.",
      -        "examples": [
      -          17
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "possibly_sensitive_pct": {
      -        "description": "Share X flags as possibly sensitive.",
      -        "examples": [
      -          0
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "posts_read": {
      -        "description": "Posts in the sample.",
      -        "examples": [
      -          20
      -        ],
      -        "type": "integer"
      -      },
      -      "quotes_total": {
      -        "description": "Quotes summed.",
      -        "examples": [
      -          5
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "replies_total": {
      -        "description": "Replies summed.",
      -        "examples": [
      -          27
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "reposts_total": {
      -        "description": "Reposts summed.",
      -        "examples": [
      -          41
      -        ],
      -        "type": [
      -          "integer",
      -          "null"
      -        ]
      -      },
      -      "top_hashtags": {
      -        "description": "Up to 10 most-used hashtags.",
      -        "examples": [
      -          [
      -            {
      -              "posts": 4,
      -              "tag": "opensource"
      -            }
      -          ]
      -        ],
      -        "items": {
      -          "description": "One hashtag.",
      -          "properties": {
      -            "posts": {
      -              "description": "Posts using it.",
      -              "examples": [
      -                4
      -              ],
      -              "type": "integer"
      -            },
      -            "tag": {
      -              "description": "Hashtag, lower-cased.",
      -              "examples": [
      -                "opensource"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "tag",
      -            "posts"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "with_hashtags_pct": {
      -        "description": "Share of posts with a hashtag.",
      -        "examples": [
      -          35
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "with_links_pct": {
      -        "description": "Share of posts linking outside X.",
      -        "examples": [
      -          40
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      },
      -      "with_media_pct": {
      -        "description": "Share of posts with photos or video.",
      -        "examples": [
      -          15
      -        ],
      -        "type": [
      -          "number",
      -          "null"
      -        ]
      -      }
      -    },
      -    "required": [
      -      "posts_read",
      -      "likes_total",
      -      "reposts_total",
      -      "replies_total",
      -      "quotes_total",
      -      "impressions_total",
      -      "bookmarks_total",
      -      "mean_likes",
      -      "mean_impressions",
      -      "max_likes",
      -      "max_impressions",
      -      "engagement_rate_pct",
      -      "languages",
      -      "top_hashtags",
      -      "with_hashtags_pct",
      -      "with_links_pct",
      -      "with_media_pct",
      -      "possibly_sensitive_pct"
      -    ],
      -    "type": [
      -      "object",
      -      "null"
      -    ]
      -  },
      -  "granularity": {
      -    "description": "Volume bucket size.",
      -    "enum": [
      -      "hour",
      -      "day"
      -    ],
      -    "examples": [
      -      "day"
      -    ],
      -    "type": "string"
      -  },
      -  "query": {
      -    "description": "The query as given.",
      -    "examples": [
      -      "open source"
      -    ],
      -    "type": "string"
      -  },
      -  "sample": {
      -    "description": "The sample the engagement figures rest on.",
      -    "properties": {
      -      "pages": {
      -        "description": "Search pages fetched.",
      -        "examples": [
      -          1
      -        ],
      -        "type": "integer"
      -      },
      -      "read": {
      -        "description": "Posts actually read.",
      -        "examples": [
      -          20
      -        ],
      -        "type": "integer"
      -      },
      -      "requested": {
      -        "description": "Posts asked to read.",
      -        "examples": [
      -          20
      -        ],
      -        "type": "integer"
      -      },
      -      "x_cost_usd": {
      -        "description": "What X bills for the posts read, at $0.005 each.",
      -        "examples": [
      -          0.1
      -        ],
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "requested",
      -      "read",
      -      "pages",
      -      "x_cost_usd"
      -    ],
      -    "type": "object"
      -  },
      -  "source": {
      -    "const": "x-api-v2",
      -    "description": "Data source.",
      -    "type": "string"
      -  },
      -  "volume": {
      -    "description": "Post volume from X's recent-counts endpoint.",
      -    "properties": {
      -      "bucket_count": {
      -        "description": "Buckets returned.",
      -        "examples": [
      -          4
      -        ],
      -        "type": "integer"
      -      },
      -      "buckets": {
      -        "description": "Counts per bucket, oldest first.",
      -        "items": {
      -          "description": "One bucket.",
      -          "properties": {
      -            "count": {
      -              "description": "Posts in the bucket.",
      -              "examples": [
      -                7200
      -              ],
      -              "type": "integer"
      -            },
      -            "end": {
      -              "description": "Bucket end.",
      -              "examples": [
      -                "2026-09-27T00:00:00.000Z"
      -              ],
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "start": {
      -              "description": "Bucket start.",
      -              "examples": [
      -                "2026-09-26T00:00:00.000Z"
      -              ],
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "start",
      -            "end",
      -            "count"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "total": {
      -        "description": "Posts matching the query in the window.",
      -        "examples": [
      -          21636
      -        ],
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "total",
      -      "buckets",
      -      "bucket_count"
      -    ],
      -    "type": "object"
      -  },
      -  "window": {
      -    "description": "The window analysed.",
      -    "properties": {
      -      "days": {
      -        "description": "Days covered.",
      -        "examples": [
      -          3
      -        ],
      -        "type": "integer"
      -      },
      -      "end": {
      -        "description": "Window end (RFC 3339), a few seconds before the call.",
      -        "examples": [
      -          "2026-09-27T08:59:45Z"
      -        ],
      -        "type": "string"
      -      },
      -      "start": {
      -        "description": "Window start (RFC 3339).",
      -        "examples": [
      -          "2026-09-24T09:00:00Z"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "start",
      -      "end",
      -      "days"
      -    ],
      -    "type": "object"
      -  }
      -}
    • removedOutput schema / properties / result / required
      Removed value: -[
      -  "query",
      -  "effective_query",
      -  "window",
      -  "granularity",
      -  "volume",
      -  "sample",
      -  "engagement",
      -  "source",
      -  "as_of",
      -  "checked_at"
      -]
    • removedOutput schema / properties / status / description
      Removed value: -"Present only on a delivered result."
    • removedOutput schema / properties / worker / description
      Removed value: -"Catalog name of the worker that ran."
    • removedOutput schema / properties / worker / examples
      Removed value: -[
      -  "market.quote"
      -]
    • removedOutput schema / title
      Removed value: -"social.x_pulse response"
  2. Changed1 schema field changed
    • addedOutput schema / properties / attribution
      Added value: +{
      +  "description": "Present only when the result's text was machine-translated: the credit to show with it.",
      +  "items": {
      +    "description": "A credit.",
      +    "properties": {
      +      "text": {
      +        "description": "Credit.",
      +        "examples": [
      +          "Translated by Google"
      +        ],
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "Link.",
      +        "examples": [
      +          "https://translate.google.com"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "text",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / language
      Added value: +{
      +  "description": "Optional BCP-47 language tag (en, ja, ko, pt-BR): the human-readable strings of the result (notes, details, reasons) are translated into this language; data, codes, numbers and URLs are untouched. Default: as produced.",
      +  "maxLength": 35,
      +  "pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})*$",
      +  "type": "string"
      +}
  4. Added

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly, idempotent, openWorld and non-destructive semantics, so the bar is low. The description goes beyond them with a concrete cost ('$0.50 per call'), the sample-vs-volume distinction, the 1-7 day window ceiling, and default exclusions (reposts), all of which meaningfully inform invocation decisions.

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?

Front-loaded with purpose, then scope, inputs, price and returns — a logical order with no filler sentences. It is dense and run-on in places, and the extended 'Returns:' enumeration is somewhat redundant given an output schema exists, but it remains readable.

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 a 7-parameter, costed, multi-aggregate tool, the description covers input semantics, output shape, cost, and scope limits thoroughly. The only gap is the absence of explicit sibling routing, and since an output schema exists the detailed return enumeration is a minor redundancy rather than a missing piece.

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 baseline is 3. The description restates most parameters (query with X operators, days, granularity, sample, lang) but adds little semantic detail beyond what the schema provides, and it omits include_retweets and the BCP-47 'language' param entirely.

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?

The description names a specific resource and scope: X/Twitter sentiment and volume for a topic, delivered as aggregates (volume per hour/day, engagement totals/rate, language mix, top hashtags, media share). It clearly distinguishes itself from generic social siblings (bluesky, mastodon) by naming the platform and the aggregate-only nature. An agent knows exactly what it gets without opening the schema.

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 sets a clear boundary — 'Aggregates only: no post text or authors' — which implicitly steers an agent away when raw post content is needed, and it specifies the 1-7 day window and X-operator support. However, it never explicitly names an alternative tool or a when-not condition, so routing guidance is inferential rather than stated.

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.