instagram-mcp
instagram-mcp
Ein entfernter MCP-Server, der jedem Teammitglied erlaubt, Instagram-Karussells und einzelne Bilder direkt aus einer Claude-Unterhaltung zu veröffentlichen – auf das eigene professionelle Instagram-Konto und niemanden sonst.
Das Bearer-Token identifiziert die Person. Die Person ist genau einem Instagram-Konto in der Datenbank zugeordnet. Kein Tool nimmt jemals eine Instagram-Konto-ID als Parameter, sodass das Posten auf das Konto eines Teammitglieds durch Übergabe der falschen ID strukturell unmöglich ist.
Die Meta-App läuft im Entwicklungsmodus, wobei jedes Teammitglied als Instagram-Tester hinzugefügt wird – keine Meta-App-Prüfung, kein OAuth-Login-Ablauf, kein Live-Gehen. Das ist beabsichtigt.
Verbinde es mit Claude (diesen Abschnitt unverändert an ein Teammitglied senden)
Du benötigst zwei Dinge vom Admin: die Server-URL und dein persönliches Zugriffstoken (beginnt mit igmcp_). Behandle das Token wie ein Passwort – jeder, der es besitzt, kann auf dein Instagram-Konto posten.
Öffne in Claude Einstellungen → Connectors → Benutzerdefinierten Connector hinzufügen.
Füge diese URL ein:
https://YOUR-DEPLOYMENT.vercel.app/api/mcp(der Admin gibt dir den echten Hostnamen)
Wo der Connector nach Authentifizierung fragt, füge diesen Header hinzu – Name links, Wert rechts:
Authorization: Bearer igmcp_your_token_hereHeader-Name:
Authorization. Header-Wert: das WortBearer, ein Leerzeichen, dann dein Token. Sonst nichts.Speichern. In jeder Unterhaltung kannst du jetzt Dinge sagen wie "Veröffentliche diese 5 Folien als Karussell mit dieser Bildunterschrift" und Claude wird die Bilder hochladen und auf dein Konto posten.
Was du Claude bitten kannst:
Ein Karussell veröffentlichen (2–10 Bilder, eine Bildunterschrift für den gesamten Beitrag)
Ein einzelnes Bild veröffentlichen
Überprüfen, wie viele Beiträge du heute noch hast (Instagram begrenzt die API-Veröffentlichung auf 100 pro 24h)
Überprüfen deiner Token-Gesundheit (deine Instagram-Verbindung erneuert sich automatisch lange vor Ablauf; dies zeigt dir, ob etwas nicht stimmt)
Auflisten deiner letzten Beiträge (immer nur deine)
Wenn eine Veröffentlichung auf halbem Weg fehlschlägt, bitte Claude einfach, die gleiche Veröffentlichung erneut zu versuchen – der Server setzt an der Stelle fort, an der er aufgehört hat, und wird nicht doppelt posten.
Onboarding eines neuen Teammitglieds (Admin)
Voraussetzungen, einmal pro Person:
Ihr Instagram-Konto muss ein professionelles Konto sein (Business oder Creator).
Öffne auf developers.facebook.com die Meta-App → Instagram → API-Setup mit Instagram-Login → füge ihr Konto als Instagram-Tester hinzu. Sie müssen die Einladung annehmen (Instagram-App → Einstellungen → Website-Berechtigungen → Apps und Websites → Tester-Einladungen).
Generiere ein langlebiges Zugriffstoken für ihr Konto über das App-Dashboard (der "Token generieren"-Button neben dem Tester-Konto). Kopiere das Token und notiere die Benutzer-ID des Kontos.
Dann füge sie hinzu (von deinem Rechner aus, in diesem Repository, mit ausgefüllter .env.local):
npm run add-member -- --name "Ada" --ig-user-id 17840000000000000 --ig-username ada.builds
# pastes the long-lived IG token when prompted (kept out of shell history)Das Skript überprüft das Token live gegen graph.instagram.com, lehnt das Hinzufügen ab, wenn das Token zu einem anderen Konto gehört als der von dir übergebenen ID, und gibt das igmcp_-Bearer-Token des Mitglieds einmalig aus. Sende es ihnen über einen sicheren Kanal zusammen mit dem obigen Abschnitt "Verbinde es mit Claude".
Um jemanden zu widerrufen: setze revoked_at = now() in ihrer Zeile in team_members. Ihr Token gibt sofort 401 zurück.
Architektur
instagram-mcp/
├── api/
│ ├── mcp.ts # MCP endpoint (Streamable HTTP), bearer auth wrapper
│ └── cron/refresh-tokens.ts # Vercel Cron target (daily; refreshes tokens nearing expiry)
├── src/
│ ├── auth.ts # bearer lookup → resolves the calling member
│ ├── crypto.ts # AES-256-GCM for IG tokens, SHA-256 for bearer hashes
│ ├── instagram.ts # containers, polling, publish, refresh, idempotent resume
│ ├── storage.ts # R2 uploads (per-member key prefix)
│ ├── db.ts # Supabase (service role)
│ ├── refresh.ts # refresh loop shared by cron + CLI
│ └── tools/ # one file per tool
├── scripts/
│ ├── add-member.ts # seeds a member, generates their bearer token
│ └── refresh-tokens.ts # manual run of the refresh loop
├── supabase/migrations/ # schema (already applied via the Supabase connector)
├── .env.example # every key, documented
└── README.mdWichtige Entscheidungen:
Transport:
mcp-handlerv2 (Vercels MCP-Adapter) mit@modelcontextprotocol/serverv2 – nur Streamable HTTP; der veraltete HTTP+SSE-Transport wurde in v2 upstream entfernt, was genau das ist, was wir wollen. Kein selbstgebauter Transport.Host: alles kommuniziert mit
https://graph.instagram.com(Instagram-Login-Pfad).graph.facebook.comgehört zum Facebook-Login-Pfad und schlägt mit einem irreführenden Token-Parse-Fehler fehl – die meisten Tutorials machen das falsch.Auth:
Authorization: Bearer <token>bei jeder Anfrage. Das Token wird gehasht (SHA-256), nachgeschlagen und mit einem konstanten Zeitvergleich erneut überprüft; unbekannte und widerrufene Token erhalten 401, bevor eine Verarbeitung stattfindet. Instagram-Token liegen AES-256-GCM-verschlüsselt in Postgres; Bearer-Token werden niemals roh gespeichert.Idempotenz: der Idempotenzschlüssel (Mitglied + Bild-URLs + Bildunterschrift) wird vor jedem Meta-Aufruf in
postsgeschrieben. Untergeordnete Container-IDs werden beim Erstellen persistent gespeichert. Ein Wiederholungsversuch verwendet FINISHED-Kinder wieder, erstellt nur EXPBREDERRORed-Kinder neu, und die erneute Veröffentlichung derselben übergeordneten Container-ID ist sicher (media_publishist pro Container idempotent) – so kann ein halb veröffentlichtes Karussell niemals dupliziert werden.Token-Aktualisierung: Vercel Cron läuft täglich; Token halten 60 Tage und jedes wird erneuert, sobald es in ein 25-tägiges Erneuerungsfenster eintritt, sodass ein fehlgeschlagener Lauf alle 24 Stunden eine neue Wiederholung erhält, anstatt nur einen Versuch pro Monat. Ein fehlschlagendes Mitglied bricht die Schleife nie ab; dauerhafte Fehler (widerrufener Zugriff, Kontoartänderung) markieren die Zeile und werden über
check_token_healthgemeldet, anstatt endlos wiederholt zu werden.
Bereitstellen (Admin)
npm install
npm run typecheck && npm test # 19 unit tests, live tests skip without creds
vercel login
vercel link # or create the project
# Set every var from .env.example in Vercel → Project → Settings → Environment Variables
vercel --prodDann setze die Bereitstellungs-URL in den obigen Abschnitt "Verbinde es mit Claude" ein.
Supabase muss ein dediziertes Projekt sein, das nur diesen Server hostet – kein Projekt, das mit einer anderen App geteilt wird. team_members und posts sind generische Namen und der Service-Role-Client hat vollen Tabellenzugriff, daher ist das Teilen eines Schemas mit einem nicht verwandten Produkt ein Kollisions- (und Schadensradius-) Risiko. Erstelle das Projekt unter deinem eigenen Konto und wende dann die Migration in supabase/migrations/ über den SQL-Editor oder den Supabase-MCP-Connector an.
R2-Bucket benötigt öffentlichen Zugriff (eigene Domain oder r2.dev), der mit R2_PUBLIC_BASE_URL übereinstimmt.
Live-Akzeptanztests
Mit ausgefüllter .env.local und mindestens einem hinzugefügten Mitglied:
LIVE_MEMBER_BEARER_TOKEN=igmcp_... npm test # upload + token health, no posting
LIVE_MEMBER_BEARER_TOKEN=igmcp_... LIVE_PUBLISH=1 npm test # ⚠ creates REAL posts
# add LIVE_MEMBER_BEARER_TOKEN_2=igmcp_... for the two-members-two-accounts testBetriebshinweise
Stiller Fehlermodus Nr. 1 ist ein abgelaufenes Token – das Posten stoppt und niemand bemerkt es. Der Cron markiert Fehler lautstark (nicht-200 → roter Lauf im Vercel-Dashboard) und
check_token_healthmeldet Tage bis zum Ablauf und Aktualisierungsfehler pro Mitglied.Instagram begrenzt die Veröffentlichung auf 100 Beiträge pro Konto pro rollierender 24h;
get_publishing_limitliest den Live-Zähler.Container laufen nach ~24h ab und es gibt eine Obergrenze von ~50 ausstehenden Containern pro Konto – ein weiterer Grund, warum der Wiederholungspfad Container wiederverwendet, anstatt neue zu erstellen.
Behalte Karussell-Folien im gleichen Seitenverhältnis; Instagram beschneidet alles, um zur ersten Folie zu passen. Nur JPEG/PNG, ≤ 8 MB.
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
Boost posts and launch community growth campaigns from your AI assistant. OAuth, credit-billed.
Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.
Publish, schedule and verify social posts across seven networks from your AI assistant.
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/Joyhacks/instagram-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server