Skip to main content
Glama

Schedule many posts at once (CSV or rows)

bulk_schedule

Checks, and on request schedules, many posts at once: a CSV file's text (csv) or a list of rows (rows), each row one post with the columns date ("2026-10-12 09:00" in the row's or the upload's timezone, an ISO time with offset, or "next_slot"), networks ("linkedin, x"), text, optional text_ (each network its own text), media_urls (https links; video: or document: prefix), alt_text, first_comment (LinkedIn, Bluesky, Mastodon), x_reply and x_thread (X), title, brand and label. dry_run defaults to true: nothing is scheduled and the result lists, for every row, the time it would go out, its networks, each network's length as that network counts it, the X credits it would use, whether it would wait for approval or be held by the plan, and its errors and warnings. With dry_run false the upload is scheduled whole or not at all: if any row has an error nothing is scheduled (code bulk_rows_invalid) and each row says what to fix. The plan limits rows per upload (Free 20, Starter 500, Pro 1,000, Agency 2,000, Scale 5,000); on Free, posts past the 3 scheduled at a time are saved as held. The same upload twice is refused (code bulk_already_scheduled) unless allow_duplicate is true. The result has batch_id; DELETE /api/bulk/{batch_id} undoes the whole upload. Write the rows for the user when they describe a content plan; show them the dry run before scheduling.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
csvNoThe CSV file's text, first line = column names. Comma, semicolon or tab separated.
rowsNoInstead of csv: the posts as objects with the same column names, e.g. [{"date":"2026-10-12 09:00","networks":"linkedin, bluesky","text":"…"}].
dry_runNotrue (default): only check. false: schedule every row, or none.
brand_idNoDefault brand for rows without a brand column.
timezoneNoIANA timezone for dates without one, e.g. "America/Lima". Default: each row's timezone column, else the brand's queue timezone.
date_formatNoHow to read dates like 12/10/2026. Default ymd (2026-10-12).
fit_long_textNoAccept a text over a network's limit and cut it at a sentence or word when published, instead of refusing the row.
allow_duplicateNoSchedule an upload identical to one already scheduled.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it explains dry_run output contents, atomic all-or-nothing scheduling with the bulk_rows_invalid code, per-plan row limits, held posts on Free, duplicate refusal with bulk_already_scheduled, and the batch_id + DELETE undo path. Annotations (non-destructive, non-idempotent, open-world) are complemented by real operational context.

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

Conciseness4/5

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

Front-loaded with the operation and the dry_run default, and the dense column enumeration earns its place. It is one long block of prose with no paragraph breaks, which slightly hurts scanability, but little is redundant.

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

Completeness5/5

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

Despite having no output schema, the description explains the structure of the dry-run result, the failure mode, and the undo mechanism, and covers limits, duplication and holding behaviour. An agent has everything needed to call it correctly without a structured return contract.

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

Parameters4/5

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

Schema coverage is 100% for the eight top-level params, so the baseline is 3. The description earns above that by enumerating the row column names and their syntax (date formats and 'next_slot', per-network text_<network>, media_urls prefixes, alt_text, x_reply/x_thread, brand/label) that the loosely-typed rows items schema does not define.

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?

States a specific verb and scope: 'Checks, and on request schedules, many posts at once', plus the two accepted input forms (csv or rows). An agent can immediately distinguish this bulk operation from the single-post scheduler among the siblings.

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?

Gives concrete procedural guidance ('show them the dry run before scheduling', 'write the rows for the user when they describe a content plan') and notes dry_run defaults to true. It doesn't explicitly name schedule_post as the single-post alternative, so sibling routing is left to inference, but the 'many posts at once' framing covers it.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.