<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Toni Babic, Author at ShiftMag</title>
	<atom:link href="https://shiftmag.dev/author/toni-babic/feed/" rel="self" type="application/rss+xml" />
	<link>https://shiftmag.dev/author/toni-babic/</link>
	<description>Insightful engineering content &#38; community</description>
	<lastBuildDate>Tue, 01 Sep 2026 13:59:26 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.3</generator>

<image>
	<url>https://shiftmag.dev/wp-content/uploads/2024/08/cropped-ShiftMag-favicon-32x32.png</url>
	<title>Toni Babic, Author at ShiftMag</title>
	<link>https://shiftmag.dev/author/toni-babic/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>MCPs Aren&#8217;t APIs &#8211; Stop Treating Them Like One</title>
		<link>https://shiftmag.dev/mcps-arent-apis-stop-treating-them-like-one-11420/</link>
		
		<dc:creator><![CDATA[Toni Babic]]></dc:creator>
		<pubDate>Tue, 25 Aug 2026 12:53:55 +0000</pubDate>
				<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[MCP]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=11420</guid>

					<description><![CDATA[<p>We make many mistakes with MCPs, but one of the biggest is treating them like a 1:1 REST API mapping - when in reality, an MCP tool should be a capability, not just another endpoint.</p>
<p>The post <a href="https://shiftmag.dev/mcps-arent-apis-stop-treating-them-like-one-11420/">MCPs Aren&#8217;t APIs &#8211; Stop Treating Them Like One</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img fetchpriority="high" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2026/08/MCPs-arent-APIs-1.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/MCPs-arent-APIs-1.png 1200w, https://shiftmag.dev/wp-content/uploads/2026/08/MCPs-arent-APIs-1-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/MCPs-arent-APIs-1-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/MCPs-arent-APIs-1-768x403.png 768w" sizes="(max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph"><a href="https://shiftmag.dev/tag/mcp/" target="_blank" rel="noreferrer noopener">Model Context Protocol (MCP)</a> extends what your AI agent can do beyond its built-in tools like database access, internal APIs, Confluence, Jira, Bitbucket, and more. You connect your agent to an MCP server, and <strong>it gains new capabilities</strong>.</p>



<p class="wp-block-paragraph">But do you know how much your MCP is actually costing you? Or your users?</p>



<p class="wp-block-paragraph"><strong>Wait, MCP&#8217;s cost money?!​</strong></p>



<figure class="wp-block-image size-full"><img decoding="async" width="932" height="846" src="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.29.40.png?x32039" alt="" class="wp-image-11449" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.29.40.png 932w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.29.40-300x272.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.29.40-768x697.png 768w" sizes="(max-width: 932px) 100vw, 932px" /></figure>



<h2 class="wp-block-heading"><span id="your-mcps-are-eating-your-context-window">Your MCPs are eating your context window</span></h2>



<p class="wp-block-paragraph">Every time you send a request, <strong>your MCP tools and their parameters are loaded into the context window</strong>, before your prompt even gets processed. Unless your agent app supports <strong>tool search</strong> (many don&#8217;t), all tools from all enabled MCP servers are injected into every single request.</p>



<p class="wp-block-paragraph">A real example that happened to me: adding just 2 MCP servers injected <strong>13,000 tokens</strong> into the context. That&#8217;s roughly 9,750 words, or about 16–17 A4 pages of text sent with every. single. request.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="223" src="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.31.16-1024x223.png?x32039" alt="" class="wp-image-11455" srcset="https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.31.16-1024x223.png 1024w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.31.16-300x65.png 300w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.31.16-768x167.png 768w, https://shiftmag.dev/wp-content/uploads/2026/08/Screenshot-2026-08-12-at-12.31.16.png 1930w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">That&#8217;s not free.</p>



<h2 class="wp-block-heading"><span id="a-smaller-purpose-built-toolset-often-works-better">A smaller, purpose-built toolset often works better</span></h2>



<p class="wp-block-paragraph">The sweet spot for an MCP server is <strong>up to 10-15 tools</strong>. Push to keep it lower if you can.</p>



<p class="wp-block-paragraph">Tools aren&#8217;t just names! Every parameter, description, and enum value counts toward your token budget. A server with only 5 tools but 20 parameters each can hurt more than one with 15 lean tools.</p>



<p class="wp-block-paragraph"><strong>Beyond 30-40 tools, performance degrades noticeably</strong>. The model struggles with choice paralysis, and context bloat leaves less room for your actual data and instructions.</p>



<h3 class="wp-block-heading"><span id="group-by-domain">Group by domain</span></h3>



<p class="wp-block-paragraph">Real life example: a service exposed a single MCP with 30+ tools, but most users only needed a small subset. The rest were admin-only, so every user had to load a lot of irrelevant tools into context. A better design would be to <strong>split it into separate user-facing and admin MCPs</strong>, so each group only loads the tools they actually need.</p>



<p class="wp-block-paragraph">Instead of one monolithic server with 50 tools, create multiple focused servers with 5-10 tools each:</p>



<ul class="wp-block-list">
<li><strong>Client-facing MCP</strong> &#8211; customer data, orders, support tickets</li>



<li><strong>Internal admin MCP</strong> &#8211; infrastructure, monitoring, deployments</li>



<li><strong>Knowledge base MCP</strong> &#8211; docs, wikis, search</li>
</ul>



<p class="wp-block-paragraph">Then enable only the servers relevant to your current project. If you&#8217;re debugging an API, you don&#8217;t need the HR system&#8217;s tools loaded.</p>



<h2 class="wp-block-heading"><span id="an-mcp-is-a-service-not-an-api-wrapper">An MCP is a service, not an API wrapper</span></h2>



<p class="wp-block-paragraph">This is the mistake most teams make: <strong>treating MCP as a 1:1 mapping to their REST API.</strong></p>



<p class="wp-block-paragraph">It&#8217;s not. An MCP tool is a <strong>capability</strong>, not an endpoint. One tool can and should call multiple API endpoints, aggregate results, and transform data into something the model can actually use.</p>



<p class="wp-block-paragraph"><code>&#x274c; Bad: createUser, updateUser, getUser, listUsers, deleteUser, getUserPermissions, setUserPermissions... &#x2705; Good: manage_user - handles creation, updates, permission changes, and returns a clean summary</code></p>



<p class="wp-block-paragraph">Think of your MCP as a <strong>service layer</strong>, not a pass-through proxy. The model doesn&#8217;t need to orchestrate 7 API calls, it needs to accomplish a task.</p>



<h2 class="wp-block-heading"><span id="what-goes-out-matters-as-much-as-what-comes-in">What goes out matters as much as what comes in</span></h2>



<p class="wp-block-paragraph">Your MCP&#8217;s output gets loaded right back into context. If your tool returns raw API responses, you&#8217;re burning tokens on JSON scaffolding the model doesn&#8217;t need.</p>



<p class="wp-block-paragraph">For example, we had a custom MCP that simply wrapped an internal service and returned its raw response. The problem was that the service was built for the web app, not as a clean API, so it included a lot of extra metadata. In some cases, the response was so large it could overwhelm the context window almost immediately.</p>



<p class="wp-block-paragraph"><strong>Transform your output before returning it to the mode</strong>l:</p>



<ul class="wp-block-list">
<li>Strip metadata, headers, and internal IDs the model won&#8217;t use</li>



<li>Summarize large text fields instead of returning full bodies</li>



<li>Return structured summaries, not raw API dumps</li>



<li>Use <strong>MCP resources</strong> for large static datasets, they&#8217;re fetched on demand, not injected into every request</li>
</ul>



<p class="wp-block-paragraph">The principle: return only the information the model needs to answer the question. Nothing more.</p>



<h3 class="wp-block-heading"><span id="for-dynamic-queries-let-the-user-constrain-the-output">For dynamic queries, let the user constrain the output</span></h3>



<p class="wp-block-paragraph">If a search could return 10,000 results, your tool should require filters, limits, or pagination. Never let a single tool call potentially flood the context.</p>



<h2 class="wp-block-heading">Do&#8217;s and don&#8217;ts</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th class="has-text-align-left" data-align="left">Do</th><th class="has-text-align-left" data-align="left">Don&#8217;t</th></tr><tr><td class="has-text-align-left" data-align="left">Keep tools under 10–15 per server</td><td class="has-text-align-left" data-align="left">Build one server with 40+ tools</td></tr><tr><td class="has-text-align-left" data-align="left">Split servers by domain</td><td class="has-text-align-left" data-align="left">Map every API endpoint to a tool</td></tr><tr><td class="has-text-align-left" data-align="left">Transform and trim output</td><td class="has-text-align-left" data-align="left">Forward raw API responses</td></tr><tr><td class="has-text-align-left" data-align="left">Enable tool search if available</td><td class="has-text-align-left" data-align="left">Load servers you&#8217;re not using</td></tr><tr><td class="has-text-align-left" data-align="left">Use MCP resources for large datasets</td><td class="has-text-align-left" data-align="left">Return unbounded result sets</td></tr><tr><td class="has-text-align-left" data-align="left">Add MCPs at the project level when possible</td><td class="has-text-align-left" data-align="left">Register everything at the user level</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Disable MCPs you&#8217;re not actively using</strong>. Every enabled server costs tokens on every request. Move project-specific servers to the project config instead of your global user config, different projects should use different tools.</p>



<p class="wp-block-paragraph">MCP is powerful, but it&#8217;s not magic. Treat it like a <strong>curated service layer</strong> &#8211; intentional tools, minimal surface area, and output shaped for the model, not a raw API passthrough. Your context window (and your token bill) will thank you.</p>



<h2 class="wp-block-heading">Before you go &#8211; put MCPs at the right level</h2>



<p class="wp-block-paragraph">Most agent tools let you register MCP servers at two levels: <strong>user</strong> (global, applies everywhere) and <strong>project</strong> (scoped to a specific repo or workspace). Where you place your servers matters just as much as how many you have.</p>



<p class="wp-block-paragraph">MCPs registered at the <strong>user level</strong> are loaded into <strong>every session, every project</strong>. That Jira MCP you added last month? Still eating tokens while you&#8217;re doing local refactoring that has nothing to do with tickets. The database MCP for project A? Still loaded when you switch to project B&#8217;s frontend work.</p>



<p class="wp-block-paragraph"><strong>Rule of thumb</strong>:</p>



<ul class="wp-block-list">
<li><strong>User level</strong> &#8211; only general-purpose servers you genuinely use across all projects (e.g., a file system tool, a web search MCP)</li>



<li><strong>Project level</strong> &#8211; everything else. Project-specific APIs, team dashboards, domain-specific databases. These belong in your project config, not your global settings.</li>
</ul>



<p class="wp-block-paragraph">Think of it like your toolbox: you don&#8217;t carry a welding torch, a pipe wrench, and a soldering iron to every job. You only grab what the task actually needs. Same with MCPs. Keep your global config lean and let each project pull in only what it uses.</p>



<p class="wp-block-paragraph">And regularly audit what&#8217;s enabled. That experiment from three months ago? The MCP you added for a one-off migration? Disable them. They&#8217;re still costing you tokens on every request.</p>
<p>The post <a href="https://shiftmag.dev/mcps-arent-apis-stop-treating-them-like-one-11420/">MCPs Aren&#8217;t APIs &#8211; Stop Treating Them Like One</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Devs and DBAs can’t find peace, but could they call a truce?</title>
		<link>https://shiftmag.dev/devs-and-dbas-relationship-4930/</link>
		
		<dc:creator><![CDATA[Toni Babic]]></dc:creator>
		<pubDate>Fri, 18 Apr 2025 13:12:40 +0000</pubDate>
				<category><![CDATA[Data]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[Database admins]]></category>
		<category><![CDATA[DBA]]></category>
		<category><![CDATA[Developer Productivity]]></category>
		<category><![CDATA[development]]></category>
		<guid isPermaLink="false">https://shiftmag.dev/?p=4930</guid>

					<description><![CDATA[<p>Are DBAs the guardians of order or just here to give devs a hard time? Or maybe devs are a little too used to getting their way?</p>
<p>The post <a href="https://shiftmag.dev/devs-and-dbas-relationship-4930/">Devs and DBAs can’t find peace, but could they call a truce?</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure class="wp-block-post-featured-image"><img loading="lazy" decoding="async" width="1200" height="630" src="https://shiftmag.dev/wp-content/uploads/2025/02/devs-vs-dbs.png?x32039" class="attachment-post-thumbnail size-post-thumbnail wp-post-image" alt="" style="object-fit:cover;" srcset="https://shiftmag.dev/wp-content/uploads/2025/02/devs-vs-dbs.png 1200w, https://shiftmag.dev/wp-content/uploads/2025/02/devs-vs-dbs-300x158.png 300w, https://shiftmag.dev/wp-content/uploads/2025/02/devs-vs-dbs-1024x538.png 1024w, https://shiftmag.dev/wp-content/uploads/2025/02/devs-vs-dbs-768x403.png 768w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>


<p class="wp-block-paragraph">Picture this scenario: You&#8217;ve just joined a new tech company, excited to start onboarding and dive into your first projects. <strong>But soon, it hits you &#8211; the tension</strong>.</p>



<p class="wp-block-paragraph">Developers gripe about sluggish and obstructive DBAs, while Database Administrators grumble and murmur about the constant stream of poorly optimized queries, chaotic code, and last-minute demands from developers.</p>



<p class="wp-block-paragraph">Did you stumble upon a toxic workplace? Not exactly. <strong>It&#8217;s</strong> <strong>the age-old clash that&#8217;s been brewing for decades between two &#8216;tribes&#8217;</strong>: those who want to build quickly and those who safeguard stability.</p>



<p class="wp-block-paragraph">So, do DBAs play the role of protectors, or are devs just a tad bit spoiled?</p>



<h2 class="wp-block-heading"><span id="how-did-we-get-here">How did we get here?</span></h2>



<p class="wp-block-paragraph">The friction comes from a classic disconnect: <strong>speed vs. stability</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Developers are eager to ship features as fast as they can (preferably yesterday), often under pressure from clients, management, or some other deadline-driven force, while DBAs are focused on ensuring the database doesn’t crash tomorrow.</p>
</blockquote>



<p class="wp-block-paragraph">When these priorities clash, chaos is inevitable &#8211; and I know this firsthand because I’ve been on both sides.</p>



<h2 class="wp-block-heading"><span id="let%e2%80%99s-take-a-closer-look-at-it-from-a-developer%e2%80%99s-angle">Let’s take a closer look at it from a developer’s angle</span></h2>



<ul class="wp-block-list">
<li><strong>‘</strong><strong>We need to speed up our delivery!’</strong></li>
</ul>



<p class="wp-block-paragraph">The main argument is that developers often work under tight deadlines. <strong>To them, a database is just a tool</strong> &#8211; the simpler, the better. Why involve DBAs early if it slows down prototyping?</p>



<p class="wp-block-paragraph">There’s also a prevailing ‘good enough for now’ mentality, where getting a working prototype is the priority.</p>



<ul class="wp-block-list">
<li><strong>‘</strong><strong>Setting up new databases takes ages</strong><strong>.</strong><strong>’</strong></li>
</ul>



<p class="wp-block-paragraph">Waiting for approvals, scheme checks, or infrastructure setups feels like watching paint dry.</p>



<ul class="wp-block-list">
<li><strong>‘</strong><strong>Getting DBAs involved can feel like pulling teeth</strong><strong>.’</strong></li>
</ul>



<p class="wp-block-paragraph">When DBAs push back on quick fixes or demand documentation, developers see red tape rather than guardianship.</p>



<h2 class="wp-block-heading"><span id="now-let%e2%80%99s-dive-into-the-dba%e2%80%99s-side-of-the-story">Now, let’s dive into the DBA’s side of the story</span></h2>



<ul class="wp-block-list">
<li><strong>‘We’re called in too late!’</strong></li>
</ul>



<p class="wp-block-paragraph">DBAs often inherit <strong>poorly designed schemas or performance nightmares</strong>. Fixing a burning database at 2 a.m. is never fun, especially when you don’t know anything about it or where to begin.</p>



<ul class="wp-block-list">
<li><strong>‘Devs don’t listen.’</strong></li>
</ul>



<p class="wp-block-paragraph">Recommendations about indexing, query optimization, or security often fall on deaf ears &#8211; <strong>until an outage happens</strong>. No matter how many times you share documentation, hold knowledge-sharing sessions, or discuss the topic, it sometimes feels like no one listens.</p>



<ul class="wp-block-list">
<li><strong>‘We’re the unsung janitors.’</strong></li>
</ul>



<p class="wp-block-paragraph">While devs chase innovation, DBAs clean up the mess. Their priorities &#8211; backups, scalability, and compliance &#8211; may not be glamorous, but they’re non-negotiable.</p>



<p class="wp-block-paragraph">If a company wants to make it in the worldwide market, it needs to be compliant with numerous regulations. And that is just the beginning &#8211; <strong>data needs to be secured</strong>, and data leaks and privacy concerns aren’t fun for anyone. We need backups and replication set up for disaster recovery, satisfy numerous architecture decision records, and all that complicates the process. It will never be as simple and fast as just deploying a DB locally in Docker.</p>



<h2 class="wp-block-heading"><span id="so-what-do-devs-and-dbas-really-want">So, what do devs and DBAs really want?</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">DBAs just want <strong>preventative care</strong> &#8211; they’re like doctors urging you to eat your veggies, not just treating heart attacks.<br></p>



<p class="wp-block-paragraph">On the other hand, devs need <strong>speed without fallout</strong>. They want to innovate without waking up to a dumpster fire.</p>
</blockquote>



<h2 class="wp-block-heading"><span id="but-do-devs-really-want-to-own-databases">But do devs really want to own databases?</span></h2>



<p class="wp-block-paragraph">Sure, devs can deploy their own database, but maintaining performance, security, and costs? <strong>That’s a full-time job</strong> &#8211; one many devs aren’t signing up for.</p>



<p class="wp-block-paragraph">It may sound great at first, but once you deploy it, the database works fine &#8211; until it doesn’t. It’s just a matter of time before the first issues arise. And surely, devs would rather spend their time programming than maintaining and troubleshooting a database.</p>



<h2 class="wp-block-heading">Think it can&#8217;t get worse? Well, say hello to AI</h2>



<p class="wp-block-paragraph">Enter AI and vector databases &#8211; tools promising lightning-fast analytics.</p>



<p class="wp-block-paragraph">The number of new vector databases is skyrocketing, and devs want them all, each with a specific feature they need. But for DBAs, this is a nightmare. <strong>Integrating a new database is a slow and painful process</strong>, as all checks for security, compliance, and requirements need to be tested and approved. New database types (e.g., vector DBs for ML) often lack mature tooling or expertise. DBAs scramble to secure and scale them, while devs resent the learning curve.</p>



<h2 class="wp-block-heading"><span id="so-who-is-right">So, who is right?</span></h2>



<p class="wp-block-paragraph">They both are, and at the same time, they both aren’t &#8211; <strong>much like the relationship between devs and clients</strong>.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Devs often complain about clients&#8217; broad demands, tight deadlines, and constant changes. Sound familiar? The Dev vs DBA battle is similar: devs forget that, as clients of DBAs, they’re the ones pushing for deadlines and changes, just like clients do to them.</p>
</blockquote>



<p class="wp-block-paragraph">So, devs must make compromises with clients because the company&#8217;s revenue depends on it. However, I think DBAs tend to be &#8216;harder&#8217; on their clients since they don’t face the same pressure of potentially losing business.</p>



<h2 class="wp-block-heading"><span id="is-there-hope-for-peace">Is there hope for peace?</span></h2>



<p class="wp-block-paragraph">There isn&#8217;t &#8211; at least not a simple one.</p>



<p class="wp-block-paragraph">But we can all work together to reduce tension and aim for some kind of truce. We need to be more understanding.</p>



<p class="wp-block-paragraph">Devs should recognize that <strong>DBAs aren’t just complicating things for no reason</strong> and should involve them in the service architecture process. On the other hand, <strong>DBAs should view devs as clients</strong>, understand the need for compromise, and simplify the process of providing databases by using automation or internal tools whenever possible.</p>
<p>The post <a href="https://shiftmag.dev/devs-and-dbas-relationship-4930/">Devs and DBAs can’t find peace, but could they call a truce?</a> appeared first on <a href="https://shiftmag.dev">ShiftMag</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: shiftmag.dev @ 2026-09-08 12:26:16 by W3 Total Cache
-->