Cree ecosistemas de Open Finance preparados para el futuro utilizando MongoDB Atlas y IA agentica para potenciar los viajes de consentimiento y el uso compartido de datos para la portabilidad de crédito.
caso de uso: Inteligencia artificial, Visión única, Personalización
Industrias: Servicios financieros
Productos y herramientas: MongoDB Vector Search, Servidor MCP de MongoDB, MongoDB Queryable Encryption
emparejar: LangChain
Descripción general de la solución
Esta solución presenta un ecosistema de finanzas abiertas y demuestra cómo compartir de manera segura datos financieros entre instituciones utilizando MongoDB Atlas e IA agentica.
Aprende a implementar un marco de IA agentica con LangGraph para agilizar la aprobación del consentimiento y mejorar las ofertas financieras para la portabilidad del crédito . MongoDB Atlas sirve como la capa de datos operativos que sustenta estas arquitecturas de finanzas abiertas.
Arquitecturas de Referencia
Figura 1. Diagrama de proceso
Como muestra el diagrama, el proceso comienza cuando el cliente inicia sesión en Leafy Bank (nuestra institución financiera ficticia). El cliente otorga o deniega el consentimiento para acceder a datos externos: datos del proveedor externo (TPP) u otros datos de instituciones financieras (en esta demostración: MongoDB Bank, NeoFinance y Green Bank).
Un flujo de trabajo multiagente recibe la solicitud del cliente y realiza las siguientes tareas:
Supervisor Agent: Lee la conversación y redirige cada solicitud al especialista correcto.
Agente de consentimiento: Guía a los clientes a través del consentimiento seguro para compartir datos con bancos externos. Gestiona la selección de instituciones, la creación de consentimientos, el inicio de sesión bancario, la aprobación explícita por parte del cliente y la revocación.
Agente de portabilidad: Analiza datos bancarios externos para producir calificaciones de gasto, evaluaciones de crédito y ofertas determinísticas de portabilidad de préstamos que muestran los ahorros potenciales.
Leafy Bank Agent: Responde a preguntas ad hoc sobre las cuentas, transacciones y productos de los clientes de Leafy Bank consultando MongoDB directamente a través del servidor MCP.
Capacidades básicas
Esta demo muestra cuatro capacidades fundamentales donde MongoDB Atlas y la IA agentic impulsan flujos de trabajo seguros e inteligentes de Open Finance.
Queryable Encryption para la Privacidad del Consentimiento y del Agente
Almacenar registros de consentimiento en texto plano expone campos sensibles a los administradores de bases de datos, a los procesos de copia de seguridad y a posibles incumplimientos. Para prevenir estos riesgos, las regulaciones de Open Finance exigen que las instituciones protejan la identidad del consumidor en cada evento del ciclo de vida del consentimiento: creación, autorización, recuperación de datos y revocación. El cifrado en reposo también protege las configuraciones de los agentes de IA—como los indicaciones del sistema y las definiciones de herramientas—para limitar la exposición de la lógica propietaria.
MongoDB Queryable Encryption resuelve este problema al cifrar los campos sensibles a nivel del driver, garantizando que el servidor nunca vea el texto en claro. Los campos que necesitan filtro se pueden configurar para queries de igualdad. El driver cifra el valor de la query antes de enviarlo, por lo que el servidor coincide con el texto cifrado sin ver nunca el texto en claro. Los campos que solo requieren lectura después de descifrar permanecen cifrados sin soporte de query.
La demostración aplica Queryable Encryption en dos lugares:
Colección de consentimientos (
encrypted_consentsen el backend de Open Finance), con cuatro campos cifrados:Consumer.UserNameConsumer.UserIdPermissionsSourceInstitution.InstitutionName
El campo
Consumer.UserNameadmite consultas de igualdad para que los servicios puedan listar los consentimientos de un cliente sin que la base de datos vea nunca el nombre de usuario en texto sin formato.Colección de perfiles de agentes (
encrypted_agent_profilesen el backend del chatbot), con tres campos cifrados:agent_name(consultable por igualdad)system_prompttool_config
Los mensajes del agente se cargan desde MongoDB encriptada durante la ejecución. Queryable Encryption genera una llave de cifrado de datos diferente para cada campo. Admite AWS Key Management Service (KMS), Azure Key Vault y Google Cloud KMS como proveedores de gestión de claves. El siguiente ejemplo muestra la configuración de la conexión cifrada para el backend de Open Finance:
from pymongo import MongoClient from pymongo.encryption_options import AutoEncryptionOpts class EncryptedMongoDBConnection(MongoDBConnection): """Subclasses the standard connection — services that type-hint MongoDBConnection accept it without modification.""" def __init__(self, uri: str, auto_encryption_opts: AutoEncryptionOpts): self.uri = uri self.client = MongoClient(self.uri, auto_encryption_opts=auto_encryption_opts)
Las consultas de consentimiento funcionan de manera idéntica a texto sin formato: el controlador gestiona el cifrado y descifrado de manera transparente:
# Standard query on a plaintext field — works as usual consent = consents_collection.find_one({"ConsentId": consent_id}) # Equality query on an encrypted field — same syntax, driver encrypts the filter value consents = list(consents_collection.find({"Consumer.UserName": user_name}))
La conexión cifrada amplía el MongoDBConnection estándar, por lo que todos los servicios que insinúan el tipo de la clase base la aceptan sin modificaciones.
Clasificación inteligente de transacciones con MongoDB Atlas búsqueda vectorial
Cuando un consumidor comparte datos externos del banco mediante un consentimiento, los registros de transacciones llegan sin categorías estandarizadas de comerciantes. Las cadenas sin procesar de comerciantes como "Nobu Restaurant" o "UBER TRIP" no llevan metadatos de categoría. Sin clasificación, no se puede realizar el análisis de gastos ni la puntuación de crédito.
La Búsqueda Vectorial Atlas clasifica estas transacciones comparando las descripciones de los comercios con una colección de referencia de 49 Códigos de Categoría de Comerciantes (MCC). La demo utiliza el modelo embedding voyage-finance-2 de Voyage IA—diseñado específicamente para texto financiero—para generar vectores somer 1024- dimensiones tanto para los datos de referencia MCC como para las descripciones de transacciones entrantes.
El siguiente ejemplo muestra el pipeline de clasificación de búsqueda vectorial:
class MCCClassificationService: def __init__(self, connection, db_name, collection_name): self.collection = connection.get_collection(db_name, collection_name) self.vo = voyageai.Client() self.model = "voyage-finance-2" def classify_batch(self, transactions): # Build query text from merchant name + description query_texts = [ self._build_query_text(txn.get("merchant_name", ""), txn.get("description", "")) for txn in transactions ] # Single batch embedding call — input_type="query" for search queries embed_result = self.vo.embed(query_texts, model=self.model, input_type="query") # Vector search each embedding against MCC reference codes for txn, embedding in zip(transactions, embed_result.embeddings): match = self._vector_search(embedding) if match: txn.update({ "MCC": match["MCC"], "CategoryName": match["CategoryName"], "confidence": round(match["score"], 4), }) def _vector_search(self, query_embedding, num_candidates=20, limit=1): pipeline = [ {"$vectorSearch": { "index": "mcc_codes_vector_index", "path": "embedding", "queryVector": query_embedding, "numCandidates": num_candidates, "limit": limit, }}, {"$project": { "MCC": 1, "MCCDescription": 1, "CategoryId": 1, "CategoryName": 1, "score": {"$meta": "vectorSearchScore"}, "_id": 0, }}, ] results = list(self.collection.aggregate(pipeline)) return results[0] if results else None
Los documentos de referencia de MCC se incrustan en el momento de la creación con input_type="document", mientras que las queries de transacciones usan input_type="query", siguiendo la mejor práctica de incrustación asimétrica de Voyage IA para cargas de trabajo de recuperación.
La clasificación es efímera: los resultados se devuelven al agente pero nunca se almacenan de forma permanente. Los datos bancarios externos se toman prestados mediante consentimiento, no se poseen. El agente de portabilidad utiliza transacciones clasificadas para calcular puntuaciones de gastos, compararlas con puntos de referencia de mejores prácticas y generar ofertas deterministas de portabilidad de préstamos.
Acceso a los datos agente con el servidor MongoDB MCP
Los asesores financieros y los consumidores suelen necesitar respuestas puntuales sobre los datos de las cuentas: "¿Cuál es mi saldo total?", "Mostrar mis últimas 10 transacciones", o "¿Para cuáles productos califico?". Crear endpoints API personalizados para cada posible query no es práctico.
El servidor MongoDB MCP expone las colecciones de MongoDB como herramientas que los agentes LLM pueden invocar directamente. La demo lanza el servidor MCP como un subproceso al iniciar la aplicación, lo conecta a la base de datos leafy_bank en modo de solo lectura y pasa las herramientas resultantes a un agente LangGraph a través de una sesión persistente.
El siguiente ejemplo muestra la integración del servidor MCP:
from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_mcp_adapters.tools import load_mcp_tools mcp_client = MultiServerMCPClient({ "mongodb": { "command": "npx", "args": ["-y", "mongodb-mcp-server@latest"], "transport": "stdio", "env": { **os.environ, "MDB_MCP_CONNECTION_STRING": LEAFY_BANK_MONGODB_URI, "MDB_MCP_READ_ONLY": "true", "MDB_MCP_DISABLED_TOOLS": disabled_tools, }, } }) # Persistent session keeps MongoDB connection state across tool calls async with mcp_client.session("mongodb") as session: all_mcp_tools = await load_mcp_tools(session) # Pre-connect so the agent never handles connection strings connect_tool = next((t for t in all_mcp_tools if t.name == "connect"), None) if connect_tool: await connect_tool.ainvoke({"connectionString": LEAFY_BANK_MONGODB_URI}) # Only expose read/query tools to the agent allowed_tools = {"find", "aggregate", "count", "list-collections", "collection-schema"} mcp_tools = [t for t in all_mcp_tools if t.name in allowed_tools]
El agente bancario de Leafy recibe estas herramientas filtradas más una herramienta get_current_user_id que lee el identificador del cliente autenticado a partir de la configuración de LangGraph. Responde a preguntas en lenguaje natural generando consultas MongoDB de manera autónoma—el agente puede realizar las siguientes acciones:
findpara buscaraggregatepara realizar cálculosCollection-schema: utilizar para el descubrimiento.
No es necesario contar con un código de herramienta personalizado por colección.
Orquestación multiagente con LangGraph
Los flujos de trabajo de Open Finance abarcan dominios distintos: gestión del consentimiento, análisis financiero y consultas de datos internas del banco. Un solo agente monolítico que maneje los tres necesitaría un amplio conjunto de herramientas y una solicitud para el sistema que aborde preocupaciones conflictivas. Dividir en agentes especializados mantiene cada conjunto de herramientas pequeño y cada prompt enfocado.
Un agente supervisor orquesta a tres especialistas:
Agente de consentimiento: gestiona los flujos de uso compartido de datos
Agente de portabilidad: analiza datos externos para ofertas de préstamos
Leafy Bank Agente: Consulta los datos de Leafy Bank a través del servidor MCP.
LangGraph dirige cada mensaje del cliente al especialista adecuado según la intención, y MongoDB Atlas conserva el estado de la conversación a través de colecciones de puntos de control.
El siguiente ejemplo muestra el enrutamiento de supervisores con salida estructurada:
from langgraph.graph import StateGraph, START, END class RouterDecision(BaseModel): next: Literal["consent_agent", "portability_agent", "internal_data_agent", "FINISH"] response: str = "" workflow = StateGraph(AgentState) workflow.add_node("supervisor", supervisor) workflow.add_node("consent_agent", consent_agent) workflow.add_node("portability_agent", portability_agent) workflow.add_node("internal_data_agent", internal_data_agent) workflow.add_edge(START, "supervisor") workflow.add_conditional_edges("supervisor", route_from_supervisor, { "consent_agent": "consent_agent", "portability_agent": "portability_agent", "internal_data_agent": "internal_data_agent", "FINISH": END, }) workflow.add_edge("consent_agent", "supervisor") workflow.add_edge("portability_agent", "supervisor") workflow.add_edge("internal_data_agent", "supervisor") graph = workflow.compile(checkpointer=MongoDBSaver(client=db.client, db_name=DATABASE_NAME))
Los flujos de trabajo regulados —aprobaciones de consentimientos, revisiones de KYC, autorizaciones de pago— requieren puntos de control humanos donde el agente debe hacer una pausa y esperar una decisión antes de continuar. El mecanismo interrupt() de LangGraph maneja este requerimiento serializando el estado completo del grafo en MongoDB y devolviendo una carga útil al usuario que llama. El flujo de trabajo se reanuda cuando se completa el proceso externo:
from langgraph.types import interrupt, Command # Agent pauses, returns review payload to the calling application review = interrupt({ "type": "APPROVAL_REQUIRED", "details": approval_details, }) # Application resumes the workflow after the human decision await agent.ainvoke(Command(resume=decision), config)
Las colecciones de puntos de control de MongoDB Atlas conservan todo el estado de la conversación:
Historial de mensajes
Consentimientos activos
Decisiones de enrutamiento
El flujo de trabajo resiste interrupciones que duran segundos (un clic de botón) o incluso horas (una revisión nocturna de cumplimiento). Cada subagente ejecuta un bucle ReAct (razonar → actuar → observar) hasta que genera una respuesta final y luego devuelve el control al agente supervisor para la próxima decisión de enrutamiento.
Enfoque de modelo de datos
La demostración utiliza dos bases de datos de MongoDB Atlas:
leafy_bank: Almacena los datos propios de la institución, como las cuentas de clientes, el historial de transacciones, los productos de préstamos y las reglas de suscripción que impulsan las ofertas de portabilidad. También contiene referencias al código MCC y puntos de referencia de gastos que el agente de portabilidad utiliza para la clasificación.open_financeAlmacena datos obtenidos mediante consentimiento, como cuentas externas, préstamos, transacciones e historial de pagos de instituciones asociadas. Los consentimientos mismos se almacenan aquí en una colección encriptada. Una colección de instituciones separadas registra los bancos externos disponibles.
A continuación se presentan ejemplos de documentos en las colecciones:
accounts(banco_frondoso):{ "_id": { "$oid": "675488b874a6710be0583b3e" }, "AccountNumber": "514624177", "AccountBank": "LeafyBank", "AccountStatus": "Active", "AccountIdentificationType": "AccountNumber", "AccountDate": { "OpeningDate": { "$date": "2024-12-07T17:41:12.710Z" } }, "AccountType": "Savings", "AccountBalance": 3910, "AccountCurrency": "USD", "AccountDescription": "Savings account for fridaklo", "AccountUser": { "UserName": "fridaklo", "UserId": { "$oid": "65a546ae4a8f64e8f88fb89e" } } } encrypted_consents(open_finance){ "_id": { "$oid": "69b444e3090356f30066927f" }, "ConsentId": "urn:greenbank:Cf5b9ff59e06f77", "Status": "CONSUMED", "Consumer": { "UserName": <encrypted data>, "UserId": <encrypted data> }, "Permissions": <encrypted data>, "Purpose": "PERSONAL_LOAN_PORTABILITY", "SourceInstitution": { "InstitutionName": <encrypted data>, "InstitutionId": "679a1001a9711d00a3bb01a1" }, "CreationDateTime": { "$date": "2026-02-05T10:55:30.061Z" }, "ExpirationDateTime": { "$date": "2026-08-04T10:55:30.061Z" }, "StatusUpdateDateTime": { "$date": "2026-02-05T11:13:52.900Z" }, "StatusHistory": [ { "Status": "AWAITING_AUTHORISATION", "DateTime": { "$date": "2026-02-05T10:55:30.061Z" }, "Reason": "Consent created" }, { "Status": "AUTHORISED", "DateTime": { "$date": "2026-02-05T10:56:06.100Z" }, "Reason": "Status changed to AUTHORISED" }, { "Status": "CONSUMED", "DateTime": { "$date": "2026-02-05T11:13:52.900Z" }, "Reason": "Data retrieved successfully" } ], "__safeContent__": [ { "$binary": { "base64": "36UjEj4mfh1fKHren43cLiOy6HVs4/b/g+e6viTwQ9Q=", "subType": "00" } } ] }
Visita los repositorios de GitHub en la siguiente sección para explorar datos de muestra de todas las colecciones de la solución.
Compilar la solución
Para compilar esta solución, implemente dos servicios coordinados:
Para la implementación completa, sigue las instrucciones en los repositorios correspondientes de GitHub.
Parte 1: Backend de Open Finance (Repositorio de GitHub)
Exponer APIs de Open Finance
Implementa y verifica los endpoints seguros para las siguientes tareas:
Gestionar consentimientos: Crear, aprobar, revocar y enumerar consentimientos para un cliente.
Obtener datos externos del cliente: Recuperar cuentas, préstamos, historial de pagos, identificación y transacciones filtrados por alcance del consentimiento.
Calcule los datos: determine los saldos, los totales de deudas y las ofertas de portabilidad de préstamos utilizando pipelines de agregación.
Clasifique las transacciones y las categorías MCC usando Atlas búsqueda vectorial.
Configure índices, políticas de TTL y restricciones de unicidad como se describe en el README para soportar el vencimiento del consentimiento, el desempeño y la integridad de los datos.
Parte 2: Backend de chatbot agente (Repositorio de GitHub)
Configure el supervisor y los agentes secundarios
Implementa el patrón de supervisión para que enrute los mensajes de los clientes al agente correcto. Configura los tres agentes para que realicen las siguientes tareas:
Agente de consentimiento: Lista de instituciones, creación de consentimientos, activación de inicio de sesión externo en bancos y aprobación o revocación del uso compartido de datos.
Portability Agent Llama a las API de Open Finance y Leafy Bank para el análisis de gastos, la evaluación de la portabilidad de préstamos y el cálculo de posiciones financieras consolidadas.
Leafy Bank Agente: Responder a preguntas puntuales sobre los datos del cliente de Leafy Bank consultando MongoDB a través del servidor MCP. El agente resuelve la identidad del cliente autenticado desde la configuración de la sesión y consulta seis colecciones de solo lectura: cuentas, transacciones internas, usuarios, productos, puntajes de la agencia de crédito y mejores prácticas de gasto.
Registra todas las herramientas definidas en el repositorio para que cada agente pueda llamar a los puntos finales de backend correspondientes.
Exponer la API del chatbot
Proporcione un endpoint de chat (por ejemplo, FastAPI con eventos enviados por el servidor) que un frontend web o móvil pueda llamar.
Asegúrese de que el endpoint transmita mensajes intermedios y gestione las interrupciones de LangGraph para el inicio de sesión bancario y la aprobación de consentimientos.
Conecte ambos servicios de extremo a extremo
Dirija el backend del chatbot a la URL base en ejecución del backend Open Finance. Ejecute los escenarios de referencia de los archivos README:
Compara un préstamo bancario externo con una oferta de portabilidad de Leafy Bank.
Generación de un puntaje de gasto utilizando la clasificación basada en MCC y la Búsqueda Vectorial del Atlas.
Valide que MongoDB Atlas:
Permanece en los datos operativos
Powers agregación y cargas de trabajo vectoriales
Apoya la totalidad del proceso de consentimiento y consejo conductor
Para comandos de configuración paso a paso, variables de entorno y detalles de la API, sigue las instrucciones en el archivo README de cada repositorio.
Lecciones clave
Unifica los datos de open finance en MongoDB Atlas: Unifica conjuntos de datos internos y externos en MongoDB Atlas como tu capa de datos operativos para reducir la complejidad de integración y la duplicación.
Simplifica el análisis con canalizaciones de agregación: utiliza las canalizaciones de agregación de MongoDB para calcular saldos, totales de deuda, ahorros de portabilidad y puntuaciones de gastos en cuentas internas y externas en una sola ruta de query.
Proteja los datos de consentimiento sensibles con Queryable Encryption de MongoDB: Aplique Queryable Encryption a los atributos de consentimiento para poder hacer consultas sobre campos sensibles y al mismo tiempo mantener controles de privacidad sólidos para cargas de trabajo reguladas de Open Finance.
Optimizar los recorridos de consentimiento con IA agente: Integra un chatbot de varios agentes basado en LangGraph para explicar el alcance, la duración y el propósito del consentimiento en lenguaje natural, reduciendo el abandono en flujos multibancarios y mejorando la experiencia del cliente.
Alinear las estructuras de datos con las mejores prácticas de ISO 20022 : modela las transacciones externas utilizando campos y códigos inspirados en ISO 20022, para estandarizar los datos entre las instituciones sin sobre-diseñar esquemas profundamente anidados.
Autores
Saul Calderon
Kiran Tulsulkar
Ainhoa Múgica
Andrea Alaman Calderon
Daniel Jamir