<?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</title>
    <description>The latest articles on DEV Community by Vincent (@yihao_wei_2862cecefb5acaf).</description>
    <link>https://dev.to/yihao_wei_2862cecefb5acaf</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3807715%2F1ba880b9-b64e-4fe3-aaff-4755b0c79664.png</url>
      <title>DEV Community: Vincent</title>
      <link>https://dev.to/yihao_wei_2862cecefb5acaf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yihao_wei_2862cecefb5acaf"/>
    <language>en</language>
    <item>
      <title>Building an AI Agent? Stop Rebuilding These 13 Utility Tools Every Time</title>
      <dc:creator>Vincent</dc:creator>
      <pubDate>Thu, 05 Mar 2026 10:35:09 +0000</pubDate>
      <link>https://dev.to/yihao_wei_2862cecefb5acaf/building-an-ai-agent-stop-rebuilding-these-13-utility-tools-every-time-5flf</link>
      <guid>https://dev.to/yihao_wei_2862cecefb5acaf/building-an-ai-agent-stop-rebuilding-these-13-utility-tools-every-time-5flf</guid>
      <description>&lt;p&gt;Every time I start a new AI agent project, I hit the same wall.&lt;/p&gt;

&lt;p&gt;The LLM reasoning part? That's the fun bit.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;annoying&lt;/em&gt; part is wiring up the same handful of utilities I always end up needing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web search to get current information&lt;/li&gt;
&lt;li&gt;URL content extraction (clean text for LLM context)&lt;/li&gt;
&lt;li&gt;Screenshot capabilities for visual tasks&lt;/li&gt;
&lt;li&gt;Weather data&lt;/li&gt;
&lt;li&gt;Stock prices and FX rates&lt;/li&gt;
&lt;li&gt;Email validation before sending outreach&lt;/li&gt;
&lt;li&gt;Translation for global reach&lt;/li&gt;
&lt;li&gt;News feed access&lt;/li&gt;
&lt;li&gt;WHOIS + DNS lookups&lt;/li&gt;
&lt;li&gt;GeoIP resolution&lt;/li&gt;
&lt;li&gt;PDF extraction&lt;/li&gt;
&lt;li&gt;QR code generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one has its own credentials, rate limit quirks, error formats, and output that needs massaging before it's useful in an LLM context. I've rebuilt this stack more times than I care to admit.&lt;/p&gt;

&lt;p&gt;So I extracted it all into a standalone service: &lt;strong&gt;&lt;a href="https://github.com/Vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;Agent Toolbox&lt;/a&gt;&lt;/strong&gt; — an open-source MCP server + REST API that bundles 13 production-ready tools under one key.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's included
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Under the hood&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Structured web search, paginated results&lt;/td&gt;
&lt;td&gt;DuckDuckGo via ddg-node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clean content from any URL, strips boilerplate&lt;/td&gt;
&lt;td&gt;Mozilla Readability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;screenshot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full-page PNG screenshots&lt;/td&gt;
&lt;td&gt;Playwright/Chromium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;weather&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current conditions + 7-day forecast&lt;/td&gt;
&lt;td&gt;Open-Meteo (no key needed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;finance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stock quotes, historical data, FX rates&lt;/td&gt;
&lt;td&gt;Yahoo Finance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;validate-email&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Format + DNS MX + SMTP probe&lt;/td&gt;
&lt;td&gt;Custom implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;translate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-language text translation&lt;/td&gt;
&lt;td&gt;Cloud translation backend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;news&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest headlines by category or keyword&lt;/td&gt;
&lt;td&gt;News aggregation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;whois&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Domain registration + expiry info&lt;/td&gt;
&lt;td&gt;WHOIS protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DNS record lookup (A, MX, TXT, CNAME, etc.)&lt;/td&gt;
&lt;td&gt;DNS resolver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;geoip&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IP geolocation with country/city/ASN&lt;/td&gt;
&lt;td&gt;GeoIP database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pdf_extract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Extract clean text from PDF URLs&lt;/td&gt;
&lt;td&gt;PDF parsing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;qr_generate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate QR codes as PNG or SVG&lt;/td&gt;
&lt;td&gt;QR library&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Free tier: &lt;strong&gt;1,000 calls/month, no credit card.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why bundle instead of calling APIs directly?
&lt;/h2&gt;

&lt;p&gt;Fair question. Here's what I actually found building agents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Uniform error handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each underlying API fails differently. Rate limits, network timeouts, parsing failures — Agent Toolbox normalizes all of these into consistent error responses. Your agent handles one error format, not thirteen.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Single auth token&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of injecting 7–13 different API keys into your agent's system prompt, you pass one. Less credential management, less context waste.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. LLM-optimized output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Raw API responses are noisy for LLMs. Agent Toolbox normalizes, truncates, and formats output for LLM consumption. The &lt;code&gt;extract&lt;/code&gt; tool, for example, strips navigation, ads, and boilerplate — returning only article content in clean markdown or plain text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. MCP-native&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Works out of the box with Claude Desktop, Cursor, Cline, and any MCP-compatible client. Zero custom integration code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting started in 30 seconds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Add to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&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;"mcpServers"&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;"agent-toolbox"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent-toolbox-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"AGENT_TOOLBOX_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-key"&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="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;Restart Claude Desktop. Done. All 13 tools are now available to Claude.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Smithery (one click)
&lt;/h3&gt;

&lt;p&gt;Search &lt;code&gt;agent-toolbox&lt;/code&gt; on &lt;a href="https://smithery.ai/server/@vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;Smithery&lt;/a&gt;. Smithery handles the config file automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3: Glama
&lt;/h3&gt;

&lt;p&gt;Also listed on &lt;a href="https://glama.ai/mcp/servers/@Vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;Glama&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 4: REST API directly
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Web search&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.agenttoolbox.dev/search &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"query": "latest MCP servers 2026", "count": 5}'&lt;/span&gt;

