Создание Telegram бота с n8n и MCP: практическое руководство по автоматизации с AI 2026
В этой статье я покажу, как создать мощного Telegram бота с использованием n8n для автоматизации рабочих процессов и MCP (Model Context Protocol) для интеграции с AI моделями. Такой подход позволяет быстро создавать сложные боты без написания большого количества кода, используя визуальные workflows в n8n и стандартизированный протокол MCP для взаимодействия с AI.
За последние два года интеграция автоматизации и AI стала критически важной для бизнеса. n8n предоставляет мощную платформу для создания рабочих процессов без программирования, а MCP открывает возможность подключения AI моделей (таких как Claude от Anthropic) к вашим системам через стандартизированный интерфейс.
В этом руководстве я расскажу о практической реализации: настройке n8n для работы с Telegram webhook, создании собственного MCP сервера как инструмента внутри n8n workflows, и предоставлю готовые примеры, которые можно использовать в ваших проектах.
🎯 Что вы узнаете из этой статьи:
- Архитектура решения: Telegram → n8n → MCP
- Настройка n8n для работы с Telegram webhook
- Разработка собственного MCP сервера на Python
- Интеграция MCP как инструмента в n8n workflows
- Практические примеры: автоматизация, AI-интеграция, работа с данными
- Развертывание на платформе Bothost
🏗️ Архитектура решения: Telegram → n8n → MCP
В этом руководстве мы используем архитектуру, где n8n является основным слоем автоматизации, а MCP сервер подключается как инструмент внутри n8n workflows. Такой подход имеет несколько преимуществ:
- Быстрая разработка — визуальные workflows в n8n позволяют создавать сложную логику без программирования
- Гибкость — легко изменять бизнес-логику через UI n8n
- Интеграции — n8n имеет встроенные ноды для 400+ сервисов
- AI по требованию — MCP подключается только когда нужен AI
- Простота — не нужно писать код бота, только workflows
Компоненты архитектуры
- Telegram Bot — настроен через webhook, отправляет события в n8n
- n8n Workflows — основной слой автоматизации, обрабатывает сообщения
- MCP Server — инструмент для интеграции с AI моделями (подключается при необходимости)
┌─────────────┐ ┌─────────────┐
│ Telegram │─────▶│ n8n │
│ User │ │ Workflows │
└─────────────┘ └─────────────┘
│
├─▶ HTTP Request (MCP Server)
│
├─▶ Database
│
└─▶ External APIs
Когда нужен AI:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ n8n │─────▶│ MCP │─────▶│ AI Model │
│ Workflow │ │ Server │ │ (Claude) │
└─────────────┘ └─────────────┘ └─────────────┘Когда нужен MCP?
Используйте MCP, если:
- Нужна интеграция с AI моделями (Claude, GPT и т.д.)
- Требуется стандартизированный протокол для работы с AI
- Хотите предоставить AI доступ к вашим данным и инструментам безопасно
- Планируете использовать несколько AI моделей через единый интерфейс
Можно обойтись без MCP, если:
- Достаточно стандартной автоматизации через n8n
- Не нужна интеграция с AI
- Работаете только с простыми бизнес-процессами
🔍 Что такое MCP сервер и зачем он нужен?
Model Context Protocol (MCP) — это открытый протокол от Anthropic, разработанный специально для безопасного и стандартизированного взаимодействия AI моделей с внешними системами. MCP сервер — это реализация этого протокола, которая выступает мостом между AI моделями (такими как Claude) и вашими данными, инструментами и сервисами.
Проблема, которую решает MCP
Современные AI модели (LLM) имеют ограничения:
- Статичность знаний — модели обучаются на данных до определенной даты и не имеют доступа к актуальной информации
- Нет доступа к вашим системам — AI не может работать с вашей базой данных, API или файлами
- Не может выполнять действия — модель не может отправить email, создать запись в CRM или запустить workflow
- Отсутствие стандарта — каждый разработчик создает свою систему интеграции с AI
MCP решает эти проблемы, предоставляя стандартизированный способ подключения AI к реальному миру.
Как работает MCP сервер?
MCP сервер реализует протокол, который позволяет AI моделям:
- Читать ресурсы — получать данные из ваших систем (БД, файлы, API)
- Выполнять инструменты — запускать функции, которые могут выполнять действия
- Использовать промпты — применять готовые шаблоны для генерации контента
- Управлять контекстом — предоставлять AI актуальную информацию о состоянии системы
Основные компоненты MCP
1. Resources (Ресурсы) — доступ к данным
- Файлы на диске
- Базы данных
- API endpoints
- Любые источники данных, которые вы хотите предоставить AI
2. Tools (Инструменты) — выполнение действий
- Отправка сообщений
- Создание записей в БД
- Запуск процессов (например, n8n workflows)
- Вызов внешних API
- Любые действия, которые нужно выполнить
3. Prompts (Промпты) — переиспользуемые шаблоны
- Шаблоны для ответов пользователям
- Шаблоны для обработки данных
- Предустановленные контексты для AI
4. Sampling — управление генерацией
- Контроль параметров генерации ответов
- Настройка температуры, top-p и других параметров
Зачем нужен MCP сервер в контексте Telegram ботов и n8n?
В архитектуре Telegram → n8n → MCP MCP сервер выполняет роль интеллектуального слоя:
| Без MCP | С MCP |
|---|---|
| AI работает только с текстом запроса | AI имеет доступ к вашим данным и может выполнять действия |
| Нужно вручную настраивать интеграцию с каждым сервисом | Стандартизированный протокол для всех интеграций |
| AI не знает о состоянии вашей системы | AI может запрашивать актуальную информацию через Resources |
| Ограниченные возможности автоматизации | AI может запускать n8n workflows через Tools |
| Каждый раз нужно писать код для интеграции | Один раз создали MCP сервер, используете везде |
Конкретные примеры использования
Пример 1: Интеллектуальный помощник
Пользователь спрашивает: "Сколько заказов было сегодня?"
- n8n получает сообщение из Telegram
- n8n вызывает MCP сервер через HTTP Request
- MCP сервер через Resource читает данные из БД
- MCP сервер отправляет запрос в AI с контекстом
- AI формирует ответ на основе актуальных данных
- n8n отправляет ответ пользователю
Пример 2: Автоматизация через AI
Пользователь: "Отправь уведомление всем клиентам о новом продукте"
- AI анализирует запрос
- AI вызывает Tool через MCP сервер
- MCP сервер запускает n8n workflow для массовой рассылки
- n8n выполняет рассылку через Telegram API
- AI информирует пользователя о результате
Пример 3: Работа с файлами
Пользователь: "Покажи последний отчет"
- AI запрашивает Resource через MCP
- MCP сервер читает файл с диска
- AI анализирует содержимое и предоставляет краткую сводку
Преимущества MCP перед другими подходами
- Стандартизация — единый протокол для всех AI моделей (не только Claude)
- Безопасность — контроль доступа к ресурсам и инструментам
- Масштабируемость — легко добавлять новые Resources и Tools
- Переиспользуемость — один MCP сервер может использоваться разными AI
- Интеграция — легко подключается к n8n, базам данных, API
- Открытость — открытый протокол, можно расширять под свои нужды
Когда действительно нужен MCP?
Используйте MCP, если:
- Нужна интеграция с AI моделями (Claude, GPT-4 и т.д.)
- Требуется, чтобы AI имел доступ к вашим данным в реальном времени
- Хотите, чтобы AI мог выполнять действия в ваших системах
- Планируете использовать несколько AI моделей через единый интерфейс
- Нужна стандартизация интеграции с AI
Можно обойтись без MCP, если:
- Достаточно простой автоматизации через n8n
- Не нужна интеграция с AI
- Работаете только с заранее определенными сценариями
- Не требуется интеллектуальная обработка запросов
В большинстве случаев для Telegram ботов достаточно n8n. MCP добавляет AI-слой для более интеллектуальной обработки и автоматизации.
⚙️ Установка и настройка окружения
Для нашего решения понадобится:
- n8n — платформа автоматизации (Docker или облачная версия)
- Python 3.10+ — для MCP сервера (если нужен AI)
- MCP SDK — для Python (опционально, если нужен AI)
- HTTPS хостинг — для развертывания (Bothost или другой)
Установка n8n
Самый простой способ — использовать Docker:
# Запуск n8n через Docker
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8nПосле запуска n8n будет доступен по адресу http://localhost:5678
Настройка Telegram Bot в n8n
Для работы с Telegram в n8n не нужен отдельный код бота. Настроим webhook:
- Создайте бота через @BotFather и получите токен
- В n8n создайте новый workflow
- Добавьте ноду "Telegram Trigger" для получения сообщений
- Или используйте "Webhook" ноду, если настроите webhook в Telegram
🔄 Настройка n8n для Telegram бота
Создадим базовый workflow в n8n для обработки сообщений Telegram:
Базовый workflow в n8n
- Telegram Trigger — получает входящие сообщения
- IF Node — проверяет команды (/start, /help и т.д.)
- Telegram Node — отправляет ответ пользователю
Пример конфигурации Telegram Trigger ноды:
{
"credentials": {
"telegramBotApi": {
"id": "1",
"name": "My Telegram Bot"
}
},
"parameters": {
"updates": [
"message"
]
}
}В параметрах ноды "Send Message" укажите:
Chat ID: {{ $json.message.chat.id }}
Message: {{ $json.message.text }}Обработка команд через n8n
Добавьте ноду "IF" для проверки команд:
Condition: {{ $json.message.text }} starts with "/start"🚀 Разработка MCP сервера (опционально)
MCP сервер нужен только если вы хотите интегрироваться с AI моделями. Для простой автоматизации через n8n он не требуется.
Начнем с создания базового MCP сервера. MCP использует JSON-RPC 2.0 для коммуникации и поддерживает транспорты через stdio и HTTP.
Базовый MCP сервер
# mcp_server.py
import asyncio
import json
import sys
from typing import Any, Sequence
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import (
Resource,
Tool,
Prompt,
TextContent,
ImageContent,
EmbeddedResource,
)
# Создаем экземпляр сервера
app = Server("telegram-bot-mcp")
@app.list_resources()
async def list_resources() -> list[Resource]:
"""Список доступных ресурсов"""
return [
Resource(
uri="telegram://messages",
name="Telegram Messages",
description="Доступ к сообщениям Telegram бота",
mimeType="application/json",
),
Resource(
uri="telegram://users",
name="Telegram Users",
description="Информация о пользователях бота",
mimeType="application/json",
),
]
@app.read_resource()
async def read_resource(uri: str) -> str:
"""Чтение ресурса по URI"""
if uri == "telegram://messages":
# Здесь можно получить сообщения из базы данных или API
return json.dumps({
"messages": [],
"total": 0
})
elif uri == "telegram://users":
return json.dumps({
"users": [],
"total": 0
})
else:
raise ValueError(f"Unknown resource: {uri}")
@app.list_tools()
async def list_tools() -> list[Tool]:
"""Список доступных инструментов"""
return [
Tool(
name="send_telegram_message",
description="Отправить сообщение пользователю Telegram",
inputSchema={
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "ID пользователя Telegram"
},
"message": {
"type": "string",
"description": "Текст сообщения"
}
},
"required": ["user_id", "message"]
}
),
Tool(
name="trigger_n8n_workflow",
description="Запустить n8n workflow",
inputSchema={
"type": "object",
"properties": {
"workflow_id": {
"type": "string",
"description": "ID workflow в n8n"
},
"data": {
"type": "object",
"description": "Данные для передачи в workflow"
}
},
"required": ["workflow_id"]
}
),
Tool(
name="get_user_info",
description="Получить информацию о пользователе",
inputSchema={
"type": "object",
"properties": {
"user_id": {
"type": "string",
"description": "ID пользователя"
}
},
"required": ["user_id"]
}
),
]
@app.call_tool()
async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent]:
"""Выполнение инструмента"""
if name == "send_telegram_message":
user_id = arguments.get("user_id")
message = arguments.get("message")
# Здесь будет вызов Telegram API или очереди сообщений
result = await send_message_to_telegram(user_id, message)
return [
TextContent(
type="text",
text=json.dumps({
"success": True,
"message_id": result.get("message_id"),
"sent_to": user_id
})
)
]
elif name == "trigger_n8n_workflow":
workflow_id = arguments.get("workflow_id")
data = arguments.get("data", {})
# Запуск n8n workflow
result = await trigger_n8n_workflow(workflow_id, data)
return [
TextContent(
type="text",
text=json.dumps({
"success": True,
"workflow_id": workflow_id,
"execution_id": result.get("id")
})
)
]
elif name == "get_user_info":
user_id = arguments.get("user_id")
user_info = await get_user_info(user_id)
return [
TextContent(
type="text",
text=json.dumps(user_info)
)
]
else:
raise ValueError(f"Unknown tool: {name}")
# Вспомогательные функции
async def send_message_to_telegram(user_id: str, message: str) -> dict:
"""Отправка сообщения в Telegram"""
# Интеграция с Telegram ботом
# В реальном проекте здесь будет вызов API
return {"message_id": "12345"}
async def trigger_n8n_workflow(workflow_id: str, data: dict) -> dict:
"""Запуск n8n workflow"""
# Интеграция с n8n API
return {"id": "exec_12345"}
async def get_user_info(user_id: str) -> dict:
"""Получение информации о пользователе"""
return {
"user_id": user_id,
"username": "user_name",
"status": "active"
}
async def main():
"""Запуск MCP сервера через stdio"""
async with stdio_server() as (read_stream, write_stream):
await app.run(
read_stream,
write_stream,
app.create_initialization_options()
)
if __name__ == "__main__":
asyncio.run(main())Реализация HTTP транспорта
Для интеграции с Telegram ботом через HTTP, создадим HTTP версию сервера:
# mcp_server_http.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
import uvicorn
from mcp_server import app, call_tool, list_tools, list_resources
http_app = FastAPI(title="MCP Server HTTP")
@http_app.post("/mcp")
async def handle_mcp_request(request: Request):
"""Обработка MCP запросов через HTTP"""
data = await request.json()
method = data.get("method")
params = data.get("params", {})
request_id = data.get("id")
try:
if method == "tools/list":
tools = await list_tools()
result = [tool.dict() for tool in tools]
elif method == "tools/call":
tool_name = params.get("name")
arguments = params.get("arguments", {})
result = await call_tool(tool_name, arguments)
result = [item.dict() if hasattr(item, "dict") else item for item in result]
elif method == "resources/list":
resources = await list_resources()
result = [resource.dict() for resource in resources]
else:
raise ValueError(f"Unknown method: {method}")
return JSONResponse({
"jsonrpc": "2.0",
"id": request_id,
"result": result
})
except Exception as e:
return JSONResponse({
"jsonrpc": "2.0",
"id": request_id,
"error": {
"code": -32000,
"message": str(e)
}
})
if __name__ == "__main__":
uvicorn.run(http_app, host="0.0.0.0", port=8000)Структура проекта для MCP сервера
mcp-server/
├── mcp_server.py # Основной MCP сервер
├── mcp_server_http.py # HTTP транспорт для n8n
├── config.py # Конфигурация
├── requirements.txt # Зависимости
├── .env # Переменные окружения
└── Dockerfile # Для развертывания🔗 Интеграция MCP сервера в n8n workflows
После создания MCP сервера, подключите его к n8n через HTTP Request ноду. Это позволит использовать AI функциональность внутри ваших workflows.
Подключение MCP через HTTP Request в n8n
В n8n добавьте ноду "HTTP Request" и настройте её для работы с MCP сервером:
Method: POST
URL: http://your-mcp-server:8000/mcp
Headers:
Content-Type: application/json
Body (JSON):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_user_info",
"arguments": {
"user_id": "{{ $json.message.from.id }}"
}
}
}Пример workflow: Telegram → n8n → MCP → AI
Создайте workflow в n8n:
- Telegram Trigger — получает сообщение
- IF Node — проверяет, нужен ли AI (например, команда "/ask")
- HTTP Request — вызывает MCP сервер
- HTTP Request — отправляет запрос в AI через MCP
- Telegram Node — отправляет ответ пользователю
Workflow структура:
Telegram Trigger
↓
IF ({{ $json.message.text }} starts with "/ask")
↓ (YES)
HTTP Request (MCP Server → tools/call)
↓
HTTP Request (AI API через MCP)
↓
Telegram (Send Message)Пример: использование MCP в n8n для AI-ответов
Конфигурация HTTP Request ноды для вызова AI через MCP:
# n8n HTTP Request нода для MCP
Method: POST
URL: http://localhost:8000/mcp
Body:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ask_ai",
"arguments": {
"question": "{{ $json.message.text }}",
"context": {
"user_id": "{{ $json.message.from.id }}",
"chat_id": "{{ $json.message.chat.id }}"
}
}
}
}🤖 Старый подход: Telegram бот с MCP (не рекомендуется для нового проекта)
Примечание: Этот раздел показывает альтернативный подход, где Telegram бот напрямую использует MCP. Для новых проектов рекомендуется использовать n8n как основной слой.
Если всё же нужен отдельный Telegram бот:
# telegram_bot.py
import asyncio
import os
import aiohttp
from telegram import Update
from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes
from dotenv import load_dotenv
load_dotenv()
TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN")
MCP_SERVER_URL = os.getenv("MCP_SERVER_URL", "http://localhost:8000/mcp")
# Клиент для взаимодействия с MCP сервером
class MCPClient:
def __init__(self, server_url: str):
self.server_url = server_url
self.session = None
async def _get_session(self):
if self.session is None:
self.session = aiohttp.ClientSession()
return self.session
async def call_tool(self, tool_name: str, arguments: dict) -> dict:
"""Вызов инструмента MCP"""
session = await self._get_session()
request_data = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": tool_name,
"arguments": arguments
}
}
async with session.post(self.server_url, json=request_data) as response:
result = await response.json()
if "error" in result:
raise Exception(result["error"]["message"])
return result.get("result", [])
async def list_tools(self) -> list:
"""Получение списка доступных инструментов"""
session = await self._get_session()
request_data = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}
async with session.post(self.server_url, json=request_data) as response:
result = await response.json()
if "error" in result:
raise Exception(result["error"]["message"])
return result.get("result", [])
mcp_client = MCPClient(MCP_SERVER_URL)
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обработчик команды /start"""
await update.message.reply_text(
"🤖 Привет! Я бот с поддержкой MCP.\n\n"
"Доступные команды:\n"
"/help - список команд\n"
"/tools - доступные инструменты\n"
"/send [user_id] [message] - отправить сообщение\n"
"/n8n [workflow_id] [data] - запустить n8n workflow\n"
"/info [user_id] - информация о пользователе"
)
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Обработчик команды /help"""
tools = await mcp_client.list_tools()
tools_list = "\n".join([f"• {tool['name']}: {tool['description']}" for tool in tools])
await update.message.reply_text(
f"📋 Доступные инструменты MCP:\n\n{tools_list}"
)
async def send_message(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Отправка сообщения через MCP"""
args = context.args
if len(args) < 2:
await update.message.reply_text(
"Использование: /send [user_id] [message]"
)
return
user_id = args[0]
message = " ".join(args[1:])
try:
result = await mcp_client.call_tool(
"send_telegram_message",
{"user_id": user_id, "message": message}
)
await update.message.reply_text(
f"✅ Сообщение отправлено!\n{result[0]['text']}"
)
except Exception as e:
await update.message.reply_text(f"❌ Ошибка: {str(e)}")
async def trigger_n8n(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Запуск n8n workflow через MCP"""
args = context.args
if len(args) < 1:
await update.message.reply_text(
"Использование: /n8n [workflow_id] [json_data]"
)
return
workflow_id = args[0]
data = {}
if len(args) > 1:
import json
try:
data = json.loads(" ".join(args[1:]))
except:
data = {"message": " ".join(args[1:])}
try:
result = await mcp_client.call_tool(
"trigger_n8n_workflow",
{"workflow_id": workflow_id, "data": data}
)
await update.message.reply_text(
f"✅ Workflow запущен!\n{result[0]['text']}"
)
except Exception as e:
await update.message.reply_text(f"❌ Ошибка: {str(e)}")
async def get_info(update: Update, context: ContextTypes.DEFAULT_TYPE):
"""Получение информации о пользователе"""
args = context.args
if len(args) < 1:
user_id = str(update.message.from_user.id)
else:
user_id = args[0]
try:
result = await mcp_client.call_tool(
"get_user_info",
{"user_id": user_id}
)
import json
user_data = json.loads(result[0]['text'])
await update.message.reply_text(
f"👤 Информация о пользователе:\n\n"
f"ID: {user_data.get('user_id')}\n"
f"Username: {user_data.get('username')}\n"
f"Status: {user_data.get('status')}"
)
except Exception as e:
await update.message.reply_text(f"❌ Ошибка: {str(e)}")
def main():
"""Запуск Telegram бота"""
application = Application.builder().token(TELEGRAM_BOT_TOKEN).build()
# Регистрация обработчиков
application.add_handler(CommandHandler("start", start))
application.add_handler(CommandHandler("help", help_command))
application.add_handler(CommandHandler("tools", help_command))
application.add_handler(CommandHandler("send", send_message))
application.add_handler(CommandHandler("n8n", trigger_n8n))
application.add_handler(CommandHandler("info", get_info))
# Запуск бота
application.run_polling(allowed_updates=Update.ALL_TYPES)
if __name__ == "__main__":
main()💡 Практические примеры workflows в n8n
Пример 1: Простой бот без AI (только n8n)
Для большинства задач не нужен MCP. Простой workflow в n8n:
Telegram Trigger
↓
IF ({{ $json.message.text }} = "/start")
↓
Telegram (Send Message: "Привет! Доступные команды: /help")
IF ({{ $json.message.text }} = "/help")
↓
Telegram (Send Message: "Команды: /start, /help, /info")Пример 2: Бот с AI через MCP
Когда нужна AI-интеграция, подключаем MCP:
Telegram Trigger
↓
IF ({{ $json.message.text }} starts with "/ask")
↓
HTTP Request (MCP Server)
Body: {
"method": "tools/call",
"params": {
"name": "ask_ai",
"arguments": {
"question": "{{ $json.message.text }}"
}
}
}
↓
Telegram (Send Message: {{ $json.result }})Пример 3: Комплексная автоматизация
Сочетание n8n автоматизации и AI:
Telegram Trigger
↓
Switch Node
├─ "погода" → HTTP Request (Weather API)
├─ "/ask" → HTTP Request (MCP → AI)
├─ "заказ" → Database (Save order)
└─ default → HTTP Request (MCP → AI для общего ответа)
↓
Telegram (Send Message)🔗 Детали интеграции: n8n и MCP
Если вам нужна интеграция MCP сервера в n8n workflows, используйте HTTP Request ноду:
# n8n_integration.py
import aiohttp
import os
from typing import Dict, Any
N8N_API_URL = os.getenv("N8N_API_URL", "http://localhost:5678/api/v1")
N8N_API_KEY = os.getenv("N8N_API_KEY", "")
class N8NIntegration:
def __init__(self, api_url: str, api_key: str = ""):
self.api_url = api_url
self.api_key = api_key
self.session = None
async def _get_session(self):
if self.session is None:
headers = {}
if self.api_key:
headers["X-N8N-API-KEY"] = self.api_key
self.session = aiohttp.ClientSession(headers=headers)
return self.session
async def trigger_workflow(self, workflow_id: str, data: Dict[str, Any]) -> Dict:
"""Запуск n8n workflow"""
session = await self._get_session()
url = f"{self.api_url}/workflows/{workflow_id}/execute"
payload = {
"data": data
}
async with session.post(url, json=payload) as response:
if response.status == 200:
return await response.json()
else:
error_text = await response.text()
raise Exception(f"n8n API error: {error_text}")
async def get_workflow_status(self, execution_id: str) -> Dict:
"""Получение статуса выполнения workflow"""
session = await self._get_session()
url = f"{self.api_url}/executions/{execution_id}"
async with session.get(url) as response:
if response.status == 200:
return await response.json()
else:
raise Exception(f"Failed to get execution status: {response.status}")
async def list_workflows(self) -> list:
"""Получение списка доступных workflows"""
session = await self._get_session()
url = f"{self.api_url}/workflows"
async with session.get(url) as response:
if response.status == 200:
result = await response.json()
return result.get("data", [])
else:
raise Exception(f"Failed to list workflows: {response.status}")
# Использование в mcp_server.py
n8n_client = N8NIntegration(N8N_API_URL, N8N_API_KEY)
async def trigger_n8n_workflow(workflow_id: str, data: dict) -> dict:
"""Обновленная функция для запуска n8n workflow"""
result = await n8n_client.trigger_workflow(workflow_id, data)
return {
"id": result.get("id"),
"status": result.get("status"),
"started_at": result.get("startedAt")
}Пример n8n workflow для обработки сообщений
Создайте workflow в n8n, который будет обрабатывать входящие данные от MCP сервера:
{
"name": "Telegram Bot Notification Workflow",
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "telegram-notification",
"responseMode": "responseNode",
"options": {}
},
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [250, 300]
},
{
"parameters": {
"operation": "sendMessage",
"chatId": "={{ $json.data.chat_id }}",
"text": "={{ $json.data.message }}",
"additionalFields": {}
},
"name": "Send Telegram Message",
"type": "n8n-nodes-base.telegram",
"position": [450, 300]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ { \"success\": true, \"message_id\": $json.message_id } }}"
},
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [650, 300]
}
],
"connections": {
"Webhook": {
"main": [
[
{
"node": "Send Telegram Message",
"type": "main",
"index": 0
}
]
]
},
"Send Telegram Message": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
}
}🐳 Развертывание на Bothost
Для развертывания на платформе Bothost создадим Dockerfile и конфигурацию:
Dockerfile
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
# Установка зависимостей
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Копирование кода
COPY . .
# Переменные окружения
ENV PYTHONUNBUFFERED=1
ENV MCP_SERVER_HOST=0.0.0.0
ENV MCP_SERVER_PORT=8000
# Запуск MCP сервера и Telegram бота
CMD ["sh", "-c", "python mcp_server_http.py & python telegram_bot.py"]requirements.txt
mcp>=0.1.0
python-telegram-bot>=20.0
aiohttp>=3.9.0
fastapi>=0.104.0
uvicorn>=0.24.0
python-dotenv>=1.0.0Конфигурация для Bothost
Создайте файл .env в панели управления Bothost или в переменных окружения:
TELEGRAM_BOT_TOKEN=your_bot_token_here
MCP_SERVER_URL=http://localhost:8000/mcp
N8N_API_URL=http://your-n8n-instance:5678/api/v1
N8N_API_KEY=your_n8n_api_keyРазвертывание
- Создайте репозиторий на GitHub с вашим кодом
- В панели Bothost создайте новый бот
- Подключите GitHub репозиторий
- Настройте переменные окружения
- Bothost автоматически развернет ваш бот с MCP сервером
💡 Практические примеры использования
Пример 1: Автоматические уведомления через n8n
Создайте workflow в n8n, который будет отправлять уведомления пользователям на основе различных триггеров:
# В MCP сервере добавьте инструмент
Tool(
name="send_notification",
description="Отправить уведомление через n8n workflow",
inputSchema={
"type": "object",
"properties": {
"user_id": {"type": "string"},
"notification_type": {
"type": "string",
"enum": ["alert", "info", "warning", "success"]
},
"message": {"type": "string"}
}
}
)Пример 2: Работа с базой данных через MCP
Добавьте ресурс для доступа к данным пользователей:
@app.read_resource()
async def read_resource(uri: str) -> str:
if uri.startswith("db://users/"):
user_id = uri.split("/")[-1]
user_data = await get_user_from_db(user_id)
return json.dumps(user_data)
# ... остальные ресурсыПример 3: Интеграция с внешними API
Создайте инструмент для получения данных из внешних сервисов:
Tool(
name="get_weather",
description="Получить прогноз погоды",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string"}
}
}
)
async def get_weather(city: str) -> dict:
# Вызов внешнего API или n8n workflow
workflow_result = await n8n_client.trigger_workflow(
"weather-workflow-id",
{"city": city}
)
return workflow_result🔐 Безопасность и лучшие практики
При разработке MCP сервера важно соблюдать следующие принципы безопасности:
1. Аутентификация и авторизация
- Используйте API ключи для доступа к MCP серверу
- Реализуйте проверку прав доступа к ресурсам
- Валидируйте все входящие данные
# Добавьте middleware для проверки токена
@app.middleware("http")
async def verify_token(request: Request, call_next):
token = request.headers.get("Authorization")
if not verify_api_token(token):
return JSONResponse({"error": "Unauthorized"}, status_code=401)
return await call_next(request)2. Rate Limiting
- Ограничьте количество запросов от одного клиента
- Используйте кэширование для часто запрашиваемых ресурсов
3. Логирование и мониторинг
- Логируйте все вызовы инструментов
- Мониторьте производительность MCP сервера
- Настройте алерты при ошибках
📊 Мониторинг и оптимизация
Для мониторинга работы MCP сервера можно использовать:
- Prometheus — сбор метрик
- Grafana — визуализация данных
- Логирование — централизованные логи через ELK или аналоги
# Добавьте метрики в MCP сервер
from prometheus_client import Counter, Histogram
tool_calls = Counter('mcp_tool_calls_total', 'Total tool calls', ['tool_name'])
tool_duration = Histogram('mcp_tool_duration_seconds', 'Tool execution duration', ['tool_name'])
@app.call_tool()
async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent]:
with tool_duration.labels(tool_name=name).time():
tool_calls.labels(tool_name=name).inc()
# ... выполнение инструмента🚀 Расширенные возможности
Поддержка промптов (Prompts)
MCP поддерживает переиспользуемые промпты для AI моделей:
@app.list_prompts()
async def list_prompts() -> list[Prompt]:
return [
Prompt(
name="telegram_response",
description="Шаблон для ответа пользователю Telegram",
arguments=[
{
"name": "user_message",
"description": "Сообщение от пользователя",
"required": True
}
]
)
]
@app.get_prompt()
async def get_prompt(name: str, arguments: dict) -> str:
if name == "telegram_response":
user_message = arguments.get("user_message")
return f"""Вы - помощник Telegram бота.
Пользователь написал: {user_message}
Дайте дружелюбный и полезный ответ."""Поддержка streaming
Для длительных операций можно использовать streaming ответы:
@app.call_tool()
async def call_tool(name: str, arguments: dict[str, Any]) -> list[TextContent]:
if name == "long_running_task":
# Возвращаем промежуточные результаты через streaming
async for chunk in process_long_task():
yield TextContent(type="text", text=chunk)📝 Заключение
В этой статье мы рассмотрели архитектуру Telegram → n8n → MCP для создания умных ботов. Основные преимущества такого подхода:
- Быстрая разработка — визуальные workflows в n8n вместо написания кода
- Гибкость — легко изменять логику через UI без перезапуска
- Масштабируемость — n8n обрабатывает множество запросов автоматически
- AI по требованию — MCP подключается только когда нужен AI
- Интеграции — 400+ готовых нодов в n8n для различных сервисов
- Стандартизация — MCP предоставляет единый протокол для работы с AI
Рекомендации:
- Начинайте с простых workflows в n8n без MCP
- Подключайте MCP только когда нужна AI-интеграция
- Используйте n8n как основной слой автоматизации
- MCP используйте как инструмент внутри workflows
Такой подход позволяет быстро создавать сложных ботов с минимальным количеством кода, используя визуальные workflows и стандартизированные протоколы для AI.
Рекомендации для дальнейшего развития:
- Добавьте больше инструментов для работы с различными сервисами
- Реализуйте кэширование часто используемых ресурсов
- Создайте библиотеку переиспользуемых промптов
- Интегрируйте с другими платформами (Discord, Slack, VK)
- Разработайте систему плагинов для расширения функционала
❓ Часто задаваемые вопросы (FAQ)
В чем отличие MCP от обычного REST API?
MCP предоставляет стандартизированный протокол специально для взаимодействия AI моделей с внешними системами. Он включает понятия ресурсов, инструментов и промптов, что делает интеграцию более структурированной и безопасной.
Можно ли использовать n8n без MCP?
Да! Для большинства задач MCP не нужен. n8n сам по себе мощная платформа автоматизации. MCP подключайте только когда нужна интеграция с AI моделями.
Когда использовать MCP в n8n?
Используйте MCP в n8n, когда нужна интеграция с AI моделями (Claude, GPT и т.д.). Для простой автоматизации, работы с API, базой данных или другими сервисами достаточно стандартных нодов n8n.
Какие AI модели поддерживают MCP?
MCP разработан Anthropic и поддерживается Claude (Anthropic). Однако протокол открыт, и другие модели могут его использовать через соответствующие адаптеры.
Как обеспечить безопасность MCP сервера?
Используйте аутентификацию через API ключи, валидируйте все входящие данные, ограничивайте доступ к ресурсам на основе прав пользователей, и используйте HTTPS для всех соединений.
Можно ли развернуть n8n и MCP сервер на Bothost?
Да! Bothost поддерживает развертывание любых приложений. Для n8n создайте Docker контейнер, для MCP сервера используйте Python приложение. Оба могут работать на одной платформе Bothost или на разных серверах.
Полезные ссылки:
Обновлено: январь 2026. Информация актуальна на момент публикации.
Комментарии (0)
Пока нет комментариев. Будьте первым!