Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/

Open Finance de próxima generación: portabilidad del crédito

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

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.

Figura 1: diagrama de proceso

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.

Esta demo muestra cuatro capacidades fundamentales donde MongoDB Atlas y la IA agentic impulsan flujos de trabajo seguros e inteligentes de Open Finance.

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:

  1. Colección de consentimientos (encrypted_consents en el backend de Open Finance), con cuatro campos cifrados:

    • Consumer.UserName

    • Consumer.UserId

    • Permissions

    • SourceInstitution.InstitutionName

    El campo Consumer.UserName admite 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.

  2. Colección de perfiles de agentes (encrypted_agent_profiles en 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.

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.

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 buscar

  • aggregatepara realizar cálculos

  • Collection-schema: utilizar para el descubrimiento.

No es necesario contar con un código de herramienta personalizado por colección.

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.

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.

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)

1
  • Crea un proyecto y un clúster en MongoDB Atlas.

  • Cree las dos bases de datos utilizadas en esta demostración: una para los datos internos de Leafy Bank y otra para los datos externos de Open Finance.

2
  • Llena las colecciones descritas en el documento de planificación y en el README.

  • Cargar clientes y transacciones de muestra para ejecutar los flujos de referencia de principio a fin.

3
  • Despliega la aplicación open-finance-next-gen FastAPI (de forma local o en el entorno de ejecución de tu preferencia).

  • Configura las variables de entorno para la conexión a MongoDB, la seguridad y cualquier indicadores de funcionalidad documentado en el repositorio.

4

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)

1
  • Implementa el backend multiagente basado en LangGraph desde el repositorio de chatbots.

  • Configure el proveedor de LLM (por ejemplo, Claude a través de Amazon Bedrock), el cliente HTTP y la conexión de MongoDB para el seguimiento del estado de la conversación.

2

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.

3
  • 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.

4

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.

  • 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.

  • Saul Calderon

  • Kiran Tulsulkar

  • Ainhoa Múgica

  • Andrea Alaman Calderon

  • Daniel Jamir

  • Orquestación de pagos con IA agéntica

  • Mitigación de delitos financieros con MongoDB Atlas

Volver

Inteligencia de documentos con Agentic IA

En esta página