# Chrome Web Store Scraper: Extension Users, Ratings & Versions (`mrslm_data/chrome-web-store-extensions`) Actor

Users, rating, review count, version, last update, size, permissions, developer and similar extensions for any Chrome Web Store extension. Bulk IDs or URLs.

- **URL**: https://apify.com/mrslm_data/chrome-web-store-extensions.md
- **Developed by:** [shawn slam](https://apify.com/mrslm_data) (community)
- **Categories:** Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 extensions

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Chrome Web Store Scraper: Extension Users, Ratings & Versions

**Users, rating, version, last update, size, permissions and developer for any Chrome Web Store extension, plus its similar extensions. $2.00 per 1,000 extensions.**

### Quick start

1. Press **Start**. The form is already filled with this example input, so the first run returns real rows in under a minute:

```json
{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "nngceckbapebfimnlniiiahkandclblb"
  ]
}
```

2. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
3. Download the results as JSON, CSV or Excel from the **Output** tab, or schedule the run to repeat.

**Full guide: How to Scrape Chrome Web Store Extension Data: Users, Ratings, Versions and Permissions**

### What the Chrome Web Store Scraper does

You give the Actor extension IDs (the 32-letter code in every store link) or full Chrome Web Store URLs. It reads each extension's public store page, including the manifest details the store publishes for it, and saves one row per extension with users, rating, rating count, category, developer, version, last update, created date, size, minimum Chrome version, languages, manifest version, permissions, host permissions and content-script sites.

Turn on `discoverSimilar` and the Actor also follows the "similar extensions" list that Chrome shows on each page, so one seed extension becomes a competitor set. `foundVia` tells you which seed led to each discovered extension.

- Users and rating as numbers, ready to sort and chart.
- The real permission list from the extension's manifest, not a summary.
- An optional full description (up to 3,000 characters) with `includeDescription`.

### Who it is for

- **Extension developers**: track your users and rating against your competitors every day or week.
- **Security and IT teams**: review what the extensions used in your company are allowed to access, and how recently they were updated.
- **Investors and analysts**: size an extension category and spot tools that are growing fast.
- **Marketers and agencies**: build lists of extensions in a niche, with their websites and developers, for partnership outreach.

### Real example: map the ad-blocker competitors of uBlock Origin Lite

Say you build a privacy or ad-blocking extension and want a quick map of the space: who the big players are, how they are rated and what they ask permission for. You start from one well-known extension, uBlock Origin Lite, and let Chrome's own "similar" lists do the rest.

#### Step 1: Enter the input

Open the [Chrome Web Store Scraper](https://apify.com/mrslm_data/chrome-web-store-extensions) in Apify Console, switch the input form to **JSON** and paste this. It is the exact input used for the run in this guide:

```json
{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh"
  ],
  "discoverSimilar": true,
  "maxResults": 12
}
```

What each setting does:

- `extensions`: one extension ID. A full store URL works too.
- `discoverSimilar`: also save the extensions Chrome lists as similar, and their similar ones, until the cap is reached.
- `maxResults`: stop at twelve saved extensions in total, seed included.

#### Step 2: Run it

Press **Start**. On 30 October 2026 this input finished with status `SUCCEEDED` in about 6 seconds and saved 12 rows to the run's dataset. The run was charged 12 `extension` events plus one start event, so the bill was $0.0241 on the Free/Bronze tier. The summary reports 1 seed read, 0 failures and "Reached maxResults (12)".

#### Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

| name | users | rating | ratingCount | category | developer | lastUpdated |
|---|---|---|---|---|---|---|
| uBlock Origin Lite | 22000000 | 4.53 | 3756 | privacy | Raymond Hill (gorhill) | 2026-10-27T00:44:43.000Z |
| SponsorBlock for YouTube - Skip Sponsorships | 2000000 | 4.57 | 3533 | functionality | Ajay | 2026-06-26T16:54:13.000Z |
| Privacy Badger | 1000000 | 4.78 | 2032 | privacy | Electronic Frontier Foundation | 2026-10-09T18:25:37.000Z |
| uBlock | 1000000 | 2.37 | 2304 | workflow | ublock | 2026-09-30T01:58:13.000Z |
| Twitch Adblock | 200000 | 3.81 | 404 | privacy |  | 2026-06-19T05:48:01.000Z |
| AdGuard Extra | 300000 | 3.91 | 168 | workflow | Adguard Software Ltd | 2026-09-03T14:58:30.000Z |
| AdGuard Extra (Beta) | 100000 | 4.27 | 146 | workflow | Adguard Software Ltd | 2026-10-06T09:22:59.000Z |
| YouTube AdBlock - Coffee Break for YouTube | 20000 | 4.09 | 131 | functionality | Coffee Break | 2026-05-11T10:59:29.000Z |
| AdGuard AdBlocker (Beta) | 100000 | 3.89 | 209 | privacy | Adguard Software Ltd | 2026-10-25T17:17:07.000Z |
| uBlock Origin Scope | 80000 | 4.09 | 55 | privacy | Raymond Hill (gorhill) | 2026-09-25T16:53:13.000Z |
| TTV LOL PRO | 100000 | 2.57 | 362 | social | Younes Aassila | 2026-05-08T21:27:01.000Z |
| YouTube No Translation | 80000 | 4.68 | 498 | entertainment | YouGo | 2026-10-28T15:24:53.000Z |

And one full row as JSON (long text shortened with …):

```json
{
  "extensionId": "mnjggcdmjocbbbhaepdhchncahnbgone",
  "name": "SponsorBlock for YouTube - Skip Sponsorships",
  "summary": "Skip sponsorships, subscription begging and more on YouTube videos. Report sponsors on videos you watch to save others' time.",
  "users": 2000000,
  "rating": 4.57,
  "ratingCount": 3533,
  "category": "functionality",
  "categoryPath": "make_chrome_yours/functionality",
  "developer": "Ajay",
  "websiteUrl": "https://sponsor.ajay.app/",
  "supportUrl": "https://discord.gg/SponsorBlock",
  "version": "6.1.6",
  "lastUpdated": "2026-06-26T16:54:13.000Z",
  "createdAt": "2019-07-23T02:25:40.000Z",
  "size": "1.76MiB",
  "minChromeVersion": "88",
  "manifestVersion": 3,
  "permissions": [
    "storage",
    "scripting",
    "unlimitedStorage"
  ],
  "optionalPermissions": [],
  "hostPermissions": [
    "https://*.youtube.com/*",
    "https://sponsor.ajay.app/*"
  ],
  "contentScriptMatches": [
    "https://*.youtube.com/*",
    "https://www.youtube-nocookie.com/embed/*"
  ],
  "url": "https://chromewebstore.google.com/detail/mnjggcdmjocbbbhaepdhchncahnbgone",
  "foundVia": "ddkjiahejlhfcafbddmgiahcphecmpfh"
}
```

What the twelve real rows show:

- **A clear leader.** uBlock Origin Lite has 22,000,000 users and a 4.53 rating from 3,756 ratings. The next largest is SponsorBlock with 2,000,000, then Privacy Badger and an extension called "uBlock" with 1,000,000 each. The store's user counts are rounded ("1,000,000+"), and the Actor saves the store's number.
- **Check the developer, not just the name.** The extension named "uBlock" (developer "ublock", website ublock.org) is a different product from uBlock Origin and is rated 2.37. A name match alone would mix them up; `developer` and `extensionId` keep them apart.
- **Permissions vary a lot.** uBlock Origin Lite, Privacy Badger, Twitch Adblock and AdGuard AdBlocker (Beta) request `<all_urls>` host access. AdGuard Extra asks for no permissions and no host access at all. YouTube No Translation asks for a single permission and only YouTube host access. For a security review, `hostPermissions` and `contentScriptMatches` are the columns to read.
- **Every one is on Manifest V3.** All twelve rows have `manifestVersion` 3, which matters because Chrome has phased out Manifest V2 extensions.
- **Active maintenance is visible.** Eight of the twelve were updated in September or October 2026. TTV LOL PRO and YouTube AdBlock - Coffee Break were last updated in May.
- **Not every extension lists a developer.** Twitch Adblock has no developer name on its store page, so `developer` is empty for it.

### How to find a Chrome extension ID

Open the extension in the Chrome Web Store. The ID is the 32-letter code at the end of the address, for example `https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh`. You can paste the whole URL or just the code. On your own computer, `chrome://extensions` with **Developer mode** on also shows the ID of every installed extension, which is handy for auditing a company's machines.

### Using it for an extension security review

For an audit, list the IDs your company allows and run them weekly. Sort by `lastUpdated` to find abandoned extensions, filter `hostPermissions` for `<all_urls>` or `*://*/*` to find those that can read every site, and compare `version` from week to week to see what changed. The permission list comes from the extension's manifest as the store publishes it, so it reflects what the current version asks for.

### Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

| Field | What it means | Example from this run |
|---|---|---|
| `extensionId` | The 32-letter Chrome Web Store ID. | ddkjiahejlhfcafbddmgiahcphecmpfh |
| `name / summary` | Extension name and the short summary from the store. | uBlock Origin Lite / An efficient content blocker. Blocks ads, trackers, miners,… |
| `users` | User count as shown by the store (rounded, e.g. 1,000,000+ saved as 1000000). | 22000000 |
| `rating / ratingCount` | Average star rating and the number of ratings. | 4.53 / 3756 |
| `category / categoryPath` | Store category and its full path. | privacy / make_chrome_yours/privacy |
| `developer` | Developer or publisher name, when shown. | Raymond Hill (gorhill) |
| `websiteUrl / supportUrl` | Website and support links from the listing. | https://sponsor.ajay.app/ / https://github.com/uBlockOrigin/uBOL-issues |
| `privacyPolicyUrl` | Privacy policy link, when the developer gives one. | https://github.com/gorhill/uBlock/wiki/Privacy-policy |
| `version / lastUpdated` | Current version and the date of the last update. | 2026.1026.1812 / 2026-10-27T00:44:43.000Z |
| `createdAt` | When the extension was first published. | 2022-09-08T13:10:25.000Z |
| `size` | Package size as shown, e.g. 8.59MiB. | 8.59MiB |
| `minChromeVersion` | Lowest Chrome version it supports. | 122.0 |
| `languages` | Languages the listing supports. | Deutsch, English, English (United Kingdom) … |
| `manifestVersion` | Manifest version (3 for current extensions). | 3 |
| `permissions / optionalPermissions` | Permissions from the extension manifest. | activeTab, alarms, declarativeNetRequest … / declarativeNetRequestWithHostAccess |
| `hostPermissions` | Sites the extension can access, e.g. \<all_urls>. | \<all_urls> |
| `contentScriptMatches` | Sites where it injects scripts. | https://*.youtube.com/*, https://www.youtube-nocookie.com/em… |
| `similarExtensionIds` | IDs Chrome lists as similar. | mnjggcdmjocbbbhaepdhchncahnbgone, pkehgijcmpdhfbdbbnkijodmdj… |
| `foundVia` | For discovered extensions, the ID that led to it. Empty for your own seeds. | ddkjiahejlhfcafbddmgiahcphecmpfh |
| `url / iconUrl` | Store page and icon links. | https://chromewebstore.google.com/detail/ddkjiahejlhfcafbddm… / https://lh3.googleusercontent.com/lsanoOfx5N_t-7gh5Qg9FGIirV… |

### Export Chrome Web Store data to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

**From Apify Console.** Open the run, go to the **Output** tab and click **Export**. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example `name`, `users`, `rating`, `ratingCount`, `category`. Nested values such as lists are flattened into columns like `permissions/0` in CSV and Excel.

**From a URL.** The same export is a plain HTTPS link. Replace `<DATASET_ID>` with the dataset ID shown on the run's Storage tab:

```bash
## CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=name,users,rating,ratingCount,category,developer,version,lastUpdated,url" -o chrome-extensions.csv

## Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
  "https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o chrome-extensions.xlsx
```

**Into Google Sheets.** You have three good options:

1. **One-off:** download the CSV and use **File > Import > Upload** in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
2. **Automatic, no code:** in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own [Google Sheets Import & Export](https://apify.com/lukaskrivka/google-sheets) Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
3. **Formula:** `=IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>")` always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

### Schedule it to run every Monday at 6:00

User counts, ratings and versions change slowly, so a weekly run is usually enough to see trends. Keep the same list of IDs (turn `discoverSimilar` off for a fixed list) so each week's file lines up with the last one.

1. In the Actor's input form, set up the input from Step 1 and click **Save as new task**. Give it a clear name such as `chrome-extensions-weekly`.
2. Go to **Schedules > Create new**, set the cron expression to `0 6 * * 1` and pick your timezone, so it runs every Monday at 6:00.
3. Add the task to the schedule and save. Each run gets its own fresh dataset.
4. Optional: on the task's **Integrations** tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: `https://api.apify.com/v2/actor-tasks/<USERNAME>~chrome-extensions-weekly/runs/last/dataset/items?status=SUCCEEDED&format=json`.

### Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called `APIFY_TOKEN` rather than in the code.

**Python** (`pip install "apify-client>=3"`). Tested with apify-client 3.4:

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
    "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh"
    ],
    "discoverSimilar": True,
    "maxResults": 12
}

run = client.actor("mrslm_data/chrome-web-store-extensions").call(run_input=run_input)

## apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item["name"], item["users"])
```

In apify-client 3.x, `call()` returns a typed object. Older examples that use `run["defaultDatasetId"]` were written for 1.x and 2.x and fail in 3.x with `TypeError: 'Run' object is not subscriptable`.

**JavaScript / Node.js** (`npm install apify-client`):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
    "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh"
    ],
    "discoverSimilar": true,
    "maxResults": 12
};

const run = await client.actor('mrslm_data/chrome-web-store-extensions').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);
```

**curl**, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

```bash
curl -X POST "https://api.apify.com/v2/acts/mrslm_data~chrome-web-store-extensions/run-sync-get-dataset-items?format=csv" \
  -H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
  -d '{"extensions": ["ddkjiahejlhfcafbddmgiahcphecmpfh"], "discoverSimilar": true, "maxResults": 12}' -o chrome-extensions.csv
```

### What it costs

The Actor uses pay-per-event pricing. **Extension**: $2.00 per 1,000 on the Free and Bronze tiers, $1.80 on Silver and $1.60 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

| Scenario | Free / Bronze | Silver | Gold |
|---|---|---|---|
| The run in this guide (12 extension) | $0.0241 | $0.0217 | $0.0193 |
| Weekly tracking of 50 extensions (4 runs, 200 a month) | $0.40 | $0.36 | $0.32 |
| One-off category map of 1,000 extensions | $2.00 | $1.80 | $1.60 |

To cap spending, set **Maximum cost per run** in the run options (or `maxTotalChargeUsd` in the API). The Actor stops cleanly at the cap and you are never billed past it.

### Limits

- Public Chrome Web Store data only. The Actor does not log in and cannot see developer dashboards, install numbers by country or review text.
- User counts are rounded by the store, so small changes do not show until the next step (e.g. 100,000+ to 200,000+).
- Similar extensions are Chrome's own suggestions; discovery stops at `maxResults` (100 when it is 0 with discovery on).
- Extensions that were removed from the store cannot be read and are reported as failed targets at no charge.

### FAQ

**Does it scrape reviews?**
No. It saves the rating and number of ratings, not the review text.

**Can I get the extension's permissions without installing it?**
Yes. The Actor reads the permission list from the manifest the store publishes for the current version.

**Does it work for Microsoft Edge or Firefox add-ons?**
No, only the Chrome Web Store.

**How do I track only my own list without competitors?**
Leave `discoverSimilar` off (the default) and list the IDs you want. You pay only for those.

**Can I run it on a schedule?**
Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the Chrome Web Store data available at that moment.

**Does it work with Make, Zapier or n8n?**
Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

### Is it legal?

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.

# Actor input Schema

## `extensions` (type: `array`):

Extension IDs or Chrome Web Store URLs, e.g. "ddkjiahejlhfcafbddmgiahcphecmpfh" or "https://chromewebstore.google.com/detail/ublock-origin-lite/ddkjiahejlhfcafbddmgiahcphecmpfh".

## `discoverSimilar` (type: `boolean`):

Follow the store's "similar extensions" list from each page to discover competitors, up to Max results.

## `includeDescription` (type: `boolean`):

Full store description (up to 3,000 characters). The short summary is always included.

## `maxResults` (type: `integer`):

Cap on saved extensions. With 'similar extensions' on, 0 means 100. Your max cost per run is always respected.

## `proxyConfiguration` (type: `object`):

Usually not needed.

## Actor input object example

```json
{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "nngceckbapebfimnlniiiahkandclblb"
  ],
  "discoverSimilar": false,
  "includeDescription": false,
  "maxResults": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All results as a dataset (JSON, CSV, Excel and more via the API or Console).

## `summary` (type: `string`):

Counts of results, targets that succeeded or failed, and the stop reason.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh",
        "nngceckbapebfimnlniiiahkandclblb"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrslm_data/chrome-web-store-extensions").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "extensions": [
        "ddkjiahejlhfcafbddmgiahcphecmpfh",
        "nngceckbapebfimnlniiiahkandclblb",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("mrslm_data/chrome-web-store-extensions").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "extensions": [
    "ddkjiahejlhfcafbddmgiahcphecmpfh",
    "nngceckbapebfimnlniiiahkandclblb"
  ]
}' |
apify call mrslm_data/chrome-web-store-extensions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrslm_data/chrome-web-store-extensions"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/WIFXWz3SFR4JT7RuV/builds/p5CHJ43xoN6vIWDHx/openapi.json
