generado bot de telegram con capacidades de kanboard
This commit is contained in:
+69
-74
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user