Gemini CLI is the free-and-fast way into terminal agents, and it speaks MCP, so it plugs into planpo.st the same way Claude Code does: one settings entry, then the agent can draft, schedule and report.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.
Connect Gemini CLI
Sign in, no key
gemini extensions install https://github.com/lukBB/planpost-mcp
# or add it by hand: "planpost": { "httpUrl": "https://mcp.planpo.st/mcp" }
# then, inside Gemini CLI: /mcp auth planpostGlobal: ~/.gemini/settings.json; per project: .gemini/settings.json
You sign in, there is no key to paste. Its posts go out at the time the agent sets, unless you turn on approval when you connect.
The pairing suits scripted and repeatable work. Weekly planning runs, bulk rewrites, the kind of jobs where you want an agent doing the same reliable thing every Monday.
Gemini CLI is Google's open-source terminal agent for the Gemini models. MCP servers go in settings.json globally or per project. One sharp edge: remote servers use the httpUrl key, not url, and the wrong key fails silently, which is why our setup page spells it out.
Plain requests work. Each one below is something you could send today, and what happens next.
You say
Read content-plan.md, draft this week's posts for LinkedIn and Threads, and schedule them at the best times.
What happens
The agent reads your plan file, drafts per network, calls get_best_times, and fills the week with create_post. Run it every Monday and the calendar stops being a chore.
You say
Here are 20 post ideas in ideas.csv. Create them all as drafts spread over the next month.
What happens
bulk_create_posts takes the whole set in one call. Twenty drafts appear, dated and platform-tagged, ready for a review pass in the dashboard.
You say
What failed this week, and what is still waiting for my approval?
What happens
get_delivery_report lists failed posts with each network's error and the fix, and list_pending_approvals the posts waiting for you. The agent reads both back as one short list.
You say
When do my LinkedIn posts do best? Spread four posts over next week at those times.
What happens
get_best_times answers from your own engagement history, and suggest_schedule returns four concrete timestamps in the range. Each goes into create_post as scheduledFor.
You say
How is the autumn-clips campaign going?
What happens
list_campaigns returns the post counts by status, the networks involved and the next scheduled time. get_analytics adds impressions, likes, comments and shares for the posts already out.
You say
List everything scheduled for the next ten days and flag any post with a warning.
What happens
list_posts filters by status, and preview_post on each one returns its warnings and any issue that would block it. You leave with a list of what to fix, not a surprise on day four.
All 7 that planpo.st publishes to. Each network has its own rules, and each pairing has its own page with the settings table, three prompts and the limits that stop a post.
Short posts, 500 characters, one image or video, clickable links.
Twenty ideas in a CSV become twenty Threads drafts in one bulk call, each under 500 characters.
Profile or company page, 3,000 characters, up to 9 images or one video.
A plan file in, a week of LinkedIn posts out. Gemini CLI reads the markdown, drafts each post inside 3,000 characters and schedules them at the times get_best_times returns.
Feed posts, carousels up to 10, Reels and Stories. Media on every post.
From the terminal Gemini CLI uploads images from a folder and schedules them as a carousel, as long as they are JPEG or PNG and there are 10 or fewer.
Posts and threads, 280 characters, images or video, no links.
Gemini CLI suits the scripted version: one prompt you rerun every Monday that reads a plan file and queues the week on X, link-free.
Page posts with link cards, photo sets, video and Reels.
Gemini CLI handles the repetitive Page schedule: the same weekly slots, filled from a file, with links that turn into preview cards.
Video uploads and Shorts with title, description, tags and visibility.
Point Gemini CLI at a folder of finished videos and a metadata file and it uploads and schedules each one with its title, description and visibility.
Video posts, 2,200 character captions, a privacy level on every post.
Batch work is where Gemini CLI fits TikTok: a directory of clips, one bulk call, the privacy level set once in defaults.
The same list on the hosted and the local server. Grouped by the job they do, with the ones Gemini CLI reaches for most:
| Job | Tools | What that covers |
|---|---|---|
| Posts and scheduling | create_post, bulk_create_posts, update_post, preview_post, get_best_times, suggest_schedule | Draft, schedule and reschedule, one post or up to 50 in a call. Each network can get its own text, media and settings, and every post can wait for your approval if you turn that on. |
| What is queued and what failed | list_posts, get_post, list_campaigns, get_delivery_report, retry_failed, list_pending_approvals | Filter the queue by status, network or campaign. Failed posts come back with the error and the fix, and a passing failure can be sent again. |
| Analytics | get_analytics | Impressions, likes, comments and shares for published posts, on Creator and Pro. |
| Revenue | get_revenue_overview | Revenue totals, conversions and the trend from Stripe, Shopify or RevenueCat, on Creator and Pro. Revenue next to each post is on Pro. |
| Accounts | list_connections, get_connection_link, list_account_groups, get_account_group | Find the accounts to post to, and hand you the link to connect a new one. |
Every tool with its description is in the MCP tool reference.
Turn on approval. By default Gemini CLI's posts go out at the time it sets. Switch on “Ask me before anything goes live” when you connect it, or any time on the Agent page, and every post it writes waits in Posts, under In review, until you approve it. With an API key, the switch is “Require approval before publishing”, in the key's row on the Agent page. Gemini CLI cannot change either setting itself.
Ask for drafts, if you want less than that. A post created without a time is a draft, and nothing leaves planpo.st until it is scheduled.
Scope the key. With an API key, permissions such as posts:read and posts:write decide what it can touch, so a key without posts:write lets Gemini CLI read the calendar and the numbers and change nothing.
It finds out when the post is created, not two weeks later when the slot arrives. Every post is checked against the rules of each network it targets: character limits, required media, the X rule against links, a TikTok privacy level, a connection that has lapsed.
A post that breaks one is saved as a draft and the tool result lists each issue with a code, the network and the fix in words. Gemini CLI reads that, corrects the post with update_post, and it goes back on the schedule. Softer problems, such as a caption link that will not be clickable on Instagram or a missing YouTube title, come back as warnings and do not block anything.
When a post reaches some of its networks and fails on one, its status is partially_published, with a result per network, so a post is never reported as published while one network refused it.
Partly, and the rest is in the app. Gemini CLI can read your revenue totals, the conversions and the trend through get_revenue_overview, on Creator and Pro. Which post each payment came from is on Pro, on the app's Revenue screen: links in your posts are tracked, and a payment from Stripe, Shopify or RevenueCat that follows a click is matched to the post that caused it.
It takes about a minute. Google's terminal agent. Uses httpUrl for remote servers. No API key is needed: add the hosted endpoint and sign in to planpo.st when the browser opens. With a key instead, add the server, hosted or local, and the tools appear.
Config location: Global: ~/.gemini/settings.json; per project: .gemini/settings.json
gemini extensions install https://github.com/lukBB/planpost-mcp
# or add it by hand: "planpost": { "httpUrl": "https://mcp.planpo.st/mcp" }
# then, inside Gemini CLI: /mcp auth planpost{
"mcpServers": {
"planpost": {
"httpUrl": "https://mcp.planpo.st/mcp",
"headers": { "Authorization": "Bearer pk_live_xxx" },
"timeout": 10000
}
}
}{
"mcpServers": {
"planpost": {
"command": "npx",
"args": ["-y", "planpost-mcp"],
"env": { "PLANPOST_API_KEY": "pk_live_xxx" }
}
}
}For Gemini CLI either works, and local removes the one trap. The hosted entry must use httpUrl, and a url key is ignored without a word. The local npx entry has no such key to get wrong and needs Node 18 or newer.
| Question | Hosted HTTP | Local npm (stdio) |
|---|---|---|
| What it is | Streamable HTTP to https://mcp.planpo.st/mcp | The planpost-mcp npm package over stdio, started with npx |
| What you install | Nothing | Node 18 or newer. npx fetches the package |
| How it signs in | You sign in to planpo.st in the browser, or send an API key in a header | An API key in an environment variable on your machine |
| Tools you get | All of them; signed in, all but image generation | All of them, the same list |
| Updates | Server side, nothing to do | Tied to the package version npx has cached |
| Choose it when | You want it working in a minute | The key should stay in your own environment |
Both reach the same tools, so switching later is a config change and nothing else. The Gemini CLI setup guide has every variant.
Free plan, no card: 2 accounts, 30 posts a month, your agent included. X needs a paid plan.