---
name: pylot
description: Create and schedule on-brand social media posts with Pylot. Use when the user asks for social posts, captions, post images, a content calendar, or to schedule or publish to Instagram, Facebook, LinkedIn, X or TikTok, and the Pylot MCP server is connected.
---

# Pylot: your content team

Pylot is a social media workspace that already knows the user's brand: voice, colours and logo. With the Pylot MCP server connected, you don't write posts and hand them over to be scheduled. You ask Pylot to make them: it writes captions in the brand voice, generates brand images, creates the post in the user's calendar and schedules it.

Server: `https://www.getpylot.com/api/mcp` (Streamable HTTP, API key sent as `Authorization: Bearer pyl_live_…`). Setup for each client: https://www.getpylot.com/mcp

## Rules

1. **Drafts by default.** `create_post` makes a draft unless you pass `scheduledAt`. Only schedule when the user gave a time or said "schedule".
2. **Never publish on your own.** Call `publish_post` (with `confirm: true`) only when the user explicitly asked to publish now. It is irreversible.
3. **Let Pylot write and design.** Use `generate_captions` and `generate_image` instead of writing captions yourself or using images from elsewhere, so the post matches the brand. Edit a caption only if the user asks you to.
4. **Check credits before images.** `generate_image` costs 1 credit (refunded if it fails). For more than a couple of images, call `get_credits` first and tell the user if the balance is short.
5. **Use real channel ids.** Call `list_channels` before `create_post`. Use the returned `id` as `channelId`. Omit `targets` to post to every active channel.
6. **Times.** Use ISO-8601 with an offset (`2026-11-03T09:00:00-05:00`), or a naive time plus `timezone`. Without either, Pylot uses the business timezone. Times must be at least 1 minute ahead.
7. **Report back.** After creating posts, tell the user what was made, when each is scheduled (or that it's a draft), and how many credits were used.

## Which tool, when

| The user wants to… | Call |
|---|---|
| Know which accounts are connected | `list_channels` |
| Check plan, timezone or credits | `get_account`, `get_credits` |
| Get caption ideas or copy for a post | `generate_captions` (free; 3 variations per platform) |
| Get an image for a post | `generate_image` (1 credit; returns a URL for `mediaUrls`) |
| Use their own image or video from a URL | `upload_media`, then pass the returned URL in `mediaUrls` |
| Make a post (draft) | `create_post` |
| Make and schedule a post in one go | `create_post` with `scheduledAt` |
| Schedule an existing draft | `schedule_post` |
| See what's planned or posted | `list_posts`, `get_post` |
| Remove a draft or scheduled post | `delete_post` (ask first; published posts can't be deleted) |
| Publish right now | `publish_post` with `confirm: true` (only when explicitly asked) |

`generate_captions` writes for `instagram`, `facebook`, `linkedin` and `x`, with a tone of `professional`, `casual`, `funny`, `inspirational` or `promotional`. `generate_image` takes an `aspectRatio` of `1:1`, `3:4`, `4:3`, `4:5`, `9:16` or `16:9`. TikTok posts need a video, so don't target TikTok with an image post.

## Examples

### "Make three Instagram posts for next week about our autumn menu, with images, 9am Tuesday, Thursday and Saturday."

1. `list_channels` → find the Instagram channel id.
2. `get_credits` → confirm at least 3 credits.
3. `generate_captions` `{ "prompt": "Autumn menu: three posts, one per new dish", "platforms": ["instagram"] }` → pick one variation per post.
4. `generate_image` three times, one per dish, `{ "prompt": "Pumpkin soup in a rustic bowl, warm autumn light", "aspectRatio": "4:5" }`.
5. `create_post` three times, each with its caption, `mediaUrls: [imageUrl]`, `targets: [{ "channelId": "…", "subPlatform": "instagram" }]` and a `scheduledAt` for 9am on each day.
6. Reply: three posts scheduled (list day and time), 3 credits used.

### "Write a LinkedIn post about our new opening hours and leave it as a draft."

1. `list_channels` → the LinkedIn channel id.
2. `generate_captions` `{ "prompt": "New opening hours: now open Saturdays 9 to 2", "platforms": ["linkedin"], "tone": "professional" }`.
3. `generate_image` `{ "prompt": "Shop front with an open sign on a Saturday morning", "aspectRatio": "1:1" }`.
4. `create_post` with the caption, image and LinkedIn target. No `scheduledAt`, so it stays a draft.
5. Reply: draft created in the Pylot calendar, 1 credit used.

### "Move Thursday's post to Friday at 6pm."

1. `list_posts` `{ "status": ["scheduled", "approved"] }` → find Thursday's post.
2. `schedule_post` `{ "postId": "…", "scheduledAt": "…T18:00:00" }`.
3. Reply with the new time.

### "Publish the sale post now."

The user asked to publish now, so call `publish_post` `{ "postId": "…", "confirm": true }`. If it's unclear which post they mean, ask before publishing.

## Errors

Tool errors come back as JSON: `{ "error": { "code": "…", "message": "…" } }`. `insufficient_credits` means the balance is too low for an image: tell the user, and offer captions only (free) or to wait for their monthly credits. `unauthorized` means the API key is missing, wrong or revoked: the user can create a new one in Pylot under Settings → API keys.
