Agency Skills
SkillsMCPCollectionsContributorsContribute
Install MCP
Agency Skills

Skills written by the people who run agencies, consultancies and coaching firms. Free and open source, MIT.

LibraryAll skillsCollectionsContributors
ContributeHow to contributeContributor guideGitHubReport a problem
GiaCompany BrainPowered by Gia
Skills/Win the work/DemandBird exact-time LinkedIn post
Marketing

DemandBird exact-time LinkedIn post

Use this skill when an approved LinkedIn post (text, image or PDF carousel) must go out at a specific minute through DemandBird. Produces a scheduled post whose stored copy, time and media match what was approved, confirmed by one read-back. Uses DemandBird's MCP server. "Schedule this post for Tuesday 10am", "queue the carousel", "schedule the week's LinkedIn posts".

R. Hunter HarrisR. Hunter HarrisFounder, Hunter Software Consulting
Say something like
“Schedule this post for Tuesday 10am”“queue the carousel”“schedule the week's LinkedIn posts”
demandbirdlinkedinschedulingcontent-distribution
SKILL.mdView on GitHub

Applies when approved LinkedIn copy has to land at an exact time, often for a client or a launch. Produces a scheduled DemandBird post that matches the approval, with the read-back saved as proof.

Needs DemandBird's MCP server connected with a token scoped to drafting and scheduling. Leave deletion out of the token.

The play

  1. Call list_connected_accounts and list_scheduled_posts. Take the LinkedIn account ID from the result, never from memory, and check nothing is already queued in that slot.
  2. Save the approved copy verbatim with save_draft: content, platforms: ["linkedin"], the account in platform_account_ids, and any media in images. Don't run it through a drafting or voice tool; that rewrites approved copy.
  3. For a PDF carousel, set the document title explicitly. Otherwise LinkedIn shows the filename.
  4. Call schedule_post with the post ID, scheduled_at as ISO 8601 with the UTC offset for that date, and variance_minutes: 0. Without the zero, the account's default jitter moves the time.
  5. Call get_post once. Compare it with the approved file: copy (only a trailing newline may differ), time, media and status. Save that read-back. Don't poll.
  6. Record the post as scheduled with its ID and time. There is no public URL until it publishes; fill it in afterwards.

Media and first-comment quirks, and the rate-limit behaviour, are in references/demandbird-quirks.md. Open it before a batch.

What good looks like

  • First check: the stored time and variance. A post "scheduled for 3pm" that stores a window instead of 3:00 never had its variance set to zero.
  • The mediocre version loops save_draft over a week of posts. The first rate-limit rejection doesn't stop the loop, and every later call fails or, worse, half-succeeds.
  • The output is right when each read-back matches the approved copy byte for byte (bar the trailing newline), the time is exact in the offset for that date, and there is exactly one post per slot.

Rules

  • MUST have approval for the copy, media, account and dated time of every post, batch rows included; save the copy verbatim.
  • MUST set variance_minutes: 0 when the time matters.
  • MUST stop a batch on the first rejection, wait, and reconcile with list_scheduled_posts before retrying. A rejected write doesn't prove nothing was created.
  • NEVER mark a first comment verified from get_post; it doesn't return them.
  • NEVER give the agent a token that can delete posts or manage channels.
1 reference file
references/demandbird-quirks.md

DemandBird quirks

Each of these showed up while scheduling weekly LinkedIn posts through the MCP server.

Time

  • Jitter. Accounts can carry a default variance window around the scheduled time. variance_minutes: 0 on schedule_post stores the exact time. Use a deliberate variance only when you want it.
  • Offsets. Send scheduled_at with the offset that applies on that date (-04:00 versus -05:00 across a daylight-saving change). Keep the wall-clock time the human approved.

Copy

  • Trailing newline. The stored content drops a trailing newline. Treat that as the one allowed difference when comparing.
  • No voice pass. Saving with save_draft stores your text verbatim. Drafting tools generate new copy; don't use them on approved text.
  • Mentions. No person-mention (tagging) field turned up in the tools. Tag by hand after publishing if needed.

Media

InputWhat happensDo
PNG imagere-encoded to JPEG, dimensions keptexpect it; check it isn't cropped
PDF carouseldocument title defaults to the filenameset title
large fileuploads around 100 MB workedupload once, reuse the reference

First comments

  • save_draft takes first_comment: {text, delay_minutes}.
  • First comments are text only. A comment that needs an image has to be posted by hand.
  • get_post doesn't return first comments, so the save acknowledgement is the only evidence before publishing. Check the live post afterwards.

Rate limits

  • A rejection carries no reset header, and the limit that applies to MCP calls isn't published.
  • A batch that kept going after the first rejection wasted four calls and left drafts half-made.
  • Pattern that works: one post at a time, stop at the first rejection, wait about a minute, run list_scheduled_posts, then continue only with posts that aren't there. Check drafts too: reuse a draft the failed call left behind rather than saving a second one.
  • One read-back per post. Polling get_post spends the same budget.

Token scope

A token scoped to create, edit, schedule and read was enough for this whole procedure. Leave out deletion, review decisions and channel management.

Install this skill

Pick where your agent runs.

View prompt
Help me install the skill named "demandbird-exact-time-linkedin-post" from this GitHub URL in Claude:
https://github.com/agiea-brain/agency-skills/tree/main/skills/hunter-harris/demandbird-exact-time-linkedin-post

Prepare only the "demandbird-exact-time-linkedin-post" skill, not other skills in the repository.

Inspect each complete skill folder, not just SKILL.md. Preserve the original instructions and include all supporting files (such as references, scripts, templates and assets), keeping their relative paths intact. Package each skill as a downloadable ZIP containing its skill folder with SKILL.md directly inside that folder. If a skill only contains SKILL.md, package that folder too.

Give me the download link for each ZIP and walk me through uploading and enabling it under Settings, Capabilities, Skills in Claude. If you cannot access GitHub or create downloadable files here, explain what I need to download and how to package and upload it myself. Do not invent missing files or claim the skill is installed before I upload it.

Paste this prompt into Claude. It packages the skill folder, supporting files included, and walks you through uploading it under Settings, Capabilities, Skills.

0installs
Marketingcategory
MITlicense