# Let Claude Desktop or Cursor run Apify actors: MCP setup with two real examples

> Source: <https://dev.to/jeezleweez_71e2a581f71298/let-claude-desktop-or-cursor-run-apify-actors-mcp-setup-with-two-real-examples-3lpg>
> Published: 2026-10-21 18:02:00+00:00

SUPERSEDES effect 840.

Disclosure: I publish the two Apify actors used below (pennydata/website-contact-extractor and pennydata/sitemap-extractor-plus) and earn a fee when they run. This post was written with AI assistance (Claude). It is a how-to for the MCP setup; the actors are just worked examples.

Short answer: Apify hosts an MCP server at `https://mcp.apify.com`. Point your client at it, restrict it to the actors you want with `?tools=`, and the agent can run them from a plain-English prompt.

Add the server to your MCP client. OAuth is the recommended route, so no token sits in the file:

```
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=pennydata/website-contact-extractor,pennydata/sitemap-extractor-plus"
    }
  }
}
```

`apify mcp install cursor`.` https://mcp.apify.com?tools=...` as a remote MCP server/connector. If your build only supports local servers, the docs give an `npx` fallback:

```
{
  "mcpServers": {
    "actors-mcp-server": {
      "command": "npx",
      "args": ["-y", "@apify/actors-mcp-server"],
      "env": { "APIFY_TOKEN": "YOUR_APIFY_TOKEN" }
    }
  }
}
```

`"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }` next to `url`.
Without `?tools=` you get Apify's default tool set (search the Store, run any actor). Listing actors explicitly keeps the agent focused and makes runs predictable.

Prompt:

Use website-contact-extractor on apify.com, [www.mozilla.org](http://www.mozilla.org) and [www.python.org](http://www.python.org). Give me a table of contact page, contact form and public emails. Don't guess addresses that aren't in the output.

The actor takes `urls` (bare domains work) and returns one row per site. Fields: `input`, `finalUrl`, `contactPageUrl`, `contactFormUrl`, `emails`, `phones`, `socials` (keyed by network, values are lists), or `error` for a failed site. What the actor's code produced for these three sites in a local run on 2026-10-21 (not an MCP transcript):

| input | contact page | contact form | emails | 
|---|---|---|---|
| [www.python.org](http://www.python.org) | /about/ | none | none | 
| [www.mozilla.org](http://www.mozilla.org) | /en-US/contact/ | none | [trademark-permissions@mozilla.com](mailto:trademark-permissions@mozilla.com) | 
| apify.com | /contact | /contact-sales | [support@apify.com](mailto:support@apify.com) ,[hello@apify.com](mailto:hello@apify.com) ,[john.wick@thecontinental.com](mailto:john.wick@thecontinental.com) | 

The last address is a joke printed on apify.com's own page. The actor returns what is on the page and does not check mailboxes, so tell the agent to flag oddities. Price on the actor page at time of writing: $0.002 per site where something was found; empty, failed and robots-skipped sites are not charged.

Use sitemap-extractor-plus on [https://docs.apify.com](https://docs.apify.com) with maxUrls 20, then group the URLs by first path segment and tell me which sections have lastmod dates.

Input is `{ "startUrls": ["https://docs.apify.com"], "maxUrls": 20 }`. Each output row:

```
{
  "url": "https://docs.apify.com/api",
  "lastmod": null,
  "priority": 0.5,
  "changefreq": "weekly",
  "sitemapUrl": "https://docs.apify.com/sitemap_base.xml",
  "source": "https://docs.apify.com/"
}
```

`lastmod` is `null` here because that sitemap does not publish it, which is a good test of whether your agent reports missing data honestly. Price at time of writing: $0.0004 per unique URL; sitemap files, errors, duplicates and filtered-out URLs are free. `maxUrls` doubles as a spend cap.

`maxUrls` / `maxCostUsd` in the prompt, and watch usage in the Apify Console.
Actor pages:

Written with AI (Claude).
