<?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: Kenneth Mckrola</title>
    <description>The latest articles on DEV Community by Kenneth Mckrola (@mackoverflow).</description>
    <link>https://dev.to/mackoverflow</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%2F3891762%2Fa43f4cc2-56ff-43a4-a609-d04f38291308.png</url>
      <title>DEV Community: Kenneth Mckrola</title>
      <link>https://dev.to/mackoverflow</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mackoverflow"/>
    <language>en</language>
    <item>
      <title>Benchmarkr - cURL, built for concurrency, MCP, and real performance benchmarking</title>
      <dc:creator>Kenneth Mckrola</dc:creator>
      <pubDate>Wed, 22 Apr 2026 06:48:19 +0000</pubDate>
      <link>https://dev.to/mackoverflow/benchmarkr-curl-built-for-concurrency-mcp-and-real-performance-benchmarking-17c6</link>
      <guid>https://dev.to/mackoverflow/benchmarkr-curl-built-for-concurrency-mcp-and-real-performance-benchmarking-17c6</guid>
      <description>&lt;p&gt;&lt;a href="https://benchmarkr-1.onrender.com" rel="noopener noreferrer"&gt;Link to benchmarkr homepage&lt;/a&gt;&lt;br&gt;
What if cURL let you easily run concurrent requests and benchmark your&lt;br&gt;
endpoints? Where you had an executable that exports tools for your coding&lt;br&gt;
agents (Claude, Cursor) via MCP, streams live performance updates, and&lt;br&gt;
auto-exports benchmark runs to JSON or SQL?&lt;/p&gt;

&lt;p&gt;Development speed is increasing rapidly. Testing and benchmarking are&lt;br&gt;
becoming even more crucial aspects of development for testing AI-generated&lt;br&gt;
and AI-assisted code. &lt;strong&gt;Benchmarkr&lt;/strong&gt; lets you easily orchestrate performance&lt;br&gt;
testing on your API endpoints — whether you're catching regressions, sanity-&lt;br&gt;
checking a refactor, or letting an agent validate the code it just wrote&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p6w5nk7dy48ep4t7sli.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p6w5nk7dy48ep4t7sli.png" alt="Hero image of benchmarkr run" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why another HTTP tool?
&lt;/h2&gt;

&lt;p&gt;There's no shortage of load-test tools — &lt;code&gt;hey&lt;/code&gt;, &lt;code&gt;ab&lt;/code&gt;, &lt;code&gt;wrk&lt;/code&gt;, &lt;code&gt;bombardier&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;k6&lt;/code&gt;. They're great at what they do, but they live in a pre-agent world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No live feedback&lt;/strong&gt; — you wait 30 seconds, then read a wall of text.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No structured persistence&lt;/strong&gt; — you pipe to a file, grep, repeat.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No agent integration&lt;/strong&gt; — your coding agent can't call them without
shelling out and parsing free-form output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Benchmarkr is a single Go binary that does three things well with little out of the box configuration required:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Runs concurrent HTTP benchmarks with live metrics in the terminal.&lt;/li&gt;
&lt;li&gt;Stores runs as JSON files, Postgres, or MySQL — configured once, reused
forever.&lt;/li&gt;
&lt;li&gt;Ships an MCP server so Claude Code, Cursor, and any other MCP-compatible
agent can benchmark your endpoints by name.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://github.com/Mack-Overflow/api-bench" rel="noopener noreferrer"&gt;Github Repo&lt;/a&gt;&lt;br&gt;
&lt;a href="https://benchmarkr-1.onrender.com/docs" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS / Linux&lt;/span&gt;
brew tap mack-overflow/tap
brew &lt;span class="nb"&gt;install &lt;/span&gt;benchmarkr

&lt;span class="c"&gt;# Debian / Ubuntu&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [trusted=yes] https://apt.fury.io/mack-overflow/ /"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/benchmarkr.list
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;benchmarkr

&lt;span class="c"&gt;# RHEL / Fedora&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/yum.repos.d/benchmarkr.repo &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[benchmarkr]
name=Benchmarkr
baseurl=https://yum.fury.io/mack-overflow/
enabled=1
gpgcheck=0
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install &lt;/span&gt;benchmarkr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Or grab a binary from the &lt;a href="https://github.com/Mack-Overflow/api-bench/releases/tag/v0.1.2" rel="noopener noreferrer"&gt;releases page&lt;/a&gt; if you'd&lt;br&gt;
rather skip a package manager.&lt;/p&gt;
&lt;h2&gt;
  
  
  Your first benchmark
&lt;/h2&gt;

&lt;p&gt;The smallest useful command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;benchmarkr run --url https://api.example.com/health&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That fires a single worker for 10 seconds at a GET endpoint. You'll see requests, errors, and P50/P95 update live, then a final summary with throughput, latency percentiles, status-code breakdown, response sizes, and cache hit/miss counts.&lt;/p&gt;

&lt;p&gt;Add concurrency and duration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;benchmarkr run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com/users &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--concurrency&lt;/span&gt; 50 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt; 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;POST with headers and a body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;benchmarkr run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com/users &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--method&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer tok_xxx"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&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;--body&lt;/span&gt; &lt;span class="s1"&gt;'{"name":"test"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rate-limit so you don't accidentally DDoS staging:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;benchmarkr run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://api.example.com/search &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--concurrency&lt;/span&gt; 5 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt; 20 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rate-limit&lt;/span&gt; 100    &lt;span class="c"&gt;# max 100 req/s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bypass the CDN cache to measure origin latency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;benchmarkr run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://cdn.example.com/asset.js &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cache-mode&lt;/span&gt; bypass &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--duration&lt;/span&gt; 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The MCP server — letting agents benchmark for you
&lt;/h2&gt;

&lt;p&gt;This is the part I'm most excited about. Install the MCP companion binary:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;brew install mack-overflow/tap/benchmarkr-mcp&lt;/code&gt;&lt;br&gt;
Then wire it into your agent. For Claude Code, drop a .mcp.json in&lt;br&gt;
your project root:&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;"benchmarkr"&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;"benchmarkr-mcp"&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;And a short CLAUDE.md so the agent prefers it over reinventing the wheel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Benchmarking&lt;/span&gt;

Use the benchmarkr MCP tools (run_benchmark, get_benchmark_status,
stop_benchmark, list_endpoints) for all API benchmarking tasks.
Do not install or use external tools like hey, ab, or bombardier.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cursor is the same config under ~/.cursor/mcp.json plus a .cursorrules.&lt;/p&gt;

&lt;p&gt;Now you can say things like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Benchmark the /api/users endpoint at 20 concurrent workers for 30
seconds and tell me if the P95 is above 200ms."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;…and the agent calls the run_benchmark tool directly, reads the&lt;br&gt;
structured result, and answers in the context of your actual code. No more&lt;br&gt;
"let me write a shell script for you" dance.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedy55l177m6bjfy96ssq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedy55l177m6bjfy96ssq.png" alt="Claude benchmarkr mcp run" width="616" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is heading
&lt;/h2&gt;

&lt;p&gt;A few things on the roadmap I'm looking for feedback on:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;compare_endpoints&lt;/code&gt; — run two URLs side-by-side and diff the metrics.&lt;br&gt;
&lt;code&gt;regression_test&lt;/code&gt; — assert against a previous run's P95/P99 and return a pass/fail the agent can reason about.&lt;br&gt;
Scenario files — YAML-defined multi-step flows (login → fetch → post) instead of single-URL runs.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>performance</category>
      <category>go</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
