<?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>What MCP Doesn't Solve</title>
      <dc:creator>Vincent Tuan</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:42:00 +0000</pubDate>
      <link>https://dev.to/coryntas/what-mcp-doesnt-solve-1ahe</link>
      <guid>https://dev.to/coryntas/what-mcp-doesnt-solve-1ahe</guid>
      <description>&lt;p&gt;Consider an illustrative employee-offboarding workflow. The HR system records that access should end at 17:00. At 15:30, the employee’s manager sends a message: “Their last meeting is done. Offboard them now.”&lt;/p&gt;

&lt;p&gt;The agent finds the correct identity-management tool. Its arguments satisfy the input schema. The MCP server accepts its access token, and the target API is available.&lt;/p&gt;

&lt;p&gt;None of that establishes whether the manager can change the effective termination time.&lt;/p&gt;

&lt;p&gt;The connection may work exactly as designed while the resulting business action is premature, unauthorized, or blocked by information the tool call never examined.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP defines a useful tool boundary
&lt;/h2&gt;

&lt;p&gt;The MCP tools specification gives applications a consistent way to discover and invoke capabilities.&lt;/p&gt;

&lt;p&gt;A server publishes tool definitions containing names, descriptions, input schemas, and optional output schemas. A client discovers them through &lt;code&gt;tools/list&lt;/code&gt; and invokes one through &lt;code&gt;tools/call&lt;/code&gt;. The protocol also distinguishes malformed protocol requests from errors produced during tool execution.&lt;/p&gt;

&lt;p&gt;This boundary solves a real interoperability problem. An application does not need a custom discovery mechanism for every database, document system, or internal API it connects to. Tool definitions give the model enough information to choose a capability and construct an argument payload.&lt;/p&gt;

&lt;p&gt;The specification also assigns important security responsibilities. Servers must validate inputs, enforce access controls, rate-limit calls, and sanitize outputs. Clients should expose tool activity to users, validate results, apply timeouts, log usage, and request confirmation for sensitive operations.&lt;/p&gt;

&lt;p&gt;These controls can establish that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the requested tool exists;&lt;/li&gt;
&lt;li&gt;the arguments have an acceptable shape;&lt;/li&gt;
&lt;li&gt;the caller can reach the MCP server;&lt;/li&gt;
&lt;li&gt;the server accepted or rejected the invocation; and&lt;/li&gt;
&lt;li&gt;the result conforms to an expected structure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The offboarding decision depends on additional facts. Which system controls the termination time? Can this manager modify it? Is there a legal hold? Has HR cancelled or delayed the event? Has another workflow already started the same task?&lt;/p&gt;

&lt;p&gt;An input schema can require employee_id, effective_at, and reason. It cannot determine which source has authority over effective_at unless the surrounding system supplies and enforces that rule.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transport authorization has a narrower job
&lt;/h2&gt;

&lt;p&gt;The MCP authorization specification defines authorization for HTTP-based transports. It describes how a client discovers an authorization server, obtains an access token, and presents that token to a protected MCP resource.&lt;/p&gt;

&lt;p&gt;That flow helps answer whether the client may make requests to the server with the granted scope. It does not contain the organization’s employment policy or decide whether this offboarding should happen at 15:30.&lt;/p&gt;

&lt;p&gt;Production workflows often involve at least four identities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The requester initiates the work. In this case, that may be the manager.&lt;/li&gt;
&lt;li&gt;The actor is the workload identity calling the identity-management system.&lt;/li&gt;
&lt;li&gt;The subject is the employee whose access will change.&lt;/li&gt;
&lt;li&gt;The approver supplies authority for a decision the requester or actor cannot make alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Collapsing these roles creates misleading audit records. If the agent uses the manager’s token, the target system may record that the manager disabled the account even though an automated workflow selected the action and payload. If the agent uses a service account, the log may identify the technical actor while omitting who requested the change and which HR decision authorized it.&lt;/p&gt;

