Construa ecossistemas de financiamento aberto prontos para o futuro usando o MongoDB Atlas e a IA de agentes para realizar viagens de consenso e compartilhamento de dados para portabilidade de crédito.
Casos de uso: Inteligência artificial, Visualização única, Personalização
Setores: Serviços financeiros
Produtos e ferramentas: MongoDB Vector Search, Servidor MongoDB MCP, MongoDB Queryable Encryption
Parceiros: LangChain
Visão Geral da Solução
Essa solução apresenta um ecossistema de financiamento aberto e demonstra como compartilhar dados financeiros com segurança entre organizações usando o MongoDB Atlas e a IA de agentes.
Saiba como implementar uma framework de IA por agentes com a LangGraph para simplificar a aprovação por consenso e melhorar as oferecimentos financeiros para a portabilidade de crédito. O MongoDB Atlas serve como a camada de dados operacionais que sustenta essas arquiteturas de financiamento aberto.
Arquiteturas de referência
figura 1. Diagrama de processo
Como mostra o diagrama, o processo começa quando o cliente se conecta ao Leafy Banco (nossa instituição financeira fictícia). O cliente concede ou nega o autorização para acessar dados externos — dados de fornecedores terceirizados (TPP) ou outros dados de bancos e bancos (nesta demonstração: Banco MongoDB , GeoFinance e Banco verde).
Um fluxo de trabalho de vários agentes recebe a solicitação do cliente e executa as seguintes tarefas:
Agente Supervisor: Lê a conversa e encaminha cada solicitação para o especialista correto.
Agente de anuência: Guia os clientes sobre o consenso seguro do compartilhamento de dados com bancos externos. Ele lida com a seleção da instituição, a criação do autorização, o login no banco, a aprovação explícita do cliente e a revogação.
Agente de Portabilidade: Analisa dados externos do banco para produzir pontuações de gastos, avaliações de crédito e ofertas determinísticas de portabilidade de crédito que mostram potencial de economia.
Agente do Leafy Banco: Responde a perguntas específicas sobre as contas, transações e produtos do cliente do Banco de Dados consultando o MongoDB diretamente por meio do servidor MCP.
Principais funcionalidades
Esta demonstração mostra quatro funcionalidades principais em que o MongoDB Atlas e a IA de agentes alimentam fluxos de trabalho abertos e seguros.
Queryable Encryption para consenso e privacidade do agente
O armazenamento de registros de consenso em texto simples expõe campos confidenciais a administradores de banco de dados , processos de backup e possíveis violações. Para evitar esses riscos, os regulamentos do Open Finance exigem que as organizações protejam a identidade do consumidor em cada evento do ciclo de vida do consenso : criação, autorização, recuperação de dados e revogação. A criptografia em descanso também protege as configurações do agente de IA — como prompts do sistema e definições de ferramentas — para limitar a exposição da lógica exclusiva.
A Queryable Encryption resolve esse problema criptografando campos sensíveis no nível do driver, garantindo que o servidor nunca veja o texto simples. Os campos que precisam de filtragem podem ser configurados para queries de igualdade. O driver criptografa o valor da query antes de enviá-lo, para que o servidor corresponda ao texto cifrado sem nunca ver o texto simples. Os campos que exigem apenas leitura após descriptografia permanecem criptografados sem suporte a consulta.
A demonstração aplica Queryable Encryption em dois locais:
Coleção de permissões (
encrypted_consentsno backend do Open Finance), com quatro campos criptografados:Consumer.UserNameConsumer.UserIdPermissionsSourceInstitution.InstitutionName
O campo
Consumer.UserNamesuporta query de igualdade para que os serviços possam listar os autorização de um cliente sem que o banco de dados veja o nome de usuário em texto simples.Coleção de perfil de agente (
encrypted_agent_profilesno backend do chatbot), com três campos criptografados:agent_name(pedido de igualdade)system_prompttool_config
Os prompts do agente são carregados do MongoDB criptografado no tempo de execução. A Queryable Encryption gera uma chave de criptografia de dados) separada para cada campo. Ele oferece suporte ao AWS Key Management Service (KMS), Azure Key Vault e Google Cloud KMS como provedores de gerenciamento de chaves. O exemplo a seguir mostra a configuração da conexão criptografada para o backend do OpenFinance:
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)
As queries de consenso funcionam de forma idêntica ao texto simples – o driver lida com a criptografia e a descriptografia de forma 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}))
A conexão criptografada estende o padrão MongoDBConnection, portanto, cada serviço que digita a classe base a aceita sem modificação.
Classificação inteligente de transações com o MongoDB Atlas pesquisa vetorial
Quando um consumidor compartilha dados bancários externos por meio de um consenso, os registros de transações chegam sem categorias comerciais padronizadas. Strings brutas de fornecedores, como "Restaurante Nobu" ou "UBER TRIP", não contêm metadados de categoria. Sem classificação, a análise de gastos e a pontuação de crédito não podem funcionar.
O Atlas pesquisa vetorial classifica essas transações combinando descrições dos fornecedores com uma coleção de referência de 49 Códigos de categoria de fornecedores (MCC). A demonstração usa o modelo de incorporação voyage-finance-2 da Voyage IA — criado especificamente para textos financeiros — para gerar vetores de dimensão 1024para os dados de referência da MCC e as descrições de transações recebidas.
O exemplo a seguir mostra o pipeline de classificação de pesquisa vetorial:
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
Os documentos de referência da MCC são incorporados no momento da semente com input_type="document", enquanto as queries de transação usam input_type="query", seguindo a prática recomendada de incorporação assimétrica da Voyage IA para volumes de trabalho de recuperação.
A classificação é efêmera — os resultados são retornados ao agente , mas nunca persistem. Os dados bancários externos são pegados por meio de autorização, e não de propriedade. O agente de portabilidade usa transações classificadas para calcular pontuações de gastos, compará-las com os benchmarks de melhores práticas e gerar ofertas determinísticas de portabilidade de crédito.
Acesso aos dados do Agentic com o servidor do MongoDB MCP
Consultores financeiros e consumidores geralmente precisam de respostas ad-hoc sobre dados da conta: "Qual é o meu saldo total?", "Mostrar minhas últimas 10 transações" ou "Para quais produtos me qualifiquei?". Criar pontos de extremidade de API personalizados para cada query possível não é prático.
O servidor MongoDB MCP expõe coleções MongoDB como ferramentas que os agentes LLM podem invocar diretamente. A demonstração inicia o servidor MCP como um subprocesso na inicialização do aplicativo, conecta-o ao banco de dados leafy_bank no modo somente leitura e passa as ferramentas resultantes para um agente LangGraph por meio de uma sessão persistente.
O exemplo a seguir mostra a integração do 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]
O agente do banco rolante recebe essas ferramentas filtradas mais uma ferramenta get_current_user_id que lê o identificador do cliente autenticado a partir da configuração do LangGraph. Ele responde a perguntas de linguagem natural gerando queries MongoDB autoticamente — o agente pode executar as seguintes ações:
find: use para pesquisasaggregate: usar para cálculosCollection-schema: use para descoberta.
Nenhum código de ferramenta personalizada é necessário por coleção.
Orquestração de vários agentes com LangGraph
Os fluxos de trabalho de financiamento aberto abrangem domínios distintos: gerenciamento de consenso, análise financeira e consultas internas de dados bancários. Um único agente monocrítico para lidar com os três precisaria de um grande conjunto de ferramentas e um prompt de sistema que abrangesse preocupações conflitantes. A divisão em agentes especializados mantém cada conjunto de ferramentas pequeno e cada prompt focado.
Um agente Supervisor coordena três especialistas:
Agente de consenso: gerencia fluxos de compartilhamento de dados
Agente de Portabilidade: Analisa dados externos para ofertas de crédito
Leafy Banco agente: Consulta dados do Leafy Banco através do servidor MCP.
O LangGraph encaminha cada mensagem do cliente para o especialista apropriado com base na intenção, e o MongoDB Atlas persiste o estado de conversa por meio de coleções de checkpoint .
O exemplo a seguir mostra o roteamento do Supervisor com saída estruturada:
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))
Fluxos de trabalho regulamentados – aprovações de consenso, revisões de KYC, autorizações de pagamento – exigem checkpoints humanos nos quais um agente deve fazer uma pausa e aguardar uma decisão antes de prosseguir. O mecanismo interrupt() do LangGraph lida com esse requisito serializando o estado completo do grafo para o MongoDB e retornando uma carga útil para o chamador. O fluxo de trabalho é retomado quando o processo externo é concluído:
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)
As collections de checkpoint do MongoDB Atlas persistem o estado completo da conversa:
Histórico de mensagens
Consensos ativos
Decisões de roteamento
O fluxo de trabalho sobrevive a interrupções nos últimos segundos (um clique de botão) ou horas (uma revisão de conformidade durante a noite). Cada subagente executa um loop ReAct (motivo → agir → observar) até produzir uma resposta final e, em seguida, retornar o controle ao agente Supervisor para a próxima decisão de roteamento.
Abordagem do modelo de dados
A demonstração utiliza dois bancos de dados MongoDB Atlas :
leafy_bank: armazena os dados da própria instituição, como contas de cliente , histórico de transações, produtos de crédito e as regras de subscrição que impulsionam as ofertas de portabilidade. Ele também contém referências de código MCC e benchmarks de gastos que o agente de portabilidade usa para classificação.open_finance: Armazena dados obtidos por meio de consenso, como contas externas, créditos, transações e histórico de pagamentos de Instituições parceiras. Os próprios termos residem aqui em uma coleção criptografada. Uma coleção de entidades separada registra os bancos externos disponíveis.
Veja a seguir exemplos de documentos nas coleções:
accounts(leafy_banco):{ "_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_financiamento){ "_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" } } ] }
Visite os repositórios do GitHub na próxima seção para explorar dados de amostra de todas as coleções na solução.
Construir a solução
Para construir esta solução, implemente dois serviços coordenados:
Para a implementação completa, siga as instruções nos repositórios GitHub correspondentes.
1Parte: backend do Open Cloud (repositório do GitHub)
Exponha APIs de financiamento aberto
Implemente e verifique os pontos de extremidade seguros para as seguintes tarefas:
Gerenciar autorização: crie, aprove, revogue e liste autorização para um cliente.
Buscar dados de cliente externos: recupere contas, créditos, histórico de pagamentos, identificação e transações filtradas por escopo de autorização.
Calcule dados: determine saldos, totais de dividas e ofertas de portabilidade de crédito usando pipelines de agregação .
Classifique transações e categorias do MCC utilizando o Atlas pesquisa vetorial.
Configure índices, políticas de TTL e restrições exclusivas, conforme descrito no README, para suportar a expiração do autorização, o desempenho e a integridade dos dados.
Parte 2: backend do chatbot agente (repositório do GitHub)
Configurar o superior e os agentes secundários
Implemente o padrão do Supervisor para que ele roteie as mensagens do cliente para o agente correto. Configure os três agentes para executar as seguintes tarefas:
Agente de consenso: liste organizações, crie consensos, trigger o login do banco externo e aprove ou revogue o compartilhamento de dados.
Agente de portabilidade Ligue para as APIs Open Cloud e Leafy Banco para análise de gastos, avaliação de portabilidade de crédito e cálculos de posição financeira consolidada.
Agente do Leafy Banco: Responda a perguntas específicas sobre os dados do Banco de Dados do cliente consultando o MongoDB por meio do servidor MCP. O agente resolve a identidade do cliente autenticado da configuração da sessão e consulta seis coleções somente para leitura: contas, transações internas, usuários, produtos, pontuações de departamento de crédito e práticas recomendadas de gastos.
Registre todas as ferramentas definidas no repositório para que cada agente possa chamar os pontos de extremidade de backend correspondentes.
Exponha a API do chatbot
Forneça um ponto de extremidade de chat (por exemplo, FastAPI com eventos enviados pelo servidor) que um frontend da Web ou de um dispositivo móvel possa chamar.
Certifique-se de que o ponto de extremidade transmita mensagens intermediárias e lida com interrupções do LangGraph para login do banco e aprovação de autorização.
Conecte ambos os serviços de ponta a ponta
Aponte o backend do chatbot para o URL base do backend do OpenFinance em execução . Execute os cenários de referência a partir dos arquivos README:
Compare um crédito de banco externo com uma oferta de portabilidade do Leafy Banco.
Gerando uma pontuação de gastos usando a classificação baseada em MCC e a Pesquisa Vetorial do Atlas.
Validar esse MongoDB Atlas:
Persiste dados operacionais
agregação de energia e cargas de trabalho vetoriais
Suporta todo o consenso do agente e a viagem de conselhos
Para obter comandos de configuração passo a passo, variáveis de ambiente e detalhes da API, siga as instruções no arquivo README de cada repositório.
Principais Aprendizados
Unifique dados financeiros abertos no MongoDB Atlas: Unifique conjuntos de dados internos e externos no MongoDB Atlas como sua camada de dados operacional para reduzir a complexidade e a duplicação da integração.
Simplifique a análise com pipelines de agregação: use os pipelines de agregação do MongoDB para calcular saldos, totais de dividas, economia de portabilidade e pontuações de gastos em contas internas e externas em um único caminho de query.
Proteja dados de consenso confidenciais com a Queryable Encryption do MongoDB: aplique a Queryable Encryption aos atributos de consenso para que possa executar a query em campos confidenciais e, ao mesmo tempo, manter fortes controles de privacidade para cargas de trabalho de financiamento aberto regulamentadas.
Simplifique as viagens de consenso com a IA de agentes: integre um chatbot multiagente baseado em LangGraph para explicar o escopo, a duração e a finalidade do consenso em linguagem natural, reduzindo o abandono nos fluxos multibancos e melhorando a experiência do cliente.
Alinhe as estruturas de dados com as práticas recomendadas da ISO 20022 : modele transações externas usando campos e códigos parecidos com a ISO 20022para padronizar os dados entre as organizações sem criar esquemas profundamente aninhados.
Autores
Saul Calderon
Kiran Tulsulkar
Ainhoa Múgica
Andrea Alaman Calderon
David Jamir