LeoWorks Review & Lead Data Tools (via Apify MCP)
Server Details
Review classifiers & lead data for Google Maps, Naver and AliExpress as AI agent tools: Google Maps review sentiment classifier and lead qualifier, Korean, Japanese, Spanish and Amazon review classifiers, social comment, job posting and company website classifiers, Naver Shopping rank tracker, Naver Blog & AI Briefing monitors, K-beauty rankings (Olive Young Global, Amore Mall), AliExpress reviews & search. The official Apify MCP server (hosted by Apify) preconfigured with 15 LeoWorks actors. Sign in with Apify OAuth or an Apify token; billed per result on your Apify account.
- Status
- Healthy
- Uptime
- 96.6% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- illee/leoworks-data-tools-mcp
- GitHub Stars
- 0
TDQS
Scored across 19 tools
Most tools are clearly separated by platform or language (Amazon vs AliExpress vs Google Maps vs Korean/Japanese/Spanish review classifiers), and descriptions include explicit cross-references to guide selection. The main ambiguity is between generic Apify retrieval tools and actor-specific wrappers that also return output results.
The generic Apify tools follow a clean verb_noun kebab-case pattern, but the actor wrappers use a namespaced noun-phrase convention like leoworks--aliexpress-reviews-classifier. Each subgroup is internally consistent, but the overall set mixes two naming conventions.
19 tools is slightly heavy, but 15 are distinct Actor wrappers covering different platforms and languages, with four generic Apify support tools. The count is reasonable for a multi-source review and lead data toolkit rather than bloated with duplicates.
Core workflows are covered: actor execution/retrieval, dataset item access, key-value record access, and run abort/status checks. Minor gaps remain around listing datasets/key-value stores and generic actor execution, but agents can work around these using returned IDs.
Available Tools
19 toolsabort-actor-runAbort Actor runADestructiveIdempotentInspect
Abort an Actor run that is currently starting or running. For runs with status SUCCEEDED, FAILED, ABORTING, ABORTED, or TIMED-OUT, this call has no effect. The results will include the updated run details after the abort request.
USAGE:
Use when you need to stop a run that is taking too long or misconfigured.
USAGE EXAMPLES:
user_input: Abort run y2h7sK3Wc
user_input: Gracefully abort run y2h7sK3Wc
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run to abort. | |
| gracefully | No | If true, the Actor run will abort gracefully with a 30-second timeout. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the no-effect-on-terminal-states rule, which is exactly what makes the idempotent hint meaningful, plus the fact that updated run details come back. It omits auth/permission requirements and any rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the state constraint, and every prose sentence earns its place. The 'USAGE EXAMPLES' block of raw user_input lines is mostly decorative and pads the definition slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be spelled out, and the description still notes that updated run details are returned. For a two-parameter mutation with full annotation coverage, only auth requirements are unaddressed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters and the 30-second graceful-abort timeout are already documented in the schema. The description only gestures at 'gracefully' via an example, adding no syntax or semantic meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Abort) plus resource (Actor run) and a state qualifier ('currently starting or running'), which immediately distinguishes it from siblings like call-actor and get-actor-run. An agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('stop a run that is taking too long or misconfigured') and an explicit no-op condition (terminal statuses such as SUCCEEDED, FAILED, ABORTED, TIMED-OUT). It does not name an alternative tool or describe prerequisites, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-actor-runGet Actor runARead-onlyIdempotentInspect
Get detailed information about a specific Actor run.
Returns run result: status, storages (datasets/keyValueStores alias map), stats, summary, nextStep.
summary describes the past (e.g. "SUCCEEDED in 22s. 47 items; 3 fields available.").
nextStep prescribes one primary follow-up action with identifiers interpolated (e.g. "Use get-dataset-items with datasetId=...").
waitSecs (0–45, default 30) waits up to that many seconds for terminal status before returning.
USAGE:
Use to check the status of a run started by any Actor-running tool.
Pass waitSecs > 0 to block until terminal (or until the cap elapses).
USAGE EXAMPLES:
user_input: Show details of run y2h7sK3Wc
user_input: Wait for run y2h7sK3Wc to finish
| Name | Required | Description | Default |
|---|---|---|---|
| runId | Yes | The ID of the Actor run. | |
| waitSecs | No | Maximum seconds to wait for the run to reach a terminal state (SUCCEEDED, FAILED, ABORTED, TIMED-OUT). 0 returns immediately with the current status. Cap: 45. Default: 30. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, but the description adds real behavioral context beyond them: the summary vs. nextStep semantics, and that waitSecs blocks for up to 45s (default 30) before returning the current state. This is substantive added value, though it doesn't cover error/failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then segmented into Returns/USAGE/EXAMPLES blocks. Every line carries information, though the two usage examples are somewhat redundant with the USAGE prose, adding minor length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% parameter coverage, the description need only orient the agent, which it does fully: purpose, when to use, wait semantics, and concrete invocation examples. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 goes further by framing waitSecs as a blocking/wait mechanism with its cap and default, and by describing what runId's run produces. Slight above-baseline value over the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get detailed information about a specific Actor run') and enumerates the returned result fields (status, storages, stats, summary, nextStep). It does not explicitly distinguish itself from siblings like call-actor or abort-actor-run, so it falls just short of the 5 benchmark.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USAGE block names the condition ('check the status of a run started by any Actor-running tool') and explains when to pass waitSecs > 0 to block until terminal. It gives clear context but stops short of explicit exclusions or naming the sibling to use for other run operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-dataset-itemsGet dataset itemsARead-onlyIdempotentInspect
Get items (rows) from a dataset — the output/results produced by an Actor run. Returns the rows themselves, not dataset metadata, counts, or a schema. When the user provides a datasetId and asks to retrieve results, output, data, or rows, call this tool directly. Default limit is 20. Use clean=true to skip empty items and hidden fields.
USAGE:
Use when you need to read data from a dataset (all items or only selected fields).
USAGE EXAMPLES:
user_input: Retrieve results from dataset abc123
user_input: Get only metadata.url and title from dataset username~my-dataset
| Name | Required | Description | Default |
|---|---|---|---|
| desc | No | If true, results are returned in reverse order (newest to oldest). | |
| omit | No | Comma-separated list of fields to exclude from results. | |
| clean | No | If true, returns only non-empty items and skips hidden fields (starting with #). Shortcut for skipHidden=true and skipEmpty=true. | |
| limit | No | Maximum number of items to return. Default is 20. | |
| fields | No | Comma-separated list of fields to include in results. Fields in output are sorted as specified. Use dot notation for nested objects (e.g. "metadata.url"); the server auto-flattens parent prefixes. | |
| offset | No | Number of items to skip at the start. Default is 0. | |
| flatten | No | Comma-separated list of fields to flatten (e.g. flatten="metadata" turns {"metadata":{"url":"x"}} into {"metadata.url":"x"}). Normally derived automatically from dot-notation in `fields`; specify only as a diagnostic override. | |
| datasetId | Yes | Dataset ID or username~dataset-name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | Dataset items |
| limit | Yes | Limit used for pagination |
| offset | Yes | Offset used for pagination |
| summary | Yes | Summary of the result |
| nextStep | Yes | One follow-up action with tool name |
| datasetId | Yes | Dataset ID |
| itemCount | Yes | Number of items returned |
| totalItemCount | Yes | Total items in dataset |
| apifyConsoleUrl | No | Personalized Apify Console link to the dataset; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint=true and idempotentHint=true, the description adds valuable behavioral context: returns rows themselves, default limit of 20, and clean=true behavior. It also clarifies the nature of the return value beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with clear USAGE and USAGE EXAMPLES sections. Some redundancy ('Get items (rows)...' and 'Returns the rows themselves...') but overall efficient and front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 8 parameters, an output schema, and rich annotations, the description adequately covers key behaviors, usage triggers, and examples. It doesn't explain every parameter but relies on the schema for that, which is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds extra meaning by explaining default limit (20) and the clean=true shortcut, which supplements the schema. It also provides examples for fields usage, though most parameter semantics are in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool gets items (rows) from a dataset and explicitly distinguishes it from metadata, counts, or schema. It names the exact resource (dataset items) and the action (get), and provides direct trigger phrases for when to use it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit use cases ('when the user provides a datasetId and asks to retrieve results...'), and clarifies what it is not for (metadata, counts, schema). However, it does not name alternative tools explicitly, only implies them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get-key-value-store-recordGet key-value store recordARead-onlyIdempotentInspect
Get the value stored under a specific key in a key-value store — a single record, not a listing of all keys. Requires the exact key name. The response preserves the original Content-Encoding; most clients handle decompression automatically.
USAGE:
Use when you need to retrieve a specific record (JSON, text, or binary) from a store.
USAGE EXAMPLES:
user_input: Get record INPUT from store abc123
user_input: Get record data.json from store username~my-store
| Name | Required | Description | Default |
|---|---|---|---|
| recordKey | Yes | Key of the record to retrieve. | |
| keyValueStoreId | Yes | Key-value store ID or username~store-name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | Record key |
| value | Yes | The stored value (JSON, text, or binary) |
| summary | Yes | Summary of the result |
| contentType | No | MIME type of the stored value |
| keyValueStoreId | Yes | Key-value store ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior. The description adds genuine context beyond that: the exact key name is required, and the response preserves the original Content-Encoding with most clients decompressing automatically. That encoding note is real operational value an agent would otherwise not know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and scope, then a short behavioral note, then usage. The USAGE line slightly overlaps the first sentence, but the examples earn their space by showing realistic inputs. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present there is no need to describe return values, and the annotations carry the safety profile. For a two-parameter read tool, the description supplies everything else an agent needs: exactness of the key, allowed value types, and the encoding caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 still adds a semantic constraint the schema omits — that the key must be an exact match — and the examples show the 'username~my-store' form of the store ID, gently reinforcing the ID format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (get) + resource (value under a key in a key-value store) with an explicit scope boundary: 'a single record, not a listing of all keys.' None of the sibling tools overlap with this resource, and the anti-scope clause removes any ambiguity about whether it enumerates keys.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The USAGE line gives a clear triggering condition — retrieving a specific record (JSON, text, or binary) — and two concrete examples anchor it. It lacks explicit when-not-to-use guidance or named alternatives, but no similar sibling exists to route against.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--aliexpress-reviews-classifierleoworks/aliexpress-reviews-classifierADestructiveInspect
This tool calls the Actor "leoworks/aliexpress-reviews-classifier" and retrieves its output results. Actor description: AliExpress reviews scraper with review analysis: translation, stars, country, photos; AliExpress review complaints and sentiment. Use for known products; for keyword search use leoworks/aliexpress-search-scraper. productUrls or IDs. No login, ~8 min/1,000 reviews, pay per review.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Two-letter country code used for the request (affects which reviews AliExpress shows first and the translation language base). Default US. Example values: "US" | US |
| keywords | No | Keep only reviews whose text, English translation or follow-up contains one of these words (not case-sensitive), e.g. "broken", "battery", "size". | |
| maxStars | No | Keep only reviews with at most this many stars — e.g. 3 to read only the critical ones before sourcing a product. | |
| minStars | No | Keep only reviews with at least this many stars. Leave empty for all. | |
| waitSecs | No | Max 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. | |
| monitorKey | No | Any name for this watch list, e.g. `my-suppliers`. Run again with the same key and each product row gets `previousRunAt`, `ratingDelta`, `newReviews` and `newCriticalIssues` (new reviews that need action) — the change since the last run with that key; the first run only saves the baseline. Leave empty to switch comparison off. [Description truncated] | |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| productUrls | Yes | **REQUIRED** AliExpress product pages (any site: www.aliexpress.com, aliexpress.us, ko.aliexpress.com …) or product IDs, e.g. https://www.aliexpress.com/item/1005008549911526.html or 1005008549911526. Example values: ["https://www.aliexpress.com/item/1005008549911526.html"] | |
| customLabels | No | Up to 10 yes/no criteria in plain language, e.g. "arrived broken or damaged", "mentions the battery", "looks different from the photos". Each classified review gets a probability and `matched` per label. Included in the classification price. | |
| photoJudging | No | Adds `photoEvidence` (supports_complaint_product, supports_complaint_packaging, damage_seen_text_silent, no_evidence, not_product_photo) and puts photo-backed product defects, then photo-backed packaging damage, at the top of ACTION_QUEUE.csv. "Only reviews with a complaint or 3 stars or fewer" judges far fewer photos and is the recommended setting. Example values: "off" | off |
| photoMaxSide | No | Longest side in pixels requested from the photo server (512, 768 or 1024; other values are rounded). Smaller is faster; photos under 280 pixels on the short side are skipped. Example values: 768 | |
| reviewFilter | No | Reviews come in AliExpress' default order. Star and date sorting are not offered by the source. "Only reviews from buyers in the shipping country" uses the Shipping country under Advanced. Example values: "all" | all |
| buyerCountries | No | Keep only reviews from buyers in these countries (two-letter codes, e.g. US, FR, BR). | |
| maxConcurrency | No | Products processed in parallel. Example values: 5 | |
| classifyReviews | No | Add complaint types (delivery, quality/defect, size/fit, price/value, customer service, packaging, no effect, skin/body reaction, other), sentiment and purchase motive to each review. Reviews in other languages are classified from AliExpress' English translation. Adds $0.5 per 1,000 classified reviews on top of the $1.5 per 1,000 collection price — turn off for collection only. Example values: true | |
| includeStarOnly | No | AliExpress has many reviews with a star rating but no text or photos. They are skipped (not charged) by default; turn this on to collect them too (charged as review). | |
| reviewsNewerThan | No | A date (`2026-09-01`) or a period (`30 days`, `6 months`). | |
| reviewsPerProduct | No | Maximum reviews to collect for each product (charged per review: $1.5 per 1,000, or $2.0 per 1,000 with AI classification). The form starts at 20 for a quick, low-cost first run; raise it up to 5,000 (default when omitted via API: 100). Example values: 20 | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type to be reported. Example values: 0.5 | |
| maxPhotosPerReview | No | The first photos of each review. With "All reviews that have photos", at most 2 photos per review are judged. Example values: 2 | |
| proxyConfiguration | No | Default Apify datacenter proxy works. Example values: {"useApifyProxy":true} | |
| residentialFallback | No | Retry failing requests through residential proxy in the shipping country. Example values: true |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint and destructiveHint, and the description adds genuinely useful context beyond them: no login required, ~8 minutes per 1,000 reviews, and pay-per-review cost. It does not explain the destructiveHint=true flag (a paid, credit-consuming run), leaving the agent to infer why the tool is marked destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The Actor description is dense and front-loaded, packing scope, alternative, input form, auth, runtime and pricing into a few clauses. The leading 'This tool calls the Actor ... and retrieves its output results' sentence is pure boilerplate that earns no place, keeping it just below top marks.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the 22 parameters are fully described in the schema. The description covers the key operational facts an agent needs before a paid, long-running scrape, though it doesn't mention the waitSecs/nextStep polling behavior or the monitorKey comparison feature.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 22 parameters, so the schema already documents country, keywords, star filters, pricing, proxy and the rest. The description adds only 'productUrls or IDs' for the required argument, which the schema already states — baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource — scraping AliExpress reviews and analyzing them (translation, stars, country, photos, complaints, sentiment) — and explicitly distinguishes itself from the sibling keyword-search scraper. The one generic sentence about 'calls the Actor and retrieves output' is boilerplate, but the Actor description that follows carries the real purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the selecting condition ('Use for known products') and names the alternative for the other case ('for keyword search use leoworks/aliexpress-search-scraper'), plus the accepted input form (product URLs or IDs). An agent can route between this tool and its closest sibling without opening either schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--aliexpress-search-scraperleoworks/aliexpress-search-scraperADestructiveInspect
This tool calls the Actor "leoworks/aliexpress-search-scraper" and retrieves its output results. Actor description: AliExpress search scraper: rank, price, sold count, ads flagged. AliExpress rank tracker mode. Use for search, price and sold count; for reviews use leoworks/aliexpress-reviews-classifier. keywords (+ tracked products). No login, ~6 s/20 results, rank history in your key-value store. Pay per result.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order of the search results. Example values: "best_match" | best_match |
| country | No | Two-letter country code. Results, prices and product IDs depend on the region; the proxy exits in this country. Example values: "US" | US |
| currency | No | Three-letter currency code for prices (e.g. USD, EUR, GBP). Example values: "USD" | USD |
| keywords | Yes | **REQUIRED** Search terms, one per line (e.g. wireless earbuds, phone case). Example values: ["wireless earbuds"] | |
| maxPages | No | 60 products per page. Search mode: an upper bound next to the result cap (default 60 pages). Rank mode: how deep to look for tracked products (default 5 = top 300, up to 60). | |
| waitSecs | No | Max 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. | |
| includeAds | No | Keep sponsored products in search-mode results (flagged isAd). Organic rank never counts ads. Example values: true | |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| trackProducts | No | Optional. Product URLs or IDs (any AliExpress site). When set, the Actor runs in rank mode: one row per keyword × product with its organic rank (ads excluded), position, page, and the change since the previous run — or 'not found within N'. Charged as keyword-checked instead of per result. | |
| maxConcurrency | No | Keywords processed in parallel. Example values: 3 | |
| rankHistoryStore | No | Key-value store in your account that keeps the last rank of each keyword × product, so each row shows previousRank, rankChange (positive = moved up) and isNew. Leave empty to turn off. No extra charge. Example values: "aliexpress-rank-history" | aliexpress-rank-history |
| proxyConfiguration | No | Default Apify datacenter proxy (in the shipping country) works. Example values: {"useApifyProxy":true} | |
| residentialFallback | No | Retry failing pages through residential proxy in the shipping country. Example values: true | |
| maxResultsPerKeyword | No | Stop after this many products per keyword. Applied before the page count. Starts at 20 for a quick, low-cost first run; raise it up to 3,600 (60 pages). Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely useful behavior beyond the annotations: 'No login, ~6 s/20 results, rank history in your key-value store. Pay per result' discloses auth requirements, latency, cost model, and the fact that the tool persists state into the user's key-value store — which explains the destructiveHint=true for what looks like a read-only scrape. It stops short of saying what happens to the KV store on repeated runs or what the run-status/polling behavior is at the waitSecs cap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The text is compact and wastes few words, but it reads as a semicolon-chained run-on with no clear separation between purpose, usage, and operational notes. The lead sentence is boilerplate that delays the useful content rather than front-loading it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers the remaining gaps an agent would worry about: no login, approximate runtime, per-result pricing, and persistent rank history. Given 14 parameters and a dual search/rank mode, a bit more guidance on choosing between the two modes would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 14 parameters, so the baseline is 3. The description adds only a light nudge — 'keywords (+ tracked products)' hints that supplying tracked products switches to rank mode — while sort, country, currency, maxResultsPerKeyword, and the proxy parameters are left entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource and outputs (AliExpress search results with rank, price, sold count, and flagged ads) and explicitly contrasts itself with the reviews sibling. The opening line ('This tool calls the Actor ... and retrieves its output results') is generic wrapper boilerplate, but the actor description that follows carries genuine purpose detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for search, price and sold count; for reviews use leoworks/aliexpress-reviews-classifier' gives an explicit when-to-use and a named alternative, which is exactly what an agent needs to pick between the two AliExpress tools. It does not state exclusions beyond reviews, and mode selection (search vs. rank) is deferred to the trackProducts parameter rather than explained here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--amazon-review-classifierleoworks/amazon-review-classifierADestructiveInspect
This tool calls the Actor "leoworks/amazon-review-classifier" and retrieves its output results. Actor description: Amazon review analysis: complaints, return reasons, praise, sentiment. products = ASINs/URLs (collected by junglee, billed to you ~$6/1k; Free plan 10 reviews/run; ~$6.5/1k all-in), or datasetId from any scraper, or texts. For AliExpress use leoworks/aliexpress-reviews-classifier.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste review texts directly (one per line). Use this OR “Reviews dataset”. Example values: ["Stopped charging after two weeks. Returning it.","Fits great but the fabric is see-through when I squat."] | |
| idFields | No | Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, productAsin). Leave empty to auto-pick reviewId and the product ASIN. | |
| maxItems | No | Classify at most this many reviews (0 = all). | |
| maxStars | No | For example 3 = classify only 1–3 star reviews (where complaints and returns are). 0 = all ratings. Reviews without a star rating are kept. | |
| products | No | One product per line, up to 20: the 10-character ASIN (for example B0CWXNS552) or the product page URL (…/dp/ASIN; its marketplace is taken from the URL). The Actor then collects the reviews and classifies them in the same run. [Description truncated] | |
| waitSecs | No | Max 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. | |
| collector | No | The Amazon reviews scraper that collects for you. The default (junglee) returned and classified reviews in our test on amazon.com. The other is about six times cheaper but returned nothing for amazon.com in the same test — try it for other marketplaces. On the Free Apify plan, junglee returns at most 10 reviews per run (its own limit). Prices are the collectors' own and can change. Example values: "junglee/amazon-reviews-scraper" | junglee/amazon-reviews-scraper |
| datasetId | No | An Apify dataset containing Amazon reviews — for example the output of an Amazon reviews scraper. Use this OR “Products” (not both) OR “Review texts”. | |
| dateField | No | Leave empty to auto-detect (date, reviewDate, reviewedIn, …). Used for the monthly trend, the last-90-days comparison and the date filter. | |
| textField | No | Field holding the review text. Leave empty to auto-detect (reviewDescription, reviewText, text, body, …). | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| photoField | No | Field with the picture addresses of each review. Auto-detected (reviewImages, reviewImageUrls, images, imageUrls, photos); set it only if your scraper uses another name. | |
| collectSort | No | Which reviews to collect first. Newest first is the least biased sample of what buyers say now. Example values: "recent" | recent |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| marketplace | No | Which Amazon site the ASINs in “Products” belong to. A product URL carries its own marketplace and overrides this. Example values: "com" | com |
| ratingField | No | Leave empty to auto-detect (ratingScore, rating, stars, …). | |
| customLabels | No | Up to 10 extra yes/no labels (each up to 200 characters) in plain language, e.g. “mentions the battery”, “compares with another brand”. Each gets a probability. | |
| photoJudging | No | Adds `photoEvidence` (supports_complaint_product, supports_complaint_packaging, damage_seen_text_silent, no_evidence, not_product_photo) and puts photo-backed product defects, then photo-backed packaging damage, at the top of ACTION_QUEUE.csv. "Only reviews with a complaint or 3 stars or fewer" judges far fewer photos and is the recommended setting. Example values: "off" | off |
| photoMaxSide | No | Longest side in pixels requested from the photo server (512, 768 or 1024; other values are rounded). Amazon review photos arrive as 88 px thumbnails, so a larger version is requested. Photos under 280 pixels on the short side are skipped. Example values: 768 | |
| variantField | No | Leave empty to auto-detect (variant, variantName, …). Used for the worst-variants breakdown. | |
| verifiedOnly | No | Skip reviews not marked as a verified purchase (needs a field such as `isVerified`). | |
| maxConcurrency | No | Reviews classified in parallel. Example values: 10 | |
| extraTextFields | No | Fields to prepend to the text (up to 5). Leave empty to add the review headline automatically (reviewTitle). | |
| reviewsNewerThan | No | Classify only reviews published after this date — a date like `2026-01-01` or a period like `90 days`, `6 months`, `1 year`. Needs a review date in the dataset (e.g. `date`). Leave empty for all. | |
| summaryGroupField | No | Field in your dataset that identifies the product (e.g. `productAsin`). The run then saves a REPORT record with, per product: complaint rate and complaint mix, sentiment shares, average stars, share of reviews with a return or refund and 3 example complaints. Leave empty to detect it automatically. No extra charge. | |
| complaintThreshold | No | Minimum probability (0–1) for the strongest complaint type, the return-intent flag or a custom label to be reported. Example values: 0.5 | |
| maxPhotosPerReview | No | The first photos of each review. With "All reviews that have photos", at most 2 photos per review are judged. Example values: 2 | |
| secondaryThreshold | No | Minimum probability (0–1) for any further complaint type after the strongest one. Product complaints overlap (a weak item can also feel uncomfortable), so side labels need to be surer. Lower it to see more labels per review. Example values: 0.8 | |
| maxReviewsPerProduct | No | Classify at most this many reviews per product (ASIN), in dataset order. 0 = no limit. | |
| collectReviewsPerProduct | No | How many reviews to collect for each product (1 to 100). You pay the collector for each one, so a lower number is cheaper; “Max reviews per product” below limits only how many are classified. Example values: 50 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, but the description adds substantial context annotations cannot carry: per-review billing (~$6/1k collector, $0.0005 classified), Free-plan caps, no-login/no-cookies collection, and the ~100 reviews/product ceiling. It never explains the destructive/state-creating nature, which is the one notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences followed by the compact actor summary; the primary function is front-loaded before the sourcing and pricing details. It is dense but every clause carries routing or cost information rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 30-parameter, zero-required, output-schema-backed tool, the description supplies the routing, billing, and sourcing facts an agent needs before committing to a paid run. Return values are covered by the output schema, so remaining detail lives in the right place.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% across all 30 parameters, so the schema already documents inputs thoroughly, including the mutual exclusivity of products/datasetId/texts. The description restates the input modes and cost tiers rather than adding new parameter meaning, so a baseline 3 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('calls the Actor leoworks/amazon-review-classifier and retrieves its output'), and the actor summary pinpoints the function: complaints, return reasons, praise, sentiment. It also names the sibling to use for a different marketplace (AliExpress), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes AliExpress traffic to leoworks/aliexpress-reviews-classifier and lays out the three input modes (products, datasetId, texts) with cost implications. It stops short of a full when-not-to-use statement, but the branching guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--company-website-classifierleoworks/company-website-classifierADestructiveInspect
This tool calls the Actor "leoworks/company-website-classifier" and retrieves its output results. Actor description: Classify company websites from your crawl: industry, B2B or B2C, reach, ICP fit scoring with tier and reason. Use for company sites; for Google Maps places use leoworks/google-maps-lead-qualifier. datasetId = crawled pages (grouped by site) or pages JSON. ~200 sites/6 s, pay per company.
| Name | Required | Description | Default |
|---|---|---|---|
| icp | No | Describe the companies you want as leads in plain language, e.g. “B2B software companies selling to retailers” or “Independent dental practices (not chains)”. Each website gets a fit score (0–100). Leave empty to get only the company labels. Example values: "Independent dental practices (not chains)" | |
| pages | No | Pages pasted as JSON objects with “url” and “text” (optionally “title”). Pages with the same host are treated as one company. Use this OR “Crawled pages dataset”. Example values: [{"url":"https://acme-analytics.example.com/","title":"Acme Analytics — demand forecasting for retailers","text":"Acme Analytics helps mid-size retailers forecast demand. Connect Shopify, NetSuite or your POS, and get store-level forecasts every morning. Trusted by 300 retail brands in the US, UK and Canada. Start a 14-day free trial — plans from $49 per month."},{"url":"https://brightsmile-dental.example.org/","title":"Bright Smile Dental — family dentist in Austin, TX","text":"Bright Smile Dental is a family-owned dental practice in South Austin. Dr. Lee and our team offer cleanings, fillings, Invisalign and same-day crowns. New patients welcome — call or book online. We accept most PPO insurance plans."}] | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset of crawled website pages — for example the output of Website Content Crawler. Pages are grouped by website (host without “www.”), and each website is classified once. Use this OR “Pages”. | |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| customLabels | No | Up to 10 extra yes/no checks (each up to 200 characters) in plain language, e.g. “offers a free trial”, “mentions HIPAA compliance”, “has offices in Europe”. Each gets a probability. | |
| maxCompanies | No | Classify at most this many websites (0 = all). | |
| requireEmail | No | Skip (not charged) websites where no email address was found on the crawled pages. | |
| matchThreshold | No | Minimum fit probability (0–1) for a website to be marked as qualified. Example values: 0.5 | |
| maxConcurrency | No | Websites classified in parallel. Example values: 10 | |
| expectedWebsites | No | The websites you asked the crawler to visit (its start URLs). Any that have no crawled page are listed in the output as missing (not charged), so you know which ones to crawl again with a browser crawler. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true), so the bar is lower. The description adds genuinely useful behavioral context beyond them: throughput ('~200 sites/6 s') and a cost model ('pay per company'), which matter for a paid, stateful Actor run. It does not explain the destructive flag directly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then classification scope, then usage routing, then input/cost notes. The opening line ('This tool calls the Actor ... and retrieves its output results') is boilerplate but short. Overall efficient, one minor piece of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 11-param classifier with an output schema (so return values needn't be explained) plus rich annotation coverage, the description supplies purpose, scope, an alternative, both input modes, and cost/rate context. Nothing essential for correct invocation is missing, though destructive/cost semantics could be spelled out further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all 11 parameters in depth. The description only adds a brief summary of the datasetId/pages relationship ('crawled pages (grouped by site) or pages JSON'), which is already covered by the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Classify company websites from your crawl' — and enumerates the outputs (industry, B2B/B2C, reach, ICP fit scoring with tier and reason). It explicitly differentiates from the sibling it could be confused with: 'for Google Maps places use leoworks/google-maps-lead-qualifier.' An agent can pick this 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context ('Use for company sites') and names the concrete alternative for the Google-Maps case. It also clarifies the two valid input modes (datasetId vs pages JSON). No explicit 'when-not-to-use' beyond the one sibling pointer, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--google-maps-lead-qualifierleoworks/google-maps-lead-qualifierADestructiveInspect
This tool calls the Actor "leoworks/google-maps-lead-qualifier" and retrieves its output results. Actor description: Google Maps reviews toolkit by LeoWorks — lead scoring for ICP fit (score 0–100, tier A–D, reason). For reviews use leoworks/google-maps-review-classifier. icp text + places, datasetId or search terms + location. ~3 s/60 places, ~$6/1,000 (compass billed to you).
| Name | Required | Description | Default |
|---|---|---|---|
| icp | Yes | **REQUIRED** Describe the businesses you want as leads, in plain language — e.g. “Independent gyms that offer personal training”, “Dental practices that offer cosmetic dentistry such as veneers”. Each place gets a lead score (0–100) for how well it fits. Example values: "Dental practices that offer cosmetic dentistry such as teeth whitening, veneers or smile makeovers." | |
| places | No | Place objects pasted as JSON (same fields as a Google Maps scraper's output: title, categoryName, categories, additionalInfo, website, phone, totalScore, reviewsCount …). Use this OR “Places dataset” OR “Search terms”. Example values: [{"title":"Kimberly Smiles Cosmetic & General Dentistry","categoryName":"Dentist","categories":["Dentist","Cosmetic dentist","Emergency dental service","Oral surgeon","Teeth whitening service"],"website":"https://dentistwickerparkchicago.com/","phone":"(773) 276-1047","city":"Chicago","totalScore":4.7,"reviewsCount":484},{"title":"Kids Tooth Team","categoryName":"Pediatric dentist","categories":["Pediatric dentist","Dental clinic","Dental hygienist","Dentist","Emergency dental service"],"website":"https://kidstoothteam.com/locations/our-south-austin-office/","phone":"(512) 641-4914","city":"Austin","totalScore":4.9,"reviewsCount":740,"additionalInfo":{"Service options":[{"English":true}],"Offerings":[{"Emergency services":true},{"Pediatric care":true},{"Sedation dentistry":true}]}}] | |
| location | No | Where to search, for example “Chicago, USA” or “Seoul, South Korea”. Required when you use Search terms (without it the scraper searches around a US data center). One location per run; to cover several cities, run once per city. Ignored with “Places dataset” or “Places”. | |
| maxItems | No | Process at most this many places (0 = all). | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset of Google Maps places — for example the output of a Google Maps scraper you ran earlier. Use this OR “Search terms” OR “Places”. | |
| minRating | No | Free pre-filter: skip places rated below this (0 = off). Skipped places are not charged. | |
| minReviews | No | Free pre-filter: skip places with fewer reviews (0 = off). | |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| photoLabels | No | Up to 5 extra yes/no checks about what the photo shows, e.g. “has a garden”, “glass storefront” (each up to 200 characters). Needs "Judge the place photo". Not measured: treat the answers as a hint. | |
| customLabels | No | Up to 10 extra yes/no checks (each up to 200 characters) in plain language, e.g. “offers online booking”, “looks like a premium / high-end business”. Each gets a probability. | |
| photoMaxSide | No | Longest side in pixels of the photo that is judged (512, 768 or 1024; other values are rounded to the nearest). 1024 reads signs best; smaller is faster. Example values: 1024 | |
| requireEmail | No | Keep only places with an email address — needs a scraper that collects emails (e.g. Google Maps with Contact Details, or the Google Maps Scraper's contact add-on). | |
| requirePhone | No | Free pre-filter: skip places without a phone number. | |
| excludeChains | No | Mark chain and franchise locations as not qualified (they are still checked and charged, with `chain` in the output). | |
| excludeClosed | No | Free pre-filter: skip permanently or temporarily closed places. Example values: true | |
| onlyUnclaimed | No | Keep only listings the owner has not claimed on Google Maps (when the scraper reports it). | |
| searchQueries | No | Optional. What you would type in the Google Maps search box, one per line, up to 5 — for example “independent dentist”. Needs “Location” below. The Actor then runs compass’ Google Maps scraper (compass/crawler-google-places) for you and scores the places it finds. [Description truncated] | |
| matchThreshold | No | Minimum lead score (as a probability 0–1) for a place to count as qualified. Example values: 0.5 | |
| maxConcurrency | No | Places checked in parallel. Example values: 10 | |
| requireWebsite | No | Free pre-filter: skip places without a website. | |
| excludeKeywords | No | Free filter: places whose name or categories contain any of these words are removed before judging, e.g. "hospital", "Aspen Dental". Not case-sensitive. | |
| judgePlacePhotos | No | Beta, off by default. For each qualified place, looks at its main Google Maps photo and adds: independent business or known chain, outdoor seating seen, condition of the building (0–4). Costs $0.001 for each photo that gives at least one value (a photo that shows none of them is not charged). The photo is sent to TypeSafe only to be judged and is not stored. [Description truncated] | |
| maxPlacesPerSearch | No | Only used with Search terms: how many places the scraper collects for each term (default 20, at most 200; at most 500 places in total per run). You are billed for every place it collects. If your maximum cost per run is lower than the estimate, the Actor shrinks this number or refuses to start. Example values: 20 | |
| onlyWithoutWebsite | No | For web agencies: keep only businesses that have no website on Google Maps. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, destructiveHint=true. The description adds genuine non-schema context — throughput (~3 s/60 places) and cost (~$6/1,000, with 'compass billed to you'). It does not explain what is actually destroyed/consumed or any auth requirements, so it is useful but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and then the actor's purpose and cost/perf facts. Dense and mostly free of waste, though the 'Actor description:' framing is slightly mechanical.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description still summarizes the output (score, tier, reason). For a 25-parameter, paid, open-world tool it covers routing, inputs, cost and speed adequately, leaving only deeper behavioral detail unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there are 25 parameters, so the schema carries the parameter detail. The description only summarizes the high-level input combinations (icp + places/datasetId/search terms + location) without adding format or constraint meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('calls the Actor leoworks/google-maps-lead-qualifier and retrieves its output results') and the actor's purpose ('lead scoring for ICP fit (score 0–100, tier A–D, reason)'). It also names a sibling (review classifier) as the alternative for a different task, so an agent can distinguish it. It falls short of 5 because it doesn't contrast against the many other classifier siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes one scenario explicitly ('For reviews use leoworks/google-maps-review-classifier') and lists the accepted input combinations ('icp text + places, datasetId or search terms + location'). It gives clear context for invocation but no explicit when-not-to-use beyond the review case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--google-maps-review-classifierleoworks/google-maps-review-classifierADestructiveInspect
This tool calls the Actor "leoworks/google-maps-review-classifier" and retrieves its output results. Actor description: Google Maps reviews toolkit by LeoWorks — review analysis: complaints, praise, sentiment, reply queue. For leads use leoworks/google-maps-lead-qualifier. places = Maps URLs/IDs or names + location; datasetId = reviews. ~25 s/place, ~$1.10/1,000 (compass billed to you).
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste review texts directly (one per line) when you already have them and do not want to use a dataset. Ignored when “Places” or “Reviews dataset” is set. | |
| places | No | One place per line, up to 20. PREFERRED: the place's Google Maps URL or place ID (starts with ChIJ) — it names the exact branch, and you can leave “Location” below empty. For a URL, open the place on Google Maps and copy the full address-bar URL (the long one with “data=!…”), or the “cid” / “place_id” form; search-result pages and coordinates-only URLs do not work. [Description truncated] Example values: ["https://www.google.com/maps/search/?api=1&query=Joe's%20Pizza%20Broadway&query_place_id=ChIJifIePKtZwokRVZ-UdRGkZzs","https://www.google.com/maps/search/?api=1&query=Katz's%20Delicatessen&query_place_id=ChIJCar0f49ZwokR6ozLV-dHNTE"] | |
| idFields | No | Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, placeId). Leave empty to auto-pick reviewId and placeId. | |
| location | No | Where to search for the brand or business names in “Places”, for example “Seoul, South Korea” or “Chicago, USA” — one location per run; city + country works best. Required when any line in “Places” is a name. Leave empty when all lines are Google Maps URLs or place IDs (they already identify the exact place). Names in different cities: use their URLs or place IDs instead. | |
| maxItems | No | Classify at most this many reviews (0 = all). | |
| maxStars | No | For example 3 = classify only 1–3 star reviews (the ones that usually need attention). 0 = all ratings. Reviews without a star rating are kept. | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset containing Google Maps reviews — for example the output of a Google Maps reviews scraper. Use this OR “Places” (not both); it takes priority over “Review texts”. | |
| dateField | No | Leave empty to auto-detect (publishedAtDate, date, …). Used for the monthly trend, the last-90-days comparison and the date filter. | |
| textField | No | Field holding the review text. Leave empty to auto-detect (text, reviewText, review, …). | |
| monitorKey | No | Any name for this watch list, e.g. `my-cafes`. Run again with the same key and each place row gets `previousRunAt`, `ratingDelta`, `newReviews`, `newCriticalIssues` and `unrepliedDelta` (change since the last run with that key; the first run only saves the baseline). Leave empty to switch comparison off. [Description truncated] | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| ratingField | No | Leave empty to auto-detect (stars, rating, …). | |
| customLabels | No | Up to 10 extra yes/no labels (each up to 200 characters) in plain language, e.g. “mentions parking”, “complains about a specific employee”. Each gets a probability. | |
| maxConcurrency | No | Reviews classified in parallel. Example values: 10 | |
| placeNameField | No | Leave empty to auto-detect (title, placeName). Not `name` — in review datasets that is usually the reviewer. | |
| extraTextFields | No | Fields to prepend to the text (up to 5). Leave empty if unsure. | |
| ownerReplyField | No | Leave empty to auto-detect (responseFromOwnerText, ownerResponse, …). Used for “unanswered” and the reply queue. | |
| reviewsNewerThan | No | Classify only reviews published after this date — a date like `2026-01-01` or a period like `90 days`, `6 months`, `1 year`. Needs a review date in the dataset (e.g. `publishedAtDate`). Leave empty for all. | |
| summaryGroupField | No | Field in your dataset that identifies the business (e.g. `placeId`, `title`). The run then saves a REPORT record with, per place: complaint rate and complaint mix, sentiment shares, average rating, reviews needing an owner reply (and how many are still unanswered) and 3 example complaints. Leave empty to detect it automatically. No extra charge. | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type, the owner-reply flag or a custom label to be reported. Raise it for fewer, surer labels. Example values: 0.5 | |
| maxReviewsPerPlace | No | Classify at most this many reviews per place (counted in dataset order — Google Maps scrapers list the newest first when sorted by newest). With “Places”, this is how many of the newest reviews to collect per place (0 = 50). 0 = no limit for a dataset. Example values: 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true, openWorldHint=true), and the description adds real behavioral context beyond them: timing (~25 s/place) and cost (~$1.10/1,000, with the compass Actor billed to the caller). That cost/billing disclosure is valuable for a paid, externally-billed tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Short and front-loaded with the core action, then supporting routing/cost facts. Every sentence carries information, though the mix of Actor-wrapper boilerplate and parameter hints makes it slightly dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description provides the missing routing, cost, and sibling-alternative context for a 23-parameter tool. Adequate and complete enough for an agent to select and configure it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 23 parameters. The description adds only light routing hints (places vs datasetId), so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: it calls the 'leoworks/google-maps-review-classifier' Actor and retrieves its output, and summarizes the analysis domain (complaints, praise, sentiment, reply queue). It also distinguishes itself from the lead-qualifier sibling. Clear, though the purpose statement is somewhat buried under cost/parameter routing notes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names an alternative for a related task ('For leads use leoworks/google-maps-lead-qualifier') and clarifies the input routing ('places = Maps URLs/IDs or names + location; datasetId = reviews'). It lacks an explicit when-not-to-use statement, but the routing guidance is genuinely actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--japanese-review-classifierleoworks/japanese-review-classifierADestructiveInspect
This tool calls the Actor "leoworks/japanese-review-classifier" and retrieves its output results. Actor description: Classify Japanese reviews (Rakuten 楽天レビュー) into complaint types, sentiment and purchase motive — Japanese review sentiment analysis (レビュー分析). Use for Japanese; for Korean use leoworks/korean-review-classifier. datasetId (text auto-detected) or texts. ~100 reviews/5 s, pay per review.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste review texts directly (one per line). Use this OR “Reviews dataset”. Example values: ["ダンボールが潰れて届きました。中身は無事でしたが、梱包をもう少し丁寧にしてほしいです。","すぐ壊れました。充電できません。返品したいです。"] | |
| idFields | No | Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, productId). Leave empty to auto-pick reviewId/id/url. | |
| maxItems | No | Classify at most this many reviews (0 = all). | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset containing reviews — for example the output of a Rakuten review scraper. Use this OR “Review texts”. | |
| textField | No | Field holding the review text. Leave empty to auto-detect (content, text, review, body, reviewText, …). | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| customLabels | No | Up to 10 extra yes/no labels (each up to 200 characters) written in plain language (English or Japanese), e.g. “mentions the smell”, “配達員の対応が悪い”. Each gets a probability. | |
| maxConcurrency | No | Reviews classified in parallel. Example values: 10 | |
| extraTextFields | No | Fields to prepend to the text (up to 5), e.g. `title` for Coupang review headlines. Leave empty if unsure. | |
| summaryGroupField | No | Field in your dataset that identifies the product (e.g. `productId`, `productName`, `placeId`). The run then saves a REPORT record with, per product: complaint rate and complaint mix, sentiment shares, purchase motives, average rating and 3 example complaints. Leave empty to detect it automatically (overall summary only if none is found). No extra charge. | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type or custom label to be reported. Raise it for fewer, surer labels. Example values: 0.5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=true, which is misleading for what is essentially a classification read operation. The description adds useful throughput context (~100 reviews/5 s, pay per review, auto-detection of datasetId/texts), partially offsetting the annotation mismatch. However, it does not clarify the destructive-hint implication or the write/return profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and routing rule, then throughput and pricing. Slightly dense but no filler sentences; every clause about language, inputs, and cost is useful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a classifier with an output schema and rich schema descriptions, the description covers purpose, language routing, input options, throughput, and cost. It omits detail on the output format, but the output schema and per-parameter descriptions cover that. The mismatch with the destructive annotation is the one notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 13 parameters thoroughly. The description only adds the auto-detection behavior for datasetId/texts and the pricing model, which is marginal over what the schema provides. Baseline 3 is appropriate when the schema carries the load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource — classify Japanese reviews into complaint types, sentiment, and purchase motive — and explicitly distinguishes itself from the sibling leoworks/korean-review-classifier by language. An agent can route by language without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use this tool (Japanese reviews) and names the alternative for Korean. It does not spell out when-not to use it versus, say, the amazon or google-maps review classifiers, but the language scoping is a strong routing signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--job-posting-classifierleoworks/job-posting-classifierADestructiveInspect
This tool calls the Actor "leoworks/job-posting-classifier" and retrieves its output results. Actor description: Filter LinkedIn jobs and Indeed or Glassdoor postings: remote/hybrid/on-site, visa sponsorship jobs, USD salary. Job posting classifier. Use for job data; for company sites use leoworks/company-website-classifier. datasetId = jobs scraper output, or jobs JSON. ~180 jobs/9 s, pay per job.
| Name | Required | Description | Default |
|---|---|---|---|
| jobs | No | Postings pasted as JSON objects (title, company, location, description) or plain description strings. Use this OR “Job postings dataset”. Example values: [{"title":"Senior Data Analyst","company":"Example Co","location":"Chicago, IL","description":"Hybrid role: 3 days a week in our Chicago office. 5+ years of SQL and BI experience required. Full-time. Salary $110,000–$130,000 per year. We are unable to sponsor work visas."},{"title":"Warehouse Associate","company":"Example Logistics","location":"Dallas, TX","description":"Entry level — no experience needed, we train you. Part-time evening shifts, in person at our Dallas warehouse. $18/hour."}] | |
| skills | No | Up to 100 skills, tools or keywords (e.g. Python, SQL, Salesforce, CDL, RN license). Each posting gets a `skills` column with the ones it mentions — whole words, matched by code at no extra charge. Not case-sensitive, except short skills typed with a capital (`Go`, `R`, `C`): those must appear as typed, so the word "go" or "Go-to-Market" does not count as Go. Example values: ["Python","SQL","AWS","Excel","Salesforce"] | |
| maxItems | No | Classify at most this many postings (0 = all). | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset of job postings — for example the output of a LinkedIn or Indeed jobs scraper. Use this OR “Job postings”. | |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| customLabels | No | Up to 10 extra yes/no checks (each up to 200 characters) in plain language, e.g. “requires a security clearance”, “mentions Python”, “offers a signing bonus”. Each gets a probability. | |
| postedWithin | No | e.g. `7 days`, `2 weeks`, `1 month`. Older postings are skipped (not charged). Postings without a date are kept. | |
| maxPerCompany | No | Classify at most this many postings per company. 0 = no limit. | |
| titleExcludes | No | Free filter, e.g. "intern", "senior", "manager". | |
| titleIncludes | No | Free filter on the job title, e.g. "engineer", "nurse". Not case-sensitive. | |
| labelThreshold | No | Minimum probability (0–1) for a custom label to be marked as matched. Example values: 0.5 | |
| maxConcurrency | No | Postings classified in parallel. Example values: 10 | |
| dedupeAcrossBoards | No | The same job ID, or the same title + company + city (e.g. from LinkedIn and Indeed), is classified and charged once. Example values: true | |
| minDescriptionChars | No | Dataset postings with a shorter description (or none — some scrapers only return titles) are skipped and not charged: a title alone is not enough to judge work mode, experience or visa. Example values: 120 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare openWorldHint=true and destructiveHint=true, so the safety/open-world profile is covered structurally. The description adds genuinely non-redundant behavior: the billing model ('pay per job'), the throughput ('~180 jobs/9 s'), and that some inputs are skipped without charge (mentioned in schema-side params too). It does not explain that a run is created or how results are surfaced, but billing and rate context is meaningful beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is compact and front-loads the relevant information (purpose, alternative sibling, input source, cost). The middle fragment 'Job posting classifier.' is a near-tautological restatement of the title, and the 'Actor description:' prefix is mechanical, but overall there is little wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values, and it correctly defers to the schema for the 15 parameters. It covers domain, alternative tool, input source and cost/rate. The main gap is that it omits the jobs-or-datasetId input requirement, which an agent needs to call the tool successfully given 0 required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 15 parameters in detail; baseline is 3. The description adds only one clause of param meaning ('datasetId = jobs scraper output, or jobs JSON'), which mildly clarifies datasetId but duplicates the schema note 'Use this OR Job postings'. No additional syntax or defaulting semantics are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the Actor being invoked and the resource domain: filtering/classifying job postings from LinkedIn, Indeed or Glassdoor by work mode, visa sponsorship and USD salary. It also distinguishes itself from a sibling ('for company sites use leoworks/company-website-classifier'), so an agent can tell it apart from other classifiers. The boilerplate opener ('calls the Actor ... retrieves its output results') is generic, but the embedded actor description carries the real purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one explicit routing rule ('Use for job data; for company sites use leoworks/company-website-classifier') and states the cost/throughput profile ('~180 jobs/9 s, pay per job'). However it never states the precondition that the caller must supply either the jobs payload or a datasetId, and there are no when-not-to-use conditions for the many filtering parameters. Usage is implied rather than fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--kbeauty-ranking-review-monitorleoworks/kbeauty-ranking-review-monitorADestructiveInspect
This tool calls the Actor "leoworks/kbeauty-ranking-review-monitor" and retrieves its output results. Actor description: Track Olive Young rankings and K-beauty bestsellers on Olive Young Global and Amore Mall (아모레몰); collect reviews. Use for rankings; for existing reviews use leoworks/korean-review-classifier. reviewsPerProduct 0 = rankings only. No login, rank history in your key-value store. Pay per item.
| Name | Required | Description | Default |
|---|---|---|---|
| brands | No | Optional. Keep only products of these brands (English or Korean name, e.g. COSRX, 설화수). The whole ranking (up to 100) is searched and the original rank is kept. | |
| sources | No | Which bestseller rankings to collect. Leave empty to only collect reviews for the product pages below. Example values: ["oliveyoung_global"] | |
| waitSecs | No | Max 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. | |
| reviewSort | No | Amore Mall supports Newest and Most helpful; other orders fall back to Newest there. Example values: "newest" | newest |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| productUrls | No | Optional. Olive Young Global or Amore Mall product pages to collect reviews for, in addition to the ranked products. | |
| maxConcurrency | No | Rankings and products processed in parallel. Example values: 5 | |
| amoremallPeriod | No | Ranking period on Amore Mall. Example values: "daily" | daily |
| classifyReviews | No | Add complaint types, sentiment and purchase motive to each Korean, English or Japanese review (charged per review as review-judged). Example values: true | |
| rankHistoryStore | No | Name of a key-value store in your Apify account that keeps the last snapshot of each ranking. Ranking rows then show `previousRank`, `rankChange` (positive = moved up) and `isNew` (not in the previous ranking). Run on a schedule to track movement. Use a different name per project; leave empty to turn this off. No extra charge. Example values: "kbeauty-ranking-history" | kbeauty-ranking-history |
| amoremallAgeGroup | No | Buyer age group for the Amore Mall ranking. Example values: "all" | all |
| amoremallRankings | No | Amore Mall ranking tabs to collect. Example values: ["best_purchased"] | |
| reviewsPerProduct | No | Reviews to collect for each product (0 = rankings only). Charged per review. The form starts at 5 for a quick first run; raise it up to 1,000 (default when omitted via API: 20). Example values: 5 | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type to be reported. Example values: 0.5 | |
| proxyConfiguration | No | Default Apify datacenter proxy works for both sites. Example values: {"useApifyProxy":true} | |
| amoremallCategories | No | Amore Mall categories (one ranking per category and ranking type). Example values: ["all"] | |
| residentialFallback | No | Retry failing requests through Korean residential proxy. Example values: true | |
| oliveyoungCategories | No | Bestseller tabs to collect (one ranking per category). Example values: ["all"] | |
| includeProductDetails | No | Add each Olive Young Global ranking product's information sheet as `productDetails`: full ingredient list, volume, skin type it is made for, country of manufacture, manufacturer, plus all other sheet fields. One extra request per product; no extra charge. Amore Mall rows are not covered. | |
| maxProductsPerRanking | No | Top N products of each ranking (rankings have up to 100 products). Each product row is charged as ranking-item. The form starts at 5 for a quick first run; raise it up to 100 (default when omitted via API: 20). Example values: 5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is covered structurally. The description adds genuinely useful context beyond that: no login required, rank history is written to the caller's key-value store, and billing is per item. It does not explain what the 'destructive' aspect actually is, nor run lifecycle/polling behavior, though the waitSecs parameter covers the latter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content sentence is dense and front-loaded with the domains and the sibling routing, followed by short operational facts (0 = rankings only, no login, KV store, pay per item). The only waste is the 'calls the Actor ... and retrieves its output results' preamble, which conveys nothing an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter Actor wrapper with an output schema and full annotation coverage, this is complete enough: the agent learns the source sites, the ranking-vs-review distinction, the zero-review escape hatch, the cost model, auth requirements, and where history is persisted. Return-value shape is handled by the output schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the 20 parameters carry detailed per-field descriptions (including enum titles and Korean labels), so the schema does the heavy lifting and the baseline is 3. The description's only parameter-level addition, 'reviewsPerProduct 0 = rankings only', restates what the schema already says, so no credit above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete resource set: Olive Young Global and Amore Mall (아모레몰) bestseller rankings plus review collection. The opening boilerplate ('calls the Actor ... and retrieves its output results') is generic, but the Actor description immediately delivers a specific verb+resource that an agent can act on and distinguishes it from the review classifiers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes the agent: 'Use for rankings; for existing reviews use leoworks/korean-review-classifier', and clarifies 'reviewsPerProduct 0 = rankings only'. That is a real use/exclusion split with a named alternative. It stops short of stating other conditions (e.g. when to prefer the naver-shopping-rank-tracker sibling or when rankings are unnecessary).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--korean-review-classifierleoworks/korean-review-classifierADestructiveInspect
This tool calls the Actor "leoworks/korean-review-classifier" and retrieves its output results. Actor description: Classify Korean reviews (Coupang review analysis 쿠팡 리뷰, Naver): complaint types, sentiment, purchase motive. Korean review sentiment analysis. Use for Korean; for Japanese use leoworks/japanese-review-classifier. datasetId (text auto-detected) or texts. ~100 reviews/5 s, pay per review.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste review texts directly (one per line). Use this OR “Reviews dataset”. Example values: ["배송이 일주일이나 걸렸고 박스가 다 찢어져서 왔어요.","항상 쓰던 거라 이번에도 재구매했어요. 할인할 때 사니 좋네요!"] | |
| idFields | No | Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, productId). Leave empty to auto-pick reviewId/id/url. | |
| maxItems | No | Classify at most this many reviews (0 = all). | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset containing reviews — for example the output of a Coupang, Naver Shopping, Naver Place or Olive Young review scraper. Use this OR “Review texts”. | |
| textField | No | Field holding the review text. Leave empty to auto-detect (content, text, review, body, reviewText, …). | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| customLabels | No | Up to 10 extra yes/no labels (each up to 200 characters) written in plain language (English or Korean), e.g. “mentions the smell”, “배송 기사 불친절 언급”. Each gets a probability. | |
| maxConcurrency | No | Reviews classified in parallel. Example values: 10 | |
| extraTextFields | No | Fields to prepend to the text (up to 5), e.g. `title` for Coupang review headlines. Leave empty if unsure. | |
| summaryGroupField | No | Field in your dataset that identifies the product (e.g. `productId`, `productName`, `placeId`). The run then saves a REPORT record with, per product: complaint rate and complaint mix, sentiment shares, purchase motives, average rating and 3 example complaints. Leave empty to detect it automatically (overall summary only if none is found). No extra charge. | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type or custom label to be reported. Raise it for fewer, surer labels. Example values: 0.5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, openWorld=true, destructive=true), so the description is not required to explain mutability. It adds genuinely non-annotation context: throughput (~100 reviews/5 s) and a pay-per-review cost model, which matter for an agent deciding whether to batch. It does not address the destructiveHint or the async polling pattern, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and mostly front-loaded — language scope, sibling routing, input modes, throughput and cost all in a few lines. The redundant "This tool calls the Actor ... and retrieves its output results" sentence adds no information but is short.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter, no-required-param Actor wrapper with a full output schema, the description supplies what the schema cannot: language applicability, sibling routing, cost model, and throughput. Return-value semantics are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are already documented in the schema, including the auto-detect behavior of textField and summaryGroupField. The description only restates the two primary input modes (datasetId or texts), adding little beyond the structured fields; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The boilerplate opener ("calls the Actor ... and retrieves its output results") is a tautology, but the embedded Actor description gives a specific verb+resource: classify Korean reviews for complaint types, sentiment, and purchase motive. It clearly separates itself from the Japanese/Spanish/AliExpress classifier siblings by naming the language domain.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for Korean; for Japanese use leoworks/japanese-review-classifier" gives an explicit routing rule to the nearest sibling. It does not state when-not to use it (e.g. non-review text, mixed-language batches), but the primary selection decision is answered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
leoworks--social-comment-classifierleoworks/social-comment-classifierADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste 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?"] | |
| idFields | No | Fields 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. | |
| maxItems | No | Classify at most this many comments (0 = all). | |
| minLikes | No | 0 = all. Comments without a like count are kept. | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset containing comments — for example the output of an Instagram, TikTok, Facebook or YouTube comment scraper. Use this OR “Comment texts”. | |
| textField | No | Field holding the comment text. Leave empty to auto-detect (text, comment, content, body, …). | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| skipReplies | No | Classify only top-level comments, not replies to other comments. | |
| contextField | No | Field 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, …). | |
| customLabels | No | Up 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. | |
| includeAuthor | No | Add 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. | |
| skipEmojiOnly | No | Skip comments with no letters or digits ("🔥🔥", "❤️"). They are mostly praise; skipping them saves cost. | |
| excludeAuthors | No | Usernames whose comments are skipped — usually your own brand or support accounts (with or without @). | |
| labelThreshold | No | Minimum 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 | |
| maxConcurrency | No | Comments classified in parallel. Example values: 10 | |
| skipOwnerReplies | No | Skip 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 | |
| commentsNewerThan | No | Classify 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. | |
| summaryGroupField | No | Field 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. | |
| maxCommentsPerPost | No | Classify at most this many comments per post or video, in dataset order. 0 = no limit. | |
| expandNestedReplies | No | Datasets 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
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
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.
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.
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.
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.
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.
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.
leoworks--spanish-review-classifierleoworks/spanish-review-classifierADestructiveInspect
This tool calls the Actor "leoworks/spanish-review-classifier" and retrieves its output results. Actor description: Classify Spanish reviews (MercadoLibre reseñas) into complaint types, sentiment and purchase motive — Spanish review sentiment analysis. Beta. Use for Spanish; for Korean use leoworks/korean-review-classifier. datasetId (text auto-detected) or texts. ~100 reviews/5 s, pay per review.
| Name | Required | Description | Default |
|---|---|---|---|
| texts | No | Paste review texts directly (one per line). Use this OR “Reviews dataset”. Example values: ["El paquete llegó aplastado y uno de los auriculares no funciona.","Siempre lo compro, excelente calidad. ¡Lo volvería a comprar!"] | |
| idFields | No | Fields copied unchanged from each input item to the output so you can join results back (e.g. reviewId, productId). Leave empty to auto-pick reviewId/id/url. | |
| maxItems | No | Classify at most this many reviews (0 = all). | |
| waitSecs | No | Max 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. | |
| datasetId | No | An Apify dataset containing reviews — for example the output of a MercadoLibre review scraper. Use this OR “Review texts”. | |
| textField | No | Field holding the review text. Leave empty to auto-detect (content, text, review, body, reviewText, …). | |
| outputMode | No | Minimal mode returns only label keys — smaller and easier to aggregate. Example values: "full" | full |
| healthCheck | No | Internal: fail the run when results look degraded (used by the developer's scheduled checks). | |
| customLabels | No | Up to 10 extra yes/no labels (each up to 200 characters) written in plain language (English or Spanish), e.g. “mentions the smell”, “menciona el olor”. Each gets a probability. | |
| maxConcurrency | No | Reviews classified in parallel. Example values: 10 | |
| extraTextFields | No | Fields to prepend to the text (up to 5), e.g. `title` for Coupang review headlines. Leave empty if unsure. | |
| summaryGroupField | No | Field in your dataset that identifies the product (e.g. `productId`, `productName`, `placeId`). The run then saves a REPORT record with, per product: complaint rate and complaint mix, sentiment shares, purchase motives, average rating and 3 example complaints. Leave empty to detect it automatically (overall summary only if none is found). No extra charge. | |
| complaintThreshold | No | Minimum probability (0–1) for a complaint type or custom label to be reported. Raise it for fewer, surer labels. Example values: 0.5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| tip | No | Advisory guidance RAG Web Browser wrote to its key-value store under the reserved "TIP" key |
| runId | Yes | Actor run ID |
| stats | No | Run statistics |
| status | Yes | Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED |
| actorId | Yes | Stable Apify Actor ID from the run record |
| summary | Yes | Past-tense summary of the run state |
| exitCode | No | Actor process exit code; populated for terminal states (especially FAILED) |
| nextStep | Yes | One primary follow-up action with identifiers interpolated |
| storages | Yes | Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry. |
| actorName | No | "username/actor-name" |
| startedAt | No | ISO timestamp when the run started |
| finishedAt | No | ISO timestamp when the run finished (terminal states only) |
| statusMessage | No | Pass-through from Apify run.statusMessage |
| apifyConsoleUrl | No | Personalized Apify Console link to the run; present only for Console sessions |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and readOnlyHint=false, but the description frames the tool as calling an Actor and 'retrieving its output results,' never explaining what is mutated or consumed. It does add value the annotations lack — throughput (~100 reviews/5 s), a pay-per-review cost model, and Beta status — which keeps it above a bare baseline.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The leading sentence ('This tool calls the Actor "leoworks/spanish-review-classifier" and retrieves its output results. Actor description: ...') is boilerplate meta-text that delays the useful content. The remainder is dense and front-loads the classification purpose and language routing, but the opening wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description does not need to explain return shapes; it correctly focuses on purpose, language routing and cost. It leaves the destructive behavior unexplained, which is the one meaningful gap for a tool flagged destructive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are documented in the schema already. The description only restates the two main input modes ('datasetId (text auto-detected) or texts') without adding syntax or semantics beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: classify Spanish reviews into complaint types, sentiment and purchase motive, with the MercadoLibre context. It also distinguishes itself from the sibling korean-review-classifier by naming the language routing explicitly, so an agent can select it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use signal (Spanish) and points to the concrete alternative (leoworks/korean-review-classifier for Korean; datasetId or texts as input modes). It stops short of covering the other classifier siblings (Japanese, Amazon, Google Maps, social comment), so the routing map is incomplete but still actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
4 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
leoworks--naver-shopping-rank-tracker2 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "null", - "boolean" -]New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
3 tool updates
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
leoworks--naver-shopping-rank-tracker2 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "boolean", - "null" -]New value: +[ + "null", + "boolean" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
4 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
3 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
4 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
4 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
- Changed
leoworks--naver-shopping-rank-tracker9 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "null", - "boolean" -]New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
3 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--naver-shopping-rank-tracker2 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "boolean", - "null" -]New value: +[ + "null", + "boolean" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
2 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +]
2 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--job-posting-classifier3 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / company / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / location / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / title / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +]
1 tool update
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
leoworks--google-maps-review-classifier1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rating / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
1 tool update
- Changed
leoworks--naver-shopping-rank-tracker7 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +]
1 tool update
- Changed
leoworks--naver-shopping-rank-tracker2 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "null", - "boolean" -]New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
2 tool updates
- Changed
leoworks--aliexpress-search-scraper1 field changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
- Changed
leoworks--naver-shopping-rank-tracker9 fields changed- changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / isNew / typePrevious value: -[ - "boolean", - "null" -]New value: +[ + "null", + "boolean" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / notFoundWithin / typePrevious value: -[ - "null", - "number" -]New value: +[ + "number", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / organicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / page / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousCheckedAt / typePrevious value: -[ - "string", - "null" -]New value: +[ + "null", + "string" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / previousOrganicRank / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / rankChange / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / storeName / typePrevious value: -[ - "null", - "string" -]New value: +[ + "string", + "null" +] - changed
Output schema / properties / storages / properties / datasets / properties / default / properties / itemsSchema / properties / visualPosition / typePrevious value: -[ - "number", - "null" -]New value: +[ + "null", + "number" +]
Publisher details
- Operator
- LeoWorks (Korea) publishes the 15 Apify actors behind these tools and maintains this listing. The MCP endpoint itself is Apify's official hosted MCP server (mcp.apify.com). · Publisher source
- Operator website
- https://leoworks.kr
- Vendor relationship
- Independent
- Documentation
- https://github.com/illee/leoworks-data-tools-mcp
- Trust center
- Not available
- Restrictions
- Requires an Apify account (sign in with Apify OAuth or an Apify API token). Each tool call runs an actor on your Apify account and is billed per result at the actor's listed price; Apify's free monthly credit covers small tests. The two Google Maps tools can also run compass' Google Maps scraper on your account, billed separately. · Publisher source
Related MCP Connectors
17 data tools in one MCP server, run on Apify: Google Shopping, Flights, Hotels, News, Images, Videos, Ads Transparency, Jobs and Trends; YouTube transcripts; AI visibility checks; Google Maps leads; App Store and Google Play reviews. Pay per result. Sign in with Apify (OAuth) or an API token.
64 public Apify Actors for public-record, jobs, lead, SEO and social data, as MCP tools.
Jobs, ads, SEO, keywords, YouTube and AliExpress data for AI agents. Runs on Apify.
13 pay-per-event data APIs for local-business and web intelligence: local presence audit (Google Business Profile + reviews + AI-readiness), Google Maps scraper, review radar and review pitch generator, TikTok, Instagram, YouTube and LinkedIn scrapers, RAG web browser, France fuel prices, hotel rate monitoring, and a free AEO/AI visibility checker.
Related MCP Servers
- AlicenseAqualityDmaintenanceReal-time Korean web data for AI assistants — Naver Place reviews, Melon charts, Daangn/Bunjang marketplace, Naver News, Musinsa fashion rankings. 7 tools powered by Apify actors.71MIT

actors-mcp-serverofficial
AlicenseAqualityAmaintenanceUse 3,000+ pre-built cloud tools from Apify, known as Actors, to extract data from websites, e-commerce, social media, search engines, maps, and more1011,443 npm13,174MIT- AlicenseNot gradedqualityNot gradedmaintenanceExposes over 19,000 Apify Actors as MCP tools for web scraping, data extraction, and OSINT automation. It enables AI agents to dynamically discover and execute scrapers to collect structured data and crawl web content.MIT
- AlicenseAqualityAmaintenance21 web-data tools for AI agents: jobs, hiring signals, news, research and field trends, reviews, Reddit leads, contacts, property, Shopify, events.250MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.