> ## Documentation Index
> Fetch the complete documentation index at: https://docs.postqueen.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Tools Reference

> Complete reference for all PostQueen MCP tools

These are the eleven tools she answers over MCP, with every parameter and every field she sends back. Your agent reads these schemas on connect, so you never call one by hand.

## integrationList

List all connected social media accounts (channels) for your organization.

**Parameters:**

| Field   | Type   | Required | Description                                                                                             |
| ------- | ------ | -------- | ------------------------------------------------------------------------------------------------------- |
| `group` | string | No       | Group (customer) ID from `groupList`. When provided, only channels belonging to that group are returned |

**Returns:**

| Field      | Type   | Description                                             |
| ---------- | ------ | ------------------------------------------------------- |
| `id`       | string | Integration ID (use this when scheduling posts)         |
| `name`     | string | Display name of the account                             |
| `picture`  | string | Profile picture URL                                     |
| `platform` | string | Platform identifier (e.g., `x`, `linkedin`, `facebook`) |

Four fields and no more. The tool builds a richer row internally, but its declared output schema trims anything else before it leaves, so a channel's group, its disabled flag and its profile never reach your client. Read those from [`GET /integrations`](/public-api/integrations/list) instead.

***

## groupList

List all groups (customers) for your organization. Use a group's `id` with `integrationList` to filter channels down to a single group.

**Parameters:** None

**Returns:**

| Field  | Type   | Description                                                |
| ------ | ------ | ---------------------------------------------------------- |
| `id`   | string | Group (customer) ID (pass to `integrationList` as `group`) |
| `name` | string | Group (customer) display name                              |

***

## integrationSchema

Get the posting rules, character limits, and required settings for a specific platform. The response also lists the platform's helper tools. Call this before scheduling a post to understand what the platform expects.

**Parameters:**

| Field       | Type    | Required | Description                                                      |
| ----------- | ------- | -------- | ---------------------------------------------------------------- |
| `isPremium` | boolean | Yes      | Whether the user has a premium subscription                      |
| `platform`  | string  | Yes      | Platform identifier (e.g., `x`, `linkedin`, `reddit`, `discord`) |

**Returns:**

| Field       | Type   | Description                                        |
| ----------- | ------ | -------------------------------------------------- |
| `rules`     | string | Platform-specific posting rules and best practices |
| `maxLength` | number | Maximum character length for posts                 |
| `settings`  | object | JSON schema of required settings for this platform |
| `tools`     | array  | Platform-specific helper tools (see `triggerTool`) |

The `tools` array contains helper functions specific to the platform. For example, Discord returns a tool to list available channels, Reddit returns a tool to search for subreddits, and Pinterest returns a tool to list boards.

Each tool in the array has:

| Field         | Type   | Description                            |
| ------------- | ------ | -------------------------------------- |
| `methodName`  | string | Function name to pass to `triggerTool` |
| `description` | string | What the tool does                     |
| `dataSchema`  | array  | Parameters the tool accepts            |

***

## triggerTool

Execute a platform-specific helper function. These are discovered through `integrationSchema` and are used to fetch dynamic data like channel lists, subreddit suggestions, or page IDs. Every tool each network offers is catalogued in [Provider Tools](/public-api/integrations/provider-tools).

**Parameters:**

| Field           | Type   | Required | Description                                      |
| --------------- | ------ | -------- | ------------------------------------------------ |
| `integrationId` | string | Yes      | The integration ID from `integrationList`        |
| `methodName`    | string | Yes      | The function name from `integrationSchema` tools |
| `dataSchema`    | array  | Yes      | Key-value pairs of parameters for the function   |

Each item in `dataSchema`:

| Field   | Type   | Description     |
| ------- | ------ | --------------- |
| `key`   | string | Parameter name  |
| `value` | string | Parameter value |

**Example use cases:**

* Get the list of Discord channels for a server
* Search for Reddit subreddits
* List Pinterest boards
* List Slack channels
* Search Instagram audio (`audioSearch`) to attach to a Reel (available only on Facebook Business-linked Instagram channels)

