Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Planify

NPM · @PLANIFYAPPS/MCP · SCANNED SEP 23

Schedule and publish social posts to Twitter, Instagram, LinkedIn, Pinterest, Bluesky and more.

Available components

+2 this week 77 Trust /100
Trust breakdown (7 categories)

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. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 96 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency19
  • Repository check failed: the declared repository URL returned HTTP 404. See how to fix → View diagnostics → Fail
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 29 days ago).Pass
  • Security-disclosure policy not yet verified: we couldn't inspect the source repository.Unverified
Schema Quality & AI Usability70
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 3033 tokens (~178/item across 17 items; 17 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management97
  • Stability observed for 29 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage97
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 90% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 18 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Planify MCP server?

Planify runs locally as an npm package, launched with npx -y @planifyapps/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · @planifyapps/mcp

# add to Claude Code
claude mcp add com-planifyapps-planify -- npx -y @planifyapps/mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "com-planifyapps-planify": {
      "command": "npx",
      "args": [
        "-y",
        "@planifyapps/mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "com-planifyapps-planify": {
      "command": "npx",
      "args": [
        "-y",
        "@planifyapps/mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add com-planifyapps-planify -- npx -y @planifyapps/mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-planifyapps-planify": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@planifyapps/mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add com-planifyapps-planify --command npx --arg -y --arg @planifyapps/mcp
# ~/.hermes/config.yaml
mcp_servers:
  com-planifyapps-planify:
    command: "npx"
    args: ["-y", "@planifyapps/mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "com-planifyapps-planify": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@planifyapps/mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add com-planifyapps-planify -t stdio -c npx -a -y @planifyapps/mcp
// mcp.json
{
  "mcpServers": {
    "com-planifyapps-planify": {
      "command": "npx",
      "args": [
        "-y",
        "@planifyapps/mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 22 Sept 26 −1
    • Stability: pass → 0.93 functional
  • 21 Sept 26 +1
    • Stability: 0.97 → pass security
  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 17 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Sept 26 −4
    • Stability: pass → 0.77 functional
  • 13 Sept 26 +1
    • Stability: 0.97 → pass security
  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 23 Sept 2026 · Analysed npm/@planifyapps/mcp@0.4.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 96 packages
Packages resolved 96
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 17 exposed · ~2,553 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
planify_channel_settings ~91

Read this before writing a post. Returns, for one specific channel: the character limit, how much media it accepts, whether media is required, the rules that decide whether publishing succeeds, a JSON Schema for its platform settings, and any lookups it supports. Per channel, not per platform, because a Facebook Page and a profile differ.

NameTypeReqDescription
channel_idstringyesFrom planify_list_channels.

No output schema declared.

No examples provided.

planify_channel_trigger ~126

Fetches values that cannot be guessed — Pinterest boards, Twitter communities. Which lookups exist for a channel is listed as tools[].method_name by planify_channel_settings, and each says which post setting its result fills in. A Pinterest pin cannot be created without running the boards lookup first.

NameTypeReqDescription
channel_idstringyesFrom planify_list_channels.
dataobjectArguments, matching that tool's input schema. Twitter communities needs { query }.
method_namestringyesE.g. "boards" for Pinterest, "communities" for Twitter.

No output schema declared.

No examples provided.

planify_create_post ~457

Creates a post. Defaults to a draft. content as a string sends the same copy to every channel in channel_ids. As an array of { channel_id, content } it gives per-platform copy — which is what you want when the same idea needs 280 characters on Twitter and 2,200 on Instagram. Call planify_channel_settings first and honour what it returns, including any required platform_settings such as a Pinterest board_id. Attachments publish in the order given — media[0] is the first image, and for an Instagram carousel that is the first slide. Reordering the array reorders the post. Prefer media: [{ url, alt }] over media_urls when the images carry information: alt text is the only machine-readable copy of what is on a data slide, and on the platforms that accept it there is no other way to add it to a scheduled post. limits.supports_alt_text on planify_channel_settings says whether this channel delivers it. type "now" publishes immediately and cannot be undone. Only use it when the user has confirmed this specific post should go out now; otherwise create a draft or schedule it.

NameTypeReqDescription
channel_idsarrayRequired when content is a string.
contentyesOne string for all channels, or per-channel objects for different copy.
idempotency_keystringSend a stable value so a retry cannot double-post. Generate one per intended post.
mediaarrayAttachments with alt text, in order. Use instead of media_urls — not alongside it — when any attachment has alt text.
media_urlsarrayFrom planify_upload_media or planify_upload_media_from_url. In order — index 0 is first in the post.
platform_settingsobjectKeyed by platform: { pinterest: { board_id } }. Shape comes from planify_channel_settings.
scheduled_atstringUTC ISO-8601. Required when type is "schedule". planify_next_slot suggests one.
threadarrayPost as a thread where supported. Part one becomes the body.
typestringDefault draft. "now" needs the posts:publish scope and the user's confirmation.

No output schema declared.

No examples provided.

planify_delete_post ~88

Removes a draft or scheduled post so it will not go out. On an already-published post this deletes only Planify's record — the post stays live on the platform and must be removed there. The response says so when that is what happened. Confirm with the user before deleting anything they did not ask you to delete.

NameTypeReqDescription
post_idstringyesFrom planify_list_posts.

No output schema declared.

No examples provided.

planify_get_post ~87

One post in full: content, attachments with their alt text, platform settings, and what happened when it published — permalink, published_at, or the platform's error. This is how to answer "did post X go out, and where is it" for a post that was scheduled rather than published on the spot.

NameTypeReqDescription
post_idstringyesFrom planify_list_posts.

No output schema declared.

No examples provided.

planify_get_schedule ~72

The weekly slots and the timezone they are written in. Returns schedule: null when the channel has none — which is also why planify_next_slot would return slot: null, so read this first if that happens rather than inventing a time.

NameTypeReqDescription
channel_idstringyesFrom planify_list_channels.

No output schema declared.

No examples provided.

planify_list_channels ~54

Connected social accounts, with the channel id needed by every other tool. Channels the plan does not cover are included but marked available: false — so "not connected" and "not on your plan" stay distinguishable.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

planify_list_media ~139

Media already in this account, newest first — including files uploaded through the Planify web app, not just through this server. That is what makes it possible to finish a post someone started in the browser: the images are already there, and this is how to name them. Returns next_offset when more pages exist; null means this was the last.

NameTypeReqDescription
limitintegerDefault 50.
mime_typestringPrefix match on content type, e.g. "image/" or "video/mp4". Narrows the page, not the whole library.
offsetintegerFrom next_offset on the previous page.

No output schema declared.

No examples provided.

planify_list_posts ~200

Posts in this account — drafts, scheduled, and published — newest scheduled first. Call this before adding to a queue, so "what is already going out this week" is answered before "add another". Each post carries its delivery outcome: status, published_at, permalink once it is live, and last_publish_error when a platform rejected it. A date window (from/to) filters on scheduled_at, so it excludes undated drafts — which is correct for a calendar question, and worth knowing when a draft seems missing.

NameTypeReqDescription
channel_idstringOnly posts for this channel.
fromstringISO-8601. Start of the scheduled_at window.
limitintegerDefault 50, max 100.
platformstringPlatform slug, e.g. "instagram".
statusstring
tostringISO-8601. End of the scheduled_at window.

No output schema declared.

No examples provided.

planify_me ~116

The plan, the permissions this API key holds, and quota remaining. Call this first if a later call fails with a payment or permission error — it says exactly what the key can and cannot do. The `endpoints` block lists every endpoint split into what this key can call and what it cannot, with the missing scope named per entry. Read it instead of discovering the boundary by being refused: a key without posts:publish can prepare and schedule everything and publish nothing, and saying so up front is better than failing the call.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

planify_next_slot ~106

The next free time from the weekly posting schedule the user already set, skipping slots already taken. Prefer this over choosing a time yourself. Returns slot: null when the channel has no schedule — then ask the user, or send an explicit scheduled_at.

NameTypeReqDescription
afterstringISO-8601. Search from later than now.
channel_idstringyesFrom planify_list_channels.
countintegerHow many slots to return. Default 1.

No output schema declared.

No examples provided.

planify_publish_post ~111

Publishes a post that already exists — the approval half of "let the agent draft it and I will approve". Irreversible and public. Needs the posts:publish scope, which keys do not carry unless asked for. Only call this when the user has confirmed this specific post should go out now; if they have not, leave it as a draft and tell them how to review it. Returns the permalink for each channel it reached.

NameTypeReqDescription
post_idstringyesFrom planify_list_posts.

No output schema declared.

No examples provided.

planify_set_schedule ~191

Sets the weekly grid planify_next_slot draws from. Replaces the whole schedule, so send every slot you want, not just new ones. Times are local wall-clock time in `timezone`, never UTC: a slot written as 12:30 in Asia/Kolkata stays 12:30 to the audience across a daylight-saving change, which a UTC time would not. Ask the user which zone they mean rather than assuming — an hour's error here is invisible until posts go out at the wrong time. This is the user's publishing rhythm, not an implementation detail. Confirm before changing a schedule they already set.

NameTypeReqDescription
channel_idstringyesFrom planify_list_channels.
slotsarrayyesThe whole weekly grid. An empty array clears it.
timezonestringyesIANA zone name, e.g. "Asia/Kolkata" or "America/New_York".

No output schema declared.

No examples provided.

planify_update_post ~239

Changes a post that has not published yet. Send only the fields to change. This is the tool that makes correcting a mistake possible: without it the only way to change a scheduled post is to create a second one, which is how duplicates happen. Prefer editing over recreating. A published post cannot be edited and the call is refused — Planify's copy would then claim text the audience never saw. Editing what is already live is a platform-side action, not this.

NameTypeReqDescription
contentstring
mediaarrayAttachments with alt text, in order. Use instead of media_urls when any has alt text.
media_urlsarrayReplaces the attachments. In order — index 0 is first in the post.
platform_settingsobjectKeyed by platform, as in planify_create_post.
post_idstringyesFrom planify_list_posts.
scheduled_atstring|nullUTC ISO-8601, or null to unschedule. Required when moving to "scheduled".
statusstringMove between draft and scheduled. Cannot be used to publish.

No output schema declared.

No examples provided.

planify_upload_media ~144

Uploads local files and returns media_urls to pass to planify_create_post. Use this for anything an agent has just produced — rendered slides, a chart, an exported video — which lives on disk and has no public URL yet. Files are sent in the order given, and that order is the order they appear in the post: for an Instagram carousel, files[0] is the first slide. Prefer this over planify_upload_media_from_url unless the file is already published somewhere public — uploading directly avoids having to host the image before the post exists.

NameTypeReqDescription
filesarrayyesUp to 10 files, in the order they should appear in the post.

No output schema declared.

No examples provided.

planify_upload_media_from_url ~78

Planify downloads the file and returns media_urls to pass to planify_create_post. Use this when the image already exists at a public URL — the usual case after generating one. The URL must be publicly reachable; private and internal addresses are refused.

NameTypeReqDescription
urlsarrayyesOne or more publicly reachable http(s) URLs.

No output schema declared.

No examples provided.

planify_validate_post ~254

Takes the same arguments as planify_create_post and reports whether they would be accepted. Creates nothing, publishes nothing. Use it when a post is close to a limit, or when a platform has rules you are unsure you have satisfied — it is cheaper than finding out by leaving a failed draft in someone's queue. Returns errors with the field, the rule and the numbers, plus warnings for things that would be silently ignored (alt text a platform will not deliver, a thread on a platform without threads). Content and settings only: plan limits and quotas are checked when the post is actually created, so a valid result is not a guarantee the create call will succeed. planify_me covers the plan side.

NameTypeReqDescription
channel_idsarrayRequired when content is a string.
contentyesAs in planify_create_post.
mediaarrayAttachments with alt text, in order. Use instead of media_urls when any has alt text.
media_urlsarray
platform_settingsobject
scheduled_atstringUTC ISO-8601.
threadarray
typestringDefault draft. Affects whether scheduled_at is required.

No output schema declared.

No examples provided.

Common questions

What is the Planify MCP server?

Planify is an MCP server listed in the public MCP registry as com.planifyapps/planify. Schedule and publish social posts to Twitter, Instagram, LinkedIn, Pinterest, Bluesky and more. This page covers its npm package (@planifyapps/mcp).

Is the Planify MCP server safe to use?

Planify scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 23 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Planify MCP server expose?

Planify exposes 17 tools: planify_me, planify_list_channels, planify_channel_settings, planify_channel_trigger, planify_next_slot, and 12 more. Their descriptions and schemas cost roughly 2,553 tokens of context every time the server is loaded.

Is the Planify MCP server still maintained?

Planify is still listed as active in the MCP registry. We last reached this channel on 23 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Planify MCP server under?

Planify declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.