We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pgallar/iol-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
from typing import Dict, Any, List, Optional
from fastmcp import FastMCP
from pydantic import BaseModel, Field, field_validator, ConfigDict
from ..base_routes import BaseRoutes
from .client import MiCuentaClient
class CuentaModel(BaseModel):
"""Modelo para representar una cuenta según el esquema EstadoCuentaModel"""
# Aquí se definirían los campos específicos de CuentaModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class EstadisticaModel(BaseModel):
"""Modelo para representar una estadística según el esquema EstadoCuentaModel"""
# Aquí se definirían los campos específicos de EstadisticaModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class EstadoCuentaModel(BaseModel):
"""Modelo para representar el estado de cuenta según el swagger"""
cuentas: Optional[List[CuentaModel]] = Field(default=None, description="Lista de cuentas del usuario")
estadisticas: Optional[List[EstadisticaModel]] = Field(default=None, description="Lista de estadísticas de la cuenta")
totalEnPesos: Optional[float] = Field(default=None, description="Total en pesos")
model_config = ConfigDict(extra="ignore", validate_assignment=True)
@field_validator('*', mode='before')
@classmethod
def empty_str_to_none(cls, v):
if v == "":
return None
return v
class PortafolioModel(BaseModel):
"""Modelo para representar el portafolio según el swagger"""
# Aquí se definirían los campos específicos de PortafolioModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class OperacionDetalleModel(BaseModel):
"""Modelo para representar el detalle de una operación según el swagger"""
# Aquí se definirían los campos específicos de OperacionDetalleModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class ResponseModel(BaseModel):
"""Modelo para representar la respuesta de cancelación según el swagger"""
# Aquí se definirían los campos específicos de ResponseModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class OperacionModel(BaseModel):
"""Modelo para representar una operación según el swagger"""
# Aquí se definirían los campos específicos de OperacionModel
# pero no se proporcionan en la especificación del swagger
model_config = ConfigDict(extra="ignore", validate_assignment=True)
class MiCuentaRoutes(BaseRoutes):
def __init__(self):
super().__init__()
self.client = MiCuentaClient()
def register_tools(self, mcp: FastMCP):
@mcp.tool(
name="obtener_estado_cuenta",
description="Obtener estado de cuenta del usuario",
tags=["mi_cuenta", "estado"]
)
async def obtener_estado_cuenta() -> Dict[str, Any]:
"""
Obtiene el estado de cuenta del usuario
Returns:
Dict[str, Any]: Objeto con información de cuentas, estadísticas y total en pesos
"""
try:
result = await self.client.obtener_estado_cuenta()
return {
"success": True,
"result": result
}
except Exception as e:
return {"error": f"Error obteniendo estado de cuenta: {str(e)}"}
@mcp.tool(
name="obtener_portafolio",
description="Obtener portafolio del usuario para un país específico",
tags=["mi_cuenta", "portafolio"]
)
async def obtener_portafolio(
pais: str = Field(description="País del portafolio", enum=["argentina", "estados_unidos"])
) -> Dict[str, Any]:
"""
Obtiene el portafolio del usuario para un país específico
Args:
pais: País del portafolio (argentina, estados_unidos)
Returns:
Dict[str, Any]: Objeto con la información del portafolio
"""
try:
result = await self.client.obtener_portafolio(pais=pais)
return {
"success": True,
"result": result
}
except Exception as e:
return {"error": f"Error obteniendo portafolio: {str(e)}"}
@mcp.tool(
name="obtener_operacion",
description="Obtener detalle de una operación específica",
tags=["mi_cuenta", "operaciones"]
)
async def obtener_operacion(
numero: int = Field(description="Número de la operación")
) -> Dict[str, Any]:
"""
Obtiene el detalle de una operación específica
Args:
numero: Número de la operación
Returns:
Dict[str, Any]: Objeto con el detalle de la operación
"""
try:
result = await self.client.obtener_operacion(numero=numero)
return {
"success": True,
"result": result
}
except Exception as e:
return {"error": f"Error obteniendo operación: {str(e)}"}
@mcp.tool(
name="cancelar_operacion",
description="Cancelar una operación específica",
tags=["mi_cuenta", "operaciones", "cancelar"]
)
async def cancelar_operacion(
numero: int = Field(description="Número de la operación a cancelar")
) -> Dict[str, Any]:
"""
Cancela una operación específica
Args:
numero: Número de la operación a cancelar
Returns:
Dict[str, Any]: Objeto con el resultado de la cancelación
"""
try:
result = await self.client.cancelar_operacion(numero=numero)
return {
"success": True,
"result": result
}
except Exception as e:
return {"error": f"Error cancelando operación: {str(e)}"}
@mcp.tool(
name="obtener_operaciones",
description="Obtener operaciones del usuario según filtros",
tags=["mi_cuenta", "operaciones", "filtros"]
)
async def obtener_operaciones(
numero: Optional[int] = Field(default=None, description="Número de operación para filtrar"),
estado: Optional[str] = Field(default=None, description="Estado de las operaciones", enum=["todas", "pendientes", "terminadas", "canceladas"]),
fecha_desde: Optional[str] = Field(default=None, description="Fecha desde en formato ISO (YYYY-MM-DD)"),
fecha_hasta: Optional[str] = Field(default=None, description="Fecha hasta en formato ISO (YYYY-MM-DD)"),
pais: Optional[str] = Field(default=None, description="País de las operaciones", enum=["argentina", "estados_unidos"])
) -> Dict[str, Any]:
"""
Obtiene las operaciones del usuario según los filtros especificados
Args:
numero: Número de operación para filtrar
estado: Estado de las operaciones (todas, pendientes, terminadas, canceladas)
fecha_desde: Fecha desde en formato ISO
fecha_hasta: Fecha hasta en formato ISO
pais: País de las operaciones (argentina, estados_unidos)
Returns:
Dict[str, Any]: Lista de objetos con las operaciones
"""
try:
result = await self.client.obtener_operaciones(
numero=numero,
estado=estado,
fecha_desde=fecha_desde,
fecha_hasta=fecha_hasta,
pais=pais
)
return {
"success": True,
"result": result
}
except Exception as e:
return {"error": f"Error obteniendo operaciones: {str(e)}"}