&lt;span class="c"&gt;# Extract clean content from a URL&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.agenttoolbox.dev/extract &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"url": "https://example.com/article", "format": "markdown"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full API docs at &lt;a href="https://github.com/Vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;Agent Toolbox on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 5: Python (LangChain / LlamaIndex)
&lt;/h3&gt;

&lt;p&gt;Already on PyPI — two wrappers available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;agent-toolbox-langchain
pip &lt;span class="nb"&gt;install &lt;/span&gt;agent-toolbox-llamaindex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Real-world use cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Deep research agent&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;search("AI agent frameworks 2026") → 10 URLs
extract(url) for each → clean article text
LLM synthesizes → structured report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No HTML soup. No rate limit juggling across 3 APIs. Just results.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Competitive intelligence&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;screenshot&lt;/code&gt; + &lt;code&gt;extract&lt;/code&gt; competitor landing pages on a schedule. Diff the changes over time. Your agent watches competitors while you sleep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Financial data pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;finance&lt;/code&gt; gives real-time stock quotes and FX rates without a Bloomberg subscription. Useful for trading signal agents, portfolio trackers, market commentary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email outreach agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before sending 500 emails: &lt;code&gt;validate-email&lt;/code&gt; checks format, DNS MX records, and SMTP reachability. Protects sender reputation before the campaign fires.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Domain research&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;whois&lt;/code&gt; + &lt;code&gt;dns&lt;/code&gt; together let you research domain availability, ownership history, and infrastructure setup — useful for competitive research agents.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The server runs on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js + Hono&lt;/strong&gt; — lightweight, fast HTTP framework&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; — fully typed throughout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PM2&lt;/strong&gt; — process management on VPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP stdio transport&lt;/strong&gt; — for Claude Desktop / Cursor integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP layer is a thin wrapper around the REST API. Same tool logic, two interfaces.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Desktop → MCP stdio → Agent Toolbox server → tool execution
Your agent → REST API → Agent Toolbox server → tool execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MIT licensed. The full source is on GitHub.&lt;/p&gt;




&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;p&gt;Active development. Things coming next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;code-run&lt;/code&gt; — sandboxed code execution (most requested)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;calendar&lt;/code&gt; — timezone-aware date/time helpers&lt;/li&gt;
&lt;li&gt;Streaming responses for long extractions&lt;/li&gt;
&lt;li&gt;Webhook callbacks for async tool results&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 &lt;strong&gt;npm MCP package:&lt;/strong&gt; &lt;code&gt;npx agent-toolbox-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;🐙 &lt;strong&gt;GitHub (MIT):&lt;/strong&gt; &lt;a href="https://github.com/Vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;https://github.com/Vincentwei1021/agent-toolbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Smithery:&lt;/strong&gt; &lt;a href="https://smithery.ai/server/@vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;https://smithery.ai/server/@vincentwei1021/agent-toolbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Glama:&lt;/strong&gt; &lt;a href="https://glama.ai/mcp/servers/@Vincentwei1021/agent-toolbox" rel="noopener noreferrer"&gt;https://glama.ai/mcp/servers/@Vincentwei1021/agent-toolbox&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐍 &lt;strong&gt;PyPI:&lt;/strong&gt; &lt;code&gt;pip install agent-toolbox-langchain&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Free tier: &lt;strong&gt;1,000 calls/month. No credit card.&lt;/strong&gt; If you build something with it, I'd love to hear about it in the comments.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm running a $0 multi-agent AI startup experiment. All four agents (CEO, marketer, builder, scout) are live and autonomous. The full story thread is on &lt;a href="https://x.com/YihaoWei1021" rel="noopener noreferrer"&gt;Twitter/X&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
