SKULayer
The preview-first feed optimization layer for retailers and agencies.
Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data
What it can do
- List Feeds: List every feed in the workspace: source format, schedule, status, channels, item count, and the latest run summary (including audit issue count). Start here to find feed ids.
- Get Feed: Full detail for one feed: configuration, latest complete run summary, and the size of its rule stack.
- List Rules: The feed's rule stack in execution order: names, enabled state, a plain-English summary, and the full JSON definition of each rule.
What data it sees
Do you need an account
No: the server works without sign-in
The preview-first feed optimization layer for retailers and agencies. Connect an agent to your product feed: read the audit, preview a fix against your real items, and run the feed, with every write previewed and reversible in the app. Google Shopping and Meta today.
Server tool list (15)
Raw names from tools/list. Only developers need these.
| list_feeds | List every feed in the workspace: source format, schedule, status, channels, item count, and the latest run summary (including audit issue count). Start here to find feed ids. |
| get_feed | Full detail for one feed: configuration, latest complete run summary, and the size of its rule stack. |
| list_rules | The feed's rule stack in execution order: names, enabled state, a plain-English summary, and the full JSON definition of each rule. |
| get_audit_findings | Audit findings for the latest complete run, grouped by check with severity, counts, sample item ids, and plain-English guidance on why each finding costs money and how to fix it. The audit measures the DELIVERED feed (after rules). |
| get_merchant_issues | Google's OWN verdict on a feed, from its Merchant Center connection (the app's What Google sees panel): per-issue-code cases with severity, affected-item counts, sample ids, Google's description and documentation link, and an honest lifecycle state — open, fix_shipped (a rule shipped, Google has not re-read yet), or cleared (Google stopped reporting it). Includes account-level issues and the latest pull's scan summary. Complements get_audit_findings: the audit is what SKULayer thinks, this is what Google thinks. Requires the feed to be connected in the app; fixes are built like any rule — preview_rule then create_rule. |
| search_items | Search or page through the items of the latest complete run. Returns delivered items (what channels receive) by default, with base (pre-rules) available via view. query matches id, title, brand, and product type, case-insensitive. |
| preview_rule | Preview an UNSAVED rule against a sample of the latest run: match/change/exclusion counts, per-field change tallies, danger warnings (required fields emptied, identifiers stripped, heavy exclusion), audit deltas, and example before/after diffs. Nothing is written anywhere. Rule definition format: {"when":{"all":[conditions],"any":[conditions],"anyOf":[{"all":[conditions]}]},"then":[actions]} — anyOf is an OR of condition groups, AND-ed with the top-level conditions. Actions: set/copy/replace/append/prepend/lookup/extract/shorten/calculate/round/concat/normalize/strip_html/remove_duplicates (dedupe a separator-delimited list value)/clear/fallback/from_parent/exclude/exclude_group. Condition ops: eq, ne, contains, not_contains, starts_with, not_starts_with, ends_with, not_ends_with, regex, not_regex, gt, lt, gte, lte, between, not_between (take "values": [min,max]), longer_than, shorter_than, in_list, not_in_list (take "values": string[]), in_list_regex, not_in_list_regex (take "values" of regex patterns; match when any pattern matches), date_before, date_after ("today", "today+/-N" or "YYYY-MM-DD"), date_range_active, date_range_inactive (no value; test the ISO range in the field against now), empty, not_empty. Conditions may use "valueField" to compare against another field instead of a literal. Variant groups (items sharing custom:item_group_id): exclude_group {"match":"any"|"all", default "any"} removes the whole family when any/every member matches the conditions and must be the rule's only action; from_parent {"field"} copies the group parent's value onto matching variants (parent = the member whose id equals the group id, else the first member); the condition pseudo-field "group:size" is the family's member count (numeric ops only). Group exclusions are reported as whole groups in the preview warnings. |
| search_taxonomy | Search Google's product taxonomy — the set of valid googleProductCategory values. Returns ranked category paths with their numeric ids, plus whether the query itself is already a valid category (full path or id). Use it to find the right category for a product type, to fix unmatched entries from map_categories, or to check a value before writing it into a rule. |
| map_categories | Propose a googleProductCategory mapping for a feed: groups the latest run's delivered items by distinct productType, matches each onto Google's taxonomy (exact-path and unique-leaf matches first, then candidate-constrained AI when available and useAi is not false), and returns the mapping table WITH a ready-to-save rule definition (one lookup keyed on productType). NOTHING is saved: show the human the mapping, resolve unmatched product types with search_taxonomy and edit the rule's table, then save with create_rule — which runs the standard preview and returns the impact report. Options: onlyMissing=true scopes the rule to items with no category yet; defaultCategory (a valid taxonomy path) is applied to items whose productType is not in the table. |
| create_rule | Create a rule on a feed. The definition is validated, the standard preview runs server-side, and the report comes back WITH the created rule: match/change/exclusion counts, per-field tallies, warnings, and audit deltas. Show the human this report; danger-level warnings mean the rule can empty required fields or exclude heavily. The rule lands enabled, appended after existing rules, and applies on the NEXT run (never to the live delivered feed mid-flight). Same definition format as preview_rule. |
| set_rule_enabled | Enable or disable one rule by id. Disabling takes a rule out of the stack from the next run onward; nothing else about it changes. Use list_rules to find rule ids. |
| delete_rule | Delete one rule by id. This is permanent; prefer set_rule_enabled with enabled=false when the human might want the rule back. Takes effect on the next run. |
| trigger_run | Start a feed run: fetch the source, apply rules, audit the delivered output, and compile channel files. The same gates as the app apply: active subscription, workspace SKU limit, and one run at a time per feed. Returns a runId; poll get_run_status until it completes. An in-flight run never affects the live delivered feed. |
| get_run_status | One run's progress and outcome: status (queued/fetching/auditing/transforming/compiling/complete/failed), item counts, audit issue count, timing, and the error message when a run failed. Use after trigger_run to poll to completion. |
| get_activity | The workspace's recent activity: who did what and when, across the app and every agent connection. Each event has an actor (a human user, an agent via a token or sign-in, or the system), the action (rule created/updated/enabled/disabled/deleted, run triggered), the feed, and a short summary. Use it to check what changed lately, or what you and others have already done, before acting again. |