Schedule social posts from Gemini
posterly is the publish layer. Gemini is the chat layer. Add the hosted MCP endpoint as a custom app for Spark, then ask Gemini to run whoami, list accounts, validate a draft, and create the post only after you say yes.
Hero prompt
Using posterly, run whoami, then list_accounts. Draft one caption for LinkedIn, X, and Instagram. Run validate_post for each, show me the drafts, and wait for my yes before create_post with confirm true.
Preview what is copied
# posterly for Gemini
posterly is the publish layer. Gemini is the chat layer. Add the hosted MCP endpoint as a Spark custom app, then schedule across 18 platforms after the user approves. OAuth sign-in from gemini.google.com is still being validated.
posterly publishes to 18 platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, Lemmy.
## Connect
Gemini web (Spark custom apps): on a computer open gemini.google.com. Settings, Connected Apps, Custom apps, Add a custom app. Paste https://www.poster.ly/api/mcp. If Connected apps is missing, open Personal Intelligence, then Connected apps. Source: https://support.google.com/gemini/answer/17209137
Eligibility: 18 or over, in the US, personal Google Account (not work or school), Keep Activity on, Gemini in English. Connect on the web. Google says the app is then available on mobile and web. Gemini Spark needs Google AI Pro or Ultra: https://support.google.com/gemini/answer/17094507
Work or school accounts: an admin uses Gemini Enterprise (https://support.google.com/g/answer/17106276). Otherwise send the user to https://www.poster.ly/claude, https://www.poster.ly/chatgpt, or https://www.poster.ly/cursor.
Auth: posterly advertises Dynamic Client Registration. Sign-in from gemini.google.com is still being validated. Google documents Advanced features for servers without Dynamic Client Registration; do not assume those fields accept a posterly API key. Do not treat Spark sign-in as confirmed.
Optional Gemini CLI uses the npm stdio server, with flag syntax from https://geminicli.com/docs/tools/mcp-server/: gemini mcp add -s user -e POSTERLY_API_KEY=pst_live_your_key_here posterly npx -y posterly-mcp-server@latest. Replace the placeholder key in your local configuration. The hosted posterly endpoint does not implement streamable HTTP; do not use -t http with it. This CLI setup does not confirm Spark web OAuth.
This is a custom app you add yourself. Do not look for a directory listing.
Gemini web laptop files use the same path as ChatGPT web and Claude.ai: create_media_drop, then the /drop/ page, then list_media. The paperclip is not an upload.
## Are we connected yet?
1. Call `whoami` (no params). Confirm the user, scopes, and workspaces.
2. Call `list_accounts` (`workspace_id` optional). If none are connected, stop and send the user to connect social accounts in posterly. Do not invent account IDs.
3. Prefer `validate_post` before `create_post`. Show the preview. Wait for a clear yes.
4. Only then call `create_post` with `confirm: true`. Never publish or schedule live without that approval.
5. Prefer `scheduled_at` (ISO 8601 UTC) or `find_available_slot` (`account_ids`, `timezone`, `count`). Do not publish immediately unless the user asks.
## Rules
- posterly is the publish layer. This client is the chat or agent layer.
- Never collect card details, posterly passwords, or social-network passwords. Send the user to https://www.poster.ly/agents/signup or https://www.poster.ly/dashboard/api.
- Point to https://www.poster.ly/mcp for the rest of the 59 hosted HTTP MCP tools (62 on the local stdio package).
- After a post is created, send the View in posterly link. Avoid raw JSON dumps unless the user asks to debug.
## Media (honest)
Chat attachments never reach MCP. The paperclip in this chat does not give posterly the file.
The ~4MB limit is the **Vercel request body** on posterly API routes (`/api/mcp`, `POST /api/v1/media/upload`). It is not an MCP protocol cap and not the plan storage cap. Base64 inflates files, so hosted `upload_media` is small images only (relay cap 5MB decoded).
- Public HTTPS URL: `upload_media` with `url` (optional `filename`, `content_type`) or pass `media_url` / `media_urls` on `validate_post` / `create_post`. Server fetch: about 5MB relay, 60MB hard cap. Large R2/S3 URLs fail with `remote_media_too_large`.
- Hosted `upload_media`: required `filename` + `base64_data`. Optional `content_type`. Hits the 4MB Vercel body. JPEG, PNG, GIF, WebP, MP4, MOV, WebM. HEIC is unsupported.
- Laptop file in ChatGPT web, Claude.ai, or Gemini web: `create_media_drop` (optional `filename`, optional `max_files`, default 10). Send the user `drop_url` (`https://www.poster.ly/drop/<token>`). They open it with no dashboard login and drop the file. Then `list_media` (`drop_session_id`) and pass `public_url` to `validate_post` / `create_post`. This is not the chat paperclip.
- Larger files, when this client can HTTP PUT: `create_signed_upload` (`filename`, `content_type`, `size`), PUT the raw bytes to the returned `upload_url` (object storage, not a posterly API route) with the returned headers, then pass `public_url` to `create_post`. That PUT does not hit the 4MB body. Plan video caps: Starter 500MB, Pro 750MB, Power 1GB, Agency 4GB.
- This client is hosted HTTP MCP, so there is no local `file_path`. Small images: public URL or base64 `upload_media`. Laptop video: `create_media_drop` then `list_media`. PUT after `create_signed_upload` only if this runtime can PUT (Cursor Cloud, Codex HTTP).
## Starter tools
- `whoami` (none): Call first. Returns the authenticated user, API key scopes, and workspaces.
- `list_accounts` workspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly.
- `validate_post` account_id or username+platform, caption, scheduled_at?, media_url?, media_urls?, post_type?, workspace_id?: Dry run. Does not create a post. Use this before showing a preview.
- `create_post` same as validate_post, plus confirm: true (required): Destructive write. Refuse unless the user clearly approved caption, account, media, and schedule.
- `upload_media` filename, base64_data (hosted), or url. content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. With url, posterly fetches a public HTTPS URL into storage (localhost and private IPs are blocked). Chat paperclip files never arrive here.
- `create_signed_upload` filename, content_type, size: Bypasses the Vercel ~4MB API body. Returns upload_url (object storage) and public_url. PUT raw bytes to upload_url, then pass public_url to create_post. Use this when the client can PUT (Cursor, Claude Code, Codex).
- `create_media_drop` filename?, max_files?: Creates a no-login page at https://www.poster.ly/drop/<token>. Send drop_url to the user. ChatGPT web, Claude.ai, and Gemini web laptop files use this, then list_media. Not the chat paperclip.
- `list_media` limit?, drop_session_id?: Newest media assets. After create_media_drop, pass drop_session_id and use public_url on validate_post / create_post.
- `find_available_slot` account_ids?, timezone?, workspace_id?, count?: Always pass timezone explicitly (IANA, e.g. Europe/London). Respects a 1-hour gap.
- `generate_captions` platforms (required), brief?, tone?, count?, mode?, source_caption?: Returns caption options only. It does not schedule or publish.
- `list_posts` status?, platform?, account_id?, workspace_id?, limit?: Upcoming or recent posts. status is scheduled, published, failed, or draft.
## Example prompts
- Using posterly, run whoami, then list_accounts. Tell me which LinkedIn, X, and Instagram accounts are connected.
- Draft one caption for LinkedIn, X, and Instagram about our launch. Show me the drafts and wait.
- Find the next free slot in Europe/London, then run validate_post for a LinkedIn text post. Do not create_post yet.
- After I say yes, create_post with confirm true and send the View in posterly link.
- I have a video on my laptop. Call create_media_drop, send me the /drop/ link, wait, then list_media and validate_post. Do not use the paperclip.
- I have a public image URL. upload_media with url, then validate_post an Instagram image post. Wait for my yes.
- List my scheduled posts for this week and summarise what is already on the calendar.
- Generate three caption options with generate_captions. Do not publish.
## Links
- Human landing: https://www.poster.ly/gemini
- MCP hub: https://www.poster.ly/mcp
- Gemini guide: https://www.poster.ly/guides/gemini-guide
- AI agents: https://www.poster.ly/agents
- Agent signup: https://www.poster.ly/agents/signup
Spark custom apps follow the path Google documents. OAuth sign-in from gemini.google.com is still being validated, so a successful web connection has not yet been confirmed. If it does not connect, use Claude, ChatGPT, or Cursor. Chat attachments never reach posterly. Laptop files go through create_media_drop, then list_media.
What it looks like in chat
Draft, validate, then approve. Your AI never publishes until you say so.
your AI · connected to posterly MCP
MCPNever posts without approval · validate_post before create_post
View in posterlyWorks with Claude, ChatGPT, Gemini (preview), Cursor, OpenClaw, Hermes, Grok Bot, Muse, Poke, and any MCP client.
Gemini web setup preview
Gemini web sign-in is still being validated. Check the eligibility rules before trying the custom app. For Gemini CLI, use the npm stdio configuration below.
Check connection status first
Gemini web connection is a preview. Do not buy API access solely for Gemini web until sign-in and tool discovery are confirmed. Gemini CLI uses a posterly API key with the npm stdio server.
Open API dashboardAdd a custom app
On a computer, open gemini.google.com. Go to Settings, Connected Apps, Custom apps, Add a custom app. Paste https://www.poster.ly/api/mcp. If Connected apps is missing, open Personal Intelligence, then Connected apps.
Google custom apps helpVerify, then schedule
Ask Gemini to run whoami and list_accounts. Prefer validate_post. Wait for a clear yes before create_post with confirm true.
Gemini setup guideWhat to paste into Gemini
Add the custom app on gemini.google.com. Gemini web talks to remote MCP. The Gemini CLI is an optional second path. Flag syntax is from the current Gemini CLI docs.
Fields
Server URL
https://www.poster.ly/api/mcpHosted posterly MCP endpoint. JSON-RPC 2.0 over HTTPS. Paste this into Add a custom app.
Auth
OAuth via Dynamic Client Registration (still being validated)posterly advertises registration. Sign-in from gemini.google.com is still being validated. Google documents Advanced features for servers without Dynamic Client Registration; do not assume those fields accept a posterly API key. Until Spark sign-in is confirmed, use Claude, ChatGPT, or Cursor.
Who can connect
18+, US, personal Google Account, Keep Activity on, EnglishWork and school accounts cannot add Spark custom apps. An admin uses Gemini Enterprise. Otherwise use Claude, ChatGPT, or Cursor.
Spark custom app
Same hosted endpoint as Claude, ChatGPT, and Cursor. Google documents the menu at gemini.google.com.
POST https://www.poster.ly/api/mcp
Authorization: Bearer pst_live_your_key_here
Content-Type: application/json
{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }Connect on the web. Google says a connected custom app is then available in the Gemini mobile app and on the web. Spark OAuth sign-in is still being validated.
Gemini CLI (optional)
Use the npm stdio server with Gemini CLI. The hosted endpoint does not implement streamable HTTP, so do not configure it with -t http.
gemini mcp add -s user -e POSTERLY_API_KEY=pst_live_your_key_here \
posterly npx -y posterly-mcp-server@latestDocs: https://geminicli.com/docs/tools/mcp-server/ Default scope is project. -s user keeps the server for every folder.
What Gemini can do once connected
Start with these tools. The rest of the 59 hosted HTTP MCP tools live on the MCP hub. Prefer validate_post, then wait for a clear yes before create_post with confirm true.
Starter tools
whoamilist_accountsvalidate_postcreate_postupload_mediacreate_signed_uploadcreate_media_droplist_mediafind_available_slotgenerate_captionslist_postswhoami(none): Call first. Returns the authenticated user, API key scopes, and workspaces. Covers: You, your scopes, and your workspaces, MCP server and connection status.list_accountsworkspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly. Covers: Connected accounts, Learned voice of an account, Performance profile of an account, Check a connect session.validate_postaccount_id or username+platform, caption, scheduled_at?, media_url?, media_urls?, post_type?, workspace_id?: Dry run. Does not create a post. Use this before showing a preview.create_postsame as validate_post, plus confirm: true (required): Destructive write. Refuse unless the user clearly approved caption, account, media, and schedule.upload_mediafilename, base64_data (hosted), or url. content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. With url, posterly fetches a public HTTPS URL into storage (localhost and private IPs are blocked). Chat paperclip files never arrive here. Covers: Upload a file, Upload from a URL.create_signed_uploadfilename, content_type, size: Bypasses the Vercel ~4MB API body. Returns upload_url (object storage) and public_url. PUT raw bytes to upload_url, then pass public_url to create_post. Use this when the client can PUT (Cursor, Claude Code, Codex).create_media_dropfilename?, max_files?: Creates a no-login page at https://www.poster.ly/drop/<token>. Send drop_url to the user. ChatGPT web, Claude.ai, and Gemini web laptop files use this, then list_media. Not the chat paperclip.list_medialimit?, drop_session_id?: Newest media assets. After create_media_drop, pass drop_session_id and use public_url on validate_post / create_post.find_available_slotaccount_ids?, timezone?, workspace_id?, count?: Always pass timezone explicitly (IANA, e.g. Europe/London). Respects a 1-hour gap.generate_captionsplatforms (required), brief?, tone?, count?, mode?, source_caption?: Returns caption options only. It does not schedule or publish.list_postsstatus?, platform?, account_id?, workspace_id?, limit?: Upcoming or recent posts. status is scheduled, published, failed, or draft.
Example prompts
- Using posterly, run whoami, then list_accounts. Tell me which LinkedIn, X, and Instagram accounts are connected.
- Draft one caption for LinkedIn, X, and Instagram about our launch. Show me the drafts and wait.
- Find the next free slot in Europe/London, then run validate_post for a LinkedIn text post. Do not create_post yet.
- After I say yes, create_post with confirm true and send the View in posterly link.
- I have a video on my laptop. Call create_media_drop, send me the /drop/ link, wait, then list_media and validate_post. Do not use the paperclip.
- I have a public image URL. upload_media with url, then validate_post an Instagram image post. Wait for my yes.
- List my scheduled posts for this week and summarise what is already on the calendar.
- Generate three caption options with generate_captions. Do not publish.
Post to 18 platforms
Gemini can schedule through posterly to every supported social platform.
Related setup guides
Gemini is one route into the same API and MCP layer. These pages pair well with it.
MCP setup guide
The hub for hosted HTTP MCP, local stdio, OAuth metadata, and the full tool list.
Gemini guide
Eligibility, the Spark menu, the CLI command, and what to do while OAuth sign-in is still being validated.
AI agents overview
How posterly connects to any agent that speaks MCP or REST, plus the agent signup flow.
Agent signup
Paid Starter + API onboarding. The agent never collects card details or passwords.
Claude setup
The same hosted endpoint as a Claude custom connector. Use this if Spark sign-in does not connect.
ChatGPT setup
The same hosted endpoint as a ChatGPT custom MCP app. Writes need Business, Enterprise, or Edu.
Cursor setup
Local stdio in Cursor Desktop, hosted HTTP for Cloud Agents.
Pricing
Gemini web is a preview. Confirm connection status before purchasing API access for that client. One Stripe subscription: your plan plus API & MCP. Charged now.
API, MCP & Agent Access
Starter $7 + API $3, charged now. No free trial on this path.
- Gemini Spark custom app on the hosted HTTP endpoint
- Optional Gemini CLI npm stdio config
- Same key for MCP and REST
- 59 hosted HTTP MCP tools covering 92 actions for status checks, scoped API keys, schemas, scheduling, support, media, brands, analytics, webhooks, OAuth, connect sessions, subscription management, and GBP
- 100 create-post requests/hour plus separate media/read limits
- All 18 supported platforms
Gemini questions
How do I connect posterly to Gemini?+
On a computer, open gemini.google.com. Go to Settings, Connected Apps, Custom apps, Add a custom app. Paste https://www.poster.ly/api/mcp and follow the sign-in. If you do not see Connected apps, open Personal Intelligence, then Connected apps. Google documents the menu at https://support.google.com/gemini/answer/17209137. Then ask Gemini to run whoami.
Who can add a Spark custom app?+
Google requires you to be 18 or over and in the US, signed in with a personal Google Account, with Keep Activity on, and using Gemini in English. Work and school accounts cannot add this. Connect on the web. Google says the app is then available in the Gemini mobile app and on the web. Gemini Spark itself needs a Google AI Pro or Ultra subscription: https://support.google.com/gemini/answer/17094507
I use a work or school Google Account. What should I do?+
Spark custom apps are not available on work or school accounts. An admin connects a custom MCP server in Gemini Enterprise: https://support.google.com/g/answer/17106276. If you do not have that admin path, use Claude, ChatGPT, or Cursor.
Does posterly already sign in from Gemini?+
OAuth and dynamic client registration for gemini.google.com are still being validated. The connect steps are the path Google documents. The allowlist is in place, but a successful end-to-end Gemini web connection has not been confirmed. Use Claude, ChatGPT, or Cursor in the meantime.
Can I drop a laptop video onto the Gemini paperclip and have posterly post it?+
No. Chat attachments never reach MCP. Ask Gemini to call create_media_drop, open the https://www.poster.ly/drop/<token> link, drop the file there, then let it call list_media. That is the same path as ChatGPT web and Claude.ai.
Is posterly listed in a Gemini app directory?+
No. This is a custom app you add yourself. There is no directory listing to click.
What can Gemini schedule?+
All 18 posterly platforms: Instagram, Facebook, TikTok, X, LinkedIn, YouTube, Pinterest, Threads, Google Business, Telegram, Bluesky, Discord, Slack, Mastodon, Dev.to, Hashnode, WordPress, Lemmy.
Ready to add Gemini?
Check the Gemini web setup status first. Sign-in and tool discovery are still being validated. Claude, ChatGPT, and Cursor are alternatives.