Skip to main content
Glama

LeoWorks Review & Lead Data Tools (via Apify MCP)

leoworks/social-comment-classifier

leoworks--social-comment-classifier
Destructive

This tool calls the Actor "leoworks/social-comment-classifier" and retrieves its output results. Actor description: Classify Instagram, TikTok, Facebook, YouTube comments: buying intent, sentiment — Instagram comments sentiment and TikTok comments analyzer. Use for comments; for reviews use leoworks/korean-review-classifier. datasetId (text auto-detected) or texts. ~100 comments/4 s, pay per comment.

Input Schema

NameRequiredDescriptionDefault
textsNoPaste comment texts directly (one per line). Use this OR “Comments dataset”. Example values: ["Where can I buy this in Canada? Need it!!","Ordered 3 weeks ago and still nothing. Is anyone answering messages?"]
idFieldsNoFields copied unchanged from each input item to the output so you can join results back (e.g. id, cid, postUrl). Leave empty to auto-pick the comment ID and post URL.
maxItemsNoClassify at most this many comments (0 = all).
minLikesNo0 = all. Comments without a like count are kept.
waitSecsNoMax seconds (0–45, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget.
datasetIdNoAn Apify dataset containing comments — for example the output of an Instagram, TikTok, Facebook or YouTube comment scraper. Use this OR “Comment texts”.
textFieldNoField holding the comment text. Leave empty to auto-detect (text, comment, content, body, …).
outputModeNoMinimal mode returns only label keys — smaller and easier to aggregate. Example values: "full"full
healthCheckNoInternal: fail the run when results look degraded (used by the developer's scheduled checks).
skipRepliesNoClassify only top-level comments, not replies to other comments.
contextFieldNoField holding the title or caption of the post the comment was written under (helps with short comments like “link?”). Leave empty to auto-detect (postTitle, title, …).
customLabelsNoUp to 10 extra yes/no labels (each up to 200 characters) written in plain language, e.g. “mentions shipping to Canada”, “asks about a discount code”. Each gets a probability.
includeAuthorNoAdd the commenter's public username to each row and save BUYERS.csv (one row per commenter with purchase intent). Off by default. Usernames are only copied from your dataset, never sent for classification. Use them in line with the platform's terms and privacy law.
skipEmojiOnlyNoSkip comments with no letters or digits ("🔥🔥", "❤️"). They are mostly praise; skipping them saves cost.
excludeAuthorsNoUsernames whose comments are skipped — usually your own brand or support accounts (with or without @).
labelThresholdNoMinimum probability (0–1) for the needs-reply flag and custom labels to be marked as matched. Raise it for fewer, surer matches. Example values: 0.5
maxConcurrencyNoComments classified in parallel. Example values: 10
skipOwnerRepliesNoSkip comments flagged by the scraper as written by the channel owner or creator (e.g. YouTube `authorIsChannelOwner`), plus any account listed in **Exclude accounts**. Example values: true
commentsNewerThanNoClassify only comments posted after this date — a date like `2026-10-01` or a period like `7 days`, `4 weeks`, `3 months`. Relative dates such as "3 days ago" (YouTube) are counted back from the run time. Leave empty for all.
summaryGroupFieldNoField in your dataset that identifies the post (e.g. `postUrl`, `videoWebUrl`, `videoId`). The run then saves a REPORT record with, per post: comment type mix, sentiment shares, share needing a reply and example purchase-intent, question, complaint and request comments. Leave empty to detect it automatically (overall summary only if none is found). No extra charge.
maxCommentsPerPostNoClassify at most this many comments per post or video, in dataset order. 0 = no limit.
expandNestedRepliesNoDatasets that keep replies inside a comment (Instagram `replies`, Facebook `comments`) or comments inside a post (Instagram Scraper `latestComments`) are flattened to one row per comment. Example values: true

Output Schema

NameRequiredDescriptionDefault
tipNoAdvisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key
runIdYesActor run ID
statsNoRun statistics
statusYesRun status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED
actorIdYesStable Apify Actor ID from the run record
summaryYesPast-tense summary of the run state
exitCodeNoActor process exit code; populated for terminal states (especially FAILED)
nextStepYesOne primary follow-up action with identifiers interpolated
storagesYesDataset and key-value store metadata, keyed by alias. "default" is always the primary entry.
actorNameNo"username/actor-name"
startedAtNoISO timestamp when the run started
finishedAtNoISO timestamp when the run finished (terminal states only)
statusMessageNoPass-through from Apify run.statusMessage
apifyConsoleUrlNoPersonalized Apify Console link to the run; present only for Console sessions

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Added value: +{
      +  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      +  "properties": {
      +    "emojiOnly": {
      +      "type": "boolean"
      +    },
      +    "index": {
      +      "type": "number"
      +    },
      +    "isReply": {
      +      "type": "boolean"
      +    },
      +    "labels": {
      +      "properties": {
      +        "needsReply": {
      +          "properties": {
      +            "matched": {
      +              "type": "boolean"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "sentiment": {
      +          "properties": {
      +            "confidence": {
      +              "type": "number"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": {
      +          "properties": {
      +            "confidence": {
      +              "type": "number"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "typeScores": {
      +          "items": {
      +            "properties": {
      +              "label": {
      +                "type": "string"
      +              },
      +              "probability": {
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "model": {
      +      "type": "string"
      +    },
      +    "needsReply": {
      +      "type": "boolean"
      +    },
      +    "sentiment": {
      +      "type": "string"
      +    },
      +    "text": {
      +      "type": "string"
      +    },
      +    "type": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • removedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Removed value: -{
      -  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      -  "properties": {
      -    "emojiOnly": {
      -      "type": "boolean"
      -    },
      -    "index": {
      -      "type": "number"
      -    },
      -    "isReply": {
      -      "type": "boolean"
      -    },
      -    "labels": {
      -      "properties": {
      -        "needsReply": {
      -          "properties": {
      -            "matched": {
      -              "type": "boolean"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "sentiment": {
      -          "properties": {
      -            "confidence": {
      -              "type": "number"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": {
      -          "properties": {
      -            "confidence": {
      -              "type": "number"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "typeScores": {
      -          "items": {
      -            "properties": {
      -              "label": {
      -                "type": "string"
      -              },
      -              "probability": {
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "model": {
      -      "type": "string"
      -    },
      -    "needsReply": {
      -      "type": "boolean"
      -    },
      -    "sentiment": {
      -      "type": "string"
      -    },
      -    "text": {
      -      "type": "string"
      -    },
      -    "type": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
  3. Changed1 schema field changed
    • addedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Added value: +{
      +  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      +  "properties": {
      +    "emojiOnly": {
      +      "type": "boolean"
      +    },
      +    "index": {
      +      "type": "number"
      +    },
      +    "isReply": {
      +      "type": "boolean"
      +    },
      +    "labels": {
      +      "properties": {
      +        "needsReply": {
      +          "properties": {
      +            "matched": {
      +              "type": "boolean"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "sentiment": {
      +          "properties": {
      +            "confidence": {
      +              "type": "number"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": {
      +          "properties": {
      +            "confidence": {
      +              "type": "number"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "probability": {
      +              "type": "number"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "typeScores": {
      +          "items": {
      +            "properties": {
      +              "label": {
      +                "type": "string"
      +              },
      +              "probability": {
      +                "type": "number"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "model": {
      +      "type": "string"
      +    },
      +    "needsReply": {
      +      "type": "boolean"
      +    },
      +    "sentiment": {
      +      "type": "string"
      +    },
      +    "text": {
      +      "type": "string"
      +    },
      +    "type": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • removedOutput schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema
      Removed value: -{
      -  "description": "JSON Schema for rows in the dataset at `storages.datasets.default.id` — describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema.",
      -  "properties": {
      -    "emojiOnly": {
      -      "type": "boolean"
      -    },
      -    "index": {
      -      "type": "number"
      -    },
      -    "isReply": {
      -      "type": "boolean"
      -    },
      -    "labels": {
      -      "properties": {
      -        "needsReply": {
      -          "properties": {
      -            "matched": {
      -              "type": "boolean"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "sentiment": {
      -          "properties": {
      -            "confidence": {
      -              "type": "number"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": {
      -          "properties": {
      -            "confidence": {
      -              "type": "number"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "probability": {
      -              "type": "number"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "typeScores": {
      -          "items": {
      -            "properties": {
      -              "label": {
      -                "type": "string"
      -              },
      -              "probability": {
      -                "type": "number"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "type": "array"
      -        }
      -      },
      -      "type": "object"
      -    },
      -    "model": {
      -      "type": "string"
      -    },
      -    "needsReply": {
      -      "type": "boolean"
      -    },
      -    "sentiment": {
      -      "type": "string"
      -    },
      -    "text": {
      -      "type": "string"
      -    },
      -    "type": {
      -      "type": "string"
      -    }
      -  },
      -  "type": "object"
      -}
  5. Added

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, openWorldHint=true and destructiveHint=true, so the safety profile is carried structurally. The description adds genuinely useful context beyond that: throughput (~100 comments/4 s) and cost model (pay per comment), which is exactly the kind of rate/pricing disclosure that helps an agent plan a call. It stops short of explaining why destructiveHint is set (i.e. that a billable Actor run is created).

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?

Reasonably short and front-loaded, but the opening sentence ("calls the Actor ... and retrieves its output results") is wrapper boilerplate, and the platform list is redundantly repeated ("Instagram comments sentiment and TikTok comments analyzer") as SEO padding rather than new information.

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?

An output schema exists and schema coverage is 100%, so return values and most parameter meaning need not be restated. The description supplies purpose, the sibling alternative, and cost/throughput, which is close to complete for a 22-param classification Actor, though the destructive annotation remains unexplained.

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% across 22 parameters, so the schema does the heavy lifting and the baseline is 3. The description only restates the datasetId/texts choice and text auto-detection, adding nothing the schema does not already say.

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 Actor description names a specific verb and resource (classify Instagram, TikTok, Facebook, YouTube comments) plus the outputs it produces (buying intent, sentiment), and explicitly distinguishes itself from the sibling review classifiers. An agent can tell what it does and when it is the wrong tool 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?

"Use for comments; for reviews use leoworks/korean-review-classifier" gives an explicit when-to-use and a named alternative. The guidance is incomplete because the sibling list contains many other review classifiers (amazon, aliexpress, japanese, spanish, google-maps) that are not mentioned, so the routing rule is only partially drawn.

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.