Planify
NPM · @PLANIFYAPPS/MCP · SCANNED SEP 23
Schedule and publish social posts to Twitter, Instagram, LinkedIn, Pinterest, Bluesky and more.
Available components
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
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
claude mcp add com-planifyapps-planify -- npx -y @planifyapps/mcp
{
"mcpServers": {
"com-planifyapps-planify": {
"command": "npx",
"args": [
"-y",
"@planifyapps/mcp"
]
}
}
} {
"servers": {
"com-planifyapps-planify": {
"command": "npx",
"args": [
"-y",
"@planifyapps/mcp"
]
}
}
} codex mcp add com-planifyapps-planify -- npx -y @planifyapps/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"com-planifyapps-planify": {
"type": "local",
"command": [
"npx",
"-y",
"@planifyapps/mcp"
],
"enabled": true
}
}
} openclaw mcp add com-planifyapps-planify --command npx --arg -y --arg @planifyapps/mcp
mcp_servers:
com-planifyapps-planify:
command: "npx"
args: ["-y", "@planifyapps/mcp"] {
"McpServers": {
"com-planifyapps-planify": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@planifyapps/mcp"
]
}
}
} assistant mcp add com-planifyapps-planify -t stdio -c npx -a -y @planifyapps/mcp
{
"mcpServers": {
"com-planifyapps-planify": {
"command": "npx",
"args": [
"-y",
"@planifyapps/mcp"
]
}
}
} 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.
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 →
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 →
planify_channel_settings Planify: what this channel accepts ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | From planify_list_channels. |
No output schema declared.
No examples provided.
planify_channel_trigger Planify: run a channel lookup ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | From planify_list_channels. |
| data | object | – | Arguments, matching that tool's input schema. Twitter communities needs { query }. |
| method_name | string | yes | E.g. "boards" for Pinterest, "communities" for Twitter. |
No output schema declared.
No examples provided.
planify_create_post Planify: create a post (draft, scheduled, or publish now) ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_ids | array | – | Required when content is a string. |
| content | – | yes | One string for all channels, or per-channel objects for different copy. |
| idempotency_key | string | – | Send a stable value so a retry cannot double-post. Generate one per intended post. |
| media | array | – | Attachments with alt text, in order. Use instead of media_urls — not alongside it — when any attachment has alt text. |
| media_urls | array | – | From planify_upload_media or planify_upload_media_from_url. In order — index 0 is first in the post. |
| platform_settings | object | – | Keyed by platform: { pinterest: { board_id } }. Shape comes from planify_channel_settings. |
| scheduled_at | string | – | UTC ISO-8601. Required when type is "schedule". planify_next_slot suggests one. |
| thread | array | – | Post as a thread where supported. Part one becomes the body. |
| type | string | – | Default draft. "now" needs the posts:publish scope and the user's confirmation. |
No output schema declared.
No examples provided.
planify_delete_post Planify: delete a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| post_id | string | yes | From planify_list_posts. |
No output schema declared.
No examples provided.
planify_get_post Planify: read one 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.
| Name | Type | Req | Description |
|---|---|---|---|
| post_id | string | yes | From planify_list_posts. |
No output schema declared.
No examples provided.
planify_get_schedule Planify: read a channel's posting 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | From planify_list_channels. |
No output schema declared.
No examples provided.
planify_list_channels Planify: list connected 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 Planify: list uploaded 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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Default 50. |
| mime_type | string | – | Prefix match on content type, e.g. "image/" or "video/mp4". Narrows the page, not the whole library. |
| offset | integer | – | From next_offset on the previous page. |
No output schema declared.
No examples provided.
planify_list_posts 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | – | Only posts for this channel. |
| from | string | – | ISO-8601. Start of the scheduled_at window. |
| limit | integer | – | Default 50, max 100. |
| platform | string | – | Platform slug, e.g. "instagram". |
| status | string | – | – |
| to | string | – | ISO-8601. End of the scheduled_at window. |
No output schema declared.
No examples provided.
planify_me Planify: account and plan ~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 Planify: next free posting 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.
| Name | Type | Req | Description |
|---|---|---|---|
| after | string | – | ISO-8601. Search from later than now. |
| channel_id | string | yes | From planify_list_channels. |
| count | integer | – | How many slots to return. Default 1. |
No output schema declared.
No examples provided.
planify_publish_post Planify: publish an existing post now ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| post_id | string | yes | From planify_list_posts. |
No output schema declared.
No examples provided.
planify_set_schedule Planify: set a channel's posting 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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_id | string | yes | From planify_list_channels. |
| slots | array | yes | The whole weekly grid. An empty array clears it. |
| timezone | string | yes | IANA zone name, e.g. "Asia/Kolkata" or "America/New_York". |
No output schema declared.
No examples provided.
planify_update_post Planify: edit a draft or scheduled 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.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | – | – |
| media | array | – | Attachments with alt text, in order. Use instead of media_urls when any has alt text. |
| media_urls | array | – | Replaces the attachments. In order — index 0 is first in the post. |
| platform_settings | object | – | Keyed by platform, as in planify_create_post. |
| post_id | string | yes | From planify_list_posts. |
| scheduled_at | string|null | – | UTC ISO-8601, or null to unschedule. Required when moving to "scheduled". |
| status | string | – | Move between draft and scheduled. Cannot be used to publish. |
No output schema declared.
No examples provided.
planify_upload_media Planify: upload an image or video from this machine ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| files | array | yes | Up to 10 files, in the order they should appear in the post. |
No output schema declared.
No examples provided.
planify_upload_media_from_url Planify: add an image or video from a 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.
| Name | Type | Req | Description |
|---|---|---|---|
| urls | array | yes | One or more publicly reachable http(s) URLs. |
No output schema declared.
No examples provided.
planify_validate_post Planify: check a post without creating it ~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.
| Name | Type | Req | Description |
|---|---|---|---|
| channel_ids | array | – | Required when content is a string. |
| content | – | yes | As in planify_create_post. |
| media | array | – | Attachments with alt text, in order. Use instead of media_urls when any has alt text. |
| media_urls | array | – | – |
| platform_settings | object | – | – |
| scheduled_at | string | – | UTC ISO-8601. |
| thread | array | – | – |
| type | string | – | Default draft. Affects whether scheduled_at is required. |
No output schema declared.
No examples provided.
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.