dynatrace-bridge-mcp
Allows AI assistants to query Dynatrace Managed observability data such as services, traces, metrics, pods, and problems through a logged-in browser session, using read-only GET requests to a fixed set of Dynatrace routes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dynatrace-bridge-mcpshow me the current open problems in Dynatrace"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Dynatrace Bridge MCP
English | Türkçe
Let your AI assistant query Dynatrace Managed (services, traces, metrics, pods, problems) through your logged-in browser tab. No API tokens, and read-only by construction.

Dynatrace Managed clusters behind corporate SSO rarely hand out API tokens, and the public API answers 401 without one. Your browser session is the credential you already have. A small extension runs the requests inside your Dynatrace tab, and an MCP server turns the answers into compact text for Claude Code, Cursor, Codex or any other MCP client. The bridge can only send GET requests to a fixed list of Dynatrace routes, so it cannot change anything in your environment.

Setup
Takes about two minutes. Using an AI agent with a terminal? Let it do the setup.
1. Add it to your AI client
claude mcp add --scope user dynatrace-bridge-mcp -- npx -y dynatrace-bridge-mcp@latest--scope user makes it available in all your projects (leave it out to add it to the current project only). Your client starts the server by itself whenever it needs it, and @latest keeps it up to date.
JSON config (Claude Desktop, Cursor and most other clients):
{
"mcpServers": {
"dynatrace-bridge-mcp": {
"command": "npx",
"args": ["-y", "dynatrace-bridge-mcp@latest"]
}
}
}Config files: Claude Desktop ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows). Cursor ~/.cursor/mcp.json.
codex mcp add dynatrace-bridge-mcp -- npx -y dynatrace-bridge-mcp@latest
gemini mcp add dynatrace-bridge-mcp npx dynatrace-bridge-mcp@latest
code --add-mcp '{"name":"dynatrace-bridge-mcp","command":"npx","args":["-y","dynatrace-bridge-mcp@latest"]}'Windows: many clients can't find npx on their own, so run it through cmd /c. For example claude mcp add --scope user dynatrace-bridge-mcp -- cmd /c npx -y dynatrace-bridge-mcp@latest, or "command": "cmd", "args": ["/c", "npx", "-y", "dynatrace-bridge-mcp@latest"] in JSON.
Standalone server: run npx -y dynatrace-bridge-mcp@latest in a terminal and connect clients to http://localhost:47832/mcp (or /sse for older clients).
Several clients at once: the first instance owns the two ports. Every further instance started by another client forwards its tool calls to the first one, so all clients share one browser connection. When the first one goes away (its client was closed, for example), one of the others takes over the ports by itself within a few seconds and the rest follow it; nothing has to be reconnected.
2. Install the browser extension
npx -y dynatrace-bridge-mcp@latest install-extensionThis copies the extension to ~/.dynatrace-bridge/extension, puts that path on your clipboard and opens your browser's extensions page. There, turn on Developer mode, click Load unpacked and paste the path.
Works in Chrome, Edge, Brave, Arc, Vivaldi, Opera and other Chromium browsers (not Firefox or Safari). Install it in the browser where you are logged in to Dynatrace.

