Atlas / MCP servers / postbasehq / postbase

postbaseCAUTION

mcp/postbasehq/postbase

Open-source social media scheduler with an MCP server: post to X, LinkedIn, Bluesky, Mastodon, TikTok and YouTube, or let your AI do it.

Verdict
CAUTION
Grade
B
Trust score
81 /100
Exposed tools
13 4r · 9w · 0d
Transport
—
License
AGPL-3.0
Stars
11
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

The social scheduler even your AI can run.

Postbase is an open-source, MCP-native social media scheduler. Connect your channels, compose and schedule posts, and Postbase publishes them across every channel on time — from a clean dashboard, or straight from the AI tools you already work in.

  • MCP-native — Claude, ChatGPT, Cursor, Claude Code and other MCP clients can

draft and schedule posts through the hosted server at https://mcp.postbase.so/mcp (OAuth sign-in) or the `@postbasehq/mcp` npm package (API key). There's a REST API too.

  • Built-in AI agent — a chat in the app that drafts posts and schedules them

once you confirm.

  • Self-host free, or use the [hosted cloud](https://www.postbase.so/pricing) —

same product either way.

Channels: X, LinkedIn, Bluesky, Mastodon, TikTok, YouTube · Instagram, Facebook and Threads coming soon.

Docs: docs.postbase.so

Tech stack

  • Next.js (App Router) + TypeScript + Tailwind
  • Supabase — Postgres, Auth, Storage
  • Vercel Cron — scheduled-publishing poller
  • `@postbasehq/mcp` — MCP server (npm)

Getting started

npm install
cp .env.example .env.local   # fill in your Supabase (and later, platform) keys
npm run dev

Apply the database schema in supabase/migrations/ (via the Supabase SQL editor or the CLI). To run the scheduled publisher locally (polls the publish endpoint):

npm run poll   # in a second terminal

In production, a Vercel Cron job hits /api/cron/publish every minute (vercel.json), so no separate worker is needed.

MCP server

Add Postbase to your AI client and let an agent schedule posts for you. The MCP server lives in its own repo: [postbasehq/mcp](https://github.com/postbasehq/mcp) (published as `@postbasehq/mcp` on npm). Tools: list_channels,

Read from source at commit d3b536be5faeOBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add postbase --env ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY} --env API_KEY_PEPPER=${API_KEY_PEPPER} --env CRON_SECRET=${CRON_SECRET} --env GITHUB_TOKEN=${GITHUB_TOKEN} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "postbase": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ANTHROPIC_API_KEY": "${ANTHROPIC_API_KEY}",
        "API_KEY_PEPPER": "${API_KEY_PEPPER}",
        "CRON_SECRET": "${CRON_SECRET}",
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  }
}
03

Exposed tools (13)

4 read · 9 write · 0 destructive.

ToolRiskDescription
ask_userreadAsk the user one question with tap-to-answer options. They can also type their own answer. End your turn after calling this.
cancel_postwriteCancel a scheduled post (reverts it to a draft) by its id.
draft_postwriteShow the user a post draft they can save to Postbase or schedule. Does not post anything.
generate_imagewriteGenerate an image from a text description to attach to a post. Returns a URL. Only use when the user wants visual content. Takes a few seconds.
list_channelsreadList the user
list_postsreadList the user
list_scheduledreadList the user
propose_postwritePropose a post or thread for the user to review and schedule. This does NOT publish or schedule — it shows the user an editable preview card with a Schedule button. Always use real channel_ids from list_channels. Provide
rememberwriteSave what you know about the user and their business, shared with all their bots. Pass the complete note (it replaces the old one); a short factual brief.
run_sweepwriteCheck your listening sources now for anything new. Its summary and findings are shown to the user as their own message.
save_listen_setupwriteSave (or replace) what you listen for, where, and when, and start the schedule. Pass the complete setup.
set_identitywriteName yourself and record your job, once the user has said what they want you to do.
set_statuswritePause or resume your scheduled listening.
04

Trust audit

CAUTIONgrade B · trust 81/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (5 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (17)

HIGHHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.env.example:13
DATABASE_URL=postgresql://postgres:[email protected]:5432/postgres
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
scripts/seo-check.mjs:166
page.hash = createHash("sha1").update(`${page.title}\n${page.description}\n${text.replace(/\s+/g, " ")}`).digest("hex");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
app/(app)/composer/[id]/page.tsx:11
import { updatePost } from "../../actions";
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/api-tier1.test.ts:228
expect(urlProblem("https://169.254.169.254/latest")).toMatch(/private/);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/api-tier1.test.ts:230
expect(urlProblem("https://metadata.google.internal/x")).toMatch(/private/);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/mastodon-instance.test.ts:5
"evil.nip.io": ["169.254.169.254"],
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/mastodon-instance.test.ts:30
"metadata.google.internal",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/media-urls.test.ts:22
["internal address", "https://169.254.169.254/latest/meta-data/"],
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/api-tier1.test.ts:227
expect(urlProblem("https://127.0.0.1/a.png")).toMatch(/private/);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/api-tier1.test.ts:228
expect(urlProblem("https://169.254.169.254/latest")).toMatch(/private/);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/media-urls.test.ts:22
["internal address", "https://169.254.169.254/latest/meta-data/"],
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/media-urls.test.ts:85
"https://169.254.169.254/latest",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/publisher.test.ts:90
mediaRows = [{ storage_url: "https://169.254.169.254/latest/meta-data/", type: "image/png" }];
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@anthropic-ai/sdk, @aws-sdk/client-s3, @aws-sdk/s3-request-presigner, @sentry/nextjs, @supabase/ssr, @supabase/supabase-js, @vercel/analytics, framer-motion
Why it matters. 24 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
content/blog/bluesky-api-post.md:49
The `accessJwt` only lasts a few minutes. For a long-running app, refresh it with `com.atproto.server.refreshSession`. For scheduled posting, we simply create a fresh session right before each post.
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
content/blog/x-api-post-tweet.md:54
Exchange the code at `POST https://api.x.com/2/oauth2/token` with the verifier, and store both tokens. Refresh the access token with `grant_type=refresh_token` before it expires. The refresh response
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
content/blog/automate-social-media-with-n8n.md:23
2. Open **AI & API** and create an API key. Name it "n8n" so you know where it's used. The key is shown once, so copy it now.
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha d3b536be5faefull audit observations/trust-audit/mcp-server/postbasehq__postbase.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10d3b536be5faeCAUTIONB81first audit
06

Questions

What is the postbase MCP server?

Open-source social media scheduler with an MCP server: post to X, LinkedIn, Bluesky, Mastodon, TikTok and YouTube, or let your AI do it.

What tools does postbase expose?

13 in total: 4 read-only, 9 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is postbase safe to connect to an agent?

With care. The audit graded it B (81/100) and found 17 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does postbase need?

It reads ANTHROPIC_API_KEY, API_KEY_PEPPER, CRON_SECRET, GITHUB_TOKEN, HIGGSFIELD_API_KEY, LINKEDIN_CLIENT_SECRET, META_APP_SECRET, NEXT_PUBLIC_SUPABASE_ANON_KEY, OPENAI_API_KEY, R2_ACCESS_KEY_ID, R2_SECRET_ACCESS_KEY and REDDIT_CLIENT_SECRET from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (d3b536be5fae), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement