Schedule social posts from Hermes
posterly is the publish layer. Hermes is the agent layer. Edit ~/.hermes/config.yaml, run /reload-mcp, or install a skill, then schedule across 18 platforms.
Hero prompt
Using posterly, run whoami, list my accounts, then draft one caption for LinkedIn, X, and Instagram. Find the next free slot in Europe/London, validate_post, and wait for my yes before create_post.
Preview what is copied
# posterly for Hermes
posterly is the publish layer. Hermes is the agent layer. Edit ~/.hermes/config.yaml, run /reload-mcp, or load a skill.
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
Edit ~/.hermes/config.yaml:
mcp_servers:
posterly:
command: "npx"
args: ["-y", "posterly-mcp-server@latest"]
env:
POSTERLY_API_KEY: "pst_live_your_key_here"
Or HTTP:
mcp_servers:
posterly:
url: "https://www.poster.ly/api/mcp"
headers:
Authorization: "Bearer pst_live_your_key_here"
Then run /reload-mcp inside a chat session. Catalog picker: hermes mcp. Catalog install: hermes mcp install <name>.
Skill: hermes skills install https://github.com/awpthorp/posterly-agent
## 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 86 hosted HTTP MCP tools (89 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_from_url` (`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 or Claude.ai: `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.
- Stdio `upload_media` also accepts `file_path` when the user gives a real local filesystem path. The local server reads the disk and uses signed upload for large files, so this does not hit the Vercel 4MB body. Never guess paths. Chat attachments are not a file_path.
## 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). content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. Chat paperclip files never arrive here.
- `upload_media_from_url` url (required), filename?, content_type?: Fetch a public HTTPS URL into posterly storage. Localhost and private IPs are blocked.
- `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 and Claude.ai 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
- Reload MCP if needed, then run whoami and list_accounts on posterly.
- Draft a LinkedIn, X, and Instagram launch post, find the next free Europe/London slot, validate_post, and wait for approval.
- Upload this public image URL with upload_media_from_url, then validate_post an Instagram image post for tomorrow 9am.
- If we are on local stdio, upload the file at /Users/me/Desktop/launch.jpg with upload_media file_path.
- Generate three LinkedIn captions, then schedule the one I pick after I say yes.
- List this week scheduled posts and suggest what to post next.
- Prefer MCP tools. Fall back to REST with the same POSTERLY_API_KEY only if MCP is unavailable.
## Links
- Human landing: https://www.poster.ly/hermes
- MCP hub: https://www.poster.ly/mcp
- Hermes guide: https://www.poster.ly/guides/hermes-guide
- AI agents: https://www.poster.ly/agents
- Agent signup: https://www.poster.ly/agents/signup
Add servers by editing ~/.hermes/config.yaml, then /reload-mcp. Hermes also has a catalog picker (hermes mcp) and hermes mcp install <name> for catalog names. Chat attachments never reach MCP.
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, Cursor, ChatGPT, OpenClaw, Hermes, Grok Bot, Poke, and any MCP client.
Get Hermes connected in three steps
Create an API key, add a YAML MCP block, reload MCP, then ask Hermes to schedule.
Enable API and MCP access
Open Dashboard, API and MCP, activate the add-on, then create a posterly API key.
Open API dashboardEdit config.yaml, then reload
Add a posterly block under mcp_servers in ~/.hermes/config.yaml. Run /reload-mcp inside a chat session. You can also open the catalog picker with hermes mcp.
Compare MCP optionsAsk Hermes to schedule
Once connected, Hermes can list accounts, find slots, upload media, and create posts after you approve.
Hermes walkthroughWhat to put in Hermes
Hermes uses a YAML mcp_servers block with an underscore. Claude Desktop and Cursor use JSON mcpServers. After any edit, run /reload-mcp rather than restarting the whole agent.
Fields
Config file
~/.hermes/config.yamlYou can keep the key in ~/.hermes/.env and reference it as ${POSTERLY_API_KEY}.
Reload
/reload-mcpRun this inside a Hermes chat session after you edit YAML.
Catalog
hermes mcpOpens the catalog picker. hermes mcp install <name> installs a catalog server by name.
Local stdio in config.yaml
Hermes launches the npm package. This path can use upload_media file_path.
# ~/.hermes/config.yaml
mcp_servers:
posterly:
command: "npx"
args: ["-y", "posterly-mcp-server@latest"]
env:
POSTERLY_API_KEY: "pst_live_your_key_here"Then run /reload-mcp. Registered tools appear as mcp_posterly_<tool>.
Remote HTTP in config.yaml
Skip the local subprocess and call the hosted endpoint.
# ~/.hermes/config.yaml
mcp_servers:
posterly:
url: "https://www.poster.ly/api/mcp"
headers:
Authorization: "Bearer pst_live_your_key_here"Same hosted endpoint as Claude, ChatGPT, Cursor, Grok Bot, and Poke.
The posterly skill also works as a Hermes skill
A skill is a Markdown instruction file. Install it from GitHub, then Hermes knows when to prefer MCP, when to fall back to REST, and what to confirm before publishing.
Minimal reusable SKILL.md
Put this in a Hermes skill, or adapt the public posterly agent skill from GitHub.
Show SKILL.md example
---
name: posterly-social-manager
description: Schedule and manage social posts through posterly. Prefer MCP when available, fall back to REST with the same POSTERLY_API_KEY.
---
# posterly social manager
Use posterly to create, schedule, inspect, and analyse social posts.
Connection order:
1. Prefer the posterly MCP server when available.
2. Use REST API endpoints when MCP is not available.
3. Never publish immediately without showing the user the account, caption, media, and schedule first.
Auth:
- Environment variable: POSTERLY_API_KEY
- Base URL: https://www.poster.ly
- MCP npm package: posterly-mcp-server
Core actions:
- list accounts and brands
- find available slots
- upload media
- create, update, delete, and inspect posts
- get account and post analyticsInstall or adapt the skill
Use the public skill repo as the source of truth, then load it in Hermes for social workflows.
Good agent behaviour
- Confirm account, caption, media, and schedule before public posting.
- Prefer MCP tools when available because schemas reduce mistakes.
- Use REST fallback for scripts, cron jobs, and runtimes without MCP.
- Always run whoami first so posts land in the right workspace.
What Hermes can do once connected
Start with these tools. The rest of the 86 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_mediaupload_media_from_urlcreate_signed_uploadcreate_media_droplist_mediafind_available_slotgenerate_captionslist_postswhoami(none): Call first. Returns the authenticated user, API key scopes, and workspaces.list_accountsworkspace_id?: Connected social accounts. Stop if this is empty and send the user to connect accounts in posterly.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). content_type optional. Stdio also accepts file_path.: Hosted path is base64 with a decoded file of 5MB or less. Chat paperclip files never arrive here.upload_media_from_urlurl (required), filename?, content_type?: Fetch a public HTTPS URL into posterly storage. Localhost and private IPs are blocked.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 and Claude.ai 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
- Reload MCP if needed, then run whoami and list_accounts on posterly.
- Draft a LinkedIn, X, and Instagram launch post, find the next free Europe/London slot, validate_post, and wait for approval.
- Upload this public image URL with upload_media_from_url, then validate_post an Instagram image post for tomorrow 9am.
- If we are on local stdio, upload the file at /Users/me/Desktop/launch.jpg with upload_media file_path.
- Generate three LinkedIn captions, then schedule the one I pick after I say yes.
- List this week scheduled posts and suggest what to post next.
- Prefer MCP tools. Fall back to REST with the same POSTERLY_API_KEY only if MCP is unavailable.
Post to 18 platforms
Hermes can schedule through posterly to every supported social platform.
Related setup guides
Hermes is one route into the same API, MCP, and skill layer.
MCP setup guide
The hub for hosted HTTP MCP, local stdio, OAuth metadata, and the full tool list.
Hermes guide (long read)
config.yaml, /reload-mcp, catalog picker, skills, and comparisons with Claude Code and Codex.
OpenClaw skill
The same SKILL.md pattern Hermes can load.
Poke integration
Text-message MCP using the same hosted endpoint.
Claude setup
Custom connector plus Claude Code.
API dashboard
Activate the add-on, generate keys, and copy setup snippets from inside posterly.
Pricing
One Stripe subscription: your plan plus API & MCP. Charged now, no free trial.
API, MCP & Agent Access
Starter $7 + API $3, charged now. No free trial on this path.
- Hermes + npm MCP + HTTP MCP + REST API
- Reusable Markdown skill workflows
- 86 hosted HTTP MCP tools 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
Hermes questions
How do I add posterly to Hermes?+
Edit ~/.hermes/config.yaml under mcp_servers, then run /reload-mcp in a chat session. You can also open the catalog picker with hermes mcp, or run hermes mcp install <name> for a catalog server name.
Do I need the npm package?+
For local stdio, yes: npx -y posterly-mcp-server@latest with POSTERLY_API_KEY. For HTTP MCP, set url to https://www.poster.ly/api/mcp instead.
Can I use a skill instead?+
Yes. A skill is a Markdown instruction file. hermes skills install https://github.com/awpthorp/posterly-agent loads the public posterly skill. Prefer MCP when it is available; fall back to REST with the same key.
Can Hermes post a chat attachment?+
No. Chat attachments never reach MCP. Use a public URL, base64 upload_media (5MB or less on hosted HTTP), create_signed_upload then PUT, or stdio file_path.
What can Hermes 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 connect Hermes?
Pay for Starter + API in one checkout, create a key, then connect Hermes with YAML MCP, HTTP MCP, REST, or a skill.
