Task: Extend n8n with additional tools

n8n workflow JSON:
{"nodes":[{"name":"Switch","type":"n8n-nodes-base.switch","notes":"check bot commands","position":[460,480],"parameters":{"rules":{"rules":[{"value2":"/start"},{"output":1,"value2":"/getweather"}]},"value1":"={{$json[\"message\"][\"text\"]}}","dataType":"string","fallbackOutput":3},"notesInFlow":true,"typeVersion":1},{"name":"msg_greet","type":"n8n-nodes-base.telegram","position":[1820,300],"parameters":{"text":"=Nice to meet you, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}.\nI am n8n-powered bot, I can send you a weather data for several European capitals. The data is an image generated in ggplot2 package of R programming language.\nType /getweather to begin.","chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","additionalFields":{}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"msg_wrongcommand","type":"n8n-nodes-base.telegram","position":[1820,1160],"parameters":{"text":"=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, your command was not recognized.\n/getweather - show image with the weather info.","chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","additionalFields":{}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[300,480],"webhookId":"2512ec1e-bcff-4dfb-9ef3-208aaecc5634","parameters":{"updates":["message"],"additionalFields":{}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"typeVersion":1},{"name":"msg_getweather","type":"n8n-nodes-base.telegram","position":[2020,820],"parameters":{"chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","operation":"sendPhoto","binaryData":true,"additionalFields":{"caption":"=Here's your image, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}."}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"City List","type":"n8n-nodes-base.function","position":[1040,640],"parameters":{"functionCode":"return [{Cityid: 2643743, Cityname:\"London\",    Country: \"GB\"},\r\n        {Cityid: 2950159, Cityname:\"Berlin\",    Country: \"DE\"},\r\n        {Cityid: 3117735, Cityname:\"Madrid\",    Country: \"ES\"},\r\n        {Cityid: 3169070, Cityname:\"Rome\",      Country: \"IT\"},\r\n        {Cityid: 683506,  Cityname:\"Bucharest\", Country: \"RO\"},\r\n        {Cityid: 2968815, Cityname:\"Paris\",     Country: \"FR\"},\r\n        {Cityid: 2761369, Cityname:\"Vienna\",    Country: \"AT\"},\r\n        {Cityid: 756135,  Cityname:\"Warsaw\",    Country: \"PL\"},\r\n        {Cityid: 3054638, Cityname:\"Budapest\",  Country: \"HU\"},\r\n        {Cityid: 792680,  Cityname:\"Belgrade\",  Country: \"RS\"}];"},"typeVersion":1},{"name":"Convert API response","type":"n8n-nodes-base.function","position":[860,840],"parameters":{"functionCode":"// this data is stored as a CSV file and then processed in the R script. Please check the R code here:\n// https://gist.github.com/ed-parsadanyan/0561cd12d545e642fcef17dcb0872b00\nvar data = [];\n\nfor (item of items) {\n  data.push({CityName: item.json.name+', '+item.json.sys.country,\n             TempCur : item.json.main.temp,\n             TempMin : item.json.main.temp_min,\n             TempMax : item.json.main.temp_max\n  });\n}\n\nreturn data;"},"typeVersion":1},{"name":"Get weather data","type":"n8n-nodes-base.httpRequest","position":[1220,640],"parameters":{"url":"=https://api.openweathermap.org/data/2.5/weather?id={{$json[\"Cityid\"]}}&units=metric&appid=6d3fff582a101700576faf74734f9535","options":{}},"typeVersion":1,"continueOnFail":true},{"name":"Spreadsheet File","type":"n8n-nodes-base.spreadsheetFile","position":[1040,840],"parameters":{"options":{"fileName":"={{$node[\"Filename\"].json[\"filename\"]}}.{{$parameter[\"fileFormat\"]}}"},"operation":"toFile","fileFormat":"csv"},"typeVersion":1},{"name":"Write csv","type":"n8n-nodes-base.writeBinaryFile","position":[1220,840],"parameters":{"fileName":"={{$node[\"Filename\"].json[\"foldername\"]}}{{$binary.data.fileName}}"},"typeVersion":1},{"name":"Filename","type":"n8n-nodes-base.set","position":[860,640],"parameters":{"values":{"string":[{"name":"filename","value":"=request_from{{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"id\"]}}_{{DateTime.now().toISO({ format: 'basic' }).split('.')[0]}}"},{"name":"foldername","value":"/home/node/.n8n/weather-bot/"},{"name":"imgname","value":"=request_from{{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"id\"]}}"}]},"options":{}},"typeVersion":1},{"name":"msg_errorAPI","type":"n8n-nodes-base.telegram","position":[1820,640],"parameters":{"text":"=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, an error occurred while fetching weather data. Please try again later.","chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","additionalFields":{"parse_mode":"Markdown"}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"Any errors API?","type":"n8n-nodes-base.if","position":[1580,640],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"error\"][\"name\"]}}","value2":"Error"}]}},"typeVersion":1},{"name":"msg_errorR","type":"n8n-nodes-base.telegram","position":[1820,1000],"parameters":{"text":"=Sorry, {{$node[\"Telegram Trigger\"].json[\"message\"][\"from\"][\"first_name\"]}}, an error occurred while creating an image. Please try again later.","chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","additionalFields":{"parse_mode":"Markdown"}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"Read Binary File","type":"n8n-nodes-base.readBinaryFile","position":[1820,820],"parameters":{"filePath":"={{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"imgname\"]}}.png"},"typeVersion":1},{"name":"R successful?","type":"n8n-nodes-base.if","position":[1580,840],"parameters":{"conditions":{"number":[{"value1":"={{$json[\"exitCode\"]}}","operation":"equal"}]}},"typeVersion":1},{"name":"Merge","type":"n8n-nodes-base.merge","position":[680,1160],"parameters":{"mode":"passThrough"},"typeVersion":1},{"name":"Merge1","type":"n8n-nodes-base.merge","position":[680,300],"parameters":{"mode":"passThrough"},"typeVersion":1},{"name":"msg_pleasewait","type":"n8n-nodes-base.telegram","position":[1820,460],"parameters":{"text":"=Please wait while your request is being processed...","chatId":"={{$node[\"Telegram Trigger\"].json[\"message\"][\"chat\"][\"id\"]}}","additionalFields":{"parse_mode":"Markdown"}},"credentials":{"telegramApi":{"id":"17","name":"n8n R test bot"}},"notesInFlow":true,"typeVersion":1},{"name":"Merge2","type":"n8n-nodes-base.merge","position":[680,640],"parameters":{"mode":"wait"},"typeVersion":1},{"name":"Run R script","type":"n8n-nodes-base.executeCommand","position":[1400,840],"parameters":{"command":"=Rscript --vanilla '{{$node[\"Filename\"].json[\"foldername\"]}}dumbbell_plot.R' '{{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"filename\"]}}.csv' '{{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"imgname\"]}}.png' >& {{$node[\"Filename\"].json[\"foldername\"]}}{{$node[\"Filename\"].json[\"filename\"]}}.log"},"typeVersion":1,"continueOnFail":true}],"connections":{"Merge":{"main":[[{"node":"msg_wrongcommand","type":"main","index":0}]]},"Merge1":{"main":[[{"node":"msg_greet","type":"main","index":0}]]},"Merge2":{"main":[[{"node":"Filename","type":"main","index":0}]]},"Switch":{"main":[[{"node":"Merge1","type":"main","index":0}],[{"node":"msg_pleasewait","type":"main","index":0},{"node":"Merge2","type":"main","index":0}],null,[{"node":"Merge","type":"main","index":0}]]},"Filename":{"main":[[{"node":"City List","type":"main","index":0}]]},"City List":{"main":[[{"node":"Get weather data","type":"main","index":0}]]},"Write csv":{"main":[[{"node":"Run R script","type":"main","index":0}]]},"Run R script":{"main":[[{"node":"R successful?","type":"main","index":0}]]},"R successful?":{"main":[[{"node":"Read Binary File","type":"main","index":0}],[{"node":"msg_errorR","type":"main","index":0}]]},"msg_pleasewait":{"main":[[{"node":"Merge2","type":"main","index":1}]]},"Any errors API?":{"main":[[{"node":"msg_errorAPI","type":"main","index":0}],[{"node":"Convert API response","type":"main","index":0}]]},"Get weather data":{"main":[[{"node":"Any errors API?","type":"main","index":0}]]},"Read Binary File":{"main":[[{"node":"msg_getweather","type":"main","index":0}]]},"Spreadsheet File":{"main":[[{"node":"Write csv","type":"main","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Switch","type":"main","index":0}]]},"Convert API response":{"main":[[{"node":"Spreadsheet File","type":"main","index":0}]]}}}