main.py•4.39 kB
"""
Este MCP permite agregar gastos a una lista de gastos.
"""
import csv
import os
from enum import Enum
from fastmcp import FastMCP
class MetodoPago(Enum):
"""Métodos de pago válidos para registrar gastos."""
TARJETA_DEBITO = "Tarjeta de débito"
TARJETA_CREDITO = "Tarjeta de crédito"
EFECTIVO = "Efectivo"
mcp = FastMCP('Gastos MCP')
@mcp.tool
def agregar_gasto(fecha: str, categoria: str, cantidad: float, metodo_pago: MetodoPago):
"""
Agrega un nuevo gasto al archivo gastos.csv
Args:
fecha: Fecha del gasto (formato YYYY-MM-DD)
categoria: Categoría del gasto
cantidad: Cantidad del gasto (número decimal)
metodo_pago: Método de pago utilizado (MetodoPago.TARJETA_DEBITO, MetodoPago.TARJETA_CREDITO o MetodoPago.EFECTIVO)
"""
archivo_csv = 'gastos.csv'
# Verificar si el archivo existe, si no, crearlo con encabezados
archivo_existe = os.path.exists(archivo_csv)
try:
# Abrir el archivo en modo append con encoding UTF-8
with open(archivo_csv, 'a', newline='', encoding='utf-8') as archivo:
writer = csv.writer(archivo)
# Si el archivo no existe, escribir los encabezados
if not archivo_existe:
writer.writerow(['Fecha', 'Categoría', 'Cantidad', 'Método de pago'])
# Escribir la nueva fila con los datos del gasto
writer.writerow([fecha, categoria, f"{cantidad:.2f}", metodo_pago.value])
return f"Gasto agregado correctamente: {fecha}, {categoria}, {cantidad:.2f}, {metodo_pago.value}"
except Exception as e:
return f"Error al agregar el gasto: {str(e)}"
@mcp.resource('resource://gastos')
def datos_de_gastos():
"""
Retorna todos los gastos registrados en formato legible para un LLM.
"""
archivo_csv = 'gastos.csv'
# Verificar si el archivo existe
if not os.path.exists(archivo_csv):
return "No hay gastos registrados. El archivo gastos.csv no existe."
try:
# Leer el archivo CSV
with open(archivo_csv, 'r', encoding='utf-8') as archivo:
reader = csv.DictReader(archivo)
gastos = list(reader)
# Si no hay gastos, retornar mensaje apropiado
if not gastos:
return "No hay gastos registrados en el archivo."
# Formatear los datos de manera clara para un LLM
resultado = "# Registro de Gastos\n\n"
resultado += f"Total de gastos registrados: {len(gastos)}\n\n"
# Calcular estadísticas básicas
total_gastado = sum(float(gasto['Cantidad']) for gasto in gastos)
resultado += f"Total gastado: ${total_gastado:.2f}\n\n"
# Agrupar por categoría
gastos_por_categoria = {}
for gasto in gastos:
categoria = gasto['Categoría']
if categoria not in gastos_por_categoria:
gastos_por_categoria[categoria] = []
gastos_por_categoria[categoria].append(gasto)
resultado += "## Gastos por Categoría\n\n"
for categoria, lista_gastos in sorted(gastos_por_categoria.items()):
total_categoria = sum(float(g['Cantidad']) for g in lista_gastos)
resultado += f"### {categoria}\n"
resultado += f"- Cantidad de gastos: {len(lista_gastos)}\n"
resultado += f"- Total: ${total_categoria:.2f}\n\n"
# Listar todos los gastos
resultado += "## Detalle de Todos los Gastos\n\n"
for i, gasto in enumerate(gastos, 1):
resultado += f"{i}. **Fecha:** {gasto['Fecha']} | "
resultado += f"**Categoría:** {gasto['Categoría']} | "
resultado += f"**Cantidad:** ${gasto['Cantidad']} | "
resultado += f"**Método de pago:** {gasto['Método de pago']}\n"
return resultado
except Exception as e:
return f"Error al leer los gastos: {str(e)}"
@mcp.prompt
def prompt_agregar_gasto():
"""
Genera un resumen de gastos de los últimos 5 días usando el recurso de datos de gastos.
"""
return "Consulta el recurso 'resource://gastos' y genera un resumen de los gastos de los últimos 5 días, incluyendo el total gastado por día y por categoría."
if __name__ == "__main__":
mcp.run()