Agents - New web_fetch tool in the Agents SDK for reading webpages and documents, with automatic markdown conversion
- Announced
- Tags
- Agents
- Severity
- info, set by
reef/rss-rule-v1 - Source
- https://developers.cloudflare.com/changelog/post/2026-10-11-web-fetch/
<p>The <a href="https://developers.cloudflare.com/agents/">Cloudflare Agents SDK</a> now provides a <code>web_fetch</code> tool that reads webpages, PDFs, and supported Office documents, using <a href="https://developers.cloudflare.com/workers-ai/features/markdown-conversion/">Workers AI Markdown Conversion</a> to turn them into text the model can read. The tool requests Markdown directly from sites that support <a href="https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/">Markdown for Agents</a> and formats JSON for the model.</p> <p>When you give the <code>web_fetch</code> tool to your agent, the model provides a URL and receives back the page content, along with the final URL, HTTP status, and content type. Long pages come back in smaller sections, with an offset the model can use to continue reading. You control which hosts the agent can fetch, response size, timeouts, and redirects.</p> <p>When you also provide the <a href="https://developers.cloudflare.com/agents/tools/web-search/"><code>web_search</code></a> tool to your agent, the model is told to use <code>web_fetch</code> to read the pages that <code>web_search</code> returns.</p> <p>To use the <code>web_fetch</code> tool, make sure you have <a href="https://github.com/cloudflare/agents/releases/tag/agents%400.28.0" target="_blank" rel="noopener">Agents SDK v0.28.0<span class="external-link"> ↗︎</span></a> or greater installed, and add it to a <a href="https://developers.cloudflare.com/agents/harnesses/pi/">Pi Durable</a> <a href="https://developers.cloudflare.com/agents/harnesses/pi/extensions/">extension registry</a> before opening the harness:</p> <div><div data-nb-tabs data-nb-sync-key="workersExamples" class><div class="relative flex border-b border-border" role="tablist" data-nb-tabs-list><span class="bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out" data-nb-tabs-indicator aria-hidden="true"></span></div><div class="mt-3"><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="JavaScript" class><figure class="nb-code-figure" data-nb-lang="js"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="js" data-nb-lang="js"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { webFetchTool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/webfetch/pi"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1jdh33"> harness</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> PiHarness</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> harness</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">storage</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">context</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.registry.</span><span class="nb-shiki-1t8gfj">install</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"web-tools"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: [</span><span class="nb-shiki-1t8gfj">webFetchTool</span><span class="nb-shiki-140thh">({ binding: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh"> })],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Harness.</span><span class="nb-shiki-1t8gfj">open</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> storage,</span></span> <span class="line"><span class="nb-shiki-140thh"> { models, registry: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.registry },</span></span> <span class="line"><span class="nb-shiki-140thh"> context,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div><div role="tabpanel" data-nb-tabs-content data-nb-tab-label="TypeScript" class><figure class="nb-code-figure" data-nb-lang="ts"><pre class="astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz" tabindex="0" data-language="ts" data-nb-lang="ts"><code><span class="line"><span class="nb-shiki-1itgoe">import</span><span class="nb-shiki-140thh"> { webFetchTool } </span><span class="nb-shiki-1itgoe">from</span><span class="nb-shiki-mdbnqw"> "agents/webfetch/pi"</span><span class="nb-shiki-140thh">;</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe">export</span><span class="nb-shiki-1itgoe"> class</span><span class="nb-shiki-1t8gfj"> MyAgent</span><span class="nb-shiki-1itgoe"> extends</span><span class="nb-shiki-1t8gfj"> DurableObject</span><span class="nb-shiki-140thh"><</span><span class="nb-shiki-1t8gfj">Env</span><span class="nb-shiki-140thh">> {</span></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> readonly</span><span class="nb-shiki-1jdh33"> harness</span><span class="nb-shiki-1itgoe"> =</span><span class="nb-shiki-1itgoe"> new</span><span class="nb-shiki-1t8gfj"> PiHarness</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-1t8gfj"> harness</span><span class="nb-shiki-140thh">: </span><span class="nb-shiki-1itgoe">async</span><span class="nb-shiki-140thh"> ({ </span><span class="nb-shiki-1jdh33">storage</span><span class="nb-shiki-140thh">, </span><span class="nb-shiki-1jdh33">context</span><span class="nb-shiki-140thh"> }) </span><span class="nb-shiki-1itgoe">=></span><span class="nb-shiki-140thh"> {</span></span> <span class="line"><span class="nb-shiki-dzsirb"> this</span><span class="nb-shiki-140thh">.registry.</span><span class="nb-shiki-1t8gfj">install</span><span class="nb-shiki-140thh">({</span></span> <span class="line"><span class="nb-shiki-140thh"> name: </span><span class="nb-shiki-mdbnqw">"web-tools"</span><span class="nb-shiki-140thh">,</span></span> <span class="line"><span class="nb-shiki-140thh"> tools: [</span><span class="nb-shiki-1t8gfj">webFetchTool</span><span class="nb-shiki-140thh">({ binding: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.env.</span><span class="nb-shiki-dzsirb">AI</span><span class="nb-shiki-140thh"> })],</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-21nrsd"> // ...</span></span> <span class="line"></span> <span class="line"><span class="nb-shiki-1itgoe"> return</span><span class="nb-shiki-140thh"> Harness.</span><span class="nb-shiki-1t8gfj">open</span><span class="nb-shiki-140thh">(</span></span> <span class="line"><span class="nb-shiki-140thh"> storage,</span></span> <span class="line"><span class="nb-shiki-140thh"> { models, registry: </span><span class="nb-shiki-dzsirb">this</span><span class="nb-shiki-140thh">.registry },</span></span> <span class="line"><span class="nb-shiki-140thh"> context,</span></span> <span class="line"><span class="nb-shiki-140thh"> );</span></span> <span class="line"><span class="nb-shiki-140thh"> },</span></span> <span class="line"><span class="nb-shiki-140thh"> });</span></span> <span class="line"><span class="nb-shiki-140thh">}</span></span></code></pre></figure></div></div></div><script type="module" src="https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&type=script&index=0&lang.ts"></script></div> <p>The <code>web_fetch</code> tool works with any harness. The SDK includes AI SDK and TanStack AI adapters. If you use a different harness, or need to fetch a page without calling a model, use <code>fetchWeb()</code>, <code>windowWebFetchPage()</code>, and <code>renderWebFetchPage()</code> from <code>agents/webfetch</code>. Direct fetching does not require a Durable Object or browser.</p> <p>For setup, examples, and request controls, refer to <a href="https://developers.cloudflare.com/agents/tools/web-fetch/">Web fetch</a>.</p>
The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.