In Edge, Developer mode is in the left sidebar. In the folder picker, press ⌘⇧G on macOS or use the address bar on Windows to paste the path. Add --browser brave (or chrome, edge, arc, vivaldi, opera, chromium) to the command to pick a browser other than your default, or --lang tr|en to set the output language.
3. Add your environment
Open Dynatrace (a URL that contains /e/<environment id>/), log in, click the extension icon and press Add this environment. Chrome then asks whether the extension may access that site; allow it. The extension has no access to any site until you add one, and it only ever asks for the Dynatrace origin you are on.
The environment gets a short name (the environment id, or its last dash-separated part: acme-shop-s1 becomes s1). Click the name to rename it; the AI selects the environment by this name. Repeat for other environments (stage, prod, …). The first one is the default.
A small pill then appears in the bottom right corner of your Dynatrace tabs. It shows whether the AI is connected and what it is asking for while it works. Click its dot to collapse it.
You don't have to keep Dynatrace in front. The bridge uses an open Dynatrace tab in the background, without focusing it. If no tab is open, it opens one in front of you, so that you can log in if Dynatrace asks.
4. Try it
Which services got slower in the last two hours? Pick the worst one and tell me where its time goes.
Updating
The server updates by itself: @latest makes your client start the newest version the next time it starts. When the extension falls behind the server, you are told in three places: the extension popup, the pill in the Dynatrace tab, and a note at the end of the AI's tool results. Re-run the install-extension command, then click reload ↻ on Dynatrace Bridge in the extensions page.
The same places tell you to restart your AI client when the running server is older than the extension, or when a newer release exists on npm.
Related MCP server: Dynatrace SaaS MCP Server
Let your AI do the setup
Paste this into Claude Code, Codex, Cursor or any agent with a terminal:
Set up dynatrace-bridge-mcp for me by following https://github.com/yunusemregul/dynatrace-bridge-mcp#for-ai-agents
For AI agents
You can run steps 1 and 2. The browser steps need the user, because browsers don't let scripts enable Developer mode, load extensions or grant site access.
Check
node --versionis 18 or newer, then register the server with the client you're running in (commands; use thecmd /cform on Windows).Run
npx -y dynatrace-bridge-mcp@latest install-extension. It prints the folder path (--no-openskips opening the browser,--no-copyleaves the clipboard alone,--browser <name>picks a browser).Ask the user to turn on Developer mode, click Load unpacked and paste that path. Wait for them to confirm.
Ask the user to open Dynatrace, log in, click the Dynatrace Bridge icon (in the puzzle-piece menu if not pinned), press Add this environment and allow site access in the browser prompt.
Ask the user to restart the client or reconnect MCP servers (
/mcpin Claude Code) so the tools load.Verify with
curl -s http://localhost:47832/health. You want"connected":trueand at least one name in"environments". No answer means the client hasn't started the server yet. Finish withdynatrace_bridge_status(passcheck_session: trueto test the login as well).
What to ask
Ask | Tools the AI reaches for |
"Which endpoints are the slowest?" |
|
"Which endpoints use the most CPU / fail the most?" |
|
"Why is the checkout service failing?" |
|
"Where does this service spend its time?" |
|
"Which SQL is slow, and who runs it?" |
|
"Which cron jobs take the longest?" |
|
"Why does this pod restart? Was it OOM-killed?" |
|
"What happened in problem P-12345?" |
|
"Show me slow traces of |
|
Tools
39 tools, listed in the order the server presents them.
Start here: status, entities, metrics
Tool | What it does |
| Server and extension versions, connected browsers, configured environments; optionally checks each login. |
| Finds entities of any type by name or entity selector and returns their ids. |
| One entity in full: properties, tags, management zones, relationships. |
| Searches the metric catalogue for ids, units and dimensions. |
| Runs any metric selector and summarises each series (min, avg, max, trend, values over time). |
Services, events, problems
Tool | What it does |
| Services with response time, failure rate and throughput; sortable. |
| One service: percentiles, failures, throughput, callers and callees, hosts and pods, problems. |
| Deployments, restarts, Kubernetes and anomaly events, identical ones collapsed. |
| Problems active in the window, filterable by status, impact, severity and entity. |
| One problem as a compact overview: evidence by entity, root cause findings, impact, trigger event, affected requests, dependency path; |
Kubernetes, hosts, processes
Tool | What it does |
| Workloads with running and desired pods, CPU and memory against requests and limits. |
| Pods of a workload with phase, node, restarts, requests and limits, containers. |
| CPU, throttling, memory, OOM kills and restarts per pod and container over time. |
| Kubernetes events of a workload's pods: probe failures, kills, scheduling, deploys. |
| JVM heap and GC or Node.js heap and event loop metrics of the processes in a pod. |
| One host: hardware, availability, CPU, memory, disks, processes, events. |
| One process or process group: technology, where it runs, services, callers and callees. |
Traces
Tool | What it does |
| Endpoints of a service, SQL statements of a database service, or target hosts of an "unmonitored hosts" service, with metrics. |
| Single traces of a service or the whole environment, filtered by response time, HTTP code, failure, method, request or URL. |
| Any trace metric split by any dimension (multidimensional analysis), with the same filters. |
| One trace as a span tree with timings, SQL and downstream calls. |
| One call of a trace: exceptions with stack traces, method tree, SQL text, headers, host or pod. |
Service analysis, cron jobs, database
Tool | What it does |
| Why requests of a service fail: reasons, exceptions, failed downstream calls. |
| Where the response time goes (code, downstream, database) and how it is distributed. |
| What a service calls, as a tree with each dependency's contribution. |
| Who calls a service, up to the entry requests and jobs. |
| Exception classes by count, across services or for one. |
| Cron jobs by total time, average, longest run, executions and failures. |
| SQL statements of a database service by total time, average, max or executions; database services that share a name are combined. |
| Which services, requests and jobs execute one SQL statement. |
| Slow executions of one statement with the traces they belong to. |
Profiling
Tool | What it does |
| Process groups by CPU time. |
| Hot methods of a service or process group from code-level samples. |
| Thread groups of a process group by state and CPU. |
| Where a Java process group allocates memory. |
| Process crashes in the window. |
Dashboards and settings
Tool | What it does |
| Dashboards visible to you. |
| Tiles of a dashboard and the metric selectors behind its charts. |
| Reads settings schemas and their values (alerting, anomaly detection, request attributes, …). |
Results are compact text sized for an AI's context: a header stating what was queried and the exact UTC window, tables with the ids the next tool needs, a hint on what to call next, and a link to the matching Dynatrace page. Charts come back as summarised series, not as images.
environment: which configured environment to query, by the name shown in the popup. Defaults to the first one.minutes_lookback,time_from,time_to: the time window. The default is the last 120 minutes. Timestamps are ISO 8601 and are read as UTC when they carry no zone.get_problem,find_metrics,list_dashboardsandread_settingshave no time window.Entities (
service,workload,pod,host, …) can be passed as an id or as a name. An ambiguous name returns the candidates with their ids instead of a guess.Trace filters, shared by the trace and service analysis tools:
response_time_min_ms,response_time_max_ms,http_code(404,4xx,400-599),failed,http_method,request,url_contains,request_kind(webordatabase).limit: how many rows are printed. The output says how many were left out.
Troubleshooting
Problem | Fix |
The extension icon shows OFF, the popup says "Not running" | The MCP server isn't running. It starts with your AI client, so open the client (or reconnect its MCP servers). If you changed |
"No browser extension is connected" | Open the browser where the extension is installed and check that it is enabled and its popup says Connected. |
"Dynatrace needs a login" and a Dynatrace tab opens in front | Your session expired. Log in to Dynatrace in that tab (the bridge never enters credentials), then ask again. |
The popup says "The active tab is not a Dynatrace environment page" | The tab's URL must contain |
"No Dynatrace environment is configured" | Open Dynatrace and press Add this environment in the popup. |
"The extension has no site access to …" | Site access was revoked in the browser. Remove the environment in the popup and add it again. |
"… more data than the bridge relays" (response too large) | The answer exceeded the size limit (32 MiB by default). Ask for a shorter time window or narrower filters. |
"An extension at chrome-extension://… tried to connect and was refused" | The server only accepts the extension build it ships. Re-run |
"Port 47831 (or 47832) is in use by another program" | Free the port or set |
"HTTP 403 … lacks the permission" | Your Dynatrace user may not read that data. The bridge has exactly your permissions. |
"Dynatrace's internal API changed" | A cluster upgrade changed an undocumented endpoint. Please open an issue with the tool name and your cluster version. |
Configuration
You don't need this for normal use.
Set these in the env block of your MCP client config.
Variable | Default | Purpose |
|
| HTTP port for MCP clients ( |
|
| WebSocket port for the extension (also change it behind the ⚙ in the popup) |
|
| Bind address of both ports |
|
| How long a tool call waits for the extension to connect before it fails |
| on |
|
|
| Where the version check looks, for a registry mirror |
| empty | Web origins that may call the HTTP port, comma- or space-separated. Only for a browser-based MCP client |
| empty | Extra extension origins that may connect to the WebSocket, e.g. |
| version of the package | Overrides the version the server reports to the extension. For trying out the update notices |
Freeing a port: lsof -ti:47831 | xargs kill on macOS / Linux, or netstat -ano | findstr :47831 then taskkill /PID <pid> /F on Windows.
Security
Your session, your permissions. Requests run inside your Dynatrace tab with your login. The bridge sees what you can see and nothing more. The CSRF token is read in the page for each request and never leaves it; neither it nor your cookies are logged or sent to the server.
Read-only by construction. Only
GETis possible, there is no way to send a request body, and the path must be one of the exact routes the tools use. Anything else is refused, and paths that containapiTokens,credentials,tokensor memory dumps are always refused. The rule is enforced three times: in the server before sending, in the extension, and again in the page.Site access only where you grant it. The extension installs without access to any site and asks for one Dynatrace origin at a time when you add an environment. Removing the last environment of an origin gives the access back.
The HTTP port is loopback-only. It binds to
127.0.0.1, requires a loopbackHostheader, and refuses any request that carries a browserOriginunless you allow that origin, so a web page cannot call it. It has no authentication of its own, so don't expose it to other machines.The WebSocket is pinned to the extension. The server accepts a connection only from the extension id it ships (
nnfgclefihmkappeocegckipegkalloe). Web pages and other extensions are refused.Tool output is scrubbed. Authorization, cookie and CSRF headers are dropped, and token-shaped values and values of secret-looking names are masked before anything reaches the AI.
Known limitation. The extension connects to whatever listens on
localhost:47831. A local process that takes that port before the server does receives the extension's connection and can send it read-only requests from the allowed list. Closing this would need a pairing secret, which this project does not have.One outbound request. The server asks the npm registry for the latest version of this package at startup and then once every 24 hours, to tell you about updates. Nothing else leaves your machine besides the requests to your own Dynatrace. Turn it off with
DT_BRIDGE_UPDATE_CHECK=0.
Limitations
Dynatrace Managed, classic UI. Environments are recognised by
/e/<environment id>/in the URL. Dynatrace SaaS with the latest (Grail) UI uses different APIs and is not supported.Verified on version 1.346 only. Traces, service analysis, database, profiling and the Davis details of a problem come from the internal endpoints behind the Dynatrace UI. They are undocumented and can change with a cluster upgrade; the tools check the response shape and say so when it no longer matches. Entities, metrics, problems, events and the Kubernetes tools use the session mirror of the documented API v2 and are less exposed to that.
No logs. There are no log tools. The environment this was built against does not grant log access to UI users, so nothing could be built or checked.
Sampling and retention apply. Dynatrace keeps and samples traces as configured on your cluster; the tools pass on the warnings Dynatrace attaches.
Mind your operator. The bridge uses your UI session against endpoints meant for the UI. It runs analysis requests one at a time per environment, but whether this use is welcome on your cluster is for you and its operator to decide.
Not an official Dynatrace product. This project is not affiliated with or endorsed by Dynatrace.
Development
git clone https://github.com/yunusemregul/dynatrace-bridge-mcp.git
cd dynatrace-bridge-mcp
npm install
npm run verifynpm run verify is the build check, and the only one: there is no test suite. It checks syntax, the version sync between package.json and the extension manifest, the pinned extension id, the translations, that the server-side and extension-side allow-lists agree on every case, the installer, and a real server start with its HTTP and WebSocket gates. It never opens a browser and never contacts Dynatrace. CI runs it on every push to main and on every pull request.
Plain JavaScript (ESM), Node 18 or newer, no build step. To work on the extension, load the repository's extension/ folder with Load unpacked. ARCHITECTURE.md describes the protocol, the allow-list and how to write a tool.
License
Available Tools
39 toolsanalyze_failuresA
Explains why requests of a service fail in a time window (Dynatrace failure analysis): the failure reasons ranked by failed requests, each with its type, HTTP status, share of all failures, the exception classes and messages behind it (with the top stack frames), failed downstream calls, and the requests it affects.
Start here for "why does this service fail": use it when a service shows a failure rate or a problem names it. Pass service as an id or a name. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests.
Follow up with list_traces (failed: true, optionally http_code) for the individual failing traces, or top_exceptions for exception counts.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of failure reasons to print. Default 10, at most 50. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| stack_frames | No | Stack frames shown per exception. Default 3, at most 30. | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and adds genuinely non-obvious behavior: the tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser, and on failure the agent must report the error rather than fall back to browser automation. It does not state read-only guarantees, rate limits, or expected latency, but the environment/transport caveat is high-value context that no structured field provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then follow-ups, then the transport caveat -- the ordering an agent needs. No sentence is filler, though the first sentence is a long enumeration and the filter list partly restates schema names, adding minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must describe return values, and it does: ranked failure reasons with type, status, failure share, exception classes/messages plus top stack frames, failed downstream calls, and affected requests. Combined with usage routing and the extension dependency, an agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents all 18 parameters. The description adds value beyond the schema by grouping the shared trace filters (response_time_min_ms, http_code, failed, request, url_contains, request_kind, raw_filters) and stating their collective effect -- they narrow the analysed requests -- and by restating that `service` accepts an id or a name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Explains why requests of a service fail in a time window') and enumerates the exact output shape (ranked failure reasons, type, HTTP status, failure share, exception classes/messages with stack frames, failed downstream calls). It is clearly distinguishable from siblings like top_exceptions and list_traces, which it explicitly frames as complementary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit entry condition ('Start here for "why does this service fail": use it when a service shows a failure rate or a problem names it') and names the follow-up alternatives with the arguments that select them (list_traces with failed:true/http_code, top_exceptions for counts). This is the when/when-not/alternatives pattern done well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analyze_response_timeA
Shows where the response time of a service goes and how it is distributed (Dynatrace response time analysis). Part 1, hotspots: average response time split into own code, calls to other services and database calls; code execution time by state (CPU, wait, lock, network and disk I/O, suspension); every downstream service and database with its contribution, call frequency and call time; and the single downstream requests / SQL statements that cost the most. Part 2, distribution: a text histogram of response times including failed requests, with the outlier tail called out.
Start here for "why is this service (or one of its endpoints) slow". Pass service as an id or a name. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests. E.g. response_time_min_ms: 2000 analyses only the slow requests, request one endpoint.
It runs two analysis requests, one after the other. Follow up with service_flow for the full downstream tree, top_database_statements on a database listed here, method_hotspots for own-code time, or list_traces with response_time_min_ms for the outliers.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of downstream services, and downstream requests / statements to print. Default 15, at most 100. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it discloses that two analysis requests run sequentially, that it executes through the Dynatrace Bridge browser extension in the user's logged-in browser, and instructs the agent to report failures rather than fall back to browser automation. It also previews what the output contains, including that omitted items are counted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before usage and follow-ups, and every paragraph serves a distinct job (what it shows, when to use it, where to go next). It is dense and long, but for a 17-parameter analysis tool the length is largely earned rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex multi-part analysis tool with no output schema, the description still explains the return structure (hotspot breakdown, histogram, outlier tail, omission counts), the filter surface, the browser dependency and the failure path. An agent has enough to call it correctly and interpret the result without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is a 3, but the description adds genuine value by grouping the 'shared trace filters' and giving usage examples (`response_time_min_ms: 2000`, `request` for a single endpoint) that explain intent rather than restating the schema. It does not clarify the interaction between time_from/time_to/minutes_lookback or the filter precedence, which the schema already handles in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Shows where the response time of a service goes and how it is distributed', then enumerates the two analysis parts (hotspot breakdown and response-time histogram). It also distinguishes itself from siblings by naming service_flow, method_hotspots, top_database_statements and list_traces as different tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to reach for it ('Start here for "why is this service (or one of its endpoints) slow"') and which filters apply in which situation, with a concrete example (`response_time_min_ms: 2000` analyses only slow requests). It also routes the agent onward with named follow-ups for each sub-question.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cpu_by_process_groupA
Lists the process groups that consumed the most CPU in the window (Dynatrace continuous CPU profiling): CPU time, share of the total, CPU time spent in garbage collection, when the peak was, and which deeper analyses each process group supports.
Start here for "which process burns the CPU". Follow up with method_hotspots (hot methods), thread_analysis (thread groups and states) or memory_allocation_hotspots, passing the PROCESS_GROUP id from the table as process_group. For CPU per endpoint use trace_statistics with metric: "CPU_TIME".
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Only process groups whose name, id or technology contains this text (case-insensitive). | |
| limit | No | Maximum number of process groups to print. Default 20, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the runtime dependency (executes through the Dynatrace Bridge browser extension in the user's logged-in browser), an explicit failure protocol (report the error, do not open tabs or automate), and output behavior (limit default 20 / max 200, omitted rows are reported, resolved UTC window shown in the header). This is materially more than the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then discovery routing, then environment/failure caveat. Each of the three short paragraphs carries distinct, non-redundant information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description describes what the table contains (CPU time, share of total, GC time, peak timing, supported deeper analyses) and how omissions are surfaced. Combined with the browser-extension caveat and the explicit routing to follow-up tools, an agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters (text, limit, time_to, time_from, environment, minutes_lookback) are already documented in the schema, including the ISO-8601/UTC handling and lookback semantics. The description adds only the cross-tool note about passing the process group id downstream, which is about the consumer tool, not this one's parameters. Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the process groups that consumed the most CPU in the window') and immediately scopes it to Dynatrace continuous CPU profiling. It also enumerates the returned metrics, so an agent can tell it apart from sibling tools like method_hotspots or trace_statistics without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to start here ('which process burns the CPU') and names three follow-up alternatives (method_hotspots, thread_analysis, memory_allocation_hotspots) plus a distinct route for per-endpoint CPU (trace_statistics with metric CPU_TIME). It even specifies the handoff value: pass the PROCESS_GROUP id as process_group.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cron_job_statisticsA
Ranks cron jobs by how much time they take: per job the number of executions, failed runs, total time, average and longest run and CPU time, with the service and request ids needed to open single runs. The tool for "which cron jobs are the slowest / the most time-consuming / fail".
It reads the requests of the service whose requests are the cron jobs. SAP Commerce (hybris) environments have such a service named CronJobs, the default for service; Dynatrace usually has several services with that name (one per process group or node), and this tool combines all of them, which a single list_service_requests call cannot. Pass another service name or one SERVICE id as service when the jobs live elsewhere. When no such service exists the tool says so and names the alternatives.
The default window is the last 24 hours. sort: total_time (default), avg, max, executions, failures, cpu. name keeps jobs whose name contains the text; response_time_min_ms and failed count only the long or the failed runs. A run is one trace and is counted with its full duration (verified for runs of over an hour); runs still executing at the end of the window may be missing. A row named after a method instead of a job (ServicelayerJob.performCronJob) collects the runs Dynatrace could not name; the output marks it.
Follow up with list_traces (service and request from the last column) for the single runs, then get_trace for what a run did.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Only cron jobs whose name contains this text (case-insensitive). | |
| sort | No | Ranking, highest first: total_time (default), avg, max, executions, failures, cpu. | |
| limit | No | Maximum number of cron jobs to print. Default 25, at most 200. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| service | No | Name of the service whose requests are the cron jobs (every service with exactly this name is combined), or one SERVICE-… id. Default `CronJobs`. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| minutes_lookback | No | Window length in minutes. Default 1440. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the browser-extension execution model, the default 24h window, that a run is counted with full duration, that runs still executing at window end may be missing, and that unnamed rows are collected and marked in the output. It also gives explicit error-handling instructions rather than leaving retry behavior ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and usage routing are front-loaded, and the paragraphs are organized by concern (purpose, service selection, window/sort, follow-ups, runtime). It is longer than strictly necessary — the sort list and several filter semantics duplicate schema descriptions — but every block adds usable context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no annotations and no output schema, the description covers the output columns, the attribution caveat for unnamed rows, the window resolution rules, and the follow-up chain. Nothing an agent needs to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: default service `CronJobs`, how multiple same-named services are combined, the resolved-window behavior across `time_from`/`time_to`/`minutes_lookback`, and the semantics of `name`/`response_time_min_ms`/`failed`. Some of this (e.g. the sort enum) merely restates the schema, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource ('Ranks cron jobs by how much time they take') and enumerates the returned metrics, so an agent immediately knows this is a ranking/statistics tool over cron jobs. It also names the sibling it complements (`list_service_requests`) and what it does that sibling cannot, making it distinguishable at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use phrasing ('the tool for "which cron jobs are the slowest"'), states the default service and how to override it, describes the default time window, and prescribes follow-ups (`list_traces` then `get_trace`). It even handles the failure case (no such service exists) and gives operational guidance (report errors, don't automate the browser).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dynatrace_bridge_statusA
Reports whether the Dynatrace Bridge is usable: server version and whether a newer release exists, whether the browser extension is connected and its version (each browser when several are connected), and the Dynatrace environments configured in the extension (name, environment id, URL).
Call this first when another Dynatrace tool fails with a connection, environment or session error, or when the user asks which environments are available. Works even when no extension is connected.
Pass check_session: true to also run one small request per environment and see whether the browser is still logged in.
Where to start with the other tools. All take environment. All except get_problem, find_metrics, list_dashboards and read_settings also take the time arguments minutes_lookback / time_from / time_to (timestamps without a zone are read as UTC); those four have no time window.
An incident, or "what is wrong":
list_problems, thenget_problemwith the P- id.A slow or failing service:
list_services(sort: "response_time"or"failure_rate") to find it,service_overview, thenanalyze_response_timeoranalyze_failures, thenlist_tracesandget_tracefor single requests.Across all services,
trace_statisticswithrequest_kind: "web"and: slowest endpointsaggregation: "P95"(or"AVERAGE") plusmin_calls: 20; most time-consuming endpointsaggregation: "SUM"; most CPUmetric: "CPU_TIME",aggregation: "SUM"; most errorsmetric: "FAILED_REQUEST_COUNT"(a count metric, ranked by itsCOUNT).Exceptions:
top_exceptions. Slow or expensive SQL:top_database_statements. Slow or long-running cron jobs:cron_job_statistics.Pod restarts, OOM kills, throttling:
list_workloads, thenpod_resourcesandpod_events. CPU or memory of a process:cpu_by_process_group,method_hotspots,process_runtime.Anything else:
find_entitiesfor ids,find_metricsandquery_metricsfor the data behind any chart.
| Name | Required | Description | Default |
|---|---|---|---|
| check_session | No | Also verify each environment with one small read request. When no Dynatrace tab is open for an environment, the extension opens one in the foreground of the user's browser. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does so well: it states the tool works with no extension connected, that check_session opens a Dynatrace tab in the foreground of the user's browser, and that it verifies login state per environment. It is honest about a side effect (opening tabs), though it doesn't cover latency/cost of probing all environments.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose first, then when-to-call, then the optional parameter, then the routing guide. The extensive per-tool routing block is genuinely useful but concerns the sibling tools rather than this one, so it dilutes conciseness somewhat even though each line is dense and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description fully compensates by enumerating the returned fields (version, upgrade availability, per-browser extension version, environment name/id/URL) and the error-recovery role. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter's schema already documents the read-request behavior and the default of false. The description adds only the goal framing ('see whether the browser is still logged in'), which is a slight enrichment but largely overlaps the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: reports bridge usability, server version/upgrade availability, extension connection and version per browser, and configured environments with name/id/URL. This is clearly a status/meta tool, cleanly distinguished from the diagnostic siblings (list_problems, service_overview, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions: 'Call this first when another Dynatrace tool fails with a connection, environment or session error, or when the user asks which environments are available.' It also notes exclusions (works even with no extension connected) and provides a full routing map to siblings, so an agent knows exactly when this tool applies vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_entitiesA
Searches Dynatrace monitored entities of any type and returns their ids and names. Use it to turn a name the user mentions into the entity id that other tools need, or to list what exists (services, hosts, process groups, Kubernetes workloads, pods, containers, queues, …).
Give type (e.g. SERVICE, HOST, PROCESS_GROUP, PROCESS_GROUP_INSTANCE, CLOUD_APPLICATION (Kubernetes workload), CLOUD_APPLICATION_INSTANCE (pod), CONTAINER_GROUP_INSTANCE (container), KUBERNETES_CLUSTER, KUBERNETES_NODE, QUEUE) and optionally name (case-insensitive substring). For anything more specific pass a full Dynatrace selector (entitySelector syntax), e.g. type(CLOUD_APPLICATION_INSTANCE),fromRelationships.isInstanceOf(entityId("CLOUD_APPLICATION-1234567890ABCDEF")) for the pods of a workload, or type(SERVICE),tag("team:checkout").
Called with neither type nor selector, it lists the entity types that exist in the environment.
Only entities seen inside the time window are returned. Add fields (e.g. tags, managementZones, properties.cloudApplicationInstancePhase, fromRelationships.runsOn) for extra columns. Follow up with get_entity for all properties and relationships of one entity.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring of the entity name. Combined with `type`; ignored when `selector` is given. | |
| type | No | Entity type, e.g. SERVICE, HOST, PROCESS_GROUP, PROCESS_GROUP_INSTANCE, CLOUD_APPLICATION (Kubernetes workload), CLOUD_APPLICATION_INSTANCE (pod), CONTAINER_GROUP_INSTANCE (container), KUBERNETES_CLUSTER, KUBERNETES_NODE, QUEUE. Ignored when `selector` is given. | |
| limit | No | Maximum number of entities (300 entity types when listing types) to print. Default 50, at most 500. The output says how many were omitted. | |
| fields | No | Extra entity fields to fetch and show as columns, e.g. ['tags', 'properties.cloudApplicationInstancePhase', 'fromRelationships.runsOn', 'lastSeenTms']. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| selector | No | Full Dynatrace entitySelector, used verbatim. Must contain a type(...) or entityId(...) criterion. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry behavioral disclosure — and it does add real value: entities only inside the time window are returned, resolution goes through the Dynatrace Bridge browser extension, and on failure the agent is told to report the error rather than fall back to browser automation. It stops short of describing the output shape (there is no output schema, so return format is only partly inferred from the schema descriptions).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded — purpose first, then parameter guidance, then behavior, then the failure-handling caveat. It is longer than strictly necessary (the type list is repeated almost verbatim in the schema), so it is efficient but not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, all-optional search tool with no annotations and no output schema, the description covers the essentials: what is searched, what is returned (ids and names), time-window semantics, limit behavior with omitted counts, and the browser-extension dependency with failure guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds genuine semantic value: worked selector examples (pods of a workload, tagged services), a list of valid type values, and practical fields examples beyond the schema's list. It notably omits the interaction between selector and the other params except to say type/name are ignored.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Searches Dynatrace monitored entities of any type and returns their ids and names') and makes the differentiating role explicit: it converts a user-mentioned name into the entity id other tools need. It also distinguishes itself from the sibling get_entity by naming that tool as the follow-up for full properties.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions ('turn a name the user mentions into the entity id', 'list what exists'), an explicit edge case (called with neither type nor selector, it lists entity types), and routes to the alternative get_entity for all properties and relationships.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_metricsA
Searches the Dynatrace metric catalogue and returns metric ids with unit, available aggregations, dimensions and the entity types they apply to. Use it before query_metrics whenever you are not sure of the exact metric id.
Pass text for a free-text search over id, name and description (e.g. "response time", "container memory", "v8 heap"), and/or selector for an id pattern with a trailing wildcard (e.g. builtin:service.*, builtin:containers.cpu.*, builtin:kubernetes.workload.*, builtin:tech.jvm.*, builtin:tech.nodejs.*).
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Free-text search over metric id, display name and description. | |
| limit | No | Maximum number of metrics to print. Default 50, at most 200. The output says how many were omitted. | |
| describe | No | Also print each metric's description. Default false. | |
| selector | No | Metric id or id prefix with a trailing `*`, e.g. `builtin:service.*`. Several can be given comma-separated. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does disclose a major behavioral trait: execution goes through the Dynatrace Bridge browser extension in the user's logged-in browser. It also gives failure guidance ('report the error to the user; do not try to open browser tabs or automation instead'), which is unusually valuable context. It does not explicitly state read-only semantics for the query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, each with a distinct job: what it returns, how to search, and how it executes. The purpose and the query_metrics routing are front-loaded, and nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (id, unit, aggregations, dimensions, entity types) and by covering execution path and failure handling. Also notes limit/omission behavior. Nothing an agent needs to call this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning beyond the schema: concrete free-text examples ('response time', 'container memory', 'v8 heap') and concrete selector patterns ('builtin:service.*', 'builtin:kubernetes.workload.*'). That elevates it above the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (searches) and resource (Dynatrace metric catalogue) and enumerates what comes back (metric ids, unit, aggregations, dimensions, entity types). It is clearly distinguishable from the sibling query_metrics, which it explicitly references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit condition for use ('before query_metrics whenever you are not sure of the exact metric id') and names the alternative tool. The reader knows exactly when this tool is the right choice versus query_metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dashboardA
Shows one Dynatrace dashboard: owner, tags and every tile with its type and title, and for chart (Data Explorer) tiles the metric selectors behind them, so the same data can be read with query_metrics.
dashboard is an id from list_dashboards or a name (an ambiguous name returns the candidates). Reading the queries of a chart tile costs one request to Dynatrace per tile, so only the first tile_details chart tiles (12 by default, at most 30) get their queries; the others are listed without them, and the output names the tile ids to pass as tile to read those next. run_queries: true executes up to max_queries of the tile selectors over the time window and prints each as summarised series.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tile | No | Tile ids (from the tiles table) whose queries to read, at most 30 per call. The table then lists only these tiles. Default: the first `tile_details` chart tiles in reading order. | |
| limit | No | Maximum number of tiles in the table to print. Default 60, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| dashboard | Yes | Dashboard id (UUID from `list_dashboards`) or name. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| max_queries | No | Maximum number of tile queries to run with `run_queries`. Default 5, at most 20. | |
| run_queries | No | Also run the tile metric selectors and print summarised series. Default false. | |
| tile_details | No | How many chart tiles get their queries read when `tile` is not given; each costs one request to Dynatrace. Default 12, at most 30. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses the per-tile request cost to Dynatrace, the default/maximum tile_details budget (12 default, at most 30), that remaining tiles are listed without queries and their ids returned for a follow-up call, and that execution runs through the Dynatrace Bridge browser extension in the logged-in browser. This is exactly the operational context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool returns in the first sentence, then devotes the second paragraph to the token-cost mechanics and the browser-extension dependency. It is dense but every sentence earns its place; slightly long given the parameter volume.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Ten parameters, no annotations, and no output schema, yet the description explains the return shape, the tile budget semantics, the follow-up call path, the time-window behavior, and the failure mode. Nothing material an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the property descriptions are already detailed, so baseline is 3. The description adds value beyond the schema by explaining cross-parameter relationships, e.g. that `tile` overrides the default first-`tile_details` chart tiles and that the output names the tile ids to pass as `tile` next.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Shows one Dynatrace dashboard') and enumerates exactly what is returned: owner, tags, every tile with type and title, and metric selectors for chart tiles. It explicitly distinguishes itself from siblings by pointing to `list_dashboards` for ids and `query_metrics` for reading the underlying data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditions: `dashboard` accepts an id from `list_dashboards` or a name (ambiguous names return candidates); `tile` selects which tiles' queries to read; `run_queries: true` executes the selectors. It names `query_metrics` as the alternative for reading the same data and instructs what to do on failure (report the error, do not fall back to browser automation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entityA
Returns one Dynatrace entity in full: type, first/last seen, tags, management zones, all properties (for pods: phase, node, restarts, requests/limits; for services: technology, type; for hosts: OS, CPU, memory, …) and its relationships to other entities with their ids and names (runs on, calls, called by, is instance of, …).
Pass entity as an id (e.g. SERVICE-1234567890ABCDEF) or as a name together with type. An ambiguous name returns the candidates. Use the related ids with get_entity again to walk the topology, or in query_metrics entity selectors.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Entity type, needed only when `entity` is a name. E.g. SERVICE, HOST, PROCESS_GROUP, PROCESS_GROUP_INSTANCE, CLOUD_APPLICATION (Kubernetes workload), CLOUD_APPLICATION_INSTANCE (pod), CONTAINER_GROUP_INSTANCE (container), KUBERNETES_CLUSTER, KUBERNETES_NODE, QUEUE. | |
| entity | Yes | The entity, as an entity id (HOST-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| relationship_limit | No | Maximum related entities listed per relationship. Default 10, at most 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does add genuinely important context: the call runs through the Dynatrace Bridge browser extension in the user's logged-in browser, and on failure the agent should report the error rather than attempt browser automation. It stops short of explicitly stating read-only semantics, rate limits, or environment-connection prerequisites (though it points to dynatrace_bridge_status for environment names).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the return contents, then invocation rules, then the environment/failure caveat — a sensible ordering with little waste. The parenthetical property enumeration per entity type is somewhat long, but it earns its place by showing breadth for a type-agnostic tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema, no-annotation tool, the description does most of the necessary work: it describes the response shape, disambiguates the name-vs-id path, and flags the browser-extension dependency and failure protocol. It does not explain the time-window parameters (time_from/time_to/minutes_lookback) in prose, leaving that entirely to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The prose largely restates what the schema already says ('Pass `entity` as an id ... or as a name together with `type`'; ambiguity returns candidates) and adds no syntax or format detail beyond it, though the cross-tool note about reusing related ids is a useful extension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one Dynatrace entity in full') and enumerates the returned content: type, first/last seen, tags, management zones, type-specific properties, and relationships with ids/names. The word 'one' plus the relational detail plainly separates it from the many list_* siblings (list_pods, list_services, find_entities).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete invocation guidance: pass `entity` as an id or as a name together with `type`, note that an ambiguous name returns candidates, and that related ids can be fed back into get_entity or query_metrics entity selectors. It does not, however, state when to prefer this over find_entities or get_host/list_pods for the same object.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hostA
Returns one host in detail: OS, CPU cores and memory, IPs, monitoring mode, availability and downtimes, open problems; CPU and memory usage over the window as summarised series and disk usage per disk; the processes running on it with their technology, status, CPU and memory use; and its recent events.
Pass host as a HOST id or a host name (an ambiguous name returns the candidates). Kubernetes nodes are hosts too: the node name from list_pods works here. Follow up with get_process on a process id, or query_metrics with entity_selector: entityId("<host id>") for any other builtin:host.* metric.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| host | Yes | The host, as an entity id (HOST-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| process_limit | No | Maximum number of processes to print. Default 30, at most 200. The output says how many were omitted. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the transport (runs through the Dynatrace Bridge browser extension in the user's logged-in browser), the failure mode (report the error, do not attempt browser automation), ambiguous-name behavior, and environment defaulting. This is exactly the operational context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned fields, then parameter guidance, then the bridge/transport caveat, which is a sensible ordering. The first paragraph is dense and long but each clause adds a distinct facet of the return payload, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema, no-annotation tool, the description covers return contents, input forms, defaulting behavior, cross-tool follow-ups and the failure path, so an agent can call it correctly without further inference. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value beyond the schema: it clarifies that a host name from list_pods works for Kubernetes nodes, and points to dynatrace_bridge_status for the environment parameter whose valid values are intentionally not listed. That cross-referencing exceeds what the schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Returns one host in detail') and then enumerates exactly what is returned: OS, CPU/memory, IPs, monitoring mode, availability/downtimes, problems, usage series, disks, processes and events. This lets an agent distinguish it from generic entity tools like get_entity without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing: accept host id or name, treat Kubernetes nodes as hosts using names from list_pods, follow up with get_process or query_metrics with entityId selector, and consult dynatrace_bridge_status for environment names. It lacks an explicit when-not-to-use or a direct comparison against get_entity, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_problemA
Returns one Dynatrace problem. The default output is a compact overview: status, severity, start, end and duration; root cause entity, affected and impacted entities; the evidence grouped by entity with counts and the most relevant items; the impact; the Davis root-cause findings per candidate entity with the metric and event names; the event that triggered the problem with its baseline values; the most affected requests per service with their SERVICE_METHOD ids; and the entities on the dependency path Davis analysed that are affected, root cause or have events.
Pass problem as the display id (P-12345) or the internal problem id from list_problems. For the long form of one section pass detail: evidence (every evidence row), impact, davis (all candidates and findings), requests (the affected requests of every service) or path (the whole dependency path with event times). The Davis findings, trigger event and dependency path come from internal Dynatrace endpoints; if one of them is unavailable the rest is still returned with a note.
The result ends with the affected service id and the problem window to pass to analyze_failures and list_traces.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of rows of the section chosen with `detail` to print. Default 100, at most 300. The output says how many were omitted. | |
| detail | No | Print the long form of this one section instead of the compact overview: evidence, impact, davis, requests or path. | |
| problem | Yes | Problem display id (P-12345, or just 12345) or the internal problem id (e.g. -1234567890123456789_1790000000000V2). | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden and does so well: it discloses the default vs `detail` output modes, that Davis/trigger/path sections come from internal endpoints and degrade gracefully with a note, and the browser-extension runtime with explicit failure-handling guidance. The only gap is the absence of auth/permission notes, but the coverage is otherwise rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Led by the core purpose, then parameters, then operational caveats – well front-loaded. The middle sentence is dense and long but every clause conveys distinct return-content semantics, so it earns its place despite the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must describe return values and it does so exhaustively: default overview fields, long-form `detail` sections, fallback behavior on unavailable endpoints, and the trailing hand-off fields. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), and the description adds genuine value beyond the schema: it explains the two accepted `problem` id formats, spells out what each `detail` enum section contains at length, and links the returned service id/window to downstream tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Returns one Dynatrace problem.' It then enumerates the exact contents of the default output (status, severity, entities, Davis findings, etc.), which makes it clearly distinguishable from the sibling `list_problems` (singular retrieval vs listing).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent where the `problem` argument comes from ('the internal problem id from `list_problems`') and where the output feeds ('to pass to `analyze_failures` and `list_traces`'). It gives clear usage context but stops short of an explicit when-to-use-this-vs-that rule (e.g. versus list_problems).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_processA
Returns one process (PROCESS_GROUP_INSTANCE) or one process group (PROCESS_GROUP) in detail: technology and version, the host, pod, container and workload it runs in, the services it hosts, the processes that call it and that it calls, CPU and memory use over the window, and its events.
Pass process as a PROCESS_GROUP_INSTANCE id, a PROCESS_GROUP id, or a name (an ambiguous name returns the candidates with their ids). Process ids come from get_host, process_runtime or find_entities. Follow up with process_runtime for JVM / Node.js metrics, or the service tools with a service id from the list.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| process | Yes | The process or process group, as an entity id (PROCESS_GROUP_INSTANCE-1234567890ABCDEF or PROCESS_GROUP-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose non-obvious behavior: the tool 'runs through the Dynatrace Bridge browser extension in the user's logged-in browser,' instructs the agent to surface failures to the user, and explicitly forbids browser-automation fallbacks. It also notes the environment default and the ambiguity-returns-candidates behavior. Not covered: any auth/permission requirements or pagination/response-size limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs: what it returns, how to supply the entity id and where to go next, and the execution/failure model. It is front-loaded and every sentence carries routing or behavioral information. It runs slightly long, but nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-annotation, no-output-schema, single-entity detail tool, the description compensates well by enumerating the returned fields, the id formats, the ambiguity path and the failure/reporting model. Remaining gaps are minor: no mention of output size, rate limits, or permission requirements.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description earns above baseline by adding semantics the schema does not: that an ambiguous name returns candidates with their ids (never guesses), where ids originate, and that omission of `environment` resolves to the first configured environment listed by `dynatrace_bridge_status`. Window-resolution logic for time_from/time_to/minutes_lookback is largely already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and immediately disambiguates the two entity kinds it can return (PROCESS_GROUP_INSTANCE vs PROCESS_GROUP), then enumerates the payload: technology/version, host, pod, container, workload, hosted services, callers/callees, CPU and memory, events. An agent can distinguish this from get_host, process_runtime and list_pods without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names explicit alternatives and the condition that selects them: 'Follow up with `process_runtime` for JVM / Node.js metrics, or the service tools with a service id from the list.' It also tells the agent where valid process ids come from (get_host, process_runtime, find_entities). There is no explicit when-not guidance, but the routing is clear enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_traceA
Shows one trace as an indented span tree: for every call the service, the operation (request name or SQL statement), how often it ran, its start offset from the beginning of the trace, response time, self time, CPU / wait / suspension time, the technology, and the callURI of the node.
Pass trace_id and call_uri exactly as printed by list_traces, with a time window that contains the trace (the same window is fine). Runs of identical sibling calls (the same SQL statement 200 times) are collapsed into one line with the call count and total time.
Large traces: min_duration_ms hides calls shorter than that, max_depth limits the nesting, limit caps the lines; the output always says what was hidden.
Follow up with get_trace_details on a node's callURI for exceptions with stack traces, the code-level method tree, full SQL and HTTP headers.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tree lines to print. Default 150, at most 400. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| call_uri | Yes | The callURI printed next to the traceId by list_traces. | |
| trace_id | Yes | The traceId printed by list_traces (32 hex characters). | |
| max_depth | No | Show only this many nesting levels (1 = only the entry call). Default: all levels. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| min_duration_ms | No | Hide calls (with everything below them) that took less than this many milliseconds in total. Default 0 = show all. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses sibling-call collapsing, that the output always reports what was hidden, and the operational constraint that the tool runs through the browser extension and that failure should be reported rather than worked around. It stops short of describing permission/authentication requirements or error modes beyond the extension failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the output shape, then usage, then large-trace controls, then follow-up, then the browser constraint, in four tight paragraphs. The long enumeration of tree fields is the one place that approaches padding, but it earns its place given there is no output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no output schema and no annotations, the description supplies the missing return-format detail, the window-resolution rule, the large-trace capping semantics, and the runtime environment, so an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds behavior the schema does not state, namely that hidden output is always reported ('the output always says what was hidden', 'the output says how many were omitted') and that the response header shows the resolved absolute UTC window.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Shows one trace as an indented span tree') and enumerates exactly what each line contains, so an agent can distinguish it from list_traces (discovery) and get_trace_details (deep dive) without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states precisely where the required identifiers come from ('Pass `trace_id` and `call_uri` exactly as printed by `list_traces`') and the follow-up path ('Follow up with `get_trace_details` on a node's `callURI`'). The time-window rule and the alternative tool are both named explicitly, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trace_detailsA
Everything Dynatrace recorded about one call (node) of a trace: exceptions with stack traces (identical ones grouped into one entry with a count), the code-level method tree with total / self / CPU / wait time pruned to the hot paths, the downstream calls it made with SQL text and call counts, the full SQL of a database call, HTTP request and response headers and parameters, the process and host / pod it ran on, and the technologies involved.
Pass call_uri of a node as printed by get_trace (or by list_traces for the entry call), with a time window that contains the trace.
Stack traces show the top stack_frames frames (full_stack: true for all) of the exception_limit most frequent distinct exceptions. Every section has its own share of the output, so a long one cannot crowd out the others. The method tree hides methods below min_method_ms (default 1 % of the call) and pass-through frames, and says how many. Authorization, cookie and token headers are never shown; request parameters, headers and attributes whose name looks like a secret (password, token, key, session id, …) or whose value looks like a credential are printed as <masked>, as are such parameters inside URLs; ordinary parameters are shown as Dynatrace stored them (Dynatrace itself may already have replaced values by <masked>).
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of downstream calls to print. Default 25, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| call_uri | Yes | The callURI of the call, as printed by get_trace or list_traces. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| full_stack | No | Print every frame of the exception stack traces. Default false. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| method_limit | No | Maximum lines of the code-level tree. Default 40, at most 300. | |
| stack_frames | No | Frames per stack trace when full_stack is not set. Default 8, at most 100. | |
| min_method_ms | No | Hide methods of the code-level tree that took less than this many milliseconds. Default: 1 % of the call's response time, at least 1 ms. | |
| exception_limit | No | Maximum distinct exceptions printed with their stack trace, most frequent first. Default 8, at most 50. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so richly: secret/credential parameters and headers are masked, auth/cookie/token headers are never shown, each output section gets its own share so one cannot crowd out others, the method tree hides sub-threshold and pass-through frames and reports how many were hidden, and the tool depends on the user's logged-in browser via the Dynatrace Bridge extension. These are exactly the behavioral traits an agent cannot infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by invocation, then output/parameter behavior, then the operational caveat, with no filler sentences. It is long, and the parameter paragraph partly restates schema defaults (limits, caps), which slightly dilutes density for an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no output schema and no annotations, the description covers what is returned section by section, how output is bounded, how secrets are masked, and the browser-extension execution model. An agent has enough to call it correctly and to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: min_method_ms also drops pass-through frames and the output reports the hidden count, the time parameters resolve to a stated absolute UTC window in the response header, and lookback interacts with time_from/time_to. These go beyond the per-field schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb+resource (retrieve everything recorded about one trace node) and then enumerates exactly what that includes: exceptions with stack traces, the method tree, downstream calls, SQL, HTTP headers, host/process, technologies. This clearly distinguishes it from get_trace (which prints nodes) and list_traces (which prints entry calls).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete invocation context: pass the call_uri as printed by get_trace or list_traces, with a time window containing the trace, establishing the get_trace -> get_trace_details flow. It also gives failure guidance (report the error, don't fall back to browser automation). It stops short of explicitly saying when NOT to use it versus trace_statistics or analyze_* siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dashboardsA
Lists the Dynatrace dashboards visible to the user: id, name, owner, last modification and tags. Filter with text (matches name, owner and tags).
Follow up with get_dashboard (id or name) to see the tiles and the metric selectors behind the charts.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Only dashboards whose name, owner or tags contain this text (case-insensitive). | |
| limit | No | Maximum number of dashboards to print. Default 50, at most 300. The output says how many were omitted. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser, tells the agent to report errors rather than open tabs, and forbids browser automation. It does not explicitly state read-only semantics, but 'lists... visible to the user' implies it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose, then the follow-up tool, then the runtime caveat. Every sentence earns its place and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by listing the returned fields, and the environment parameter's discovery path (dynatrace_bridge_status) is documented in the schema. Limit/pagination semantics live in the schema rather than the description, which is acceptable but leaves the description slightly short of fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents text, limit and environment. The description repeats the `text` matching behavior (name, owner, tags) without adding syntax or format beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the Dynatrace dashboards visible to the user') and enumerates the returned fields (id, name, owner, last modification, tags). It clearly differentiates itself from sibling get_dashboard by describing what that tool adds (tiles, metric selectors).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Routes the agent explicitly to get_dashboard as the follow-up when tiles/metric selectors are needed, and explains how the `text` filter behaves. It gives clear usage context but no explicit when-not-to-use condition or a competing list-type sibling to avoid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsA
Lists Dynatrace events in a time window: deployments, process restarts, Kubernetes events (probe failures, kills, scheduling), availability and anomaly events (error rate or response time increase, CPU saturation), custom info and annotations. Identical events (same type, title, entity and Kubernetes reason) are collapsed into one row with a count and the first and last time, so a flapping probe is one line.
Scope it with entity_selector (entitySelector syntax, e.g. entityId("SERVICE-1234567890ABCDEF"), type(CLOUD_APPLICATION_INSTANCE),fromRelationships.isInstanceOf(entityId("CLOUD_APPLICATION-1234567890ABCDEF")) for the pods of a workload, type(HOST)), event_type (e.g. CUSTOM_DEPLOYMENT, PROCESS_RESTART, SERVICE_ERROR_RATE_INCREASED, CUSTOM_INFO) and status (open / closed). event_selector takes a raw Dynatrace eventSelector instead, e.g. property.dt.kubernetes.event.reason("Unhealthy"). Without any filter it lists every event of the environment in the window.
Use it to answer "what changed" around the time something broke; then get_entity or service_overview on an entity id, or list_problems for the same window.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of event groups to print. Default 30, at most 200. The output says how many were omitted. | |
| status | No | Only events that are still open, or only closed ones. Default: both. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| event_type | No | Event type, e.g. CUSTOM_DEPLOYMENT, CUSTOM_INFO, PROCESS_RESTART, SERVICE_ERROR_RATE_INCREASED, SERVICE_SLOWDOWN, MARKED_FOR_TERMINATION. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| event_selector | No | Raw Dynatrace eventSelector, used verbatim instead of `event_type` and `status`. | |
| entity_selector | No | Dynatrace entitySelector limiting the entities the events belong to, e.g. `entityId("HOST-1234567890ABCDEF")` or `type(SERVICE),entityName.contains("checkout")`. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it discloses the deduplication rule (identical type/title/entity/K8s reason collapsed into one row with count and first/last time), the unfiltered default (every event in the window), and the browser-bridge execution constraint with explicit failure handling ('report the error to the user; do not try to open browser tabs').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: what is listed and how events collapse come first, then scope, then routing, then the bridge caveat. It is long, and some scoping detail duplicates schema descriptions that already carry examples, but nearly every sentence adds a distinct fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with no annotations and no output schema, the description covers what the tool returns (grouped rows with counts and first/last timestamps, resolved UTC window in the header, omitted-count reporting) and how it executes. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the schema with composite entitySelector examples (fromRelationships.isInstanceOf for workload pods), a raw eventSelector example, and the interaction semantics of event_selector overriding event_type/status. That is real added meaning over the already-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (lists Dynatrace events) plus the event taxonomy it covers — deployments, restarts, Kubernetes, availability/anomaly, custom info — and names the distinguishing scoping fields. An agent can tell it apart from list_problems and get_entity without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames the use case ('what changed' around a breakage) and routes to the right follow-ups (get_entity, service_overview, list_problems for the same window). It stops short of an explicit exclusion, e.g. when to prefer pod_events for pod-scoped Kubernetes events, so it is clear context rather than full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_podsA
Lists Kubernetes pods (Dynatrace entity type CLOUD_APPLICATION_INSTANCE) of a workload, or pods matching a name, with phase, node, IPs, restart count, age, CPU / memory requests and limits, and the containers in each pod with their ids.
Pass workload (id or name, from list_workloads) and/or name (substring of the pod name). Follow up with pod_resources for usage over time, pod_events for Kubernetes events, or process_runtime with a pod id for JVM / Node.js metrics.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring of the pod name. Can be combined with `workload`. | |
| limit | No | Maximum number of pods to print. Default 50, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| workload | No | The workload whose pods to list, as an entity id (CLOUD_APPLICATION-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose a non-obvious execution trait: it runs through the Dynatrace Bridge browser extension in the user's logged-in browser, plus explicit failure handling ('report the error to the user; do not try to open browser tabs'). It doesn't discuss pagination/truncation semantics beyond what the schema says, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-load what is returned, then route to follow-ups, then cover the browser-extension execution caveat. No filler, and the most important information (the resource and its fields) comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, zero-required listing tool with no output schema and no annotations, the description covers the resource, the returned fields, the parameter interplay, the sibling alternatives, and the unusual browser-extension runtime. An agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description rises above it by adding parameter relationships and provenance the schema does not state — notably that `workload` and `name` can be combined, and that `workload` ids/names come from `list_workloads`. It still leaves the time-window parameters entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (lists Kubernetes pods) and enumerates the exact payload returned: phase, node, IPs, restart count, age, CPU/memory requests and limits, and containers with ids. It also anchors the concept to the Dynatrace entity type CLOUD_APPLICATION_INSTANCE, which sharply separates it from siblings like list_workloads or list_services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent how to drive it ('Pass `workload` ... and/or `name`') and where the workload id comes from, then names three concrete follow-ups (pod_resources, pod_events, process_runtime) for adjacent needs. That is real routing guidance rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_problemsA
Lists the problems Dynatrace (Davis) raised that were active in the time window: display id (P-…), internal problem id, title, severity, impact level, status, start, end, duration, root cause entity and how many entities were affected and impacted.
Filter by status (open / closed / all), impact_level (SERVICES, INFRASTRUCTURE, APPLICATION, ENVIRONMENT), severity (AVAILABILITY, ERROR, PERFORMANCE, RESOURCE_CONTENTION, CUSTOM_ALERT, …), entity_selector (e.g. entityId("SERVICE-1234567890ABCDEF") or type(HOST)) and text (case-insensitive, matched against id, title and entity names). An open problem that started before the window is included.
Start here for "what is wrong right now" or "what happened at that time". Follow up with get_problem (pass the P- id) for evidence, Davis root cause and the dependency path.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Case-insensitive text matched against the display id, title, root cause and affected entity names. | |
| limit | No | Maximum number of problems to print. Default 25, at most 200. The output says how many were omitted. | |
| status | No | open, closed or all. Default all. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| severity | No | Only problems with this severity level. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| impact_level | No | Only problems with this impact level. | |
| entity_selector | No | Dynatrace entitySelector; only problems that affect or impact these entities, e.g. `entityId("SERVICE-1234567890ABCDEF")`. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that execution goes through the Dynatrace Bridge browser extension in the user's logged-in browser, that a failure must be surfaced rather than worked around, that an open problem starting before the window is still included, and that truncation is reported ('The output says how many were omitted'). It does not cover permission requirements or rate/response-time behavior, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs ordered by importance: what it returns, how to filter, where to go next, then the execution caveat. Dense but front-loaded and free of filler; the returned-field enumeration is long, though it substitutes for a missing output schema and therefore earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, read-only listing tool with no output schema, the description compensates by enumerating return fields, explaining the time-window resolution across time_from/time_to/minutes_lookback, covering the environment default and pointing at dynatrace_bridge_status for environment names. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description largely restates filter semantics already documented per-parameter (status, impact_level, severity, entity_selector, text, time window), adding only the enumerated returned fields and a minor gloss on text matching that is slightly narrower than the schema's own wording ('id, title and entity names' vs. the schema's inclusion of root cause).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the problems Dynatrace (Davis) raised that were active in the time window') and enumerates the exact fields returned, so the agent knows what it gets without opening a schema. It also distinguishes itself from the sibling get_problem, which is explicitly named as the follow-up for evidence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit entry-point instruction ('Start here for "what is wrong right now" or "what happened at that time"') plus the hand-off rule ('Follow up with get_problem (pass the P- id)'). Failure handling is also prescribed: report the error rather than falling back to browser automation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_process_crashesA
Lists the process crashes Dynatrace detected in the window: time, crashed process, host or pod, and the signal or exception, with entity ids for follow-up. The field layout of this internal endpoint is not verified: the columns are matched by field name, and every field that was not recognised is printed under details, so nothing is hidden.
Use it when a service became unavailable, a pod restarted, or a problem mentions a crash. Follow up with get_process / get_host on the ids, pod_events for Kubernetes restarts, or list_problems for the same window.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Only crashes whose process, host, pod, signal or exception contains this text (case-insensitive). | |
| limit | No | Maximum number of crashes to print. Default 25, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full burden and does so: it discloses the unverified internal endpoint layout, that unrecognized fields are dumped under `details` so nothing is hidden, that execution goes through the Dynatrace Bridge browser extension in the logged-in browser, and what to do on failure (report, don't automate a browser).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact paragraphs, front-loaded with purpose then usage then execution caveat; every sentence is load-bearing, though the middle paragraph's tool list is dense enough that some readers may skim it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, so the description compensates by describing the returned columns and the `details` catch-all, plus the environment-resolution caveat pointing at dynatrace_bridge_status. An agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are already documented in the schema; the description adds little parameter-level meaning beyond the window concept already covered by time_from/time_to/minutes_lookback. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the process crashes Dynatrace detected') and enumerates the returned columns (time, process, host/pod, signal/exception, entity ids), which distinguishes it from generic listing siblings like list_events or list_problems.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives triggering conditions ('a service became unavailable, a pod restarted, or a problem mentions a crash') and names concrete follow-ups (get_process/get_host for ids, pod_events for K8s restarts, list_problems for the same window), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_service_requestsA
Lists what one service does, with metrics per row: call count, average / median / p90 / max response time, total time, failure rate and HTTP 4xx / 5xx counts. For a web or method service the rows are its requests (endpoints, jobs); for a database service they are its SQL statements; for a "Requests to unmonitored hosts" service they are the target hosts.
Use it to see which endpoint of a service is slow (sort: "avg" or "p90"), costs the most time ("total_time", the default), is called most ("calls") or fails ("failure_rate"). For the same question across all services use trace_statistics; for cron jobs cron_job_statistics.
Every row prints its id and name; the other tools take either one as request. The shared filter arguments narrow the requests that are counted, e.g. response_time_min_ms: 2000 or failed: true.
service is an id or a name; find services with list_services.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ranking of the rows, highest first (name: A to Z). Default total_time. | |
| limit | No | Maximum number of rows to print. Default 25, at most 200. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose a genuinely non-obvious execution trait: the tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser, with explicit failure handling (report the error, do not open tabs or use browser automation). It also describes row content and that output states omitted rows. It does not cover auth/permissions or rate limits, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight paragraphs, front-loaded with what it lists and what sort to use; the browser-extension caveat is correctly placed last. Slight redundancy with the schema (re-listing sort criteria that are already an enum) costs it a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with no output schema and no annotations, the description covers row composition, per-service-type row semantics, the required `service` lookup path, and the extension dependency. Missing details are minor and schema-covered (limit/pagination, time-window defaults), so it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 is the baseline. The prose still adds meaning the schema cannot: the default sort and why each sort value matters, the cross-tool contract that a printed row id or name can be passed as `request` by other tools, and how `service`/`request` resolve by name vs id. That is real semantic value on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the requests/statements/hosts of one service) and immediately defines what a 'row' means for web/method, database, and 'Requests to unmonitored hosts' services. It explicitly differentiates itself from trace_statistics, cron_job_statistics and list_services, so an agent can route without opening siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance tied to the sort argument ('which endpoint is slow', 'costs the most time', 'fails'), names the alternative for the cross-service question (trace_statistics) and for cron jobs (cron_job_statistics), and points to list_services for discovering the required `service` value.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesA
Lists the services Dynatrace monitors with their key numbers for the time window: average and p90 response time, failure rate, request count and requests per minute. Use it to find a service id, to see which services are slow, failing or busy, and as the starting point of any service investigation.
Filter with name (case-insensitive substring), service_type (WEB_REQUEST_SERVICE, WEB_SERVICE, DATABASE_SERVICE, BACKGROUND_ACTIVITY, CUSTOM_SERVICE, …; a part such as "database" is enough), technology (Java, Node JS, Nginx, Apache, SQL Server, …) and tag (exactly as Dynatrace shows it, case-sensitive: key:value, or key for a tag without a value). sort picks the ranking: throughput (default), response_time, p90, failure_rate (all highest first) or name.
Start here for "which services are slow / failing / busy": sort: "response_time", "failure_rate" or "throughput". Several services can share one name (one per process group); the ids tell them apart. Follow up with service_overview for one service.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | A tag the service must carry, case-sensitive: `key:value`, or `key` for a tag without a value. | |
| name | No | Case-insensitive substring of the service name. | |
| sort | No | Ranking: throughput (default), response_time, p90, failure_rate, name. | |
| limit | No | Maximum number of services to print. Default 25, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| technology | No | Technology of the service, e.g. Java, Node JS, Nginx, Apache, SQL Server. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| service_type | No | Service type or a part of it, e.g. WEB_REQUEST_SERVICE, DATABASE_SERVICE, BACKGROUND_ACTIVITY, "database". | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose meaningful behavior: it runs through the Dynatrace Bridge browser extension in the user's logged-in browser, and on failure the agent should report the error rather than fall back to browser automation. It also warns that several services can share a name (one per process group), which affects interpretation of results. It does not cover rate limits or return/pagination detail beyond what the schema's `limit` already says.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the returned metrics, then filtering, then investigation recipes, then the runtime caveat about the browser extension. Three dense paragraphs where each sentence earns its place; slightly long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description fills that gap by enumerating the returned metrics and noting that the response header resolves the absolute UTC window and that `limit` reports omitted counts. All 10 parameters are documented, and it routes the agent to `dynatrace_bridge_status` for environment names the description cannot list.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the prose adds meaning beyond the schema: partial matching for `service_type` ('a part such as "database" is enough'), case-sensitivity of `tag` versus case-insensitive `name`, and that all sort keys rank highest-first with `name` as the exception. It also notes the duplicate-name/id disambiguation, which the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the services Dynatrace monitors') plus the exact metrics returned (avg/p90 response time, failure rate, request count, RPM). It distinguishes itself from siblings by naming `service_overview` as the follow-up for a single service and positioning itself as the entry point for service investigations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: find a service id, identify slow/failing/busy services, and start any service investigation. It maps concrete intent to arguments ('which services are slow → sort: "response_time"') and names the alternative (`service_overview`) for drilling into one service.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tracesA
Lists individual traces (PurePaths): the requests of one service, or of the whole environment when service is omitted. Use it to find concrete slow or failed requests, then open one with get_trace.
Filters: response time range, HTTP code or class, failed state, HTTP method, one request (request: name or id, with service), a request group, URL text (url_contains, web requests only, works without service), request kind, plus raw_filters.
Per trace: start time, request name, method + URL, HTTP code, failed flag, response / CPU / wait / suspension time, database call count and time, downstream service calls, exception classes, request attributes (secret-looking ones masked), and the traceId + callURI that get_trace needs.
Dynatrace returns the newest matching traces (fetch_limit of them, 100 by default, at most 3000); this tool then sorts those and prints limit of them (25 by default, at most 100). So "slowest" means the slowest among the fetched newest traces: when the output says Dynatrace returned its limit, narrow the window or the filters (e.g. response_time_min_ms) or raise fetch_limit. Default order: slowest first when a response time filter is given, newest first otherwise. A warning line appears when the window is only partly covered or traces are sampled.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Order of the output. Default: slowest when a response time filter is given, newest otherwise. | |
| limit | No | Maximum number of traces to print. Default 25, at most 100. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | No | The service whose traces to list, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. Omit for the whole environment. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| fetch_limit | No | How many of the newest matching traces Dynatrace returns before this tool sorts them (its purepathsLimit, at most 3000). Default: 100, or `limit` when that is larger. Raise it to rank a busy window more completely; it does not change how many are printed. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden—and it does: it explains the browser-extension execution model, the fetch_limit-then-sort two-stage retrieval, the 'slowest among newest fetched' caveat, default ordering, partial-window/sampling warnings, and the 'do not use browser automation' failure path. This is exactly the non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then filters, then per-trace fields, then the retrieval-limit mechanics, then the bridge runtime caveat. Dense but every block earns its place; it could be trimmed slightly (some per-trace fields enumerated) but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 19 params, no output schema, and no annotations, the description covers the return shape (list of trace fields including the traceId/callURI get_trace needs), the tricky fetch_limit/limit interaction, and the execution environment. An agent has everything needed to call it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100% (baseline 3), but the description adds cross-parameter semantics that the schema does not: e.g. 'request name needs service', 'url_contains works with or without service', 'minutes_lookback is ignored when time_from is given', and the fetch_limit vs limit distinction. These add genuine value beyond field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Lists individual traces (PurePaths)') and scopes it precisely ('requests of one service, or of the whole environment when service is omitted'). It also name-drops the sibling get_trace as the follow-up, distinguishing it from trace_statistics and analyze_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('find concrete slow or failed requests, then open one with get_trace') and the description enumerates the alternative filters and quirks (url_contains vs request for non-web) in the param docs. Routing is unambiguous for the main follow-up tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workloadsA
Lists Kubernetes workloads (deployments, stateful sets, daemon sets, jobs; Dynatrace entity type CLOUD_APPLICATION) with workload type, namespace, cluster, running versus desired pods, and average CPU and memory usage against the configured requests and limits over the window.
Filter with name (case-insensitive substring), namespace (exact) and cluster (cluster name or KUBERNETES_CLUSTER id). Use it to find the workload id that list_pods, pod_resources, pod_events and process_runtime take, or to spot workloads running close to their limits.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring of the workload name. | |
| limit | No | Maximum number of workloads to print. Default 25, at most 200. The output says how many were omitted. | |
| cluster | No | The Kubernetes cluster, as an entity id (KUBERNETES_CLUSTER-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| namespace | No | Kubernetes namespace, exact name (case-insensitive). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and delivers non-obvious behavior: the tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser, and on failure the agent should report the error rather than fall back to browser automation. It does not state permission/auth requirements, rate limits, or explicitly that it is a read-only operation, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight paragraphs: capability/returns first, filtering and usage second, transport caveat third. Every sentence carries information, with the most decision-relevant content front-loaded. Slightly long but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by detailing the returned fields (workload type, namespace, cluster, running vs desired pods, CPU/memory against requests and limits). With 8 optional params and a documented transport dependency, the main remaining gap is the absence of explicit auth/permission expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 8 parameters including defaults, formats, and edge cases. The description restates filter semantics (case-insensitive substring name, exact namespace, cluster name or KUBERNETES_CLUSTER id) but adds nothing the schema does not already contain, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists Kubernetes workloads') and enumerates exactly which kinds (deployments, stateful sets, daemon sets, jobs) and the Dynatrace entity type. It also names what is returned (namespace, cluster, running vs desired pods, CPU/memory vs requests/limits), so an agent can distinguish it from sibling list tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the sibling tools this feeds ('list_pods', 'pod_resources', 'pod_events', 'process_runtime') and the two conditions to reach for it (finding a workload id, spotting workloads near their limits). It also gives filter semantics (name substring, namespace exact, cluster name-or-id), leaving no inference about when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_allocation_hotspotsA
Shows where a process group allocates memory (Dynatrace continuous memory profiling, Java): total allocated and surviving bytes, allocation per API, the methods that allocate the most with their main callers and object types, and the most allocated types.
Use it for high garbage-collection time or memory growth. survivors_only: true restricts to objects that survived a garbage collection (candidates for leaks and heap growth).
The default window is the last 15 minutes because Dynatrace answers with a very large call tree for busy process groups; keep the window short.
When memory profiling is not enabled or not supported for the process group, or the answer is too large to relay, the tool says so and what to do. cpu_by_process_group lists memory for the process groups that support it.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of allocating methods and types to print. Default 15, at most 100. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| process_group | Yes | The process group, as an entity id (PROCESS_GROUP-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| survivors_only | No | Only objects that survived a garbage collection. Default false. | |
| minutes_lookback | No | Window length in minutes. Default 15. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discharges it: it explains why the default window is 15 minutes (large call trees for busy process groups), what happens when profiling is unavailable ('the tool says so and what to do'), and an operational constraint — it runs through the Dynatrace Bridge extension in the user's logged-in browser, and on failure the agent must report the error rather than use browser automation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then usage triggers, then caveats and the browser-extension constraint in short, scannable paragraphs. The opening sentence is a long run-on listing output sections, but every sentence still carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-annotation, no-output-schema tool, the description covers output shape, failure modes with remediation, environment resolution, and an operational constraint — everything needed to call it correctly and interpret its outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantic value beyond the schema: it frames 'survivors_only' as leak/heap-growth candidates and explains the 15-minute default as a deliberate size-management choice. Time-window semantics and the environment default are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Shows where a process group allocates memory') with the exact output sections enumerated (allocated/surviving bytes, allocation per API, top methods with callers and object types, most allocated types). This is clearly distinguishable from siblings like method_hotspots and cpu_by_process_group, which cover different signal types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger conditions are given: 'high garbage-collection time or memory growth', plus 'survivors_only: true' for leak/heap-growth candidates. It also points to cpu_by_process_group to discover which process groups support memory profiling. It stops short of naming a rival tool to prefer for adjacent questions, hence 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
method_hotspotsA
Shows which methods a service or process group spends its time in, from Dynatrace code-level stack samples: sample share per API (framework / library group) and per thread state, then the hot methods.
view: "flat" (default) ranks methods by self share (samples where the method itself was on top of the stack) and also gives the total share including callees. view: "tree" prints the call tree from the thread entry points downwards, pruned to branches above min_share_percent.
By default only active states are counted (running on CPU, locking, network and disk I/O); include_waiting: true adds waiting threads.
Pass exactly one of service or process_group (id or name; ids come from list_services, trace_statistics or cpu_by_process_group). Numbers are stack samples, not milliseconds; compare shares. Follow up with thread_analysis for the thread groups behind the samples.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Flat view only: keep methods whose name or API contains this text (case-insensitive). | |
| view | No | flat (default): top methods by self share. tree: pruned call tree. | |
| limit | No | Maximum number of methods (flat view, at most 200) or tree lines (tree view, default 40, at most 300) to print. Default 20. The output says how many were omitted. | |
| service | No | The service whose code to profile, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| process_group | No | The process group to profile, as an entity id (PROCESS_GROUP-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| include_waiting | No | Also count samples of waiting threads. Default false. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| min_share_percent | No | Tree view only: hide branches below this share of all samples (0-100). Default 1. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden and does so well: it explains that the tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser, that an unconfigured environment resolves to a default, that browsers/tab automation must not be attempted on failure, and that numbers are stack samples rather than milliseconds. It does not mention rate limits, auth failure modes beyond 'report the error', or result-size behavior beyond the limit defaults.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then structured in short paragraphs covering views, state defaults, scoping, and the browser-extension caveat. Every sentence carries information, though the length is on the heavier side and a couple of sentences (e.g. the environment caveat) could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description describes the return shape (sample share per API group and thread state, then hot methods, plus omitted-count reporting) and the window-resolution behavior. For an 11-parameter, no-annotation, complex analysis tool, an agent has everything it needs to invoke it and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: flat view ranks by self share while also reporting total share including callees, tree view is pruned at min_share_percent, and active states are counted by default with include_waiting opting waiting threads in. It also states the resolved absolute UTC window is echoed in the response header.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — showing which methods consume time, broken down by sample share per API and per thread state — anchored to a named data source (Dynatrace code-level stack samples). It is plainly distinguishable from siblings such as memory_allocation_hotspots, cpu_by_process_group and thread_analysis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing rules: 'Pass exactly one of service or process_group', where the ids come from (list_services, trace_statistics, cpu_by_process_group), and an explicit follow-up ('use thread_analysis for the thread groups behind the samples'). It stops short of explicitly excluding the other hotspot-style siblings, so it's clear context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pod_eventsA
Lists the Kubernetes events Dynatrace recorded for the pods of a workload and for the workload itself (or for one pod): readiness / liveness probe failures, container kills and back-offs, scheduling and image pull problems, mount failures, deployment spec changes. Identical events are collapsed by reason and message, with a count and the first and last time, newest first.
Pass exactly one of workload or pod (id or name). Use it after pod_resources shows restarts, OOM kills or a pod that is not running, with the window narrowed to that time.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| pod | No | A single pod, as an entity id (CLOUD_APPLICATION_INSTANCE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| limit | No | Maximum number of event groups to print. Default 30, at most 200. The output says how many were omitted. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| workload | No | The workload whose pod and workload events to list, as an entity id (CLOUD_APPLICATION-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does substantial work: it discloses the aggregation semantics (identical events collapsed by reason and message, with count and first/last time, newest first) and the unusual execution path (runs through the Dynatrace Bridge browser extension in the user's logged-in browser) plus failure handling guidance. It stops short of stating the operation is read-only/non-mutating or any permission requirements, which is the remaining gap for a zero-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with what the tool returns, then the selection rule, then the environment caveat. No filler sentences, and the most decision-relevant facts (what it lists, which param to pass, what it depends on) come first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, zero required, no output schema, and no annotations, the description covers the return shape (grouped events, count, first/last timestamp, ordering, omitted count), the window resolution behavior, the environment default, and points to dynatrace_bridge_status for environment names. An agent has everything needed to call it correctly without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds a real constraint the schema does not encode (required list is empty): exactly one of workload or pod must be passed, and a name matching several entities returns candidates rather than guessing. That mutual-exclusivity rule is the kind of semantics the schema alone would not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the Kubernetes events Dynatrace recorded') and then enumerates the concrete event categories (probe failures, container kills/back-offs, scheduling, image pull, mount failures, spec changes). This clearly distinguishes it from siblings like list_events and pod_resources without needing the schema opened.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule ('Pass exactly one of workload or pod') and a concrete trigger condition ('Use it after pod_resources shows restarts, OOM kills or a pod that is not running, with the window narrowed to that time'), naming the sibling that precedes it. Nothing about when to reach for this rather than alternatives is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pod_resourcesA
Shows the resource behaviour of the pods of a Kubernetes workload, or of one pod, over the time window: CPU usage, CPU throttling, memory (resident set per container, working set for the workload, usage in % of the limit), OOM kills and container restarts, per pod and per container, each as a summarised series (min / avg / max with its time / last / trend and a compact table over time).
Start here for "why does this pod restart / get OOM-killed / run slow": it opens with findings that flag obvious trouble: usage near the limit, significant CPU throttling, OOM kills, restarts inside the window, pods not running. Pass exactly one of workload or pod (id or name; find workloads with list_workloads). Narrow the window around a peak with time_from / time_to, then check pod_events for what Kubernetes did at that time and process_runtime for the JVM / Node.js view.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| pod | No | A single pod, as an entity id (CLOUD_APPLICATION_INSTANCE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| workload | No | The workload whose pods to analyse, as an entity id (CLOUD_APPLICATION-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| max_series | No | Maximum containers summarised per metric, ranked by average. Default 10, at most 50. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does so well: it discloses the output shape (findings plus summarised min/avg/max/last/trend series), the mutual-exclusivity constraint, and the unusual execution path (Dynatrace Bridge browser extension in the logged-in browser) with explicit failure handling guidance. It omits any payload-size or pagination caveats, but max_series in the schema partly covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the 'start here' triage signal, then parameters, then the execution caveat. It is dense and long for three paragraphs, but each paragraph has a distinct job (what it returns, when to use it, how it runs) and none is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and 7 parameters, the description compensates by explaining the return format (findings plus per-pod/per-container summarised series) and the routing to sibling tools. An agent has everything needed to select and invoke it, including the browser-extension dependency and failure protocol.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: the schema declares no required fields while the description states 'Pass exactly one of `workload` or `pod`', a constraint absent from the structured data. It also frames time_from/time_to as a way to narrow around a peak.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Shows the resource behaviour of the pods of a Kubernetes workload, or of one pod') and enumerates the exact metrics returned (CPU usage, throttling, RSS/working set, OOM kills, restarts). It is clearly distinguishable from sibling tools like pod_events and process_runtime, which it names as the next steps rather than duplicating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Start here for why does this pod restart / get OOM-killed / run slow', names the alternative tools to try afterwards ('pod_events', 'process_runtime'), and states the selection constraint 'Pass exactly one of `workload` or `pod`'. It even points to `list_workloads` for finding inputs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
process_runtimeA
Reports runtime metrics of the processes (Dynatrace PROCESS_GROUP_INSTANCE) running in a pod, a workload or a process group, or of one process. The technology is detected per process: JVM processes get heap usage, heap max, memory pools, GC suspension and GC time, and thread count; Node.js processes get V8 heap used / total, RSS, event loop utilization and latency; every process gets CPU usage and working set memory. Each metric is a summarised series (min / avg / max with its time / last / trend, and a table over time for the main ones).
Pass exactly one of pod, workload, process_group or process (id or name). Use it when pod_resources shows memory growth or CPU saturation and you need to know whether heap, GC or the event loop is the cause. Follow up with get_process for callers, callees and hosted services.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| pod | No | The pod whose processes to analyse, as an entity id (CLOUD_APPLICATION_INSTANCE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| process | No | A single process, as an entity id (PROCESS_GROUP_INSTANCE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| workload | No | The workload whose processes to analyse, as an entity id (CLOUD_APPLICATION-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| max_series | No | Maximum series summarised per metric, ranked by average. Default 10, at most 50. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| process_group | No | A process group, as an entity id (PROCESS_GROUP-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and delivers: it discloses the per-technology metric behavior, the summarised-series return shape (min/avg/max plus a table over time), the exactly-one-selector constraint, and the execution channel plus failure protocol ('runs through the Dynatrace Bridge browser extension ... report the error to the user; do not try to open browser tabs or use browser automation instead').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the mutually-exclusive selector rule, then when-to-use, then the execution-channel caveat. The long metric enumeration is justified since there is no output schema, but it is the one densest block in an otherwise tight three-paragraph description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, yet the description explains the return shape (summarised series with min/avg/max, time, last, trend, and a table over time), the selector constraint, defaults, and the failure path. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds a selection rule the schema does not express: 'Pass exactly one of pod, workload, process_group or process'. It also explains the default/omission behavior for environment via dynatrace_bridge_status, though time window semantics are largely already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reports runtime metrics of the processes ... running in a pod, a workload or a process group, or of one process') and enumerates the technology-specific metrics returned. It is clearly distinguishable from pod_resources (host/pod resource view) and get_process (callers/callees/hosted services), which are named in the text.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use it when pod_resources shows memory growth or CPU saturation and you need to know whether heap, GC or the event loop is the cause') and an explicit follow-up ('Follow up with get_process for callers, callees and hosted services'). The alternatives are named rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_metricsA
Runs a Dynatrace metric query (the data behind any chart) and returns each series summarised: min, avg, max with its timestamp, last value, trend, and a compact table of values over time. Values are converted to readable units (µs → ms/s, bytes → MiB/GiB) from the unit of the metric descriptor; when Dynatrace names no unit, or the descriptor cannot be read, the values are printed raw and the output says so. The descriptor describes the plain metric, so after a transformation that changes the unit (:rate, :count, arithmetic) read the numbers with that in mind.
selector uses the Dynatrace metric selector language: a metric id plus optional transformations, e.g.
builtin:service.response.time:percentile(95)builtin:service.errors.total.rate:splitBy("dt.entity.service"):sort(value(avg,descending)):limit(10):namesbuiltin:containers.memory.residentSetBytes:splitBy("dt.entity.container_group_instance"):max:namesSeveral selectors can be given comma-separated. Append:namesso entity names are shown next to their ids. Find metric ids withfind_metrics.
Scope to entities with entity_selector (entitySelector syntax), e.g. entityId("SERVICE-1234567890ABCDEF") or type(HOST),entityName.contains("web"). resolution sets the point spacing (1m, 5m, 1h, 1d, or Inf for a single value over the window); by default Dynatrace picks one that fits the window.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| selector | Yes | Metric selector: metric id with optional transformations (:avg, :max, :percentile(95), :splitBy("dimension"), :filter(...), :sort(...), :limit(n), :names, :rate(1m), …). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| max_series | No | Maximum series summarised per metric, ranked by average. Default 10, at most 50. | |
| resolution | No | Point spacing: '1m', '5m', '1h', '1d', a point count like '60', or 'Inf' for one aggregated value. Default: chosen by Dynatrace for the window. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| entity_selector | No | Optional entitySelector limiting the entities the metric is read for, e.g. `entityId("HOST-1234567890ABCDEF")`. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses execution through the Dynatrace Bridge browser extension in the logged-in browser, instructs on failure handling (report the error, do not automate a browser), and explains unit-conversion behavior including the raw-value fallback and the caveat that transformations like ':rate' change units. It does not spell out auth/permission prerequisites or rate limits, so it falls just short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but well-organized and front-loaded: purpose and return shape come first, then selector syntax, scoping, resolution, and the execution caveat. The bulleted examples earn their space as they are the core invocation skill, though the description is on the edge of verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, the description still explains the return summary, unit handling, the browser-extension execution path, and failure behavior, while the input schema covers every parameter. An agent has everything needed to invoke and interpret it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so baseline is 3, but the description adds real meaning: the metric selector language with transformation examples, resolution point-spacing semantics ('Inf' for a single value, default chosen by Dynatrace), and how the time window resolves. This goes beyond the schema's terse per-parameter strings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Runs a Dynatrace metric query') and immediately clarifies scope ('the data behind any chart') plus exactly what is returned (min/avg/max, timestamp, last value, trend, table). It is unmistakably distinct from the sibling discovery tool find_metrics, which it explicitly names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance: how to build a selector with three worked examples, the ':names' tip, entity scoping via entity_selector, resolution semantics, and routes metric-id discovery to find_metrics. It stops short of explicit when-not-to-use guidance against analytical siblings such as analyze_response_time or service_overview.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_settingsA
Reads Dynatrace configuration (Settings 2.0), read-only: alerting profiles, anomaly detection thresholds, failure detection rules, request attributes, naming rules, maintenance windows and every other settings schema.
Without schema it lists the settings schemas; narrow the list with search (text matched against schema id and name, e.g. "alerting", "anomaly", "failure-detection").
With schema (e.g. builtin:alerting.profile) it prints the configured objects of that schema at scope (default environment; pass an entity id such as SERVICE-1234567890ABCDEF or HOST_GROUP-… for an entity-level override). Set effective: true to get the values actually in force at that scope, including inherited ones and defaults.
Values are printed as compact nested lists. Passwords, tokens, keys, credentials and anything else that looks like a secret are masked. The bridge cannot change settings.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of settings objects (at most 50), or schemas when listing (default 50, at most 500) to print. Default 20. The output says how many were omitted. | |
| scope | No | Scope to read: `environment` (default) or an entity id, e.g. SERVICE-1234567890ABCDEF, HOST-…, PROCESS_GROUP-…. | |
| schema | No | Settings schema id, e.g. `builtin:alerting.profile`, `builtin:anomaly-detection.services`, `builtin:failure-detection-rulesets`. Omit to list the schemas. | |
| search | No | When listing schemas: case-insensitive text matched against schema id and display name. | |
| effective | No | Read the effective values at the scope (inherited values and defaults included) instead of the objects stored at the scope. Default false. | |
| max_lines | No | Maximum lines printed per settings value. Default 40, at most 200. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: read-only ('The bridge cannot change settings'), secret masking, compact nested-list output format, and the browser-extension dependency with explicit failure handling. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then organized by mode, then caveats. Every sentence earns its place: mode selection, scope, effective semantics, output/masking, and failure handling. No redundancy with the parameter list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema tool, the description supplies what's missing elsewhere: print format, masking, omission reporting, scope defaults, and the bridge failure protocol. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description nonetheless adds semantics the schema lacks, such as examples of schema ids, the meaning of entity-level overrides for `scope`, and what `effective: true` actually returns (inherited values and defaults).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Reads Dynatrace configuration (Settings 2.0)') and enumerates the categories covered (alerting profiles, anomaly detection thresholds, failure detection rules, etc.), which cleanly separates it from observability siblings like get_problem or query_metrics. The read-only scope is stated up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly declares the two operating modes and the condition that selects each: without `schema` it lists schemas, with `schema` it prints configured objects at `scope`. It also explains narrowing via `search`, the `effective` flag behavior, and the fallback when the bridge fails ('report the error to the user; do not try browser automation').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_backtraceA
Shows who calls a service (Dynatrace service backtrace): the upstream caller tree, level by level, up to the services where the requests enter (web entry points, background tasks, cron jobs). Each caller has the number of its requests involved, the resulting calls into the analysed service, how many of its requests start there, and its top calling requests with their SERVICE_METHOD ids.
Use it to find which upstream service, endpoint or job causes the load or the failures on a service or database. Pass service as an id or a name. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests. E.g. request backtraces one endpoint, failed: true only the failed calls.
For one SQL statement use statement_callers. Follow up with list_traces on a caller with request set to a calling request.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of caller nodes to print. Default 30, at most 300. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| max_depth | No | How many caller levels above the service to show. Default 4, at most 20. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| requests_per_caller | No | Calling requests listed under each caller, ranked by resulting calls. Default 3, at most 20. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the unusual execution path (runs through the Dynatrace Bridge browser extension in the logged-in browser) and prescribes error handling ('report the error to the user; do not try to open browser tabs'). It also describes what the output contains per caller, which is behavioral context the schema cannot supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then filter guidance, then the runtime caveat, so an agent can stop reading early. Slightly long because the filter list partly echoes schema-documented parameters, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 19-parameter tool with no annotations and no output schema, the description covers purpose, selection criteria, parameter interactions, return contents, sibling alternatives, and the browser-extension execution constraint. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real interpretive value: it groups the 'shared trace filters' and gives concrete usage examples (`request` backtraces one endpoint, `failed: true` only failed calls) that clarify how parameters combine rather than merely restating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Shows who calls a service ... the upstream caller tree, level by level') and even sketches the shape of the returned caller data. It is clearly distinguishable from siblings like service_flow and statement_callers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says what problem it solves ('find which upstream service, endpoint or job causes the load or the failures') and names the correct alternative for a related case ('For one SQL statement use `statement_callers`'), plus a follow-up path with `list_traces`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_flowA
Shows what a service calls (Dynatrace service flow): the downstream call tree of services, databases and external hosts as an indented tree. Each node has its contribution to the response time of the analysed service, the share of requests that make the call, calls per calling request, average time per call, call count and failed calls.
Use it to see which dependency a slow or failing service spends its time in. Pass service as an id or a name; max_depth limits how many call levels are followed. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests.
Follow up with analyze_response_time or service_flow on a downstream id, top_database_statements on a database node, or service_backtrace for the opposite direction.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tree nodes to print. Default 40, at most 300. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| max_depth | No | How many call levels below the service to show. Default 3, at most 20. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does so thoroughly: it discloses output content per node, the fact that execution goes through the Dynatrace Bridge browser extension in the user's logged-in browser, and explicit failure handling ('report the error to the user; do not try to open browser tabs or use browser automation'). This is exactly the operational context an agent needs and cannot get from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight paragraphs: output shape first, then usage and follow-up routing, then execution-model caveats. Front-loaded with what the tool returns, and no sentence is redundant despite the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description enumerates the per-node metrics (response-time contribution, request share, calls per calling request, average time per call, call count, failed calls) and the tree structure, which fully compensates. Combined with the execution-model note, an agent can call and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema documents all 18 parameters in detail, so the baseline is 3. The description restates only `service` (id or name) and `max_depth`, adding no syntax or format detail beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Shows what a service calls ... downstream call tree of services, databases and external hosts as an indented tree') and describes the exact output shape. It implicitly distinguishes itself from the sibling service_backtrace by naming that tool as the 'opposite direction'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('see which dependency a slow or failing service spends its time in') and names follow-up alternatives with their conditions: analyze_response_time, recursive service_flow on a downstream id, top_database_statements for database nodes, and service_backtrace for the reverse direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_overviewA
Everything about one service in one call: type, technology, tags and properties; response time p50 / p90 / p99 / average, failure rate and throughput for the window, with a compact trend over time; the services it calls and the services that call it; the process groups, hosts, Kubernetes workloads and pods it runs on; and the Dynatrace problems that affected it in the window.
Pass service as an id (SERVICE-1234567890ABCDEF) or a name; an ambiguous name returns the candidates. Find services with list_services.
Then drill down with the same service and time window: list_service_requests (its endpoints), list_traces (individual requests), analyze_failures, analyze_response_time, service_flow (downstream), service_backtrace (upstream), and get_problem for a listed problem.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| service | Yes | The service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| relationship_limit | No | Maximum related entities listed per relationship (called services, callers, hosts, …). Default 10, at most 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the execution model (runs via the Dynatrace Bridge browser extension in the user's logged-in browser), the required error-handling behavior, and the ambiguity policy (a name matching several entities returns candidates instead of guessing). It does not explicitly state that the call is read-only/side-effect free, which is the only meaningful gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-sentence summary before any enumeration, and each subsequent paragraph has a distinct job (what you get, how to call it, where to go next, execution caveat). The payload enumeration in sentence one is long, but it is load-bearing information for judging whether this tool fits a need.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must say what comes back, and it does — latency percentiles, failure rate, throughput, trend, upstream/downstream relationships, infrastructure, and affected problems. Combined with the drill-down map and the browser-extension caveat, an agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The prose reinforces the `service` id-vs-name ambiguity rule and the window resolution behavior, but these are already documented in the schema; the description adds no syntax, format, or constraint detail beyond it (e.g. no extra guidance on relationship_limit tradeoffs).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a concrete verb+resource with scope ('Everything about one service in one call') and then enumerates the exact payload categories: type/technology/tags, latency percentiles, failure rate, throughput, relationships, process groups/hosts/k8s, and problems. An agent can distinguish this from get_entity, list_services, or analyze_failures without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes discovery through `list_services`, then names the drill-down alternatives (`list_service_requests`, `list_traces`, `analyze_failures`, `analyze_response_time`, `service_flow`, `service_backtrace`, `get_problem`) and the condition for using each. It also states a failure-mode policy (report the error, do not fall back to browser automation), which is uncommon and valuable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
slow_statement_executionsA
Lists the slow executions of one SQL statement on a database service, slowest first: start time, duration, rows returned, fetches, and the traceId and callURI of the trace each execution belongs to.
Pass service (the database service, id or name), statement (id from top_database_statements, or a part of the SQL text) and optionally response_time_min_ms (default 100). The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests.
Follow up with get_trace, passing the traceId and callURI of a row as trace_id and call_uri, to see the request that issued the statement and everything else it did.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of executions to print. Default 20, at most 200. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| service | Yes | The database service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| statement | Yes | The SQL statement: its SERVICE_METHOD-… id as printed by `top_database_statements`, or a part of its text (several matches return the candidates). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only executions that took at least this many milliseconds. Default 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the default response_time_min_ms of 100, that a name matching several entities returns candidates instead of guessing, and the operational constraint that the tool runs through the Dynatrace Bridge browser extension with explicit failure handling ('report the error to the user; do not try to open browser tabs'). It omits any auth/permission requirements, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and output shape, then the necessary inputs, then the follow-up and the browser-extension caveat. The middle sentence enumerating ten shared trace filters duplicates the schema and is the one slightly wasteful element, but overall it is tight and well ordered.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no output schema, the description compensates by naming the columns returned and the ordering, plus the follow-up tool and the runtime environment caveat. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 17 parameters in detail. The description restates only the required trio and the default of response_time_min_ms, adding little beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Lists the slow executions of one SQL statement on a database service'), states the ordering ('slowest first'), and enumerates the returned columns. It is clearly distinguishable from siblings such as top_database_statements and statement_callers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the required inputs, tells the agent where the statement id comes from ('id from `top_database_statements`, or a part of the SQL text'), and prescribes the follow-up step via get_trace with the returned traceId/callURI. It does not explicitly contrast itself with statement_callers or top_database_statements, but the context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statement_callersA
Finds what causes one SQL statement (Dynatrace backtrace of a database service filtered to the statement): the services that execute it, the exact requests, background tasks and cron jobs behind those services with their SERVICE_METHOD ids, and for each the number of requests and of resulting executions, followed by the upstream caller tree.
Pass service (the database service, id or name) and statement (id from top_database_statements, or a part of the SQL text). The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests. E.g. response_time_min_ms backtraces only the slow executions.
Follow up with slow_statement_executions for single slow executions, or list_traces with service set to a caller id and request to a calling request.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of calling requests in the table, and caller nodes in the tree to print. Default 20, at most 200. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| service | Yes | The database service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| max_depth | No | How many caller levels above the database to show in the tree. Default 4, at most 20. | |
| statement | Yes | The SQL statement: its SERVICE_METHOD-… id as printed by `top_database_statements`, or a part of its text (several matches return the candidates). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations the description carries the full burden, and it does so well: it discloses the browser-extension dependency, instructs the agent to report failures rather than attempt browser automation, notes that an ambiguous service name returns candidates instead of guessing, and mentions the output reports how many items were omitted. It does not cover auth requirements or return-format details beyond counts and the tree.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight paragraphs are front-loaded with purpose, then inputs, then follow-ups, then a runtime caveat. The opening sentence is dense with enumerated outputs but still readable; nothing sentence-wise is wasted, though the enumeration could be trimmed slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter trace tool with no output schema, the description covers purpose, key filter semantics, follow-up routing, and the browser-bridge operating constraint. There is no output schema, yet the description does describe the shape of the result (tables, counts, caller tree) and truncation behaviour, leaving only minor gaps around permissions and exact result formatting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it groups the shared trace filters and gives a concrete semantic example (response_time_min_ms backtraces only the slow executions), and clarifies that `statement` accepts either a top_database_statements id or a text fragment. That is useful clarification beyond the schema's field-level text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource – tracing what causes one SQL statement – and enumerates the exact output: executing services, requests, background tasks, cron jobs with SERVICE_METHOD ids, counts, and the upstream caller tree. It also names the sibling tools that feed it (top_database_statements) and that continue the workflow (slow_statement_executions, list_traces), so an agent can place it precisely among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the two required inputs and where their values come from, explains that shared trace filters narrow the analysed requests, and explicitly routes follow-up work to slow_statement_executions or list_traces with the right parameter wiring. It lacks an explicit when-not-to-use statement (e.g. vs service_backtrace or service_flow), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
thread_analysisA
Analyses the threads of a process group (Dynatrace continuous thread analysis): how many threads are in each state (running, locking, network I/O, disk I/O, optionally waiting), and the thread groups ranked by CPU time with their average thread count and state samples.
Use it to see whether a process is CPU-bound, blocked on locks or stuck in I/O, and which thread pool is responsible. state keeps only thread groups seen in that state and ranks by it (e.g. LOCK for lock contention). Follow up with method_hotspots on the same process group for the methods.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of thread groups to print. Default 20, at most 200. The output says how many were omitted. | |
| state | No | Only thread groups sampled in this state, ranked by its samples. Default: all, ranked by CPU time. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| process_group | Yes | The process group, as an entity id (PROCESS_GROUP-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| include_waiting | No | Also include waiting (idle) threads. Default false. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the browser-bridge execution dependency, instructs the agent to report rather than work around failures, and explains ranking behavior ('ranked by its samples' vs 'ranked by CPU time'). It does not cover permissions, rate limits, or result-size behavior, keeping it at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose, then usage, then the environment caveat. Every sentence carries information, though the browser-bridge paragraph is slightly verbose relative to the rest.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with 100% schema coverage and no output schema, the description supplies the missing operational context: process-group name resolution ambiguity, environment defaults tied to dynatrace_bridge_status, and the bridge execution model. Only a brief note on expected result scope is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining the state filter's semantics and giving a concrete enum usage example ('LOCK for lock contention') that the schema enum alone doesn't convey, and clarifying that output states how many groups were omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Analyses the threads of a process group'), names the underlying capability (Dynatrace continuous thread analysis), and enumerates what the output contains (state counts, thread groups ranked by CPU time). An agent can distinguish this from siblings like cpu_by_process_group or method_hotspots without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit diagnostic scenarios ('see whether a process is CPU-bound, blocked on locks or stuck in I/O') and an example of when to use the state filter ('LOCK for lock contention'), plus a named follow-up tool for methods. It stops short of stating when NOT to use this versus the sibling process tools, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_database_statementsA
Lists the SQL statements of a database ranked by cost: per statement the total time spent, the average, median, 95th percentile and slowest execution, the number of executions, and the statement id (SERVICE_METHOD-…). The tool for "which SQL is slow / expensive".
Pass service as the id or name of a database service. Dynatrace often has several database services with one name (one per calling process group): pass the name and their statements are combined by statement text in one table, with the service and statement id pairs each follow-up tool needs; pass an id for one of them alone. Combining costs two analysis requests whatever the number of services. Called without service, it lists the database services. sort ranks by total_time (default), avg, max, p95 or executions. Dynatrace returns at most its 100 statements with the largest total time, so the other sorts re-order only those and the output says so when statements were cut: a rare slow statement can be missing from "slowest". SQL text is cut to a readable length; pass full_sql: true for the whole text. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests.
Follow up with statement_callers (which services, requests and cron jobs issue a statement) and slow_statement_executions (its slow executions with the calling traces), passing the same service and the statement id as statement.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Ranking: total_time (default), avg, max, p95 or executions. | |
| limit | No | Maximum number of statements to print. Default 20, at most 100. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | No | The database service: a SERVICE-… id for one service, or a name. Every database service with exactly that name is combined; a name that matches one service, or only part of a name, behaves like an id. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| full_sql | No | Print the complete SQL text instead of the first 160 characters. Default false. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does: it discloses the 100-statement cap by total time (and that other sorts only re-order that set, so a rare slow statement can be missing from 'slowest'), that combining costs two analysis requests, that SQL text is truncated, and that it runs through the Dynatrace Bridge browser extension with a failure instruction instead of automation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the 'which SQL is slow' framing are front-loaded, and the paragraphs are ordered by importance (purpose, service semantics, sort caveat, follow-ups, transport caveat). It is dense rather than bloated, though the wall of filter-related detail makes it longer than a reader strictly needs before the first call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 19 optional parameters, no annotations and no output schema, the description still tells the agent what comes back (per-statement metrics and ids), when output is incomplete (the 100-statement cap), the default behaviour without `service`, and which tools continue the investigation. Nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: how `sort` interacts with the 100-statement cutoff, how `service` names combine or behave like ids, and that `full_sql` restores the truncated text. Those interactions are the parts an agent would otherwise get wrong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Lists the SQL statements of a database') and enumerates exactly what each row contains (total time, avg, median, p95, slowest execution, execution count, statement id). The tagline 'The tool for which SQL is slow / expensive' makes the intent unmistakable and separates it from siblings like statement_callers and slow_statement_executions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the branches: pass a service name to get all same-named services combined by statement text, pass an id for one alone, and call it with no `service` to list database services. It names both follow-up tools and what to pass them (`service` plus the statement id), and explains when the shared trace filters apply.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_exceptionsA
Ranks the exception classes thrown in traced requests (Dynatrace multidimensional analysis "Exceptions overview"): per class the number of exceptions, Dynatrace's LOAD, AVERAGE and MAX aggregates of the exception count (read as: requests that had the exception, average and maximum per such request; that reading is not verified, so the columns keep Dynatrace's names), and, when no service is given, the services that throw it most with their ids.
Start here for "which exceptions occur most". Call it without service for the whole environment, or with service (id or name) for one service. The shared trace filters (response_time_min_ms, response_time_max_ms, http_code, failed, http_method, request, request_group_id, url_contains, request_kind, raw_filters) narrow the analysed requests.
Follow up with analyze_failures on a service that throws the exception (not every exception fails a request), or list_traces with raw_filters: [{ type: "EXCEPTION", values: ["<class>"] }] for traces containing it.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of exception classes to print. Default 20, at most 100. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | No | Optional: only this service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| services_per_class | No | Without `service`: how many services are named per exception class. Default 3, at most 20. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden and does well: it discloses the browser-extension/logged-in-browser execution path, the failure-handling rule (report to user, no browser automation), the unverified reading of the Dynatrace aggregate columns, and that omitted classes are reported in the output. It does not explicitly state that the call is read-only, but 'ranks analysed requests' makes that clear in context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage/routing, then execution caveat — a logical order. The first paragraph is dense and the aggregate-column caveat is wordy, but every sentence carries information an agent needs; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 18-parameter tool with no output schema and no annotations, the description supplies the result shape (classes, count, aggregates, top services with ids), the scoping rules and the failure mode. Remaining per-parameter detail is fully covered by the schema, so the definition is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description nonetheless adds value beyond the schema by enumerating the shared trace-filter set, clarifying the service/no-service branch, and explaining the meaning of the aggregate columns the parameters feed into. Marginal but real lift over the already-thorough schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Ranks the exception classes thrown in traced requests' — and immediately qualifies the notion of 'top' by naming the aggregates used (LOAD, AVERAGE, MAX). This is clearly distinguishable from siblings like analyze_failures, list_traces and top_database_statements.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions itself as the entry point ('Start here for which exceptions occur most'), states the no-service vs with-service branches, and names two concrete follow-ups (analyze_failures for a failing service, list_traces with raw_filters for the traces). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trace_statisticsA
Multidimensional analysis over traces: aggregates one metric over all matching requests, split by one dimension, across all services or for one. The tool for "which endpoints are the slowest / cost the most time / burn the most CPU / fail the most".
Recipes (the metric defaults to RESPONSE_TIME and the dimension to the request name {Request:Name}; add request_kind: "web" to rank HTTP endpoints only, because without it SQL statements dominate an environment-wide ranking; add service for one service):
slowest endpoints:
aggregation: "P95"(or"AVERAGE", the default for time metrics) withmin_calls: 20, so that requests seen once or twice do not win;most time-consuming endpoints:
aggregation: "SUM";most CPU:
metric: "CPU_TIME",aggregation: "SUM";most errors:
metric: "FAILED_REQUEST_COUNT"(orHTTP_5XX_ERROR_COUNT), a count metric, ranked by itsCOUNTby default;by something else:
dimension: "{Relative-URL}","{HTTP-Status}","{Exception:Class}","{Service:Name}", or a request attribute as"{RequestAttribute:<name>}".
list_definitions: true lists the metrics, dimensions and request attributes this environment has. aggregation picks the column the rows are ranked by; the header names it. The table shows every aggregate Dynatrace returns. For a time metric these are requests (the number of requests), avg, median, p90, p95, the chosen percentile, max, min and sum. For a count metric (Dynatrace returns a COUNT for it) they are printed under Dynatrace's own names, COUNT, COUNT_PER_MINUTE, LOAD, AVERAGE, MIN, MAX, with a line saying what is known about them. timeseries: true adds the top values over time.
Each row prints the request id and, without service, the service it belongs to. Dynatrace returns at most its top 100 values, those with the largest total (sum, or COUNT for a count metric), and leaves out values with too few sampled requests. Ranking by anything else (avg, p95, max, …) re-sorts only those 100, so a rarely called slow request outside them is missing; the output says when that happened.
This tool runs through the Dynatrace Bridge browser extension in the user's logged-in browser. If it fails, report the error to the user; do not try to open browser tabs or use browser automation instead.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of dimension values to print. Default 25, at most 200. The output says how many were omitted. | |
| failed | No | true = only failed requests, false = only successful requests. Omit for both. | |
| metric | No | Metric to aggregate, e.g. RESPONSE_TIME, CPU_TIME, WAIT_TIME, REQUEST_COUNT, FAILED_REQUEST_COUNT, FAILURE_RATE, HTTP_5XX_ERROR_COUNT, EXCEPTION_COUNT, DATABASE_CHILD_CALL_COUNT, DATABASE_CHILD_CALL_TIME. Default RESPONSE_TIME. List them with list_definitions. | |
| request | No | One request (endpoint, SQL statement, job) of `service`: its name or a part of the name (e.g. '/cart/checkout'), or its SERVICE_METHOD-… id. A name is looked up among the requests of `service` (one extra request), so it needs `service`; several matches return the candidates instead of guessing. An id works without a lookup. | |
| service | No | Restrict to one service, as an entity id (SERVICE-1234567890ABCDEF) or a name. A name that matches several entities returns the candidates instead of guessing. Omit for all services. | |
| time_to | No | Absolute end time, ISO 8601; without a zone it is read as UTC. Without time_from, the window starts minutes_lookback before this. Must not be in the future. | |
| dimension | No | Dimension to split by, in braces, e.g. {Request:Name}, {Relative-URL}, {URL:Host}, {HTTP-Status}, {HTTP-Method}, {Exception:Class}, {Service:Name}, {Request:Failure}, or a request attribute as {RequestAttribute:<name>}. Default {Request:Name}. List them with list_definitions. | |
| http_code | No | HTTP response code filter: one code ('404'), a class ('4xx', '5xx') or a range ('400-599'). | |
| min_calls | No | Leave out rows with fewer requests than this: the `requests` column of a time metric; for other metrics it is compared with Dynatrace's `LOAD` aggregate. Use about 20 when ranking by AVERAGE, P95 or MAX so that rarely called requests do not win. Default 0. | |
| time_from | No | Absolute start time, ISO 8601 (e.g. '2026-09-23T10:28:00Z'). A timestamp without a zone (Z or ±hh:mm) is read as UTC. Without time_to, the window runs from here to now. Must not be in the future. | |
| percentile | No | Percentile (1-99) for the PERCENTILE aggregation, shown as an extra column. Default 80. | |
| timeseries | No | Also summarise the top dimension values over time. Default false. | |
| aggregation | No | Aggregate the rows are ranked by. Default: COUNT for count metrics (those Dynatrace returns a COUNT for: REQUEST_COUNT, FAILED_REQUEST_COUNT, …), AVERAGE for every other metric. SUM = total time (on a count metric it means COUNT). LOAD = the number of requests of a time metric (the `requests` column). PERCENTILE needs `percentile`. An aggregate the metric does not have is an error that lists the available ones. | |
| environment | No | Which Dynatrace environment to query, as named in the Dynatrace Bridge extension popup. Omit it for the default, the first environment configured there. The names are not listed here because the extension had not connected yet when this description was built; `dynatrace_bridge_status` lists them. | |
| http_method | No | HTTP method of the request. | |
| raw_filters | No | Escape hatch for servicefilter types without a dedicated argument. Each entry is {type, values}; type is a numeric id or one of CPU_TIME, CALL_INSTANCE_ID, CALL_TREE, CALL_URI, CALL_TAG, WAIT_TIME, SYNC_TIME, SUSPENSION_TIME, CALLEE, CALLER, PROXY, SERVICE_ID, EXCEPTION, DATABASE_STATEMENT, DATABASE_TABLE, FLAWS, DISK_IO_TIME, NETWORK_IO_TIME, NUMBER_OF_DB_CALLS, NUMBER_OF_NON_DB_CALLS, TIME_SPENT_IN_DB_CALLS, TIME_SPENT_IN_NON_DB_CALLS, TRACE_ID, THREAD_NAME, PROCESSING_TIME, DATABASE_VENDOR, DATABASE_NAME, ENTITY_TAG, PG_NAME, PG_TAG, DATABASE_ROW_COUNT, DATABASE_FETCH_COUNT, WEBREQUEST_HOSTNAME, KEY_REQUEST, RELEASE, BUILD, STAGE, PRODUCT, SPAN_NAME, SPAN_ATTRIBUTE, ENTRY_POINT. Value formats of these types are not verified; time values are microseconds. | |
| request_kind | No | web = only requests of web request and web services (HTTP endpoints, including calls to unmonitored hosts); database = only SQL statements. Omit for every kind (also background activity, custom and messaging services). | |
| url_contains | No | Only web requests whose URL contains this text. The quick way to filter by a URL path fragment (e.g. '/checkout') without knowing the service or the request: it works with or without `service`. It matches nothing for non-web requests (SQL statements, cron jobs, messaging, custom services), which have no URL; use `request` for those. | |
| merge_services | No | true = one row per dimension value across services; false (default) = one row per dimension value and service. Ignored when `service` is given. | |
| definitions_view | No | Which built-in analysis view list_definitions reads. Default topweb (web requests); topdb / topsql for database statements, exceptions for exception analysis. | |
| list_definitions | No | Discovery mode: list the available metrics and dimensions instead of running an analysis. | |
| minutes_lookback | No | Window length in minutes. Default 120. With neither time_from nor time_to it means the last N minutes up to now; with only time_to it means the N minutes ending at time_to; ignored when time_from is given. The response header always shows the resolved absolute UTC window. | |
| request_group_id | No | A request type as a SERVICE_METHOD_GROUP-… id. For a 'Requests to unmonitored hosts' service this id is the target host (printed by list_service_requests; there the host name can also be passed as `request`). | |
| request_group_name | No | Display name belonging to request_group_id, exactly as printed next to the id. Pass it together with request_group_id. | |
| request_attribute_id | No | Only with metric REQUEST_ATTRIBUTE: the id of the numeric request attribute, as printed by list_definitions. | |
| response_time_max_ms | No | Only requests whose response time is at most this many milliseconds. | |
| response_time_min_ms | No | Only requests whose response time is at least this many milliseconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses the top-100 Dynatrace cap, that ranking by non-default aggregates only re-sorts those 100 (so rare slow requests are missing), that low-sample values are dropped, and that the output flags omissions. It also uniquely discloses the browser-extension execution path and instructs the agent to report errors rather than escalate to automation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long, but well front-loaded: the one-line purpose comes first, then the recipes, then the output/caveat notes. Nearly every sentence carries operational information, though a few (e.g., the repeated enumeration of count-metric aggregate names) could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 27-parameter, zero-required tool with no output schema and no annotations, the description is unusually complete: it documents defaults, ranking semantics, the 100-value truncation caveat, output columns, and the environment/extension dependency. Nothing essential for correct invocation is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning beyond the schema: it explains defaulting behavior (metric defaults to RESPONSE_TIME, dimension to {Request:Name}), why min_calls ~20 matters when ranking by AVERAGE/P95/MAX, and how aggregation maps to the ranked column. This is meaningful value on top of already-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource ('aggregates one metric over all matching requests, split by one dimension') and frames it as the tool for ranking endpoints by latency/cost/CPU/failures. This clearly separates it from siblings like list_traces, get_trace, or analyze_response_time, which enumerate or drill into individual traces rather than aggregate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit recipes tied to distinct intents (slowest endpoints, most time-consuming, most CPU, most errors) with the exact parameter combinations, and names the alternative discovery path (`list_definitions: true`). It also states when to add `request_kind: "web"` and why (SQL statements otherwise dominate), which is actionable when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
39 tool updates
v1.0.1- First observed
analyze_failures - First observed
analyze_response_time - First observed
cpu_by_process_group - First observed
cron_job_statistics - First observed
dynatrace_bridge_status - First observed
find_entities - First observed
find_metrics - First observed
get_dashboard - First observed
get_entity - First observed
get_host - First observed
get_problem - First observed
get_process - First observed
get_trace - First observed
get_trace_details - First observed
list_dashboards - First observed
list_events - First observed
list_pods - First observed
list_problems - First observed
list_process_crashes - First observed
list_service_requests - First observed
list_services - First observed
list_traces - First observed
list_workloads - First observed
memory_allocation_hotspots - First observed
method_hotspots - First observed
pod_events - First observed
pod_resources - First observed
process_runtime - First observed
query_metrics - First observed
read_settings - First observed
service_backtrace - First observed
service_flow - First observed
service_overview - First observed
slow_statement_executions - First observed
statement_callers - First observed
thread_analysis - First observed
top_database_statements - First observed
top_exceptions - First observed
trace_statistics
TDQS
Scored across 39 tools
Most tools target clearly distinct resources and actions (entity search vs detail, list vs aggregate, profiling views), and descriptions cross-reference each other well. A few boundaries blur—list_events overlaps with pod_events for Kubernetes events, and generic get_entity competes with specialized get_host/get_process/get_problem—but the detailed descriptions mitigate most confusion.
The set mixes verb_noun names (get_host, list_pods, query_metrics, analyze_failures, read_settings) with bare domain noun phrases (pod_resources, trace_statistics, method_hotspots, service_flow, thread_analysis). It is consistent within categories (list_*, get_*, analyze_*) but does not follow one predictable pattern throughout.
With 39 tools, the surface is well above the typical 3–15 range and heavy for an agent to navigate. While Dynatrace is a broad platform, some tools (e.g., list_events vs pod_events, list_traces vs trace_statistics) could be consolidated or scoped more tightly.
Read-only coverage is broad: entities, metrics, problems, events, traces, service analysis, Kubernetes workloads/pods, processes, dashboards, and settings. Gaps are minor (e.g., no RUM/user-session or log-query tools) and write operations are absent by design, so core observability workflows are complete.
Maintenance
Related MCP Connectors
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Browser-local and CLI static evidence for deployed AI model artifacts.
The Cortex MCP server provides read-only access to real-time engineering context from the Cortex developer portal, allowing AI coding assistants to answer natural language questions about your organization's catalog (microservices, libraries, domains, teams, infrastructure), scorecards (engineering standards and best practices), initiatives (goals and deadlines), and Engineering Intelligence metrics. It includes tools for querying documentation, tracking personal entities, and accessing AI-assisted insights across the entire Cortex ecosystem.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to interact with self-hosted Dynatrace Managed environments to retrieve observability data, security insights, and performance metrics. It allows users to query problems, logs, events, and SLOs through natural language interfaces in both local and remote modes.18840 npm32Apache 2.0
- AlicenseBqualityCmaintenanceEnables LLM agents to query Dynatrace SaaS for observability data (logs, metrics, traces, entities, problems, vulnerabilities) and manage configurations (dashboards, notebooks, SLOs, synthetic monitors, settings).100MIT
- AlicenseNot gradedqualityCmaintenanceA powerful Model Context Protocol (MCP) server that provides AI assistants with comprehensive access to Dynatrace's observability platform. Features dual authentication architecture, Davis CoPilot AI integration, and 24 specialized tools for monitoring, automation, and operational intelligence.18 npm5MIT
- AlicenseAqualityAmaintenanceLets AI assistants safely explore a Matrix42 instance by discovering web services and the data model, running validated ASQL queries, searching the service desk, and previewing ticket actions — read-only by default and without exposing credentials.543 npmMIT