<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vincent Tuan</title>
    <description>The latest articles on DEV Community by Vincent Tuan (@vincent_tuan).</description>
    <link>https://dev.to/vincent_tuan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3675285%2F0a378d18-d1a3-4b03-a009-ea244bee4616.png</url>
      <title>DEV Community: Vincent Tuan</title>
      <link>https://dev.to/vincent_tuan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vincent_tuan"/>
    <language>en</language>
    <item>
      <title>Long-Running AI Agents Accumulate Context Debt</title>
      <dc:creator>Vincent Tuan</dc:creator>
      <pubDate>Mon, 03 Aug 2026 07:46:55 +0000</pubDate>
      <link>https://dev.to/coryntas/long-running-ai-agents-accumulate-context-debt-3n01</link>
      <guid>https://dev.to/coryntas/long-running-ai-agents-accumulate-context-debt-3n01</guid>
      <description>&lt;p&gt;An illustrative reporting agent prepares a monthly operating review. It queries finance, CRM, support, and the data warehouse; compares this month with prior periods; investigates material changes; drafts explanations; collects owner comments; and revises the report over several days.&lt;/p&gt;

&lt;p&gt;By the third revision, its context contains raw query results, discarded hypotheses, repeated instructions, old owner comments, and the current draft. The most important correction—a finance owner rejecting the original revenue explanation—now competes with everything that came before it.&lt;/p&gt;

&lt;p&gt;The agent has not run out of intelligence. It has accumulated &lt;strong&gt;context debt&lt;/strong&gt;: temporary execution material has become permanent reasoning input.&lt;/p&gt;

&lt;h2&gt;
  
  
  The context window is a working surface, not the system of record
&lt;/h2&gt;

&lt;p&gt;Keeping every intermediate result in the model context feels safe because nothing is lost. In practice, relevance declines as a run grows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;large tool responses consume tokens;&lt;/li&gt;
&lt;li&gt;old instructions conflict with newer decisions;&lt;/li&gt;
&lt;li&gt;repeated summaries introduce small distortions;&lt;/li&gt;
&lt;li&gt;rejected hypotheses remain close to accepted findings; and&lt;/li&gt;
&lt;li&gt;the current deliverable becomes harder to distinguish from earlier drafts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A larger context window delays this problem. It does not define which state is authoritative, which evidence is recoverable, or which decisions should survive a restart.&lt;/p&gt;

&lt;p&gt;A long-running workflow needs at least four storage roles.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Working context
&lt;/h3&gt;

&lt;p&gt;The current objective, immediate constraints, selected evidence, and next executable step belong here. This set should be small enough that every item can affect the next decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Durable task state
&lt;/h3&gt;

&lt;p&gt;Completed checkpoints, owners, approvals, deadlines, open exceptions, and permitted next actions should live outside the prompt. This state must survive model calls, worker restarts, and handoffs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Evidence storage
&lt;/h3&gt;

&lt;p&gt;Raw source results should be retained with stable identifiers, timestamps, and access controls. The agent can reload them when a later step needs inspection without injecting every record into every prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Deliverable state
&lt;/h3&gt;

&lt;p&gt;The current report, plan, ticket, or other business artifact needs its own version history. Reviewer changes should update this artifact without turning the entire conversation transcript into the only record of what changed.&lt;/p&gt;

&lt;p&gt;Moving material out of the prompt is not deletion. It is putting information where the runtime can retrieve it deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compaction should preserve decisions, not merely shorten text
&lt;/h2&gt;

&lt;p&gt;A generic conversation summary may retain the topic while losing the operational fact that matters: who rejected an explanation, which source replaced it, and whether the correction applies to one metric or the entire report.&lt;/p&gt;

&lt;p&gt;A useful checkpoint is structured. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"monthly-review-2026-07"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"objective"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Produce an approved operating review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"checkpoint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"finance-variance-reviewed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accepted_findings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"metric"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"net_revenue_retention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"explanation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Two enterprise downgrades"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"evidence_refs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"warehouse:q_184"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"crm:acct_72"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rejected_findings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"explanation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FX movement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"rejected_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"finance-owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"decided_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-08-03T09:20:00Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"open_questions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Confirm support-cost allocation"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowed_next_actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"analyze_support_costs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"request_owner_review"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact schema will vary. The important part is separating decisions from the tokens that produced them.&lt;/p&gt;