***

## integrationSchedulePostTool

Schedule, draft, or immediately publish posts to social media platforms. This is the main tool for creating content.

**Parameters:**

| Field        | Type  | Required | Description              |
| ------------ | ----- | -------- | ------------------------ |
| `socialPost` | array | Yes      | Array of posts to create |

Each item in `socialPost`:

| Field              | Type    | Required | Description                                         |
| ------------------ | ------- | -------- | --------------------------------------------------- |
| `integrationId`    | string  | Yes      | Integration ID from `integrationList`               |
| `isPremium`        | boolean | Yes      | Whether the user has premium                        |
| `date`             | string  | Yes      | UTC datetime (e.g., `2026-08-01T09:00:00.000Z`)     |
| `shortLink`        | boolean | Yes      | Whether to shorten links in the post                |
| `type`             | string  | Yes      | `draft`, `schedule`, or `now`                       |
| `postsAndComments` | array   | Yes      | The post content and optional comments              |
| `settings`         | array   | Yes      | Platform-specific settings from `integrationSchema` |

Each item in `postsAndComments`:

| Field         | Type   | Description                               |
| ------------- | ------ | ----------------------------------------- |
| `content`     | string | HTML content (see formatting rules below) |
| `attachments` | array  | Array of image/media URLs                 |

Each item in `settings`:

| Field   | Type   | Description                                           |
| ------- | ------ | ----------------------------------------------------- |
| `key`   | string | Setting name                                          |
| `value` | any    | Setting value (prefer IDs over labels when available) |

### Content Formatting

Content must be HTML with these allowed tags only:

| Tag                    | Usage           |
| ---------------------- | --------------- |
| `<p>`                  | Wrap each line  |
| `<h1>`, `<h2>`, `<h3>` | Headings        |
| `<strong>`             | Bold text       |
| `<u>`                  | Underlined text |
| `<ul>`, `<li>`         | Lists           |

<Warning>
  You cannot combine `<u>` and `<strong>` in the same element. Each line of text must be wrapped in `<p>` tags.
</Warning>

### Posts vs Comments

The `postsAndComments` array behavior depends on the platform:

* **Thread-based platforms** (X, Threads, Bluesky): Each array item becomes a separate post in a thread
* **Comment-based platforms** (LinkedIn, Facebook): First item is the post, remaining items are comments

### Multiple Posts

To schedule multiple posts (e.g., 20 posts across different days), add multiple items to the `socialPost` array, each with its own `date` and `integrationId`.

**Returns:** An array of results, one per post in `socialPost`, each with:

| Field         | Type   | Description                      |
| ------------- | ------ | -------------------------------- |
| `postId`      | string | The created post ID              |
| `integration` | string | The integration it was posted to |

If validation fails, returns `{ errors: string }` with details about what went wrong (e.g., content exceeds character limit).

***

## generateImageTool

Generate an AI image to use as a post attachment.

**Parameters:**

| Field    | Type   | Required | Description                          |
| -------- | ------ | -------- | ------------------------------------ |
| `prompt` | string | Yes      | Description of the image to generate |

**Returns:**

| Field  | Type   | Description                |
| ------ | ------ | -------------------------- |
| `id`   | string | Media ID                   |
| `path` | string | URL of the generated image |

Use the returned `path` in the `attachments` array when scheduling a post.

***

## uploadFromUrlTool

Upload a remote image or video into the media library from a public URL. Use this before scheduling a post when the user provides an external media URL that is not already hosted on your PostQueen domain, so the attachment passes the upload-domain validation.

**Parameters:**

| Field | Type   | Required | Description                                    |
| ----- | ------ | -------- | ---------------------------------------------- |
| `url` | string | Yes      | The public URL of the image or video to upload |

**Returns:**

| Field  | Type   | Description             |
| ------ | ------ | ----------------------- |
| `id`   | string | Media ID                |
| `path` | string | URL of the hosted media |

