n8n Workflow
Expert

Apify YouTube Search & Transcript MCP Server

Build a powerful YouTube research tool with n8n and Apify. This workflow creates an MCP server to search for videos, fetch transcripts, and monitor API usage, all accessible by an AI agent.

Overview

Creates an n8n MCP server that leverages Apify to enable AI agents or other clients to perform YouTube searches, retrieve video transcripts, and check API usage.

🧠 Description & Use Case

This workflow transforms n8n into a powerful Multi-Cognitive Process (MCP) Server, providing a suite of tools for interacting with YouTube via the Apify service. It allows an AI agent or another MCP client to perform YouTube searches, fetch video transcripts, and monitor Apify account usage programmatically.

🔄 How It Works:

  1. MCP Server Trigger

    • The Apify Youtube MCP Server node is the primary entry point. It exposes the workflow's capabilities as distinct tools that can be called by an external client, such as an AI agent or a desktop application like Claude.
  2. Tool Definitions

    • Youtube Search (websearch_contents): Accepts a text query, uses Apify to search YouTube, and returns a list of relevant videos with metadata.
    • Youtube Transcripts (youtube_transcripts): Takes one or more YouTube video URLs, uses Apify to download the full video transcripts, and returns the text.
    • Usage Report (Apfiy_Usage_Metrics): A utility tool that fetches the current month's usage metrics and limits for the connected Apify account.
  3. Execution and Routing

    • When an external client calls one of the tools, the When Executed by Another Workflow trigger is activated, receiving the operation name (youtube_search, youtube_transcripts, etc.) and any required inputs (like a query or URL).
    • An Operation Switch node routes the request to the appropriate path based on the operation name.
  4. Apify Integration & Data Processing

    • Each path uses HTTP Request nodes to call the versatile Apify YouTube Scraper actor.
    • Search: Sends a search query to the actor.
    • Transcripts: Sends video URLs and requests subtitle downloads.
    • Usage: Calls the Apify users/me/usage/monthly and users/me/limits endpoints.
    • Set nodes (Simplify Search Results, Simplify Transcript Results, Simplify Usage Metrics) are used to clean, format, and extract the most relevant data from the raw Apify API responses.
    • Aggregate nodes compile the processed items into a single, clean response object to be sent back to the calling client.

✅ Real-World Use Cases:

  • AI Research Assistant: Empower a large language model (LLM) or AI agent with the ability to conduct research on YouTube, find relevant videos, and analyze their content by reading transcripts.
  • Content Summarization & Analysis: Create a larger AI workflow where an agent first fetches a transcript using this server and then proceeds to summarize it or extract key information.
  • Automated Data Collection: Use the server as part of a larger automation to gather data on specific YouTube channels, topics, or video trends without hitting YouTube's strict rate limits.
  • API Cost Management: Programmatically check your Apify usage to prevent unexpected bills or build dashboards to monitor your automation costs.

Instructions

Basic steps

  1. Download workflow JSON
  2. Import into n8n
  3. Configure node parameters as needed
  4. Test and enable the workflow

💡 Tips

After importing, verify all connectors and credentials match your environment.

Preview

Workflow Visualization

20 nodes
100%
When Executed by Another WorkflowexecuteWorkflowTriggerOperationswitchSticky NotestickyNoteSticky Note1stickyNoteSticky Note3stickyNoteYoutube Transcripts@n8n/langchain.toolWorkflowYoutube Search@n8n/langchain.toolWorkflowApify Youtube SearchhttpRequestSimplify Search ResultssetApify Youtube TranscriptshttpRequestSimplify Transcript ResultssetAggregate Search ResultsaggregateAggregate Transcript ResultsaggregateSimplify Usage MetricssetGet Usage LimitshttpRequestUsage Report@n8n/langchain.toolWorkflowGet Usage MetricshttpRequestApify Youtube MCP Server@n8n/langchain.mcpTriggerSticky Note2stickyNoteSticky Note4stickyNote

Nodes

1

When Executed by Another Workflow

executeWorkflowTrigger

v1.1
2

Operation

switch

v3.2
3

Sticky Note

stickyNote

v1
4

Sticky Note1

stickyNote

v1
5

Sticky Note3

stickyNote

v1
6

Youtube Transcripts

@n8n/langchain.toolWorkflow

v2.1
7

Youtube Search

@n8n/langchain.toolWorkflow

v2.1
8

Apify Youtube Search

httpRequest

v4.2
9