&lt;p&gt;Each checkpoint should answer:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What remains in model context?&lt;/li&gt;
&lt;li&gt;What moves to durable state?&lt;/li&gt;
&lt;li&gt;Which raw evidence can be recovered later?&lt;/li&gt;
&lt;li&gt;Which actions are valid from this state?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Compaction, subtask isolation, and progressively loaded instructions are mechanisms for enforcing those choices. They are not substitutes for a state model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subtasks need isolation and a shared contract
&lt;/h2&gt;

&lt;p&gt;The reporting workflow can separate finance variance analysis, sales pipeline changes, and support-volume analysis. Each subtask receives only the systems, definitions, and period relevant to its work.&lt;/p&gt;

&lt;p&gt;Isolation reduces interference, but it creates an integration problem. The coordinating agent cannot safely reconcile three polished narratives that use different definitions.&lt;/p&gt;

&lt;p&gt;A shared result contract might require every subtask to return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;metric identifier and reporting period;&lt;/li&gt;
&lt;li&gt;current and comparison values;&lt;/li&gt;
&lt;li&gt;explanation and confidence;&lt;/li&gt;
&lt;li&gt;authoritative source references;&lt;/li&gt;
&lt;li&gt;unresolved issues; and&lt;/li&gt;
&lt;li&gt;requested decisions or approvals.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This contract does more than improve formatting. It gives the coordinator a stable boundary for validation, comparison, and retry.&lt;/p&gt;

&lt;p&gt;If one subtask fails, the runtime can rerun that unit without replaying the entire workflow. If a reviewer corrects a metric definition, the system can invalidate only the findings that depend on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resuming is a first-class operation
&lt;/h2&gt;

&lt;p&gt;A long-running agent should be tested from checkpoints, not only from the beginning.&lt;/p&gt;

&lt;p&gt;At resume time, the runtime should be able to reconstruct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the current objective and accepted deliverable version;&lt;/li&gt;
&lt;li&gt;completed and pending steps;&lt;/li&gt;
&lt;li&gt;active owners and deadlines;&lt;/li&gt;
&lt;li&gt;the latest authoritative decisions;&lt;/li&gt;
&lt;li&gt;evidence references needed for the next step; and&lt;/li&gt;
&lt;li&gt;the permissions that are still valid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This last item matters because authority can change while a workflow is paused. A task approved yesterday may require a new check before an agent performs the action today.&lt;/p&gt;

&lt;p&gt;A resume test is therefore more than loading a saved prompt. It verifies that the workflow can rebuild the minimum trustworthy working set from durable state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context debt has an operating cost
&lt;/h2&gt;

&lt;p&gt;External state introduces storage, retention, and access-control decisions. Compaction can omit a detail that later becomes important. Subtask isolation increases orchestration complexity. Reloading evidence can add latency.&lt;/p&gt;

&lt;p&gt;Those are measurable tradeoffs. Useful signals include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;context size by workflow stage;&lt;/li&gt;
&lt;li&gt;repeated retrieval of the same evidence;&lt;/li&gt;
&lt;li&gt;compaction corrections by reviewers;&lt;/li&gt;
&lt;li&gt;checkpoint resume failures;&lt;/li&gt;
&lt;li&gt;stale decisions used after a restart;&lt;/li&gt;
&lt;li&gt;evidence reload latency; and&lt;/li&gt;
&lt;li&gt;cost per accepted deliverable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some work should pause instead of compacting. If reviewers fundamentally change the objective, starting a new version with an explicit handoff may be safer than asking the agent to reinterpret a long and contradictory history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finish with a record another run can trust
&lt;/h2&gt;

&lt;p&gt;The completed report should retain its reporting period, metric definitions, reviewer decisions, evidence references, and unresolved caveats. Next month's agent can use the accepted artifact as a comparison without inheriting all of the execution debris that created it.&lt;/p&gt;

&lt;p&gt;Context debt appears when a system confuses memory with accumulation. Long-running agents need a maintained working set and a durable operating record—not an endlessly growing prompt.&lt;/p&gt;

&lt;p&gt;How are you separating working context from durable task state in your long-running agents?&lt;/p&gt;




