<?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: kavin arvind</title>
    <description>The latest articles on DEV Community by kavin arvind (@kavin_arvind_8a1adbd39efd).</description>
    <link>https://dev.to/kavin_arvind_8a1adbd39efd</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%2F3120530%2F30194514-8ad6-4983-a1bf-7e54b3ddcec9.jpg</url>
      <title>DEV Community: kavin arvind</title>
      <link>https://dev.to/kavin_arvind_8a1adbd39efd</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kavin_arvind_8a1adbd39efd"/>
    <language>en</language>
    <item>
      <title>MCP Servers for Performance Engineering</title>
      <dc:creator>kavin arvind</dc:creator>
      <pubDate>Fri, 18 Sep 2026 18:54:40 +0000</pubDate>
      <link>https://dev.to/kavin_arvind_8a1adbd39efd/mcp-servers-for-performance-engineering-2d1i</link>
      <guid>https://dev.to/kavin_arvind_8a1adbd39efd/mcp-servers-for-performance-engineering-2d1i</guid>
      <description>&lt;p&gt;![MCP servers, wrapped in Copilot agents&lt;/p&gt;

&lt;p&gt;Every performance-testing and observability platform your team already uses — LoadRunner, JMeter,&lt;br&gt;
Dynatrace, Splunk, Lighthouse — now has an MCP server sitting in front of it. That means you can stop&lt;br&gt;
opening five different consoles to answer one question about a load test, and instead ask for the&lt;br&gt;
answer directly: "did checkout regress in the last run," "audit this page on mobile," "run a&lt;br&gt;
pod-delete and give me the resiliency score." The server does the API calls; you just describe the&lt;br&gt;
outcome.&lt;/p&gt;

&lt;p&gt;This post is the practical map for doing that: what each server actually lets you do as a performance&lt;br&gt;
engineer, the real tools behind each capability, the configuration you need to get it running, and a&lt;br&gt;
worked usage scenario for every one. Twelve servers, five categories — load and stress testing,&lt;br&gt;
observability and evidence, resilience and chaos engineering, front-end/client-side testing, and&lt;br&gt;
browser automation — all documented with the actual parameters you'll pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to use this post:&lt;/strong&gt; skim the category you care about, read the "usage in practice" example to&lt;br&gt;
see what a real request looks like, then use the tool table as your reference when you wire it into&lt;br&gt;
an agent. Within every category, official vendor-maintained servers are listed first, community&lt;br&gt;
servers next — so the trust tier is visible before you even reach the details.&lt;/p&gt;

&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h2&gt;
  
  
  1. The shape every one of these servers follows
&lt;/h2&gt;

&lt;p&gt;Before the catalog, the pattern worth internalizing: every MCP server here is a thin, typed adapter&lt;br&gt;
over an existing platform's API or CLI. Nothing more.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────┐        ┌───────────────────────┐        ┌───────────────────────┐
│   MCP Client         │        │   MCP Server            │        │   Underlying Platform  │
│  (Copilot, Claude,    │──────▶│   (this catalog)         │──────▶│  (LoadRunner, Dynatrace,│
│   Cursor, ...)        │◀──────│   typed tools, schemas   │◀──────│   Splunk, JMeter, ...)  │
└────────────────────┘        └───────────────────────┘        └───────────────────────┘
        tools/list                  auth: token / key /              REST, GraphQL, DQL,
        tools/call                  OAuth / CLI child-proc            CLI subprocess, etc.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What varies between servers is the transport (stdio vs. SSE vs. HTTP), the auth model (static keys vs.&lt;br&gt;
OAuth vs. browser-based token exchange), and — the part worth reading carefully — what a tool call&lt;br&gt;
can actually &lt;em&gt;do&lt;/em&gt;: read-only investigation, or an action with a real-world side effect (spend money,&lt;br&gt;
send a message, start a test, delete data).&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Trust tiers, at a glance
&lt;/h2&gt;

&lt;p&gt;Not every server here deserves the same confidence. I use four tiers throughout this reference, and&lt;br&gt;
within every category below, servers are listed &lt;strong&gt;official first, community next&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;th&gt;Servers in this catalog&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🟢 Official&lt;/td&gt;
&lt;td&gt;Maintained by the platform vendor&lt;/td&gt;
&lt;td&gt;k6, BlazeMeter, LitmusChaos, Chrome DevTools MCP, Playwright MCP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔵 Community, verified&lt;/td&gt;
&lt;td&gt;Third-party, source read and confirmed&lt;/td&gt;
&lt;td&gt;LoadRunner Cloud, Apache JMeter, Artillery, Lighthouse, PageSpeed Insights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚫ Deprecated&lt;/td&gt;
&lt;td&gt;Final release shipped; use the named successor&lt;/td&gt;
&lt;td&gt;Dynatrace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚫ Archived&lt;/td&gt;
&lt;td&gt;No longer maintained; an official alternative exists&lt;/td&gt;
&lt;td&gt;Splunk&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five of the twelve servers are official, vendor-maintained projects — more than I expected when I&lt;br&gt;
started this catalog. Two are past end-of-life. That's not a reason to skip them — it's a reason to&lt;br&gt;
read the status line before you build anything durable on top.&lt;/p&gt;

&lt;p&gt;![The five categories, official servers listed first in each]&lt;br&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcpjjw7e6j0i0a3bp9m6.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcpjjw7e6j0i0a3bp9m6.png" alt=" " width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;![Where each agent helps across the performance-engineering lifecycle]&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="p"&gt;![&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/qi2xfhx52k9dzns0w81m.png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Load &amp;amp; stress testing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 k6 MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/grafana/mcp-k6" rel="noopener noreferrer"&gt;&lt;code&gt;grafana/mcp-k6&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; Go · &lt;strong&gt;Status:&lt;/strong&gt; 🟢 official (Grafana Labs) — the maintainers mark it experimental&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; stdio by default, optional Streamable HTTP (&lt;code&gt;-transport=http&lt;/code&gt;) — ships as a Docker image, Homebrew formula, Debian/RPM packages, a native Go binary, or an &lt;code&gt;xk6&lt;/code&gt; subcommand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; none required for local use beyond having &lt;code&gt;k6&lt;/code&gt; on &lt;code&gt;PATH&lt;/code&gt; (or using the Docker image, which bundles it); HTTP mode adds &lt;code&gt;-addr&lt;/code&gt;, &lt;code&gt;-endpoint&lt;/code&gt;, &lt;code&gt;-stateless&lt;/code&gt;, &lt;code&gt;-preload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; none built in — the README is explicit that a remote deployment needs a trusted network or a proxy in front of it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;k6 scripts are JavaScript, and JavaScript is forgiving about compiling into something that silently&lt;br&gt;
does the wrong thing. Plenty of k6 users have shipped a "test" that ran zero real iterations because&lt;br&gt;
of a scenario-config typo, and only found out from a suspiciously fast pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;validate_script&lt;/code&gt; catches structural mistakes before you burn a real run on them — a minimal dry run
at 1 VU, 1 iteration&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;generate_script&lt;/code&gt; drafts a starting script from a plain-English description, grounded in the actual
k6 docs rather than a stale training snapshot&lt;/li&gt;
&lt;li&gt;The documentation tools (&lt;code&gt;list_sections&lt;/code&gt;, &lt;code&gt;get_documentation&lt;/code&gt;) let the agent look up the current k6
API instead of guessing at option names&lt;/li&gt;
&lt;li&gt;Works the same whether you run it locally via Docker or point your whole team at one shared HTTP
instance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; "generate a k6 script that load-tests our login API with authentication, then&lt;br&gt;
validate it" pulls the current k6 docs for scenarios and thresholds, drafts a script, and immediately&lt;br&gt;
runs &lt;code&gt;validate_script&lt;/code&gt; against it — catching a bad &lt;code&gt;stages&lt;/code&gt; array before you ever spend a real run on&lt;br&gt;
it.&lt;/p&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;Parameters&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;validate_script&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;script&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Dry-runs the script (1 VU, 1 iteration) and returns pass/fail plus stdout/stderr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run_script&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;script&lt;/code&gt;, &lt;code&gt;vus?&lt;/code&gt;, &lt;code&gt;duration?&lt;/code&gt; (max 5m), &lt;code&gt;iterations?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Executes the test locally and returns metrics and a summary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_sections&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;version?&lt;/code&gt;, &lt;code&gt;category?&lt;/code&gt;, &lt;code&gt;depth?&lt;/code&gt; (default 1, max 5), &lt;code&gt;root_slug?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Browses the k6 docs tree without loading all of it into context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_documentation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;slug&lt;/code&gt;, &lt;code&gt;version?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Retrieves the full markdown for one docs section&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There's also a &lt;code&gt;generate_script&lt;/code&gt; prompt template (resource URI &lt;code&gt;prompts://k6/generate_script&lt;/code&gt;) that&lt;br&gt;
chains research, best practices, and validation into one guided flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; going from "describe the test in English" to a validated k6 script without leaving the&lt;br&gt;
conversation — and it's the one server here where the maintainers are upfront that it's still&lt;br&gt;
experimental, so budget for rough edges.&lt;/p&gt;




&lt;h3&gt;
  
  
  3.2 BlazeMeter MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/Blazemeter/bzm-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;Blazemeter/bzm-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; Python 3.11+ · &lt;strong&gt;Status:&lt;/strong&gt; 🟢 &lt;strong&gt;official&lt;/strong&gt; (published by BlazeMeter/Perforce)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime options:&lt;/strong&gt; pre-built binary, &lt;code&gt;uvx&lt;/code&gt; (from git), or Docker (&lt;code&gt;ghcr.io/blazemeter/bzm-mcp&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;API_KEY_ID&lt;/code&gt; + &lt;code&gt;API_KEY_SECRET&lt;/code&gt; (or a &lt;code&gt;BLAZEMETER_API_KEY&lt;/code&gt; JSON file), &lt;code&gt;SOURCE_WORKING_DIRECTORY&lt;/code&gt; for Docker mounts, optional &lt;code&gt;SSL_CERT_FILE&lt;/code&gt; for corporate CA bundles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the one entry on this list you can point at a compliance review without an argument — a&lt;br&gt;
vendor-maintained server, from the company that makes the product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenTelemetry ships out of the box, so you get observability into the &lt;em&gt;agent's&lt;/em&gt; behavior for free,
not just the load test's&lt;/li&gt;
&lt;li&gt;Three install paths (binary, &lt;code&gt;uvx&lt;/code&gt;, Docker) mean it fits whatever your team already standardized on&lt;/li&gt;
&lt;li&gt;Cloud-scale execution without you having to run or scale your own load generators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; a quarterly capacity test that used to mean someone manually clicking through&lt;br&gt;
the BlazeMeter console becomes "launch the payments load test in the cloud and tell me how it went" —&lt;br&gt;
the agent starts the run, waits, and reports back with the summary, while OpenTelemetry quietly&lt;br&gt;
records how long each of those calls actually took.&lt;/p&gt;

&lt;p&gt;This is the one official, vendor-maintained server in the load-testing category. Its tool surface&lt;br&gt;
covers the full cloud workflow — creating and managing load-test workflows, executing them, and&lt;br&gt;
retrieving reports — but BlazeMeter documents the exact tool list in their own&lt;br&gt;
&lt;a href="https://help.blazemeter.com/docs/guide/integrations-blazemeter-mcp-server.html" rel="noopener noreferrer"&gt;MCP Server guide&lt;/a&gt;&lt;br&gt;
rather than enumerating every tool in the README, so treat the specific tool names as&lt;br&gt;
vendor-documented rather than independently verified here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observability bonus:&lt;/strong&gt; it ships OpenTelemetry instrumentation out of the box — every tool call&lt;br&gt;
produces a trace (tool name, action, client name/version, session ID) and two metrics&lt;br&gt;
(&lt;code&gt;mcp.tool.calls&lt;/code&gt;, &lt;code&gt;mcp.tool.duration&lt;/code&gt;). Telemetry defaults to BlazeMeter's own collector; you can&lt;br&gt;
redirect it (&lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;) or disable it (&lt;code&gt;OTEL_SDK_DISABLED=true&lt;/code&gt; or &lt;code&gt;--no-telemetry&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; cloud-scale execution when you're already a BlazeMeter customer and want the vendor's&lt;br&gt;
own supported path.&lt;/p&gt;




&lt;h3&gt;
  
  
  3.3 LoadRunner Cloud MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/pbandreddy/loadrunner-cloud-mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;pbandreddy/loadrunner-cloud-mcp-server&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; JavaScript (ESM) · &lt;strong&gt;Status:&lt;/strong&gt; 🔵 community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 18+ (20+ recommended) · &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; 1.9.0 · stdio by default, optional SSE (&lt;code&gt;--sse&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;LRC_BASE_URL&lt;/code&gt;, &lt;code&gt;LRC_TENANT_ID&lt;/code&gt;, &lt;code&gt;LRC_CLIENT_ID&lt;/code&gt;, &lt;code&gt;LRC_CLIENT_SECRET&lt;/code&gt;, optional &lt;code&gt;PORT&lt;/code&gt; (SSE mode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; client credentials exchanged for a bearer token automatically before every call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Engineers finish a spike test and then lose the next quarter hour clicking through the LoadRunner&lt;br&gt;
Cloud UI to find the run, open the transactions tab, and eyeball whether p95 crossed the line. This&lt;br&gt;
server exists to compress that click-through into a question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more hunting for a run ID by hand — the tool chain resolves project → test → run for you&lt;/li&gt;
&lt;li&gt;Percentile math (p90/p95) comes back built into the response, not something you compute from a raw
CSV export&lt;/li&gt;
&lt;li&gt;Read-only by construction, so pointing an agent at it can't accidentally trigger a new test run&lt;/li&gt;
&lt;li&gt;One call (&lt;code&gt;test_runs_getHttpResponses&lt;/code&gt;) gets you straight to the failure evidence instead of a
support ticket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; picture this — your spike test on checkout just finished. Instead of opening a&lt;br&gt;
browser, you ask "did checkout regress in the last run?" The agent resolves the project with&lt;br&gt;
&lt;code&gt;get_projects&lt;/code&gt;, walks to the latest run through &lt;code&gt;projects_getLoadTestRuns&lt;/code&gt;, then pulls&lt;br&gt;
&lt;code&gt;test_runs_getTestRunTransactions&lt;/code&gt; for the percentile table and &lt;code&gt;test_runs_getHttpResponses&lt;/code&gt; if&lt;br&gt;
anything looks off. Thirty seconds later you have an answer instead of a browser tab.&lt;/p&gt;

&lt;p&gt;This server is &lt;strong&gt;read-only&lt;/strong&gt; — it's built for investigating existing LoadRunner Cloud projects and&lt;br&gt;
runs, not for launching new ones. All nine tools require &lt;code&gt;TENANTID&lt;/code&gt; under the hood; you never pass it&lt;br&gt;
yourself.&lt;/p&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;Parameters&lt;/th&gt;
&lt;th&gt;What it returns&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_projects&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;All projects in the tenant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;projects_getLoadTests&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;projectId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Load tests for a project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;projects_getLoadTestScripts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;projectId&lt;/code&gt;, &lt;code&gt;loadTestId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Scripts attached to a load test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;projects_getLoadTestRuns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;projectId&lt;/code&gt;, &lt;code&gt;loadTestId&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Runs for a load test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_active_test_runs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;status?&lt;/code&gt;, &lt;code&gt;projectIds?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Currently active runs, filterable by status (&lt;code&gt;RUNNING&lt;/code&gt;, &lt;code&gt;INITIALIZING&lt;/code&gt;, &lt;code&gt;CHECKING_STATUS&lt;/code&gt;, &lt;code&gt;STOPPING&lt;/code&gt;, &lt;code&gt;DELAYED&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test_runs_getRecentTestRuns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;projectIds?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;License usage for runs in the last 30 days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test_runs_getTestRunResults&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;runId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Overall result/status for a run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test_runs_getTestRunTransactions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;runId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transaction data — &lt;strong&gt;the call always requests the 90th and 95th percentile&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test_runs_getHttpResponses&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;runId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTTP response detail for a run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; "what's the p95 on the latest checkout run" style investigation, without opening the&lt;br&gt;
LRC UI.&lt;/p&gt;




&lt;h3&gt;
  
  
  3.4 Apache JMeter MCP ("JMeter Architect")
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/aravindksk7/Jmeter-MCP" rel="noopener noreferrer"&gt;&lt;code&gt;aravindksk7/Jmeter-MCP&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript → &lt;code&gt;dist/index.js&lt;/code&gt; · &lt;strong&gt;Status:&lt;/strong&gt; 🔵 community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 18+ · Apache JMeter itself only required for the run tool, on &lt;code&gt;PATH&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; invoked as &lt;code&gt;node dist/index.js&lt;/code&gt;; JMeter's &lt;code&gt;bin&lt;/code&gt; directory must be on &lt;code&gt;PATH&lt;/code&gt; for &lt;code&gt;jmeter_run_test&lt;/code&gt; to work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask any engineer who's used JMeter's desktop GUI to add a Header Manager, and you'll get a specific&lt;br&gt;
kind of sigh. This server routes around the GUI entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No hand-edited XML — the tools assemble a structurally valid &lt;code&gt;.jmx&lt;/code&gt; for you, element by element&lt;/li&gt;
&lt;li&gt;Executes in non-GUI mode from the start, so the same plan you build in chat is the one that runs in
CI&lt;/li&gt;
&lt;li&gt;Assertions and listeners are added as explicit tool calls, so nothing gets silently skipped the way
it can in a GUI where a checkbox is easy to miss&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; "build a 100-user checkout test with a 200-status assertion and run it" turns&lt;br&gt;
into a real sequence: &lt;code&gt;jmeter_init_plan&lt;/code&gt;, then a thread group at 100 users, a sampler for the checkout&lt;br&gt;
endpoint, an assertion on the response code, a listener for the aggregate report, and finally&lt;br&gt;
&lt;code&gt;jmeter_run_test&lt;/code&gt;. You get a working &lt;code&gt;.jmx&lt;/code&gt; and a completed run without opening the JMeter desktop app&lt;br&gt;
once.&lt;/p&gt;

&lt;p&gt;This one doesn't call an existing JMeter installation to &lt;em&gt;build&lt;/em&gt; a plan — it constructs a real &lt;code&gt;.jmx&lt;/code&gt;&lt;br&gt;
file, element by element, then hands it to JMeter to execute in non-GUI mode.&lt;/p&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;Required parameters&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_init_plan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;filename&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Creates a fresh, empty &lt;code&gt;.jmx&lt;/code&gt; test plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_thread_group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;num_threads&lt;/code&gt;, &lt;code&gt;ramp_time&lt;/code&gt;, &lt;code&gt;loops&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adds virtual users (&lt;code&gt;loops: -1&lt;/code&gt; = infinite)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_sampler&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;method&lt;/code&gt;, &lt;code&gt;parameters&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adds an HTTP request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_header&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;headers&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adds an HTTP Header Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_listener&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;listener_type&lt;/code&gt; (&lt;code&gt;summary&lt;/code&gt; \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;aggregate&lt;/code&gt; \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_timer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;delay_ms&lt;/code&gt;, &lt;code&gt;random_delay_ms?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Adds think time between requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_add_assertion&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;test_field&lt;/code&gt; (&lt;code&gt;response_data&lt;/code&gt; \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;response_code&lt;/code&gt; \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jmeter_run_test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;filename&lt;/code&gt;, &lt;code&gt;output_file?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Executes the plan in non-GUI mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; building a correct &lt;code&gt;.jmx&lt;/code&gt; from a sentence instead of hand-editing XML — genuinely useful&lt;br&gt;
if you've ever fought JMeter's GUI to add a Header Manager.&lt;/p&gt;




&lt;h3&gt;
  
  
  3.5 Artillery MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/jch1887/artillery-mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;jch1887/artillery-mcp-server&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;Status:&lt;/strong&gt; 🔵 community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 22.18+ · requires the Artillery CLI on &lt;code&gt;PATH&lt;/code&gt; (or &lt;code&gt;ARTILLERY_BIN&lt;/code&gt;) · stdio&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;ARTILLERY_WORKDIR&lt;/code&gt;, &lt;code&gt;ARTILLERY_BIN&lt;/code&gt;, &lt;code&gt;ARTILLERY_TIMEOUT_MS&lt;/code&gt; (default 1,800,000 ms / 30 min), &lt;code&gt;ARTILLERY_MAX_OUTPUT_MB&lt;/code&gt; (default 10), &lt;code&gt;ARTILLERY_ALLOW_QUICK&lt;/code&gt; (default true), &lt;code&gt;DEBUG&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandbox:&lt;/strong&gt; every path is resolved inside &lt;code&gt;ARTILLERY_WORKDIR&lt;/code&gt;; the child process environment is an explicit allow-list, not inherited wholesale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Artillery is one of the fastest load tools to spin up, but its CLI output is a wall of JSON you&lt;br&gt;
re-parse by eye after every run, and the YAML configs tend to live wherever the last person who wrote&lt;br&gt;
one happened to save them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saved configs mean "the smoke test for the payments API" lives in one named place instead of six
local copies&lt;/li&gt;
&lt;li&gt;Built-in regression thresholds turn "looks about the same to me" into an actual pass/fail&lt;/li&gt;
&lt;li&gt;Sandboxing means you can hand this to a teammate — or an agent — without worrying what paths or env
vars it can touch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;quick_test&lt;/code&gt; skips the YAML entirely when you just need to hit an endpoint a few times right now&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; before every deploy, someone on the team runs the same smoke test by hand.&lt;br&gt;
Wired up here, that becomes "run the api-smoke baseline and compare it to last week's." The agent&lt;br&gt;
replays the saved config, parses the JSON results into percentiles and error counts, and tells you&lt;br&gt;
plainly whether anything regressed — no spreadsheet required.&lt;/p&gt;

&lt;p&gt;Eleven tools, split across running tests and managing saved configurations:&lt;/p&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;Parameters&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run_test_from_file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;path&lt;/code&gt;, &lt;code&gt;outputJson?&lt;/code&gt;, &lt;code&gt;reportHtml?&lt;/code&gt;, &lt;code&gt;env?&lt;/code&gt;, &lt;code&gt;cwd?&lt;/code&gt;, &lt;code&gt;validateOnly?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Runs a config file already inside the workdir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run_test_inline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;configText&lt;/code&gt;, &lt;code&gt;outputJson?&lt;/code&gt;, &lt;code&gt;reportHtml?&lt;/code&gt;, &lt;code&gt;env?&lt;/code&gt;, &lt;code&gt;cwd?&lt;/code&gt;, &lt;code&gt;validateOnly?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Config as a YAML/JSON string — Artillery 2.0+ requires &lt;code&gt;flow:&lt;/code&gt; instead of &lt;code&gt;requests:&lt;/code&gt; in scenarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;quick_test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;target&lt;/code&gt;, &lt;code&gt;rate?&lt;/code&gt;, &lt;code&gt;duration?&lt;/code&gt;, &lt;code&gt;count?&lt;/code&gt;, &lt;code&gt;method?&lt;/code&gt;, &lt;code&gt;headers?&lt;/code&gt;, &lt;code&gt;body?&lt;/code&gt;, &lt;code&gt;insecure?&lt;/code&gt;, &lt;code&gt;keepResults?&lt;/code&gt;, &lt;code&gt;outputJson?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;No config file needed; generates a one-request scenario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run_saved_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;outputJson?&lt;/code&gt;, &lt;code&gt;reportHtml?&lt;/code&gt;, &lt;code&gt;env?&lt;/code&gt;, &lt;code&gt;validateOnly?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Runs a previously saved config by name&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;save_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt;, &lt;code&gt;description?&lt;/code&gt;, &lt;code&gt;tags?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Stores under &lt;code&gt;$ARTILLERY_WORKDIR/saved-configs/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_configs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tag?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lists saved configs, optionally filtered by tag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Retrieves a saved config's content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delete_config&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deletes a saved config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;parse_results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jsonPath&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Summarizes a results file: RPS, latency percentiles (p50/p95/p99), HTTP codes, error counts, vuser stats&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;limit?&lt;/code&gt; (default 100)&lt;/td&gt;
&lt;td&gt;Lists result files under the workdir, newest first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_capabilities&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Reports Artillery version, server version, transports, and configured limits&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Note on HTML reports:&lt;/strong&gt; recent Artillery releases removed the &lt;code&gt;report&lt;/code&gt; command; if &lt;code&gt;reportHtml&lt;/code&gt; is&lt;br&gt;
set and no file appears, the server falls back to returning the JSON path with a warning rather than&lt;br&gt;
failing outright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; quick load checks and baseline-vs-current regression comparisons, driven entirely from&lt;br&gt;
chat.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Observability &amp;amp; evidence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Dynatrace MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/dynatrace-oss/dynatrace-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;dynatrace-oss/dynatrace-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; ⚫ &lt;strong&gt;deprecated&lt;/strong&gt; — final release was v2.1.2, no further updates. Migrate to
&lt;a href="https://github.com/Dynatrace/dynatrace-for-ai" rel="noopener noreferrer"&gt;Dynatrace-for-AI&lt;/a&gt; + &lt;a href="https://github.com/dynatrace-oss/dtctl" rel="noopener noreferrer"&gt;&lt;code&gt;dtctl&lt;/code&gt;&lt;/a&gt;
for local use, or the
&lt;a href="https://www.dynatrace.com/hub/detail/dynatrace-mcp-server/" rel="noopener noreferrer"&gt;Dynatrace Remote MCP Server&lt;/a&gt;
for remote/agent-to-agent scenarios. The tool contract below is still representative of the pattern.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 24+ · npm package &lt;code&gt;@dynatrace-oss/dynatrace-mcp-server&lt;/code&gt; · stdio by default, or &lt;code&gt;--http&lt;/code&gt; for an HTTP/bearer-token mode
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;DT_ENVIRONMENT&lt;/code&gt; (required — the &lt;em&gt;Platform&lt;/em&gt; URL, &lt;code&gt;…apps.dynatrace.com&lt;/code&gt;, not the classic &lt;code&gt;…live.dynatrace.com&lt;/code&gt;), &lt;code&gt;DT_PLATFORM_TOKEN&lt;/code&gt; or &lt;code&gt;OAUTH_CLIENT_ID&lt;/code&gt;/&lt;code&gt;OAUTH_CLIENT_SECRET&lt;/code&gt; (optional — otherwise browser OAuth + OS keychain), &lt;code&gt;DT_GRAIL_QUERY_BUDGET_GB&lt;/code&gt; (default 1000), &lt;code&gt;DT_SSO_URL&lt;/code&gt; (optional override)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DQL is powerful and genuinely has a learning curve; the natural-language generate/verify/explain tools&lt;br&gt;
exist specifically so you don't have to memorize it to get an answer out of Grail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;generate_dql_from_natural_language&lt;/code&gt; + &lt;code&gt;verify_dql&lt;/code&gt; means you get a query you can actually read
before it runs against your data&lt;/li&gt;
&lt;li&gt;The Grail budget (&lt;code&gt;DT_GRAIL_QUERY_BUDGET_GB&lt;/code&gt;) turns "oops, that scanned way more than I meant" from a
bill into a warning&lt;/li&gt;
&lt;li&gt;Davis AI (&lt;code&gt;chat_with_davis_copilot&lt;/code&gt;) is there for the "what does this actually mean" follow-up
question a raw query result can't answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; "during the checkout load test window, latency spiked — what happened?"&lt;br&gt;
resolves the service, generates and verifies a DQL query scoped to just that window, and&lt;br&gt;
cross-references &lt;code&gt;list_problems&lt;/code&gt; and &lt;code&gt;list_exceptions&lt;/code&gt; for the same period — landing on a concrete,&lt;br&gt;
correlated answer instead of a wall of log lines.&lt;/p&gt;

&lt;p&gt;Capabilities are grouped by function (the README doesn't present them as a flat numbered list, but&lt;br&gt;
these are every tool named in the source docs):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Observability &amp;amp; problems&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_problems&lt;/code&gt; · &lt;code&gt;list_vulnerabilities&lt;/code&gt; · &lt;code&gt;list_exceptions&lt;/code&gt; · &lt;code&gt;get_kubernetes_events&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Grail queries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;execute_dql&lt;/code&gt; · &lt;code&gt;verify_dql&lt;/code&gt; · &lt;code&gt;generate_dql_from_natural_language&lt;/code&gt; · &lt;code&gt;explain_dql_in_natural_language&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entity discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find_entity_by_name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Davis AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;chat_with_davis_copilot&lt;/code&gt; · &lt;code&gt;list_davis_analyzers&lt;/code&gt; · &lt;code&gt;execute_davis_analyzer&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation &amp;amp; sharing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;send_slack_message&lt;/code&gt; · &lt;code&gt;send_email&lt;/code&gt; · &lt;code&gt;send_event&lt;/code&gt; · &lt;code&gt;create_dynatrace_notebook&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cost matters here:&lt;/strong&gt; &lt;code&gt;execute_dql&lt;/code&gt; scans Grail storage, billed by volume scanned. The server tracks&lt;br&gt;
usage against &lt;code&gt;DT_GRAIL_QUERY_BUDGET_GB&lt;/code&gt; per session and warns at 80% of budget. You can audit actual&lt;br&gt;
consumption with a DQL query against &lt;code&gt;dt.system.events&lt;/code&gt; filtered to&lt;br&gt;
&lt;code&gt;client.client_context&lt;/code&gt; containing &lt;code&gt;"dynatrace-mcp"&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Required OAuth scopes&lt;/strong&gt; vary by tool — at minimum &lt;code&gt;app-engine:apps:run&lt;/code&gt; for nearly everything, plus&lt;br&gt;
the specific &lt;code&gt;storage:*:read&lt;/code&gt; scope for whatever Grail data type you're querying (logs, metrics,&lt;br&gt;
spans, entities, events, etc.), &lt;code&gt;davis-copilot:*:execute&lt;/code&gt; for the AI features, and &lt;code&gt;email:emails:send&lt;/code&gt;&lt;br&gt;
/ &lt;code&gt;document:documents:*&lt;/code&gt; for the sharing tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; correlating a load-test window with production problems and exceptions via DQL — the&lt;br&gt;
worked example in the companion post walks through exactly this.&lt;/p&gt;




&lt;h3&gt;
  
  
  4.2 Splunk MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/livehybrid/splunk-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;livehybrid/splunk-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; ⚫ &lt;strong&gt;archived&lt;/strong&gt; — the README now points to
&lt;a href="https://splunkbase.splunk.com/app/7931" rel="noopener noreferrer"&gt;Splunk's official MCP Server on Splunkbase (app 7931)&lt;/a&gt;.
The tool list below reflects the archived community project; use it to understand the &lt;em&gt;shape&lt;/em&gt; of a
Splunk MCP integration, not as a production recommendation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Python, built on &lt;strong&gt;FastMCP&lt;/strong&gt; · three operating modes: SSE (default), REST API
(&lt;code&gt;python splunk_mcp.py api&lt;/code&gt;), or stdio (&lt;code&gt;python splunk_mcp.py stdio&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;SPLUNK_HOST&lt;/code&gt;, &lt;code&gt;SPLUNK_PORT&lt;/code&gt; (default 8089), &lt;code&gt;SPLUNK_TOKEN&lt;/code&gt; (or &lt;code&gt;SPLUNK_USERNAME&lt;/code&gt; +
&lt;code&gt;SPLUNK_PASSWORD&lt;/code&gt;), &lt;code&gt;SPLUNK_SCHEME&lt;/code&gt; (default https), &lt;code&gt;VERIFY_SSL&lt;/code&gt; (default true), &lt;code&gt;FASTMCP_LOG_LEVEL&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even though the community server here is archived, understanding its shape is exactly what lets you&lt;br&gt;
evaluate Splunk's official replacement with open eyes instead of starting from zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consistent error handling across every tool means a failed search or a permissions issue comes back
as something you can actually act on, not a stack trace&lt;/li&gt;
&lt;li&gt;The KV Store tools double as a lightweight state store for automation, a nice trick if you're
already scripting around Splunk&lt;/li&gt;
&lt;li&gt;Three transport modes (SSE, REST API, stdio) mean it can fit into however your team's tooling
already talks to services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; during an incident, "search the last 30 minutes for checkout errors and&lt;br&gt;
summarize the affected sourcetypes" runs &lt;code&gt;search_splunk&lt;/code&gt; scoped to that window, cross-references&lt;br&gt;
&lt;code&gt;indexes_and_sourcetypes&lt;/code&gt; to explain where the noise is coming from, and gives you a triage-ready&lt;br&gt;
summary instead of a raw search-results table.&lt;/p&gt;

&lt;p&gt;Thirteen tools across five functional groups:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Meta&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;list_tools&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Health&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;health_check&lt;/code&gt; (lists reachable Splunk apps) · &lt;code&gt;ping&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;current_user&lt;/code&gt; · &lt;code&gt;list_users&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Indexes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_indexes&lt;/code&gt; · &lt;code&gt;get_index_info&lt;/code&gt; (params: &lt;code&gt;index_name&lt;/code&gt;) · &lt;code&gt;indexes_and_sourcetypes&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;search_splunk&lt;/code&gt; (params: &lt;code&gt;search_query&lt;/code&gt;, &lt;code&gt;earliest_time?&lt;/code&gt;, &lt;code&gt;latest_time?&lt;/code&gt;, &lt;code&gt;max_results?&lt;/code&gt;) · &lt;code&gt;list_saved_searches&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KV Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_kvstore_collections&lt;/code&gt; · &lt;code&gt;create_kvstore_collection&lt;/code&gt; (params: &lt;code&gt;collection_name&lt;/code&gt;) · &lt;code&gt;delete_kvstore_collection&lt;/code&gt; (params: &lt;code&gt;collection_name&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Error handling is consistent across the tool set: invalid searches, permission failures, missing&lt;br&gt;
resources, and bad input all return a structured error message rather than a bare exception.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; understanding the pattern (search + index introspection + KV store) if you're&lt;br&gt;
evaluating whether to build against Splunk's now-official server instead.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Resilience &amp;amp; chaos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 LitmusChaos MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/litmuschaos/litmus-mcp-server" rel="noopener noreferrer"&gt;&lt;code&gt;litmuschaos/litmus-mcp-server&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; Go · &lt;strong&gt;Status:&lt;/strong&gt; 🟢 &lt;strong&gt;official&lt;/strong&gt; (LitmusChaos project)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; connects to a running LitmusChaos ChaosCenter (3.x) over its GraphQL API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;CHAOS_CENTER_ENDPOINT&lt;/code&gt;, &lt;code&gt;LITMUS_PROJECT_ID&lt;/code&gt;, &lt;code&gt;LITMUS_ACCESS_TOKEN&lt;/code&gt;, optional &lt;code&gt;DEFAULT_INFRA_ID&lt;/code&gt;, optional &lt;code&gt;DEFAULT_ENVIRONMENT_ID&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chaos engineering has a well-earned reputation as YAML archaeology — CRDs, manifests, and&lt;br&gt;
infrastructure wiring before you even get to break anything on purpose. This collapses all of that&lt;br&gt;
into a sentence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Seventeen tools cover the whole lifecycle, from discovering faults in a ChaosHub to registering
infrastructure to reading back a resiliency score — you're not stitching together &lt;code&gt;kubectl&lt;/code&gt; commands
by hand&lt;/li&gt;
&lt;li&gt;Resiliency scoring gives you a number you can actually track release over release, not just a
pass/fail&lt;/li&gt;
&lt;li&gt;It plugs into existing ChaosHub content, so you're not authoring fault definitions from scratch
every time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; before a release, "run a pod-delete on checkout-service in staging for 30&lt;br&gt;
seconds and tell me the resiliency score" starts the experiment, polls its status, checks the probes&lt;br&gt;
attached to it, and reports back a number and a verdict — the entire chaos-engineering loop, in one&lt;br&gt;
exchange.&lt;/p&gt;

&lt;p&gt;The largest tool surface in this list — &lt;strong&gt;17 tools&lt;/strong&gt; — grouped into six functional areas:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Tools (by function)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chaos experiments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;list experiments · get experiment details · run an experiment · stop an experiment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;list runs · get run details · retrieve execution logs · monitor run status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Infrastructure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;list registered infrastructure · get infrastructure details · register new infrastructure · install manifests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;create an environment · list environments · manage infra-to-environment associations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resilience probes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP probes · command (CMD) probes · Kubernetes probes · Prometheus probes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ChaosHub &amp;amp; discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;list ChaosHubs · get fault details · discover available experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Target infrastructure is Kubernetes/OpenShift; target applications are typically microservices,&lt;br&gt;
databases, APIs, and messaging systems. Repository layout for the server itself: &lt;code&gt;main.go&lt;/code&gt; (server&lt;br&gt;
setup), &lt;code&gt;handlers.go&lt;/code&gt; (tool handlers), &lt;code&gt;go.mod&lt;/code&gt;, a &lt;code&gt;Dockerfile&lt;/code&gt;, and a &lt;code&gt;Makefile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; "run a pod-delete on the checkout service for 30 seconds and tell me the resiliency&lt;br&gt;
score" — the whole point of chaos engineering, minus the YAML and CRDs.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Front-end / client-side testing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Chrome DevTools MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;ChromeDevTools/chrome-devtools-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;Status:&lt;/strong&gt; 🟢 &lt;strong&gt;official&lt;/strong&gt; (the Google Chrome DevTools team)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js LTS, current stable Chrome · install via &lt;code&gt;npx -y chrome-devtools-mcp@latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;--headless&lt;/code&gt;, &lt;code&gt;--isolated&lt;/code&gt;, &lt;code&gt;--slim&lt;/code&gt; (basic-only tool set), &lt;code&gt;--no-performance-crux&lt;/code&gt; (disable CrUX lookups), &lt;code&gt;--no-usage-statistics&lt;/code&gt; or &lt;code&gt;CHROME_DEVTOOLS_MCP_NO_USAGE_STATISTICS&lt;/code&gt; (opt out of telemetry), &lt;code&gt;CHROME_DEVTOOLS_MCP_NO_UPDATE_CHECKS&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; none — it drives a local (or connected) Chrome instance directly via Puppeteer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the biggest tool surface in the whole catalog — 58 tools — because it isn't just a&lt;br&gt;
performance tool, it's the entire DevTools panel exposed to an agent: Performance, Network, Elements,&lt;br&gt;
Memory profiling, even PWA install/launch and browser extension management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real Chrome performance traces (&lt;code&gt;performance_start_trace&lt;/code&gt; / &lt;code&gt;performance_stop_trace&lt;/code&gt; /
&lt;code&gt;performance_analyze_insight&lt;/code&gt;) give you actual Core Web Vitals data, not an estimate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lighthouse_audit&lt;/code&gt; covers accessibility, SEO, best practices, and "agentic browsing" in the same
session as your performance trace — one browser, one context, several kinds of evidence&lt;/li&gt;
&lt;li&gt;The accessibility-tree snapshot (&lt;code&gt;take_snapshot&lt;/code&gt;) lets an agent click, fill, and navigate a real
page reliably, without brittle pixel coordinates&lt;/li&gt;
&lt;li&gt;Ships from the same team that builds DevTools itself, so it tracks Chrome's actual internals rather
than reverse-engineering them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; "check the performance of the checkout page and tell me what's hurting LCP"&lt;br&gt;
navigates to the page, starts a trace with &lt;code&gt;performance_start_trace&lt;/code&gt; (reload enabled), stops it, and&lt;br&gt;
calls &lt;code&gt;performance_analyze_insight&lt;/code&gt; for the specific insight — usually something concrete like&lt;br&gt;
render-blocking CSS or an oversized hero image, backed by the same trace data you'd get by hand in&lt;br&gt;
DevTools.&lt;/p&gt;

&lt;p&gt;The full reference lists all 58 tools; the groups most relevant to performance and front-end testing:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Tool count&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;performance_start_trace&lt;/code&gt;, &lt;code&gt;performance_stop_trace&lt;/code&gt;, &lt;code&gt;performance_analyze_insight&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;list_network_requests&lt;/code&gt;, &lt;code&gt;get_network_request&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lighthouse_audit&lt;/code&gt;, &lt;code&gt;take_snapshot&lt;/code&gt;, &lt;code&gt;take_screenshot&lt;/code&gt;, &lt;code&gt;evaluate_script&lt;/code&gt;, &lt;code&gt;get_css_styles&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Navigation automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;navigate_page&lt;/code&gt;, &lt;code&gt;new_page&lt;/code&gt;, &lt;code&gt;wait_for&lt;/code&gt;, &lt;code&gt;list_pages&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Input automation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;click&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;fill_form&lt;/code&gt;, &lt;code&gt;hover&lt;/code&gt;, &lt;code&gt;press_key&lt;/code&gt;, &lt;code&gt;upload_file&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Emulation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;emulate&lt;/code&gt; (viewport, network throttling, dark mode), &lt;code&gt;resize_page&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;heap snapshot capture, comparison, and querying&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensions, third-party tools, WebMCP, PWA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;13 combined&lt;/td&gt;
&lt;td&gt;browser extension and installed-app management&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; the same "audit this page" job as Lighthouse MCP, but backed by real trace data and the&lt;br&gt;
option to drive the page first (log in, add items to a cart, then trace the checkout flow) instead of&lt;br&gt;
only auditing a cold page load. Use &lt;code&gt;--slim&lt;/code&gt; if you want the input/navigation/debugging basics without&lt;br&gt;
the full 58-tool surface.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.2 Lighthouse MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/priyankark/lighthouse-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;priyankark/lighthouse-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;Status:&lt;/strong&gt; 🔵 community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 22.19+, Chrome/Chromium (sandboxed) · install via MCP Registry, &lt;code&gt;npx lighthouse-mcp&lt;/code&gt;, or global npm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;AUDIT_ALLOW_LOOPBACK&lt;/code&gt; (default true; set &lt;code&gt;false&lt;/code&gt; for hosted/public-only audits)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next to Chrome DevTools MCP's 58 tools, it's genuinely refreshing that this one only has two —&lt;br&gt;
sometimes you just want a score, not a workflow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSRF and DNS-rebinding protections are on by default, so it's safe to expose this to a shared bot or
a hosted worker&lt;/li&gt;
&lt;li&gt;Fast enough to run on every pull request without anyone noticing the extra time&lt;/li&gt;
&lt;li&gt;Mobile-first defaults, which matches where most real users actually are&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; a PR touching the checkout page triggers "audit this page on mobile and tell me&lt;br&gt;
the top fixes." &lt;code&gt;run_audit&lt;/code&gt; comes back with a score and a category breakdown; if all you need is the&lt;br&gt;
headline number, &lt;code&gt;get_performance_score&lt;/code&gt; skips the rest of the audit and answers in a fraction of the&lt;br&gt;
time.&lt;/p&gt;

&lt;p&gt;Deliberately minimal — two tools, both wrapping Google Lighthouse directly:&lt;/p&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;Parameters&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;run_audit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;categories?&lt;/code&gt; (&lt;code&gt;performance&lt;/code&gt;, &lt;code&gt;accessibility&lt;/code&gt;, &lt;code&gt;best-practices&lt;/code&gt;, &lt;code&gt;seo&lt;/code&gt; — default all), &lt;code&gt;device?&lt;/code&gt; (&lt;code&gt;mobile&lt;/code&gt; default \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;desktop&lt;/code&gt;), &lt;code&gt;throttling?&lt;/code&gt; (default true)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_performance_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;device?&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Performance score only — faster than a full audit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Safety model, worth calling out explicitly:&lt;/strong&gt; Chrome runs sandboxed; loopback/private/link-local/&lt;br&gt;
cloud-metadata destinations are blocked by default (redirects included) to prevent SSRF and DNS&lt;br&gt;
rebinding; audits are serialized one-at-a-time with a 120-second timeout; Chrome and the audit proxy&lt;br&gt;
are torn down after every run, success or failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; a fast "what's wrong with this page" check, safe enough to point at a hosted worker.&lt;/p&gt;




&lt;h3&gt;
  
  
  6.3 PageSpeed Insights MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/ruslanlap/pagespeed-insights-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;ruslanlap/pagespeed-insights-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;Status:&lt;/strong&gt; 🔵 community&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 20.19+ · &lt;code&gt;npx -y pagespeed-insights-mcp&lt;/code&gt;, npm global, or Docker&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;GOOGLE_API_KEY&lt;/code&gt; (with the PageSpeed Insights API enabled in Google Cloud Console)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lighthouse alone tells a small lie — it's a lab measurement over a throttled connection, which is&lt;br&gt;
pessimistic by design. PageSpeed adds the real-user CrUX data that says what's actually happening in&lt;br&gt;
production, so the two together stop you from either overreacting to a lab number or ignoring a real&lt;br&gt;
regression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lab and field data live behind one conversational interface instead of two separate dashboards&lt;/li&gt;
&lt;li&gt;Built-in baseline comparison means "did the release regress?" is a single tool call, not a manual
diff&lt;/li&gt;
&lt;li&gt;Batch analysis triages up to ten pages at once, which matters the moment you're auditing more than a
homepage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; after a release, "compare mobile performance of the old and new build and&lt;br&gt;
prioritize the fixes" runs &lt;code&gt;pagespeed_analyze_page&lt;/code&gt; against both, pulls &lt;code&gt;pagespeed_get_field_data&lt;/code&gt; for&lt;br&gt;
the real-user view, and hands back a ranked list — usually something unglamorous like an unoptimized&lt;br&gt;
hero image or a blocking third-party script.&lt;/p&gt;

&lt;p&gt;Version 2 of this server deliberately &lt;strong&gt;replaced 19 endpoint-shaped tools with six workflow tools&lt;/strong&gt; —&lt;br&gt;
worth knowing if you find v1 examples online, since the old tool names no longer exist.&lt;/p&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;Key parameters&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_analyze_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;strategy&lt;/code&gt; (mobile/desktop), &lt;code&gt;report&lt;/code&gt; (&lt;code&gt;full&lt;/code&gt; \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;summary&lt;/code&gt; \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_diagnose_page&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;focus&lt;/code&gt; (&lt;code&gt;visual&lt;/code&gt; \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;elements&lt;/code&gt; \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_get_field_data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;url&lt;/code&gt; or origin, &lt;code&gt;scope&lt;/code&gt; (&lt;code&gt;page&lt;/code&gt; \&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;origin&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_compare_pages&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;two URLs, or one URL + &lt;code&gt;mode: baseline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Page-vs-page or page-vs-saved-baseline comparison&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_analyze_batch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1–10 URLs&lt;/td&gt;
&lt;td&gt;Triage many pages at once, with progress notifications where the client supports it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pagespeed_clear_cache&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;em&gt;(none)&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Clears the in-memory API-response cache (useful right after a deploy)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every data-returning tool accepts &lt;code&gt;responseFormat: markdown&lt;/code&gt; (default) or &lt;code&gt;json&lt;/code&gt;, and results come back&lt;br&gt;
as structured MCP &lt;code&gt;structuredContent&lt;/code&gt;, not just prose.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; combining &lt;strong&gt;lab&lt;/strong&gt; results (Lighthouse, throttled and therefore pessimistic) with &lt;strong&gt;field&lt;/strong&gt;&lt;br&gt;
results (CrUX, what real visitors experienced) in the same conversation — the README's own example&lt;br&gt;
shows GitHub.com scoring 54/100 in the lab while CrUX shows real users seeing a 1.9s FCP, which is a&lt;br&gt;
good illustration of why you want both.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Automation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Playwright MCP
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/microsoft/playwright-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;microsoft/playwright-mcp&lt;/code&gt;&lt;/a&gt; · &lt;strong&gt;Language:&lt;/strong&gt; TypeScript · &lt;strong&gt;Status:&lt;/strong&gt; 🟢 &lt;strong&gt;official&lt;/strong&gt; (Microsoft) — source lives in the main &lt;a href="https://github.com/microsoft/playwright" rel="noopener noreferrer"&gt;Playwright monorepo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime:&lt;/strong&gt; Node.js 18+ · install via &lt;code&gt;npx @playwright/mcp@latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config:&lt;/strong&gt; &lt;code&gt;--browser&lt;/code&gt; (chrome/firefox/webkit/msedge), &lt;code&gt;--headless&lt;/code&gt;, &lt;code&gt;--isolated&lt;/code&gt; (fresh profile per session) or persistent profile (default), &lt;code&gt;--device&lt;/code&gt; / &lt;code&gt;--mobile&lt;/code&gt; emulation, &lt;code&gt;--caps vision,pdf,devtools&lt;/code&gt; for optional extra capabilities, &lt;code&gt;--cdp-endpoint&lt;/code&gt; to attach to an already-running browser, &lt;code&gt;--allowed-origins&lt;/code&gt; / &lt;code&gt;--blocked-origins&lt;/code&gt; for network scoping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth:&lt;/strong&gt; none by default — trust boundaries are enforced through &lt;code&gt;--allowed-origins&lt;/code&gt;/&lt;code&gt;--blocked-origins&lt;/code&gt; and the workspace-root file-access restriction, not credentials&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the server this workspace's own LoadRunner Agent framework already leans on: the&lt;br&gt;
&lt;code&gt;lr-record-auto&lt;/code&gt; and &lt;code&gt;lr-record-manual&lt;/code&gt; skills drive Playwright MCP to record a real UI journey, and&lt;br&gt;
&lt;code&gt;lr-generate-har&lt;/code&gt; replays it headlessly to produce the HAR that feeds LoadRunner UI Vuser script&lt;br&gt;
generation. If you're already scripting browser automation for that pipeline, this is the same tool —&lt;br&gt;
you don't need a second one for general-purpose browser automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Works off the accessibility tree by default, not screenshots — faster, more deterministic, and it
doesn't need a vision-capable model&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--isolated&lt;/code&gt; sessions give you a clean-slate browser for every recording, so cookies and login state
from a previous run can't leak into the next one&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--cdp-endpoint&lt;/code&gt; lets you attach to a browser you already launched — useful for recording against a
real, already-authenticated session instead of automating a fresh login every time&lt;/li&gt;
&lt;li&gt;The same server doubles as your UI-automation recorder and your day-to-day "go check this page for
me" browser agent — one integration, two jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage in practice:&lt;/strong&gt; ask it to "log into staging, add an item to the cart, and go to checkout" and it&lt;br&gt;
takes a snapshot of the page, clicks and fills using the accessibility tree, and can hand that journey&lt;br&gt;
off as the seed for a LoadRunner Web Vuser script — the exact loop this repo's &lt;code&gt;lr-record-auto&lt;/code&gt; skill&lt;br&gt;
automates end to end.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Representative tools&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Navigation &amp;amp; interaction&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;browser_navigate&lt;/code&gt;, &lt;code&gt;browser_click&lt;/code&gt;, &lt;code&gt;browser_type&lt;/code&gt;, &lt;code&gt;browser_hover&lt;/code&gt;, &lt;code&gt;browser_press_key&lt;/code&gt;, &lt;code&gt;browser_select_option&lt;/code&gt;, &lt;code&gt;browser_drag&lt;/code&gt;, &lt;code&gt;browser_file_upload&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Structured, accessibility-tree-driven actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inspection&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;browser_snapshot&lt;/code&gt;, &lt;code&gt;browser_take_screenshot&lt;/code&gt;, &lt;code&gt;browser_console_messages&lt;/code&gt;, &lt;code&gt;browser_network_requests&lt;/code&gt;, &lt;code&gt;browser_evaluate&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Read the page state without guessing from pixels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session &amp;amp; tabs&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;browser_tabs&lt;/code&gt;, &lt;code&gt;browser_wait_for&lt;/code&gt;, &lt;code&gt;browser_resize&lt;/code&gt;, &lt;code&gt;browser_close&lt;/code&gt;, &lt;code&gt;browser_install&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Multi-tab and lifecycle management&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The exact tool list ships with the server and is documented in full in its own reference — treat the&lt;br&gt;
names above as the stable, widely-referenced surface rather than an independently re-verified list from&lt;br&gt;
source in this pass, the same treatment given to BlazeMeter's tool names earlier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good for:&lt;/strong&gt; the automation category exists because of this one server — general-purpose browser&lt;br&gt;
scripting that happens to be the same tool this repo's own UI-recording pipeline is built on, so wiring&lt;br&gt;
it in once covers both "record a user journey for load testing" and "go check something on this page&lt;br&gt;
for me."&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Server comparison at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Tool count&lt;/th&gt;
&lt;th&gt;Transport&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Load &amp;amp; stress&lt;/td&gt;
&lt;td&gt;🟢 official&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;stdio / HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BlazeMeter&lt;/td&gt;
&lt;td&gt;Load &amp;amp; stress&lt;/td&gt;
&lt;td&gt;🟢 official&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;cloud workflows (vendor-documented)&lt;/td&gt;
&lt;td&gt;stdio / HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LoadRunner Cloud&lt;/td&gt;
&lt;td&gt;Load &amp;amp; stress&lt;/td&gt;
&lt;td&gt;🔵 community&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;stdio / SSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Load &amp;amp; stress&lt;/td&gt;
&lt;td&gt;🔵 community&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Load &amp;amp; stress&lt;/td&gt;
&lt;td&gt;🔵 community&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynatrace&lt;/td&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;⚫ deprecated&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;stdio / HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Splunk&lt;/td&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;⚫ archived&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;stdio / SSE / API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LitmusChaos&lt;/td&gt;
&lt;td&gt;Resilience&lt;/td&gt;
&lt;td&gt;🟢 official&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;GraphQL-backed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome DevTools MCP&lt;/td&gt;
&lt;td&gt;Front-end&lt;/td&gt;
&lt;td&gt;🟢 official&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lighthouse&lt;/td&gt;
&lt;td&gt;Front-end&lt;/td&gt;
&lt;td&gt;🔵 community&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PageSpeed Insights&lt;/td&gt;
&lt;td&gt;Front-end&lt;/td&gt;
&lt;td&gt;🔵 community&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;6 (v2)&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playwright MCP&lt;/td&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;td&gt;🟢 official&lt;/td&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;20+ (vendor-documented)&lt;/td&gt;
&lt;td&gt;stdio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;140+ independently-catalogued tools across ten servers, plus two more (BlazeMeter, Playwright) with&lt;br&gt;
vendor-documented tool surfaces — twelve servers, five categories, and that's before anyone writes the&lt;br&gt;
agent layer on top of them.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. What trips people up in practice
&lt;/h2&gt;

&lt;p&gt;These are the specific things that cause a working integration to quietly break, not a generic&lt;br&gt;
best-practices list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The docs can undersell the tool list.&lt;/strong&gt; LoadRunner Cloud's README doesn't mention
&lt;code&gt;test_runs_getRecentTestRuns&lt;/code&gt;, but it's fully wired and returns real license-usage data. Check what
your MCP client actually discovers at connection time before assuming a capability isn't there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Old tool names stop working silently.&lt;/strong&gt; PageSpeed Insights replaced 19 endpoint-shaped tools with
6 workflow tools in its v2 release. Any example referencing the old names (&lt;code&gt;analyze_page_speed&lt;/code&gt;,
&lt;code&gt;get_recommendations&lt;/code&gt;, etc.) will fail against a current install — check the version before you
copy a snippet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two of these servers are past end-of-life.&lt;/strong&gt; Dynatrace's and Splunk's community servers are both
deprecated or archived. The tool contracts are still useful to learn from, but point production
traffic at the vendor's current offering instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-bearing tools need a budget before you use them, not after.&lt;/strong&gt; &lt;code&gt;execute_dql&lt;/code&gt; (Dynatrace) scans
Grail storage by volume. Nothing stops a broad query across 90 days of data the first time someone
asks a vague question — set the budget first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every tool is safe to auto-run.&lt;/strong&gt; Several servers mix read tools with ones that have real side
effects — &lt;code&gt;send_email&lt;/code&gt;, &lt;code&gt;send_slack_message&lt;/code&gt;, &lt;code&gt;create_kvstore_collection&lt;/code&gt;,
&lt;code&gt;delete_kvstore_collection&lt;/code&gt;. The tool schema itself won't tell you which is which; you have to decide
that before wiring one up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSE and stdio aren't interchangeable.&lt;/strong&gt; LoadRunner Cloud and Splunk both support multiple
transports, but with different startup flags and, in Splunk's case, different default behavior per
mode. Check the mode-specific section, not just the quickstart.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single official server can dwarf all the others combined.&lt;/strong&gt; Chrome DevTools MCP alone exposes 58
tools — more than every other server in this catalog put together. If your client loads every tool
schema into context by default, use &lt;code&gt;--slim&lt;/code&gt; or an explicit allow-list instead of eating that cost
on every request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright's persistent profile is exclusive.&lt;/strong&gt; Only one browser instance can use the default
persistent profile at a time; running two MCP clients against the same workspace will conflict. Use
&lt;code&gt;--isolated&lt;/code&gt; or a distinct &lt;code&gt;--user-data-dir&lt;/code&gt; for parallel sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Production considerations
&lt;/h2&gt;

&lt;p&gt;A short checklist worth running before any of these servers goes anywhere near a shared environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pin tool names, don't trust discovery blindly.&lt;/strong&gt; MCP's dynamic tool listing means a server
operator can rename or remove a tool at any time. If your integration depends on a specific tool
existing, maintain an explicit allow-list and fail loudly if it's missing, rather than silently
adapting to whatever the server currently exposes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cap cost-bearing queries.&lt;/strong&gt; Dynatrace exposes &lt;code&gt;DT_GRAIL_QUERY_BUDGET_GB&lt;/code&gt; for exactly this reason —
use it, and default to short timeframes (12–24h) rather than open-ended windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gate side-effecting tools behind approval.&lt;/strong&gt; Anything that sends a message, creates a resource, or
deletes data should require an explicit human or policy-engine confirmation, the same way you'd
gate a write-capable API call in any other system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify auth scope requirements up front.&lt;/strong&gt; Dynatrace alone has more than a dozen distinct OAuth
scopes depending on which tools you use (&lt;code&gt;storage:logs:read&lt;/code&gt;, &lt;code&gt;storage:spans:read&lt;/code&gt;,
&lt;code&gt;davis-copilot:*:execute&lt;/code&gt;, and so on) — request only what the tools you actually use require.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track server status over time.&lt;/strong&gt; A server that's 🔵 community-verified today can become ⚫
archived next quarter (as happened to Splunk's). Revisit this catalog's status column periodically
rather than treating it as a one-time check.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't stand up a second browser-automation server.&lt;/strong&gt; If a team already wires up Playwright MCP for
UI-script generation (as this repo's LoadRunner Agent framework does), reuse that connection instead
of adding Chrome DevTools MCP or a third browser tool for the same job — decide which one owns
browser automation and route everything through it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this — the tool names, the parameters, the trust tiers — matters on its own. What matters is&lt;br&gt;
what happens once one of these is wired into a Copilot agent with a clear job and a few guardrails: a&lt;br&gt;
ninety-minute investigation turns into a two-minute conversation, and a tool you'd otherwise have to&lt;br&gt;
look up becomes a capability your team just &lt;em&gt;has&lt;/em&gt;. The companion posts in this series walk through&lt;br&gt;
exactly that wiring, with a full worked example against Dynatrace — the config, the agent&lt;br&gt;
instructions, and a real conversation, not just a table of tool names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Part 2 is coming&lt;/strong&gt; — a follow-up post on building the actual GitHub Copilot custom agents that sit&lt;br&gt;
in front of these MCP servers: the agent files, the tool-order and guardrail decisions, and worked&lt;br&gt;
examples beyond Dynatrace.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Credits &amp;amp; references
&lt;/h2&gt;

&lt;p&gt;Every project below is third-party open source. Thank you to the maintainers — please check each&lt;br&gt;
repository's license and current maintenance status before depending on it in production.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;k6 — &lt;a href="https://github.com/grafana/mcp-k6" rel="noopener noreferrer"&gt;https://github.com/grafana/mcp-k6&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;BlazeMeter — &lt;a href="https://github.com/Blazemeter/bzm-mcp" rel="noopener noreferrer"&gt;https://github.com/Blazemeter/bzm-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LoadRunner Cloud — &lt;a href="https://github.com/pbandreddy/loadrunner-cloud-mcp-server" rel="noopener noreferrer"&gt;https://github.com/pbandreddy/loadrunner-cloud-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Apache JMeter — &lt;a href="https://github.com/aravindksk7/Jmeter-MCP" rel="noopener noreferrer"&gt;https://github.com/aravindksk7/Jmeter-MCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Artillery — &lt;a href="https://github.com/jch1887/artillery-mcp-server" rel="noopener noreferrer"&gt;https://github.com/jch1887/artillery-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dynatrace — &lt;a href="https://github.com/dynatrace-oss/dynatrace-mcp" rel="noopener noreferrer"&gt;https://github.com/dynatrace-oss/dynatrace-mcp&lt;/a&gt; (deprecated → &lt;a href="https://github.com/Dynatrace/dynatrace-for-ai" rel="noopener noreferrer"&gt;Dynatrace-for-AI&lt;/a&gt; / &lt;a href="https://github.com/dynatrace-oss/dtctl" rel="noopener noreferrer"&gt;dtctl&lt;/a&gt; / &lt;a href="https://www.dynatrace.com/hub/detail/dynatrace-mcp-server/" rel="noopener noreferrer"&gt;Remote MCP Server&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Splunk — &lt;a href="https://github.com/livehybrid/splunk-mcp" rel="noopener noreferrer"&gt;https://github.com/livehybrid/splunk-mcp&lt;/a&gt; (archived → &lt;a href="https://splunkbase.splunk.com/app/7931" rel="noopener noreferrer"&gt;official app 7931&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;LitmusChaos — &lt;a href="https://github.com/litmuschaos/litmus-mcp-server" rel="noopener noreferrer"&gt;https://github.com/litmuschaos/litmus-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chrome DevTools MCP — &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Lighthouse — &lt;a href="https://github.com/priyankark/lighthouse-mcp" rel="noopener noreferrer"&gt;https://github.com/priyankark/lighthouse-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PageSpeed Insights — &lt;a href="https://github.com/ruslanlap/pagespeed-insights-mcp" rel="noopener noreferrer"&gt;https://github.com/ruslanlap/pagespeed-insights-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Playwright MCP — &lt;a href="https://github.com/microsoft/playwright-mcp" rel="noopener noreferrer"&gt;https://github.com/microsoft/playwright-mcp&lt;/a&gt; (source in &lt;a href="https://github.com/microsoft/playwright" rel="noopener noreferrer"&gt;microsoft/playwright&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;This post is a companion to &lt;a href="//mcp-performance-guide.md"&gt;"A Field Guide to MCP Servers for Performance Engineering"&lt;/a&gt;,&lt;br&gt;
which covers the agent-design pattern and a worked Dynatrace example. This one is the reference you&lt;br&gt;
come back to when you're deciding which server to wire up next. **Part 2&lt;/em&gt;* picks up from here and&lt;br&gt;
walks through building the Copilot agents themselves.*&lt;/p&gt;

</description>
      <category>agents</category>
      <category>mcp</category>
      <category>performance</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
