LeoWorks Data Tools — Naver, K-beauty & AliExpress
Server Details
Naver Shopping rank, Naver Blog & AI Briefing monitoring, Korean review classification, K-beauty rankings (Olive Young Global, Amore Mall) and AliExpress reviews & search as AI agent tools — the official Apify MCP server (hosted by Apify) preconfigured with seven LeoWorks actors. Sign in with Apify OAuth or an Apify token; billed per result on your Apify account.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- illee/leoworks-data-tools-mcp
- GitHub Stars
- 0
TDQS
Scored across 11 tools
The four infrastructure tools (abort/get run, get dataset items, get KV record) target clearly distinct resources, and the seven Actor tools each map to a distinct source (AliExpress reviews vs search, Naver blog vs AI briefing vs shopping rank, K-beauty rankings). There is mild conceptual overlap between the review-classification tools (aliexpress-reviews-classifier, korean-review-classifier, kbeauty-ranking-review-monitor all do sentiment/complaint classification), but the differing data sources keep them separable.
The infrastructure group follows a clean verb_noun kebab-case pattern (abort-actor-run, get-actor-run, get-dataset-items, get-key-value-store-record). However, the Actor tools use a completely different 'leoworks--<slug>' namespace prefix with no verb, so the set mixes two conventions rather than presenting one predictable scheme.
11 tools is well within the ideal range and each earns its place: four generic run/storage utilities plus seven domain-specific scrapers. No redundancy or filler given the breadth of sources covered.
The run lifecycle (get/abort), dataset retrieval, and key-value retrieval give a workable pipeline, and the Actor tools cover a solid spread of Naver, K-beauty, and AliExpress sources. Minor gaps exist (e.g. no explicit list-actors/list-datasets or start-run tool), but agents can work around them via the Actor tools and nextStep hints.
Available Tools
11 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 and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new behavior beyond the annotations: the call is a no-op for SUCCEEDED/FAILED/ABORTING/ABORTED/TIMED-OUT runs, and the response returns the updated run details. It does not mention permission requirements or 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 action and its status preconditions before the USAGE block, and no sentence is wasted. The USAGE EXAMPLES lines are thin (one is a bare restatement of the required runId) but the graceful variant does demonstrate a real parameter usage.
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 detailed, and the description correctly just notes that updated run details come back. Purpose, preconditions, and usage are all covered; only permission/auth context is missing for a destructive, openWorld=false operation.
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 both parameters (runId, gracefully with its 30-second timeout) are fully documented in the schema, so the baseline is 3. The description adds little parameter meaning beyond the example 'Gracefully abort run y2h7sK3Wc', which only loosely illustrates the gracefully flag.
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 ('Abort an Actor run') and narrows scope with the precondition 'currently starting or running', which makes the operation unambiguous. It never names a sibling such as get-actor-run to contrast against, but the destructive abort semantics are self-evidently distinct from the read-only tools in the sibling list.
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 when you need to stop a run that is taking too long or misconfigured' gives a clear triggering condition, and the status no-op list functions as an implicit when-not-to-use rule for terminal runs. No alternative tools or host-level prerequisites (auth, workspace scoping) are offered, so it stops short of a full routing guide.
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 readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: the blocking semantics and 45s cap of waitSecs, the meaning of summary (describes the past) and nextStep (prescribes one interpolated follow-up), which an agent needs to interpret the response.
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 purpose, then USAGE, then examples, with every line carrying information: field list, summary/nextStep semantics, and the waitSecs contract. No filler sentences, and the examples are short and directly actionable.
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, yet the description usefully characterizes summary and nextStep so the agent can act on them. Purpose, parameters, blocking behavior and examples are all covered; only auth/permission prerequisites for reading another Actor's run are unstated, 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 coverage is 100%, so both parameters are already documented in the schema with min/max/default and terminal-state enumeration. The description's waitSecs line ('0-45, default 30, waits up to that many seconds for terminal status') largely restates the schema, adding no syntax or format beyond it, so the 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 gives a precise verb+resource ('Get detailed information about a specific Actor run') and enumerates the returned fields (status, storages, stats, summary, nextStep). It does not explicitly contrast itself with the sibling abort-actor-run, but the phrasing 'a run started by any Actor-running tool' makes its read-only inspection role clear.
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 section states when to reach for it ('check the status of a run started by any Actor-running tool') and how to make it block via waitSecs > 0, reinforced by two concrete user_input examples. It stops short of stating when NOT to use it (e.g. versus abort-actor-run or a listing tool), so it is clear context without exclusions.
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 establish readOnlyHint, idempotentHint, and destructiveHint as false. The description adds valuable behavioral context beyond this: the exact key name requirement and the preservation of Content-Encoding with automatic client decompression. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a concise opening definition, a short behavioral note, and clear usage examples. Every section earns its place without unnecessary fluff.
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 simple two-parameter read-only tool with full schema coverage, an output schema, and strong annotations, the description covers the essential context: how to target a record, what to expect (Content-Encoding), and when it applies. The sibling context also helps differentiate it from listing operations.
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?
Input schema coverage is 100%, so the schema already documents both parameters. The description adds usage examples and the 'exact key name' requirement, but these are minimally additive beyond the schema's own property descriptions.
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 uses a specific verb and resource: 'Get the value stored under a specific key in a key-value store.' It also distinguishes itself by explicitly stating this is 'a single record, not a listing of all keys,' which separates it from sibling tools like get-dataset-items.
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 description provides a clear usage context: 'Use when you need to retrieve a specific record (JSON, text, or binary) from a store.' It does not name alternative tools explicitly, but the 'not a listing of all keys' phrase gives implicit exclusion guidance for listing-style operations.
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-classifierBDestructiveInspect
This tool calls the Actor "leoworks/aliexpress-reviews-classifier" and retrieves its output results. Actor description: Scrape AliExpress product reviews — text, English translation, star rating, date, buyer country, option (SKU) and photos — from any product URL. Optional AI classification adds complaint types, sentiment and purchase motive, plus a per-product summary. No login.
| 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 |
| 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. | |
| 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"] | |
| reviewFilter | No | Reviews come in AliExpress' default order. Star and date sorting are not offered by the source. Example values: "all" | all |
| 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. Charged per review as review-judged. 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). | |
| reviewsPerProduct | No | Maximum reviews to collect for each product (charged per review). 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 | |
| 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 readOnlyHint=false, destructiveHint=true and openWorldHint=true, so the safety profile is partially covered. The description adds real context ('No login', AI classification is optional and enriches each review with complaint type/sentiment/motive plus a per-product summary), but it omits the per-review charging model and the fact that runs are asynchronous and may return before completion, both of which are operationally important.
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 with the substantive information (what is scraped, what classification adds, no login) front-loaded. The opening boilerplate 'calls the Actor ... and retrieves its output results' is filler that repeats the tool name.
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 12 parameters fully described in the schema and an output schema present, the description does not need to enumerate fields or return values. It covers the data surface and the optional classification mode adequately; the main gap is not flagging the cost-per-review and polling workflow that the schema mentions only in scattered parameter descriptions.
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; every parameter (productUrls, reviewFilter, classifyReviews, reviewsPerProduct, proxies, etc.) is already documented in the schema. The description adds no format or default detail beyond what the schema provides.
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 and resource ('Scrape AliExpress product reviews – text, English translation, star rating, date, buyer country, option (SKU) and photos') and adds the optional AI classification layer, so an agent understands the output scope. It does not explicitly differentiate itself from close siblings such as leoworks--aliexpress-search-scraper or leoworks--korean-review-classifier, so it falls short of a 5.
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?
There is no statement of when to choose this tool versus the AliExpress search scraper or the Korean review classifier, nor any prerequisite or exclusion guidance. The only routing hint ('follow `nextStep` to poll via get-actor-run') lives in the waitSecs schema field, not the description.
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-scraperBDestructiveInspect
This tool calls the Actor "leoworks/aliexpress-search-scraper" and retrieves its output results. Actor description: Scrape AliExpress search results for any keyword — rank, title, price, discount, sold count, rating, ship-from and ads flagged — up to 60 pages. Rank mode tracks where your products rank for each keyword over time. No login.
| 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?
Annotations already declare openWorldHint=true and destructiveHint=true, so the safety profile is partly covered. The description adds useful context ('No login', ads flagged, up to 60 pages), but does not disclose why the tool is destructive (credit consumption per result vs per keyword, actor-run launch) nor that it may return before the run finishes at the waitSecs cap. 'Retrieves its output results' slightly oversells synchronous behavior, though the schema's waitSecs/nextStep text corrects it.
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 platform and the scraped fields; nothing is redundant or padded. The opening 'calls the Actor ... and retrieves its output results' wrapper is the only dead weight.
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 schema covers parameters and run polling. What is missing for a 14-parameter, credit-consuming actor is any note about cost model (per-result vs per-keyword) and the asynchronous run lifecycle, both of which matter for correct invocation but are only discoverable inside the 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 the schema already documents all 14 parameters including defaults, enums and the rank-mode trigger. The description only gestures at a couple of concepts (rank mode, ads flagged) without adding syntax or semantics beyond the schema, so the 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 concrete verb and resource ('Scrape AliExpress search results for any keyword') and enumerates the returned fields (rank, title, price, discount, sold count, rating, ship-from, ads), plus the two operating modes (search vs rank). It is clear enough to distinguish from the AliExpress reviews classifier and Naver trackers by platform and data type, though the leading boilerplate sentence ('calls the Actor ... retrieves its output results') adds nothing.
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 description implies usage via the mode split ('Rank mode tracks where your products rank ... over time') and 'No login', but never states when to pick this tool over the sibling rank trackers or when rank mode is appropriate versus plain search. The concrete trigger (setting trackProducts) lives only in the schema, so guidance is implied rather than explicit.
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-monitorBDestructiveInspect
This tool calls the Actor "leoworks/kbeauty-ranking-review-monitor" and retrieves its output results. Actor description: Track K-beauty bestseller rankings on Olive Young Global (OliveYoung, 올리브영) and Amorepacific's Amore Mall (아모레몰: Sulwhasoo, Laneige, Hera…) and collect cosmetics reviews with optional AI classification — complaint types, sentiment and purchase motive in Korean, English and Japanese. No login.
| 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, lowering the disclosure bar. The description adds the useful behavioral fact that no login is required, but it does not explain the run lifecycle, the per-review/per-ranking-item charging that the schema mentions, or why the operation is 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?
Two tight sentences that front-load the actor identity and then the capability summary; no padding. Slightly boilerplate in the first clause ('This tool calls the Actor ... and retrieves its output results'), but nothing wasteful.
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 described, and the 20-parameter schema is fully documented. The description covers sources, review collection and AI classification adequately, though it omits the asynchronous run/polling behavior that an agent needs for long runs.
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 20 parameters, so the schema fully documents names, enums, defaults and trade-offs like cost and proxy behavior. The description adds no parameter meaning of its own, so the baseline of 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 gives a concrete verb+resource: tracking K-beauty bestseller rankings on Olive Young Global and Amore Mall and collecting reviews with optional AI classification. That is specific and understandable. It does not, however, differentiate itself from siblings such as leoworks--naver-shopping-rank-tracker or leoworks--korean-review-classifier, so an agent must infer the distinction.
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?
There is no when-to-use guidance, no mention of when not to use it, and no reference to any alternative tool. The 'No login' note is a fact about the actor, not usage guidance. The agent gets no help choosing between this and the other ranking/review siblings.
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 customer reviews — Coupang reviews (쿠팡 리뷰), Olive Young reviews, Naver Shopping and Naver Place reviews — into complaint types, sentiment and purchase motive with probabilities. Korean review sentiment analysis for any review scraper's dataset — no prompts, no LLM key.
| 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 declare destructiveHint=true, readOnlyHint=false and openWorldHint=true, so the safety profile is partly structured. The description adds only 'no prompts, no LLM key' as a behavioral trait, and does not disclose that this launches a billable Actor run, its cost, or auth/rate-limit characteristics. With annotations covering part of the burden, this is adequate but thin.
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 actual classification capability and compact overall. The first clause ('calls the Actor ... and retrieves its output results') is boilerplate that restates the name, but the total length is small and nothing is bloated.
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 13 parameters with full schema coverage, an output schema, and annotations, the description covers the essential purpose and the source platforms. It leaves the billable-run behavior implicit, but the return format is handled by the output schema and parameter behavior by the schema, so it is largely complete for correct invocation.
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 every one of the 13 parameters is already documented in the schema (texts vs datasetId, idFields, summaryGroupField, complaintThreshold, etc.). The description adds no parameter-level meaning beyond what the schema provides, which is the baseline 3.
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 (classify) and resource (Korean customer reviews from Coupang, Olive Young, Naver Shopping/Place) and states the output categories (complaint types, sentiment, purchase motive with probabilities). This distinguishes it from siblings like the Aliexpress classifier and the ranking/monitor tools. The opening boilerplate about calling the Actor adds no value but does not obscure the 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 implies context ('Korean review sentiment analysis for any review scraper's dataset') which suggests when it is applicable, but there is no explicit when-to-use vs the sibling aliexpress-reviews-classifier or other classifiers, and no exclusions. Usage is left to inference.
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.
11 tool updates
- First observed
abort-actor-run - First observed
get-actor-run - First observed
get-dataset-items - First observed
get-key-value-store-record - First observed
leoworks--aliexpress-reviews-classifier - First observed
leoworks--aliexpress-search-scraper - First observed
leoworks--kbeauty-ranking-review-monitor - First observed
leoworks--korean-review-classifier - First observed
leoworks--naver-ai-briefing-monitor - First observed
leoworks--naver-blog-brand-monitor - First observed
leoworks--naver-shopping-rank-tracker
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.
Seven pay-per-event Apify Actors (PDF/CSV/links/sitemap/email/phone/VAT) as MCP tools.
- mcpweaveOAuthcom.mcpweave
Korea-native MCP gateway: Korean commerce, payments, messaging, gov & finance APIs for AI agents.
Extract data from any website with thousands of scrapers, crawlers, and automations on Apify Store ⚡
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
- AlicenseAqualityAmaintenanceThis MCP server equips AI agents with ten web-data tools for web search, page reading, site crawling, contact and tech-stack detection, company profiling, e-mail/DNS security checks, e-mail validation, package health, and raw Google search. Each call runs Actors on the user's own Apify account, returning trimmed, readable dataset rows.10MIT

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 more1032,599 npm9,604MIT- AlicenseNot gradedqualityCmaintenanceSeven remote MCP servers exposing 51 published Apify scrapers as agent tools: company diligence, social listening, recruiting, real estate, lead generation, e-commerce and academic research. Billed per result, and a call that returns nothing is never charged.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.