&lt;p&gt;This article was adapted for the DEV community from &lt;a href="https://coryntas.com/blog/long-running-agents-context-debt" rel="noopener noreferrer"&gt;Long-Running Agents Accumulate Context Debt&lt;/a&gt;, originally published by &lt;a href="https://coryntas.com/" rel="noopener noreferrer"&gt;Coryntas&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>agents</category>
      <category>llm</category>
    </item>
    <item>
      <title>More Tools Can Make Your AI Agent Slower</title>
      <dc:creator>Vincent Tuan</dc:creator>
      <pubDate>Sat, 01 Aug 2026 13:15:48 +0000</pubDate>
      <link>https://dev.to/coryntas/more-tools-can-make-your-ai-agent-slower-7id</link>
      <guid>https://dev.to/coryntas/more-tools-can-make-your-ai-agent-slower-7id</guid>
      <description>&lt;p&gt;A renewal agent can call the CRM, email, calendar, support, document search, and contract systems. On its first run, it asks every system for everything related to one customer.&lt;/p&gt;

&lt;p&gt;The result looks thorough: hundreds of CRM fields, years of ticket history, complete email threads, and the same contract attached to several messages. But the agent now has to spend time and tokens deciding which records matter before it can make progress on the renewal.&lt;/p&gt;

&lt;p&gt;The agent is well connected. It is also slower, more expensive, and less certain.&lt;/p&gt;

&lt;p&gt;Adding a tool expands what an agent can reach. It does not guarantee that the agent can select the right capability, retrieve a bounded result, or preserve enough of its execution budget to finish the task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool schemas consume attention before the first call
&lt;/h2&gt;

&lt;p&gt;An LLM needs the name, description, and input schema of each available tool before it can choose one. When several tools expose similar actions, selection becomes a routing problem.&lt;/p&gt;

&lt;p&gt;Consider a broad interface like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"manage_account"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Search, update, assign, add a note, change a stage, or create a task for an account"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"account_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"operation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"fields"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"assignee"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"stage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"due_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It appears flexible, but every call asks the model to infer which combination of optional parameters represents the intended action. Validation and permissions must then account for every mode hidden behind the same interface.&lt;/p&gt;

&lt;p&gt;A task-shaped read is less ambitious:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"get_renewal_record"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Return the approved renewal view for one customer, including source timestamps"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"customer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The narrower tool is easier to select, permission, test, and recover. It may require additional orchestration steps, and it will not cover every future account workflow. That is a real tradeoff. The benefit is that each supported step carries less ambiguity.&lt;/p&gt;

&lt;p&gt;Tool count therefore has two costs before execution begins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;every schema occupies context;&lt;/li&gt;
&lt;li&gt;overlapping descriptions increase routing uncertainty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither cost appears in a dashboard that reports only the number of connected systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connectivity does not control the response shape
&lt;/h2&gt;

&lt;p&gt;Suppose the CRM API returns 180 fields for an account. The renewal decision needs eight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;renewal date;&lt;/li&gt;
&lt;li&gt;contract value;&lt;/li&gt;
&lt;li&gt;account owner;&lt;/li&gt;
&lt;li&gt;current stage;&lt;/li&gt;
&lt;li&gt;product set;&lt;/li&gt;
&lt;li&gt;open commercial risks;&lt;/li&gt;
&lt;li&gt;last verified customer contact; and&lt;/li&gt;
&lt;li&gt;source timestamps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Passing all 180 fields to the model moves a data-selection problem into the most expensive part of the workflow. The same failure appears when an email connector returns complete message bodies instead of headers and short extracts, or when a document connector sends the same attachment once for every message that references it.&lt;/p&gt;

&lt;p&gt;Each unnecessary value consumes something. It uses tokens when placed in model context, storage and transfer when retained outside it, and reasoning attention when the agent has to filter it.&lt;/p&gt;

&lt;p&gt;The connector should return a task-shaped view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cus_1842"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"renewal_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-30"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contract_value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;120000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"account_owner_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_291"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"open_risk_ids"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"risk_17"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source_updated_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-07-29T08:42:10Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Raw records can remain available for inspection without being injected into every prompt. The agent can retrieve full email bodies or documents only after a bounded search identifies the relevant records.&lt;/p&gt;