Simplify Search Results

set

v3.4
10

Apify Youtube Transcripts

httpRequest

v4.2
11

Simplify Transcript Results

set

v3.4
12

Aggregate Search Results

aggregate

v1
13

Aggregate Transcript Results

aggregate

v1
14

Simplify Usage Metrics

set

v3.4
15

Get Usage Limits

httpRequest

v4.2
16

Usage Report

@n8n/langchain.toolWorkflow

v2.1
17

Get Usage Metrics

httpRequest

v4.2
18

Apify Youtube MCP Server

@n8n/langchain.mcpTrigger

v1
19

Sticky Note2

stickyNote

v1
20

Sticky Note4

stickyNote

v1

Statistics

Total nodes:20
Disabled nodes:0
Node types:8
Connections:11
View full JSON structure
{
  "nodes": [
    {
      "id": "aef123fd-3481-4708-ae85-684529e4f05f",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        340,
        300
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "operation"
            },
            {
              "name": "query"
            },
            {
              "name": "urls"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "d77e695b-8340-4715-9862-b6428d7d12e4",
      "name": "Operation",
      "type": "n8n-nodes-base.switch",
      "position": [
        580,
        300
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Youtube Search",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "81b134bc-d671-4493-b3ad-8df9be3f49a6",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.operation }}",
                    "rightValue": "youtube_search"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Youtube Transcripts",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "8d57914f-6587-4fb3-88e0-aa1de6ba56c1",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.operation }}",
                    "rightValue": "youtube_transcripts"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Usage Metrics",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "7c38f238-213a-46ec-aefe-22e0bcb8dffc",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.operation }}",
                    "rightValue": "usage_metrics"
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "b2d3e630-9664-481e-b250-9d5a3ff065ee",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -440,
        -100
      ],
      "parameters": {
        "color": 7,
        "width": 680,
        "height": 660,
        "content": "## 1. Set up an MCP Server Trigger\n[Read more about the MCP Server Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcptrigger)"
      },
      "typeVersion": 1
    },
    {
      "id": "6facfbdf-bc66-4652-8ae6-a1513962fe2e",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        260,
        -100
      ],
      "parameters": {
        "color": 7,
        "width": 1240,
        "height": 820,
        "content": "## 2. [APIFY.com](https://www.apify.com?fpr=414q6) for Easy Youtube Search and Transcripts\n[Sign up for Apify.com using 20JIMLEUK for 20% discount](https://www.apify.com?fpr=414q6)\n\nI've used Apify's Youtube scrapers a couple of times already and I find them quite fast and dependable for production use-cases.\nI particularly like that my workflows don't break when I inevitably hit the official Youtube rate limits which are quite low.\nFor this MCP server, I'm using the following youtube scraper for search and downloading transcripts: [https://apify.com/streamers/youtube-scraper](https://apify.com/streamers/youtube-scraper?fpr=414q6)"
      },
      "typeVersion": 1
    },
    {
      "id": "3473a800-6bdc-412d-82f2-aa5befd2dfe4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -440,
        -220
      ],
      "parameters": {
        "color": 5,
        "width": 380,
        "height": 100,
        "content": "### Always Authenticate Your Server!\nBefore going to production, it's always advised to enable authentication on your MCP server trigger."
      },
      "typeVersion": 1
    },
    {
      "id": "adddb2c3-5823-426e-bd10-4ae2f3ed0f8c",
      "name": "Youtube Transcripts",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        0,
        280
      ],
      "parameters": {
        "name": "youtube_transcripts",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "description": "Fetch the transcript from a youtube video using the youtube video url.",
        "workflowInputs": {
          "value": {
            "urls": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('urls', ``, 'string') }}",
            "query": "null",
            "operation": "youtube_transcripts"
          },
          "schema": [
            {
              "id": "operation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "operation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "query",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "query",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "urls",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "urls",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "bce90f0f-a0d8-4e43-98f2-70426b28759d",
      "name": "Youtube Search",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        -280,
        280
      ],
      "parameters": {
        "name": "websearch_contents",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "description": "Performs a youtube search and retrieves relevant videos with metadata only.",
        "workflowInputs": {
          "value": {
            "urls": "null",
            "query": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('query', ``, 'string') }}",
            "operation": "youtube_search"
          },
          "schema": [
            {
              "id": "operation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "operation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "query",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "query",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "urls",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "urls",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "42cb7bd5-bdb4-40d4-9f69-d49fe066aaa2",
      "name": "Apify Youtube Search",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        860,
        100
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/run-sync-get-dataset-items",
        "options": {},
        "jsonBody": "={{\n{\n  \"searchQueries\": [$json.query],\n  \"maxResultStreams\": 0,\n  \"maxResults\": 5\n}\n}}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "SV9BDKc1cRbZBeoL",
          "name": "Apify.com (personal token)"
        }
      },
      "executeOnce": true,
      "typeVersion": 4.2
    },
    {
      "id": "ea57908b-f927-466c-86ff-2265a5ee001a",
      "name": "Simplify Search Results",
      "type": "n8n-nodes-base.set",
      "position": [
        1060,
        100
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "9d1db837-e256-4124-80d1-8b103dbbefbb",
              "name": "channelName",
              "type": "string",
              "value": "={{ $json.channelName }}"
            },
            {
              "id": "94cebccb-b499-4fab-a1ff-187179dcd5ce",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "cc68698a-221a-49b8-a349-d16ad4fa746c",
              "name": "url",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "de8ae3e0-685d-4e40-839f-13c798d4e5e2",
              "name": "description",
              "type": "string",
              "value": "={{ $json.text.substr(0,2_000) }}"
            },
            {
              "id": "e933cbca-486c-45c9-8ed0-89a3d1efe003",
              "name": "viewCount",
              "type": "number",
              "value": "={{ $json.viewCount }}"
            },
            {
              "id": "417846bb-5e8c-42af-b1dc-8b1de9fa426c",
              "name": "likes",
              "type": "number",
              "value": "={{ $json.likes }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "aed4a7c8-f41e-4e14-90c9-4e298465e7f4",
      "name": "Apify Youtube Transcripts",
      "type": "n8n-nodes-base.httpRequest",
      "maxTries": 2,
      "position": [
        860,
        300
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/streamers~youtube-scraper/run-sync-get-dataset-items",
        "options": {},
        "jsonBody": "={{\n{\n  \"downloadSubtitles\": true,\n  \"hasCC\": false,\n  \"hasLocation\": false,\n  \"hasSubtitles\": false,\n  \"is360\": false,\n  \"is3D\": false,\n  \"is4K\": false,\n  \"isBought\": false,\n  \"isHD\": false,\n  \"isHDR\": false,\n  \"isLive\": false,\n  \"isVR180\": false,\n  \"maxResultStreams\": 0,\n  \"maxResults\": 1,\n  \"maxResultsShorts\": 0,\n  \"preferAutoGeneratedSubtitles\": false,\n  \"saveSubsToKVS\": false,\n  \"startUrls\": $json.urls.split(',').map(url => ({\n    \"url\": url,\n    \"method\": \"GET\"\n  })),\n  \"subtitlesFormat\": \"plaintext\",\n  \"subtitlesLanguage\": \"en\"\n}\n}}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "SV9BDKc1cRbZBeoL",
          "name": "Apify.com (personal token)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "a73c672c-c36a-4ac0-bb0f-a87ed4dd9329",
      "name": "Simplify Transcript Results",
      "type": "n8n-nodes-base.set",
      "position": [
        1060,
        300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "94cebccb-b499-4fab-a1ff-187179dcd5ce",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "cc68698a-221a-49b8-a349-d16ad4fa746c",
              "name": "url",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "7501fe60-f43d-42fe-9087-6f70a1cf12af",
              "name": "transcript",
              "type": "string",
              "value": "={{ $json.subtitles[0].plaintext }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "c62ef6f9-6a81-4f00-aa68-433e3378e6ff",
      "name": "Aggregate Search Results",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1260,
        100
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "response"
      },
      "typeVersion": 1
    },
    {
      "id": "53f6c967-bca1-4322-9939-7e0078ef99ed",
      "name": "Aggregate Transcript Results",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1260,
        300
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData",
        "destinationFieldName": "response"
      },
      "typeVersion": 1
    },
    {
      "id": "04590cf0-38e5-4113-abb8-14c141524b1c",
      "name": "Simplify Usage Metrics",
      "type": "n8n-nodes-base.set",
      "position": [
        1260,
        500
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ff43aa98-4e32-478d-9e43-619b7b808948",
              "name": "monthlyUsageCycle_startAt",
              "type": "string",
              "value": "={{ $json.data.monthlyUsageCycle.startAt }}"
            },
            {
              "id": "145eefd3-5248-40e9-a988-9e0e578d930a",
              "name": "monthlyUsageCycle_endAt",
              "type": "string",
              "value": "={{ $json.data.monthlyUsageCycle.endAt }}"
            },
            {
              "id": "020d1e4f-d7ec-4d69-b9be-b6c4ba5971eb",
              "name": "monthlyUsageUsd",
              "type": "string",
              "value": "={{ $json.data.current.monthlyUsageUsd.toFixed(2) }} of {{ $json.data.limits.maxMonthlyUsageUsd.toFixed(2) }}"
            },
            {
              "id": "112fb245-b35b-45ce-ad29-e05d0f352010",
              "name": "ACTOR_COMPUTE_UNITS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.ACTOR_COMPUTE_UNITS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "4b451afb-eba7-49c6-8c3c-7279fb315ec6",
              "name": "DATASET_READS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.DATASET_READS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "c002234c-955e-41f4-a27f-7f031ae6111e",
              "name": "DATASET_TIMED_STORAGE_GBYTE_HOURS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.DATASET_TIMED_STORAGE_GBYTE_HOURS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "0108085d-1bb4-44c5-bc3b-845a7206abfe",
              "name": "DATASET_WRITES",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.DATASET_WRITES.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "df993499-7410-450c-b5b1-50052e6d061e",
              "name": "DATA_TRANSFER_EXTERNAL_GBYTES",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.DATA_TRANSFER_EXTERNAL_GBYTES.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "1627a2dd-15a6-4b69-b480-4e1b792c403d",
              "name": "DATA_TRANSFER_INTERNAL_GBYTES",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.DATA_TRANSFER_INTERNAL_GBYTES.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "73037e97-e43d-4ecd-bb7e-6c5ce4740e4d",
              "name": "KEY_VALUE_STORE_READS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.KEY_VALUE_STORE_READS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "5de9ba3b-bf62-4525-9cd9-5008bafe73c5",
              "name": "KEY_VALUE_STORE_TIMED_STORAGE_GBYTE_HOURS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.KEY_VALUE_STORE_TIMED_STORAGE_GBYTE_HOURS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "6d1997f2-46c0-468b-b50f-fc37512417d2",
              "name": "KEY_VALUE_STORE_WRITES",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.KEY_VALUE_STORE_WRITES.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "b579cb9e-d18f-4877-b808-a177195a364a",
              "name": "PAID_ACTORS_PER_DATASET_ITEM",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.PAID_ACTORS_PER_DATASET_ITEM.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "5c69831c-3c62-421d-afff-bd8cfb68fb29",
              "name": "REQUEST_QUEUE_READS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.REQUEST_QUEUE_READS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "21d54d4d-515b-4fa7-b099-c8b193fc4436",
              "name": "=REQUEST_QUEUE_TIMED_STORAGE_GBYTE_HOURS",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.REQUEST_QUEUE_TIMED_STORAGE_GBYTE_HOURS.amountAfterVolumeDiscountUsd }}"
            },
            {
              "id": "68168fc6-0052-4fa6-b631-942d972af340",
              "name": "REQUEST_QUEUE_WRITES",
              "type": "number",
              "value": "={{ $('Get Usage Metrics').item.json.data.monthlyServiceUsage.REQUEST_QUEUE_WRITES.amountAfterVolumeDiscountUsd }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "dee72606-aeea-41bf-97e3-037afbd03efc",
      "name": "Get Usage Limits",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1060,
        500
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/users/me/limits",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "SV9BDKc1cRbZBeoL",
          "name": "Apify.com (personal token)"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "49715bf8-56a9-41ee-a756-eb05ea4f1e7d",
      "name": "Usage Report",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        -140,
        400
      ],
      "parameters": {
        "name": "Apfiy_Usage_Metrics",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $workflow.id }}"
        },
        "description": "Returns current month's usage metrics.",
        "workflowInputs": {
          "value": {
            "urls": "null",
            "query": "null",
            "operation": "=usage_report"
          },
          "schema": [
            {
              "id": "operation",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "operation",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "query",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "query",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "urls",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "urls",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "737eca46-cb1f-443f-8243-33d429f0bfe3",
      "name": "Get Usage Metrics",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        860,
        500
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/users/me/usage/monthly",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "id": "SV9BDKc1cRbZBeoL",
          "name": "Apify.com (personal token)"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "90da2c29-a1fc-4772-a271-602cdd14b679",
      "name": "Apify Youtube MCP Server",
      "type": "@n8n/n8n-nodes-langchain.mcpTrigger",
      "position": [
        -300,
        60
      ],
      "webhookId": "b975bb25-be7c-49fb-8cd2-8e135d91ed4e",
      "parameters": {
        "path": "b975bb25-be7c-49fb-8cd2-8e135d91ed4e"
      },
      "typeVersion": 1
    },
    {
      "id": "b427a01f-099d-43f8-8b8d-04186a5d330e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        -460
      ],
      "parameters": {
        "width": 480,
        "height": 1020,
        "content": "## Try It Out!\n### This n8n demonstrates how to build a simple Youtube Search MCP server to look up videos on Youtube and download their transcripts for research purposes.\n\n### How it works\n* A MCP server trigger is used and connected to 3 custom workflow tools: Youtube Search, Youtube Transcripts and Usage Reports.\n* Both Youtube tools use an external scraping service called [APIFY.com](https://www.apify.com?fpr=414q6). This is my preference as it's a much simpler interface and there are no rate limits.  \n* The Youtube Search fetches 10 results based on the user's query.\n* The Youtube Transcripts downloads the subtitles from one or more given urls.\n* The usage reports pulls in your monthly [APIFY.com](https://www.apify.com?fpr=414q6) monthly spending and limits as a way to check your account.\n\n### How to use\n* This Apify Youtube MCP server allows any compatible MCP client to research youtube videos for any desired topic. An Apify account is required however to connect and use the service.\n* Connect your MCP client by following the n8n guidelines here - https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-langchain.mcptrigger/#integrating-with-claude-desktop\n* Alternatively, connect any n8n AI agent with the MCP client tool.\n* Try the following queries in your MCP client:\n  * \"what is MCP?\"\n  * \"How can I use MCP in n8n?\"\n  * \"How can I use Apify's official MCP server?\"\n\n### Requirements\n* [APIFY.com](https://www.apify.com?fpr=414q6) for Youtube Scraping. This is a paid service but there is a $5 free tier which is ample for this template.\n* MCP Client or Agent for usage such as Claude Desktop - https://claude.ai/download\n\n### Customising this workflow\n* Add as many [APIFY.com](https://www.apify.com?fpr=414q6) actors as required for your use-case or users. Consider using Apify's official MCP server for 4000+ available tools.\n* Remember to set the MCP server to require credentials before going to production and sharing this MCP server with others!"
      },
      "typeVersion": 1
    },
    {
      "id": "e11a8af0-0a53-4b9b-a499-4bbd956858f8",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        260,
        -360
      ],
      "parameters": {
        "width": 280,
        "height": 240,
        "content": "[![](https://d2gdx5nv84sdx2.cloudfront.net/uploads/35gj8m4w/marketing_asset/banner/13734/Large_rectangle_336x280_Light__1_.png)](https://www.apify.com?fpr=414q6)"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Operation": {
      "main": [
        [
          {
            "node": "Apify Youtube Search",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Apify Youtube Transcripts",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Usage Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Usage Report": {
      "ai_tool": [
        [
          {
            "node": "Apify Youtube MCP Server",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Youtube Search": {
      "ai_tool": [
        [
          {
            "node": "Apify Youtube MCP Server",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get Usage Limits": {
      "main": [
        [
          {
            "node": "Simplify Usage Metrics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Usage Metrics": {
      "main": [
        [
          {
            "node": "Get Usage Limits",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Youtube Transcripts": {
      "ai_tool": [
        [
          {
            "node": "Apify Youtube MCP Server",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Apify Youtube Search": {
      "main": [
        [
          {
            "node": "Simplify Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simplify Search Results": {
      "main": [
        [
          {
            "node": "Aggregate Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Apify Youtube Transcripts": {
      "main": [
        [
          {
            "node": "Simplify Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Simplify Transcript Results": {
      "main": [
        [
          {
            "node": "Aggregate Transcript Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Operation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Actions

Share
Categories:
Tags:
sethttprequestswitchstickynoteexecuteworkflowtriggeraggregate

Technical Specs

Complexity:
Expert
Node Count:
20 nodes
Published:11 months ago
Updated:10 days ago

Compatibility

Platform:
N8N Cloud & Self-hosted
Min Version:
N8N v1.0.0+
Supports cloud and self-hosted deployment

License

This workflow template follows MIT license, you can freely use, modify and distribute.

Please comply with relevant third-party service terms when using.

Related Workflows