{
  "$schema": "https://static.modelcontextprotocol.io/schemas/mcp-server-card/v1.json",
  "name": "com.studiocorsair/lodestone",
  "title": "Lodestone",
  "description": "One hosted connector URL giving any MCP client live access to 21 services and 51 tools.",
  "version": "1.0.0",
  "websiteUrl": "https://lodestone.studiocorsair.com",
  "documentationUrl": "https://lodestone.studiocorsair.com/docs",
  "serverUrl": "https://lodestone.studiocorsair.com/mcp",
  "transport": {
    "type": "streamable-http",
    "url": "https://lodestone.studiocorsair.com/mcp"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://lodestone.studiocorsair.com/mcp",
      "auth": "oauth2.1"
    },
    {
      "type": "streamable-http",
      "url": "https://lodestone.studiocorsair.com/mcp/demo",
      "auth": "none",
      "note": "No-account demo: search_airbnb only"
    }
  ],
  "authentication": {
    "required": true,
    "schemes": [
      "oauth2"
    ],
    "protectedResourceMetadata": "https://lodestone.studiocorsair.com/.well-known/oauth-protected-resource",
    "docs": "https://lodestone.studiocorsair.com/auth.md"
  },
  "icons": [
    {
      "src": "https://lodestone.studiocorsair.com/android-chrome-512x512.png",
      "sizes": "512x512",
      "mimeType": "image/png"
    }
  ],
  "capabilities": {
    "tools": {
      "listChanged": false
    }
  },
  "tools": [
    {
      "name": "search_airbnb",
      "title": "Search Airbnb listings",
      "description": "Search live Airbnb listings by location, monthly price ceiling and bedroom count. Returns matching stays with monthly price and rating.",
      "annotations": {
        "title": "Search Airbnb listings",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_places",
      "title": "Search Google Maps places",
      "description": "Search Google Maps for places (restaurants, shops, services, businesses) by keyword and optional location. Returns names, star ratings, review counts, category, address, phone and website.",
      "annotations": {
        "title": "Search Google Maps places",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_flights",
      "title": "Search flight prices",
      "description": "Search live flight prices and itineraries between two airports on a date (one-way or round-trip). Returns options sorted cheapest-first with airline, duration and stops.",
      "annotations": {
        "title": "Search flight prices",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_hotels",
      "title": "Search hotel availability",
      "description": "Search live hotel availability and prices on Booking.com for a location and date range. Returns hotels with nightly price, star rating and review score.",
      "annotations": {
        "title": "Search hotel availability",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_reddit",
      "title": "Search Reddit posts",
      "description": "Search Reddit for posts matching a query. Returns post titles, subreddit, upvotes, comment counts and links.",
      "annotations": {
        "title": "Search Reddit posts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "generate_image_nano_banana",
      "title": "Generate an image (Nano Banana)",
      "description": "Generate an image with Google's Nano Banana (Gemini 3 Pro Image) — best for photorealism, legible text in the image, and following complex/compositional prompts. Returns the image inline. SLOW: usually ~30-40 seconds. Tell the user it is generating and will take about half a minute BEFORE you call this, so the wait is expected rather than looking like a hang.",
      "annotations": {
        "title": "Generate an image (Nano Banana)",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "generate_image_flux",
      "title": "Generate an image (FLUX)",
      "description": "Generate an image with FLUX1.1 [pro] — fast, sharp, great aesthetic quality for art, product shots and concept art. Returns the image inline.",
      "annotations": {
        "title": "Generate an image (FLUX)",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "generate_image_seedream",
      "title": "Generate an image (Seedream)",
      "description": "Generate an image with ByteDance Seedream 4.5 — high-resolution, strong at people, scenes and cinematic looks. Returns the image inline.",
      "annotations": {
        "title": "Generate an image (Seedream)",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "generate_video_veo",
      "title": "Generate a video (Veo)",
      "description": "Generate a short video with Google Veo 3 Fast (includes generated audio). Returns a link to the finished video. VERY SLOW: usually ~60 seconds, sometimes longer. BEFORE calling, tell the user the video is generating and will take about a minute, so the wait is expected. If the call appears to fail or time out, say so plainly — do NOT silently retry, since the video may well have been generated and a retry bills them again.",
      "annotations": {
        "title": "Generate a video (Veo)",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "generate_video_kling",
      "title": "Generate a video (Kling)",
      "description": "Generate a short video with Kling 2.5 Turbo Pro — smooth, cinematic motion. Returns a link to the finished video. THE SLOWEST TOOL HERE: usually ~90 seconds, sometimes longer, and some clients give up before it returns. BEFORE calling, tell the user it will take a minute and a half; if they need something faster, generate_video_veo is about 60s. If the call appears to fail or time out, say so plainly — do NOT silently retry, since the video may well have been generated and a retry bills them again.",
      "annotations": {
        "title": "Generate a video (Kling)",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_twitter",
      "title": "Search X posts",
      "description": "Search X/Twitter for tweets matching a query. Supports operators (from:user, filter:videos, min_faves:N, until:YYYY-MM-DD). Returns tweets with author, likes, retweets and link.",
      "annotations": {
        "title": "Search X posts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "twitter_user",
      "title": "Get an X profile",
      "description": "Get an X/Twitter user's profile — name, bio, follower/following/tweet counts, verified status.",
      "annotations": {
        "title": "Get an X profile",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "twitter_user_tweets",
      "title": "Get a user's recent X posts",
      "description": "Get a user's most recent tweets.",
      "annotations": {
        "title": "Get a user's recent X posts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "twitter_replies",
      "title": "Get replies to an X post",
      "description": "Get the replies to a specific tweet.",
      "annotations": {
        "title": "Get replies to an X post",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_instagram",
      "title": "Look up an Instagram profile",
      "description": "Look up an Instagram profile by username — full name, bio, follower and post counts.",
      "annotations": {
        "title": "Look up an Instagram profile",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_tiktok",
      "title": "Search TikTok videos",
      "description": "Search TikTok for videos by keyword or handle. Returns author, play count, caption and link.",
      "annotations": {
        "title": "Search TikTok videos",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_facebook",
      "title": "Search Facebook pages and posts",
      "description": "Search Facebook public pages/posts by name or keyword. Returns page/author, text and link.",
      "annotations": {
        "title": "Search Facebook pages and posts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_facebook_ads",
      "title": "Search the Meta Ad Library",
      "description": "Search the PUBLIC Meta (Facebook/Instagram) Ad Library for ads any advertiser is running — great for competitor and creative research. Returns advertiser, ad copy, call-to-action, landing link, platforms, run dates and a permalink. This is public ad data, not your own ad account (use meta_ads_* tools for that).",
      "annotations": {
        "title": "Search the Meta Ad Library",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "search_amazon",
      "title": "Search Amazon products",
      "description": "Search Amazon for products by keyword. Returns title, price, star rating, review count, Prime / Amazon's Choice / Best Seller badges and product link.",
      "annotations": {
        "title": "Search Amazon products",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_whoami",
      "title": "Check Meta Ads identity",
      "description": "Check that your connected Meta account works and see whose token it is.",
      "annotations": {
        "title": "Check Meta Ads identity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_list_accounts",
      "title": "List Meta ad accounts",
      "description": "List the Meta ad accounts your connected token can access (name, id, currency, status).",
      "annotations": {
        "title": "List Meta ad accounts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_account_info",
      "title": "Get Meta ad account details",
      "description": "Get details for your Meta ad account — currency, status, lifetime amount spent, spend cap and balance.",
      "annotations": {
        "title": "Get Meta ad account details",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_list_campaigns",
      "title": "List Meta ad campaigns",
      "description": "List campaigns in your Meta ad account with status, objective and budget.",
      "annotations": {
        "title": "List Meta ad campaigns",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_get_campaign",
      "title": "Get a Meta ad campaign",
      "description": "Get one Meta campaign by id (status, objective, budget, schedule).",
      "annotations": {
        "title": "Get a Meta ad campaign",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_list_ad_sets",
      "title": "List Meta ad sets",
      "description": "List ad sets in your Meta ad account, or just those in one campaign.",
      "annotations": {
        "title": "List Meta ad sets",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_get_ad_set",
      "title": "Get a Meta ad set",
      "description": "Get one Meta ad set by id (status, optimization goal, budget, targeting).",
      "annotations": {
        "title": "Get a Meta ad set",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_list_ads",
      "title": "List Meta ads",
      "description": "List ads in your Meta ad account, or just those in one ad set.",
      "annotations": {
        "title": "List Meta ads",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_get_ad",
      "title": "Get a Meta ad",
      "description": "Get one Meta ad by id (name, status, parent ad set/campaign).",
      "annotations": {
        "title": "Get a Meta ad",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_insights",
      "title": "Get Meta Ads performance insights",
      "description": "Get performance/spend metrics (spend, impressions, clicks, CTR, CPC, CPM, reach) for your whole ad account or one campaign/ad set/ad.",
      "annotations": {
        "title": "Get Meta Ads performance insights",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_list_page_posts",
      "title": "List Facebook Page posts",
      "description": "List recent posts on your connected Facebook Page so you can pick one to promote (returns each post's id for meta_ads_boost_post).",
      "annotations": {
        "title": "List Facebook Page posts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_create_campaign",
      "title": "Create a Meta ad campaign",
      "description": "[WRITE — changes your live account] Create a new Meta campaign. Created PAUSED; won't spend until you activate it. Requires confirm:true.",
      "annotations": {
        "title": "Create a Meta ad campaign",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_update_campaign",
      "title": "Update a Meta ad campaign",
      "description": "[WRITE — changes your live account] Update a Meta campaign's name, status and/or daily budget. Requires confirm:true.",
      "annotations": {
        "title": "Update a Meta ad campaign",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_set_status",
      "title": "Pause or activate a Meta ad object",
      "description": "[WRITE — changes your live account] Pause or resume any Meta campaign, ad set or ad by id. Pausing stops spend. Requires confirm:true.",
      "annotations": {
        "title": "Pause or activate a Meta ad object",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_create_ad_set",
      "title": "Create a Meta ad set",
      "description": "[WRITE — changes your live account] Create a Meta ad set under a campaign (budget, optimization goal, country/age/gender targeting). Created PAUSED. Requires confirm:true.",
      "annotations": {
        "title": "Create a Meta ad set",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_update_ad_set",
      "title": "Update a Meta ad set",
      "description": "[WRITE — changes your live account] Update a Meta ad set's name, status and/or daily budget. Requires confirm:true.",
      "annotations": {
        "title": "Update a Meta ad set",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_create_image_ad",
      "title": "Create a Meta image ad",
      "description": "[WRITE — changes your live account] Create an image ad from a public image URL (Meta fetches it — no upload) under an existing ad set. Created PAUSED. Needs a Facebook Page. Requires confirm:true.",
      "annotations": {
        "title": "Create a Meta image ad",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "meta_ads_boost_post",
      "title": "Boost a Facebook Page post",
      "description": "[WRITE — changes your live account] Promote an existing Facebook Page post as an ad under an existing ad set (no upload). Created PAUSED. Requires confirm:true.",
      "annotations": {
        "title": "Boost a Facebook Page post",
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "telegram_get_bot_info",
      "title": "Check Telegram bot identity",
      "description": "Check that your connected Telegram bot token works and see the bot's username (via @BotFather's getMe).",
      "annotations": {
        "title": "Check Telegram bot identity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "telegram_send_message",
      "title": "Send a Telegram message",
      "description": "Send a text message through your Telegram bot to a chat (a user who has DM'd the bot, or a group/channel the bot is in).",
      "annotations": {
        "title": "Send a Telegram message",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "telegram_get_chat",
      "title": "Get a Telegram chat",
      "description": "Get info (type, title/name, username, description) for a chat your bot can see, by id or @username.",
      "annotations": {
        "title": "Get a Telegram chat",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "telegram_read_recent_updates",
      "title": "Read recent Telegram updates",
      "description": "Read the newest messages your bot has received. IMPORTANT: Telegram's Bot API has no \"fetch chat history\" endpoint. A bot only ever sees messages sent directly to it (DMs), or messages in groups where its privacy mode is off or it's an admin — and only NEW messages received after this tool starts checking, never anything sent before that.",
      "annotations": {
        "title": "Read recent Telegram updates",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "email_search",
      "title": "Search email",
      "description": "Search your connected email account for messages matching a text query (checks From, Subject and body). message_id is an IMAP uid (from email_search or email_list_recent), scoped to the folder it was found in — not the email's Message-ID header.",
      "annotations": {
        "title": "Search email",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "email_read",
      "title": "Read an email",
      "description": "Read the full text of one email from your connected account by its uid. message_id is an IMAP uid (from email_search or email_list_recent), scoped to the folder it was found in — not the email's Message-ID header.",
      "annotations": {
        "title": "Read an email",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "email_send",
      "title": "Send an email",
      "description": "Send a plain-text email from your connected account.",
      "annotations": {
        "title": "Send an email",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "email_list_recent",
      "title": "List recent email",
      "description": "List the most recent emails in a folder of your connected account (default INBOX). message_id is an IMAP uid (from email_search or email_list_recent), scoped to the folder it was found in — not the email's Message-ID header.",
      "annotations": {
        "title": "List recent email",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "beeper_list_chats",
      "title": "List chats",
      "description": "List your recent Beeper conversations (across WhatsApp, Telegram, Signal, iMessage and every connected network), newest first, with each chat's ID, title and network.",
      "annotations": {
        "title": "List chats",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "beeper_read_chats",
      "title": "Read chat messages",
      "description": "Read the recent messages in one Beeper conversation (who said what, newest last) so you have the context before replying.",
      "annotations": {
        "title": "Read chat messages",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "beeper_search",
      "title": "Search chat messages",
      "description": "Search across all your Beeper messages for text (e.g. an address someone sent, a confirmation number), optionally limited to certain chats or to messages from other people.",
      "annotations": {
        "title": "Search chat messages",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "beeper_send_message",
      "title": "Send a chat message",
      "description": "[WRITE — sends a real message to a real person] Send a text message to one of your Beeper conversations. You must have read the thread first and confirmed the exact text with the user. Requires confirm:true.",
      "annotations": {
        "title": "Send a chat message",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "typefully_whoami",
      "title": "Check Typefully identity",
      "description": "Check that your connected Typefully API key works and see your Typefully account + social set(s) — the group of networks (X, LinkedIn, Threads, Bluesky, Mastodon) a post fans out to.",
      "annotations": {
        "title": "Check Typefully identity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "typefully_post",
      "title": "Publish or schedule a post",
      "description": "Publish a post (with an optional image) to your social networks via Typefully — X and, if connected, LinkedIn, Threads, Bluesky and Mastodon at once. Publishes immediately by default; can also schedule. Handles image upload for you: pass image_url (e.g. a generated fal.media image) and Typefully attaches it.",
      "annotations": {
        "title": "Publish or schedule a post",
        "readOnlyHint": false,
        "destructiveHint": true,
        "openWorldHint": true
      }
    }
  ]
}