{"id":3757,"date":"2026-01-16T10:30:35","date_gmt":"2026-01-16T10:30:35","guid":{"rendered":"https:\/\/www.infobip.com\/developers\/?p=3757"},"modified":"2026-01-16T11:19:17","modified_gmt":"2026-01-16T11:19:17","slug":"implementing-mcp-load-tests-with-grafana-k6","status":"publish","type":"post","link":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6","title":{"rendered":"Implementing MCP load tests with Grafana k6\u00a0"},"content":{"rendered":"\n<p>In our&nbsp;<a href=\"https:\/\/www.infobip.com\/developers\/blog\/why-load-testing-mcp-servers-requires-a-different-approach\" target=\"_blank\" rel=\"noreferrer noopener\">previous&nbsp;post<\/a>, we explored why MCP servers require a different approach to load testing.&nbsp;We\u2019ve&nbsp;discussed bursty traffic patterns, the importance of reliability over raw latency, and the functional requirements for simulating real AI agent behaviour.&nbsp;&nbsp;<\/p>\n\n\n\n<p>In this post,&nbsp;we\u2019re&nbsp;going to&nbsp;walk&nbsp;you&nbsp;through the practical implementation using&nbsp;&nbsp;<a href=\"https:\/\/k6.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">Grafana&#8217;s k6<\/a>.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Setting up virtual users<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Having&nbsp;identified&nbsp;k6 as our tool of choice, the first step is to configure ramping virtual users, which can be easily&nbsp;defined&nbsp;programmatically with JavaScript.&nbsp;In our case,&nbsp;we&#8217;re&nbsp;simulating 100 AI agents progressing through three distinct stages:&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Gradually increment the number of users during a 30-second period.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Sustain the load for 30 seconds.&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Quickly and gracefully stop all virtual users within 10 seconds.&nbsp;<\/li>\n<\/ol>\n\n\n\n<p>Code for this scenario is as follows:&nbsp;<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-js\" data-lang=\"JavaScript\"><code>export\u00a0const\u00a0options\u00a0=\u00a0{\u00a0\n\u00a0\u00a0scenarios:\u00a0{\u00a0\n\u00a0\u00a0\u00a0\u00a0llm_spike_test:\u00a0{\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0executor:\u00a0&#39;ramping-vus&#39;,\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0startVUs:\u00a00,\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0stages:\u00a0[\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0duration:\u00a0&#39;30s&#39;,\u00a0target:\u00a0100\u00a0},\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0duration:\u00a0&#39;30s&#39;,\u00a0target:\u00a0100\u00a0},\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {\u00a0duration:\u00a0&#39;10s&#39;,\u00a0target:\u00a00\u00a0},\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0 ],\u00a0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0gracefulStop:\u00a0&#39;5s&#39;,\u00a0\n\u00a0\u00a0\u00a0 },\u00a0\n\u00a0 },\u00a0\n};\u00a0<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Simulating random idle times<\/strong><\/h2>\n\n\n\n<p>Now that our virtual users (simulated AI agents) are set up, we can simulate random idle times.&nbsp;These act as conversational gaps with spikes afterwards,&nbsp;representing&nbsp;the&nbsp;scenario where we wait for&nbsp;a&nbsp;large language model to decide which MCP tools to call in&nbsp;its&nbsp;&#8220;thinking phase&#8221;.&nbsp;<\/p>\n\n\n\n<p>To implement these random gaps, we make each virtual user sleep randomly at the end of its call chain.&nbsp;For this task, we are going to use&nbsp;<a href=\"https:\/\/grafana.com\/docs\/k6\/latest\/javascript-api\/k6\/sleep\/\" target=\"_blank\" rel=\"noreferrer noopener\">k6 utils<\/a>:&nbsp;<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-js\" data-lang=\"JavaScript\"><code>import\u00a0{\u00a0randomIntBetween\u00a0}\u00a0from\u00a0&#39;https:\/\/jslib.k6.io\/k6-utils\/1.2.0\/index.js&#39;;\u00a0\n\u00a0\nsleep(randomIntBetween(5,\u00a010));<\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Adding MCP support to k6<\/strong><br><strong><br><\/strong>By now you may wonder, &#8220;but there isn&#8217;t a stable MCP support for k6&#8221;,\u00a0that&#8217;s\u00a0true. This is the exact\u00a0reason why\u00a0we also like this tool; we\u2019ve\u00a0<a href=\"https:\/\/grafana.com\/docs\/k6\/latest\/extensions\/create\/\" target=\"_blank\" rel=\"noreferrer noopener\">extended the k6<\/a>\u00a0with MCP support, and the result was\u00a0a\u00a0<a href=\"https:\/\/github.com\/infobip\/xk6-infobip-mcp\" target=\"_blank\" rel=\"noreferrer noopener\">xk6-infobip-mcp<\/a>\u00a0extension.<br><br>A complete example of MCP load test can be found in\u00a0<a href=\"https:\/\/github.com\/infobip\/xk6-infobip-mcp\/blob\/main\/examples\/mcp.js\" target=\"_blank\" rel=\"noreferrer noopener\">this GitHub repo<\/a>.\u00a0<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>After running our load test scenario, we got a chart of our load pattern where we&nbsp;can&nbsp;double-check if we got the pattern we wanted.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"436\" src=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/load-pattern-chart-mcp-1024x436.png\" alt=\"mcp load pattern chart\" class=\"wp-image-3762\" srcset=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/load-pattern-chart-mcp-1024x436.png 1024w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/load-pattern-chart-mcp-300x128.png 300w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/load-pattern-chart-mcp-768x327.png 768w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/load-pattern-chart-mcp.png 1530w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">MCP load pattern chart<\/figcaption><\/figure>\n\n\n\n<p>The graph shows how our simulated AI agents ramp up gradually, but with noticeable spikes in HTTP requests. I think&nbsp;we\u2019re&nbsp;ready now to&nbsp;take a look&nbsp;at what the load test results reveal!&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Load test results<\/h2>\n\n\n\n<p>Let&#8217;s&nbsp;analyse the outcomes produced by our testing approach to&nbsp;provide&nbsp;some insights into the impact of our load scenarios on system performance.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Grafana\u2019s k6 allows you to view the result in multiple formats, and two of them are output in terminal and an HTML report.&nbsp;<\/p>\n\n\n\n<p>For a quick developer-friendly view, I prefer the standard output (see the image below), but different views offer different advantages for interpreting results.&nbsp;<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism off-numbers lang-plain\"><code>         \/\\      Grafana   \/\u203e\u203e\/\n    \/\\  \/  \\     |\\  __   \/  \/\n   \/  \\\/    \\    | |\/ \/  \/   \u203e\u203e\\\n  \/          \\   |   (  |  (\u203e)  |\n \/ __________ \\  |_|\\_\\  \\_____\/\n\n     execution: local\n        script: examples\/mcp-sms.js\n web dashboard: http:\/\/127.0.0.1:5665\n        output: -\n\n     scenarios: (100.00%) 1 scenario, 100 max VUs, 1m15s max duration (incl. graceful stop):\n              * llm_spike_test: Up to 100 looping VUs for 1m10s over 3 stages (gracefulRampDown: 30s, gracefulStop: 5s)\n\n\n\n  \u2588 TOTAL RESULTS\n\n    checks_total.......: 1313    17.480365\/s\n    checks_succeeded...: 100.00% 1313 out of 1313\n    checks_failed......: 0.00%   0 out of 1313\n\n    \u2713 result is not empty\n\n    CUSTOM\n    mcp_call_duration....: avg=127.03ms min=70.44ms med=121.16ms max=340.11ms p(90)=161.7ms p(95)=176.8ms\n    mcp_calls............: 1317    17.533618\/s\n    mcp_errors...........: 0.00%   0 out of 1317\n    mcp_success..........: 100.00% 1317 out of 1317\n\n    HTTP\n    http_req_duration....: avg=104.23ms min=55.38ms med=98.01ms  max=1.08s    p(90)=141.8ms p(95)=157.12ms\n    http_req_failed......: 0.00%   0 out of 3950\n    http_reqs............: 3950    52.587541\/s\n\n    EXECUTION\n    iteration_duration...: avg=8.23s    min=5.47s   med=8.57s    max=10.95s   p(90)=10.59s  p(95)=10.65s\n    iterations...........: 652     8.680273\/s\n    vus..................: 8       min=4            max=100\n    vus_max..............: 100     min=100          max=100\n\n    NETWORK\n    data_received........: 24 MB   319 kB\/s\n    data_sent............: 8.1 MB  108 kB\/s\n\n\n\n\nrunning (1m15.1s), 000\/100 VUs, 652 complete and 8 interrupted iterations\nllm_spike_test \u2713 [======================================] 005\/100 VUs  1m10s<\/code><\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">From Simulated Load Patterns to Actionable Insights&nbsp;<\/h2>\n\n\n\n<p>The output depicted above shows how one MCP call results in multiple HTTP requests. In our case ~17 MCP requests per second resulted in ~52 HTTP requests per second. This significant difference clearly stresses the importance of measuring MCP calls, not just HTTP ones.&nbsp;<\/p>\n\n\n\n<p>Unlike the terminal output, the HTML report enables us to efficiently correlate between potential service degradations occurring during peak load events and underlying factors such as network bandwidth constraints.&nbsp;<\/p>\n\n\n\n<p>For example, if we had a bandwidth issue, the data transfer rate would plateau at a certain maximum and not exceed that level. However, if you look at the image below,&nbsp;that&#8217;s&nbsp;not what&nbsp;we&#8217;re&nbsp;seeing.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" src=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-1024x569.png\" alt=\"mcp load test report\" class=\"wp-image-3765\" srcset=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-1024x569.png 1024w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-300x167.png 300w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-768x427.png 768w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-1536x854.png 1536w, https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/mcp-load-test-report-2048x1139.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">MCP load test report<\/figcaption><\/figure>\n\n\n\n<p>The data transfer rate continues to climb together with the increased load, rather than flattening out. This suggests that, at least in this scenario, bandwidth is not the limiting factor.&nbsp;&nbsp;<\/p>\n\n\n\n<p>By&nbsp;analyzing&nbsp;results from different reports, we were able to&nbsp;identify&nbsp;key performance issues like sudden spikes in duration and errors that could&nbsp;indicate&nbsp;timeouts.&nbsp;&nbsp;The reports gave us grunt work for&nbsp;identifying&nbsp;key areas of improvement.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How did load testing help us improve stability?&nbsp;<\/h2>\n\n\n\n<p>Load testing underlined some issues we&nbsp;wouldn\u2019t&nbsp;have caught otherwise. Let me show you in more detail how the results of our load testing&nbsp;provided&nbsp;practical guidance for improving the reliability and stability of our system.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Timeouts<\/h3>\n\n\n\n<p>As mentioned before, load testing showed us some strange&nbsp;behavior&nbsp;that we&nbsp;couldn&#8217;t&nbsp;link to processing issues.&nbsp;<\/p>\n\n\n\n<p>By digging deeper, we have seen timeout errors on balancers, but our MCP processing was successful. This&nbsp;indicated&nbsp;that balancers needed bigger timeout values than we had on our longest processing MCP tool. To address this issue,&nbsp;we\u2019ve&nbsp;implemented a cascading timeout strategy.&nbsp;&nbsp;<\/p>\n\n\n\n<p>We configured the public load balancer with the longest timeout duration, while keeping the internal MCP server processing time the shortest. We figured it would make the connection stay open long enough for the server to complete its task.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Latency and sticky sessions<\/h3>\n\n\n\n<p>Our next issue to tackle was with latency.&nbsp;We\u2019ve&nbsp;noticed that traffic shifted too rapidly between instances based on load. This caused even bigger latencies and broken Server-Side Events. To solve the&nbsp;<strong>instance hopping<\/strong>,&nbsp;we\u2019ve&nbsp;introduced<a href=\"https:\/\/www.haproxy.com\/blog\/enable-sticky-sessions-in-haproxy\" target=\"_blank\" rel=\"noreferrer noopener\">&nbsp;sticky sessions<\/a>.&nbsp;<\/p>\n\n\n\n<p>Sticky sessions significantly reduced latency by allowing the same AI agent to reuse its session state, which is stored as &#8220;warm&#8221; data in the server&#8217;s fast in-memory cache (RAM). We needed a mechanism to direct&nbsp;subsequent&nbsp;requests to the same server, and we considered two options: route traffic by&nbsp;<a href=\"https:\/\/modelcontextprotocol.io\/specification\/2025-06-18\/basic\/transports#session-management\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>MCP Session ID header<\/strong><\/a>&nbsp;or by the client IP address.&nbsp;<\/p>\n\n\n\n<p>The MCP protocol is&nbsp;relatively new&nbsp;and industry adoption of its latest features is inconsistent. To support the latest features and ensure backward compatibility for existing AI agents built on older versions,&nbsp;we\u2019ve&nbsp;implemented both the Session ID and the IP address strategies for achieving server &#8220;stickiness.&#8221;&nbsp;<\/p>\n\n\n\n<p>This shows us how much value even a simple load test can bring in terms of not only capacity planning but also&nbsp;identifying&nbsp;state issues in high-concurrent systems.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is next?<\/h2>\n\n\n\n<p>Although&nbsp;we&#8217;ve&nbsp;already had a lot of data to go on, we are not done with expanding load testing capabilities to cover interesting cases like:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Reducing MCP call errors of load-balanced deployments by using the new&nbsp;<a href=\"https:\/\/grafana.com\/docs\/k6\/latest\/testing-guides\/injecting-faults-with-xk6-disruptor\/\" target=\"_blank\" rel=\"noreferrer noopener\">k6 disruptor<\/a>&nbsp;extension and applying self-healing in cases of a&nbsp;datacenter&nbsp;outage&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Integrating a mechanism in&nbsp;the error handling workflow that translates the volume of&nbsp;<strong>MCP output data<\/strong>&nbsp;into a precise&nbsp;<strong>LLM token count metric&nbsp;<\/strong>to minimise cost of wasted tokens&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Prevention is always better than cure, by battle-testing our infrastructure we can relaxed look forward to holidays and let AI agents worry and think.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Wrapping Up<\/strong><\/h2>\n\n\n\n<p>Implementing MCP load tests with k6 gave us both the flexibility we needed and actionable insights we&nbsp;didn&#8217;t&nbsp;expect.&nbsp;We simulated realistic agent&nbsp;behavior&nbsp;by adding random idle times to our virtual users. The results showed us that one MCP call can generate multiple HTTP requests. With that in mind, we could conclude that&nbsp;measuring performance at the MCP level is the only way to get the full picture.&nbsp;<\/p>\n\n\n\n<p>&nbsp;More importantly, load testing surfaced hidden issues like timeout misconfigurations, instance-hopping, broken SSE connections that functional testing would never have caught.&nbsp;<\/p>\n\n\n\n<p>We&#8217;ve&nbsp;shared the&nbsp;<a href=\"https:\/\/github.com\/infobip\/xk6-infobip-mcp\" target=\"_blank\" rel=\"noreferrer noopener\">xk6-infobip-mcp<\/a>&nbsp;extension on GitHub in case&nbsp;it&#8217;s&nbsp;useful to others facing similar challenges.&nbsp;If&nbsp;you&#8217;re&nbsp;running MCP infrastructure at scale, we encourage you to try it out and contribute back.&nbsp;<\/p>\n\n\n\n<p>Load testing&nbsp;isn&#8217;t&nbsp;just about capacity&nbsp;planning;&nbsp;it&#8217;s&nbsp;about understanding how your system behaves under stress and fixing problems before your users&nbsp;encounter&nbsp;them.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In our&nbsp;previous&nbsp;post, we explored why MCP servers require a [&hellip;]<\/p>\n","protected":false},"author":78,"featured_media":3767,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[50,28,249],"tags":[41,309],"coauthors":[315],"class_list":["post-3757","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-blog-post","category-devops-and-security","tag-developer-practices","tag-mcp-servers"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub\" \/>\n<meta property=\"og:description\" content=\"In our&nbsp;previous&nbsp;post, we explored why MCP servers require a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\" \/>\n<meta property=\"og:site_name\" content=\"Infobip Developers Hub\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/infobip\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-16T10:30:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-16T11:19:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"896\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hrvoje Milkovi\u0107\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:site\" content=\"@InfobipDev\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hrvoje Milkovi\u0107\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\"},\"author\":{\"name\":\"Hrvoje Milkovi\u0107\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/2618df180a6784da37c091d629cb1a04\"},\"headline\":\"Implementing MCP load tests with Grafana k6\u00a0\",\"datePublished\":\"2026-01-16T10:30:35+00:00\",\"dateModified\":\"2026-01-16T11:19:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\"},\"wordCount\":1330,\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg\",\"keywords\":[\"developer practices\",\"MCP servers\"],\"articleSection\":[\"AI\",\"Blog Post\",\"DevOps and Security\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\",\"name\":\"Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub\",\"isPartOf\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg\",\"datePublished\":\"2026-01-16T10:30:35+00:00\",\"dateModified\":\"2026-01-16T11:19:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg\",\"width\":1600,\"height\":896,\"caption\":\"Grafana k6 load testing dashboards\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.infobip.com\/developers\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing MCP load tests with Grafana k6\u00a0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#website\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"name\":\"Infobip Developers Hub\",\"description\":\"Build meaningful customer relationships across any channel\",\"publisher\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.infobip.com\/developers\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#organization\",\"name\":\"Infobip Developers Hub\",\"url\":\"https:\/\/www.infobip.com\/developers\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"contentUrl\":\"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png\",\"width\":696,\"height\":696,\"caption\":\"Infobip Developers Hub\"},\"image\":{\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/infobip\/\",\"https:\/\/x.com\/InfobipDev\",\"https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ\",\"https:\/\/github.com\/infobip-community\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/2618df180a6784da37c091d629cb1a04\",\"name\":\"Hrvoje Milkovi\u0107\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/aa7c21382920213cad9b6c0efe758cbe\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c2871f2f7ba2204aff785e6842f00c5edb97662f64dc17fed99b421fd40a875e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c2871f2f7ba2204aff785e6842f00c5edb97662f64dc17fed99b421fd40a875e?s=96&d=mm&r=g\",\"caption\":\"Hrvoje Milkovi\u0107\"},\"description\":\"Hrvoje is a Senior Software Engineer at Infobip, specializing in IaaS, automation, and reliability. He focuses on engineering secure, resilient systems designed to scale without friction.\",\"url\":\"https:\/\/www.infobip.com\/developers\/blog\/author\/hrvoje-milkovic\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6","og_locale":"en_US","og_type":"article","og_title":"Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub","og_description":"In our&nbsp;previous&nbsp;post, we explored why MCP servers require a [&hellip;]","og_url":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6","og_site_name":"Infobip Developers Hub","article_publisher":"https:\/\/www.facebook.com\/infobip\/","article_published_time":"2026-01-16T10:30:35+00:00","article_modified_time":"2026-01-16T11:19:17+00:00","og_image":[{"width":1600,"height":896,"url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg","type":"image\/jpeg"}],"author":"Hrvoje Milkovi\u0107","twitter_card":"summary_large_image","twitter_creator":"@InfobipDev","twitter_site":"@InfobipDev","twitter_misc":{"Written by":"Hrvoje Milkovi\u0107","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#article","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6"},"author":{"name":"Hrvoje Milkovi\u0107","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/2618df180a6784da37c091d629cb1a04"},"headline":"Implementing MCP load tests with Grafana k6\u00a0","datePublished":"2026-01-16T10:30:35+00:00","dateModified":"2026-01-16T11:19:17+00:00","mainEntityOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6"},"wordCount":1330,"publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg","keywords":["developer practices","MCP servers"],"articleSection":["AI","Blog Post","DevOps and Security"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6","url":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6","name":"Implementing MCP load tests with Grafana k6\u00a0 - Infobip Developers Hub","isPartOf":{"@id":"https:\/\/www.infobip.com\/developers\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage"},"thumbnailUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg","datePublished":"2026-01-16T10:30:35+00:00","dateModified":"2026-01-16T11:19:17+00:00","breadcrumb":{"@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#primaryimage","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2026\/01\/Grafana-dashboards-k6-load-testing-AI-tool-calls-image-with-blue-and-green-hues.jpg","width":1600,"height":896,"caption":"Grafana k6 load testing dashboards"},{"@type":"BreadcrumbList","@id":"https:\/\/www.infobip.com\/developers\/blog\/implementing-mcp-load-tests-with-grafana-k6#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.infobip.com\/developers\/"},{"@type":"ListItem","position":2,"name":"Implementing MCP load tests with Grafana k6\u00a0"}]},{"@type":"WebSite","@id":"https:\/\/www.infobip.com\/developers\/#website","url":"https:\/\/www.infobip.com\/developers\/","name":"Infobip Developers Hub","description":"Build meaningful customer relationships across any channel","publisher":{"@id":"https:\/\/www.infobip.com\/developers\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.infobip.com\/developers\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.infobip.com\/developers\/#organization","name":"Infobip Developers Hub","url":"https:\/\/www.infobip.com\/developers\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/","url":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","contentUrl":"https:\/\/www.infobip.com\/developers\/wp-content\/uploads\/2023\/03\/Infobip_logo_favicon.png","width":696,"height":696,"caption":"Infobip Developers Hub"},"image":{"@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/infobip\/","https:\/\/x.com\/InfobipDev","https:\/\/www.youtube.com\/channel\/UCUPSTy53VecI5GIir3J3ZbQ","https:\/\/github.com\/infobip-community"]},{"@type":"Person","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/2618df180a6784da37c091d629cb1a04","name":"Hrvoje Milkovi\u0107","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.infobip.com\/developers\/#\/schema\/person\/image\/aa7c21382920213cad9b6c0efe758cbe","url":"https:\/\/secure.gravatar.com\/avatar\/c2871f2f7ba2204aff785e6842f00c5edb97662f64dc17fed99b421fd40a875e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c2871f2f7ba2204aff785e6842f00c5edb97662f64dc17fed99b421fd40a875e?s=96&d=mm&r=g","caption":"Hrvoje Milkovi\u0107"},"description":"Hrvoje is a Senior Software Engineer at Infobip, specializing in IaaS, automation, and reliability. He focuses on engineering secure, resilient systems designed to scale without friction.","url":"https:\/\/www.infobip.com\/developers\/blog\/author\/hrvoje-milkovic"}]}},"_links":{"self":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3757","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/users\/78"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/comments?post=3757"}],"version-history":[{"count":7,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3757\/revisions"}],"predecessor-version":[{"id":3768,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/posts\/3757\/revisions\/3768"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media\/3767"}],"wp:attachment":[{"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/media?parent=3757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/categories?post=3757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/tags?post=3757"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.infobip.com\/developers\/wp-json\/wp\/v2\/coauthors?post=3757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}