小智ai+mcp+n8n的智能組合
- 1 小智ai的版本
- 2 n8n的配置
- 3 mcp的demo
- 4 工作流json
? 之前有寫過小智ai的介紹,它提供了流暢且豐富的用戶語音交互能力。n8n提供了靈活且穩定的后臺工作流的能力,如果這兩個工具進行組合,可以打造一個好玩又好用的智能ai應用。
? 我這里使用了官方提供的mcp服務來聯動這兩個工具,主要是借用小智ai與n8n的開源優越性。
1 小智ai的版本
? 我之前有寫過介紹了的(蝦哥小智AI助手python電腦端初體驗_蝦哥 小智-CSDN博客 ),我目前使用的是黃俊森之前的一版,目前作者已經在github版本更新了,把之前外掛mcp服務的形式,改為新版本集成了。不過我這里還是使用的老版本,我使用的版本地址,提取碼: phil。
2 n8n的配置
? 這里使用的是Webhook節點、Respond to Webhook節點,分別作為post、response的對象。其中,Webhook節點的節點配置如下:
- HTTP Method: POST
- Authentication: Header Auth 這里在header中加入了自己定義的api_key,這一步也可以不添加。
- Respond: Using ‘Respond to Webhook’ Node 這里需要選擇使用Respond to Webhook節點響應。
- Options: data 這里接收小智ai客戶端post來的參數信息。
? Respond to Webhook節點這里,我配置的信息有:
Respond With: JSON
Response Body :
{
“task_id”: “{{ $(‘Webhook’).item.json.body.task_id }}”,
“workflow_id”: "{{ KaTeX parse error: Expected 'EOF', got '}' at position 15: workflow.name }?}", "status":…json.output.toJsonString()}}
}Options: Response Code 200
Response Headers: 自定義配置吧,也可以不配置
? AI Agent這里的System Message,需要好好打磨和調試,因為它是工具調用的靈魂,我這里提供一個demo
你是一位用戶需求智能響應管家,你必須使用中文回復,你必須根據用戶的需求信息進行分析,然后進行反饋。
這里是用戶的輸入信息:{{ $(‘Webhook’).item.json.body.user_input}}
你的任務1:
如果用戶的輸入信息中含有"百度熱點"關鍵詞,你必須運行獲取百度熱點工具,并把該工具的輸出信息反饋給用戶,按照這里的格式輸出:獲取了6條信息:1.熱點信息1、2.熱點信息2、你的任務2:
如果用戶的輸入信息中明確提到不知道你的能力,可以把你的工具介紹給用戶,只介紹工具名稱。
? n8n除了可以添加tool工具外,還支持工作流調用子工作流,需要準確的System Message進行調度識別。
3 mcp的demo
? 這里是一個requests的demo,添加在mcp的server服務中即可。
@mcp.tool()
def start_n8n_workflow(user_input: str) -> dict:"""Open n8n workflow with the given user_input.then return the result of the workflow."""import requestsimport jsonimport time# 從配置文件讀取n8n相關配置BASE_WEBHOOK_URL = "你的n8n中的webhook地址"X_N8N_API_KEY = "你自定義的api_key"# 請求頭設置headers = {"Content-Type": "application/json","X-N8N-API-KEY": X_N8N_API_KEY}# 生成時間戳作為task_idtask_id = str(int(time.time()))# 請求數據data = {"user_input": user_input,"task_id": task_id}try:# 發送POST請求response = requests.post(BASE_WEBHOOK_URL + WEBHOOK_ID,headers=headers,data=json.dumps(data))# 處理響應# 檢查請求是否成功if response.status_code == 200:logger.info(f"n8n workflow 請求成功,狀態碼: 200 ok ")data = response.json()result = data.get('result')else:logger.info(f"n8n workflow 請求失敗,狀態碼: {response.status_code}")result = f"n8n workflow 請求失敗,狀態碼: {response.status_code}"return {"success": True, "result": result}except Exception as e:logger.info(f"發送請求時發生錯誤: {str(e)}")return {"success": False, "result": str(e)}
4 工作流json
? 保存下面的文本為json文件,在n8n工作流編輯器頁面點擊從文件導入即可。
{"name": "xz_n8n_assistant","nodes": [{"parameters": {"httpMethod": "POST","path": "6eb7f60e-23e3-4074-963a-6f42dee63e69","authentication": "headerAuth","responseMode": "responseNode","options": {"binaryPropertyName": "data"}},"type": "n8n-nodes-base.webhook","typeVersion": 2,"position": [-896,-384],"id": "d4752292-416d-4bef-8de2-60be70d66cdb","name": "Webhook","webhookId": "6eb7f60e-23e3-4074-963a-6f42dee63e69","credentials": {"httpHeaderAuth": {"id": "9FNAq5gcbSRzHtBQ","name": "Header Auth account 2"}}},{"parameters": {"promptType": "define","text": "根據用戶輸入的需求信息,調用工具,最后用中文輸出","options": {"systemMessage": "=你是一位用戶需求智能響應管家,你必須使用中文回復,你必須根據用戶的需求信息進行分析,然后進行反饋。\n\n這里是用戶的輸入信息:{{ $('Webhook').item.json.body.user_input}}\n\n你的任務1:\n如果用戶的輸入信息中含有\"百度熱點\"關鍵詞,你必須運行獲取百度熱點工具,并把該工具的輸出信息反饋給用戶,按照這里的格式輸出:獲取了6條信息:1.熱點信息1、2.熱點信息2、\n\n你的任務2:\n如果用戶的輸入信息中明確提到不知道你的能力,可以把你的工具介紹給用戶,只介紹工具名稱。\n\n\n\n\n"}},"type": "@n8n/n8n-nodes-langchain.agent","typeVersion": 2.1,"position": [-704,-384],"id": "d34bbdfd-e881-41b6-a184-513987862e7c","name": "AI Agent","retryOnFail": false,"maxTries": 2,"executeOnce": true,"alwaysOutputData": false},{"parameters": {"model": {"__rl": true,"value": "=openai/gpt-oss-120b","mode": "id"},"options": {}},"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi","typeVersion": 1.2,"position": [-704,-176],"id": "ba7a8eb0-0d48-4872-92f0-75c9863ed48e","name": "OpenAI Chat Model","credentials": {"openAiApi": {"id": "Hm8gyQkgPUkOVBi6","name": "OpenAi account"}}},{"parameters": {"respondWith": "json","responseBody": "={\n \"task_id\": \"{{ $('Webhook').item.json.body.task_id }}\",\n \"workflow_id\": \"{{ $workflow.name }}\",\n \"status\": \"success\",\n \"result\": {{$json.output.toJsonString()}}\n}","options": {"responseCode": 200,"responseHeaders": {"entries": [{"name": "X-N8N-API-KEY","value": "n8n_12345"},{"name": "Content-Type","value": "application/json; charset=utf-8"}]}}},"type": "n8n-nodes-base.respondToWebhook","typeVersion": 1.4,"position": [-304,-384],"id": "ab850bdd-6ef4-46b8-be98-818a6683bdb4","name": "Respond to Webhook"},{"parameters": {"toolDescription": "一個獲取百度熱點的工具","url": "https://api.1314.cool/getbaiduhot/","options": {}},"type": "n8n-nodes-base.httpRequestTool","typeVersion": 4.2,"position": [-512,-160],"id": "5ca81a09-cd74-45c2-97d7-ce656fd01d76","name": "HTTP-百度熱點","alwaysOutputData": false}],"pinData": {},"connections": {"Webhook": {"main": [[{"node": "AI Agent","type": "main","index": 0}]]},"AI Agent": {"main": [[{"node": "Respond to Webhook","type": "main","index": 0}]]},"OpenAI Chat Model": {"ai_languageModel": [[{"node": "AI Agent","type": "ai_languageModel","index": 0}]]},"HTTP-百度熱點": {"ai_tool": [[{"node": "AI Agent","type": "ai_tool","index": 0}]]}},"active": false,"settings": {"executionOrder": "v1"},"versionId": "b5a76a30-1562-4353-b29f-4d7da92a2b86","meta": {"templateCredsSetupCompleted": true,"instanceId": "1f16bc26aa41d68046a6cd33330705e84dc6e662ed18adf783908c69e188965b"},"id": "F17dzJC0t32JuQX3","tags": []
}
?