Skip to main content
Glama

Find social posts

find_posts
Destructive

Find public social posts by keyword (people discussing a topic), by a known author's profile URL or handle, or by LinkedIn company domain. For angles, what's changed, how to approach, or why now on one company or person, use research_company (a company) or prospect_picture (a person, their company, or both) instead. intent: pain | question keeps only posts one audience-specific model pass classified as buyer pain or a buying question (each returned post carries its label and reason; unclassifiable candidates are withheld, never returned unlabelled) and adds a separate classification component at llm token pricing, shown in result.cost_breakdown. Supports LinkedIn, X, Reddit and Facebook, and YouTube and TikTok by keyword, when enabled. include: ["author_details"] adds each author's type (person or company page) and whether the post is a repost. Returns per-platform status and only bills posts passing deterministic literal-v1 relevance. Keyword search costs 0.5 credit per returned post and a miss is free; author/company scope adds a 1-credit base even when no post is returned. On Reddit and Facebook a returned post costs 2 credits. For a person known only by name, call enrich with person { full_name, company_domain } first, then pass the linkedin_url it returns as author { type: "profile_url", profile_url }; a name-only author is refused before any charge, with that call in error.details.next. intent also takes hiring_for_it (the author's own company hiring for the work your product does) and competitor_complaint (a user complaining about a tool like yours; it finds most, not all, complaint posts, so an empty answer doesn't mean nobody is complaining). audience is an optional goal: what you sell and to whom. It never changes charges. With a goal, posts are ordered by how worth a reply they are (ranking.by goal; recency when nothing was judged) and each carries why_now with why_now_basis judged or date. leads takes contacts as find_leads or enrich return them and gives each one's best recent reason to reach out (their own post, a comment, a reaction or their company's post) with the evidence, and the person ready for enrich: 3 credits per lead with a signal, a lead with none is free, budget_credits caps it. Up to 10 leads answer inline; up to 1,000 run as an operation: send idempotency_key, then poll get_operation, which returns the leads 25 at a time with next_cursor. engagers_of takes up to 5 post URLs and returns the people who reacted, commented, replied or reposted, each with what they did and ready for enrich: 0.5 credit per person (2 on Reddit), a post with nobody is free, per_post up to 50. author_filter (headline or bio keywords) keeps only matching people, adds 0.4 credit per person read, and skips Reddit and Facebook, whose people show no headline. Choose posts your buyers engage with. A company's own announcements can draw mostly its own staff, so check who engaged, or pass author_filter with title words (for example head of sales, VP sales) to keep only the roles you want. Each post reports read (people read) and, on LinkedIn, engaged_total; more_available true means the sample missed people. To read everyone, send the same posts with read_all: true, budget_credits and idempotency_key: it runs in the background (about 2 minutes per 500 people) at the same price per person kept, plus 0.4 credit per person read with author_filter, and never charges above budget_credits. When the counts are known the sample's full_read quotes that budget and the time: tell the user before running it. Then poll get_operation, which returns the people 25 at a time with next_cursor. If the budget runs short, each post says how many people were not read (not_read) or withheld (withheld) and limited_by budget: raise budget_credits to get them. With author_filter, a title check also keeps people whose headline clearly means one of your terms in other words (a CCO for chief revenue officer): each is marked matched_by judged, and filter_basis says judged when it added anyone. It only adds people, and a full read checks at most 2,500 of them.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
leadsNoLeads mode: people from find_leads or enrich. Returns each one's best recent reason to reach out (own post, comment, reaction or company post). LinkedIn only: send no query, platforms or intent.
limitNo
queryNo
authorNo
intentNo
includeNo
audienceNo
per_postNoEngagers mode: up to this many people from each source (reactions, comments, replies) of each post.
read_allNoEngagers mode: read everyone who engaged, not a sample, in the background (about 2 minutes per 500 people). Needs budget_credits and idempotency_key. Returns an operation: poll get_operation, which returns the people 25 at a time with next_cursor.
platformsNo
engagers_ofNoEngagers mode: up to 5 post URLs (LinkedIn, X, Reddit, Facebook). Returns the people who reacted, commented, replied or reposted. Send no query, platforms, intent or audience.
within_daysNo
author_filterNoEngagers mode: keep only people whose headline contains one of these words, e.g. ["head of sales", "VP sales"]. Each person read costs a small scan fee; Reddit and Facebook are skipped (no headlines).
budget_creditsNoLeads mode, or engagers_of with read_all: a spend ceiling in credits. Leads beyond it come back not_processed; read_all reads people up to it.
company_domainNoCompany website domain or URL, e.g. acme.com or https://www.acme.com/about
idempotency_keyNoA payment_required refusal means services are stopped for unpaid billing; direct the owner to the billing link in the error. Campaigns stay paused after payment until restarted. Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."New value: +"A payment_required refusal means services are stopped for unpaid billing; direct the owner to the billing link in the error. Campaigns stay paused after payment until restarted. Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."
  2. Changed2 schema fields changed
    • changedInput schema / properties / budget_credits / description
      Previous value: -"Leads mode only: a spend ceiling in credits; leads beyond it come back not_processed."New value: +"Leads mode, or engagers_of with read_all: a spend ceiling in credits. Leads beyond it come back not_processed; read_all reads people up to it."
    • addedInput schema / properties / read_all
      Added value: +{
      +  "const": true,
      +  "description": "Engagers mode: read everyone who engaged, not a sample, in the background (about 2 minutes per 500 people). Needs budget_credits and idempotency_key. Returns an operation: poll get_operation, which returns the people 25 at a time with next_cursor.",
      +  "type": "boolean"
      +}
  3. Changed5 schema fields changed
    • addedInput schema / properties / author_filter / description
      Added value: +"Engagers mode: keep only people whose headline contains one of these words, e.g. [\"head of sales\", \"VP sales\"]. Each person read costs a small scan fee; Reddit and Facebook are skipped (no headlines)."
    • addedInput schema / properties / budget_credits / description
      Added value: +"Leads mode only: a spend ceiling in credits; leads beyond it come back not_processed."
    • addedInput schema / properties / engagers_of / description
      Added value: +"Engagers mode: up to 5 post URLs (LinkedIn, X, Reddit, Facebook). Returns the people who reacted, commented, replied or reposted. Send no query, platforms, intent or audience."
    • addedInput schema / properties / leads / description
      Added value: +"Leads mode: people from find_leads or enrich. Returns each one's best recent reason to reach out (own post, comment, reaction or company post). LinkedIn only: send no query, platforms or intent."
    • addedInput schema / properties / per_post / description
      Added value: +"Engagers mode: up to this many people from each source (reactions, comments, replies) of each post."
  4. Changed2 schema fields changed
    • addedInput schema / properties / audience
      Added value: +{
      +  "type": "string"
      +}
    • changedInput schema / properties / intent / enum
      Previous value: -[
      -  "pain",
      -  "question",
      -  "any"
      -]New value: +[
      +  "pain",
      +  "question",
      +  "any",
      +  "competitor_complaint",
      +  "hiring_for_it"
      +]
  5. Changed3 schema fields changed
    • addedInput schema / properties / author_filter
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / engagers_of
      Added value: +{
      +  "items": {
      +    "format": "uri",
      +    "type": "string"
      +  },
      +  "maxItems": 5,
      +  "minItems": 1,
      +  "type": "array"
      +}
    • addedInput schema / properties / per_post
      Added value: +{
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / leads / maxItems
      Previous value: -10New value: +1000
  7. Changed2 schema fields changed
    • addedInput schema / properties / budget_credits
      Added value: +{
      +  "exclusiveMinimum": 0,
      +  "maximum": 100000,
      +  "type": "number"
      +}
    • addedInput schema / properties / leads
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "company_domain": {
      +        "anyOf": [
      +          {
      +            "maxLength": 2048,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "company_name": {
      +        "anyOf": [
      +          {
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "email": {
      +        "anyOf": [
      +          {
      +            "maxLength": 320,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "fingerprint": {
      +        "anyOf": [
      +          {
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "first_name": {
      +        "anyOf": [
      +          {
      +            "maxLength": 100,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "full_name": {
      +        "anyOf": [
      +          {
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "last_name": {
      +        "anyOf": [
      +          {
      +            "maxLength": 100,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "linkedin_url": {
      +        "anyOf": [
      +          {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "title": {
      +        "anyOf": [
      +          {
      +            "maxLength": 200,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      },
      +      "work_email": {
      +        "anyOf": [
      +          {
      +            "maxLength": 320,
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ]
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "maxItems": 10,
      +  "minItems": 1,
      +  "type": "array"
      +}
  8. Changed1 schema field changed
    • addedInput schema / properties / include
      Added value: +{
      +  "items": {
      +    "enum": [
      +      "author_details"
      +    ],
      +    "type": "string"
      +  },
      +  "maxItems": 4,
      +  "type": "array"
      +}
  9. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional for search and enrichment tools: supply one to make a retry replay the original result. Required for tools that create an external side effect; reuse the same value after a timeout or an approval."New value: +"Optional for search and enrichment tools: supply one so a retry returns the original result without paying again; if that call failed with provider_unavailable, rate_limited or insufficient_credits (after a top-up), a retry runs it once more after its cooldown (30 s, or a longer retry_after_seconds; insufficient_credits as soon as the balance covers it), unless its provider may already have done the work. Required for tools that create an external side effect; reuse the same value after a timeout or an approval. A stored failure comes back with details.replayed: true; with retry_after_seconds, retry the same value after that."
  10. Changed1 schema field changed
    • addedInput schema / properties / intent
      Added value: +{
      +  "enum": [
      +    "pain",
      +    "question",
      +    "any"
      +  ],
      +  "type": "string"
      +}
  11. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Stable retry key; the same value identifies retries of the same request after timeout or approval."New value: +"Optional for search and enrichment tools: supply one to make a retry replay the original result. Required for tools that create an external side effect; reuse the same value after a timeout or an approval."
  12. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=true, openWorldHint=true and idempotentHint=false; the description goes far beyond them, disclosing per-post credit pricing, free misses, platform-specific surcharges, base fees, refusal/rescue behavior for name-only authors, budget ceilings, and background-operation polling. No contradiction with the declared destructive/charging profile — it explains why spending occurs.

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

Conciseness3/5

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

Front-loaded with purpose, and most sentences carry required operational detail, but it is a single ~700-word run-on block with no paragraphs, bullets, or headings, making mode separation hard to parse. The complexity justifies length, but the structure does not earn a higher score.

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 16-param, multi-mode, no-output-schema tool, the description covers modes, input prerequisites, error/refusal paths, billing rules, and even key return fields (read, engaged_total, more_available, next_cursor, cost_breakdown). Nothing an agent needs to invoke it correctly appears missing.

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?

With 16 params at 50% schema coverage, the description adds real meaning for the non-obvious ones: intent values (pain, question, hiring_for_it, competitor_complaint), include: [author_details], audience ordering, leads/engagers_of/author_filter/read_all/budget_credits semantics. It leaves simple params (query, limit, within_days, platforms, per_post) essentially to the schema, so it is strong but not fully compensating.

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?

Opens with a specific verb+resource and enumerates the three search scopes (keyword, author profile URL/handle, LinkedIn company domain), then explicitly names which sibling tools to use instead for other needs (research_company, prospect_picture). An agent can distinguish it from siblings without opening the schema, even though the tool also carries leads/engagers modes.

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?

Gives an explicit alternative for 'angles, what's changed, how to approach, or why now' and a concrete precondition for name-only authors (call enrich first, then pass linkedin_url). Mode-selection cues are implied via 'send no query...' phrases, but it never contrasts with closer siblings like find_intent or find_leads, and the guidance is buried in a dense wall of text.

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