&lt;p&gt;OAuth scopes can restrict what the actor is technically able to request. Workflow policy must still decide what this run may do to this subject at this time.&lt;/p&gt;

&lt;p&gt;The distinction becomes more important when an MCP server calls another service. The official security guidance warns against token passthrough because it weakens audience restrictions and attribution. A separate downstream credential protects that boundary, but it still does not establish the business reason for using the credential.&lt;/p&gt;

&lt;h2&gt;
  
  
  The runtime needs a decision it can inspect
&lt;/h2&gt;

&lt;p&gt;Before a consequential tool call, the runtime should be able to produce a compact record explaining why the action is currently permitted.&lt;/p&gt;

&lt;p&gt;The following execution envelope is illustrative. It is not part of the MCP specification or a proposed extension to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;task_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OFF-2048&lt;/span&gt;
&lt;span class="na"&gt;purpose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;scheduled_employee_offboarding&lt;/span&gt;

&lt;span class="na"&gt;requester&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;manager:1842&lt;/span&gt;
&lt;span class="na"&gt;actor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;workload:offboarding-agent-prod&lt;/span&gt;
&lt;span class="na"&gt;subject&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;employee:7721&lt;/span&gt;

&lt;span class="na"&gt;authoritative_event&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hris:termination:99108&lt;/span&gt;
&lt;span class="na"&gt;policy_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;access-offboarding@2026-07-15&lt;/span&gt;

&lt;span class="na"&gt;decision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow&lt;/span&gt;
&lt;span class="na"&gt;allowed_action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;identity.disable_sign_in&lt;/span&gt;
&lt;span class="na"&gt;execute_after&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-08-24T17:00:00+07:00&lt;/span&gt;

&lt;span class="na"&gt;approval_ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hr-approval:5519&lt;/span&gt;
&lt;span class="na"&gt;approval_payload_digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:84f2...&lt;/span&gt;

&lt;span class="na"&gt;idempotency_key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OFF-2048:disable-sign-in&lt;/span&gt;

&lt;span class="na"&gt;evidence_refs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;hris:employee:7721@version-44&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;idp:user:8fd2@observed-16:59:52&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each field closes a specific gap around the tool call.&lt;/p&gt;

&lt;p&gt;authoritative_event ties the action to an HR record rather than the latest message in chat. policy_version preserves the rule used to reach the decision. execute_after prevents a valid future action from becoming an authorized immediate action. The approval digest binds the reviewer’s decision to a particular payload. The idempotency key gives the target service a way to recognize a repeated request.&lt;/p&gt;

&lt;p&gt;Evidence references retain the records behind the decision without forcing every source document into the model context. They also give an operator something concrete to inspect when a run is challenged later.&lt;/p&gt;

&lt;p&gt;The MCP request can carry some of these values as tool arguments. Their presence alone does not make them trustworthy. The runtime still needs to obtain them from authoritative systems, evaluate the applicable policy, and prevent the model or requester from substituting unsupported values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approval can expire before execution
&lt;/h2&gt;

&lt;p&gt;Suppose HR approves the offboarding plan at 15:30 for execution at 17:00. At 16:45, the termination is delayed. At 16:50, legal places the employee’s documents on hold.&lt;/p&gt;

&lt;p&gt;The earlier approval accurately described an earlier state. Reusing it without another check would authorize an action whose conditions have changed.&lt;/p&gt;

&lt;p&gt;The runtime should revalidate the facts that materially affect the decision as close to execution as practical. For this workflow, that may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the current HR event and effective time;&lt;/li&gt;
&lt;li&gt;the employee’s employment status;&lt;/li&gt;
&lt;li&gt;active legal or security holds;&lt;/li&gt;
&lt;li&gt;the validity of the approval;&lt;/li&gt;
&lt;li&gt;the proposed action payload; and&lt;/li&gt;
&lt;li&gt;the observed state of the target account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not require a person to approve every directory read. Approval is more useful when it binds to the consequence: which account will change, when it will change, what related transfers will occur, and which exceptions remain unresolved.&lt;/p&gt;

