# posterly (npm · posterly-mcp-server)

Validate, schedule, publish, and analyze social content across 18 platforms with posterly.

- Trust score: 60/100 (medium)
- Change this week: +41
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `www.poster.ly`: 39/100, [markdown](https://verifymcp.io/servers/awpthorp-posterly/api-mcp.md), [page](https://verifymcp.io/servers/awpthorp-posterly/api-mcp)
- npm · `posterly-mcp-server`: 60/100 (this document), [markdown](https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server.md), [page](https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server)

## Channel facts

- Registry: `npm`
- Package: `posterly-mcp-server`
- Version: `0.27.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 87/100
  - No malware found by supply-chain analysis.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
  - No install/post-install scripts declared.
  - Only part of the dependency tree could be resolved (95 of 99), so this covers what we could see, not the whole tree.
- **Provenance & Transparency**: 19/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 11296 tokens (~150/item across 75 items; 75 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 93/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 79% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add awpthorp-posterly -- npx -y posterly-mcp-server
```

### Codex

```bash
codex mcp add awpthorp-posterly -- npx -y posterly-mcp-server
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "awpthorp-posterly": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "posterly-mcp-server"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add awpthorp-posterly --command npx --arg -y --arg posterly-mcp-server
```

### Hermes

```yaml
mcp_servers:
  awpthorp-posterly:
    command: "npx"
    args: ["-y", "posterly-mcp-server"]
```

### Other

```json
{
  "mcpServers": {
    "awpthorp-posterly": {
      "command": "npx",
      "args": [
        "-y",
        "posterly-mcp-server"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 60, +47)

- [security regression] Provenance: unverified → fail
- [security improvement] Install scripts: unverified → pass
- [security improvement] Known CVEs: unverified → partial
- [security improvement] Malware scan: unverified → pass
- [functional improvement] Maintenance: unverified → pass
- [functional improvement] Stability: unverified → 0.23
- [functional improvement] Schema quality: unverified → good
- [functional improvement] MCP protocol: unverified → pass
- [functional improvement] License: unverified → pass
- [functional improvement] Dependency health: unverified → partial
- [functional] Licence: MIT

### 2026-07-31 (score 13, +13)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 0, 0)

- [functional improvement] Tool coverage: unverified → 100
- [functional] Package version: 0.27.0 → 0.27.1

### 2026-07-28 (score 0, −19)

- [functional regression] Tool coverage: 100 → unverified
- [functional] First check of Schema quality: unverified

### 2026-07-27 (score 19)

First indexed and scored.

## MCP tools (75)

### `get_agent_signup_info` (~36 tokens)

Explain how to use Posterly MCP for agent-led signup before an API key exists, including the safe human-in-the-browser boundaries.

### `start_signup` (~226 tokens)

Start the public Posterly paid signup flow for a user before Posterly API access exists. Returns a Posterly checkout handoff URL and signup poll URL. The user must handle payment and password setup in the browser. Do not ask for card details or a Posterly password in chat.

Input parameters:

- `api_addon` (boolean): Always true for AI agent setup because MCP/API access requires the API add-on.
- `debug` (boolean): When true, include the raw signup response JSON for debugging. Keep false for normal user-facing agent flows.
- `email` (string, required): User email address to sign up. Confirm this with the user before calling.
- `interval` (string): Billing interval. Public agent signup currently supports monthly billing.
- `name` (string): Optional user or workspace name to pass into Posterly signup.
- `return_path` (string): Where Posterly should continue after checkout and password setup.
- `source` (string): Source label for analytics and support diagnostics.
- `tier` (string): Posterly plan to start. Use starter unless the user explicitly chooses another plan.

### `get_signup_session` (~113 tokens)

Poll a public Posterly signup session created by start_signup. Use this to narrate checkout, payment, password setup, and agent access status before a Posterly API key is installed. Keep updates user-facing; do not narrate raw HTTP, curl, or API plumbing.

Input parameters:

- `debug` (boolean): When true, include the raw signup session JSON for debugging. Keep false for normal user-facing agent flows.
- `session_id` (string, required): Signup session ID returned by start_signup, usually the Stripe checkout session ID.

### `get_mcp_status` (~46 tokens)

Report the Posterly MCP server version, latest npm version, MCP endpoint health, API key health, and update guidance. Safe to call before POSTERLY_API_KEY is configured.

### `whoami` (~81 tokens)

Return the authenticated user, API key scopes, the default (personal) workspace, and every workspace the caller can post in. ALWAYS call this at the start of a session before creating, listing, or scheduling posts - posts created without an explicit workspace_id land in the default workspace shown here, and confirming with the user first prevents posts from appearing in the wrong workspace.

### `list_accounts` (~70 tokens)

List connected social media accounts. Returns platform, username, account ID, and workspace ID for each. Pass workspace_id to filter to a specific workspace; otherwise returns all accounts the caller owns across every workspace.

Input parameters:

- `workspace_id` (string): Filter to accounts in a specific workspace (get IDs via whoami).

### `disconnect_account` (~123 tokens)

Disconnect a connected social account from posterly. DESTRUCTIVE and IRREVERSIBLE: removes the account connection, emits account.disconnected webhooks, and may transfer Instagram scheduled posts to a replacement account.

REQUIRED BEFORE CALLING: Call `list_accounts` first, show the user the exact platform, username, account ID, and workspace that will be disconnected, then get explicit confirmation. Pass confirm=true only after that confirmation.

Input parameters:

- `account_id` (string, required): Connected social account ID from list_accounts.
- `confirm` (boolean, required): Must be true after explicit user confirmation.

### `get_connect_link` (~163 tokens)

List dashboard handoff links/readiness for connecting social accounts, or get one platform connection URL. Use connection_url in a logged-in browser. Direct OAuth URLs are intentionally not exposed because provider callbacks rely on browser state.

Input parameters:

- `debug` (boolean): When true, include the raw connect option JSON for debugging. Keep false for normal user-facing agent flows.
- `include_planned` (boolean): Include planned provider expansion targets from the Postiz parity audit: reddit, medium, skool, whop.
- `platform` (string): Connection target such as instagram, meta, linkedin_page, twitter, x, google_business, telegram, reddit, or wordpress. Omit to list live connection targets.
- `workspace_id` (string): Filter connected account counts to a workspace.

### `create_connect_session` (~182 tokens)

Create a short-lived Posterly dashboard handoff session for connecting a social account. Send the secure connection URL to the user, then poll get_connect_session to narrate progress. Do not ask for social media passwords or OAuth codes; Posterly handles those browser steps.

Input parameters:

- `auto_start` (boolean): When true, the dashboard starts the provider flow after the user opens the URL. Defaults to true.
- `debug` (boolean): When true, include the raw connect session JSON for debugging. Keep false for normal user-facing agent flows.
- `platform` (string, required): Connection target such as instagram, meta, linkedin_page, twitter, google_business, telegram, bluesky, discord, mastodon, devto, hashnode, wordpress, or lemmy.
- `workspace_id` (string): Workspace to connect the account into. Workspace-scoped API keys ignore this.

### `get_connect_session` (~89 tokens)

Poll a Posterly connect session. Use the returned status and next-step guidance to keep the user updated in plain language. Stop when status is connected, failed, cancelled, or expired.

Input parameters:

- `debug` (boolean): When true, include the raw connect session JSON for debugging. Keep false for normal user-facing agent flows.
- `session_id` (string, required): Connect session ID returned by create_connect_session.

### `create_api_key` (~196 tokens)

Create a new Posterly API key for the authenticated user. SECRET-CREATING WRITE: only use after explicit user confirmation. The new key can only request scopes already present on the calling dashboard-created API key; OAuth and managed assistant tokens cannot mint keys.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms that a new secret API key should be created.
- `expires_in_days` (integer): Optional expiry from now, up to 365 days. Omit for no expiry.
- `name` (string): Human-readable key name.
- `scopes` (array): Scopes for the new key. Omit to copy the calling key scopes. Cannot exceed the calling key scopes. billing:read and billing:write allow managing the posterly subscription (cancel/pause/resume/downgra…
- `workspace_id` (string): Optional workspace restriction. Workspace-scoped calling keys cannot create keys outside their workspace.

### `delete_api_key` (~123 tokens)

Revoke a Posterly API key owned by the authenticated user. DESTRUCTIVE: call whoami or use a known key ID, show the user the exact key ID/prefix/name if available, and get explicit confirmation before calling. Cannot revoke the key currently authenticating this request, OAuth-issued keys, or managed assistant keys.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms API key revocation.
- `key_id` (string, required): API key ID to revoke. This is the API key resource ID, not the secret pst_live_ value.

### `get_subscription` (~46 tokens)

Get the authenticated user's posterly subscription: status, tier, cancel-at-period-end, current period end, trial end, and pause state. Read-only. Requires the billing:read scope.

### `cancel_subscription` (~172 tokens)

Cancel the authenticated user's posterly subscription. DESTRUCTIVE billing action; requires the billing:write scope. ALWAYS ask the user why they are cancelling FIRST and pass their answer as `reason` (one of the allowed values). By default the subscription is set to cancel at the end of the current period; pass immediate=true only if the user explicitly wants it cancelled right now. Only call after the user explicitly confirms.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms the cancellation.
- `feedback` (string): Optional free-text detail the user gave about why they are cancelling.
- `immediate` (boolean): Cancel immediately instead of at period end. Defaults to false (cancel at period end).
- `reason` (string, required): Why the user is cancelling. Ask the user before calling; do not guess.

### `pause_subscription` (~66 tokens)

Pause the authenticated user's posterly subscription for 30 days (one pause allowed per 90-day cooldown). Billing action; requires the billing:write scope. Only call after the user explicitly confirms.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms pausing the subscription.

### `resume_subscription` (~28 tokens)

Resume the authenticated user's paused posterly subscription, restoring active billing. Requires the billing:write scope.

### `downgrade_subscription` (~91 tokens)

Downgrade the authenticated user's posterly subscription one tier (or to an explicit lower `tier`) at the next renewal with no proration. Billing action; requires the billing:write scope. Only call after the user explicitly confirms.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms the downgrade.
- `tier` (string): Optional explicit target tier. Omit to drop one tier automatically.

### `list_oauth_clients` (~34 tokens)

List self-serve OAuth developer clients owned by the user. These are public PKCE clients for third-party app integrations.

### `create_oauth_client` (~105 tokens)

Create a public OAuth 2.1 + PKCE developer client. WRITE: confirm app name, redirect URIs, and scopes with the user before calling.

Input parameters:

- `allowed_redirect_uris` (array, required)
- `client_name` (string, required)
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `default_scopes` (array, required)
- `description` (string)
- `homepage` (string)
- `is_active` (boolean)

### `update_oauth_client` (~106 tokens)

Update a self-serve OAuth developer client. WRITE: confirm changed redirect URIs, scopes, and active state before calling.

Input parameters:

- `allowed_redirect_uris` (array)
- `client_id` (string, required)
- `client_name` (string)
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `default_scopes` (array)
- `description` (string)
- `homepage` (string)
- `is_active` (boolean)

### `delete_oauth_client` (~64 tokens)

Delete a self-serve OAuth developer client. DESTRUCTIVE: prevents new authorizations for that client_id; existing access tokens remain revocable as API keys.

Input parameters:

- `client_id` (string, required)
- `confirm` (boolean, required): Must be true after explicit user confirmation.

### `list_platforms` (~71 tokens)

List posterly platform integrations, posting capabilities, content/media limits, settings schemas, helper tools, and analytics support. Use include_planned to show future integration possibilities from the Postiz parity audit.

Input parameters:

- `include_planned` (boolean): Include planned integrations such as reddit, medium, skool, whop.

### `get_platform_schema` (~138 tokens)

Get the platform schema for a specific connected account or platform. Call this before creating posts with platform_settings so you know allowed post types, media limits, helper tools, and field names.

Input parameters:

- `account_id` (string): Connected account ID from list_accounts. Preferred because it returns account context.
- `include_planned` (boolean)
- `platform` (string): Platform ID such as instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, hashnode, wordpress, lemmy. Set i…

### `trigger_platform_helper` (~129 tokens)

Run account-specific platform helper discovery. Available helpers: linkedin.recent_mentions, pinterest.boards, tiktok.creator_info, x.quota.

Input parameters:

- `account_id` (string): Connected social account ID when the helper needs account context.
- `helper` (string, required)
- `params` (object)
- `platform` (string): Platform hint when no account_id is supplied. Supported: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, dev…

### `list_brands` (~62 tokens)

List brands/clients the caller can access. Returns each brand ID, name, workspace ID, source, and how many social accounts are currently assigned to it.

Input parameters:

- `workspace_id` (string): Filter to brands in a specific workspace (get IDs via whoami).

### `get_brand` (~57 tokens)

Get one brand/client by ID. Returns its workspace, source, linked legacy brand group if present, and the number of social accounts assigned to it.

Input parameters:

- `brand_id` (string, required): The brand ID to look up (from list_brands).

### `list_brand_accounts` (~55 tokens)

List the connected social accounts assigned to a brand/client. Use this when a user refers to a brand name rather than a raw account handle.

Input parameters:

- `brand_id` (string, required): The brand ID to inspect (from list_brands).

### `get_brand_profile` (~62 tokens)

Get the extended brand profile for a brand/client. Returns voice/tone guidance, audience, keywords, dos and don’ts, visual notes, and other saved brand context.

Input parameters:

- `brand_id` (string, required): The brand ID to inspect (from list_brands).

### `get_learned_voice` (~118 tokens)

Get the voice posterly has learned from a connected account’s real published captions (the "learned captions" shown on the dashboard). Returns a narrative summary, voice traits, style guidelines, and observed posting habits. Keyed by social account ID (from list_accounts or list_brand_accounts). Returns nothing until the account has enough published posts to learn from. Read-only; this never overwrites the saved brand profile.

Input parameters:

- `account_id` (string|number, required): The social account ID to inspect (from list_accounts or list_brand_accounts).

### `get_performance_profile` (~128 tokens)

Get the performance profile posterly has derived for a connected account from the last 90 days of per-post analytics. Returns coaching stats (format, timing, caption-length patterns), an engagement-rate trend, and a narrative summary. Keyed by social account ID (from list_accounts or list_brand_accounts). Returns nothing until the account has a derived profile; Google Business Profile and other platforms without per-post analytics never get one. Read-only; requires a Pro plan or higher.

Input parameters:

- `account_id` (string|number, required): The social account ID to inspect (from list_accounts or list_brand_accounts).

### `get_post_insights` (~159 tokens)

List per-post feedback insights from the posterly performance feedback loop: for recently published posts, the performance tier (great/good/mixed/poor), a diagnosis, a suggested next action, metrics, and the baseline it was compared against. Filter by account_id, post_id, and checkpoint (1h, 6h, 24h, 72h, 7d). Read-only; requires a Pro plan or higher.

Input parameters:

- `account_id` (string|number): Filter to one social account ID (from list_accounts).
- `checkpoint` (string): Filter to one checkpoint after publish.
- `limit` (integer): Max insights to return (default 20).
- `post_id` (integer): Filter to one post ID.

### `list_post_suggestions` (~129 tokens)

List proactive post suggestions: evidence-based weekly drafts posterly writes in each account's learned voice, each with a rationale tying it back to what has performed well for that account. Filter by account_id and status (pending, scheduled, dismissed; default pending). Read-only; requires a Pro plan or higher. Use dismiss_suggestion to hide one.

Input parameters:

- `account_id` (string|number): Filter to one social account ID (from list_accounts).
- `limit` (integer): Max suggestions to return (default 20).
- `status` (string): Suggestion status to list (default pending).

### `dismiss_suggestion` (~67 tokens)

Dismiss a proactive post suggestion so it stops appearing. WRITE: confirm the exact suggestion with the user first. Never dismisses a suggestion that was already turned into a scheduled post (that would break adoption tracking).

Input parameters:

- `suggestion_id` (string, required): Suggestion ID from list_post_suggestions.

### `submit_agent_feedback` (~102 tokens)

Submit bounded private operational telemetry after a concrete posterly workflow outcome. This does not alter product content but writes a private feedback event. Never include API keys, prompts, captions, media URLs, personal data, or fabricated outcomes.

Input parameters:

- `client` (string)
- `comment` (string)
- `context` (object)
- `error_code`
- `outcome` (string, required)
- `source` (string, required)
- `tool` (string, required)

### `validate_post` (~627 tokens)

Validate and normalize one post without creating it. This does not create records, copy remote media, consume post-item/storage quota, reserve X quota, emit webhooks, or enqueue publication. Third-party media may return remote_media_not_materialized because live create performs storage copy and final byte validation. Use this before showing the final preview and asking for confirmation to call create_post.

Input parameters:

- `account_id` (string): Social account ID (from list_accounts)
- `caption` (string): The post caption/text content. Ignored when `thread_posts` is provided.
- `instagram_settings` (object): Instagram-specific settings: post_type (post/feed/story/reel/carousel), collaborators, user_tags, first_comment, media_alt_texts, is_trial_reel, graduation_strategy (defaults to MANUAL), reel_cover_u…
- `media_url` (string): Media URL to attach. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this too…
- `media_urls` (array): Multiple media URLs for carousel or multi-image posts. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. For TikTok, 2 or more…
- `platform` (string): Platform name (required with username). Supported: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, ha…
- `platform_settings` (object): Platform-specific settings for the selected account. Use this for non-Instagram settings and prefer it over raw metadata.
- `post_type` (string): Optional post type: text, image, video, carousel, reel, story, story_series, document, photo, cover_photo, x_thread, or threads_thread. Omit it for auto-detection from media. For TikTok photo posts,…
- `scheduled_at` (string): ISO 8601 datetime for scheduling (e.g. 2026-03-05T09:00:00Z). Omit for immediate publish.
- `thread_posts` (array): For X or Threads only: array of 2+ strings, one per post in the thread. The first entry leads, the rest reply in order. When set, the platform must be twitter or threads.
- `username` (string): Account username (alternative to account_id)
- `workspace_id` (string): Workspace ID to assign the post to (from whoami). If omitted, uses the account's workspace or the caller's default workspace.

### `create_post` (~1321 tokens)

Schedule or immediately publish a social media post. This is a DESTRUCTIVE WRITE that creates content on the user's real social accounts - once scheduled_at passes, it will be posted publicly and cannot be un-posted.

REQUIRED BEFORE CALLING:
1\. Call `whoami` at the start of any new session to confirm which workspace and user you are acting for.
2\. Show the user a preview containing ALL of: account(s) and platform(s), final caption text, scheduled time (in the user's timezone), media attached (if any), and workspace name.
3\. Get explicit confirmation from the user (e.g. "post it", "yes schedule that", "looks good") BEFORE calling this tool. Do NOT infer consent from earlier instructions like "post about X every Monday" - confirm each individual post or the entire batch.
4\. If scheduling multiple posts in one turn, list every post first and confirm the batch as a whole, then prefer `create_posts_batch` so they are created in one API request.

AFTER CALLING: Tell the user the post was created, include the Posterly dashboard link returned by the tool, and offer the next natural action. Do not narrate raw HTTP, curl, or API plumbing.

Provide either account_id OR username+platform to identify the account. If scheduled_at is omitted, the post publishes immediately. If workspace_id is omitted, the server resolves one from the social account, falling back to the caller's default (personal) workspace - pass workspace_id explicitly if the user has more than one workspace.

MEDIA URLS: Posterly storage URLs are used as-is. Third-party HTTP(S) media URLs are copied into Posterly storage before the post is saved, so API-created posts do not later fail on expired signed URLs. Short-lived signed URLs must still be live when this tool runs. You can also call `upload_media_from_url` first if you want to upload once and reuse the returned Posterly URL across posts.

THREADS: Pass `thread_posts` (an array of 2+ strings) to schedule a multi-post thread on X (Twitter) or Threads (Meta…

Input parameters:

- `account_id` (string): Social account ID (from list_accounts)
- `caption` (string): The post caption/text content. Ignored when `thread_posts` is provided.
- `confirm` (boolean, required): Must be true after explicit user confirmation of the post/account/workspace/schedule.
- `instagram_settings` (object): Instagram-specific settings: post_type (post/feed/story/reel/carousel), collaborators, user_tags, first_comment, media_alt_texts, is_trial_reel, graduation_strategy (defaults to MANUAL), reel_cover_u…
- `media_url` (string): Media URL to attach. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this too…
- `media_urls` (array): Multiple media URLs for carousel or multi-image posts. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. For TikTok, 2 or more…
- `platform` (string): Platform name (required with username). Supported: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, ha…
- `platform_settings` (object): Platform-specific settings for the selected account. Use this for non-Instagram settings and prefer it over raw metadata.
- `post_type` (string): Optional post type: text, image, video, carousel, reel, story, story_series, document, photo, cover_photo, x_thread, or threads_thread. Omit it for auto-detection from media. For TikTok photo posts,…
- `scheduled_at` (string): ISO 8601 datetime for scheduling (e.g. 2026-03-05T09:00:00Z). Omit for immediate publish.
- `thread_posts` (array): For X or Threads only: array of 2+ strings, one per post in the thread. The first entry leads, the rest reply in order. When set, the platform must be twitter or threads.
- `username` (string): Account username (alternative to account_id)
- `workspace_id` (string): Workspace ID to assign the post to (from whoami). If omitted, uses the account's workspace or the caller's default workspace.

### `create_posts_batch` (~268 tokens)

Create 1-25 scheduled or immediate social posts in one API request. This is a DESTRUCTIVE WRITE that creates content on the user's real social accounts - once scheduled_at passes, posts may go public and cannot be un-posted.

REQUIRED BEFORE CALLING:
1\. Call `whoami` at the start of any new session to confirm which workspace and user you are acting for.
2\. Show the user a preview of EVERY post: account/platform, final caption or thread text, scheduled time in their timezone, media, platform settings, and workspace.
3\. Get explicit confirmation for the whole batch before calling. Do not infer consent from an earlier content plan.

AFTER CALLING: Summarize the batch result in natural language, include the Posterly dashboard link returned by the tool, and avoid narrating raw HTTP, curl, or API plumbing.

Each item accepts the same fields as `create_post`, including `thread_posts`, `platform_settings`, `instagram_settings`, media URLs, and workspace_id. The endpoint may partially succeed; failed items are returned with their index.

Input parameters:

- `confirm` (boolean, required): Must be true after explicit user confirmation of every post in the batch.
- `posts` (array, required): Posts to create. Each item uses the same schema as create_post.

### `find_available_slot` (~179 tokens)

Find available time slots for posting. Respects a 1-hour gap between posts and preferred hours (8am-10pm in the given timezone). Returns up to 10 slots. IMPORTANT: pass a timezone explicitly - default is America/New_York and slots will be off if the user is elsewhere. Pass workspace_id to only avoid collisions with posts in that workspace.

Input parameters:

- `account_ids` (array): Filter slots for specific account IDs
- `count` (number): Number of slots to return (default 5, max 10)
- `timezone` (string): IANA timezone (e.g. Asia/Dubai, Europe/London). Defaults to America/New_York - pass the user's actual timezone or slots will be wrong.
- `workspace_id` (string): Scope slot-finding to a single workspace (get IDs via whoami).

### `list_posts` (~185 tokens)

List upcoming or recent posts. Filter by status (scheduled, published, failed, draft), platform, account_id, or workspace_id. If workspace_id is omitted, posts across every workspace the caller is a member of are returned.

Input parameters:

- `account_id` (string): Filter to a specific social account ID (from list_accounts).
- `limit` (number): Number of posts to return (default 20, max 100)
- `platform` (string): Filter by platform: instagram, facebook, tiktok, twitter, linkedin, youtube, pinterest, threads, google_business, telegram, bluesky, discord, slack, mastodon, devto, hashnode, wordpress, lemmy.
- `status` (string): Filter by status: draft, scheduled, published, failed
- `workspace_id` (string): Filter to posts in a specific workspace (get IDs via whoami).

### `upload_media` (~275 tokens)

Upload an image or video file to posterly storage. Returns a URL that can be used with create_post. Supports JPEG, PNG, GIF, WebP, MP4, MOV, WebM. Images up to 10MB, videos up to 50MB.

This writes to the user's media storage (counts against quota) but does NOT publish the file anywhere. Uploading is safe - it's the subsequent `create_post` call that publishes content, and that tool has its own confirmation requirements.

IMPORTANT: If the user shares an image in the chat, use base64_data (not file_path) since chat-uploaded images are not on the local filesystem. Only use file_path when the user provides an actual local filesystem path - never guess paths.

Input parameters:

- `base64_data` (string): Base64-encoded file data. PREFERRED for images shared directly in chat - extract the image data as base64 and pass it here.
- `content_type` (string): MIME type (auto-detected from filename if omitted)
- `file_path` (string): Absolute local filesystem path (e.g. /Users/name/photo.jpg). Only use when the user gives you an explicit path. Do NOT guess paths for images uploaded in chat.
- `filename` (string, required): Filename with extension (e.g. photo.jpg, video.mp4)

### `upload_media_from_url` (~114 tokens)

Fetch an image or video from a public HTTPS URL into Posterly storage. Returns a URL that can be used with create_post. You can also pass public HTTP(S) media URLs directly to create_post/update_post; use this tool when you want to upload once and reuse the returned Posterly URL.

Input parameters:

- `content_type` (string): Optional MIME type override.
- `filename` (string): Optional filename override.
- `url` (string, required): Public HTTPS URL for the image or video. Local/private network URLs are blocked.

### `create_signed_upload` (~92 tokens)

Create a signed upload URL for a larger image or video. Upload the binary to upload_url; the API validates actual bytes before storage, then public_url can be used with create_post.

Input parameters:

- `content_type` (string, required): MIME type, e.g. video/mp4
- `filename` (string, required): Filename with extension, e.g. launch-video.mp4
- `size` (integer, required): File size in bytes

### `get_video_options` (~42 tokens)

List read-only Veo video generation options, input modes, durations, resolutions, aspect ratios, and credit-cost estimates. This does not generate video or spend credits.

### `run_video_function` (~101 tokens)

Run a read-only Veo helper function before generation: list_input_modes, estimate_cost, or validate_request. This does not generate video or spend credits.

Input parameters:

- `functionName` (string, required): Helper function name from get_video_options.tools.
- `identifier` (string, required): Video generator identifier from get_video_options.
- `params` (object): Function parameters. estimate_cost accepts model, duration_seconds, resolution, and output. validate_request accepts a generate_video-style payload.

### `generate_video` (~173 tokens)

Queue a Veo AI video generation job. COSTS VEO CREDITS: confirm prompt, model, duration, resolution, aspect ratio, audio choice, and credit cost with the user before calling. Poll get_video_job for status and final video_url.

Input parameters:

- `aspect_ratio` (string)
- `confirm` (boolean, required): Must be true after explicit user confirmation of prompt, model, duration, resolution, and credit cost.
- `duration_seconds` (number)
- `end_image_url` (string)
- `generate_audio` (boolean)
- `image_url` (string)
- `model` (string)
- `negative_prompt` (string)
- `prompt` (string, required)
- `reference_images` (array)
- `resolution` (string)
- `source_video_url` (string)

### `get_video_job` (~63 tokens)

Get one Veo video generation job by ID, or list recent video jobs when job_id is omitted. Use after generate_video to poll for completed video_url.

Input parameters:

- `job_id` (string)
- `limit` (integer)
- `status` (string)

### `generate_captions` (~239 tokens)

Generate or adapt AI caption suggestions for one or more social platforms. Uses AI Caption Assist quota and returns options only; it does not create or schedule posts. After the user chooses final copy, pass it to create_post or create_posts_batch.

Input parameters:

- `allow_emojis` (boolean)
- `brief` (string): What the post is about. Recommended for generate mode.
- `count` (integer)
- `hashtag_strategy` (string)
- `manual_brand_voice` (object): Use when Posterly asks for brand voice input.
- `mode` (string)
- `platforms` (array, required): Target platforms such as instagram, linkedin, twitter, tiktok, youtube, pinterest, or google_business.
- `preserve_call_to_action` (boolean)
- `preserve_links` (boolean)
- `preserve_mentions` (boolean)
- `social_account_id` (string): Optional connected account ID for brand voice and workspace billing context.
- `source_caption` (string): Required when mode=adapt. The master caption to adapt.
- `source_platform` (string)
- `tone` (string)
- `workspace_id` (string)

### `generate_image` (~435 tokens)

Generate an AI image via Posterly's Nano Banana (Gemini) integration. The image is saved to the user's media storage and the returned URL can be passed to `create_post` as `media_url`.

COSTS CREDITS. Every call consumes part of the user's monthly AI image quota (or purchased credits once the quota is exhausted). Do NOT call speculatively - always describe the image you're about to generate (subject, style, aspect ratio) to the user and get confirmation before calling.

If the user is over their plan limit and has no credits, this tool returns a 402 with upgrade info. Surface that message verbatim - do not retry.

Common aspect ratios by platform:
  • Instagram feed / LinkedIn: 1:1 (square) or 4:5 (portrait)
  • Instagram Story/Reel, TikTok, YouTube Shorts: 9:16
  • YouTube thumbnail, Twitter cards, landscape feed: 16:9
  • Pinterest: 2:3

Input parameters:

- `aspect_ratio` (string): Aspect ratio. Default 1:1. Pick based on target platform (see tool description).
- `confirm` (boolean, required): Must be true after explicit user confirmation of subject, style, aspect ratio, and credit use.
- `model` (string): flash (default, 1 credit per 1K image) is fast and cost-effective. pro (2 credits per 1K) is higher quality for hero imagery. Start with flash unless quality is critical.
- `prompt` (string, required): Detailed image description. 5-4000 characters. Describe subject, scene, lighting, mood, and style.
- `resolution` (string): Output resolution. Default 1K. Higher resolutions cost more credits. 512 is flash-only.
- `style` (string): Preset style. Default photographic. Use youtube_thumbnail / reel_cover for platform-optimized covers; review_background for testimonial backgrounds.
- `variations` (integer): How many variations to generate. Default 1. Each variation costs credits separately - prefer 1 unless the user explicitly wants options.

### `get_post` (~45 tokens)

Get details of a specific post by ID. Returns caption, status, scheduled time, media, and platform info.

Input parameters:

- `post_id` (number, required): The post ID to look up

### `get_post_missing` (~54 tokens)

Inspect whether a post is missing required content, media, account, platform settings, or metadata before it can publish. Use this to repair failed or imported posts.

Input parameters:

- `post_id` (integer, required): The post ID to inspect.

### `ask_support` (~209 tokens)

Ask Posterly Support AI an authenticated question using Posterly docs plus read-only account/post diagnostics for the caller workspace. Requires POSTERLY_API_KEY with accounts:read and posts:read scopes. Human ticket creation requires request_human=true and confirm_escalation=true after explicit user confirmation.

Input parameters:

- `confirm_escalation` (boolean): Must be true after explicit user confirmation before a human support ticket can be created.
- `conversation_id` (string): Continue a previous support conversation.
- `page_url` (string): Optional Posterly page URL for context.
- `post_id` (integer): Optional post ID to inspect directly.
- `question` (string, required)
- `referenced_post_ids` (array): Optional post IDs to include in read-only diagnostics.
- `request_human` (boolean): Ask for human review. Does not create a ticket unless confirm_escalation is also true.
- `workspace_id` (string): Workspace to inspect. Omit to use the API-key scoped workspace or personal workspace.

### `update_post` (~378 tokens)

Update a scheduled or draft post. DESTRUCTIVE WRITE - overwrites the existing post's caption/media/schedule. Cannot edit published or currently publishing posts.

REQUIRED BEFORE CALLING: Show the user a side-by-side of the CURRENT post (caption, scheduled time, media) and the PROPOSED changes, and get explicit confirmation ("yes update it", "apply those changes") before calling. Do not auto-edit posts based on a general instruction - each edit needs its own confirmation.

Input parameters:

- `caption` (string): New caption/text content
- `confirm` (boolean, required): Must be true after explicit user confirmation of the proposed post update.
- `instagram_settings` (object): Instagram-specific updates: post_type, collaborators, user_tags, first_comment, media_alt_texts, is_trial_reel, graduation_strategy (defaults to MANUAL), reel_cover_url, reel_thumb_offset.
- `media_url` (string): New media URL. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved. Short-lived signed URLs must still be live when this tool runs.
- `media_urls` (array): New media URLs for carousel. Posterly storage URLs are used as-is; third-party HTTP(S) URLs are copied into Posterly storage before the post is saved.
- `platform_settings` (object): Platform-specific settings to merge into the post. Prefer this over raw metadata.
- `post_id` (number, required): The post ID to update
- `post_type` (string): New post type: text, image, video, carousel, reel, story, story_series, document, photo, or cover_photo
- `scheduled_at` (string): New scheduled time (ISO 8601, e.g. 2026-03-10T09:00:00Z)

### `update_post_status` (~128 tokens)

Pause, resume/schedule, or move a post back to draft. DESTRUCTIVE WRITE: changes whether content will publish.

REQUIRED BEFORE CALLING: Fetch the post with `get_post`, show the user current status and proposed status/scheduled_at, then get explicit confirmation. Pass confirm=true only after that confirmation.

Input parameters:

- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `post_id` (number, required): The post ID to update.
- `scheduled_at` (string): ISO 8601 datetime. Required when scheduling a draft.
- `status` (string, required): Target status.

### `update_post_release_id` (~107 tokens)

Set or repair an external release_id and optional group_id on a post. WRITE: call get_post first, show the target post and release/group IDs, then pass confirm=true only after explicit confirmation.

Input parameters:

- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `group_id` (string): Optional external group/campaign ID.
- `post_id` (integer, required): The post ID to update.
- `release_id` (string, required): External release ID to store on the post.

### `delete_post` (~136 tokens)

Delete a scheduled or draft post. DESTRUCTIVE and IRREVERSIBLE - the post and its caption cannot be recovered. Cannot delete published or currently publishing posts.

REQUIRED BEFORE CALLING: Fetch the post with `get_post` first and show the user what will be deleted (caption, account, scheduled time). Get explicit confirmation ("yes delete it", "remove it") before calling. Never delete multiple posts in a single batch without listing each one and confirming the full list.

Input parameters:

- `confirm` (boolean, required): Must be true after explicit user confirmation of the post deletion.
- `post_id` (number, required): The post ID to delete

### `delete_post_group` (~89 tokens)

Delete every draft/scheduled/failed/paused post matching a caller-defined group_id, post_group_id, api_group_id, or release_id. DESTRUCTIVE: inspect the group first, list the affected posts, and pass confirm=true only after explicit confirmation.

Input parameters:

- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `group_id` (string, required): Group/release ID to delete.

### `get_account_analytics` (~153 tokens)

Get daily analytics snapshots and a period summary for a connected social account. Supports Instagram, Facebook, LinkedIn, Google Business Profile, Pinterest, YouTube, and Threads. Uses API-provided display_metrics for platform-native dashboard labels and supports presentation: compact, table, or json.

Input parameters:

- `account_id` (number, required): The social account ID (from list_accounts)
- `from` (string): Start date (ISO date, e.g. 2026-03-19). Defaults to 30 days ago.
- `presentation` (string): Output style: compact bullets, Markdown table, or raw JSON for client-side chart/card rendering.
- `to` (string): End date (ISO date). Defaults to today.

### `get_post_analytics` (~214 tokens)

Get per-post engagement metrics (likes, comments/replies, reach, impressions/views, saves, shares, reposts, quotes, plays, clicks, watch time) for a connected social account. Supports Instagram, Facebook, LinkedIn, Google Business Profile, Pinterest, YouTube, and Threads. Returns the most recent posts first. presentation controls output: compact for Telegram/mobile, table for Markdown clients, json for custom chart/card renderers.

Input parameters:

- `account_id` (number, required): The social account ID (from list_accounts)
- `from` (string): Start date (ISO date, e.g. 2026-03-19). Defaults to 30 days ago.
- `limit` (number): Number of posts to return (default 50, max 200)
- `offset` (number): Pagination offset
- `presentation` (string): Output style: compact bullets, Markdown table, or raw JSON for client-side chart/card rendering.
- `to` (string): End date (ISO date). Defaults to today.

### `list_google_business_reviews` (~145 tokens)

List Google Business Profile reviews for one location/account or every accessible GBP location. Supports rating and unanswered-only filters.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `rating` (integer): Filter to a 1-5 star rating.
- `unanswered` (boolean): Only return reviews without owner replies.
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `get_google_business_review_link` (~145 tokens)

Get the direct public Google review link for a connected Google Business Profile location. Requires account_id or location_id. Returns reviewLink plus the Google Place ID (ChIJ...); that Place ID is output only and must NOT be passed back as location_id to other tools.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID this tool returns. Prefer account_id.
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `audit_google_business_profile` (~122 tokens)

Run a live local-profile audit for a connected Google Business Profile location, including completeness, categories, media, attributes, reviews, and recommendations.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `suggest_google_business_review_reply` (~186 tokens)

Generate short, brand-aware AI reply suggestions for a Google review. Uses the AI Caption Assist allowance; does not post the reply.

Input parameters:

- `account_id` (integer): Optional Google Business account ID for brand voice context.
- `business_name` (string)
- `count` (integer)
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `review_text` (string): Review text. Leave empty for rating-only reviews.
- `reviewer_name` (string)
- `star_rating` (number, required): Review rating from 1 to 5.
- `tone` (string)
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `reply_google_business_review` (~172 tokens)

Post or update the owner reply on a Google Business Profile review. WRITE: show the review, location, and exact reply text to the user, then pass confirm=true only after explicit confirmation.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `comment` (string, required): Exact owner reply text to post.
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `review_name` (string, required): Full Google review resource name.
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `delete_google_business_review_reply` (~155 tokens)

Delete the owner reply from a Google Business Profile review. DESTRUCTIVE: confirm the review and location with the user, then pass confirm=true only after explicit confirmation.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `review_name` (string, required): Full Google review resource name.
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `list_google_business_media` (~147 tokens)

List the photos and videos on a Google Business Profile gallery (the media shown on Maps and Search) for one location/account or every accessible GBP location. This is separate from media attached to a post. Returns each item's resource name, category, format, and URLs.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `add_google_business_media` (~251 tokens)

Add a photo or video to a Google Business Profile gallery (the media shown on Maps and Search). Provide a public https source_url first by uploading via upload_media_from_url or upload_media. COVER and PROFILE are single-slot and replace the existing one. WRITE: show the location, category, and media URL to the user, then pass confirm=true only after explicit confirmation.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `category` (string, required): Which gallery category to add the media to.
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `media_format` (string): Defaults to PHOTO. Use VIDEO for videos (Google caps profile videos at 30s / 75MB).
- `source_url` (string, required): Public https URL of the photo or video (from upload_media / upload_media_from_url).
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `delete_google_business_media` (~187 tokens)

Remove a photo or video from a Google Business Profile gallery. Get media_name from list_google_business_media. This permanently deletes the item from the public profile. WRITE: show the exact media item and location to the user, then pass confirm=true only after explicit confirmation.

Input parameters:

- `account_id` (integer): Google Business account ID from list_accounts.
- `confirm` (boolean, required): Must be true after explicit user confirmation.
- `location_id` (string): Google Business numeric location id (the location_id/platform_user_id from list_accounts, e.g. "197940849675145390"). NOT the ChIJ... Place ID returned by get_google_business_review_link. Prefer acco…
- `media_name` (string, required): Full media resource name from list_google_business_media (accounts/.../locations/.../media/...).
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `list_activity` (~118 tokens)

List recent activity and publish events for posts, including status changes, publish attempts, failures, and retries. Use this as the agent notifications feed.

Input parameters:

- `limit` (integer): Number of items to return. Default 50, max 100.
- `post_id` (integer): Filter to one post ID.
- `since` (string): ISO datetime. Return events created at or after this time.
- `type` (string): Event source filter. Defaults to all.
- `workspace_id` (string): Filter to a workspace ID from whoami.

### `get_updates` (~95 tokens)

Get the latest posterly product updates and news from the updates feed: new features, improvements, and fixes. Requires an active posterly subscription.

Input parameters:

- `include_content` (boolean): Include the full markdown body of each update. Defaults to false.
- `limit` (integer): Number of updates to return. Default 10, max 50.
- `since` (string): ISO date. Return updates published on or after this date.

### `list_webhooks` (~43 tokens)

List API webhook subscriptions, their event filters, active state, and most recent delivery status.

Input parameters:

- `workspace_id` (string): Filter to a workspace ID from whoami.

### `create_webhook` (~156 tokens)

Create a webhook subscription for post/account/analytics events. WRITE WITH OUTBOUND SIDE EFFECTS: show the user the target URL, workspace, events, and active state, then get explicit confirmation before calling. The response includes the signing secret once.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms webhook creation.
- `description` (string)
- `events` (array): Events to deliver. Defaults to core post lifecycle events.
- `is_active` (boolean): Defaults to true.
- `url` (string, required): HTTPS webhook endpoint URL. Localhost HTTP is allowed by the API for development.
- `workspace_id` (string): Optional workspace filter. Omit for all workspaces owned by the API key user.

### `update_webhook` (~113 tokens)

Update a webhook URL, events, workspace, description, or active state. WRITE WITH OUTBOUND SIDE EFFECTS: list the current webhook first and get explicit confirmation before calling.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms the webhook update.
- `description`
- `events` (array)
- `is_active` (boolean)
- `url` (string)
- `webhook_id` (string, required): Webhook ID from list_webhooks.
- `workspace_id` (string|null)

### `delete_webhook` (~71 tokens)

Delete a webhook subscription. DESTRUCTIVE: list the webhook first, show the user its URL/events/workspace, and get explicit confirmation before calling.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms webhook deletion.
- `webhook_id` (string, required): Webhook ID from list_webhooks.

### `test_webhook` (~67 tokens)

Send a signed webhook.test delivery to a webhook URL. OUTBOUND SIDE EFFECT: get explicit confirmation before sending a test request.

Input parameters:

- `confirm` (boolean, required): Must be true after the user explicitly confirms the test delivery.
- `webhook_id` (string, required): Webhook ID from list_webhooks.

### `get_x_posting_quota` (~59 tokens)

Get managed X posting quota for a workspace, including total monthly allowance, used posts, remaining posts, and URL-blocking status.

Input parameters:

- `workspace_id` (string): Workspace ID from whoami. Defaults to the caller personal workspace context.

## Diagnostics

Captured diagnostic sections: Provenance, Dependencies. The full working is on the page: https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server#diagnostics

## Score history

- 2026-08-03: 60
- 2026-08-02: 60
- 2026-08-01: 13
- 2026-07-31: 13
- 2026-07-30: 0
- 2026-07-28: 0
- 2026-07-27: 19

## Links

- npm package: https://www.npmjs.com/package/posterly-mcp-server
- Socket report: https://socket.dev/npm/package/posterly-mcp-server
- Website: https://www.poster.ly/mcp
- Changelog RSS feed: https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server/changelog.json
- HTML version of this page: https://verifymcp.io/servers/awpthorp-posterly/posterly-mcp-server
