This workflow corresponds to n8n.io template #15225 — we link there as the canonical source.
This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "me9sVKfsB17t54F7",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Create and Running Claude Skills with Github",
"tags": [],
"nodes": [
{
"id": "f84cf151-b3b5-4f99-9591-3c778c7a7cc1",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
-1376,
1456
],
"parameters": {
"options": {
"responseMode": "responseNodes"
}
},
"typeVersion": 1.4
},
{
"id": "708c7fbe-4998-46a0-b655-566cef89bdc4",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
192,
1856
],
"parameters": {
"sessionKey": "={{ $('Set chatbot vars').item.json.sessionId }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "de1ca5ab-fa30-440f-8331-3a9b8735c4da",
"name": "Context7",
"type": "@n8n/n8n-nodes-langchain.mcpClientTool",
"position": [
336,
976
],
"parameters": {
"options": {},
"endpointUrl": "https://mcp.context7.com/mcp",
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "b5ee61af-8595-4160-af98-db93eab5e8f9",
"name": "Simple Memory1",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
208,
976
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "ea197723-290f-4556-8a01-adb78e4d5dca",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
608,
1056
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini"
},
"options": {},
"builtInTools": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "f53757eb-5897-4d8e-8173-3b7d172f7470",
"name": "Anthropic Chat Model2",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
48,
1856
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-6",
"cachedResultName": "Claude Sonnet 4.6"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "2ffd6f5d-7b26-480d-89e0-38b0d7a5411e",
"name": "Simple Memory3",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
-656,
1264
],
"parameters": {},
"typeVersion": 1.3
},
{
"id": "30882543-34b1-462b-9d15-c461d769242c",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-528,
1264
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"proceed\": {\n\t\t\t\"type\": \"boolean\"\n\t\t},\n\t\t\"text\": {\n\t\t\t\"type\": \"text\"\n\t\t}\n\t}\n}"
},
"typeVersion": 1.3
},
{
"id": "cbffdc86-1719-436a-847a-f4860418e26a",
"name": "List Skills",
"type": "n8n-nodes-base.github",
"onError": "continueRegularOutput",
"position": [
-336,
1696
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "=https://github.com/n3witalia/my-skills"
},
"filePath": "/skills",
"resource": "file",
"operation": "list",
"repository": {
"__rl": true,
"mode": "url",
"value": "=https://github.com/n3witalia/my-skills"
}
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "9fd88c41-df5b-46ef-865b-a82e46cc456a",
"name": "Set chatbot vars",
"type": "n8n-nodes-base.set",
"position": [
-720,
1696
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a0ed4fcf-9d2e-4dd7-b690-21a72cc608a0",
"name": "chatInput",
"type": "string",
"value": "={{ $json.chatInput }}"
},
{
"id": "8d9f01e2-5455-427c-b785-a5e6df260ebc",
"name": "sessionId",
"type": "string",
"value": "={{ $json.sessionId }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "43dc2601-28b0-4714-9a22-563af263b23d",
"name": "Respond",
"type": "@n8n/n8n-nodes-langchain.chat",
"position": [
928,
1712
],
"parameters": {
"message": "={{$json.output}}",
"options": {}
},
"typeVersion": 1.3
},
{
"id": "0df3f331-fe9f-48e3-bd5f-6896ecf02b40",
"name": "List Files",
"type": "n8n-nodes-base.githubTool",
"position": [
464,
1856
],
"parameters": {
"owner": {
"__rl": true,
"mode": "name",
"value": "={{ $fromAI('orgName') }}"
},
"filePath": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Path', ``, 'string') }}",
"resource": "file",
"operation": "list",
"repository": {
"__rl": true,
"mode": "name",
"value": "={{ $fromAI('repoName') }}"
},
"descriptionType": "manual",
"toolDescription": "Lists the files and directories inside a given directory. Use this tool on any directory to explore its contents, including subdirectories and files within it."
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "8ed8aa18-47a0-4d0d-b36e-050d7f383a70",
"name": "Get File from Skill",
"type": "n8n-nodes-base.httpRequestTool",
"position": [
624,
1856
],
"parameters": {
"url": "=https://api.github.com/repos/{{ $fromAI('orgName', ``, 'string') }}/{{ $fromAI('repoName', ``, 'string') }}/contents/{{ $fromAI('path', ``, 'string') }}",
"options": {
"redirect": {
"redirect": {
"maxRedirects": 25
}
}
},
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"toolDescription": "Get text content from a file on github from org, repo name, and path to file",
"headerParameters": {
"parameters": [
{
"name": "Accept",
"value": "application/vnd.github.raw+json"
},
{
"name": "X-GitHub-Api-Version",
"value": "2022-11-28"
}
]
},
"nodeCredentialType": "githubApi"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "b51b06c4-a188-469c-b120-fc7682032803",
"name": "Anthropic Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
80,
976
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "c6ec5a98-9999-4443-90f3-11c682aabcf3",
"name": "Anthropic Chat Model1",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-784,
1264
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-5-20250929",
"cachedResultName": "Claude Sonnet 4.5"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "c5f05a76-7ef5-4321-9e60-9418824806f9",
"name": "AI Conversational Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-736,
1040
],
"parameters": {
"options": {
"systemMessage": "You are an assistant that helps create skills for Anthropic's Claude.\n\nYour goal is to determine whether the user is trying to create a skill for Anthropic and whether you have enough information to proceed.\n\nAnalyze the user's message and assess if:\n- The request is clearly about creating an Anthropic skill\n- You have all the necessary details to build it (name, description, purpose, workflow, etc.)\n\nRespond ONLY with a valid JSON object. Do not add any text outside the JSON.\n\nIf you have all the information needed to proceed:\n{\n \"proceed\": true,\n \"text\": \"<your response or confirmation message here>\"\n}\n\nIf information is missing or the request is unclear:\n{\n \"proceed\": false,\n \"text\": \"<explain what information is missing or ask a clarifying question>\"\n}"
},
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "07884468-27a9-40d7-9688-64555c22654b",
"name": "Proceed?",
"type": "n8n-nodes-base.if",
"position": [
-320,
1040
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4a4ffb2e-49ac-473d-9c08-7597e818feb9",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.output.proceed }}",
"rightValue": false
}
]
}
},
"typeVersion": 2.3
},
{
"id": "f5031c3c-0e02-4303-86fe-eb9146952e46",
"name": "More info",
"type": "@n8n/n8n-nodes-langchain.chat",
"position": [
80,
1248
],
"parameters": {
"message": "={{ $json.output.text }}",
"options": {}
},
"typeVersion": 1.3
},
{
"id": "29b37669-24df-4858-8a6f-73cfa3fcee1a",
"name": "Extract Skill MD",
"type": "@n8n/n8n-nodes-langchain.informationExtractor",
"position": [
544,
848
],
"parameters": {
"text": "={{ $json.output }}",
"options": {
"systemPromptTemplate": "You are an expert extraction algorithm.\nExtract the title of the skills (is the folder name)\nOnly extract the exact and whole MD file in markdawn language. Start with\n\n---\\nname: "
},
"schemaType": "manual",
"inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"skill_md\": {\n\t\t\t\"type\": \"string\"\n\t\t},\n \"title_skill\": {\n\t\t\t\"type\": \"string\"\n\t\t}\n\t}\n}"
},
"typeVersion": 1.2
},
{
"id": "4071d106-6dc2-4674-b42a-67bfee944a8a",
"name": "SKILL.md Parser",
"type": "n8n-nodes-base.code",
"position": [
896,
848
],
"parameters": {
"jsCode": "const raw = $input.first().json.output.skill_md;\n\nconst binaryData = await this.helpers.prepareBinaryData(\n Buffer.from(raw, 'utf-8'),\n 'SKILL.md',\n 'text/markdown'\n);\n\nreturn [{\n json: { success: true },\n binary: { data: binaryData }\n}];"
},
"typeVersion": 2
},
{
"id": "d1fe0e38-79dc-4843-b6c1-ea7ec8085f57",
"name": "Skill created",
"type": "@n8n/n8n-nodes-langchain.chat",
"position": [
1344,
848
],
"parameters": {
"message": "=The Skill has been successfully created and saved on Github: {{ $json.content.path }}",
"options": {}
},
"typeVersion": 1.3
},
{
"id": "5ad6f3b4-f187-41e5-9807-775e24e8e3db",
"name": "Create a Skill",
"type": "n8n-nodes-base.github",
"position": [
1120,
848
],
"parameters": {
"owner": {
"__rl": true,
"mode": "url",
"value": "https://github.com/n3witalia"
},
"filePath": "=skills/{{ $('Extract Skill MD').item.json.output.title_skill }}/{{$binary.data.fileName}}",
"resource": "file",
"binaryData": true,
"repository": {
"__rl": true,
"mode": "url",
"value": "https://github.com/n3witalia/my-skills"
},
"commitMessage": "Commit caveman test"
},
"credentials": {
"githubApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "af3b9656-0b49-480a-9152-4d7038be4555",
"name": "Claude Skills Creator Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
128,
752
],
"parameters": {
"text": "={{ $json.output.text }}",
"options": {
"systemMessage": "# SYSTEM PROMPT \u2014 Claude Skill Generator Agent\n\n## Identity and purpose\n\nYou are a specialized assistant for **creating Skills for Claude** on the Claude.ai platform. Your sole objective is to help users design, write, refine, and package high-quality Skills that extend Claude's capabilities.\n\nYou have access to the **Context7** tool (MCP server). You **must always** consult it before generating any skill, to retrieve up-to-date documentation for the libraries, APIs, or technologies involved in the skill you are building.\n\n---\n\n## Absolute rule: Context7 first\n\n> **Before writing any SKILL.md or bundled resource, always call Context7 to retrieve the relevant documentation.**\n\nMandatory procedure:\n\n1. Identify which libraries, frameworks, APIs, or technologies are involved in the requested skill.\n2. Use Context7's `resolve-library-id` to find the correct ID for each library.\n3. Use `get-library-docs` to retrieve up-to-date documentation.\n4. Only after reading the documentation, write the skill content.\n\nIf Context7 returns no results for a given technology, explicitly inform the user and proceed with your baseline knowledge, clearly stating that documentation was not found.\n\n---\n\n## Skill anatomy (required format)\n\nEvery skill has this structure:\n\n```\nskill-name/\n\u251c\u2500\u2500 SKILL.md \u2190 required\n\u2514\u2500\u2500 (optional)\n \u251c\u2500\u2500 scripts/ \u2190 executable Python/Bash code\n \u251c\u2500\u2500 references/ \u2190 reference documentation\n \u2514\u2500\u2500 assets/ \u2190 templates, fonts, icons, output files\n```\n\n### SKILL.md \u2014 required structure\n\n```markdown\n---\nname: skill-name-in-kebab-case\ndescription: |\n Precise description of WHEN to use the skill and WHAT it does.\n Use \"push\" language to encourage triggering.\n Example: \"Use this skill whenever the user mentions X, Y, or Z.\"\n---\n\n# Skill Title\n\nShort paragraph on the skill's purpose.\n\n## When to use this skill\n...\n\n## Workflow\n...\n\n## Available resources\n...\n```\n\n### SKILL.md writing rules\n\n- **Imperative/infinitive style**: write instructions as \"Execute X\", \"Read Y\" \u2014 never \"You should do X\".\n- **Maximum length**: 500 lines. Beyond this limit, use `references/` files and point to them from SKILL.md.\n- **Frontmatter description**: this is the primary triggering mechanism. It must be **specific and slightly \"pushy\"** to prevent under-triggering. Include example user phrases that should activate the skill.\n- **No duplication**: detailed information belongs in `references/`, not in SKILL.md.\n\n---\n\n## Skill creation process\n\n### Phase 1 \u2014 Gather context\n\nAsk the user the minimum questions needed to understand:\n\n1. **What should the skill do?** (workflow, task, integration)\n2. **When should it trigger?** (example user phrases)\n3. **Which technologies does it use?** (libraries, APIs, file formats)\n4. **What does it produce as output?** (files, text response, code)\n\nAsk **at most 2\u20133 questions at a time**. Do not overwhelm the user.\n\n### Phase 2 \u2014 Consult Context7 (MANDATORY)\n\nFor each identified technology:\n\n```\n1. resolve-library-id \u2192 get the Context7 ID\n2. get-library-docs \u2192 read the documentation\n```\n\nUse the retrieved documentation to:\n- Understand the correct APIs, up-to-date methods, and parameters.\n- Write accurate scripts and reliable references.\n- Avoid deprecated code or incorrect patterns.\n\n### Phase 3 \u2014 Plan bundled resources\n\nAnalyze each concrete use case and decide what to include:\n\n| Resource | When to include |\n|---|---|\n| `scripts/` | When the same code would be rewritten repeatedly |\n| `references/` | When there is documentation or a schema to consult |\n| `assets/` | When there are templates, fonts, or files to use in the output |\n\n### Phase 4 \u2014 Write the skill\n\nWrite in this order:\n\n1. Bundled resources first (`scripts/`, `references/`, `assets/`)\n2. Then the `SKILL.md` that references them\n\nShow the content of each file to the user in clearly labeled code blocks.\n\n### Phase 5 \u2014 Review and iterate\n\nAfter presenting the skill:\n- Ask for confirmation or feedback from the user.\n- Propose improvements if you spot gaps.\n- Iterate until the user is satisfied.\n\n---\n\n## Quality principles\n\n### Effective frontmatter description\n\n\u274c **Too vague**: `\"Skill for working with PDFs.\"`\n\n\u2705 **Correct**: `\"Use this skill whenever the user wants to read, extract text from, merge, split, rotate, or create PDF files. Also trigger for 'PDF file', '.pdf', 'PDF document', watermark, PDF form, OCR on scanned documents.\"`\n\n### Progressive disclosure principle\n\n- **Metadata** (name + description): always in context, ~100 words.\n- **SKILL.md body**: loaded when the skill triggers, ideally under 500 lines.\n- **Bundled resources**: loaded only when needed, no size limit.\n\n### Principle of least surprise\n\nThe skill must behave predictably. If there are important edge cases, document them explicitly in the SKILL.md body.\n\n---\n\n## Forbidden behaviors\n\n- \u274c Never write a skill **without first consulting Context7** for the technologies involved.\n- \u274c Never invent APIs, methods, or parameters \u2014 use only what is confirmed by documentation.\n- \u274c Never write a SKILL.md longer than 500 lines \u2014 use `references/` for details.\n- \u274c Never use second person in the skill body (\"you should\", \"you can\").\n- \u274c Never duplicate information between SKILL.md and `references/` files.\n\n---\n\n## Example interaction\n\n**User**: \"Create a skill for working with Google Sheets via the API.\"\n\n**Bot (correct behavior)**:\n\n1. Asks: what is the main workflow \u2014 read only, write only, or both?\n2. Calls `resolve-library-id` \u2192 `googleapis/sheets`\n3. Calls `get-library-docs` \u2192 reads endpoints, auth, methods\n4. Plans: `scripts/read_sheet.py`, `references/sheets-api.md`\n5. Writes SKILL.md with a frontmatter description that includes \"Google Sheets\", \"gsheet\", \"Google spreadsheet\", \"Sheets API\"\n6. Shows everything to the user and asks for feedback\n\n---\n\n## Output format\n\nOutput ONLY the raw SKILL.md content. No exceptions. No introduction. Start with \n\n---\nname\n\nFORBIDDEN \u2014 never output any of these:\n- ```json ... ``` or any markdown code fence\n- {\"skill_md\": \"...\"} or any JSON wrapper\n- Any introductory sentence, comment, or explanation\n- Any trailing message after the file content\n\nThe very first character of your response must be `---` (the YAML frontmatter opening).\nThe response ends at the last line of the skill. Nothing after.\n\n## Language\n\nAlways respond **in the user's language** during the conversation. Skill content itself must always be written in English.\n"
},
"promptType": "define"
},
"typeVersion": 3.1
},
{
"id": "a5ce40c4-b8fb-4818-a06f-ccc1ab05b061",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
304
],
"parameters": {
"width": 960,
"height": 560,
"content": "## AI-powered system for creating and executing your own Claude Skills with GitHub\n\nThis workflow implements an advanced AI-powered system for **generating, and executing Claude Skills stored on GitHub**.\n\nThis n8n workflow is a dual\u2011purpose system for:\n\n1. Creating new skills interactively with the help of a dedicated agent that uses Context7 for up\u2011to\u2011date documentation.\n2. Executing existing Claude skills stored in a GitHub repository (Claude Skills + Github System)\n\n\n### How it works\n\nThis workflow has two main paths: skill creation and skill execution. For creation, a conversational agent first checks whether the user wants a new skill and whether enough information is available; if not, it asks follow-up questions. Once ready, a dedicated creator agent uses Context7 to fetch current documentation, generates a properly structured `SKILL.md`, extracts and parses the markdown, then uploads it to GitHub under `skills/<skill-name>/SKILL.md` and confirms completion.\n\nFor execution, incoming chat requests that are not skill-creation requests are routed to the Skills Agent. That agent lists skill folders from GitHub, explores their files, retrieves the relevant `SKILL.md`, and follows the file\u2019s instructions rather than relying on general knowledge. Responses are returned through the chat, while Simple Memory preserves session context across turns.\n\n### Setup steps\n\nStart by preparing the required services: a GitHub repository with a `skills` folder, API credentials for Anthropic or OpenAI, and a Context7 API key. Import the workflow JSON into n8n, then configure the GitHub, Anthropic, OpenAI, and Context7 credentials in their respective nodes.\n\nNext, replace the example GitHub repository references in all GitHub-related nodes with your own repository details, and configure the chat trigger webhook so your front end can send messages. Review the creator agent prompt, confirm that Simple Memory nodes use a unique `sessionId`, then test both flows by creating a skill and listing skills. Once everything works correctly, activate the workflow so the webhook can receive live chat requests.\n"
},
"typeVersion": 1
},
{
"id": "ff231472-f5ea-4051-a908-00af1915fc0e",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
928
],
"parameters": {
"color": 7,
"width": 960,
"height": 528,
"content": "## STEP 1 - AI Conversational Agent \nThe AI Conversational Agent decides if the user is trying to create a skill and whether enough information is available."
},
"typeVersion": 1
},
{
"id": "cf04bfd0-6f08-4e47-9b47-7901e15b1aa2",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
640
],
"parameters": {
"color": 7,
"width": 800,
"height": 560,
"content": "## STEP 2 -Skill Creator Agent\nIt then generates a properly formatted SKILL.md file (with YAML frontmatter, imperative style, \u2264500 lines)."
},
"typeVersion": 1
},
{
"id": "da5bbe79-be9f-43c6-b45e-4a9c4e9f88b7",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
640
],
"parameters": {
"color": 7,
"width": 704,
"height": 560,
"content": "## STEP 3 - Upload to GitHub\nThe Create a Skill node uploads the file to the correct path in the GitHub repository"
},
"typeVersion": 1
},
{
"id": "baca544a-1bbc-4791-8229-10bf3c85bd89",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1024,
1520
],
"parameters": {
"color": 7,
"width": 960,
"height": 528,
"content": "## STEP 4 - Chatbot message\nFirst: connect the chatbot trigger to the first node of this WF.\nSecond: add your repo URL\nGet user message and dynamically lists available skills from GitHub"
},
"typeVersion": 1
},
{
"id": "32f38fd9-5885-4370-b311-ffa1c20a80f2",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
1520
],
"parameters": {
"color": 7,
"width": 800,
"height": 528,
"content": "## STEP 5 -Skills Execution Agent\nDynamically lists available skills from GitHub. Navigates directories to find the correct skill files. Retrieves their content via API. Executes instructions strictly based on those files using an AI agent"
},
"typeVersion": 1
},
{
"id": "c5a457ad-855c-48ee-bc61-95c9a73b5fc0",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1824,
128
],
"parameters": {
"color": 7,
"width": 736,
"height": 736,
"content": "## MY NEW YOUTUBE CHANNEL\n\ud83d\udc49 [Subscribe to my new **YouTube channel**](https://youtube.com/@n3witalia). Here I\u2019ll share videos and Shorts with practical tutorials and **FREE templates for n8n**.\n\n[](https://youtube.com/@n3witalia)"
},
"typeVersion": 1
},
{
"id": "b7eca0fe-8daa-4fe4-8b42-ab699aeac699",
"name": "Skills Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
288,
1648
],
"parameters": {
"text": "={{ $('Set chatbot vars').item.json.chatInput }}",
"options": {
"systemMessage": "=You are a specialized assistant. You do not rely on general knowledge to complete tasks \u2014 all your instructions and capabilities are defined in skill files stored in skill directories.\n\n## How You Work\n\nWhen a user makes a request, follow these steps:\n\n1. **Identify** which skill(s) are relevant to the request\n2. **Locate** the appropriate skill files by traversing directories using the `List Files by Path Name` tool (run directory lookups concurrently when possible)\n3. **Fetch** the relevant skill files (use concurrent tool calls when retrieving multiple files)\n4. **Execute** the task strictly following the instructions found in those files\n\n> \u26a0\ufe0f Never answer based on general knowledge. All instructions must come from the skill files.\n\n## Available Skills\n\n{{\nJSON.stringify(\n $items()\n .filter(item => item.json.type === 'dir')\n .map(item => {\n const htmlUrlParts = (item.json.html_url || '').split('/');\n return {\n type: item.json.type,\n path: item.json.path,\n name: item.json.name,\n orgName: htmlUrlParts[3] || '',\n repoName: htmlUrlParts[4] || '',\n };\n }),\n null,\n 2\n)\n}}"
},
"promptType": "define"
},
"typeVersion": 3.1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "36e3f667-1e26-4490-a63d-5fb5d77ff1a1",
"connections": {
"Context7": {
"ai_tool": [
[
{
"node": "Claude Skills Creator Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Proceed?": {
"main": [
[
{
"node": "Claude Skills Creator Agent",
"type": "main",
"index": 0
}
],
[
{
"node": "More info",
"type": "main",
"index": 0
}
]
]
},
"List Files": {
"ai_tool": [
[
{
"node": "Skills Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Skills": {
"main": [
[
{
"node": "Skills Agent",
"type": "main",
"index": 0
}
]
]
},
"Skills Agent": {
"main": [
[
{
"node": "Respond",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "Skills Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Create a Skill": {
"main": [
[
{
"node": "Skill created",
"type": "main",
"index": 0
}
]
]
},
"Simple Memory1": {
"ai_memory": [
[
{
"node": "Claude Skills Creator Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Simple Memory3": {
"ai_memory": [
[
{
"node": "AI Conversational Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"SKILL.md Parser": {
"main": [
[
{
"node": "Create a Skill",
"type": "main",
"index": 0
}
]
]
},
"Extract Skill MD": {
"main": [
[
{
"node": "SKILL.md Parser",
"type": "main",
"index": 0
}
]
]
},
"Set chatbot vars": {
"main": [
[
{
"node": "List Skills",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Extract Skill MD",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Get File from Skill": {
"ai_tool": [
[
{
"node": "Skills Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Anthropic Chat Model": {
"ai_languageModel": [
[
{
"node": "Claude Skills Creator Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Conversational Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Anthropic Chat Model2": {
"ai_languageModel": [
[
{
"node": "Skills Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"AI Conversational Agent": {
"main": [
[
{
"node": "Proceed?",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Conversational Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "AI Conversational Agent",
"type": "main",
"index": 0
}
]
]
},
"Claude Skills Creator Agent": {
"main": [
[
{
"node": "Extract Skill MD",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
anthropicApigithubApihttpHeaderAuthopenAiApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow implements an advanced AI-powered system for generating, and executing Claude Skills stored on GitHub.
Source: https://n8n.io/workflows/15225/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
by Varritech Technologies
Who is this workflow for? This workflow is designed for SEO analysts, content creators, marketing agencies, and developers who need to index a website and then interact with its content as if it were
This Chatbot automates the process of discovering job openings and generating tailored job application emails.
This project is an automation workflow that generates a personalized resume and cover letter for each job listing. Generates an HTML resume from your data. Hosts it live on GitHub Pages. Converts it t
This n8n workflow transforms natural language queries into targeted B2B prospecting campaigns by combining Explorium's data intelligence with AI-powered research and personalized email generation. Sim