@mambalabsdev/mcp-link-in-bio-newsletter-checker
OfficialThis MCP server exposes a single Apify-backed tool that checks a creator's link-in-bio page and reports whether they run a newsletter, plus related contact and commerce details.
Follows a creator handle/profile URL (TikTok, Instagram, YouTube, Pinterest, Twitch, Threads, podcasts) or a link-in-bio URL you already have (Linktree, Stan Store, linkin.bio, own site).
Detects whether the creator runs a newsletter and which email platform hosts it, with the proving page URL and the check method.
Batch support: pass one creator for a single run, or a list for a batch; duplicates are removed automatically.
Returns the link-in-bio host, the creator's own website resolved through redirects, all outbound links, and the public business email.
Surfaces a manager/booking email with its source page, and optionally matches it to a bundled talent agency list (agency name, domain, match method).
Identifies what the creator sells: courses, coaching, digital products, merch, memberships, brand deals, and discount codes.
Optional headless-browser rendering for JavaScript-only pages (Stan Store, linkin.bio, Typeform shells).
Optional website email scan across home, contact, about pages, and footer.
Optional AI verification of the rule classifier's evidence using your own Anthropic or OpenAI key.
Optional residential-proxy escalation for blocked/limited profiles (including Instagram bio fetches), capped via max_residential_reads.
Controls an Apify proxy download size limit (max_download_mb), batch size, and a per-call spending cap (max_charge_usd).
Every row includes row_status and error_reason so "no" is distinguishable from "unknown"; failed creators still return labeled rows rather than being dropped.
Contributes public findings to a shared creator/agency pool by default (can be disabled), and never sends your account, input list, or API keys.
Costs Apify credits: $0.002 per run, $0.008 per creator checked, plus per-event charges for browser renders, website scans, agency matches, and Instagram bio fetches; requires an APIFY_TOKEN.
Supports Apple Podcasts show URLs to read creator bio links and extract newsletter, offerings, and contact details.
Reads Instagram profiles to extract newsletter, offerings, and contact details from the creator's bio links.
Can start directly from Linktree pages to extract newsletter, offerings, and contact details, including rendering otherwise unreadable pages.
Reads Pinterest profiles to extract newsletter, offerings, and contact details from creator bio links.
Reads Threads profiles to extract newsletter, offerings, and contact details from creator bio links.
Reads TikTok profiles to extract newsletter, offerings, and contact details from creator bio links.
Reads Twitch profiles to extract newsletter, offerings, and contact details from creator bio links.
Renders Typeform-based link-in-bio shells that would otherwise be unreadable, allowing newsletter and contact details to be extracted.
Reads YouTube channel profiles to extract newsletter, offerings, and contact details from creator bio links.
Link in Bio Scraper and Newsletter Detector MCP Server
MCP server for the Mamba Labs Link in Bio Scraper and Newsletter Detector actor on Apify.
Creator handles or link in bio URLs in, a newsletter verdict and contact details out.
Install
npx -y @mambalabsdev/mcp-link-in-bio-newsletter-checkerClaude Desktop
{
"mcpServers": {
"mamba-link-in-bio-newsletter-checker": {
"command": "npx",
"args": ["-y", "@mambalabsdev/mcp-link-in-bio-newsletter-checker"],
"env": { "APIFY_TOKEN": "your-apify-token" }
}
}
}Get an Apify token at console.apify.com/account/integrations.
Related MCP server: tweetsave-mcp
Tool
check_link_in_bio_and_newsletter
Follow a creator bio link and report the newsletter, what they sell, and the contact emails.
Input | Type | Required | Description |
| array of string | no | One per line. A profile URL on any supported platform (https://www.tiktok.com/@name, https://www.instagram.com/name/, https://www.youtube.com/@name, a Pinterest, Twitch, or Threads profile, an Apple Podcasts show page, or a Spotify show), or platform:@handle (tiktok:@name). A bare @handle needs |
| array of string | no | Skip the profile read and start from these pages directly (a Linktree, Stan Store, linkin.bio page, or the creator's own site). One per line. When one input item carries both a handle and bio links, the links are read as that creator's links and the actor returns one row for that creator, not one row per link; to get one row per link, pass the links in bio_links alone. |
| array of | no | Which platforms a bare @handle is looked up on. A full profile URL carries its own platform and ignores this. This actor does not search; pass the creators you want read. Supported: TikTok, Instagram, YouTube, Pinterest, Twitch, Threads, and podcasts. Not X, not Facebook pages, not LinkedIn. |
| boolean | no | Off by default. Some link-in-bio pages (Stan Store, linkin.bio, Typeform shells) return an empty shell to a plain fetch and are classified unknown_fetch_failed. Turn this on to render them in a headless browser. Charged per page rendered (event browser-render) to cover the browser compute. Default: false. |
| boolean | no | Off by default. When on, a model reads the rule classifier's evidence and rules on each row. Runs only with your own key in |
| one of | no | Which API the key belongs to. Default: "anthropic". |
| string | no | Your own model API key. Used only when |
| boolean | no | Off by default. For creators with their own website (not a link-in-bio page), reads the home, contact, and about pages and the footer for an email and records where it was found. Charged per creator scanned (event website-scan). Default: false. |
| boolean | no | Matches the domain of a manager or business email against the bundled talent agency list and fills agency_name, agency_domain, and agency_match_method. Charged per matched row (event agency-match). Default: true. |
| boolean | no | On by default. A profile fetch that comes back as a bot detection page is retried once over the residential proxy. On Instagram the bio, bio link, and following are read from the profile page over residential when the embed and the datacenter API did not carry them, and a page that comes back readable charges instagram-bio-fetch ($0.010). Uncheck it to never pay that event: a blocked profile then returns a labeled error row, and Instagram rows keep an empty bio and bio link on about half of the reads. Default: true. |
| integer | no | Caps how many Instagram profile pages one run reads over the residential proxy (each readable one charges instagram-bio-fetch). 0 means no cap. Once the cap is reached, later Instagram rows keep what the embed widget and the datacenter API returned, and error_reason reads escalation_skipped on the rows that would have escalated. Only acts when escalate_on_block is on. Default: 0. |
| integer | no | The largest page or file the actor downloads from a creator's links, in megabytes. A link whose Content-Length is over the limit is not downloaded; a link with no Content-Length is read up to the limit, then stopped and discarded. Either way the row comes back with every other field filled and error_reason reads file_too_large, and the rest of the batch is not affected. 1 to 200. Default: 25. |
| integer | no | Rows fetched at once. Leave empty for the measured per platform default; the measurement is in the README. Higher is faster and, above the measured point, loses rows. |
| boolean | no | On by default. Contributes the public records this run finds to a shared creator and agency pool that all users of this actor read from, so a later run reads what this one found. Only public data already in the returned rows is sent, never your Apify account, your input list, or your API keys, and a contribution is not charged. Set false to read the pool and write nothing. Default: true. |
| number | no | Optional spending cap for this call, in USD. The actor stops before any charge that would take the run past this amount and keeps every row already charged. |
Nothing is required. Link in Bio Scraper and Newsletter Detector answers a run with no usable input with a row carrying row_status and error_reason rather than failing, and the tool mirrors that.
Pricing
Link in Bio Scraper and Newsletter Detector is pay per event on Apify. Every price below is flat across every Apify plan tier, read from the live pricing record on 2026-10-05.
Event | Charged for | Price | Fires when |
| Actor start | $0.002 | Once per run, on start. Covers the run overhead. |
| Links checked | $0.008 | Once per creator whose bio link or link-in-bio page was fetched and classified. A creator with no bio link returns newsletter_status none from the bio alone and does not charge this event. |
| Browser render | $0.004 | Once per page rendered in the headless browser because the plain fetch did not return readable content (Stan Store, linkin.bio, Typeform shells) and the rendered page came back readable: 120 characters of visible text or 3 links off the page's host, and no block page. A render that returns the same empty shell is not charged, and a charged render always reaches the classifier. Only when the option is on. Priced to cover the browser compute. |
| Website scan | $0.005 | Once per creator whose own website (not a link-in-bio page) was scanned for an email on the home, contact, about, and footer. Only when the add-on is on. |
| Agency match | $0.003 | Once per creator row where a manager or agency email domain was matched against the bundled agency list and an agency name came back. |
| Instagram bio fetch | $0.01 | Once per Instagram profile row when the bio, bio link, and following were not on the embed widget or the datacenter API and the profile page was read over the residential proxy and came back readable. Only when escalate_on_block is on. Never on the embed or datacenter reads, never on another platform, never on a blocked page, and never on an error row. |
The platform's synthetic apify-actor-start event is not in this actor's pricing record and is not charged: the actor's own actor-start event above covers the run overhead.
Reading the output
Every row carries row_status and error_reason. A creator the actor could not read comes back as a row saying why, not as a gap in the list, so an absence is readable rather than inferred. Filter on row_status before loading a table.
What this actor shares
The run contributes the records it finds to a shared creator and agency pool that all users of this actor read from. What one run finds, the next run can read.
The toggle is contribute_to_shared_pool. It is on by default. Set it to false and the run still reads the pool and writes nothing to it.
What this actor contributes. The manager contacts it finds, the agency it matched them to, and any manager email domain the pool has not seen before, as a candidate agency for a later run to confirm.
Only public data that is already in your own output. Every field written to the pool is a field this run returned to you, read from a page the platform or the creator publishes to anyone without a login. Nothing from your Apify account, your input list, your API keys, or your own notes is sent. A contribution never deletes anything from the pool.
What a contribution is labeled with. The actor ID, the run ID, the pool key issued to the actor build, and a hash of the calling IP address, used for the rate limit and nothing else. Your Apify account and your user ID are not recorded.
Contributing is free. No event is charged for a write to the pool. If the pool is unreachable the run finishes as normal, the rows are dropped, and the run log says so.
Actor
Actor ID OorucdheTIgu7RFzK. The wrapper calls the actor by that immutable ID rather than by its Store slug, so a Store rename never breaks it.
Suite
Actor | Actor ID | MCP server |
| ||
| ||
| ||
| ||
| ||
|
Built by Mamba Labs.
Available Tools
1 toolcheck_link_in_bio_and_newsletterCheck a Link in Bio Page for a NewsletterARead-onlyIdempotent
Follows the link in bio page behind a creator handle, or a link in bio URL you already hold, and reports whether the creator runs a newsletter, which email platform hosts it, and the page URL that proves it. Also returns the link in bio host, the creator's own website resolved through any redirect, every outbound link found, the public business email, a manager or booking email with the page it came from, a matched talent agency name and domain, and what the creator sells: course, coaching, digital product, merch, membership, brand deals, and discount codes. Every row carries newsletter_check_method, row_status, and error_reason, so a no is told apart from an unknown. Charges $0.002 per run plus $0.008 per creator checked, and on top of that $0.004 per headless browser render, $0.005 per website email scan, $0.003 per agency match, and $0.01 per Instagram bio fetch, each only when that step runs. Every paid step is its own switch (render_unreadable_pages, scan_website_for_email, match_agencies, escalate_on_block, ai_check), so a call runs only the checks you turn on, and max_residential_reads caps the residential Instagram reads. The AI check uses your own Anthropic or OpenAI key and is billed by them, not here. Contributes the public records it finds to a shared creator and agency pool that all users of this actor read from, so a later run reads what this one found; contribute_to_shared_pool is on by default and turning it off leaves the run reading the pool and writing nothing. Only public data already in the returned rows is contributed, nothing from your Apify account or your input, and a contribution is not charged. Requires an APIFY_TOKEN and consumes Apify credits. Read only.
| Name | Required | Description | Default |
|---|---|---|---|
| handles | No | One per line. A profile URL on any supported platform (https://www.tiktok.com/@name, https://www.instagram.com/name/, https://www.youtube.com/@name, a Pinterest, Twitch, or Threads profile, an Apple Podcasts show page, or a Spotify show), or platform:@handle (tiktok:@name). A bare @handle needs `platforms` and is looked up on each listed platform. One entry is a single run; a list is a batch. Duplicates are removed before any fetch. | |
| ai_check | No | Off by default. When on, a model reads the rule classifier's evidence and rules on each row. Runs only with your own key in `ai_api_key`; the actor never uses a Mamba Labs key and never logs yours. Default: false. | |
| bio_links | No | Skip the profile read and start from these pages directly (a Linktree, Stan Store, linkin.bio page, or the creator's own site). One per line. When one input item carries both a handle and bio links, the links are read as that creator's links and the actor returns one row for that creator, not one row per link; to get one row per link, pass the links in bio_links alone. | |
| platforms | No | Which platforms a bare @handle is looked up on. A full profile URL carries its own platform and ignores this. This actor does not search; pass the creators you want read. Supported: TikTok, Instagram, YouTube, Pinterest, Twitch, Threads, and podcasts. Not X, not Facebook pages, not LinkedIn. | |
| ai_api_key | No | Your own model API key. Used only when `ai_check` is on. Never stored, logged, or written to a row. | |
| batch_size | No | Rows fetched at once. Leave empty for the measured per platform default; the measurement is in the README. Higher is faster and, above the measured point, loses rows. | |
| ai_provider | No | Which API the key belongs to. Default: "anthropic". | |
| match_agencies | No | Matches the domain of a manager or business email against the bundled talent agency list and fills agency_name, agency_domain, and agency_match_method. Charged per matched row (event agency-match). Default: true. | |
| max_download_mb | No | The largest page or file the actor downloads from a creator's links, in megabytes. A link whose Content-Length is over the limit is not downloaded; a link with no Content-Length is read up to the limit, then stopped and discarded. Either way the row comes back with every other field filled and error_reason reads file_too_large, and the rest of the batch is not affected. 1 to 200. Default: 25. | |
| escalate_on_block | No | On by default. A profile fetch that comes back as a bot detection page is retried once over the residential proxy. On Instagram the bio, bio link, and following are read from the profile page over residential when the embed and the datacenter API did not carry them, and a page that comes back readable charges instagram-bio-fetch ($0.010). Uncheck it to never pay that event: a blocked profile then returns a labeled error row, and Instagram rows keep an empty bio and bio link on about half of the reads. Default: true. | |
| max_residential_reads | No | Caps how many Instagram profile pages one run reads over the residential proxy (each readable one charges instagram-bio-fetch). 0 means no cap. Once the cap is reached, later Instagram rows keep what the embed widget and the datacenter API returned, and error_reason reads escalation_skipped on the rows that would have escalated. Only acts when escalate_on_block is on. Default: 0. | |
| scan_website_for_email | No | Off by default. For creators with their own website (not a link-in-bio page), reads the home, contact, and about pages and the footer for an email and records where it was found. Charged per creator scanned (event website-scan). Default: false. | |
| render_unreadable_pages | No | Off by default. Some link-in-bio pages (Stan Store, linkin.bio, Typeform shells) return an empty shell to a plain fetch and are classified unknown_fetch_failed. Turn this on to render them in a headless browser. Charged per page rendered (event browser-render) to cover the browser compute. Default: false. | |
| contribute_to_shared_pool | No | On by default. Contributes the public records this run finds to a shared creator and agency pool that all users of this actor read from, so a later run reads what this one found. Only public data already in the returned rows is sent, never your Apify account, your input list, or your API keys, and a contribution is not charged. Set false to read the pool and write nothing. Default: true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: per-step pricing ($0.002 base, $0.008 per creator, plus per-event charges), the exact event names, the shared-pool contribution default and that opting out still reads the pool, the requirement of APIFY_TOKEN with Apify credit consumption, and that the AI check uses the caller's own key and is billed externally. These are the kinds of cost, privacy, and side-effect disclosures an agent cannot derive from readOnlyHint/openWorldHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the primary result fields are front-loaded, which is good, but the body is a single ~400-word paragraph of run-on sentences and repeats cost/event details that the input schema already documents. The pricing and switch recap could be trimmed without losing selection information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, no-required-input tool with no output schema, the description covers prerequisites (APIFY_TOKEN), cost model, side effects (shared pool contribution), and the shape of returned rows including newsletter_check_method, row_status, and error_reason. Nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself carries rich per-parameter prose, so the description's mention of the switch names (render_unreadable_pages, scan_website_for_email, match_agencies, escalate_on_block, ai_check) and max_residential_reads largely restates existing field documentation. It adds little syntax or format meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Follows the link in bio page behind a creator handle... and reports whether the creator runs a newsletter, which email platform hosts it, and the page URL that proves it.' It also enumerates the secondary return fields (host, website, outbound links, business email, agency, sales channels), so the agent knows exactly what the call produces. No siblings exist, so no differentiation is required.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for the two entry modes ('handles' vs. 'bio_links') and explains the condition under which each optional step runs, which tells the agent how to tailor the call. It never states when to prefer this tool over an alternative or when not to use it, but with no sibling tools and a single entry point, the practical guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.1.1- Changed
check_link_in_bio_and_newsletter3 fields changed- added
Input schema / properties / contribute_to_shared_poolAdded value: +{ + "description": "On by default. Contributes the public records this run finds to a shared creator and agency pool that all users of this actor read from, so a later run reads what this one found. Only public data already in the returned rows is sent, never your Apify account, your input list, or your API keys, and a contribution is not charged. Set false to read the pool and write nothing. Default: true.", + "type": "boolean" +} - added
Input schema / properties / max_download_mbAdded value: +{ + "description": "The largest page or file the actor downloads from a creator's links, in megabytes. A link whose Content-Length is over the limit is not downloaded; a link with no Content-Length is read up to the limit, then stopped and discarded. Either way the row comes back with every other field filled and error_reason reads file_too_large, and the rest of the batch is not affected. 1 to 200. Default: 25.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / max_residential_readsAdded value: +{ + "description": "Caps how many Instagram profile pages one run reads over the residential proxy (each readable one charges instagram-bio-fetch). 0 means no cap. Once the cap is reached, later Instagram rows keep what the embed widget and the datacenter API returned, and error_reason reads escalation_skipped on the rows that would have escalated. Only acts when escalate_on_block is on. Default: 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +}
1 tool update
v1.0.0- First observed
check_link_in_bio_and_newsletter
TDQS
Scored across 1 tool
With only a single tool there is no risk of an agent confusing it with a sibling, so misselection is impossible. However, the one tool internally bundles many distinct capabilities (newsletter detection, email scanning, agency matching, Instagram bio fetch, AI check), so its 'purpose' is broad rather than crisply singular.
There is only one tool, named check_link_in_bio_and_newsletter in a clear verb_noun snake_case style that matches its action. No competing conventions exist to create inconsistency.
A single monolithic tool exposes an enormous parameter surface (five paid-step switches, max_residential_reads, model keys, pool contribution) that would be far more usable split into focused tools. One tool for this breadth of behavior falls in the 'too few' band.
The actor is explicitly read-only and covers its stated domain thoroughly: newsletter status, host platform, proof URL, outbound links, emails, agency match, and commerce signals, each with row_status and error_reason. The main gap is the absence of any batch or multi-handle entry point, which an agent must work around by calling repeatedly.
Maintenance
Related MCP Connectors
Find viral outlier posts on TikTok, Instagram and YouTube, pull creator stats, and crawl on demand.
Creator discovery & analytics across YouTube, Instagram, TikTok (30M+) + brand/sponsor intel.
Instagram analytics, media kits, bio link and brand deals for creators, from your AI assistant.
Build and host link-in-bio pages and run Instagram comment-to-DM automations from the conversation.
Related MCP Servers
AlicenseAqualityCmaintenanceEnables AI-native creator discovery for influencer marketing, including creator search, lookalikes, profile lookup, and Instagram post transcript analysis.1426 npm1MIT- AlicenseAqualityDmaintenanceEnables fetching tweets, threads, and converting them to blog posts without requiring a Twitter API key.523 npm7MIT
- AlicenseNot gradedqualityDmaintenanceExtracts sponsored products, brand mentions, and affiliate signals from newsletters to generate a shoppable 'Products in this edition' section for affiliate revenue.326 npmMIT
- AlicenseAqualityAmaintenanceEnables resolving a company domain to its Instagram, Threads, and Facebook accounts with follower and post counts.190 npmMIT