<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Author at Infinum</title>
		<atom:link href="https://infinum.com/blog/author/stefan-vodilovski/feed/" rel="self" type="application/rss+xml" />
		<link></link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 24 Apr 2026 14:02:14 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>19278593https://infinum.com/uploads/2026/04/img-hero-infobip-repost-4-1.webp</url>
				</image>
				<title>Building an MCP-Powered Open Banking App Inside ChatGPT</title>
				<link>https://infinum.com/blog/mcp-open-banking-chatgpt/</link>
				<pubDate>Mon, 20 Apr 2026 11:29:44 +0000</pubDate>
				<dc:creator>Branimir Akmadža</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19278593</guid>
				<description>
					<![CDATA[<p>Learn how we built a proof of concept using MCP and PSD2 open banking APIs to let users query balances, transactions, and spending summaries in a conversation inside ChatGPT.</p>
<p>The post <a href="https://infinum.com/blog/mcp-open-banking-chatgpt/">Building an MCP-Powered Open Banking App Inside ChatGPT</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-267"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-93">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-94'
	>
	Financial services are entering a new phase, one where AI doesn’t just analyze data, but securely interacts with regulated financial infrastructure in real time.  </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-98"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-96">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-97'
	>
	At Infinum, we are fully aware of the challenges and considerations involved in connecting a ChatGPT App to live banking data. Using Model Context Protocol (MCP) and PSD2 open banking APIs, we have enabled users to authenticate once and then query balances, transactions, and spending summaries in a conversational manner, all without leaving ChatGPT. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-101"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-99">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-100'
	>
	This post will walk you through the architecture, how authorization works, and how users can retrieve live banking data directly inside Chat GPT. We’re also going to talk about the design decisions and limitations that came up when building it. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-104"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-102">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-103'
	>
	A Glance at the Architecture </h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-107"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-105"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-106">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2026/04/High-level-architecture-1400x852.webp				media='(max-width: 699px)'
				type=image/webp								height="852"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2026/04/High-level-architecture.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1013"
															width="1665"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>	</div>

<div
	class="wrapper"
	data-id="es-108"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			
<figure class="wp-block-table is-style-stripes"><table class="has-fixed-layout"><tbody><tr><td><strong>Component</strong>&nbsp;</td><td><strong>Role</strong>&nbsp;</td></tr><tr><td>Open Banking API provider&nbsp;</td><td>Source of account, balance, and transaction data via PSD2&nbsp;</td></tr><tr><td>Auth server (OAuth 2.1)&nbsp;</td><td>Handles user consent and issues access tokens&nbsp;</td></tr><tr><td>MCP server&nbsp;</td><td>Defines tools, enforces access control, owns the audit trail&nbsp;</td></tr><tr><td>ChatGPT App&nbsp;</td><td>User-facing interface; connects to MCP and auth endpoints&nbsp;</td></tr></tbody></table></figure>
		</div>
	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-111"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-109">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-110'
	>
	The ChatGPT App configuration is deliberately minimal: a public MCP server URL and an OAuth enabled flag. Everything else, auth logic, access control, data scoping, lives server-side in the MCP layer. That separation is a feature, not an oversight, and it shapes how we handle authentication and permissions. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-114"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-112">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-113'
	>
	OAuth and PSD2 Scopes</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-117"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-115">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-116'
	>
	This layer is critical for protecting access to sensitive financial data.&nbsp;To achieve this, we use OAuth 2.1, the industry standard authorization protocol. Once the user successfully authenticates and grants explicit consent, the provider issues a secure access token. This token allows our system to retrieve only the permitted banking data (such as balances or transactions) through the provider’s APIs.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-120"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-118">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-119'
	>
	When&nbsp;initiating&nbsp;the OAuth flow, we explicitly declare which PSD2 permission scopes the token should cover. Depending on the action the user&nbsp;want&nbsp;to make&nbsp;In&nbsp;our implementation, we request only three:&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-123"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-121">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-122'
	>
	<li>Accounts&nbsp;–&nbsp;account metadata (number, currency, institution)&nbsp;</li><li>Balances&nbsp;–&nbsp;current and available balance&nbsp;</li><li>Transactions&nbsp;–&nbsp;transaction history&nbsp;</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-126"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-124">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-125'
	>
	Narrower scopes mean a cleaner consent screen and a smaller blast radius if a token is compromised. This maps directly to&nbsp;the&nbsp;<strong>principle of least privilege</strong>: request only what the feature&nbsp;actually needs.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-129"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-127">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-128'
	>
	90-day re-authentication (PSD2 requirement) </h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-132"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-130">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-131'
	>
	<a href="https://stripe.com/en-de/resources/more/what-is-psd2-here-is-what-businesses-need-to-know" target="_blank" rel="noreferrer noopener">PSD2</a>&nbsp;mandates re-authentication every 90 days. Our implementation satisfies this by design:&nbsp;tokens are short-lived and tied to individual sessions. Users re-authenticate each time they start a new session, which in practice happens far more&nbsp;frequently&nbsp;than every 90 days. No special tracking or forced re-auth flow is needed.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-133">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-134'
	>
	<strong>What happens when a user withholds a scope?</strong>&nbsp;Currently, the&nbsp;initial&nbsp;token grants all three read scopes together. We&nbsp;don’t&nbsp;issue per-resource tokens. If a scope is not granted, we simply&nbsp;don’t&nbsp;return that data. We&nbsp;don’t&nbsp;surface an error or&nbsp;attempt&nbsp;to call the API without permission.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-138"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-136">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-137'
	>
	Taken together, this approach mirrors the security model used by many mobile banking and FinTech applications, where OAuth based authorization ensures that access is controlled, permission-based, and revocable at any time.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-141"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-139">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-140'
	>
	But once a user is authenticated, how does ChatGPT know which banking actions it can perform on their behalf?&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-144"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-142">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-143'
	>
	That’s where the MCP server comes into play. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-147"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-145">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-146'
	>
	MCP Server: Tool Definitions as the Security Boundary</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-150"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-148">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-149'
	>
	This is where access control lives. Every capability the model has is an explicitly defined tool. There is no freeform API access,&nbsp;if a tool for initiating payments&nbsp;doesn’t&nbsp;exist, the model has no mechanism to trigger one. The tool definitions are the boundary.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-153"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-151">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-152'
	>
	We’ve&nbsp;specified a list of actions and what each action does:&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-154">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-155'
	>
	<li>Checking if a user is authenticated&nbsp;</li><li>Listing balance information&nbsp;</li><li>Listing transactions&nbsp;</li><li>Fetching UI components, etc.&nbsp;</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-157">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-158'
	>
	The&nbsp;Auth&nbsp;Check&nbsp;Gate</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-161'
	>
	The `auth-check` tool acts as a gate for all other tools. Before any data-fetching action is invoked, the model is instructed to first verify that the user has an active, valid session. This dependency is structural: in the tool descriptions themselves, we explicitly specify that balance, transaction, and account tools should not be called unless the auth-check has returned a confirmed authenticated state. The model cannot bypass this because it has no alternative path to the data.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-165"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-163">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-164'
	>
	The&nbsp;Audit&nbsp;Trail</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-168"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-166">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-167'
	>
	Every tool invocation is logged at the MCP server level, producing a structured audit trail.&nbsp;&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-171"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-169">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-170'
	>
	Each log entry captures:&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-174"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-172">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-173'
	>
	<li>tool name,&nbsp;</li><li>timestamp,&nbsp;&nbsp;</li><li>input parameters passed by the model,&nbsp;&nbsp;</li><li>response returned.&nbsp;</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-177"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-175">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-176'
	>
	This gives us a complete operational record for debugging and figuring out if the model is calling the right tools.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-180"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-178">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-179'
	>
	The&nbsp;UI&nbsp;Components</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-183"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-181">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-182'
	>
	UI components are served through the MCP layer and have no independent access to provider APIs.&nbsp;UI components are served through the MCP layer and have no independent access to provider APIs. When a&nbsp;component&nbsp;needs user-specific data (a balance card, a transaction list), it receives a pre-fetched payload passed through the tool response that triggered it. The JWT token and granted scopes are held server-side and never&nbsp;forwarded&nbsp;to the&nbsp;component&nbsp;directly. The component&nbsp;renders&nbsp;only what the MCP server explicitly provides.&nbsp;&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-186"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-184">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-185'
	>
	The entire implementation is based on the new <a href="https://developers.openai.com/apps-sdk">Apps</a><a href="https://developers.openai.com/apps-sdk" target="_blank" rel="noreferrer noopener"> SDK</a>.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-188"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-187"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-191"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-189">
	<p	class='typography typography--size-16-text js-typography block-typography__typography'
	data-id='es-190'
	>
	<strong>A note on Infobip’s model</strong></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-194"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-192">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-193'
	>
	The same MCP pattern applies to Infobip’s communication infrastructure, SMS, WhatsApp, RCS, Voice, Viber, 2FA. Each channel is exposed as a dedicated MCP tool with its own scope and constraints. The enforcement mechanism is identical: tools as the boundary, least-privilege by design. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-196"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<hr
	class="block-divider"
	data-id="es-195"
	aria-hidden="true" />	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-199"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-197">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-198'
	>
	Provider Agnosticism</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-202"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-200">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-201'
	>
	One decision worth calling out explicitly: the architecture is Open Banking provider-agnostic.&nbsp;&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-205"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-203">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-204'
	>
	Without an Open Banking API&nbsp;provider&nbsp;the system cannot function. The whole idea is dependent on the providers. All banking information is provided by them, so we need to connect with such a provider and extract the information in a secure way.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-208"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-206">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-207'
	>
	The MCP server communicates with the provider through a standardized PSD2 interface, which means the underlying provider can be swapped without changes to the MCP layer or the ChatGPT App.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-209">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-210'
	>
	In practice, providers vary in how faithfully they implement the PSD2 spec, so some adaptation at the integration layer is expected. But the core architecture has no single-provider dependency baked in. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-212">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-213'
	>
	Dynamic Client Registration (DCR)&nbsp;</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-217"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-215">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-216'
	>
	Since we integrate through a single Open Banking API provider rather than directly with individual bank authorization servers, DCR is handled at the provider level. It’s not something our architecture needs to address directly. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-220"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-218">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-219'
	>
	LLM Limitations Worth Knowing&nbsp;</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-223"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-221">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-222'
	>
	With the architecture in place, there are a few model-level constraints that affect how far the current implementation can stretch.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-226"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-224">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-225'
	>
	<strong>Rapidly changing financial data (exchange rates, stock prices)&nbsp;</strong>&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-229"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-227">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-228'
	>
	The model&nbsp;doesn’t&nbsp;have live financial context by default. The correct approach is a dedicated MCP tool that fetches current data before any function that needs it. We&nbsp;haven’t&nbsp;implemented this yet, but the pattern is straightforward: add a get-market-context tool and instruct the model to call it first.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-230">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-231'
	>
	<strong>Local regulation and terminology outside the training set</strong>&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-233">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-234'
	>
	For the use cases this app targets — consumer-facing, non-specialist — the base model’s training data has been sufficient. For regulated or jurisdiction-specific deployments, a RAG layer or a context-injection tool would be the right extension point.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-236">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-237'
	>
	Keeping Financial Data Out of the LLM Context&nbsp;</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-241"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-239">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-240'
	>
	Beyond model limitations,&nbsp;there’s&nbsp;a broader question about data handling&nbsp;that’s&nbsp;directly relevant to PSD2 compliance.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-244"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-242">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-243'
	>
	We control what we can on our side: MCP tools return lean, structured payloads (not raw API objects), and no financial data is stored server-side beyond the lifetime of the request. What happens inside OpenAI’s platform is governed by their data policies, and those policies vary by account type.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-247"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-245">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-246'
	>
	For any financial use case&nbsp;operating&nbsp;under PSD2, users should access the app through a ChatGPT Team or Enterprise account, or at minimum disable training in their data controls settings.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-250"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-248">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-249'
	>
	The&nbsp;End-Result:&nbsp;Conversational Open Banking&nbsp;</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-253"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-251">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-252'
	>
	Once a user connects their bank account through the OAuth flow, they can interact with their financial data conversationally inside ChatGPT.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-256"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-254">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-255'
	>
	Instead of opening a banking app and navigating through menus, the user can ask:&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-259"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-257">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-258'
	>
	<li>“What’s my current balance?”&nbsp;</li><li>“Show me my last 10 transactions.”&nbsp;</li><li>“How much did I spend on subscriptions this month?”&nbsp;</li><li>“Do I have any incoming payments this week?”&nbsp;</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-262"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-260">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-261'
	>
	The experience feels like messaging a financial assistant who already understands your question and knows where to look. Behind the scenes, everything remains secure and permission-based, but from the user’s perspective, it’s effortless. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-265"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-263">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-264'
	>
	<em>This article was originally published on the <a href="https://www.infobip.com/developers/blog/building-an-mcp-powered-open-banking-app-inside-chatgpt" target="_blank" rel="noreferrer noopener">Infobip Developer Blog</a>. Learn more about Infinum and Infobip’s <a href="https://infinum.com/news/infinum-infobip-partnership/" target="_blank" rel="noreferrer noopener">integration partnership</a>.</em></p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/mcp-open-banking-chatgpt/">Building an MCP-Powered Open Banking App Inside ChatGPT</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
					<item>
				<image>
					<url>19275465https://infinum.com/uploads/2026/02/img-MCP.webp</url>
				</image>
				<title>Why Model Context Protocols (MCP) Will Define the Next Wave of AI-Enabled Businesses</title>
				<link>https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/</link>
				<pubDate>Mon, 23 Feb 2026 15:51:17 +0000</pubDate>
				<dc:creator>Stefan Vodilovski</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=19275465</guid>
				<description>
					<![CDATA[<p>Organizations are adopting AI fast, but the next step is giving models live data and safe ways to act. Model Context Protocols (MCPs) provide that infrastructure—connecting AI to real-time information and verified actions.</p>
<p>The post <a href="https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/">Why Model Context Protocols (MCP) Will Define the Next Wave of AI-Enabled Businesses</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-355"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-268">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-271"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-269">
	<p	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-270'
	>
	For the past two years, most organizations have been consumed by a single, driving question: &#8220;<a href="https://infinum.com/blog/ai-strategy/" id="https://infinum.com/blog/ai-strategy/">How can we leverage AI in our business?</a>&#8221; But as the market matures, the more critical question becomes: &#8220;How can we provide AI with the live context needed to function effectively?&#8221;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-274"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-272">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-273'
	>
	The &#8220;Static Context&#8221; Trap</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-275">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-276'
	>
	There is a typical scenario that an organization lives through in its pursuit of AI utility. In an effort to deliver immediate value, an organization feeds an LLM its Confluence pages and a collection of internal PDFs. The model answers questions accurately, and the implementation feels seamless. Stakeholders are satisfied with the newfound efficiency. The results are an instant success.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-279'
	>
	However, the organization inevitably hits a wall as the reality of a moving business catches up with the static data of the past. If context is not retrieved dynamically, the AI cannot participate in a workflow – it can only summarize old news. This creates a strategic ceiling.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-281">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-282'
	>
	Most AI pilots reach a fatal point when they are too disconnected from the live environment to be trusted with business operations. Failure then spills into customer experience, internal operations, and revenue-impacting workflows. Eventually, it becomes clear that the issue is not the model&#8217;s intelligence but a lack of a live connection to the company.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-284">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-285'
	>
	That’s why the next wave of AI-enabled businesses will be defined by <strong>Model Context Protocols (MCP)</strong>. This critical infrastructure bridges the gap between static reasoning and real-time business reality.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-288"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-287'
	>
	The industry has spent two years fixating on the LLM&#8217;s brain while neglecting the nervous system required to connect it to the enterprise. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-291"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-289">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-290'
	>
	Enter the Model Context Protocol (MCP)</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-292">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-293'
	>
	From a business perspective, model context is not about tokens or prompts. It is about ensuring that AI systems:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-297"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="lists" data-id="es-295">
	<ul	class='typography typography--size-16-text-roman js-typography lists__typography'
	data-id='es-296'
	>
	<li>Know exactly what they are allowed to see.</li><li>Understand who they are acting on behalf of.</li><li>Operate within clear boundaries and policies.</li><li>Access relevant and up-to-date business information.</li><li>Behave consistently across teams, products, and channels.</li></ul></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-300"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-298">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-299'
	>
	This is the foundation of how we approach <a href="https://infinum.com/artificial-intelligence/">AI and data engineering</a> — every system we build is designed from the start with defined access boundaries, governance, and real-time data integration.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-302"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-36-text js-typography block-highlighted-text__typography'
	data-id='es-301'
	>
	A Model Context Protocol is a structured way to define and deliver the knowledge and actions a model can make. This is an operating contract rather than a technical protocol. It provides the AI with a &#8220;source of truth&#8221; that updates in sync with the business.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-305"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-303">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-304'
	>
	From &#8220;Advice&#8221; to &#8220;Action&#8221;</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-308"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-306">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-307'
	>
	The transition from static data to dynamic protocols changes the utility of AI. This is best illustrated by an example emphasizing the difference between an assistant that remembers information and an assistant that knows how to fetch it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-311"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-309">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-310'
	>
	The Static Way: Relying on Memory</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-314"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-312">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-313'
	>
	In a static approach, an organization uploads thousands of PDFs, product manuals, and pricing sheets to a <a href="https://infinum.com/blog/scaling-ai-with-databricks/" id="https://infinum.com/blog/scaling-ai-with-databricks/">vector database</a>. The AI is then prompted to use these documents to answer questions. However, as documents become outdated and regulations evolve, the system begins to fail.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-317"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-315">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-316'
	>
	Consider a customer asking for the current cancellation policy for an enterprise account in Germany. A static AI might reference a 2024 PDF and confidently provide an outdated answer. It has no way to verify whether that policy is still valid or even applies to that specific region. The customer ends up frustrated and exits the chat. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-320"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-318">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-319'
	>
	This forces a human agent to intervene to fix the mistake manually. In this model, the engineering team’s daily workload is consumed by the repetitive task of feeding the model new data snapshots instead of building new capabilities.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-323"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-321">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-322'
	>
	This is one of the core pain points in AI chatbot development — we&#8217;ve documented how <a href="https://infinum.com/blog/ai-chatbot-development-pain-points/" id="https://infinum.com/blog/ai-chatbot-development-pain-points/">knowledge base staleness and hallucination</a> undermine even well-scoped chatbot projects.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-326"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-324">
	<h3	class='typography typography--size-36-text js-typography block-typography__typography'
	data-id='es-325'
	>
	The MCP Way: Relying on Access</h3></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-329"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-327">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-328'
	>
	In the MCP Way, the business defines a standardized context layer. This protocol specifies exactly which tools the model can use and which data sources it can access in real time. Instead of relying on a folder of old files, the AI operates like a user with a live internet connection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-332"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-330">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-331'
	>
	When asked about the same German cancellation policy, the AI identifies the region and customer type. It then uses the protocol to hit the live policy API and the subscription store. It recognizes the most recent &#8220;instant&#8221; policy tag and confirms the customer&#8217;s eligibility. Because it has a secure communication layer, it can provide more than just a text response. It triggers the cancellation through <a href="https://www.infobip.com/docs/mcp">Infobip MCP Servers</a> or another messaging tool.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-335"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-333">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-334'
	>
	This is the jump from an AI that talks to an AI that operates, ensuring that every action is grounded in verified, real-time data. This shift is at the heart of <a href="https://infinum.com/blog/ai-automation/">AI automation</a> — moving beyond smart responses to systems that execute workflows end-to-end. For concrete examples of what this looks like inside enterprise systems, see our work on <a href="https://infinum.com/blog/ai-knowledge-hubs/">AI-powered knowledge hubs</a> across insurance, tech, and procurement.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-338"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-336">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-337'
	>
	The Strategic Shift in Business Architecture</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-341"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-339">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-340'
	>
	The value of structured model context extends beyond improving answers. When context is delivered via a Model Context Protocol, AI systems shift from isolated responders to reliable participants in business processes that operate within defined boundaries, using approved data and actions. Building these systems from the ground up is what our <a href="https://infinum.com/artificial-intelligence/agent-development/">AI agent development services</a> are designed for — from prototype to production in a structured, risk-managed engagement.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-344"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-342">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-343'
	>
	Most importantly, MCPs enable this without hard-coding logic into every application. Whether an organization is building internal tools or integrating with the <a href="https://infinum.com/blog/apps-in-chatgpt-and-the-apps-sdk/">ChatGPT Apps SDK</a>, a robust protocol ensures engineers do not have to rebuild the connection between the brain and the data each time. The organization builds the protocol once, and the AI scales with the business.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-347"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-345">
	<h2	class='typography typography--size-52-default js-typography block-typography__typography'
	data-id='es-346'
	>
	The No-Brainer Approach</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-350"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-348">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-349'
	>
	The industry has spent two years fixating on the LLM&#8217;s brain while neglecting the nervous system required to connect it to the enterprise. Model Context Protocols are the neurons that bridge this gap.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-353"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-typography" data-id="es-351">
	<p	class='typography typography--size-16-text-roman js-typography block-typography__typography'
	data-id='es-352'
	>
	As models commoditize, competitive advantage shifts from raw intelligence to architecture. The winners will not be defined by the size of their LLM budget, but by the sophistication of the nervous system that gives their AI the agency to act. If you&#8217;re ready to build that nervous system, our <strong><a href="https://infinum.com/artificial-intelligence/custom-solutions/">custom AI solutions</a></strong> team designs production-grade AI architectures built around your workflows and data.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/model-context-protocols-mcp-ai-enabled-businesses/">Why Model Context Protocols (MCP) Will Define the Next Wave of AI-Enabled Businesses</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>