Skip to main content
Glama
listingbureau

Listing Bureau - Amazon Organic Ranking

lb_schedule_quick_set

DestructiveIdempotent

Set uniform daily volumes for Amazon organic ranking projects, replacing any existing per-day schedule. Specify add-to-cart, search find buy (US only), and page view counts.

Instructions

Quick-set uniform daily volumes for a Listing Bureau project. WARNING: This clears any existing per-day schedule and replaces it with uniform values. All omitted fields default to 0. SFB is US-region only; ATC/PGV work in all regions (lower execution rate outside US).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
ui_idYesProject unique identifier
atcNoAdd-to-cart volume per day (default 0) (all regions; lower execution rate outside US)
sfbNoSearch Find Buy (SFB) volume per day (default 0) (US-region projects only)
pgvNoPage view volume per day (default 0) (all regions; lower execution rate outside US)

Implementation Reference

  • Handler function for the 'lb_schedule_quick_set' tool. Registered via server.tool(), it POSTs uniform daily volumes (atc, sfb, pgv) to /api/v1/projects/{ui_id}/schedule/quick. Performs SFB region gate check, builds request body with defaults of 0, appends cost summary to response, adds region_warning and service_note as needed.
    server.tool(
      "lb_schedule_quick_set",
      "Quick-set uniform daily volumes for a Listing Bureau project. WARNING: This clears any existing per-day schedule and replaces it with uniform values. All omitted fields default to 0. SFB is US-region only; ATC/PGV work in all regions (lower execution rate outside US).",
      {
        ui_id: z.string().describe("Project unique identifier"),
        atc: z.number().int().min(0).optional().describe("Add-to-cart volume per day (default 0) (all regions; lower execution rate outside US)"),
        sfb: z.number().int().min(0).optional().describe("Search Find Buy (SFB) volume per day (default 0) (US-region projects only)"),
        pgv: z.number().int().min(0).optional().describe("Page view volume per day (default 0) (all regions; lower execution rate outside US)"),
      },
      { destructiveHint: true, idempotentHint: true  },
      async (params) => {
        try {
          // SFB region gate: only fetch project when SFB > 0
          let regionWarning: string | undefined;
          if ((params.sfb ?? 0) > 0) {
            try {
              const projRes = await client.request<Project>(
                "GET",
                `/api/v1/projects/${encodeURIComponent(params.ui_id)}`,
                undefined,
                undefined,
                "lb_schedule_quick_set",
              );
              assertSfbAllowed(projRes.data.region, true);
            } catch (fetchErr) {
              if (fetchErr instanceof SfbRegionError) {
                throw fetchErr;
              }
              regionWarning = "Could not verify project region for SFB eligibility. The backend will enforce region restrictions.";
            }
          }
    
          const body: Record<string, unknown> = {
            atc: params.atc ?? 0,
            sfb: params.sfb ?? 0,
            pgv: params.pgv ?? 0,
          };
    
          const res = await client.request<ScheduleResponse>(
            "POST",
            `/api/v1/projects/${encodeURIComponent(params.ui_id)}/schedule/quick`,
            body,
            undefined,
            "lb_schedule_quick_set",
          );
          const augmented = await appendCostSummary(res.data, client);
          if (regionWarning) {
            (augmented as Record<string, unknown>).region_warning = regionWarning;
          }
          // Note when schedule has ATC/PGV but no SFB
          const hasAtcOrPgv = (params.atc ?? 0) > 0 || (params.pgv ?? 0) > 0;
          const hasSfb = (params.sfb ?? 0) > 0;
          if (hasAtcOrPgv && !hasSfb) {
            (augmented as Record<string, unknown>).service_note =
              "This schedule has ATC/PGV but no SFB. " +
              "These services alone rarely move ranking unless the keyword is very uncompetitive. " +
              "They're typically paired with SFB to maintain a healthy organic conversion ratio. " +
              "You can update the schedule to add SFB if needed.";
          }
          return formatResult(augmented);
        } catch (e) {
          return formatErrorResult(e);
        }
      },
    );
  • Input schema for lb_schedule_quick_set: ui_id (required string), atc/sfb/pgv (optional integers, default 0).
    {
      ui_id: z.string().describe("Project unique identifier"),
      atc: z.number().int().min(0).optional().describe("Add-to-cart volume per day (default 0) (all regions; lower execution rate outside US)"),
      sfb: z.number().int().min(0).optional().describe("Search Find Buy (SFB) volume per day (default 0) (US-region projects only)"),
      pgv: z.number().int().min(0).optional().describe("Page view volume per day (default 0) (all regions; lower execution rate outside US)"),
    },
  • The tool is registered via server.tool() inside registerScheduleTools(), which is called from src/index.ts line 59.
    server.tool(
      "lb_schedule_quick_set",
      "Quick-set uniform daily volumes for a Listing Bureau project. WARNING: This clears any existing per-day schedule and replaces it with uniform values. All omitted fields default to 0. SFB is US-region only; ATC/PGV work in all regions (lower execution rate outside US).",
      {
        ui_id: z.string().describe("Project unique identifier"),
        atc: z.number().int().min(0).optional().describe("Add-to-cart volume per day (default 0) (all regions; lower execution rate outside US)"),
        sfb: z.number().int().min(0).optional().describe("Search Find Buy (SFB) volume per day (default 0) (US-region projects only)"),
        pgv: z.number().int().min(0).optional().describe("Page view volume per day (default 0) (all regions; lower execution rate outside US)"),
      },
      { destructiveHint: true, idempotentHint: true  },
      async (params) => {
        try {
          // SFB region gate: only fetch project when SFB > 0
          let regionWarning: string | undefined;
          if ((params.sfb ?? 0) > 0) {
            try {
              const projRes = await client.request<Project>(
                "GET",
                `/api/v1/projects/${encodeURIComponent(params.ui_id)}`,
                undefined,
                undefined,
                "lb_schedule_quick_set",
              );
              assertSfbAllowed(projRes.data.region, true);
            } catch (fetchErr) {
              if (fetchErr instanceof SfbRegionError) {
                throw fetchErr;
              }
              regionWarning = "Could not verify project region for SFB eligibility. The backend will enforce region restrictions.";
            }
          }
    
          const body: Record<string, unknown> = {
            atc: params.atc ?? 0,
            sfb: params.sfb ?? 0,
            pgv: params.pgv ?? 0,
          };
    
          const res = await client.request<ScheduleResponse>(
            "POST",
            `/api/v1/projects/${encodeURIComponent(params.ui_id)}/schedule/quick`,
            body,
            undefined,
            "lb_schedule_quick_set",
          );
          const augmented = await appendCostSummary(res.data, client);
          if (regionWarning) {
            (augmented as Record<string, unknown>).region_warning = regionWarning;
          }
          // Note when schedule has ATC/PGV but no SFB
          const hasAtcOrPgv = (params.atc ?? 0) > 0 || (params.pgv ?? 0) > 0;
          const hasSfb = (params.sfb ?? 0) > 0;
          if (hasAtcOrPgv && !hasSfb) {
            (augmented as Record<string, unknown>).service_note =
              "This schedule has ATC/PGV but no SFB. " +
              "These services alone rarely move ranking unless the keyword is very uncompetitive. " +
              "They're typically paired with SFB to maintain a healthy organic conversion ratio. " +
              "You can update the schedule to add SFB if needed.";
          }
          return formatResult(augmented);
        } catch (e) {
          return formatErrorResult(e);
        }
      },
    );
