From b03e5cae6e2b2729fce50a94178fa4acc5c83ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 08:45:06 +0200 Subject: [PATCH 01/39] Update mcp.md --- sources/platform/integrations/ai/mcp.md | 213 ++++++++---------------- 1 file changed, 74 insertions(+), 139 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index a794ef73a3..e72b875735 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -8,178 +8,113 @@ slug: /integrations/mcp -The Apify Model Context Protocol (MCP) server allows AI agents and frameworks compatible with the MCP standard to connect with the extensive library of Actors available on [Apify Store](https://apify.com/store). +The **Apify Model Context Protocol (MCP) Server** allows AI agents and frameworks to tap into Apify’s extensive library of Actors as tools. It acts as a bridge between AI systems (like Anthropic’s Claude or other MCP-compatible clients) and Apify Actors, enabling agents to perform web scraping, data extraction, or other automation tasks using Actors in real time. MCP standardizes how external tools and data sources are presented to the AI, so you can **seamlessly equip your AI agent with thousands of Apify Actors** available on [Apify Store](https://apify.com/store). + ## Why use MCP with Apify? -- _Access a vast tool library_: Provide AI agents access to thousands of pre-built Actors for web scraping, data extraction, and automation. -- _Dynamic tool discovery_: Unlike static OpenAPI definitions, MCP enables agents to dynamically find and add relevant Actors to their context during runtime. Agents can use MCP operations like `discover-actors` and `add-actor-to-tools`. -- _Scalability_: Efficiently manage access to a large and growing number of tools, which is challenging with single, static API definitions. -- _Flexible integration_: Connect to the MCP server using HTTP Server-Sent Events (SSE) or local standard input/output (stdin/stdout). Compatible clients include Claude Desktop, LibreChat, and [Apify’s Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client). +- *Access a vast tool library:* Instantly provide AI agents with access to thousands of pre-built Apify Actors for web scraping, data extraction, and automation. +- *Dynamic tool discovery:* Unlike static OpenAPI definitions or function calling, MCP lets agents dynamically discover and add new Actors as tools during a session. For example, agents can use operations like `discover-actors` or `add-actor` to find and integrate new capabilities on the fly. +- *Scalability:* Efficiently manage a large and growing number of tools. The MCP server can expose the entire Apify Actor Store without requiring individual API integrations for each Actor. +- *Flexible integration:* Connect via HTTP **Server-sent events (SSE)** for real-time streaming or via local **stdio** transport. Compatible clients include Claude Desktop, VS Code (with MCP extensions), LibreChat, or **[Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client)**. This means you can use MCP in cloud, on-premises, or desktop environments with equal ease. ## Common use cases -- Extract data from websites, such as social media posts, search engine results, or specific URLs. +- Extract data from websites (e.g. social media posts, search engine results, specific URLs). - Summarize web content or identify trends. -- Run automated web workflows without direct user interaction. +- Orchestrate multi-step web automation workflows (without user intervention) by chaining Actor tool calls and using the results in conversation. ## Prerequisites Before you start, make sure you have the following: +1. **An Apify account:** Sign up for a free Apify account if you don’t have one. +2. **Apify API Token:** Get your personal API token from the **Integrations** section in [Apify Console](https://console.apify.com/account#/integrations). This token will be used to authorize the MCP server to run Actors on your behalf. +3. **MCP Client:** You will also need an AI agent or client that supports MCP. This could be Anthropic Claude (Desktop edition), a VS Code extension with MCP support, Apify’s web-based Tester MCP Client, or any custom client implementation. See supported MCP clients in [official documentation](https://modelcontextprotocol.io/clients). -1. _Apify account_: You need an active account on the Apify platform. -2. _API Token_: Get your personal API token from the **Integrations** section in [Apify Console](https://console.apify.com/account#/integrations). - -## Connection methods - -Apify provides two main ways to connect your MCP client to Actors: - -1. Main Actors MCP Server: Access _all_ public Actors. Requires dynamic discovery or specifying Actors via URL parameters. -2. Actor-specific MCP Server: A dedicated endpoint for a _single_ Actor, which is pre-registered and ready for immediate use. +## Example Usage (Claude Desktop) -### Option 1: Use the main Actors MCP server +While you can interact with the MCP server using raw API calls or cURL, in practice you’ll often use an AI assistant interface. Let’s walk through an example of using **Claude Desktop** with the Apify MCP Server: -This method offers the most flexibility, allowing access to all of Apify Store dynamically or by specifying Actors at connection time. +1. **Configure Claude Desktop:** Claude Desktop supports MCP servers via the **Developer Mode** configuration. You need to add an entry for the Apify MCP server. For instance, in Claude’s config file, under `mcpServers`, add an entry like: -```text title="Server endpoint" -https://actors-mcp-server.apify.actor/sse?token= +```json + { + "mcpServers": { + "actors-mcp-server": { + "command": "npx", + "args": ["-y", "@apify/actors-mcp-server"], + "env": { + "APIFY_TOKEN": "YOUR_APIFY_TOKEN" + } + } + } + } ``` -Key features: +This tells Claude to spawn the Apify MCP Server (via the NPM package) with your API token. (On first run, it will download the package automatically.) -- Dynamic discovery: Agents can use MCP operations like `discover-actors` to search Apify Store for tools. -- Dynamic registration: Agents can use the `add-actor-to-tools` operation to add discovered Actors to their available toolset for the current session. -- Pre-registration via URL: You can make specific Actors available immediately by adding the `&actors=` query parameter to the connection URL (for example, `&actors=apify/rag-web-browser`). +2. **Launch Claude and connect:** After updating the config, restart Claude Desktop. If successful, Claude will show a “plugin” (often indicated by a plug icon 🔌) signifying it connected to the Apify Actors MCP server. + +3. **Use the Actors in conversation:** Now you can chat with Claude and ask it to use Apify Actors. For example, you might ask: _“What Apify Actors can I use?”_ Claude (through the MCP server) will list tools (Actors) available. If none are pre-loaded beyond the defaults, it might show a few default ones or instruct how to discover more. You can then ask something like: _“Use the Instagram Scraper to get the latest posts from NASA’s profile.”_ Claude will internally call the `apify/instagram-scraper` Actor via the MCP server and stream the results back to you, perhaps summarizing the output. + + Behind the scenes, Claude didn’t need to know the details of Apify’s API or Actors — it relied on the MCP server to handle tool execution. You, as the user, just see the answer or result in the chat. + +4. **Dynamic tool loading:** If you ask for something that requires a tool not initially present, Claude can invoke the discovery mechanism. For instance, _“Find an Actor that scrapes Google Search and use it to search for ‘climate change news’.”_ Claude can call `search-actors` (to find a Google Search scraper), then `add-actor` (to add it), and then call it — all within one conversation. The result will then be presented. -The following example demonstrates connecting to the main server while pre-registering the `apify/rag-web-browser` Actor. +This example shows how an AI assistant can leverage Apify Actors through MCP in a conversational way. The key is that once the client (Claude) is configured, you can use natural language to trigger complex workflows on Apify. -#### Step 1: Start the SSE connection +_(If you prefer not to set up Claude Desktop, you can achieve a similar result using [Apify’s Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client), which provides a web UI to test the MCP server.)_ -Use `curl` or another SSE client to establish the connection. Append `&actors=apify/rag-web-browser` to pre-register the tool. Replace `` with your actual Apify API token. +## Adding Multiple Actors -```bash -# Start the Server-Sent Events (SSE) session and keep it active -curl "https://actors-mcp-server.apify.actor/sse?token=&actors=apify/rag-web-browser" +By default, the main Actors MCP Server starts with a **default set of Actors** (currently a few popular ones like Instagram Scraper, RAG Web Browser, etc.). However, you can customize which Actors are available: -# The server responds with the session endpoint. Note the sessionId. -# event: endpoint -# data: /message?sessionId=9d820491-38d4-4c7d-bb6a-3b7dc542f1fa -``` - -#### Step 2: Send a tool call request - -Use the `sessionId` obtained in Step 1 to send a POST request to the `/message` endpoint. This request invokes the pre-registered `apify/rag-web-browser` tool. Replace `` and `` with your actual values. - -```bash -curl -X POST "https://actors-mcp-server.apify.actor/message?token=&session_id=" \ --H "Content-Type: application/json" \ --d '{ - "jsonrpc": "2.0", - "id": 1, - "method": "tools/call", - "params": { - "arguments": { - "query": "web browser for RAG pipelines -site:reddit.com", - "proxyConfiguration": { - "useApifyProxy": true - }, - "removeElementsCssSelector": "nav, footer, script, style, noscript, svg, img[src^='\''data:'\''],\\n[role=\\"alert\\"],\\n[role=\\"banner\\"],\\n[role=\\"dialog\\"],\\n[role=\\"alertdialog\\"],\\n[role=\\"region\\"][aria-label*=\\"skip\\" i],\\n[aria-modal=\\"true\\"]", - "htmlTransformer": "none" - }, - "name": "apify/rag-web-browser" - } -}' - -# The server immediately confirms receipt of the request: -# Accepted -``` - -#### Step 3: Receive the result via SSE - -The Actor's result is sent back asynchronously over the SSE connection established in Step 1. +- **Via Actor Task (on Apify platform):** If you are running the MCP server as an Apify Actor (instead of via NPM), you can create a Task for the `apify/actors-mcp-server` Actor with a custom input specifying the Actors you want. This input would include an array of actor IDs or names. Running that Task (in Standby mode) will launch the MCP server with your chosen Actors instead of the defaults. This is useful if you always want a certain subset of tools and don’t need full dynamic discovery. +- **Dynamic adding during a session:** If your client supports it, the agent itself can add Actors dynamically by name (using the `add-actor` operation) at runtime. For example, after using `search-actors` to find an Actor’s name, calling `add-actor` with that name will load it. Note that not all MCP client frameworks allow dynamic tool addition at runtime, but Apify’s own tester client does (when `enableActorAutoLoading` in Actors MCP Server is true). +- **Via config file (for Claude Desktop):** When using Claude Desktop, you can specify which Actors should be immediately available by configuring your `mcpServers` settings. Add the Actors as a comma-separated list in the `--actors` parameter, as shown in the example below. This pre-loads your selected tools without requiring discovery during conversations, ideal for workflows with predictable tool needs. ```json -event: message -data: { - "result": { - "content": [ - { - "type": "text", - "text": "[{\"searchResult\":{\"title\":\"... RAG Web Browser Result ...\",\"description\":\"... Content extracted by the Actor ...\"}}]" // Example structure + { + "mcpServers": { + "actors-mcp-server": { + "command": "npx", + "args": [ + "-y", "@apify/actors-mcp-server", + "--actors", "lukaskrivka/google-maps-with-contact-details,apify/instagram-scraper" + ], + "env": { + "APIFY_TOKEN": "YOUR_APIFY_TOKEN" + } } - ] - } -} + } + } ``` -### Option 2: Use an Actor-specific MCP server - -Certain Actors, such as `apify/rag-web-browser`, offer their own dedicated MCP server endpoint. This simplifies integration when you only need to interact with that specific Actor. - -```text title="Endpoint example for `apify/rag-web-browser`" -https://rag-web-browser.apify.actor/sse?token= -``` +In summary, you can start with a broad set (everything open and discoverable) or a narrow set (just what you need) and even expand tools on the fly, giving your agent a lot of flexibility without overwhelming it initially. -:::note +## Dynamic Actor Tooling -The hostname typically matches the Actor's name. +One of the powerful features of MCP with Apify is **dynamic actor tooling** – the ability for an AI agent to find new tools (Actors) as needed and incorporate them. Here are some special MCP operations and how Apify MCP Server supports them: -::: +- **`search-actors`:** Discover available Actors or MCP-Servers in Apify Store using full text search using keywords.Users try to discover Actors using free form query in this case search query must be converted to full text search. Returns a list of Actors with name, description, run statistics, pricing, starts, and URL. You perhaps need to use this tool several times to find the right Actor. You should prefer simple keywords over complex queries. Limit number of results returned but ensure that relevant results are returned. This is not a general search tool, it is designed to search for Actors in Apify Store. +- **`get-actor-details`:** Get documentation, readme, input schema and other details about an Actor. For example, when user says, I need to know more about web crawler Actor.Get details for an Actor with with Actor ID or Actor full name, i.e. username/name.Limit the length of the README if needed. +- **`help-tool`:** Helper tool to get information on how to use and troubleshoot the Apify MCP server. This tool always returns the same help message with information about the server and how to use it. Call this tool in case of any problems or uncertainties with the server. +- **`add-actor`:** Add a tool, Actor or MCP-Server to available tools by Actor ID or Actor name. A tool is an Actor or MCP-Server that can be called by the userDo not execute the tool, only add it and list it in available tools. For example, add a tool with username/name when user wants to scrape data from a website. +- **`remove-actor`:** Remove a tool, an Actor or MCP-Server by name from available tools. For example, when user says, I do not need a tool username/name anymore -This method is ideal for integrating a specific tool directly into an application (like Claude Desktop) or a custom client without needing the dynamic discovery capabilities of the main server. +**Important:** Not all AI agent frameworks fully support these dynamic operations. Some require that the tool list is fixed at the start of the session. The Apify MCP Server will send notifications (via the MCP protocol) when the tool list changes, but it’s up to the client to handle that. Apify’s Tester MCP Client can handle this (allowing truly dynamic tool loading in a conversation), whereas something like Claude might not dynamically update its UI to show new tools (Claude’s design expects a fixed set of tools per session). In practice, with Claude you can still use `search-actors` to decide on a tool and then directly call it by name (even if it wasn’t in the initial list) if you use the `enableAddingActors=true` mode (which the Apify client uses by default). This essentially lets the server accept tool calls to Actors not originally in the list, simplifying dynamic usage. -The following example demonstrates use of `rag-web-browser` server. - -#### Step 1: Start the SSE connection - -Connect directly to the Actor's specific MCP endpoint. Replace `` with your actual Apify API token. - -```bash -# Start the Server-Sent Events (SSE) session and keep it active -curl "https://rag-web-browser.apify.actor/sse?token=" - -# The server responds with the session endpoint. Note the sessionId. -# event: endpoint -# data: /message?sessionId=5b2a... -``` - -#### Step 2: Send a tool call request - -Use the `sessionId` from Step 1 to send a POST request to the Actor's `/message` endpoint. Replace `` and `` with your actual values. The tool `name` in the parameters typically matches the Actor name. - -```bash -curl -X POST "https://rag-web-browser.apify.actor/message?session_id=&token=" \ --H "Content-Type: application/json" \ --d '{ - "jsonrpc": "2.0", - "id": 1, - "method": "tools/call", - "params": { - "arguments": { "query": "recent news about LLMs", "maxResults": 1 }, - "name": "rag-web-browser" - } -}' - -# The server immediately confirms receipt of the request: -# Accepted -``` - -#### Step 3: Receive the result via SSE - -The result is sent back over the SSE connection established in Step 1. - -```json -event: message -data: {"result":{"content":[{"type":"text","text":"[{\"searchResult\":{\"title\":\"Language models recent news\",\"description\":\"Amazon Launches New Generation of LLM Foundation Model...\"}}]"}]}} -``` +## Troubleshooting -## Testing and resources +- **Authorization (API Token):** If the MCP server isn’t executing Actors, ensure you provided a correct Apify API token. Without a valid `APIFY_TOKEN`, the server cannot start Actor runs. Always set the `APIFY_TOKEN` environment variable when running locally. +- **Connection issues (Claude Desktop SSE):** Claude Desktop (free version) may occasionally drop SSE connections. If you see it disconnect frequently, it’s likely not an issue with Apify but with Claude’s SSE handling. In such cases, using the Stdio integration (as configured in Developer Mode) is recommended (Claude will handle restarts of the process if needed). +- **Ensure latest version:** If running via NPM, always use the latest version of `@apify/actors-mcp-server` for the newest features and fixes. You can append `@latest` when installing or in your config args to ensure this. +- **Node.js environment:** If running the server locally, make sure Node.js is installed and up to date (`node -v`). The MCP server requires Node.js v18+. +- **No response or long delay:** Keep in mind that when an Actor tool is called, it may take some time to complete (depending on the task). The MCP client should stream intermediate results if possible. If nothing is coming back, check the Actor’s logs on Apify — the Actor might be waiting on a long operation or input. Using smaller input (e.g., limiting results with parameters like `maxResults=1`) is a good practice for quick responses, as noted in our guidelines. -- Testing: - - Tester MCP Client: Use the [Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client) on Apify to interact with either MCP server type. Enter the appropriate server URL (for example, `https://actors-mcp-server.apify.actor/sse` or `https://rag-web-browser.apify.actor/sse`) in the Actor input field, configure your API token, run the client Actor, and interact through its user interface. -- Protocol information: - - MCP documentation: For details on the protocol, see the [MCP Introduction](https://modelcontextprotocol.io/introduction). - - MCP client examples: Find example client implementations at [MCP Clients](https://modelcontextprotocol.io/clients). -- Further reading: - - Apify Blog: Read more about Apify's implementation in the post: [What is Anthropic's Model Context Protocol?](https://blog.apify.com/what-is-model-context-protocol/) +## Learn more +- **[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction):** Learn about the open standard on the official MCP website – understanding the protocol can help you build custom agents. +- **[Apify Actors MCP Server](https://apify.com/apify/actors-mcp-server):** The README for the Apify MCP Server actor (available on Apify Store as `apify/actors-mcp-server`) provides technical details on implementation and advanced usage. +- **[Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client):** A specialized client actor (`jiri.spilka/tester-mcp-client`) that you can run to simulate an AI agent in your browser. Useful for testing your setup with a chat UI. +- **[How to use MCP with Apify Actors](https://blog.apify.com/how-to-use-mcp/):** Learn how to expose over 5,000 Apify Actors to AI agents with Claude and LangGraph, and configure MCP clients and servers. From be76c13a25f76f4000705e5b4a0a3377ef96502e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:01:54 +0200 Subject: [PATCH 02/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index e72b875735..dd197238ce 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -13,10 +13,10 @@ The **Apify Model Context Protocol (MCP) Server** allows AI agents and framework ## Why use MCP with Apify? -- *Access a vast tool library:* Instantly provide AI agents with access to thousands of pre-built Apify Actors for web scraping, data extraction, and automation. -- *Dynamic tool discovery:* Unlike static OpenAPI definitions or function calling, MCP lets agents dynamically discover and add new Actors as tools during a session. For example, agents can use operations like `discover-actors` or `add-actor` to find and integrate new capabilities on the fly. -- *Scalability:* Efficiently manage a large and growing number of tools. The MCP server can expose the entire Apify Actor Store without requiring individual API integrations for each Actor. -- *Flexible integration:* Connect via HTTP **Server-sent events (SSE)** for real-time streaming or via local **stdio** transport. Compatible clients include Claude Desktop, VS Code (with MCP extensions), LibreChat, or **[Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client)**. This means you can use MCP in cloud, on-premises, or desktop environments with equal ease. +- _Access a vast tool library:_ Instantly provide AI agents with access to thousands of pre-built Apify Actors for web scraping, data extraction, and automation. +- _Dynamic tool discovery:_ Unlike static OpenAPI definitions or function calling, MCP lets agents dynamically discover and add new Actors as tools during a session. For example, agents can use operations like `discover-actors` or `add-actor` to find and integrate new capabilities on the fly. +- _Scalability:_ Efficiently manage a large and growing number of tools. The MCP server can expose the entire Apify Actor Store without requiring individual API integrations for each Actor. +- _Flexible integration:_ Connect via HTTP Server-sent events (SSE) for real-time streaming or via local stdio transport. Compatible clients include Claude Desktop, VS Code (with MCP extensions), LibreChat, or [Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client) This means you can use MCP in cloud, on-premises, or desktop environments with equal ease. ## Common use cases From 92217c7a024baede6aeb79d3b84883fd71c4542f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:02:09 +0200 Subject: [PATCH 03/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index dd197238ce..baafa30e6b 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -33,7 +33,7 @@ Before you start, make sure you have the following: ## Example Usage (Claude Desktop) -While you can interact with the MCP server using raw API calls or cURL, in practice you’ll often use an AI assistant interface. Let’s walk through an example of using **Claude Desktop** with the Apify MCP Server: +While you can interact with the MCP server using raw API calls or cURL, in practice you’ll often use an AI assistant interface. Let’s walk through an example of using Claude Desktop with the Apify MCP Server: 1. **Configure Claude Desktop:** Claude Desktop supports MCP servers via the **Developer Mode** configuration. You need to add an entry for the Apify MCP server. For instance, in Claude’s config file, under `mcpServers`, add an entry like: From be821afd653a5682b249c692e13059b19e744250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:02:34 +0200 Subject: [PATCH 04/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index baafa30e6b..a18b1a6686 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -35,7 +35,7 @@ Before you start, make sure you have the following: While you can interact with the MCP server using raw API calls or cURL, in practice you’ll often use an AI assistant interface. Let’s walk through an example of using Claude Desktop with the Apify MCP Server: -1. **Configure Claude Desktop:** Claude Desktop supports MCP servers via the **Developer Mode** configuration. You need to add an entry for the Apify MCP server. For instance, in Claude’s config file, under `mcpServers`, add an entry like: +1. _Configure Claude Desktop:_ Claude Desktop supports MCP servers via the **Developer Mode** configuration. You need to add an entry for the Apify MCP server. For instance, in Claude’s config file, under `mcpServers`, add an entry like: ```json { From a99eb476e21496bf96a6346384bb60f81bb11074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:02:41 +0200 Subject: [PATCH 05/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index a18b1a6686..2570f4ecb7 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -53,7 +53,7 @@ While you can interact with the MCP server using raw API calls or cURL, in pract This tells Claude to spawn the Apify MCP Server (via the NPM package) with your API token. (On first run, it will download the package automatically.) -2. **Launch Claude and connect:** After updating the config, restart Claude Desktop. If successful, Claude will show a “plugin” (often indicated by a plug icon 🔌) signifying it connected to the Apify Actors MCP server. +2. _Launch Claude and connect:_ After updating the config, restart Claude Desktop. If successful, Claude will show a “plugin” (often indicated by a plug icon 🔌) signifying it connected to the Apify Actors MCP server. 3. **Use the Actors in conversation:** Now you can chat with Claude and ask it to use Apify Actors. For example, you might ask: _“What Apify Actors can I use?”_ Claude (through the MCP server) will list tools (Actors) available. If none are pre-loaded beyond the defaults, it might show a few default ones or instruct how to discover more. You can then ask something like: _“Use the Instagram Scraper to get the latest posts from NASA’s profile.”_ Claude will internally call the `apify/instagram-scraper` Actor via the MCP server and stream the results back to you, perhaps summarizing the output. From 1207230222369045720bdc7ea6668949abed4879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:02:47 +0200 Subject: [PATCH 06/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index 2570f4ecb7..8edbabbab7 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -55,7 +55,7 @@ This tells Claude to spawn the Apify MCP Server (via the NPM package) with your 2. _Launch Claude and connect:_ After updating the config, restart Claude Desktop. If successful, Claude will show a “plugin” (often indicated by a plug icon 🔌) signifying it connected to the Apify Actors MCP server. -3. **Use the Actors in conversation:** Now you can chat with Claude and ask it to use Apify Actors. For example, you might ask: _“What Apify Actors can I use?”_ Claude (through the MCP server) will list tools (Actors) available. If none are pre-loaded beyond the defaults, it might show a few default ones or instruct how to discover more. You can then ask something like: _“Use the Instagram Scraper to get the latest posts from NASA’s profile.”_ Claude will internally call the `apify/instagram-scraper` Actor via the MCP server and stream the results back to you, perhaps summarizing the output. +3. _Use the Actors in conversation:_ Now you can chat with Claude and ask it to use Apify Actors. For example, you might ask: _“What Apify Actors can I use?”_ Claude (through the MCP server) will list tools (Actors) available. If none are pre-loaded beyond the defaults, it might show a few default ones or instruct how to discover more. You can then ask something like: _“Use the Instagram Scraper to get the latest posts from NASA’s profile.”_ Claude will internally call the `apify/instagram-scraper` Actor via the MCP server and stream the results back to you, perhaps summarizing the output. Behind the scenes, Claude didn’t need to know the details of Apify’s API or Actors — it relied on the MCP server to handle tool execution. You, as the user, just see the answer or result in the chat. From 672d70325403b6163003b2de41d4e14f0a54907a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:03:06 +0200 Subject: [PATCH 07/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index 8edbabbab7..c4a6359362 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -106,11 +106,11 @@ One of the powerful features of MCP with Apify is **dynamic actor tooling** – ## Troubleshooting -- **Authorization (API Token):** If the MCP server isn’t executing Actors, ensure you provided a correct Apify API token. Without a valid `APIFY_TOKEN`, the server cannot start Actor runs. Always set the `APIFY_TOKEN` environment variable when running locally. -- **Connection issues (Claude Desktop SSE):** Claude Desktop (free version) may occasionally drop SSE connections. If you see it disconnect frequently, it’s likely not an issue with Apify but with Claude’s SSE handling. In such cases, using the Stdio integration (as configured in Developer Mode) is recommended (Claude will handle restarts of the process if needed). -- **Ensure latest version:** If running via NPM, always use the latest version of `@apify/actors-mcp-server` for the newest features and fixes. You can append `@latest` when installing or in your config args to ensure this. -- **Node.js environment:** If running the server locally, make sure Node.js is installed and up to date (`node -v`). The MCP server requires Node.js v18+. -- **No response or long delay:** Keep in mind that when an Actor tool is called, it may take some time to complete (depending on the task). The MCP client should stream intermediate results if possible. If nothing is coming back, check the Actor’s logs on Apify — the Actor might be waiting on a long operation or input. Using smaller input (e.g., limiting results with parameters like `maxResults=1`) is a good practice for quick responses, as noted in our guidelines. +- _Authorization (API Token):_ If the MCP server isn’t executing Actors, ensure you provided a correct Apify API token. Without a valid `APIFY_TOKEN`, the server cannot start Actor runs. Always set the `APIFY_TOKEN` environment variable when running locally. +- _Connection issues (Claude Desktop SSE):_ Claude Desktop (free version) may occasionally drop SSE connections. If you see it disconnect frequently, it’s likely not an issue with Apify but with Claude’s SSE handling. In such cases, using the Stdio integration (as configured in Developer Mode) is recommended (Claude will handle restarts of the process if needed). +- _Ensure latest version:_ If running via NPM, always use the latest version of `@apify/actors-mcp-server` for the newest features and fixes. You can append `@latest` when installing or in your config args to ensure this. +- _Node.js environment:_ If running the server locally, make sure Node.js is installed and up to date (`node -v`). The MCP server requires Node.js v18+. +- _No response or long delay:_ Keep in mind that when an Actor tool is called, it may take some time to complete (depending on the task). The MCP client should stream intermediate results if possible. If nothing is coming back, check the Actor’s logs on Apify — the Actor might be waiting on a long operation or input. Using smaller input (e.g., limiting results with parameters like `maxResults=1`) is a good practice for quick responses, as noted in our guidelines. ## Learn more From 4d3d30458d6b5a6ccfdf8fdab8027f0e4636abe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:03:13 +0200 Subject: [PATCH 08/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index c4a6359362..cbeb4a8ce6 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -114,7 +114,7 @@ One of the powerful features of MCP with Apify is **dynamic actor tooling** – ## Learn more -- **[Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction):** Learn about the open standard on the official MCP website – understanding the protocol can help you build custom agents. -- **[Apify Actors MCP Server](https://apify.com/apify/actors-mcp-server):** The README for the Apify MCP Server actor (available on Apify Store as `apify/actors-mcp-server`) provides technical details on implementation and advanced usage. -- **[Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client):** A specialized client actor (`jiri.spilka/tester-mcp-client`) that you can run to simulate an AI agent in your browser. Useful for testing your setup with a chat UI. -- **[How to use MCP with Apify Actors](https://blog.apify.com/how-to-use-mcp/):** Learn how to expose over 5,000 Apify Actors to AI agents with Claude and LangGraph, and configure MCP clients and servers. +- [Model Context Protocol (MCP)](https://modelcontextprotocol.io/introduction): Learn about the open standard on the official MCP website – understanding the protocol can help you build custom agents. +- [Apify Actors MCP Server](https://apify.com/apify/actors-mcp-server): The README for the Apify MCP Server actor (available on Apify Store as `apify/actors-mcp-server`) provides technical details on implementation and advanced usage. +- [Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client): A specialized client actor (`jiri.spilka/tester-mcp-client`) that you can run to simulate an AI agent in your browser. Useful for testing your setup with a chat UI. +- [How to use MCP with Apify Actors](https://blog.apify.com/how-to-use-mcp/): Learn how to expose over 5,000 Apify Actors to AI agents with Claude and LangGraph, and configure MCP clients and servers. From 36d3624caf05634676a73ba9fc1633d98ee1ab60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:03:20 +0200 Subject: [PATCH 09/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index cbeb4a8ce6..0d090e0194 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -8,7 +8,7 @@ slug: /integrations/mcp -The **Apify Model Context Protocol (MCP) Server** allows AI agents and frameworks to tap into Apify’s extensive library of Actors as tools. It acts as a bridge between AI systems (like Anthropic’s Claude or other MCP-compatible clients) and Apify Actors, enabling agents to perform web scraping, data extraction, or other automation tasks using Actors in real time. MCP standardizes how external tools and data sources are presented to the AI, so you can **seamlessly equip your AI agent with thousands of Apify Actors** available on [Apify Store](https://apify.com/store). +The _Apify Model Context Protocol (MCP) Server_ allows AI agents and frameworks to tap into Apify’s extensive library of Actors as tools. It acts as a bridge between AI systems (like Anthropic’s Claude or other MCP-compatible clients) and Apify Actors, enabling agents to perform web scraping, data extraction, or other automation tasks using Actors in real time. MCP standardizes how external tools and data sources are presented to the AI, so you can equip your AI agent with thousands of Apify Actors available on [Apify Store](https://apify.com/store). ## Why use MCP with Apify? From 8a834b0ce84c3f6e4eedb5b588a5f9d90aa87335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Thu, 15 May 2025 11:03:25 +0200 Subject: [PATCH 10/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index 0d090e0194..c0f616beeb 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -27,9 +27,10 @@ The _Apify Model Context Protocol (MCP) Server_ allows AI agents and frameworks ## Prerequisites Before you start, make sure you have the following: -1. **An Apify account:** Sign up for a free Apify account if you don’t have one. -2. **Apify API Token:** Get your personal API token from the **Integrations** section in [Apify Console](https://console.apify.com/account#/integrations). This token will be used to authorize the MCP server to run Actors on your behalf. -3. **MCP Client:** You will also need an AI agent or client that supports MCP. This could be Anthropic Claude (Desktop edition), a VS Code extension with MCP support, Apify’s web-based Tester MCP Client, or any custom client implementation. See supported MCP clients in [official documentation](https://modelcontextprotocol.io/clients). + +1. _An Apify account:_ Sign up for a free Apify account if you don’t have one. +1. _Apify API Token:_ Get your personal API token from the **Integrations** section in [Apify Console](https://console.apify.com/account#/integrations). This token will be used to authorize the MCP server to run Actors on your behalf. +1. _MCP Client:_ You will also need an AI agent or client that supports MCP. This could be Anthropic Claude (Desktop edition), a VS Code extension with MCP support, Apify’s web-based Tester MCP Client, or any custom client implementation. See supported MCP clients in [official documentation](https://modelcontextprotocol.io/clients). ## Example Usage (Claude Desktop) From 034066953954e46a0580b31dffd41250b8f9aed3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Mon, 19 May 2025 08:47:41 +0200 Subject: [PATCH 11/39] Update sources/platform/integrations/ai/mcp.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Olender <92638966+TC-MO@users.noreply.github.com> --- sources/platform/integrations/ai/mcp.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index c0f616beeb..70ea1d4520 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -103,7 +103,11 @@ One of the powerful features of MCP with Apify is **dynamic actor tooling** – - **`add-actor`:** Add a tool, Actor or MCP-Server to available tools by Actor ID or Actor name. A tool is an Actor or MCP-Server that can be called by the userDo not execute the tool, only add it and list it in available tools. For example, add a tool with username/name when user wants to scrape data from a website. - **`remove-actor`:** Remove a tool, an Actor or MCP-Server by name from available tools. For example, when user says, I do not need a tool username/name anymore -**Important:** Not all AI agent frameworks fully support these dynamic operations. Some require that the tool list is fixed at the start of the session. The Apify MCP Server will send notifications (via the MCP protocol) when the tool list changes, but it’s up to the client to handle that. Apify’s Tester MCP Client can handle this (allowing truly dynamic tool loading in a conversation), whereas something like Claude might not dynamically update its UI to show new tools (Claude’s design expects a fixed set of tools per session). In practice, with Claude you can still use `search-actors` to decide on a tool and then directly call it by name (even if it wasn’t in the initial list) if you use the `enableAddingActors=true` mode (which the Apify client uses by default). This essentially lets the server accept tool calls to Actors not originally in the list, simplifying dynamic usage. +:::tip Dynamic tool loading + +Not all AI agent frameworks fully support these dynamic operations. Some require that the tool list is fixed at the start of the session. The Apify MCP Server will send notifications (via the MCP protocol) when the tool list changes, but it’s up to the client to handle that. Apify’s Tester MCP Client can handle this (allowing truly dynamic tool loading in a conversation), whereas something like Claude might not dynamically update its UI to show new tools (Claude’s design expects a fixed set of tools per session). In practice, with Claude you can still use `search-actors` to decide on a tool and then directly call it by name (even if it wasn’t in the initial list) if you use the `enableAddingActors=true` mode (which the Apify client uses by default). This essentially lets the server accept tool calls to Actors not originally in the list, simplifying dynamic usage. + +::: ## Troubleshooting From 0ce013ffc607d9ded345ef401c11e5b87a153bd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Vystr=C4=8Dil?= Date: Mon, 19 May 2025 09:28:24 +0200 Subject: [PATCH 12/39] Update mcp.md - Deleted use cases - not relevant for docs - Simplified introduction - Deleted "Why use MCP with Apify" paragraph (not relevant) - Added section "How to use" --- sources/platform/integrations/ai/mcp.md | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/sources/platform/integrations/ai/mcp.md b/sources/platform/integrations/ai/mcp.md index 70ea1d4520..d3ddb50c90 100644 --- a/sources/platform/integrations/ai/mcp.md +++ b/sources/platform/integrations/ai/mcp.md @@ -8,21 +8,14 @@ slug: /integrations/mcp -The _Apify Model Context Protocol (MCP) Server_ allows AI agents and frameworks to tap into Apify’s extensive library of Actors as tools. It acts as a bridge between AI systems (like Anthropic’s Claude or other MCP-compatible clients) and Apify Actors, enabling agents to perform web scraping, data extraction, or other automation tasks using Actors in real time. MCP standardizes how external tools and data sources are presented to the AI, so you can equip your AI agent with thousands of Apify Actors available on [Apify Store](https://apify.com/store). +The _Apify Model Context Protocol (MCP) Server_ allows AI agents and frameworks to tap into Apify’s extensive library of Actors as tools. It acts as a bridge between AI systems (like Anthropic’s Claude or other MCP-compatible clients) and Apify Actors, enabling agents to perform web scraping, data extraction, or other automation tasks using Actors in real time. +## How to use -## Why use MCP with Apify? - -- _Access a vast tool library:_ Instantly provide AI agents with access to thousands of pre-built Apify Actors for web scraping, data extraction, and automation. -- _Dynamic tool discovery:_ Unlike static OpenAPI definitions or function calling, MCP lets agents dynamically discover and add new Actors as tools during a session. For example, agents can use operations like `discover-actors` or `add-actor` to find and integrate new capabilities on the fly. -- _Scalability:_ Efficiently manage a large and growing number of tools. The MCP server can expose the entire Apify Actor Store without requiring individual API integrations for each Actor. -- _Flexible integration:_ Connect via HTTP Server-sent events (SSE) for real-time streaming or via local stdio transport. Compatible clients include Claude Desktop, VS Code (with MCP extensions), LibreChat, or [Apify Tester MCP Client](https://apify.com/jiri.spilka/tester-mcp-client) This means you can use MCP in cloud, on-premises, or desktop environments with equal ease. - -## Common use cases - -- Extract data from websites (e.g. social media posts, search engine results, specific URLs). -- Summarize web content or identify trends. -- Orchestrate multi-step web automation workflows (without user intervention) by chaining Actor tool calls and using the results in conversation. +You can use the Apify MCP Server in three ways: +- Local STDIO transport with desktop client (e.g. Claude Desktop) +- Run [Apify Actors MCP Server](https://apify.com/apify/actors-mcp-server) as Actor +- Use [mcp.apify.com](https://mcp.apify.com) with both legacy SSE on `/sse` and streamable transport in `/` ## Prerequisites @@ -32,7 +25,7 @@ Before you start, make sure you have the following: 1. _Apify API Token:_ Get your personal API token from the **Integrations** section in [Apify Console](https://console.apify.com/account#/integrations). This token will be used to authorize the MCP server to run Actors on your behalf. 1. _MCP Client:_ You will also need an AI agent or client that supports MCP. This could be Anthropic Claude (Desktop edition), a VS Code extension with MCP support, Apify’s web-based Tester MCP Client, or any custom client implementation. See supported MCP clients in [official documentation](https://modelcontextprotocol.io/clients). -## Example Usage (Claude Desktop) +## Example Usage (Local STDIO with Claude Desktop) While you can interact with the MCP server using raw API calls or cURL, in practice you’ll often use an AI assistant interface. Let’s walk through an example of using Claude Desktop with the Apify MCP Server: From 9540863c1dd3cb897b4d90286e00b65a3d40b383 Mon Sep 17 00:00:00 2001 From: Dusan Vystrcil Date: Mon, 19 May 2025 10:13:35 +0200 Subject: [PATCH 13/39] Added images to MCP docs --- .../ai/images/actors-mcp-server.webp | Bin 0 -> 25076 bytes .../integrations/ai/images/chat-ui.webp | Bin 0 -> 53082 bytes sources/platform/integrations/ai/mcp.md | 4 ++++ 3 files changed, 4 insertions(+) create mode 100644 sources/platform/integrations/ai/images/actors-mcp-server.webp create mode 100644 sources/platform/integrations/ai/images/chat-ui.webp diff --git a/sources/platform/integrations/ai/images/actors-mcp-server.webp b/sources/platform/integrations/ai/images/actors-mcp-server.webp new file mode 100644 index 0000000000000000000000000000000000000000..df7c1db2d04b09b116499db4e6f2a47545569843 GIT binary patch literal 25076 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 b0hWIi-qHUh@}AWHJ%@$kd;Xs9i30uydLQzr literal 0 HcmV?d00001 diff --git a/sources/platform/integrations/ai/images/chat-ui.webp b/sources/platform/integrations/ai/images/chat-ui.webp new file mode 100644 index 0000000000000000000000000000000000000000..16f848cef9a6924ec3e3e6c1a77bf57094465423 GIT binary patch literal 53082 zcmd43W0+-G)-4>iZQHhu4BNJCJHyJb%?#VNG9xl<+s4hR?zj8x>Z-2l`~A3IJkQ+c z+4JmJJJvpPjXCC+D~_V1n3&=;0DzjPki4oqhdLAh006{K0|y6)1q1l$A*h}L0Fb8# z%>tx?0FMLXvtdh>EF{V&BA9P+_lJ$JuzgkY*e=BDxY^+IE5F&udP;tcdk?!|9Dk+e z!Muvi{m?conK?M?+UiPqN_&fW0C^+&a9e1f06#4`18*bWQ|r1|)YFIm!T<3-jn|s( zkKc&b$ba`?`;P5r^