On failure, returns `{ error: string }` instead (for example, the URL could not be fetched, the file type is not allowed, or the file exceeds the size limit).

**Allowed file types:**

* Images: JPEG, PNG, GIF, WebP, AVIF, BMP, TIFF
* Video: MP4

Size caps are enforced server-side.

Use the returned `path` in the `attachments` array when scheduling a post.

***

## generateVideoOptions

List all available video generation types and their required parameters.

**Parameters:** None required (an optional `reasoning` string is accepted).

**Returns:** An array of video generators, each with:

| Field          | Type   | Description                                               |
| -------------- | ------ | --------------------------------------------------------- |
| `type`         | string | Video type identifier (e.g., `image-text-slides`, `veo3`) |
| `output`       | string | Supported orientations: `vertical\|horizontal`            |
| `tools`        | array  | Helper functions (call with `videoFunctionTool`)          |
| `customParams` | object | JSON schema of required parameters                        |

### Available Video Types

| Type              | Description                            | Requirements                                             |
| ----------------- | -------------------------------------- | -------------------------------------------------------- |
| Image Text Slides | Slide-based videos with text-to-speech | `prompt`, `voice` (get voice ID via `videoFunctionTool`) |
| Veo3              | AI-generated video with audio          | `prompt`, `images` (required array, may be empty, max 3) |

***

## videoFunctionTool

Execute helper functions for video generators. Use this to fetch required data before generating a video (e.g., listing available voices).

**Parameters:**

| Field          | Type   | Required | Description                                       |
| -------------- | ------ | -------- | ------------------------------------------------- |
| `identifier`   | string | Yes      | Video type identifier from `generateVideoOptions` |
| `functionName` | string | Yes      | Function name from the video type's `tools` array |

**Example:** Call with `identifier: "image-text-slides"` and `functionName: "loadVoices"` to get available ElevenLabs voice IDs.

***

## generateVideoTool

Generate a video to use as a post attachment.

**Parameters:**

| Field          | Type   | Required | Description                                      |
| -------------- | ------ | -------- | ------------------------------------------------ |
| `identifier`   | string | Yes      | Video type from `generateVideoOptions`           |
| `output`       | string | Yes      | `vertical` or `horizontal`                       |
| `customParams` | array  | Yes      | Key-value pairs of parameters for the video type |

Each item in `customParams`:

| Field   | Type   | Description     |
| ------- | ------ | --------------- |
| `key`   | string | Parameter name  |
| `value` | any    | Parameter value |

**Returns:**

| Field | Type   | Description                |
| ----- | ------ | -------------------------- |
| `url` | string | URL of the generated video |

Use the returned `url` in the `attachments` array when scheduling a post. Whatever your agent schedules with these tools lands on the calendar she publishes from, so you can still open it and change your mind.

## `ask_postqueen`

The eleventh tool is not one of the ten above and does not look like them. Your client will discover it anyway, so it is worth knowing what it is.

It takes one parameter, `message`, a plain-language request. Behind it sits the same assistant you talk to in the app, running server-side with the same tools listed above and the same access to your calendar. So "ask her to schedule a launch post for Thursday" is a single call rather than a sequence your own agent has to plan.

| Parameter | Type   | Required | Description                                |
| --------- | ------ | -------- | ------------------------------------------ |
| `message` | string | Yes      | What you want her to do, in your own words |

Two things follow from that. It can write to your calendar, so treat it with the same care as `integrationSchedulePostTool`. And because she plans the steps herself, you get less control over exactly which tools run than you would calling them directly.

## What these tools cannot do

Some jobs have no tool here and need the CLI or the API alongside. `ask_postqueen` does not change this: it drives the same tools, so it has the same gaps. Reading analytics is one. Listing or deleting an existing post is another. [Limits and Troubleshooting](/mcp/limits-and-troubleshooting) has the full list, the route to use instead of each gap, and what to check when your client says it cannot reach her at all.
