generado bot de telegram con capacidades de kanboard

This commit is contained in:
2025-11-06 02:14:52 +01:00
parent 009b1975dc
commit b351e56614
15 changed files with 2154 additions and 74 deletions
+69 -74
View File
@@ -1,6 +1,6 @@
# kanboard_mcp.py
"""
Servidor FastMCP para controlar Kanboard desde un LLM.
🚀 Servidor FastMCP para controlar Kanboard desde un LLM.
Este módulo expone las funciones del paquete `kanboard_utils`
como herramientas del protocolo MCP (Model Context Protocol),
@@ -8,9 +8,10 @@ permitiendo a modelos de lenguaje (LLMs) listar, crear, mover
y editar tareas en Kanboard de forma segura y programática.
Requisitos:
uv add fastmcp requests
uv add fastmcp requests python-dotenv
"""
import os
from fastmcp import FastMCP
from kanboard_utils import (
listar_proyectos,
@@ -23,113 +24,107 @@ from kanboard_utils import (
editar_tarea,
)
# Instancia principal del servidor MCP
mcp = FastMCP("Kanboard Controller", instructions="""
Controlador MCP para Kanboard que permite a un LLM gestionar tareas,
proyectos y usuarios de un tablero Kanboard mediante JSON-RPC.
""")
# ========================
# ⚙️ Configuración global
# ========================
# Carga las variables de entorno automáticamente
# (útil si usas un archivo .env con los valores)
from dotenv import load_dotenv
load_dotenv()
# === Herramientas expuestas ===
# Lee las credenciales de Kanboard desde variables de entorno
API_URL = os.getenv("KANBOARD_API_URL", "http://localhost:8080/jsonrpc.php")
USER = os.getenv("KANBOARD_USER", "jsonrpc")
TOKEN = os.getenv("KANBOARD_TOKEN", "792d8fdd6cbf69b3a32d800beaf48b958e4490dd9185c72c06c56061a591")
# ========================
# 🧠 Inicializa el servidor
# ========================
mcp = FastMCP(
"Kanboard Controller",
instructions="""
Controlador MCP para Kanboard que permite a un LLM gestionar tareas,
proyectos y usuarios de un tablero Kanboard mediante JSON-RPC.
"""
)
# =====================================================
# 🧩 Herramientas disponibles para el agente LLM
# =====================================================
@mcp.tool
def list_projects(api_url: str, usuario: str, token: str) -> list[dict]:
"""
📁 Listar todos los proyectos de Kanboard.
Permite recuperar todos los proyectos accesibles para un usuario.
Ideal para que el modelo entienda qué tableros existen antes de operar.
Parámetros:
api_url (str): URL del endpoint JSON-RPC, por ejemplo http://localhost:8080/jsonrpc.php
usuario (str): Nombre de usuario con permisos API
token (str): Token de autenticación
Retorna:
list[dict]: Proyectos con campos como 'id', 'name', 'identifier', etc.
"""
return listar_proyectos(api_url, usuario, token)
def list_projects() -> list[dict]:
"""📁 Listar todos los proyectos de Kanboard."""
return listar_proyectos(API_URL, USER, TOKEN)
@mcp.tool
def list_users(api_url: str, usuario: str, token: str) -> list[dict]:
"""
👥 Listar todos los usuarios disponibles en Kanboard.
def list_users() -> list[dict]:
"""👥 Listar todos los usuarios disponibles en Kanboard."""
return listar_usuarios(API_URL, USER, TOKEN)
Devuelve la lista de usuarios con sus IDs, nombres y nombres de usuario.
"""
return listar_usuarios(api_url, usuario, token)
@mcp.tool
def list_tasks(api_url: str, usuario: str, token: str, project_id: int) -> list[dict]:
def list_tasks(project_id: int) -> list[str]:
"""
🗂️ Listar todas las tareas de un proyecto.
🗂️ Listar todas las tareas de un proyecto (solo nombres).
Permite a un LLM inspeccionar las tareas dentro de un proyecto específico.
Devuelve una lista simple de títulos de tareas, sin metadatos adicionales.
Esto simplifica el contexto para modelos de lenguaje.
"""
return listar_tareas(api_url, usuario, token, project_id)
tareas = listar_tareas(API_URL, USER, TOKEN, project_id)
# 🧹 Extrae solo los títulos (ignorando otros campos)
nombres = [t["title"] for t in tareas if "title" in t]
# 🔢 Devuelve lista simple de strings
return nombres
@mcp.tool
def list_subtasks(api_url: str, usuario: str, token: str, task_id: int) -> list[dict]:
"""
📋 Listar las subtareas de una tarea específica.
Útil para analizar el desglose de una tarea compleja.
"""
return listar_subtareas(api_url, usuario, token, task_id)
def list_subtasks(task_id: int) -> list[dict]:
"""📋 Listar las subtareas de una tarea específica."""
return listar_subtareas(API_URL, USER, TOKEN, task_id)
@mcp.tool
def list_tasks_by_column(api_url: str, usuario: str, token: str, project_id: int) -> dict:
"""
🧩 Agrupa las tareas por columna del tablero Kanboard.
Permite al modelo entender la estructura actual del flujo de trabajo.
"""
return listar_tareas_por_columna(api_url, usuario, token, project_id)
def list_tasks_by_column(project_id: int) -> dict:
"""🧩 Agrupar las tareas por columna del tablero Kanboard."""
return listar_tareas_por_columna(API_URL, USER, TOKEN, project_id)
@mcp.tool
def move_task(api_url: str, usuario: str, token: str, project_id: int,
task_id: int, column_id: int, position: int = 1, swimlane_id: int = 0) -> bool:
"""
🔄 Mover una tarea entre columnas del tablero.
Permite cambiar el estado de una tarea dentro del flujo de trabajo (por ejemplo, de "To Do" a "En progreso").
"""
return mover_tarea_columna(api_url, usuario, token, project_id, task_id, column_id, position, swimlane_id)
def move_task(project_id: int, task_id: int, column_id: int,
position: int = 1, swimlane_id: int = 0) -> bool:
"""🔄 Mover una tarea entre columnas del tablero."""
return mover_tarea_columna(API_URL, USER, TOKEN, project_id, task_id, column_id, position, swimlane_id)
@mcp.tool
def create_task(api_url: str, usuario: str, token: str, project_id: int, titulo: str,
descripcion: str = "", swimlane_id: int | None = None, assignee_id: int | None = None,
def create_task(project_id: int, titulo: str, descripcion: str = "",
swimlane_id: int | None = None, assignee_id: int | None = None,
tags: list[str] | None = None, priority: int | None = None) -> dict:
"""
Crear una nueva tarea en un proyecto Kanboard.
Ideal para automatizar la creación de tickets desde prompts naturales.
"""
return crear_tarea(api_url, usuario, token, project_id, titulo, descripcion,
""" Crear una nueva tarea en un proyecto Kanboard."""
return crear_tarea(API_URL, USER, TOKEN, project_id, titulo, descripcion,
swimlane_id, assignee_id, tags, priority)
@mcp.tool
def edit_task(api_url: str, usuario: str, token: str, task_id: int,
titulo: str | None = None, descripcion: str | None = None,
def edit_task(task_id: int, titulo: str | None = None, descripcion: str | None = None,
swimlane_id: int | None = None, assignee_id: int | None = None,
tags: list[str] | None = None, priority: int | None = None) -> dict:
"""
✏️ Editar una tarea existente en Kanboard.
Actualiza campos específicos sin alterar los demás.
Permite editar título, descripción, prioridad o etiquetas.
"""
return editar_tarea(api_url, usuario, token, task_id, titulo, descripcion,
"""✏️ Editar una tarea existente en Kanboard."""
return editar_tarea(API_URL, USER, TOKEN, task_id, titulo, descripcion,
swimlane_id, assignee_id, tags, priority)
# === Punto de entrada del servidor ===
# =====================================================
# 🚀 Punto de entrada principal del servidor FastMCP
# =====================================================
if __name__ == "__main__":
print("✅ Kanboard MCP listo y conectado con:")
print(f" 🌐 API_URL: {API_URL}")
print(f" 👤 Usuario: {USER}")
mcp.run()