Doubao MCP Agent
Agente de Habilidades Local ToolKit
Un asistente de habilidades local basado en el protocolo MCP (Model Context Protocol), que admite habilidades personalizadas como calculadora, consulta meteorológica, etc., y proporciona una interfaz web y una interfaz API.
Estructura del proyecto
..
├── .env # 大模型 API 配置
├── chat_history.db # SQLite 对话历史数据库(自动生成)
├── index.html # 前端 Web 界面
├── main.py # 主入口(命令行界面)
├── mcp_server.py # MCP 服务端(核心)
├── server.py # Flask 后端服务
├── requirements.txt # 依赖清单
├── README.md # 项目说明
├── tree.txt # 目录结构
├── client/ # 客户端目录
│ ├── doubao_mcp_client.py # 豆包 API 客户端
│ └── __init__.py
├── config/ # 配置目录
│ ├── settings.py # 全局配置
│ └── __init__.py
└── skills/ # 技能实现目录
├── calculator.py # 计算器技能
├── weather.py # 天气查询技能
├── web_search/ # 网络搜索技能目录
│ └── web_search.py # DuckDuckGo搜索实现
| └── SKILL.md # skill描述
| └── _init_.py
└── __init__.pyRelated MCP server: MCP Connection Hub
Stack tecnológico
Framework de backend: Python + Flask para construir el servicio web, proporcionando API RESTful e interfaz de salida de streaming SSE.
Protocolo de IA y llamada a modelos: Basado en el SDK compatible con OpenAI para conectarse a la API de modelos grandes, admitiendo la conexión de modelos en formato OpenAI como Doubao.
Protocolo central: MCP (Model Context Protocol) para estandarizar la llamada a herramientas, unificando el registro y la programación de habilidades.
Arquitectura asíncrona: Procesamiento asíncrono con asyncio + aislamiento de pool de hilos, resolviendo el problema de bloqueo de llamadas asíncronas en el entorno síncrono de Flask.
Persistencia de datos: SQLite para el almacenamiento del contexto de diálogo multisesión, admitiendo la gestión de sesiones y la carga de historial.
Plugins de habilidades: Sistema de habilidades modular, que admite la extensión de herramientas conectables como calculadora, clima, búsqueda en red, etc.
Frontend: Interfaz de interacción web implementada con HTML/JS nativo, compatible con renderizado Markdown, efecto de escritura en streaming y visualización de cadena de pensamiento.
Ingeniería: Configuración de variables de API (.env), gestión de dependencias (uv/pip), mecanismos de reintento de errores y degradación, caché de llamadas a herramientas.
Funciones principales
✅ Procesamiento asíncrono estable - Se corrigió el problema de usar asyncio.run() directamente en las rutas de Flask, utilizando un pool de hilos para ejecutar funciones asíncronas.
✅ Persistencia del historial de chat - Uso de SQLite para almacenar el historial de chat, sin pérdida tras el reinicio del servicio, admite gestión multisesión.
✅ Tolerancia a fallos en llamadas a herramientas - Mecanismo de reintento automático, degradación a respuesta directa del modelo cuando falla la llamada a la herramienta.
✅ Caché de herramientas MCP - Caché tras obtener la lista de herramientas por primera vez, reduciendo el costo de inicialización repetida.
✅ Salida en streaming - Interfaz SSE completa implementada, compatible con una experiencia de salida palabra por palabra.
✅ Aviso de llamada a herramientas - Al llamar a una habilidad, se mostrará el mensaje "【Se llamó a la herramienta: {nombre_de_la_herramienta}】".
✅ Soporte multiplataforma - Proporciona tanto interfaz web como interfaz de línea de comandos.
✅ Habilidades enriquecidas - Habilidades integradas de calculadora, consulta meteorológica y búsqueda en red.
✅ Gestión de habilidades - Gestión visual de habilidades en el frontend, permitiendo activar/desactivar habilidades libremente.
✅ Renderizado Markdown - Soporte para respuestas en formato Markdown, resaltado de código, tablas, listas, fórmulas matemáticas, etc.
✅ Visualización de cadena de pensamiento - Visualización plegable del proceso de pensamiento de la IA, facilitando la comprensión de la lógica de razonamiento.
✅ Gestión multisesión - Soporte para crear múltiples diálogos independientes, cada uno guardando su historial por separado.
✅ Carga de historial de chat - Carga automática del historial al cambiar de sesión, registrando completamente el proceso de interacción.
Requisitos del entorno
Python 3.11+
openaiSDK(api)
Herramienta de gestión de paquetes uv (recomendado) o pip
Instalación
Método 1: Usando la herramienta de gestión de paquetes uv (recomendado)
Instalar uv
# Windows Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm https://astral.sh/uv/install.ps1 | iex # macOS / Linux curl -LsSf https://astral.sh/uv/install.sh | shClonar el proyecto
git clone https://github.com/taffy123d/Doubao-MCP-agent cd <项目目录>Crear entorno virtual
uv venvInstalar dependencias
uv sync
Método 2: Usando pip
Clonar el proyecto
git clone https://github.com/taffy123d/Doubao-MCP-agent cd <项目目录>Crear entorno virtual
python -m venv venvActivar entorno virtual
# Windows venv\Scripts\activate # macOS / Linux source venv/bin/activateInstalar dependencias
pip install -r requirements.txt
Configuración
Configurar la clave API en el frontend
O completar la clave API en el archivo
.env:
# OpenAI 兼容格式的 API 配置
OPENAI_API_KEY=你的API密钥
OPENAI_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
OPENAI_MODEL=你的模型IDEjecución
Método 1: Inicio completo (recomendado)
uv run server.py
#或者
python server.pyAcceso al frontend:
http://localhost:5000Interfaz API:
http://localhost:5000/api/*
Método 2: Interfaz de línea de comandos
uv run main.py
#或者
python main.pyRealizar diálogos directamente en la terminal
Soporta diálogos multironda y registro histórico
Escriba
clearo清除历史para borrar el historial de chatEscriba
exit,quito退出para salir del programa
Interfaz API
Interfaz | Método | Descripción |
| GET | Página de frontend |
| GET | Comprobación de salud |
| GET | Obtener lista de habilidades |
| GET | Obtener configuración |
| POST | Guardar configuración |
| POST | Probar conexión API |
| POST | Chat (soporta historial de chat) |
| POST | Chat en streaming (SSE) |
| POST | Borrar historial de chat |
| GET | Obtener lista de todas las sesiones |
| DELETE | Eliminar sesión especificada |
| GET | Obtener historial de sesión |
Ejemplo de solicitud API
Interfaz de chat
curl -X POST http://localhost:5000/api/chat \
-H "Content-Type: application/json" \
-d '{
"api_key": "你的API密钥",
"model": "你的模型ID",
"base_url": "https://ark.cn-beijing.volces.com/api/v3",
"message": "北京天气",
"session_id": "default"
}'Interfaz de chat en streaming
curl -X POST http://localhost:5000/api/chat/stream \
-H "Content-Type: application/json" \
-d '{
"api_key": "你的API密钥",
"model": "你的模型ID",
"base_url": "https://ark.cn-beijing.volces.com/api/v3",
"message": "北京天气",
"session_id": "default"
}'Interfaz de borrar historial
curl -X POST http://localhost:5000/api/chat/clear \
-H "Content-Type: application/json" \
-d '{
"session_id": "default"
}'Cómo utilizar
Interfaz Web
Configurar API
Complete la clave API y el ID de Endpoint en el panel de configuración de la izquierda
Haga clic en el botón "Probar" para verificar la conexión
Chat
Ingrese la pregunta en el cuadro de entrada
Habilidades admitidas:
Calculadora:
计算 123+456Consulta meteorológica:
北京天气Búsqueda en red:
搜索 最新AI新闻
Gestión de habilidades
Haga clic en "🔧 Gestión de habilidades" a la izquierda para expandir el panel
Ver todas las habilidades disponibles y sus descripciones
Haga clic en el botón de interruptor para activar/desactivar habilidades
Solo se llamarán las habilidades activadas
Gestión multisesión
Haga clic en "💬 Gestión de diálogos" a la izquierda para expandir el panel
Haga clic en "➕ Nuevo diálogo" para crear una nueva sesión
Haga clic en el elemento de la lista de sesiones para cambiar a la sesión correspondiente
Haga clic en 🗑️ para eliminar sesiones no deseadas
Cada sesión guarda su historial de forma independiente
Ver resultados
El sistema llamará automáticamente a la habilidad correspondiente y devolverá el resultado
Soporta respuestas en formato Markdown (resaltado de código, tablas, listas, etc.)
Puede hacer clic en "🧠 Proceso de pensamiento" para ver la lógica de razonamiento de la IA
Soporta diálogos multironda
Interfaz de línea de comandos
Ejecutar programa
python main.pyIngresar pregunta
Ingrese su pregunta directamente en la terminal
Habilidades admitidas:
Calculadora:
计算 123+456Consulta meteorológica:
北京天气
Ver resultados
El sistema llamará automáticamente a la habilidad correspondiente y devolverá el resultado
Soporta diálogos multironda
Escriba
clearo清除历史para borrar el historial de chat
Cómo añadir nuevas habilidades
Paso 1: Crear archivo de habilidad
Cree un nuevo archivo de habilidad en el directorio skills/, por ejemplo my_skill.py:
"""我的自定义技能"""
from mcp.server.fastmcp import FastMCP
def register_my_skill(mcp: FastMCP):
"""注册技能到 MCP 服务"""
@mcp.tool()
def my_skill(param1: str, param2: int = 1) -> str:
"""
我的自定义技能描述
示例:my_skill(param1="值", param2=2)
Args:
param1: 参数1描述
param2: 参数2描述(默认值)
Returns:
技能执行结果
"""
try:
# 技能逻辑实现
result = f"处理结果: {param1} - {param2}"
return result
except Exception as e:
return f"处理失败: {str(e)}"Paso 2: Registrar habilidad
Edite skills/__init__.py y añada la función de registro de la nueva habilidad:
from .calculator import register_calculator_tool
from .weather import register_weather_tool
from .my_skill import register_my_skill
__all__ = [
"register_calculator_tool",
"register_weather_tool",
"register_my_skill"
]Paso 3: Actualizar servicio MCP
Edite mcp_server.py y añada el registro de la nueva habilidad:
from skills import register_calculator_tool, register_weather_tool, register_my_skill
# 注册所有技能工具
register_calculator_tool(mcp)
register_weather_tool(mcp)
register_my_skill(mcp) # 添加这一行Paso 4: Reiniciar servicio
Reinicie el servicio MCP y el servicio de backend, y la nueva habilidad estará lista para usar.
Especificaciones de desarrollo de habilidades
Nombres de archivo: Usar letras minúsculas y guiones bajos
Nombres de función: Formato
register_xxx_toolDecorador de herramientas: Usar el decorador
@mcp.tool()Docstrings: Incluir descripción de la función, ejemplos y explicación de parámetros
Manejo de errores: Capturar excepciones y devolver avisos amigables
Tipos de parámetros: Usar anotaciones de tipo
Cómo crear una Skill compleja (con SKILL.md)
Para habilidades con funciones más complejas, se recomienda crear un directorio de skill independiente que contenga la implementación de la habilidad y el archivo de descripción SKILL.md.
Estructura de directorios
skills/
└── my_complex_skill/ # skill 目录
├── __init__.py # 导出配置(必选)
├── my_skill.py # 技能实现(必选)
└── SKILL.md # skill 描述文档(必选)Paso 1: Crear directorio de skill y archivo de implementación
Cree un nuevo directorio de skill en el directorio skills/, por ejemplo skills/my_complex_skill/
1.1 Crear archivo de implementación de habilidad my_skill.py
"""我的复杂技能实现"""
from mcp.server.fastmcp import FastMCP
from duckduckgo_search import AsyncDuckDuckGoSearcher # 示例依赖
def register_my_complex_skill(mcp: FastMCP):
"""注册复杂技能到 MCP 服务"""
@mcp.tool()
async def my_complex_skill(query: str, limit: int = 5) -> str:
"""
我的复杂技能描述
Args:
query: 查询关键词
limit: 返回结果数量,默认5
Returns:
格式化的搜索结果
"""
try:
async with AsyncDuckDuckGoSearcher() as searcher:
results = await searcher.atext(query, max_results=limit)
# 处理并返回结果
return f"找到 {len(results)} 条结果..."
except Exception as e:
return f"搜索失败: {str(e)}"1.2 Crear __init__.py para exportar configuración
"""my_complex_skill - 我的复杂技能"""
from .my_skill import register_my_complex_skill
__all__ = ["register_my_complex_skill"]1.3 Crear documento de descripción SKILL.md
# 我的复杂技能
## 功能描述
一句话描述技能功能...
## 使用场景
### ✅ 适用场景
- 场景1
- 场景2
## 参数说明
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| query | string | 是 | - | 查询关键词 |
## 使用示例
```python
# 示例1
my_complex_skill(query="关键词")Formato de resultados devueltos
Resultado 1: xxx
Resultado 2: xxx
Manejo de excepciones
Tipo de error | Método de manejo |
Error de red | Devolver un aviso de error amigable |
Notas
Nota 1
Nota 2
### 步骤 2:更新 skills/__init__.py
```python
from .calculator import register_calculator_tool
from .weather import register_weather_tool
from .web_search import register_web_search_tool
from .my_complex_skill import register_my_complex_skill # 新增
__all__ = [
"register_calculator_tool",
"register_weather_tool",
"register_web_search_tool",
"register_my_complex_skill" # 新增
]Paso 3: Actualizar mcp_server.py
from skills import (
register_calculator_tool,
register_weather_tool,
register_web_search_tool,
register_my_complex_skill # 新增
)
# 注册所有技能工具
register_calculator_tool(mcp)
register_weather_tool(mcp)
register_web_search_tool(mcp)
register_my_complex_skill(mcp) # 新增Paso 4: Instalar dependencias adicionales (si es necesario)
Si la nueva skill requiere paquetes de Python adicionales, agréguelos usando uv add o en requirements.txt:
uv add 包名称
或
包名称 >=版本号 #requirements.txtLuego ejecute:
uv sync
# 或
pip install 包名称Paso 5: Reiniciar servicio
Reinicie el servicio y la nueva habilidad estará lista para usar.
Especificación SKILL.md
Campo | Obligatorio | Descripción |
# Título | Sí | Nombre de la habilidad |
## Descripción funcional | Sí | Explicación de una frase sobre la función de la habilidad |
## Escenarios de uso | Sugerido | Listar escenarios aplicables |
## Descripción de parámetros | Sugerido | Explicación de parámetros en formato de tabla |
## Ejemplos de uso | Sugerido | Ejemplos de código y diálogo |
## Formato de resultados devueltos | Sugerido | Explicar la estructura del contenido devuelto |
## Manejo de excepciones | Sugerido | Método de manejo de errores |
## Notas | Sugerido | Puntos a tener en cuenta al usar |
Habilidades de ejemplo
Habilidad de calculadora
Función: Soporta suma, resta, multiplicación, división, paréntesis y exponenciación
Llamada:
计算 (10+5)*2
Habilidad de consulta meteorológica
Función: Consultar el clima de la ciudad y el pronóstico
Llamada:
上海天气o北京天气 3天
Habilidad de búsqueda en red
Función: Usar DuckDuckGo para buscar las últimas noticias
Llamada:
搜索 Python最新版本o搜索 今天科技新闻Dependencia: Librería
ddgs(pip install duckduckgo-search)
Aspectos técnicos destacados
Optimización de procesamiento asíncrono - Uso de pool de hilos para ejecutar funciones asíncronas, evitando el problema de crear un nuevo bucle de eventos en cada solicitud
Persistencia del historial de chat - Almacenamiento persistente basado en SQLite, sin pérdida tras el reinicio del servicio, admite aislamiento multisesión
Tolerancia a fallos en llamadas a herramientas - Reintento automático 2 veces en caso de fallo, degradación a respuesta directa del modelo, mejorando la robustez
Caché de herramientas MCP - Reducción del costo de inicialización repetida, mejorando la velocidad de respuesta
Implementación de salida en streaming - Interfaz SSE completa, proporcionando una mejor experiencia de usuario
Aviso de llamada a herramientas - Avisos claros de llamada a herramientas, mejorando la experiencia del usuario
Soporte multiplataforma - Proporciona simultáneamente interfaz web e interfaz de línea de comandos
Sistema de gestión de habilidades - Gestión visual de habilidades en el frontend, admite activación/desactivación flexible
Renderizado Markdown - Soporte completo de Markdown, incluyendo resaltado de código, tablas, etc.
Visualización de cadena de pensamiento - Visualización plegable del proceso de razonamiento de la IA
Gestión multisesión - Funciones completas de creación, cambio y eliminación de sesiones
Carga de historial de chat - Carga y visualización automática del historial de sesiones
Notas
Seguridad de la clave API: No envíe la clave API al control de versiones
Seguridad de las habilidades: Evite realizar operaciones peligrosas en las habilidades
Optimización del rendimiento: Para operaciones que consumen mucho tiempo, considere usar procesamiento asíncrono
Manejo de errores: Asegúrese de que las habilidades puedan manejar excepciones de manera elegante
Solución de problemas
Fallo de conexión: Verifique la clave API y la conexión de red
La habilidad no responde: Verifique si el servicio MCP se está ejecutando normalmente
El frontend no se muestra: Verifique si hay errores en la consola del navegador
Problemas con la interfaz de streaming: Asegúrese de que la conexión de red sea estable, evitando desconexiones a mitad de camino
Error de base de datos: Verifique los permisos del archivo
chat_history.db, asegúrese de que sea legible y escribible
Almacenamiento de datos
El proyecto utiliza una base de datos SQLite para persistir el historial de chat:
Archivo de base de datos:
chat_history.db(directorio raíz del proyecto, generado automáticamente en la primera ejecución)Estructura de tabla:
CREATE TABLE messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id TEXT NOT NULL, -- 会话ID,支持多会话隔离 role TEXT NOT NULL, -- 角色(user/assistant/tool) content TEXT NOT NULL, -- 消息内容 timestamp DATETIME DEFAULT CURRENT_TIMESTAMP )Consultar historial: Use herramientas de SQLite o la línea de comandos para ver
sqlite3 chat_history.db "SELECT * FROM messages ORDER BY timestamp DESC LIMIT 10;"
Sugerencias de expansión
Más habilidades: Añadir traducción, consulta de acciones, noticias, etc.
Soporte multilingüe: Añadir interfaz multilingüe
Optimización de despliegue: Usar despliegue en contenedores Docker
Mercado de habilidades: Crear un mercado de habilidades, permitiendo a los usuarios compartir y descargar habilidades
Cambio de modelo: Soporte para cambiar entre diferentes modelos de lenguaje grandes
Registro de cambios
2026-03-29 Actualización importante
Actualización del método de llamada API
httpx → OpenAI SDK: Todas las llamadas API cambiaron de solicitudes HTTP directas con
httpxal método SDKopenai>=1.0.0Renombrado de campos de configuración:
DOUBAO_API_KEY→OPENAI_API_KEYDOUBAO_ENDPOINT_ID→OPENAI_MODELDOUBAO_BASE_URL→OPENAI_BASE_URL(se eliminó el sufijo/chat/completions)
Optimización de llamadas a herramientas
Limpieza de Schema: Eliminación automática de campos no admitidos por la API de Doubao como
title,default, etc.Limpieza de Description: Compresión de espacios en blanco innecesarios, optimización de formato
Conversión de mensajes: Se añadió la función
_msg_to_dict()para manejar correctamente el objetoChatCompletionMessagedevuelto por el SDK de OpenAISegunda llamada: Se corrigió el problema de formato de mensaje en la segunda solicitud después de una llamada a herramienta
Corrección de errores
✅ Se corrigió el error "Object of type ChatCompletionMessage is not JSON serializable"
✅ Se corrigió el problema de conversión de tipos al guardar el historial de mensajes
✅ Se añadió un seguimiento detallado de la pila de excepciones para facilitar la depuración
Mejoras de arquitectura
Se añadió la función auxiliar
_msg_to_dict()para unificar la conversión de formato de mensajesSe añadió detección de tipo de API (la API de Xunfei omite automáticamente el parámetro tools)
Optimización del manejo de excepciones y salida de registros de la ruta
chat()
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
No tool schema history has been recorded yet.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Agent-first skill marketplace with USK open standard for Claude, Cursor, Gemini, Codex CLI.
Decision Layer for AI Agents — 58+ tools, Advisor, MCP. Free key: POST /v1/register {}.
Governed AI agent skills — one library, distributed to devs and exposed to remote agents over MCP.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA versatile Model Context Protocol server that enables AI assistants to manage calendars, track tasks, handle emails, search the web, and control smart home devices.23-
- FlicenseNot gradedqualityFmaintenanceA unified Model Context Protocol Gateway that bridges LLM interfaces with various tools and services, providing OpenAI API compatibility and supporting both synchronous and asynchronous tool execution.1-
- FlicenseNot gradedqualityDmaintenanceA comprehensive demonstration server that provides tools for calculations, weather, and note management alongside an interactive web interface. It showcases how AI assistants can seamlessly interact with external data sources and functions using the Model Context Protocol.-
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to operate Huawei Cloud resources (ECS, OBS, GaussDB, etc.) through conversational workflows via the Model Context Protocol.Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/taffy123d/LocalSkill-MCP-Agent'
If you have feedback or need assistance with the MCP directory API, please join our Discord server