From 20b455df55028c900176de91239937ae9624899d Mon Sep 17 00:00:00 2001 From: MQ Date: Fri, 21 Mar 2025 15:02:21 +0100 Subject: [PATCH 01/10] add mastra mcp agent integration docs --- sources/platform/integrations/ai/mastra.md | 222 +++++++++++++++++++++ 1 file changed, 222 insertions(+) create mode 100644 sources/platform/integrations/ai/mastra.md diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md new file mode 100644 index 0000000000..1af8499fee --- /dev/null +++ b/sources/platform/integrations/ai/mastra.md @@ -0,0 +1,222 @@ +--- +title: Mastra integration +sidebar_label: Mastra +description: Learn how to build AI Agents Mastra using Apify MCP server +sidebar_position: 1 +slug: /integrations/mastra +--- + +**Learn how to build AI Agents with Mastra and Apify MCP server.** + +--- + +## What is Mastra + +[Mastra](https://mastra.ai) is an open-source TypeScript framework for building AI applications efficiently. It provides essential tools like agents, workflows, retrieval-augmented generation (RAG), integrations, and evaluations. Supporting any LLM (e.g., GPT-4, Claude, Gemini), it simplifies development with a unified interface via the Vercel AI SDK. You can run it locally or deploy it to a serverless cloud like [Apify](https://apify.com). + +:::note Explore Mastra +See the [Mastra docs](https://mastra.ai/docs) for more. +::: + +## What MCP server + +An [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server exposes specific data sources or tools to agents via a standardized protocol. It acts as a bridge, connecting large language models (LLMs) to external systems like databases, APIs, or local filesystems. Built on a client-server architecture, MCP servers enable secure, real-time interaction, allowing agents to fetch context or execute actions without custom integrations. Think of it as a modular plugin system for agents, simplifying how they access and process data. Apify provides [Actors MCP Server](https://apify.com/apify/actors-mcp-server) to expose [Apify Actors](https://docs.apify.com/platform/actors) from the [Apify Store](https://apify.com/store) as tools via the MCP protocol. + +## How to use Apify with Mastra via MCP + +This guide demonstrates how to integrate Apify Actors with Mastra by building an agent that uses the [RAG Web Browser](https://apify.com/apify/rag-web-browser) Actor to search Google for TikTok profiles and the [TikTok Data Extractor](https://apify.com/clockworks/free-tiktok-scraper) Actor to extract and analyze data from the TikTok profiles via MCP. + +:::note MCP tools + +Since we are using the MCP server, we do not have to make any code changes and can dynamically change the Actors provided to the agent by modifying the startup request to the MCP server. + +::: + +### Prerequisites + +- **Apify API token**: To use Apify Actors in CrewAI, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). +- **OpenAI API key**: To power the agents in CrewAI, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). +- **Node.js**: Ensure you have Node.js installed. +- **Packages**: Install the following packages: + + ```bash + npm install @mastra/core @mastra/mcp @ai-sdk/openai + ``` + +### Building the TikTok profile search and analysis agent + +First import all required packages: + +```typescript +import { Agent } from '@mastra/core/agent'; +import { MastraMCPClient } from '@mastra/mcp'; +import { openai } from '@ai-sdk/openai'; +``` + +Next, set the environment variables for the Apify API token and OpenAI API key: + +```typescript +process.env.APIFY_TOKEN = "your-apify-token"; +process.env.OPENAI_API_KEY = "your-openai-api-key"; +``` + +Instantiate the Mastra MCP client: + +```typescript +const mcpClient = new MastraMCPClient({ + name: 'apify-client', + server: { + url: new URL('https://actors-mcp-server.apify.actor/sse'), + requestInit: { + headers: { Authorization: `Bearer ${process.env.APIFY_TOKEN}` } + }, + // The EventSource package augments EventSourceInit with a "fetch" parameter. + // You can use this to set additional headers on the outgoing request. + // Based on this example: https://github.com/modelcontextprotocol/typescript-sdk/issues/118 + eventSourceInit: { + async fetch(input: Request | URL | string, init?: RequestInit) { + const headers = new Headers(init?.headers || {}); + headers.set('authorization', `Bearer ${process.env.APIFY_TOKEN}`); + return fetch(input, { ...init, headers }); + } + } + } +}); +``` + +Connect to the MCP server and fetch the tools: + +```typescript +console.log('Connecting to Mastra MCP server...'); +await mcpClient.connect(); +console.log('Fetching tools...'); +const tools = await mcpClient.tools(); +``` + +Instantiate the agent with the OpenAI model: + +```typescript +const agent = new Agent({ + name: 'TikTokAnalyzer', + instructions: 'You’re a social media data extractor. Find TikTok URLs and analyze profiles with precision.', + model: openai('gpt-4o-mini') +}); +``` + +Generate a response using the agent and the Apify tools: + +```typescript +const prompt = 'Search the web for the OpenAI TikTok profile URL, then extract and summarize its data.'; +console.log(`Generating response for prompt: ${prompt}`); +const response = await agent.generate(prompt, { + toolsets: { apify: tools } +}); +``` + +Print the response and disconnect from the MCP server: + +```typescript +console.log(response.text); +await mcpClient.disconnect(); +``` + +Before running the agent we need to start the Apify MCP Server by sending a request: + +```bash +curl https://actors-mcp-server.apify.actor/?token=YOUR_APIFY_TOKEN&actors=apify/rag-web-browser,clockworks/free-tiktok-scraper +``` + +Replace `YOUR_APIFY_TOKEN` with your Apify API token. You can also open the URL in a browser to start the server. + +:::note Use any Apify Actor + +Since it uses the MCP Server, swap in any Apify Actor from the [Apify Store](https://apify.com/store) by updating the startup request’s `actors` parameter. + +::: + +Run the agent: + +```bash +npx tsx mastra-agent.ts +``` + +:::note Execution Time + +Web searches and TikTok scraping might take a minute—depends on the Actors and network. + +::: + +You will see the agent’s output in the console, showing the results of the search and analysis. + +```text +Connecting to Mastra MCP server... +Fetching tools... +Generating response for prompt: Search the web for the OpenAI TikTok profile URL, then extr +act and summarize its data. +### OpenAI TikTok Profile Summary +- **Profile URL**: [OpenAI on TikTok](https://www.tiktok.com/@openai?lang=en) - **Followers**: 608,100 +- **Likes**: 3.4 million +- **Videos Posted**: 156 +- **Bio**: "low key research previews" +... +``` + +If you want to test the whole example, create a new file, `mastra-agent.ts`, and copy the full code into it: + +```typescript +import { Agent } from '@mastra/core/agent'; +import { MastraMCPClient } from '@mastra/mcp'; +import { openai } from '@ai-sdk/openai'; + +process.env.APIFY_TOKEN = "your-apify-token"; +process.env.OPENAI_API_KEY = "your-openai-api-key"; + +const mcpClient = new MastraMCPClient({ + name: 'apify-client', + server: { + url: new URL('https://actors-mcp-server.apify.actor/sse'), + requestInit: { + headers: { Authorization: `Bearer ${process.env.APIFY_TOKEN}` } + }, + // The EventSource package augments EventSourceInit with a "fetch" parameter. + // You can use this to set additional headers on the outgoing request. + // Based on this example: https://github.com/modelcontextprotocol/typescript-sdk/issues/118 + eventSourceInit: { + async fetch(input: Request | URL | string, init?: RequestInit) { + const headers = new Headers(init?.headers || {}); + headers.set('authorization', `Bearer ${process.env.APIFY_TOKEN}`); + return fetch(input, { ...init, headers }); + } + } + } +}); + +console.log('Connecting to Mastra MCP server...'); +await mcpClient.connect(); +console.log('Fetching tools...'); +const tools = await mcpClient.tools(); + +const agent = new Agent({ + name: 'TikTokAnalyzer', + instructions: 'You’re a data extractor. Find TikTok URLs and analyze profiles with precision.', + model: openai('gpt-4o-mini') +}); + +const prompt = 'Search the web for the OpenAI TikTok profile URL, then extract and summarize its data.'; +console.log(`Generating response for prompt: ${prompt}`); +const response = await agent.generate(prompt, { + toolsets: { apify: tools } +}); + +console.log(response.text); +await mcpClient.disconnect(); +``` + +## Resources + +- [Apify Actors](https://docs.apify.com/platform/actors) +- [Mastra Documentation](https://mastra.ai/docs) +- [Apify MCP Server](https://apify.com/apify/actors-mcp-server) +- [Apify Store](https://apify.com/store) +- [What are AI Agents?](https://blog.apify.com/what-are-ai-agents/) +- [How to Build an AI Agent](https://blog.apify.com/how-to-build-an-ai-agent/) From 236edd08609485cf9f07bc4a1c8e6bfd959f587f Mon Sep 17 00:00:00 2001 From: MQ Date: Fri, 21 Mar 2025 15:12:35 +0100 Subject: [PATCH 02/10] fix typos, unify --- sources/platform/integrations/ai/mastra.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 1af8499fee..4574af07e7 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -1,7 +1,7 @@ --- title: Mastra integration sidebar_label: Mastra -description: Learn how to build AI Agents Mastra using Apify MCP server +description: Learn how to build AI Agents with Mastra using Apify MCP server sidebar_position: 1 slug: /integrations/mastra --- @@ -18,9 +18,9 @@ slug: /integrations/mastra See the [Mastra docs](https://mastra.ai/docs) for more. ::: -## What MCP server +## What is MCP server -An [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server exposes specific data sources or tools to agents via a standardized protocol. It acts as a bridge, connecting large language models (LLMs) to external systems like databases, APIs, or local filesystems. Built on a client-server architecture, MCP servers enable secure, real-time interaction, allowing agents to fetch context or execute actions without custom integrations. Think of it as a modular plugin system for agents, simplifying how they access and process data. Apify provides [Actors MCP Server](https://apify.com/apify/actors-mcp-server) to expose [Apify Actors](https://docs.apify.com/platform/actors) from the [Apify Store](https://apify.com/store) as tools via the MCP protocol. +A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server exposes specific data sources or tools to agents via a standardized protocol. It acts as a bridge, connecting large language models (LLMs) to external systems like databases, APIs, or local filesystems. Built on a client-server architecture, MCP servers enable secure, real-time interaction, allowing agents to fetch context or execute actions without custom integrations. Think of it as a modular plugin system for agents, simplifying how they access and process data. Apify provides [Actors MCP Server](https://apify.com/apify/actors-mcp-server) to expose [Apify Actors](https://docs.apify.com/platform/actors) from the [Apify Store](https://apify.com/store) as tools via the MCP protocol. ## How to use Apify with Mastra via MCP @@ -45,7 +45,7 @@ Since we are using the MCP server, we do not have to make any code changes and c ### Building the TikTok profile search and analysis agent -First import all required packages: +First, import all required packages: ```typescript import { Agent } from '@mastra/core/agent'; @@ -97,7 +97,7 @@ Instantiate the agent with the OpenAI model: ```typescript const agent = new Agent({ - name: 'TikTokAnalyzer', + name: 'Social Media Agent', instructions: 'You’re a social media data extractor. Find TikTok URLs and analyze profiles with precision.', model: openai('gpt-4o-mini') }); @@ -120,7 +120,7 @@ console.log(response.text); await mcpClient.disconnect(); ``` -Before running the agent we need to start the Apify MCP Server by sending a request: +Before running the agent, we need to start the Apify MCP Server by sending a request: ```bash curl https://actors-mcp-server.apify.actor/?token=YOUR_APIFY_TOKEN&actors=apify/rag-web-browser,clockworks/free-tiktok-scraper @@ -140,9 +140,9 @@ Run the agent: npx tsx mastra-agent.ts ``` -:::note Execution Time +:::note Search and analysis may take some time -Web searches and TikTok scraping might take a minute—depends on the Actors and network. +The agent tasks may take some time as they search the web for the OpenAI TikTok profile and extract data from it. ::: @@ -197,8 +197,8 @@ console.log('Fetching tools...'); const tools = await mcpClient.tools(); const agent = new Agent({ - name: 'TikTokAnalyzer', - instructions: 'You’re a data extractor. Find TikTok URLs and analyze profiles with precision.', + name: 'Social Media Agent', + instructions: 'You’re a social media data extractor. Find TikTok URLs and analyze profiles with precision.', model: openai('gpt-4o-mini') }); From 6ed4274766c6e087ea3e9d0702de6fbb7780c662 Mon Sep 17 00:00:00 2001 From: MQ Date: Fri, 21 Mar 2025 15:31:14 +0100 Subject: [PATCH 03/10] fix and improve --- sources/platform/integrations/ai/mastra.md | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 4574af07e7..065fe97dfb 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -26,16 +26,10 @@ A [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server exposes This guide demonstrates how to integrate Apify Actors with Mastra by building an agent that uses the [RAG Web Browser](https://apify.com/apify/rag-web-browser) Actor to search Google for TikTok profiles and the [TikTok Data Extractor](https://apify.com/clockworks/free-tiktok-scraper) Actor to extract and analyze data from the TikTok profiles via MCP. -:::note MCP tools - -Since we are using the MCP server, we do not have to make any code changes and can dynamically change the Actors provided to the agent by modifying the startup request to the MCP server. - -::: - ### Prerequisites -- **Apify API token**: To use Apify Actors in CrewAI, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). -- **OpenAI API key**: To power the agents in CrewAI, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). +- **Apify API token**: To use Apify Actors, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). +- **OpenAI API key**: To power the agents, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). - **Node.js**: Ensure you have Node.js installed. - **Packages**: Install the following packages: @@ -120,7 +114,7 @@ console.log(response.text); await mcpClient.disconnect(); ``` -Before running the agent, we need to start the Apify MCP Server by sending a request: +Before running the agent, we need to start the [Actors MCP Server](https://apify.com/apify/actors-mcp-server) by sending a request: ```bash curl https://actors-mcp-server.apify.actor/?token=YOUR_APIFY_TOKEN&actors=apify/rag-web-browser,clockworks/free-tiktok-scraper @@ -130,7 +124,7 @@ Replace `YOUR_APIFY_TOKEN` with your Apify API token. You can also open the URL :::note Use any Apify Actor -Since it uses the MCP Server, swap in any Apify Actor from the [Apify Store](https://apify.com/store) by updating the startup request’s `actors` parameter. +Since it uses the [Actors MCP Server](https://apify.com/apify/actors-mcp-server), swap in any Apify Actor from the [Apify Store](https://apify.com/store) by updating the startup request’s `actors` parameter. No other changes are needed in the agent code. ::: @@ -151,8 +145,7 @@ You will see the agent’s output in the console, showing the results of the sea ```text Connecting to Mastra MCP server... Fetching tools... -Generating response for prompt: Search the web for the OpenAI TikTok profile URL, then extr -act and summarize its data. +Generating response for prompt: Search the web for the OpenAI TikTok profile URL, then extract and summarize its data. ### OpenAI TikTok Profile Summary - **Profile URL**: [OpenAI on TikTok](https://www.tiktok.com/@openai?lang=en) - **Followers**: 608,100 - **Likes**: 3.4 million From 6a7589b2add0cd4bc03e9760b5ba941863cc6486 Mon Sep 17 00:00:00 2001 From: MQ Date: Fri, 21 Mar 2025 15:38:39 +0100 Subject: [PATCH 04/10] fix and improve --- sources/platform/integrations/ai/mastra.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 065fe97dfb..340409c993 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -1,21 +1,23 @@ --- -title: Mastra integration +title: Mastra MCP integration sidebar_label: Mastra -description: Learn how to build AI Agents with Mastra using Apify MCP server +description: Learn how to build AI Agents with Mastra via Apify Actors MCP server sidebar_position: 1 slug: /integrations/mastra --- -**Learn how to build AI Agents with Mastra and Apify MCP server.** +**Learn how to build AI Agents with Mastra and Apify Actors MCP Server.** --- ## What is Mastra -[Mastra](https://mastra.ai) is an open-source TypeScript framework for building AI applications efficiently. It provides essential tools like agents, workflows, retrieval-augmented generation (RAG), integrations, and evaluations. Supporting any LLM (e.g., GPT-4, Claude, Gemini), it simplifies development with a unified interface via the Vercel AI SDK. You can run it locally or deploy it to a serverless cloud like [Apify](https://apify.com). +[Mastra](https://mastra.ai) is an open-source TypeScript framework for building AI applications efficiently. It provides essential tools like agents, workflows, retrieval-augmented generation (RAG), integrations, and evaluations. Supporting any LLM (e.g., GPT-4, Claude, Gemini). You can run it locally or deploy it to a serverless cloud like [Apify](https://apify.com). :::note Explore Mastra + See the [Mastra docs](https://mastra.ai/docs) for more. + ::: ## What is MCP server @@ -136,7 +138,7 @@ npx tsx mastra-agent.ts :::note Search and analysis may take some time -The agent tasks may take some time as they search the web for the OpenAI TikTok profile and extract data from it. +The agent's execution may take some time as it searches the web for the OpenAI TikTok profile and extracts data from it. ::: From 67acefbe77ad0c7a8c9eb6403214bf72e7d0e25c Mon Sep 17 00:00:00 2001 From: MQ Date: Mon, 24 Mar 2025 09:16:03 +0100 Subject: [PATCH 05/10] add mcp timeout option --- sources/platform/integrations/ai/mastra.md | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 340409c993..48e2be7c81 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -76,7 +76,8 @@ const mcpClient = new MastraMCPClient({ return fetch(input, { ...init, headers }); } } - } + }, + timeout: 300_000, // 5 minutes tool call timeout }); ``` @@ -169,21 +170,22 @@ process.env.OPENAI_API_KEY = "your-openai-api-key"; const mcpClient = new MastraMCPClient({ name: 'apify-client', server: { - url: new URL('https://actors-mcp-server.apify.actor/sse'), - requestInit: { - headers: { Authorization: `Bearer ${process.env.APIFY_TOKEN}` } - }, - // The EventSource package augments EventSourceInit with a "fetch" parameter. - // You can use this to set additional headers on the outgoing request. - // Based on this example: https://github.com/modelcontextprotocol/typescript-sdk/issues/118 - eventSourceInit: { - async fetch(input: Request | URL | string, init?: RequestInit) { - const headers = new Headers(init?.headers || {}); - headers.set('authorization', `Bearer ${process.env.APIFY_TOKEN}`); - return fetch(input, { ...init, headers }); + url: new URL('https://actors-mcp-server.apify.actor/sse'), + requestInit: { + headers: { Authorization: `Bearer ${process.env.APIFY_TOKEN}` } + }, + // The EventSource package augments EventSourceInit with a "fetch" parameter. + // You can use this to set additional headers on the outgoing request. + // Based on this example: https://github.com/modelcontextprotocol/typescript-sdk/issues/118 + eventSourceInit: { + async fetch(input: Request | URL | string, init?: RequestInit) { + const headers = new Headers(init?.headers || {}); + headers.set('authorization', `Bearer ${process.env.APIFY_TOKEN}`); + return fetch(input, { ...init, headers }); + } } - } - } + }, + timeout: 300_000, // 5 minutes tool call timeout }); console.log('Connecting to Mastra MCP server...'); From 12f05d1600758f71b998621c930d43ce57dd7fec Mon Sep 17 00:00:00 2001 From: MQ Date: Mon, 24 Mar 2025 10:09:22 +0100 Subject: [PATCH 06/10] Add new integration tiles for Mastra, CrewAI, and LangGraph --- sources/platform/integrations/index.mdx | 22 ++++++++++++++++-- static/img/platform/integrations/crewai.png | Bin 0 -> 14642 bytes .../img/platform/integrations/langgraph.png | Bin 0 -> 5700 bytes static/img/platform/integrations/mastra.png | Bin 0 -> 19967 bytes 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 static/img/platform/integrations/crewai.png create mode 100644 static/img/platform/integrations/langgraph.png create mode 100644 static/img/platform/integrations/mastra.png diff --git a/sources/platform/integrations/index.mdx b/sources/platform/integrations/index.mdx index cadcf5d4e2..c08f7ffb7b 100644 --- a/sources/platform/integrations/index.mdx +++ b/sources/platform/integrations/index.mdx @@ -150,13 +150,31 @@ If you are working on an AI/LLM-related project, we recommend you look into the + + + DN@qiB`|dNe|Vqop9_==&dj-E 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 BZl?eM literal 0 HcmV?d00001 diff --git a/static/img/platform/integrations/langgraph.png b/static/img/platform/integrations/langgraph.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4047ad26a41354a260f65ce76935e554d1ec5b GIT binary patch literal 5700 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 X$26VR^EUmrIt-DKP=r^)i~{}#t;yb@ literal 0 HcmV?d00001 diff --git a/static/img/platform/integrations/mastra.png b/static/img/platform/integrations/mastra.png new file mode 100644 index 0000000000000000000000000000000000000000..9e7290565dc31249fb91e20fa28e65dd9433fa06 GIT binary patch literal 19967 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 literal 0 HcmV?d00001 From fac99a38a2fffc1f3819204dad1a3c2e33e06306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kopeck=C3=BD?= Date: Mon, 24 Mar 2025 14:12:47 +0100 Subject: [PATCH 07/10] Update sources/platform/integrations/ai/mastra.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/mastra.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 48e2be7c81..065eb223c6 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -16,7 +16,7 @@ slug: /integrations/mastra :::note Explore Mastra -See the [Mastra docs](https://mastra.ai/docs) for more. +Check out the [Mastra docs](https://mastra.ai/docs) for more information. ::: From 957af9d6cb90cd72bd1df67506ca7629ed04348d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kopeck=C3=BD?= Date: Mon, 24 Mar 2025 14:12:53 +0100 Subject: [PATCH 08/10] Update sources/platform/integrations/ai/mastra.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/mastra.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 065eb223c6..013632c755 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -6,7 +6,7 @@ sidebar_position: 1 slug: /integrations/mastra --- -**Learn how to build AI Agents with Mastra and Apify Actors MCP Server.** +**Learn how to build AI agents with Mastra and Apify Actors MCP Server.** --- From cec17633ac4f9aeec932183250c8c258dd13a353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kopeck=C3=BD?= Date: Mon, 24 Mar 2025 14:13:02 +0100 Subject: [PATCH 09/10] Update sources/platform/integrations/ai/mastra.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/mastra.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 013632c755..589fa0a74e 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -30,10 +30,10 @@ This guide demonstrates how to integrate Apify Actors with Mastra by building an ### Prerequisites -- **Apify API token**: To use Apify Actors, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). -- **OpenAI API key**: To power the agents, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). -- **Node.js**: Ensure you have Node.js installed. -- **Packages**: Install the following packages: +- _Apify API token_: To use Apify Actors, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). +- _OpenAI API key_: To power the agents, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). +- _Node.js_: Ensure you have Node.js installed. +- _Packages_: Install the following packages: ```bash npm install @mastra/core @mastra/mcp @ai-sdk/openai From fa9339d041dc5e0a8e99d0e047c8f00a2f555dab Mon Sep 17 00:00:00 2001 From: MQ Date: Wed, 26 Mar 2025 15:30:17 +0100 Subject: [PATCH 10/10] use any ai-sdk llm provider --- sources/platform/integrations/ai/mastra.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sources/platform/integrations/ai/mastra.md b/sources/platform/integrations/ai/mastra.md index 589fa0a74e..6f273eb1e6 100644 --- a/sources/platform/integrations/ai/mastra.md +++ b/sources/platform/integrations/ai/mastra.md @@ -31,7 +31,7 @@ This guide demonstrates how to integrate Apify Actors with Mastra by building an ### Prerequisites - _Apify API token_: To use Apify Actors, you need an Apify API token. Learn how to obtain it in the [Apify documentation](https://docs.apify.com/platform/integrations/api). -- _OpenAI API key_: To power the agents, you need an OpenAI API key. Get one from the [OpenAI platform](https://platform.openai.com/account/api-keys). +- _LLM provider API key_: To power the agents, you need an LLM provider API key. For example, get one from the [OpenAI](https://platform.openai.com/account/api-keys) or [Anthropic](https://console.anthropic.com/settings/keys). - _Node.js_: Ensure you have Node.js installed. - _Packages_: Install the following packages: @@ -47,6 +47,8 @@ First, import all required packages: import { Agent } from '@mastra/core/agent'; import { MastraMCPClient } from '@mastra/mcp'; import { openai } from '@ai-sdk/openai'; +// For Anthropic use +// import { anthropic } from '@ai-sdk/anthropic'; ``` Next, set the environment variables for the Apify API token and OpenAI API key: @@ -54,6 +56,8 @@ Next, set the environment variables for the Apify API token and OpenAI API key: ```typescript process.env.APIFY_TOKEN = "your-apify-token"; process.env.OPENAI_API_KEY = "your-openai-api-key"; +// For Anthropic use +// process.env.ANTHROPIC_API_KEY = "your-anthropic-api-key"; ``` Instantiate the Mastra MCP client: @@ -96,6 +100,7 @@ Instantiate the agent with the OpenAI model: const agent = new Agent({ name: 'Social Media Agent', instructions: 'You’re a social media data extractor. Find TikTok URLs and analyze profiles with precision.', + // You can swap to any other AI-SDK LLM provider model: openai('gpt-4o-mini') }); ``` @@ -163,9 +168,13 @@ If you want to test the whole example, create a new file, `mastra-agent.ts`, and import { Agent } from '@mastra/core/agent'; import { MastraMCPClient } from '@mastra/mcp'; import { openai } from '@ai-sdk/openai'; +// For Anthropic use +// import { anthropic } from '@ai-sdk/anthropic'; process.env.APIFY_TOKEN = "your-apify-token"; process.env.OPENAI_API_KEY = "your-openai-api-key"; +// For Anthropic use +// process.env.ANTHROPIC_API_KEY = "your-anthropic-api-key"; const mcpClient = new MastraMCPClient({ name: 'apify-client', @@ -196,6 +205,7 @@ const tools = await mcpClient.tools(); const agent = new Agent({ name: 'Social Media Agent', instructions: 'You’re a social media data extractor. Find TikTok URLs and analyze profiles with precision.', + // You can swap to any other AI-SDK LLM provider model: openai('gpt-4o-mini') });