<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Context Shift]]></title><description><![CDATA[Weekly insights on MCP architecture, agent infrastructure, and context engineering - written from the trenches of building sixdegree.ai 

No hype. Just the hard-won stuff that actually matters when you're shipping.]]></description><link>https://contextshift.io</link><image><url>https://contextshift.io/img/substack.png</url><title>Context Shift</title><link>https://contextshift.io</link></image><generator>Substack</generator><lastBuildDate>Wed, 29 Apr 2026 10:56:42 GMT</lastBuildDate><atom:link href="https://contextshift.io/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Craig Tracey]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[contextshift@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[contextshift@substack.com]]></itunes:email><itunes:name><![CDATA[Craig Tracey]]></itunes:name></itunes:owner><itunes:author><![CDATA[Craig Tracey]]></itunes:author><googleplay:owner><![CDATA[contextshift@substack.com]]></googleplay:owner><googleplay:email><![CDATA[contextshift@substack.com]]></googleplay:email><googleplay:author><![CDATA[Craig Tracey]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Twelve Rules for Building AI Agents That Actually Work]]></title><description><![CDATA[What agents are, how the loop works, and the mental models that matter.]]></description><link>https://contextshift.io/p/twelve-rules-for-building-ai-agents</link><guid isPermaLink="false">https://contextshift.io/p/twelve-rules-for-building-ai-agents</guid><dc:creator><![CDATA[Craig Tracey]]></dc:creator><pubDate>Sun, 29 Mar 2026 17:45:16 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/32d30129-8ef4-4d87-bf10-1107e9540d97_1369x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Everyone&#8217;s building agents. Most are building them wrong.</p><p>Not because they lack skill, but because they&#8217;re missing the right mental models. Before you write a line of code, you need to understand what agents actually are and how they differ from everything else you&#8217;ve built.</p><p>These are the rules that would have saved us a lot of pain.</p><div><hr></div><h2>1. Understand the Loop</h2><p>An agent is not a chatbot with tools. It&#8217;s not RAG with extra steps. It&#8217;s a system that perceives, reasons, and acts in a loop until a goal is achieved.</p><p><strong>Chatbot: </strong>Question &gt; Response &gt; Single answer</p><p><strong>RAG: </strong>Question &gt; Retrieve &gt; Response &gt; Answer with context</p><p><strong>Agent: </strong>Goal &gt; Reason &gt; Act &gt; Observe &gt; Repeat &gt; Task accomplished</p><p>A chatbot answers. An agent accomplishes.</p><p>Our first &#8220;agent&#8221; was basically a chatbot with a for-loop. Took us three weeks to realize we&#8217;d reinvented the agentic loop badly.</p><div><hr></div><h2>2. Context Is Working Memory</h2><p>Most modern models offer 1M+ tokens. Sounds like a lot. It isn&#8217;t.</p><p>Every turn of the loop adds to context: the goal, every tool call and result, every reasoning step, every error and retry. A complex task might burn 50K tokens before you&#8217;ve done anything interesting.</p><p>Context is not free storage. It&#8217;s working memory. The more you stuff in, the worse the model reasons. Performance degrades well before you hit the limit. Researchers call it the &#8220;lost in the middle&#8221; effect.</p><p>The best agents use the least context to accomplish the goal.</p><div><hr></div><h2>3. Tools Are Your Interface</h2><p>An LLM can only think. It can&#8217;t do. Tools bridge that gap.</p><p>The temptation is to give agents every tool they might need. GitHub, AWS, Slack, Jira, databases. Pile them on.</p><p>Don&#8217;t.</p><p>Every tool is a decision point. Every decision point is a chance for the model to choose wrong. We&#8217;ve seen noticeable degradation starting around 10-25 tools, with severe issues at 100+.</p><p>Start minimal. Add tools only when you hit a wall.</p><div><hr></div><h2>4. Tool Descriptions Are Prompts</h2><p>The model decides which tool to use based on the description. Vague descriptions lead to wrong choices.</p><p><code>Bad: "Gets service information"</code></p><p><code>Good: "Search for services by name, owner, or tag. Returns a list of matching services with their IDs, names, and basic metadata. Use this when you need to find services. Do not use this to get detailed information about a specific service you already know."</code></p><p>The description is a prompt. Write it like one.</p><div><hr></div><h2>5. Agents Thrive with Structure</h2><p>LLMs generate text. Agents need structured data.</p><p>Use constrained decoding when available. It forces the model to output valid JSON at the token level. More reliable, and faster because you never retry.</p><div><hr></div><h2>6. Plan for Hallucination</h2><p>Hallucination isn&#8217;t a bug you can fix. It&#8217;s just how these things work.</p><p>In agent systems, hallucination shows up as invented tool names, fabricated parameters, false confidence, and imagined results.</p><p>We had a case where our prompt included an example UUID with the explicit instruction: &#8220;THIS IS AN EXAMPLE UUID. DO NOT USE THIS VALUE.&#8221;</p><p>The agent used it anyway. Repeatedly.</p><p>You can&#8217;t prompt your way out of this. You engineer around it: validate everything, fail gracefully, reduce opportunity, add reflection, and escalate when stakes are high.</p><div><hr></div><h2>7. Prompts Are Code</h2><p>The system prompt is the most important code you write. It&#8217;s also the least tested.</p><p>Treat it like code: version control it, review changes with rigor, test in isolation, run regression tests, iterate based on failures.</p><p>A prompt change can break your agent just as easily as a code change.</p><div><hr></div><h2>8. Curate Memory</h2><p>Chat history is a log of what was said. Memory is what the agent knows and can use.</p><p>These are different.</p><p>Agent memory has layers: working memory (current context), episodic memory (what happened before), and semantic memory (what&#8217;s true about the world).</p><p>Most agents only implement working memory. That&#8217;s fine for simple tasks. Complex agents need more.</p><div><hr></div><h2>9. Evaluate Continuously</h2><p>&#8220;It seems to work&#8221; is not evaluation. Agents are probabilistic. They might work 80% of the time. You need to know that number.</p><p>Evaluation requires a test set, a metric, and a baseline. And it&#8217;s not something you do once. Every prompt change, tool change, or model upgrade requires re-evaluation.</p><div><hr></div><h2>10. Design for Security</h2><p>Agents that can act in the real world amplify risks. Prompt injection, unauthorized tool use, data leakage. These aren&#8217;t theoretical.</p><p>Least-privilege everything. Validate outputs. Gate high-risk actions. Log everything. Never handle secrets directly.</p><p>Over-privileged agents are the top reason enterprise pilots fail.</p><div><hr></div><h2>11. Instrument for Observability</h2><p>Agents are black boxes by nature. Without traces, you can&#8217;t diagnose why a loop failed or where hallucinations compounded.</p><p>Implement from day one: full trajectory logging, structured traces, metrics dashboards, and replay capabilities.</p><p>This turns &#8220;it sometimes works&#8221; into something you can actually debug.</p><div><hr></div><h2>12. Optimize for Cost and Latency</h2><p>Agents multiply inferences. In production, this often determines whether the thing is viable at all.</p><p>We benchmarked agent performance across models and tasks. The results surprised us: a &#8220;smarter&#8221; model that costs 10x more per token often isn&#8217;t 10x better. Sometimes it&#8217;s worse because it overthinks.</p><p>Use cheaper models for simple steps. Reserve expensive models for complex reasoning. Cache aggressively. Set budgets. Kill runaway agents.</p><div><hr></div><h2>When to Break the Rules</h2><p>Agents are not always the answer. They&#8217;re slow, expensive, and unpredictable.</p><p>Use an agent when the task requires multiple dependent steps, the path isn&#8217;t known in advance, and human-like reasoning adds value.</p><p>Don&#8217;t use an agent when a deterministic script would work, latency is critical, or the cost of failure is high.</p><p>A well-designed API call beats an agent for predictable tasks. A simple chain beats a full agent when the path is mostly known. An agent beats both when you genuinely don&#8217;t know what you need until you start exploring.</p><div><hr></div><p>These rules aren&#8217;t exciting. They&#8217;re not the cool demos you see on Twitter. But they&#8217;re what separates agents that work from agents that almost work.</p><p>Master the loop. Respect context. Secure your tools. Plan for hallucination. Treat prompts as code. Curate memory. Evaluate continuously. Instrument everything. Watch your costs.</p><p>Start simple. Instrument everything. Iterate.</p><div><hr></div><p><em>Originally published on <a href="https://sixdegree.ai/blog/building-agents-fundamentals">sixdegree.ai</a>. If you&#8217;re building agents into your infrastructure, <a href="https://sixdegree.ai">let&#8217;s talk</a>.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://contextshift.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Context Shift! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[The Model Isn’t the Problem]]></title><description><![CDATA[Context is the bottleneck. Models are the distraction.]]></description><link>https://contextshift.io/p/the-model-isnt-the-problem</link><guid isPermaLink="false">https://contextshift.io/p/the-model-isnt-the-problem</guid><dc:creator><![CDATA[Craig Tracey]]></dc:creator><pubDate>Sun, 22 Mar 2026 15:15:43 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d740a191-5156-40f1-9c3c-7a87350151fb_1312x736.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Today we published a benchmark. We gave six LLMs between 25 and 150 tool definitions and measured how often they picked the right one. The results were counterintuitive enough that they&#8217;re worth sitting with.</p><p>The most expensive model lost. Claude Sonnet, at $0.028 per call, was the least accurate at every toolset size. Claude Haiku outperformed it at 3x lower cost. The two cheapest models in the test were also the two most accurate. The correlation between price and tool-calling performance wasn&#8217;t just weak. It was inverted.</p><p>And every model degraded. Not just the cheap ones. All six got worse as the toolset grew. The degradation started between 25 and 50 tools, which is roughly what you get when you connect two or three MCP servers.</p><p>I&#8217;m not writing this to dunk on any particular model. I&#8217;m writing it because the pattern points at something more fundamental than which provider to pick.</p><div><hr></div><h2><strong>The benchmark question everyone is asking is the wrong one</strong></h2><p>&#8220;Which model should I use?&#8221; is a reasonable question. Models differ in capability, cost, latency, and context window size. Those differences matter.</p><p>But the benchmark data suggests that for tool-calling specifically, the question misses the point. The reason accuracy degrades at higher tool counts isn&#8217;t that one model is smarter than another. It&#8217;s that every model is doing the same thing: reading every tool definition in the context window and picking the one that seems most relevant. That&#8217;s a semantic matching problem over a growing candidate pool. It gets harder as the pool grows, regardless of which model you&#8217;re using.</p><p>You could swap in a better model and see marginal improvement. Or you could change what you&#8217;re asking the model to do. One of those has a ceiling. The other doesn&#8217;t.</p><div><hr></div><h2><strong>MCP made this worse</strong></h2><p>MCP solved a real problem. Before it, tool integrations were bespoke, fragile, and expensive to build. Now you can connect a GitHub MCP server, a Jira MCP server, a Kubernetes MCP server, and your agent has tools for all three. That&#8217;s genuinely useful.</p><p>But the default behavior is to load all of those tools into the context window at once. Connect ten services and you&#8217;re at 80 to 150 tools before you&#8217;ve written a single line of agent logic. The model sees all of them, all the time, and has to figure out which ones are relevant to whatever the user just asked.</p><p>This is the context architecture most agents are running right now. It&#8217;s also the architecture our benchmark measured failing.</p><p>The OpenAI models hit a hard wall at 128 tools. Not a degradation curve. A limit. GPT-4o and GPT-5.4 Mini both returned errors at 150 tools because OpenAI&#8217;s API won&#8217;t accept more than 128 tool definitions per request.</p><p>That limit looks like a constraint. It might also be a signal. If the benchmark data is right that accuracy degrades sharply past 50 tools, a hard ceiling at 128 is arguably OpenAI saying: past this point, the results aren&#8217;t reliable enough to ship. The limit forces you to think about what you&#8217;re loading into the context window. Maybe that&#8217;s the point.</p><div><hr></div><h2><strong>The failure mode is structural, not probabilistic</strong></h2><p>Here&#8217;s what the benchmark is actually measuring: how well can a model do semantic search over a list of tool definitions?</p><p>That&#8217;s not really an intelligence task. It&#8217;s a retrieval task. And retrieval degrades with scale. We already know this from RAG. The more candidates in the pool, the harder it is to surface the right one, even with good embeddings and reranking. Handing that retrieval problem to an LLM doesn&#8217;t change the underlying dynamic.</p><p>The cross-service confusion errors tell the same story. Datadog versus Grafana. Linear versus Jira. GitHub versus GitLab. These aren&#8217;t subtle errors. They&#8217;re cases where the model is navigating a crowded candidate pool and defaulting to whichever option looks most plausible.</p><p>Now think about what this looks like at enterprise scale. A large organization doesn&#8217;t run two overlapping observability tools. It runs five, accumulated across acquisitions, team preferences, and vendor lock-in that never got cleaned up. Datadog and Grafana and New Relic and Dynatrace and some homegrown thing the platform team built in 2019. Multiple project trackers. Multiple documentation systems. Multiple deployment pipelines. The heterogeneity isn&#8217;t an edge case in enterprise environments. It&#8217;s the default. And every redundant service you add to the candidate pool compounds the confusion the model is already experiencing.</p><p>This is a structural problem. Swapping models is a local fix for a systemic failure.</p><div><hr></div><h2><strong>Context isn&#8217;t a starting condition. It&#8217;s a workflow.</strong></h2><p>The way most agents treat context: assemble it upfront, load it into the window, run the agent. Context is a static artifact. You prepare it, then you use it.</p><p>That model made sense when agents were single-turn. Ask a question, get an answer. The context you needed at the start was the context you needed throughout.</p><p>Agents that actually do things don&#8217;t work that way. Each step changes what&#8217;s relevant. The agent queries a repository and learns it&#8217;s owned by a specific team. That fact changes which tools matter next. It finds a deployment linked to an incident. That changes which services are relevant. The context at step five is different from the context at step one, and it should be.</p><p>If you treat context as static, you have two options: load everything upfront and pay the candidate pool penalty the whole way through, or load too little and watch the agent fail when it encounters something it doesn&#8217;t have context for.</p><p>The alternative is to treat context as a workflow within the agent workflow. A continuous loop: discover what&#8217;s relevant, scope the tools accordingly, act, update the context based on what you learned, repeat. Not a fixed input at the start. A living layer that evolves as the agent moves through a task.</p><p>This is harder to build. It&#8217;s also the only approach that scales. A static context layer that works for 10 tools starts failing at 50 and breaks at 150. A dynamic one keeps the candidate pool small at every step, regardless of how many total services are connected.</p><div><hr></div><h2><strong>What this means for how you build</strong></h2><p>The benchmark data points toward a practical conclusion: keep the active toolset small. Not by connecting fewer services, but by only surfacing the tools that apply to the current context.</p><p>At 25 tools, the models in our benchmark were in the mid-to-high 80s on accuracy. That&#8217;s a reasonable operating range for a production agent. The goal is to stay there regardless of how many total services are connected. That requires a context layer that can scope the toolset dynamically, rather than a model smart enough to navigate an unlimited candidate pool.</p><p>Better models will keep coming. Context windows will keep growing. And the temptation will be to treat those improvements as a reason to load more into the window and let the model sort it out.</p><p>The benchmark says that doesn&#8217;t work. The ceiling for that approach is already visible, and it&#8217;s lower than most people building agents expect.</p><div><hr></div><p>The full benchmark data and methodology, along with the open source framework we used to run it, are at <a href="https://sixdegree.ai/blog/mcp-tool-overload">SixDegree</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://contextshift.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Context Shift! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[First Principles of AI Context]]></title><description><![CDATA[If we're going to make AI actually work, we need to talk about what's underneath it.]]></description><link>https://contextshift.io/p/first-principles-of-ai-context</link><guid isPermaLink="false">https://contextshift.io/p/first-principles-of-ai-context</guid><dc:creator><![CDATA[Craig Tracey]]></dc:creator><pubDate>Sat, 14 Mar 2026 04:12:51 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/b934b06f-7ff1-4f96-899e-2d39db69d517_1369x768.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every few weeks someone publishes a benchmark showing that the latest model is smarter, faster, more capable. Context windows are getting massive. A million tokens, two million, more on the horizon. And that&#8217;s genuinely impressive.</p><p>But it raises a question nobody seems to be asking: what are we filling those windows with?</p><p>Right now, the answer is mostly everything. Dump in the docs. Stuff in the chat history. Append the tool definitions. Hope the model figures out what matters.</p><p>Bigger windows don&#8217;t solve the context problem. They just give you more room to be wrong. A million tokens of unfocused, unstructured context isn&#8217;t better than ten thousand tokens of the right context. It&#8217;s worse, because the model has to work harder to find the signal in the noise, and you&#8217;re paying for every token of that noise.</p><p>I&#8217;ve spent the last two-plus years building agent infrastructure, and I keep landing on the same conclusion: the bottleneck isn&#8217;t the model and it isn&#8217;t the window size. It&#8217;s the quality and structure of what goes into the window. Until we treat context as an engineering problem, not just a capacity problem, we&#8217;re going to keep building impressive demos that fall apart in production.</p><p>Here are the first principles I keep coming back to.</p><div><hr></div><h2><strong>The Context Exists. The Relations Don't.</strong></h2><p>There&#8217;s a reason AI coding tools are so far ahead of everything else. Code has explicit structure: dependencies, type systems, call graphs. The model can follow the relationships. It can reason about how things connect.</p><p>Now think about everything else we&#8217;re trying to point AI at. Your operations. Your organization. Your business processes. There&#8217;s no relationship graph. No map connecting a customer complaint to the team responsible to the system that caused it.</p><p>Without structure, the model guesses. A bigger window just means it has more room to guess in.</p><p>The structure already exists inside your systems. Before you can get real value from AI, you need to connect it.</p><h2><strong>Semantics are probability, not truth.</strong></h2><p>This is the thing that&#8217;s easy to forget when a model gives you a confident, well-formatted answer: it doesn&#8217;t <em>know</em> anything. It&#8217;s predicting the most likely next token. When you ask it to interpret your data, it&#8217;s giving you the most probable interpretation, not necessarily the correct one.</p><p>That distinction doesn&#8217;t matter much when you&#8217;re generating a summary or drafting an email. It matters enormously when an agent is deciding which team to page at 3am, or which customer account is affected by an outage, or whether a support ticket is related to a known incident.</p><p>You can see this play out in real time with tool calls. An agent without enough context doesn&#8217;t just pick the wrong tool. It tries one, fails, tries another, fails again, and loops. It&#8217;s not being stupid. It&#8217;s doing exactly what you&#8217;d expect from a system that&#8217;s navigating by probability without a map. It doesn&#8217;t have the connective tissue to know that <em>this</em> entity means <em>that</em> tool, so it guesses, checks the result, and guesses again. It&#8217;s brute-forcing a path through a graph it can&#8217;t see.</p><p>Probability is useful. But decisions need ground truth. And ground truth comes from structure: explicit relationships that say <em>this</em> is connected to <em>that</em>, defined by rules, not inferred by a model.</p><p>The more we rely on agents to take real action, the less we can afford to let them operate on vibes.</p><h2><strong>Facts without relationships are a dead end.</strong></h2><p>RAG was supposed to solve the context problem. Ground the model in your data. Retrieve relevant chunks. It works for question answering.</p><p>And even that takes a surprising amount of effort. Chunking strategies, embedding model selection, reranking, relevance tuning, keeping the index fresh as your data changes. RAG pipelines are deceptively expensive to build well and even harder to maintain. That&#8217;s a lot of investment for a system that tops out at retrieval.</p><p>And when teams hit the ceiling of what vanilla RAG could do, where did they turn to improve it? You guessed it. Graphs. GraphRAG exists because people kept running into the same wall: retrieval without relationships isn&#8217;t enough.</p><p>But the moment you want an agent to <em>do</em> something, retrieval isn&#8217;t enough. Knowing &#8220;there was an incident last Tuesday&#8221; is a fact. Knowing that the incident affected three customers, was caused by a change made by a specific team, and is related to two open support tickets? That&#8217;s a graph. That&#8217;s the difference between an agent that can answer questions and one that can actually reason about what to do next.</p><p>We keep trying to solve a graph problem with a search engine. Vector similarity tells you what&#8217;s textually related. It can&#8217;t tell you what&#8217;s causally connected, what depends on what, or what breaks if something changes. And because similarity is probabilistic, it&#8217;ll happily surface content that <em>looks</em> related but isn&#8217;t, with no way to tell the difference.</p><h2><strong>Context has to discover itself.</strong></h2><p>Here&#8217;s where it gets hard. You can&#8217;t manually build and maintain a map of how everything in your world connects. But look at what we&#8217;re doing today to try.</p><p>We write longer prompts. We craft system instructions. We maintain AGENTS.md and CLAUDE.md files. We build onboarding documents that try to explain our world to the model in prose. We hand-author tool descriptions and few-shot examples. We create elaborate prompt chains that try to steer the model toward the right context at the right time.</p><p>All of these are manual. All of them go stale. And all of them are fundamentally trying to solve the same problem: teaching the model what it should already be able to see.</p><p>And here&#8217;s the kicker. What are we writing all of this context in? Natural language. Prose. The very thing we just established is interpreted probabilistically, not precisely. We&#8217;re using semantics to provide context to a system that processes semantics as probability. We&#8217;re bootstrapping truth from a medium that doesn&#8217;t guarantee it.</p><p>It works at small scale. When you have five tools and one domain, you can write enough context by hand to get by. But it breaks the moment your environment grows. More tools, more systems, more relationships, more change. The rate of change is faster than any human process can keep up with.</p><p>The only context that stays accurate is context that builds itself, continuously, from the systems that are already running. The relationships already exist inside your tools and platforms. They&#8217;re just not structured in a way that AI can use.</p><p>The job isn&#8217;t data entry. The job is discovery.</p><h2><strong>Structure needs rules, not just data.</strong></h2><p>This one took me a while to internalize. You can ingest every piece of data from every system you touch and still have nothing useful. Data without interpretation is noise, and a model will happily interpret that noise for you. Confidently, probabilistically, and sometimes wrong.</p><p>Structure emerges from rules. A project <em>is owned by</em> a team. A customer <em>is served by</em> a product. An alert <em>relates to</em> an incident. These aren&#8217;t things you discover statistically. They&#8217;re things you define. And once defined, they make relationships queryable, composable, and trustworthy. Not probable. True.</p><p>Without rules, you have data. With rules, you have structure an agent can trust.</p><h2><strong>Agents need context before tools.</strong></h2><p>MCP gave agents a standard way to call tools. That was a genuine breakthrough. But tools without context are blind.</p><p>Think about how an agent actually decides which tool to call. It reads the tool&#8217;s name and description and picks the one that seems most relevant. Semantics again. The entire tool selection process is probabilistic. The agent isn&#8217;t matching against a schema or following a rule. It&#8217;s making its best guess.</p><p>Give an agent access to hundreds of tools and watch what happens. It picks the wrong ones. It hallucinates capabilities. It takes action without understanding what it&#8217;s acting on. And every one of those irrelevant tool definitions is eating up your context window, crowding out the information the agent actually needs. Each failed tool call burns tokens, adds latency, and pushes useful context further out of reach.</p><p>The fix isn&#8217;t better prompting. The fix is context first, tools second. The agent needs to understand what&#8217;s relevant to the current task before it gets access to the tools that apply.</p><p>This is the order of operations that most agent architectures get backwards.</p><div><hr></div><h2><strong>Why this matters now</strong></h2><p>We&#8217;re about to get 10 million token context windows. The temptation will be to treat that as a solution. Just throw everything in and let the model sort it out.</p><p>That won&#8217;t work. It&#8217;ll just be expensive, slow, and probabilistically wrong in ways that are hard to debug. The context problem isn&#8217;t about capacity. It&#8217;s about knowing what matters, how things connect, and what&#8217;s relevant right now. With certainty, not just likelihood.</p><p>MCP is taking off. Agent frameworks are proliferating. Everyone is building tool integrations. But almost nobody is building the context layer underneath: the thing that decides what goes into the window and why.</p><p>That&#8217;s the gap. And it&#8217;s the gap that will determine whether AI agents become genuinely useful or remain expensive toys that work great in demos.</p><p>I started this newsletter because I think the people building in this space need a place to think through these problems together. Not hype. Not product announcements. Just the hard, specific questions that come with making AI systems work for real.</p><div><hr></div><p>This is the problem I'm building toward solving with <a href="https://sixdegree.ai">sixdegree.ai</a>. More on that soon - and more on the specific patterns that actually work in production.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://contextshift.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Context Shift! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Welcome to Context Shift]]></title><description><![CDATA[MCP, agents, and the context layer nobody talks about]]></description><link>https://contextshift.io/p/welcome-to-context-shift</link><guid isPermaLink="false">https://contextshift.io/p/welcome-to-context-shift</guid><dc:creator><![CDATA[Craig Tracey]]></dc:creator><pubDate>Sat, 14 Mar 2026 03:06:19 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ad7aac34-6ef9-4de1-b59c-47f9fa1f3a3d_1312x736.webp" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You&#8217;re building AI agents. You&#8217;ve got the LLM calls working. The demo is impressive.</p><p>Then you ship it.</p><p>And you discover the real problem was never the model &#8212; it was the context.</p><p>Which tools should the agent see right now? How do you keep it from calling a GitLab endpoint when the user is asking about a GitHub repo? What happens when you load 200 MCP tools into a single session and the model starts hallucinating capabilities it doesn&#8217;t have?</p><p>These are the problems nobody talks about at AI conferences. They&#8217;re too specific. Too operational. Too boring &#8212; until they take down your production system on a Tuesday afternoon.</p><h2><strong>What this newsletter is</strong></h2><p>Context Shift is a weekly newsletter for engineers building with MCP and agent infrastructure. Each issue delivers practitioner-tested insights on:</p><ul><li><p><strong>MCP architecture</strong> &#8212; what the spec says, what it doesn&#8217;t, and what actually works</p></li><li><p><strong>Agent context management</strong> &#8212; the hard problem of getting the right information to the right model at the right time</p></li><li><p><strong>The infrastructure layer</strong> &#8212; the unglamorous plumbing that makes AI systems work in the real world</p></li></ul><p>No hype. No &#8220;AI is changing everything&#8221; takes. Occasionally I&#8217;ll surface something worth reading from elsewhere in the ecosystem, but mostly this is first-hand &#8212; the specific, hard-won knowledge that comes from shipping context-aware systems.</p><h2><strong>Who I am</strong></h2><p>I&#8217;m Craig, founder of <a href="https://sixdegree.ai/">sixdegree.ai</a> &#8212; a live system intelligence platform that delivers real-time business context to AI agents via MCP. Every week I&#8217;m in the code, solving the same problems you&#8217;re solving: tool discovery, context windows, entity resolution, agent orchestration.</p><p>The things I write about here are things I&#8217;ve built, broken, and rebuilt. This newsletter is the one I wish existed when I started.</p><h2><strong>Subscribe</strong></h2><p>If you&#8217;re building agents, designing MCP servers, or architecting the context layer underneath your AI systems &#8212; subscribe. Every issue is written to save you at least one bad production decision.</p><p>Let&#8217;s get into it.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://contextshift.io/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Context Shift! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>