Behavior4/5

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

Annotations already indicate destructiveHint=true and idempotentHint=true. The description adds value by explicitly stating 'This clears any existing per-day schedule and replaces it with uniform values,' and notes defaulting behavior and regional restrictions. This provides context beyond annotations.

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

Conciseness5/5

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

The description is concise at two sentences: first stating purpose, second providing critical warnings and defaults. No superfluous words, well-structured for quick consumption.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (4 parameters, no output schema, annotations present), the description covers purpose, destructive behavior, defaults, and regional constraints. It does not explain return values, but that is acceptable as there is no output schema. Slightly incomplete for agents needing error handling details, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter descriptions in the schema already include default values and regional notes (e.g., 'default 0', 'US-region projects only'). The tool description essentially repeats this information without adding new semantic value, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Quick-set uniform daily volumes for a Listing Bureau project.' It specifies the verb ('quick-set'), resource ('uniform daily volumes'), and context ('Listing Bureau project'), distinguishing it from sibling tools like lb_schedule_set which likely supports more granular scheduling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides important usage guidance: warning that it clears existing schedules, defaults omitted fields to 0, and regional restrictions for SFB (US only) and ATC/PGV (all regions but lower outside US). It does not explicitly mention when to use this vs alternatives, but the context of sibling tools and the 'quick-set' name imply it's for uniform schedules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/listingbureau/listingbureau-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server