VoiceOS Instagram Integration
Uses Cloudflare R2 as a temporary public relay for photos before publishing to Instagram.
Allows managing an Instagram business or creator account by voice, including reading account insights, post insights, comments, DMs, and publishing or scheduling photos and carousels.
Instagram's API is provided by Meta, and the integration requires a Business or Creator account as per Meta's rules.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@VoiceOS Instagram IntegrationHow's my Instagram doing?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
VoiceOS Instagram Integration
Run your Instagram account by voice from the Mac notch. Ask how the account is doing, read comments and DMs, and publish a photo or a carousel by dropping it on the notch and saying what to caption it.
Business or Creator account required. Instagram's API does not expose insights, comments, DMs, or publishing on a personal account — this is Meta's rule, not ours, and there is no way around it.
To convert: Instagram app → your profile → ☰ menu → Settings and privacy → Account type and tools → Switch to professional account. Pick Creator or Business, then follow the prompts. It is free, it is reversible, and it does not make your account public if it was private. Reconnect this integration afterwards.
Setup
Six steps. Steps 3 and 4 are only needed if you want to publish; reading works without them.
1. Install dependencies
cd instagram
bun install2. Connect Instagram through Composio
Composio is the auth and API transport this integration runs on.
Get an API key from the Composio dashboard.
Add Instagram as an app in your Composio project. That creates the auth config the connect flow needs.
You approve the actual Instagram OAuth in step 6 — nothing to do here yet.
3. Create the photo relay bucket (Cloudflare R2)
Instagram never accepts image bytes. Meta fetches a public URL instead, with its own crawler. So a photo you drop on the notch is uploaded to your own R2 bucket, handed to Instagram as a link, and deleted seconds later.
In the Cloudflare dashboard → R2:
Create a bucket.
Open it → Settings → Public Development URL → Enable. Copy that URL. The bucket must be public or Meta cannot fetch the photo.
Manage API Tokens → Create API token, scoped to that one bucket, with Object Read & Write. The secret is shown once — copy it now.
Optional but recommended: add a lifecycle rule to delete objects after 1 day. The integration deletes each photo itself; this is the backstop for the rare miss.
Skip this whole step if you only want to read. account_pulse, post_insights, activity, and dm_thread all work without a bucket. Only create_post and schedule_post need one.
4. Give the server the keys
Create a .env file in this folder:
COMPOSIO_API_KEY=
# Cloudflare R2 — publishing only, leave blank if you are read-only
R2_ACCOUNT_ID=
R2_ACCESS_KEY_ID=
R2_SECRET_ACCESS_KEY=
R2_BUCKET=
R2_PUBLIC_URL=R2_ACCOUNT_ID is on the Cloudflare R2 → Overview page, top right. R2_PUBLIC_URL is the Public Development URL from step 3.
If VoiceOS prompts you for these as setup fields, that injection wins and the file is only a fallback for running the server standalone.
5. Install into VoiceOS
Quit VoiceOS first. It holds
config.jsonin memory and rewrites it on exit, so anything written while it is running is silently thrown away — with no error at all. The installer refuses to run if it sees VoiceOS alive.
osascript -e 'quit app "VoiceOS"'
python3 install-into-voiceos.py
open -a VoiceOSThat copies this folder into ~/Library/Application Support/VoiceOS/custom-mcps/, carries the keys from step 4 across, and registers it. A plain cp is not enough — VoiceOS also needs two entries in config.json (one saying how to launch the server, one carrying the manifest), and writing those is most of what the script does. It backs up config.json first.
Command | Does |
| Report what is installed. Changes nothing, safe while VoiceOS runs. |
| Re-copy after editing the source. The edit → test loop. |
| Also refresh |
| Unregister and delete the installed copy. |
--update re-derives confirmTools from the manifest every time. That matters more than it looks: it is the list VoiceOS uses to decide which tools need a confirmation card, and a stale entry left over from a rename would let a post publish with no card at all.
6. Connect your account
Say "How's my Instagram doing?" If Instagram isn't linked yet you get a Connect Instagram card with an OAuth link. Approve it once and you're set.
If it says the account is personal, go back to the box at the top of this page.
Tools
Tool | Does | Try saying | Confirms first? |
| Profile, follower and post counts, recent reach and profile views, plus a grid of your latest posts | "How's my Instagram doing?" · "How many followers do I have?" | No |
| Everything on one post: likes, comments, shares, saves, reach, impressions, and the image | "How's my latest post doing?" | No |
| New comments on your posts, recent DMs, and any scheduled post that failed or is still queued | "What's new on Instagram?" · "Did my scheduled post go out?" | No |
| Recent messages with one person, and marks them seen | "Show me my messages with Jonah" · "Did Kai reply?" | No |
| Publishes a photo or carousel you dropped on the notch, with a caption you speak or one written for you | "Post this picture on Instagram" | Yes |
| Queues that same post to publish later, up to 24 hours out | "Schedule this for tomorrow at 9am" | Yes |
Drop the photos onto the notch and speak in the same breath — "post these two with a caption about the hackathon". Both writing tools show you the photos, the caption, and (for a schedule) the exact time on a card before anything goes live.
How your photos are handled
Worth reading once, because one step surprises people.
The photo is converted to JPEG on your Mac with
sips(built into macOS). Instagram accepts nothing else.It is uploaded to your R2 bucket under a random unguessable name, and is publicly readable for a few seconds. This is unavoidable: Meta's crawler is anonymous and cannot log in, so a public URL is the only way Instagram will take a photo.
Instagram fetches it and publishes the post.
The file is deleted from the bucket — on success and on failure, in a
finallyblock. The lifecycle rule from step 3 is the backstop.
The bucket is yours. Nothing is stored on anyone else's server, and this integration keeps no copy of your photos.
Scheduled posts run on your Mac, not on Instagram's servers — Instagram has no scheduling API. A macOS launchd timer wakes at the minute you named and publishes then. So the Mac has to be on and awake. If it was shut when the post was due, the post is recorded as missed rather than published hours late, and instagram_activity tells you next time you ask.
Not in v1
Cut deliberately, so you know before you try:
Sending DMs. Meta blocks API DM sends through Composio's shared Instagram app — it returns "outside the allowed window" errors even with the 24-hour window provably open. The integration reads DMs but cannot send them. Reply in the Instagram app.
Replying to comments. Same transport limitation.
Video and Reels. Photos and photo carousels only. Video publishing needs a resumable upload path this build does not have.
Stories. Not exposed by the toolkit.
Scheduling further than 24 hours out. The ceiling is deliberate: every extra hour is another way a deferred job rots where nobody can see it — the photo gets deleted, a key is rotated, the connection is revoked.
Reading other accounts. Your connected account only.
Troubleshooting
Symptom | Cause |
"Instagram isn't supported yet" or the tools do not appear | The install did not register. Run |
Everything returns the Connect card | Token expired, or the connection was revoked. Approve the OAuth link on the card again. |
Publishing says the relay isn't set up | One of the five |
Publishing fails with "Instagram rejected that image" | Wrong aspect ratio (Instagram allows 4:5 to 1.91:1), or over 8 MB after conversion. |
A scheduled post never happened | Ask "what's new on Instagram?" — a failed or missed post is reported there with the reason. |
Development
bun install
bun test # 224 unit and failure-injection tests
bunx tsc --noEmit -p tsconfig.jsonThree rules the tests exist to protect, worth knowing before editing:
stdout is the MCP wire. One
console.login shipped code and VoiceOS cannot parse the JSON-RPC stream, so the integration silently vanishes from routing until the app restarts. Everything logs throughconsole.error;stdoutGuard.tsis the first import inserver.tsand rebinds the console for dependencies that do not.Never build a shell string from a file path. Photos come from the user dragging a file onto the notch.
execFile(cmd, [args])only — a file namedholiday.png; rm -rf ~is one opaque argument tosips, andtest/media-paths.test.tsasserts it.Tool names and descriptions must match the manifest exactly, in both directions.
server.tsandvoiceos.integration.jsonare two copies of one contract.
confirmations/post_composer.html is the source of truth for the pre-publish card; the manifest carries a copy of it as a string. Edit the HTML and the copy must be regenerated, or the card shown before an irreversible publish is the stale one.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Publish, schedule and verify social posts across seven networks from your AI assistant.
Boost posts and launch community growth campaigns from your AI assistant. OAuth, credit-billed.
Create, schedule and publish social posts to TikTok, Instagram, Facebook and YouTube.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AravDharnikota/voiceos-instagram-integration'
If you have feedback or need assistance with the MCP directory API, please join our Discord server