{"name":"ViralDM MCP Server","displayName":"ViralDM — Instagram Automation","description":"India-first Instagram automation SaaS exposed via Model Context Protocol. 58 tools for scheduling posts/reels/stories, AI content generation (English/Hindi/Hinglish), auto-DM sequences, broadcasts, subscriber CRM, analytics, A/B testing, content safety, revenue attribution, and more — all accessible to Claude, Gemini, Cursor, or any MCP-compatible agent.","version":"1.0.0","endpoint":"/mcp","transport":"StreamableHTTP","protocolVersion":"2025-03-26","configSchema":{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","title":"ViralDM MCP Configuration","description":"No configuration required when using OAuth (recommended). Optionally, provide a personal API key if you prefer key-based authentication instead of OAuth.","properties":{"apiKey":{"type":"string","title":"API Key (optional)","description":"Personal API key from https://viraldm.app/dashboard/api-keys. Leave blank to use OAuth 2.0 instead (recommended).","pattern":"^vdm_[A-Za-z0-9]{32,}$","examples":["vdm_abc123..."]}},"additionalProperties":false,"required":[]},"auth":{"methods":["oauth2","api_key"],"preferred":"oauth2","oauth2":{"authorization_endpoint":"https://viraldm.app/oauth/authorize","token_endpoint":"https://viraldm.app/oauth/token","registration_endpoint":"https://viraldm.app/oauth/register","revocation_endpoint":"https://viraldm.app/oauth/revoke","introspection_endpoint":"https://viraldm.app/oauth/introspect","metadata":"https://viraldm.app/.well-known/oauth-authorization-server","scopes":["mcp:read","mcp:write"],"grant_types":["authorization_code","refresh_token"],"code_challenge_methods":["S256"],"pkce_required":true},"api_key":{"description":"Personal API key — generate at https://viraldm.app/dashboard/api-keys","location":"header","header_name":"Authorization","header_format":"Bearer <key>"}},"capabilities":{"tools":true,"resources":false,"prompts":false,"logging":true},"tools":[{"name":"schedule_post","description":"Schedule an Instagram, Facebook, or LinkedIn post, carousel, Reel, or Story to publish automatically at a future date and time. Supports image and video media, custom captions with hashtags, and post type selection (POST, CAROUSEL, REEL, STORY). REEL and STORY are Instagram-only; LinkedIn supports text posts, image posts, 2-9 image carousels and ONE video per post (no video carousels). Reels require a vertical video file (9:16) and accept an optional custom cover/thumbnail image (cover_url). Pass account_id (from list_social_accounts) to choose WHICH connected account posts — required when more than one is connected on that platform, since publishing to the wrong profile cannot be undone. Useful when a user says \"post this tomorrow at 8 PM\" or wants to plan content in advance."},{"name":"initiate_media_upload","description":"Step 1 of the preferred 2-step file upload: returns a short-lived upload URL and a mediaId so the file bytes go straight from your shell to storage, never through the conversation. Use for any real file — images, Reels, carousel slides."},{"name":"finalize_media_upload","description":"Step 2 of the 2-step upload: verifies what was actually uploaded (real format and size read from storage, not from what was claimed) and returns the public URL to pass to schedule_post as media_url or media_urls."},{"name":"upload_media","description":"One-shot base64 upload of a small image. Only viable under ~100 KB, because the base64 has to be written out inside the tool call itself — use initiate_media_upload + finalize_media_upload for anything bigger."},{"name":"generate_content","description":"Generate AI-powered social media captions, hooks, and hashtags for any topic. Supports English, Hinglish, Hindi, Tamil, Telugu, and Marathi. Customizable tone (engaging, professional, funny, urgent, inspirational). Returns 1-3 caption variations under 150 words with a call-to-action and relevant hashtags. Useful for content brainstorming."},{"name":"get_analytics","description":"Retrieve DM automation performance for connected accounts: DMs sent, failed sends, success rate, total automation actions, revenue attributed, and the top-performing automations by volume. Filter by platform and period (today, last 7/30/90 days). Does NOT return reach, impressions or follower counts — those require Instagram Insights permissions this app does not hold."},{"name":"setup_auto_dm","description":"Create an automated DM rule that sends a personalized reply when triggered. Triggers: comment_keyword (comment on a post), dm_keyword (keyword in a DM), any_dm (every DM), story_reply, live_comment, post_share. comment_keyword and dm_keyword require keywords. Pass ads_only=true (or ad_ids) on dm_keyword / any_dm to answer only people who came from a Click-to-DM ad. Pass post_id (an Instagram media id from get_account_media, or publishedMediaId from a published scheduled post) to bind the automation to ONE post — without it the rule runs on every post and competes with every other all-posts rule on the account, so only one of them ever replies. Pass scheduled_post_ids (ids from get_scheduled_posts) to wire up posts that have not published yet — a whole month of scheduled content in one call; each becomes live the moment its post does. Pass account_id when more than one Instagram account is connected. For a post that does not exist yet, pass next_post=true (links itself to the next post published) or caption_code (links every post whose caption contains the code). Pass lead_gate (email / whatsapp / either) to collect a contact before the reward is sent. new_follower and post_like are not supported by the engine."},{"name":"get_scheduled_posts","description":"List all upcoming, published, failed, or cancelled posts for the user. Filter by status and date range. Returns post ID, type (POST/REEL/STORY), scheduled time in IST, caption preview, media URL, and account name. Use before delete_scheduled_post to find the post ID."},{"name":"delete_scheduled_post","description":"Cancel a scheduled post before it publishes to Instagram or Facebook. Cannot delete already-published posts. Also frees the associated Cloudinary media storage automatically. Requires the post_id from get_scheduled_posts."},{"name":"update_scheduled_post","description":"Edit a still-scheduled post before it goes live — change the caption, reschedule the date/time, swap the media, change the post type (POST/REEL/STORY), or move it to a different platform account. Only works while the post is SCHEDULED (not yet published). All fields optional; omitted fields keep their current value. Pass account_id to move it to a specific connected account. Useful when a user says \"move tomorrow's post to 9 PM\" or \"fix the caption on my scheduled reel\"."},{"name":"get_best_posting_time","description":"Rank the day/hour slots (in IST) where this account's own automations have actually engaged people, from the last 90 days of successful sends. Returns each slot with a relative score and the sample size it was computed from. Below 30 sends it returns India-wide benchmarks instead, and says so via the \"source\" field."},{"name":"generate_content_calendar","description":"Create a 7- or 14-day Instagram content calendar for a specific niche (e.g., fitness, fashion, finance). Each day includes: unique topic, scroll-stopping hook, 50-100 word caption, 5 niche-specific hashtags, best posting time in IST, and content type (reel/carousel/story/post). AI generates fresh ideas — no repeated patterns."},{"name":"manage_sequences","description":"Create, list, update, pause, or delete multi-step drip campaign DM sequences. Sequences enroll subscribers based on keywords (in a DM), comments, or a tag being added to a lead, then send timed messages at configured intervals (minutes, hours, days). Track enrollment and completion counts per sequence. (New-follower triggers are not supported — Instagram sends no follow event and non-messagers cannot be DMed.)"},{"name":"send_broadcast","description":"Send a mass DM to all subscribers, a filtered segment (by tag, lead score, VIP), or specific recipients. Includes 5-30 second randomized delays per send to mimic human behavior and avoid Instagram rate limits. Returns send success/failure counts. Requires explicit user confirmation before executing."},{"name":"manage_dm_templates","description":"Save, list, update, or delete reusable DM script templates. Templates support {name}, {username}, {first_name} variable substitution. Organize by category (Welcome, Pricing, FAQ, Closing) and language (English or any of the 9 Indian languages: Hindi, Hinglish, Bengali, Gujarati, Kannada, Marathi, Punjabi, Tamil, Telugu). Reuse high-converting messages across multiple automations."},{"name":"humanize_text","description":"Rewrite robotic or template-style DM text into natural, human-sounding language to bypass Instagram's automation detection. Three intensity levels: low (minimal tweaks), medium (conversational rewrite), high (aggressive casual texting with abbreviations, fillers). Preserves URLs, mentions, hashtags, and template variables exactly."},{"name":"list_subscribers","description":"Retrieve Instagram subscribers (people who have DMd the user) with filters: recent activity, VIP status, by tag, or by lead score range. Returns subscriber ID, username, total DMs, last interaction time, tags, lead score, and detected mood (excited/neutral/angry/sad)."},{"name":"tag_subscribers","description":"Add or remove tags from one or multiple subscribers in bulk. Tags enable segmented broadcasts, sequence enrollment, and CRM organization. Common tags: vip, hot-lead, course-buyer, cold, follow-up-needed. Returns count of subscribers updated."},{"name":"manage_coupons","description":"Create, list, distribute, or deactivate discount coupon codes. Supports PERCENTAGE (e.g., 20% off), FIXED (₹500 off), and FREE_SHIPPING types, with an expiry date. distribute sends the code as a DM broadcast to all opted-in subscribers of one Instagram account, through the same content-safety, consent and quota checks the Broadcasts page uses — pass socialAccountId when more than one account is connected."},{"name":"manage_ab_test","description":"A/B test the DM text of one automation: two versions, each person gets the same one every time (a stable 50/50 split). Counts successful sends, tracked-link clicks and store sales per version; names the leader once each version has 30+ sends (higher sale rate, then click rate). Applying the winner is done on the dashboard."},{"name":"manage_webhooks","description":"CRUD outgoing webhooks that fire on ViralDM events (new subscriber, DM sent, sale attributed, sequence completed). Use to integrate with n8n, Make.com, Zapier, custom backends, or any HTTP endpoint. Supports HMAC-SHA256 signatures for security."},{"name":"list_integrations","description":"List all 3rd-party integrations available to connect (Notion, Google Sheets, Airtable, Slack, Discord, Mailchimp, ConvertKit, Shopify, Calendly, Stripe) and their current connection status for this user."},{"name":"send_to_integration","description":"Push subscriber data, lead info, or DM events to a connected integration. Examples: add new subscriber to Notion database, append row to Google Sheet, create Airtable record, send Slack notification. Requires the integration to be pre-connected."},{"name":"get_affiliate_stats","description":"Retrieve affiliate program stats: referral count, signups attributed, total commissions earned, pending payouts, and individual referral details. Useful when the user wants to track their referrer earnings on ViralDM."},{"name":"list_social_accounts","description":"List all connected Instagram, Facebook Pages, LinkedIn, YouTube channels, and WhatsApp Business accounts for the user. Returns account ID (needed by other tools), platform, account name, avatar URL, and active/inactive status."},{"name":"shopify_stock","description":"Check the creator's own Shopify store for a product and whether each size or variant is in stock right now. Availability is per VARIANT, because \"hai?\" usually means \"in my size\"."},{"name":"shopify_order_status","description":"Where a specific person's order is. Takes the SUBSCRIBER, never an order number alone — the order is matched against the email or phone already held for that person, so nobody reads a stranger's order by typing a sequential number."},{"name":"get_account_media","description":"List a connected account's recent posts so an automation can be bound to ONE of them. Instagram returns posts and Reels; a YouTube channel returns its videos, each marked SHORT (under 60s) or VIDEO. Other platforms return an empty list rather than an error."},{"name":"youtube_status","description":"YouTube channels, today's remaining API quota, live-chat rules, and whether scheduled publishing is switched on. Read this first when a YouTube automation \"stopped working\": the 10,000-unit daily quota is shared by EVERY ViralDM user, a public reply costs 50 of it, running out is silent, and it resets at midnight US Pacific rather than IST."},{"name":"get_subscription_info","description":"Retrieve the user's current ViralDM subscription: plan name (Free, Starter, Growth, Agency), status (Trial, Active, Past Due), trial end date, billing cycle, plan price in INR, feature limits, and current usage against limits."},{"name":"get_bio_page","description":"Read the user's ViralDM bio page (their link-in-bio at viraldm.app/@handle): handle, published state, theme, profile text, every block, and total views. Use before update_bio_page so you edit from the current state rather than overwriting it."},{"name":"update_bio_page","description":"Create or edit the user's bio page at viraldm.app/@handle. Partial update — send only what changes. Blocks go beyond ordinary links: 'dm' opens an Instagram DM with a keyword so an existing automation replies, 'whatsapp' opens a chat with a prefilled message, 'payment' shows a UPI button (money goes buyer→creator directly), 'lead' collects an email that becomes a subscriber. Also link, video (YouTube), socials, header, text, divider. Invalid blocks are dropped and reported, not saved."},{"name":"get_bio_page_stats","description":"Views, clicks, emails collected, DM taps and payment taps for the bio page over the last 30 days, plus the top 5 blocks by clicks. Use to tell the user which link is actually working."},{"name":"get_ad_report","description":"Who came from which Instagram or Facebook ad: people who tapped \"Send message\" on a Click-to-Direct / Click-to-Messenger ad, and people who commented on a boosted post. Per ad over the last 7, 30 or 90 days: people, messages, comments, how many shared an email or number, and when the last one arrived; plus the automations set to answer only ad traffic. Everyone from an ad is tagged ad-lead. Read-only. To reply to ad traffic differently, use setup_auto_dm with ads_only."},{"name":"get_audience_pulse","description":"Audience Pulse — what followers say in DMs and comments over the last 7 or 30 days: how many messages are questions, buying signals (price, link, size, delivery) and complaints, the mood split, the topics most people mention with example messages (\"price\", \"rate\" and \"kitne ka\" count as one topic) and whether a live automation already answers each, who is still waiting for a reply, and recent negative-comment spike alerts. Reads English, Hinglish and Hindi by words, not AI. Read-only. To answer a topic automatically, use setup_auto_dm with that keyword."},{"name":"run_profile_audit","description":"Audit a connected Instagram profile against its real Graph API data. Scores nine measured checks — bio length, link in bio, profile picture, post count, 30-day posting cadence, Reels share, caption depth, hashtag usage, and engagement rate where Instagram exposes it — and returns each check with the value it was scored on, plus AI suggestions written from those numbers. Highlights and Stories are not covered: the API does not expose them."},{"name":"check_content_safety","description":"Pre-check any message or caption text against Meta's automated DM policy violations BEFORE posting/sending. Detects spam patterns, excessive emojis, repeated content, banned phrases, and link-spam triggers. Returns block/warn/ok verdict with specific reason."},{"name":"get_revenue_stats","description":"Retrieve revenue attribution data — which DM automations, sequences, and coupons led to actual sales. Tracks customer journey from DM open → coupon click → purchase. Returns total revenue in INR, top-converting flows, and per-subscriber lifetime value."},{"name":"get_consent_stats","description":"DPDP Act compliance: get current consent state counts per purpose (order_updates, marketing, broadcast) — how many leads are opted-in, refused, or withdrawn — plus total consent events in the append-only legal ledger. Use to report compliance status."},{"name":"expect_payment","description":"Start a fraud-proof UPI sell flow: tell ViralDM to expect a payment from a specific lead. When that lead sends a payment screenshot in DM, it is auto-verified (amount, UTR, tampering) via AI vision; genuine → auto-deliver the product, unclear → held for review, fake → politely declined. Provide subscriber_id, amount in rupees, and the delivery message/link."},{"name":"list_payment_verifications","description":"List UPI payment-screenshot verifications with their verdict (genuine/suspicious/fake), status (verified/manual_review/rejected), extracted amount + UTR. Filter by status. Use to review which payments were auto-verified vs need manual review."},{"name":"generate_evidence_pack","description":"Generate a one-click, court/dispute-ready PDF evidence pack for a lead — full DM transcript + DPDP consent summary + payment-verification proof + a SHA-256 integrity hash. For Razorpay chargebacks or consumer complaints. Returns a download link + the pack hash."},{"name":"manage_products","description":"Build and manage the creator's digital store: list, read, create, update, publish, unlist or archive products. Seven types — digital file, locked content, course, membership (Telegram/Discord), event/webinar, 1:1 session, and external/affiliate. Supports fixed, pay-what-you-want and free pricing, an optional compare-at price, GST, per-country purchasing-power pricing, stock limits, custom checkout questions and an order bump. Prices are in paise (₹499 = 49900). A product is only reachable on the web once its status is PUBLISHED or UNLISTED."},{"name":"list_orders","description":"List the store's orders with their status (pending, paid, cancelled, refunded), buyer name and email, amount in paise, and the UPI reference the buyer typed. Read-only: buyers pay the creator's UPI directly and only the creator can confirm that money actually arrived, so this tool cannot mark an order paid."},{"name":"get_store_stats","description":"Sales performance for the digital store over a chosen number of days: revenue, paid order count, average order value, checkout conversion rate, a daily revenue series for charting, and a per-product breakdown that also lists products with no sales yet. Revenue is counted on the day an order was PAID, not the day it was started."},{"name":"list_segments","description":"List the named audience segments with a live count of how many subscribers are in each right now — Customers, Abandoned checkout, Gone quiet, Engaged, Hot leads, VIPs, New this week, Has an email. Each is computed from current data, not a stored list. Use before send_broadcast so the user can see exactly how many people a broadcast would reach."},{"name":"manage_knowledge","description":"The creator's AI Brain: list, add or remove the documents the DM assistant answers from (pasted text or a public web page — price lists, FAQs, policies), and ask it a question to see exactly what a follower would get, with the passages it matched. Knowledge is retrieved per message and injected into every AI reply."},{"name":"manage_intents","description":"Route DMs by meaning: list, create, update or delete intents (label + example phrases + optional must-contain keywords) with an action — REPLY with text, run one of the creator's AUTOMATIONS, HANDOFF to a human (pauses the bot for that person and notifies the creator), or TAG the subscriber. Intents run only when no keyword automation answered the message."},{"name":"manage_snippets","description":"Canned replies for the human Inbox: list, save or delete /shortcut snippets ({name} is replaced by the person's name). The creator types /price in the Inbox reply box and the snippet expands."},{"name":"set_inbox_starters","description":"Read or set up to 4 conversation-starter questions Instagram shows when someone opens the account's DM thread for the first time. Saving pushes them to Instagram; a tap is answered by the matching keyword automation or intent. Instagram accounts only."},{"name":"manage_giveaways","description":"Comment-to-enter giveaways: list, create (post + optional keyword + deadline + winners count + follow requirement), end entries, draw winners with a reproducible seeded shuffle, DM the winners, or fetch the entries/proof CSV. Entries are recorded automatically from comments on the chosen post."},{"name":"rewind_comments","description":"Back-send a comment automation to people who commented on its posts in the last 1-7 days, before the automation existed. Always run with dry_run=true first (returns how many qualify), then start the real run — it is paced 20-45 s apart, honours follow-gates, the humanizer and the daily limit, and stops itself at the cap. Also reports the status of recent rewind jobs."},{"name":"surge_guard","description":"Viral-post Safety Mode: read per-account state (paced or normal, sends in the last 10 minutes) and settings (trip threshold and cap per 10 minutes), change them, or force pacing on for an hour before a big drop. Paced replies are queued and drained in waves, never dropped."},{"name":"create_pay_link","description":"Create a UPI pay page for one subscriber: amount, what it is for, and what to deliver on payment. Returns the /pay URL (QR + \"Pay ₹\" button page) and its QR image. When the person sends the payment screenshot back in the DM it is verified automatically and the delivery message/link goes out. Requires the creator's UPI id on their profile and UPI Verify ON."},{"name":"visual_search","description":"\"Ye wala?\" Visual Search — a ViralDM-original DM feature: a follower sends a photo or screenshot of something the creator sells and the bot replies with the exact product card, price and Buy link. This tool lets you test it (pass an image URL and see which products match and how sure the model is), read the 30-day stats (photos asked / matched / answered, plus items people asked for that are not listed), or turn it on/off."},{"name":"manage_friend_loops","description":"Friend Loops — ViralDM's own follower-growth engine inside DMs . A follower types the loop keyword (or any automation reply contains {{refer:KEYWORD}}) and gets a personal invite code; a friend DMs that code, must FOLLOW first, and both get rewards — the referrer at a threshold (message, link, coupon). list loops with stats and leaderboards, create one, pause/resume, delete."},{"name":"creator_circle","description":"Creator Circle — ViralDM creators cross-promote each other inside their freebie DMs . Opt an Instagram account in with a niche, languages, the freebie keyword and a one-line offer; from then on a partner shout-out card (same niche, similar size, fair reciprocity ledger) rides on that account's automation replies, and partners show this creator in return. list shows the profile, this month's given/received/converted numbers and the current partners; join creates or updates; leave removes."},{"name":"activate_agent_template","description":"AI Agent Templates — ViralDM-original one-click vertical agents. Each template configures a whole working DM agent at once: persona, the FAQs it answers, how it handles objections like \"too expensive\" without being pushy, when to hand off to a human, its keyword automations and a delayed follow-up sequence. Verticals: real estate, coaching, restaurant booking, e-commerce support, course selling, salon booking, influencer brand deals. `list` shows the templates and which are already active; `activate` seeds one onto a connected account. Optional per-template values (booking link, price, area) are substituted into the copy — leave them out and the wording still reads correctly. Activating a template twice is refused rather than duplicated; everything it creates is an ordinary automation/sequence the creator can then edit."}],"documentation":"https://viraldm.app/docs/mcp","homepage":"https://viraldm.app","repository":null,"license":"Proprietary","contact":{"email":"info@viraldm.app","url":"https://viraldm.app/contact"},"publisher":{"name":"Vyzonek Technology Private Limited","url":"https://viraldm.app/company","country":"IN","verification":"CIN U58201DC2026PTC473496"}}