&lt;p&gt;Prompting the model to “focus on what matters” does not repair an oversized payload. By that point, the system has already paid to retrieve and expose the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP standardizes exchange, not business meaning
&lt;/h2&gt;

&lt;p&gt;The Model Context Protocol gives compatible systems a common way to expose tools and context. That interface boundary is useful, but it cannot decide what a renewal agent needs from a CRM or which source should win when records disagree.&lt;/p&gt;

&lt;p&gt;An MCP server can expose a technically valid tool that still returns the wrong slice of the system. It does not automatically answer questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is this the current policy or an archived version?&lt;/li&gt;
&lt;li&gt;Does the response include all pages?&lt;/li&gt;
&lt;li&gt;Can this write be retried safely?&lt;/li&gt;
&lt;li&gt;Do two records represent the same customer?&lt;/li&gt;
&lt;li&gt;Is the caller allowed to see the underlying support incident?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Protocol compatibility and context quality are different properties. Standardizing the call does not remove the need to design the tool contract around the business task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pagination can make an incomplete result look complete
&lt;/h2&gt;

&lt;p&gt;The agent asks for all open support tickets. The API returns 50 records and a continuation token.&lt;/p&gt;

&lt;p&gt;If the tool output does not expose that token clearly—or its contract does not say when pagination is required—the first page can look like the complete result. The agent may produce a confident renewal summary while missing the ticket that explains the account risk.&lt;/p&gt;

&lt;p&gt;“Fetch every page” is not always the right correction. An account with years of activity may have thousands of records. The workflow needs a completeness condition, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieve all open tickets;&lt;/li&gt;
&lt;li&gt;stop after the relevant date boundary;&lt;/li&gt;
&lt;li&gt;continue until a known record is found; or&lt;/li&gt;
&lt;li&gt;escalate when the result exceeds the reviewable limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The condition belongs in the workflow and tool contract. Otherwise, the model has to invent one at runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retries are part of the tool interface
&lt;/h2&gt;

&lt;p&gt;Reads and writes fail differently.&lt;/p&gt;

&lt;p&gt;If a CRM read times out, another attempt may be harmless. If a request to create a follow-up task times out after the server commits it, retrying can create a duplicate. Refusing to retry leaves the agent uncertain about whether the action happened.&lt;/p&gt;

&lt;p&gt;A production write tool needs explicit answers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did the request fail before or after execution?&lt;/li&gt;
&lt;li&gt;Does the operation accept an idempotency key?&lt;/li&gt;
&lt;li&gt;Can the agent look up the committed action?&lt;/li&gt;
&lt;li&gt;What evidence identifies a successful write?&lt;/li&gt;
&lt;li&gt;Which errors require a person rather than another attempt?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These details rarely matter in a short demo. They matter as soon as an agent changes business state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure accepted outcomes, not available tools
&lt;/h2&gt;

&lt;p&gt;A useful evaluation starts with one outcome—for example, prepare a renewal brief with current commercial terms, unresolved support risks, source references, and an escalation when required evidence is missing.&lt;/p&gt;

&lt;p&gt;Then measure the system that produces it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;latency per accepted brief;&lt;/li&gt;
&lt;li&gt;tokens and tool calls per accepted brief;&lt;/li&gt;
&lt;li&gt;incomplete or duplicated records;&lt;/li&gt;
&lt;li&gt;unsafe or unnecessary retries;&lt;/li&gt;
&lt;li&gt;reviewer corrections; and&lt;/li&gt;
&lt;li&gt;cases escalated because a capability was intentionally unsupported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Removing a broad tool may leave an edge case unavailable until the team designs a safer capability. A bounded agent that identifies that limit is often more dependable than one that guesses its way through a large tool catalog.&lt;/p&gt;

&lt;p&gt;The practical question is not “How many systems can the agent call?” It is “Does each connection return the right information or perform the right action under conditions we can test?”&lt;/p&gt;

&lt;p&gt;That is the distinction between an agent that looks capable in a tool list and one that can finish a workflow without losing control of cost, latency, or business state.&lt;/p&gt;




&lt;p&gt;This article was adapted for the DEV community from &lt;a href="https://coryntas.com/blog/more-tools-can-make-agents-slower" rel="noopener noreferrer"&gt;More Tools Can Make an Agent Slower&lt;/a&gt;, originally published by Coryntas.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>mcp</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