&lt;p&gt;If a material input changes, the runtime should invalidate the approval or request a narrower review. A generic confirmation for &lt;code&gt;disable_user&lt;/code&gt; provides little evidence if the reviewer never saw the subject, effective time, source event, or dependent actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  A timeout does not reveal whether the write happened
&lt;/h2&gt;

&lt;p&gt;At 17:00, the agent calls &lt;code&gt;disable_sign_in&lt;/code&gt;. The identity provider commits the change, but the response is lost before the MCP server receives it.&lt;/p&gt;

&lt;p&gt;From the caller’s perspective, the request timed out. That observation does not prove failure.&lt;/p&gt;

&lt;p&gt;Immediately retrying may be harmless if the operation is idempotent. The same approach can cause duplicate document transfers, repeated notifications, or multiple service-desk records when applied to other offboarding steps.&lt;/p&gt;

&lt;p&gt;The tool boundary therefore needs more than a generic retry counter. A write-capable integration should expose enough execution information for the runtime to decide whether to retry, inspect, reconcile, or stop. Useful capabilities include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a caller-supplied idempotency key;&lt;/li&gt;
&lt;li&gt;a stable downstream operation identifier;&lt;/li&gt;
&lt;li&gt;a status lookup independent of the original request;&lt;/li&gt;
&lt;li&gt;a result that distinguishes rejected, committed, and unknown states; and&lt;/li&gt;
&lt;li&gt;documented retry and compensation behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP can transport these arguments and results. It cannot make HR, identity, storage, and ticketing systems participate in one atomic transaction.&lt;/p&gt;

&lt;p&gt;The workflow must retain which actions were planned, approved, attempted, and observed as committed. Restarting the conversation is not a recovery strategy. A resumed run needs durable state that prevents completed writes from being replayed and directs uncertain writes into reconciliation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Responsibility remains distributed
&lt;/h2&gt;

&lt;p&gt;The MCP architecture gives the host responsibility for areas such as connection permissions, consent, and context aggregation. Servers expose focused capabilities, while clients maintain their connections to those servers.&lt;/p&gt;

&lt;p&gt;A production workflow adds responsibilities across those components.&lt;/p&gt;

&lt;p&gt;The host determines which servers and tools enter the model’s action surface. The workflow runtime retains task state, evaluates policy, binds approvals, and handles recovery. The MCP server validates requests and translates downstream failure details. The target system remains authoritative for whether its own records changed.&lt;/p&gt;

&lt;p&gt;Logs from each component need shared identifiers. Otherwise, every system may contain an audit trail while no operator can reconstruct the complete action.&lt;/p&gt;

&lt;p&gt;This machinery has a cost. Revalidation adds latency. Evidence retention introduces access-control and privacy obligations. Narrow tool exposure reduces flexibility. Reconciliation requires background processing and an owner for cases automation cannot resolve.&lt;/p&gt;

&lt;p&gt;A read-only assistant that searches public documentation may not need the same controls as an agent that disables accounts. The required boundary should follow the consequence of the action and the difficulty of recovering from an incorrect result.&lt;/p&gt;

&lt;p&gt;MCP makes tool integration more consistent. Production operation still depends on explicit authority, current evidence, durable workflow state, and known failure semantics around each call.&lt;/p&gt;

&lt;p&gt;When one of your MCP writes times out, what record tells the runtime whether it should retry, reconcile, or stop?&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was adapted for the DEV community from &lt;a href="https://coryntas.com/blog/mcp-connects-tools-does-not-govern-work" rel="noopener noreferrer"&gt;MCP Connects Tools. It Does Not Govern the Work.&lt;/a&gt;, originally published by Coryntas.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>security</category>
      <category>architecture</category>
    </item>
    <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>
