Tideways MCP Server
A read-only MCP server for Tideways that lets an AI assistant query performance metrics, issues, traces, and observations via GET-only API tools.
List projects, token scopes, default project, and rate-limit status.
List services of a project, optionally searching for a service by keyword.
Get performance metrics (totals, error rate, p95, layers, top transactions, timeline) for up to 24h windows within ~30 days.
Get 15-minute performance summaries (requests, errors, p95) over up to ~30 days.
List issues (errors, slow SQL, deprecations) by status and type, 10 per page.
Search individual traces by text, time window, response time, and sort by response time or memory (at most 30 per call).
Get day/week/month historical reports for a past date.
Get observations (configuration problems and code bottlenecks like N+1 queries).
Supports optional project, service, and environment parameters; all times UTC.
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., "@Tideways MCP Serverwhy was checkout slow yesterday?"
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.
Tideways MCP Server
An unofficial, community-maintained server, not affiliated with or supported by Tideways. For Tideways' own tooling, see the official Tideways CLI.
A read-only Model Context Protocol server for Tideways. It lets an AI assistant answer questions such as "why was checkout slow yesterday?" from your performance data, issues and traces. It only calls GET endpoints of the Tideways REST API.
Install
You need a Tideways API token with the scopes metrics, traces and errors (Organization settings → API Access), and Node.js 22+ or Docker. Coming from 1.x? See UPGRADING.md.
claude mcp add tideways -e TIDEWAYS_TOKEN=your-token -- npx -y tideways-mcp-serverAdd -s user to use it in every project.
Open the .mcpb bundle from the latest release. It asks for the token and keeps it in the OS keychain.
codex mcp add tideways --env TIDEWAYS_TOKEN=your-token -- npx -y tideways-mcp-serverThe Codex CLI, IDE extension and app share this entry in ~/.codex/config.toml.
Add to the client's MCP configuration (Cursor: ~/.cursor/mcp.json; Gemini CLI: ~/.gemini/settings.json; either also per project):
{
"mcpServers": {
"tideways": {
"command": "npx",
"args": ["-y", "tideways-mcp-server"],
"env": { "TIDEWAYS_TOKEN": "your-token" }
}
}
}Add to opencode.json in the project, or to ~/.config/opencode/opencode.json for all projects. {env:TIDEWAYS_TOKEN} reads the token from your shell's environment.
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tideways": {
"type": "local",
"command": ["npx", "-y", "tideways-mcp-server"],
"environment": { "TIDEWAYS_TOKEN": "{env:TIDEWAYS_TOKEN}" }
}
}
}Add to .vscode/mcp.json, or run MCP: Open User Configuration for all workspaces. VS Code asks for the token on first start and stores it.
{
"inputs": [
{ "type": "promptString", "id": "tideways-token", "description": "Tideways API token", "password": true }
],
"servers": {
"tideways": {
"type": "stdio",
"command": "npx",
"args": ["-y", "tideways-mcp-server"],
"env": { "TIDEWAYS_TOKEN": "${input:tideways-token}" }
}
}
}In any setup above, replace npx -y tideways-mcp-server with docker run -i --rm -e TIDEWAYS_TOKEN ghcr.io/abuhamza/tideways-mcp-server (pin a version with :2.0.0). For example:
claude mcp add tideways -e TIDEWAYS_TOKEN=your-token -- docker run -i --rm -e TIDEWAYS_TOKEN ghcr.io/abuhamza/tideways-mcp-server"command": "docker",
"args": ["run", "-i", "--rm", "-e", "TIDEWAYS_TOKEN", "ghcr.io/abuhamza/tideways-mcp-server"],
"env": { "TIDEWAYS_TOKEN": "your-token" }Related MCP server: otel-mcp-server
Tools
Tool | Answers |
| Which projects and scopes does my token have, and how much of the hourly rate limit is left? |
| Which services does a project have, and which of them serve "voucher"? |
| How is the app doing in any window of up to 24 h within the last ~30 days? Totals, layers, top transactions |
| When did one transaction get slow, and in which layer? Per-minute timeline and response-time histogram |
| Requests, errors and p95 in 15-minute buckets over up to 30 days |
| Which errors, slow SQL queries, deprecations, warnings or notices are open, resolved or ignored, in any service or transaction? |
| Where in the code does an issue fail, which transactions does it hit, and when did it start or stop? |
| Which individual requests were slow, in any transaction, and where did the time go? |
| Day, week or month report for a past date |
| Configuration problems and code bottlenecks Tideways detected (e.g. N+1 queries) |
All tools except tideways_list_projects take an optional project (name or organization/name).
Configuration
Environment variables; empty values count as unset. The server does not load .env files.
Variable | Default | Meaning |
| required | API token |
| the token's only project | Default project; with several projects and no default, pass |
| from the token's projects | Organization, to match a plain project name |
| API default | Default environment |
| the project's default service | Default service |
|
| API base URL, https only |
|
| Request timeout in ms, a positive integer up to |
|
|
|
Good to know
All times are UTC,
YYYY-MM-DD HH:mm. The API rate limit is per Tideways organization and clock hour; its size depends on the plan, and all tokens and projects of the organization share it.Tools read the project's default service unless you name one;
tideways_list_issuesreads all services. The API cannot list services;tideways_list_servicesfinds them through the issues of all services, and itssearchcosts one request per service.tideways_search_tracesreturns 30 traces per call, or up to 100 withlimit.Limits of the Tideways API: history for production and the default service only, issues 10 per page, and no trace filter by bottleneck (an N+1 observation's link opens the affected traces in Tideways).
Security
The token is read from the environment and never logged, and trace URLs are returned without query strings. Report vulnerabilities privately as described in SECURITY.md.
Development
npm ci
npm run check # the gate: typecheck, lint, format, tests, commit messages
npm run build && npm run inspect # try the tools in the MCP InspectorArchitecture, invariants and how to add a tool: CLAUDE.md. Commits follow Conventional Commits.
License
Available Tools
10 toolstideways_get_historyGet historical reportARead-onlyIdempotent
Daily, weekly or monthly performance report for a past date: total requests, error rate, p95, top 20 transactions by impact and a timeline. Use to compare days or weeks. A period that has not ended covers only its finished hours (pendingBuckets > 0), and today has no data until it ends; compare such periods per day or use tideways_get_performance_summary. Covers production and the project's default service only; for another environment or service use tideways_get_performance with end and minutes=1440 (one day per call).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Day to report, "YYYY-MM-DD". For week the API uses the Monday of that week, for month the 1st. | |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| granularity | No | day |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| report | Yes | |
| project | Yes | |
| timeline | Yes | Hourly (UTC) for a day; daily (UTC date, max p95) for a week or month. The first and last days can be partial because the report follows the organization's calendar |
| dateRange | Yes | Report boundaries in the organization's local calendar (timeline keys are UTC) |
| transactions | Yes | Top 20 transactions by impact |
| pendingBuckets | Yes | Hours of the period not aggregated yet (zero-filled by the API, left out); when > 0, report totals cover only part of the period |
| transactionCount | Yes | Transactions in the full report; only the top 20 by impact are listed, detail "full" has all under raw.transaction_report |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description goes further by disclosing temporal edge behavior: unfinished periods return only completed hours (pendingBuckets > 0) and today has no data until it ends. It also scopes the call to production and the default service. It does not discuss rate limits, auth, or cost of 'full' detail beyond the schema note.
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 payload contents, then routing, then edge cases — a sensible order with no filler sentences. The final sentence is long and packs two distinct escape hatches together, which slightly hurts scanability but every clause carries information.
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?
An output schema exists, so return values need no explanation, and annotations carry the safety profile. What remains — when the data is incomplete, what scope is covered, and where to go otherwise — is all present, making the definition complete 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?
With 75% schema coverage, the baseline is 3, and the description adds beyond it: 'Daily, weekly or monthly' implicitly documents the undescribed granularity enum, and it explains the comparison semantics of date ranges. The detail parameter is left to the schema, so it is not fully compensated but the gap is minor.
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 ('performance report for a past date') and enumerates the payload (total requests, error rate, p95, top 20 transactions by impact, timeline). It explicitly distinguishes itself from tideways_get_performance_summary and tideways_get_performance, so an agent can route 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 the positive case ('Use to compare days or weeks') and names concrete alternatives for the cases it does not serve: tideways_get_performance_summary for unfinished periods and tideways_get_performance with end + minutes=1440 for other environments/services. Exclusions and routing are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_get_issueGet issueARead-onlyIdempotent
Get one issue from tideways_list_issues in depth: the stack trace of its latest occurrence (first 15 frames) with the request it came from (URL, method, status, host, service), the transactions it occurred in with counts, and its occurrences per time bucket over the retention period. Use to point at the failing code, rank the affected endpoints, and say when the issue started, peaked or stopped. Pass the id and the type the issue was listed under.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Type the issue was listed under in tideways_list_issues | error |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| issueId | Yes | Issue ID from issues[].id of tideways_list_issues | |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| type | Yes | |
| title | Yes | Exception class, or the tables of a slow SQL query |
| source | Yes | |
| status | Yes | |
| message | Yes | Last message or SQL, truncated to 2000 characters |
| project | Yes | |
| services | Yes | |
| durationMs | Yes | Slow SQL queries: duration of the query in ms; null for other types |
| occurrences | Yes | All occurrences since firstOccurred, not limited to any period |
| environments | Yes | |
| lastOccurred | Yes | |
| lastReopened | Yes | |
| transactions | Yes | Transactions that raised the issue, with their occurrence counts |
| firstOccurred | Yes | |
| latestOccurrence | Yes | |
| occurrenceHistogram | Yes | Occurrences per time bucket over the retention period |
| occurrencesSinceLastRelease | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds real behavioral detail beyond that: the stack trace is capped at the first 15 frames, the latest occurrence carries request context (URL, method, status, host, service), and occurrences are bucketed over the retention period. It does not mention latency, payload size, or rate limits, so not 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 sentences, front-loaded with the identity of the resource before the enumerated payload. The middle sentence is dense but each clause maps to a distinct output component. Slight redundancy between the second and third sentences (both reference how the issue was listed) keeps it from a 5.
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?
An output schema exists, so return-shape explanation is optional, yet the description still names the main result components, and annotations carry the safety profile. The dependency on tideways_list_issues for a valid id/type is made explicit. Missing only edge-case guidance such as behavior for an invalid id or type mismatch.
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 every parameter (including the detail and project enums) is already documented in the schema. The description's "Pass the id and the type the issue was listed under" largely restates the schema text for issueId and type, adding workflow framing but little new syntax or constraint detail. 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 ("Get one issue") and explicitly scopes it against the sibling it comes from ("from tideways_list_issues"), then enumerates the depth of data returned. An agent can distinguish this from tideways_list_issues and tideways_get_transaction 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?
"Use to point at the failing code, rank the affected endpoints, and say when the issue started, peaked or stopped" gives concrete use cases, and the workflow dependency on tideways_list_issues is stated twice. No when-not guidance or alternatives (e.g. get_transaction) are named, 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.
tideways_get_observationsGet observationsARead-onlyIdempotent
Automatic findings Tideways made for a project: PHP configuration problems (e.g. OPcache buffers, timeouts) and code bottlenecks detected in traces (e.g. N+1 queries, sleep, waits). Use for a quick health check or optimization ideas. Findings do not name the affected requests, and the API cannot filter traces by bottleneck: give the user the link, whose page in the Tideways UI lists recent affected traces. Do not infer N+1 queries from slow-SQL issues.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else the project's default service. A project can have several services; tideways_list_services lists them. When results come back, an unknown name fails with an error. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| project | Yes | |
| criteria | Yes | |
| observations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the read-only/idempotent annotations by disclosing real limitations: findings do not name affected requests and the API cannot filter traces by bottleneck. It also prescribes the workaround (give the user the link, whose UI page lists recent affected traces). This is exactly the kind of operational caveat annotations cannot convey.
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, then usage context, then caveats — a sensible information hierarchy. It is dense but every sentence carries information; the density is justified for a tool whose limitations matter.
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?
An output schema exists, so return shape needn't be explained, and the description still covers the tool's behavioral limits and the recommended follow-up action. Complete enough to call correctly, with only the sibling-routing gap keeping it below 5.
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 project/service/environment semantics (defaults, error-on-unknown, cross-references to tideways_list_projects/services) are already fully documented in the schema. The description adds nothing about parameter behavior, 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: automatic findings (PHP config problems and code bottlenecks) that Tideways produced for a project. The concrete examples (OPcache buffers, timeouts, N+1 queries, sleeps, waits) make the output identifiable and separate it from performance/metric siblings such as tideways_get_performance.
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 ("quick health check or optimization ideas") and warns against misuse ("Do not infer N+1 queries from slow-SQL issues"). It does not, however, name a sibling alternative (e.g. tideways_list_issues or tideways_search_traces) to route the agent when this tool is the wrong choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_get_performanceGet performance metricsARead-onlyIdempotent
Performance of any window of 1-1440 minutes ending at "end" (default now) within the last ~30 days: totals (requests, error rate, p95/median/average response time, time per layer), the top 20 transactions by impact, and a timeline. Older windows return zeros; use tideways_get_history for them. For 15-minute trends over 30 days use tideways_get_performance_summary.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last minute included, "YYYY-MM-DD HH:mm" in UTC. Defaults to now. | |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| minutes | No | Window length in minutes (max 1440 = 24h). Above 60 the timeline is downsampled to at most 60 points. | |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else the project's default service. A project can have several services; tideways_list_services lists them. When results come back, an unknown name fails with an error. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| totals | Yes | |
| project | Yes | |
| criteria | Yes | What Tideways actually queried. Times are UTC "YYYY-MM-DD HH:mm". |
| timeline | Yes | |
| transactions | Yes | Top transactions by impact; the API returns at most 20 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only/idempotent/non-destructive safety profile, but the description adds real behavioral context beyond them: zero-filled results for windows older than ~30 days, downsampled timelines above 60 minutes, and a warning that detail=full 'can be very large'. It omits any note on permissions or response size limits, but the data-behavior disclosures are substantive.
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 sentences with no filler, and the window definition plus payload contents lead the description. The first sentence is long and clause-heavy, but each clause carries routing or content information rather than padding.
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?
An output schema exists, so return values need not be spelled out, yet the description still summarizes the shape (totals, top transactions, timeline). Combined with the sibling routing and data-horizon caveats, 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 description coverage is 100%, so both the schema and the description document every parameter; the description largely restates the minute range and default end time. It adds the ~30-day data horizon, which the schema lacks, but otherwise defers to the schema. Baseline 3 applies when the schema does the heavy lifting.
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 names a specific verb+resource (performance metrics for a window) and enumerates the exact payload: totals, top 20 transactions by impact, and a timeline. It explicitly differentiates itself from siblings tideways_get_history and tideways_get_performance_summary.
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 when results degrade ('Older windows return zeros') and routes to the correct alternative ('use tideways_get_history for them'), plus a second routing rule for 15-minute trends ('use tideways_get_performance_summary'). Both when-to-use and when-to-use-something-else are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_get_performance_summaryGet performance summaryARead-onlyIdempotent
Requests, errors and p95 response time in 15-minute buckets for the last hours hours (up to ~30 days), with totals. Use for trends, before/after comparisons and spotting incidents. For per-minute detail and top transactions use tideways_get_performance.
| Name | Required | Description | Default |
|---|---|---|---|
| hours | No | How many hours back to include (max 744 = 31 days). The API always returns ~30 days. | |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else the project's default service. A project can have several services; tideways_list_services lists them. When results come back, an unknown name fails with an error. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| totals | Yes | |
| window | Yes | |
| buckets | Yes | 15-minute buckets, oldest first; a bucket keyed 12:00 covers 12:00-12:14 UTC |
| project | Yes | |
| criteria | Yes | What Tideways actually queried. Times are UTC "YYYY-MM-DD HH:mm". |
| pendingBuckets | Yes | Most recent buckets Tideways has not aggregated yet (zero-filled by the API), left out |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds useful behavioral context beyond that: the aggregation granularity (15-minute buckets), the retention window (~30 days), and that totals are included. It stops short of disclosing latency, rate limits or auth requirements, so it edges above baseline without being exhaustive.
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 sentences, zero waste, and front-loaded with the return shape before the routing advice. Each sentence earns its place.
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 an output schema handling return values, full parameter documentation, and annotations covering the safety profile, the description only needs to add granularity and routing – both of which it does. An agent has everything required 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 description coverage is 100%, so every parameter is already documented (hours limits, detail concise/full, project/service/environment resolution and fallbacks). The description only echoes the `hours` window, adding no syntax or format meaning beyond the schema, so the baseline of 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 plus exactly what is returned: requests, errors and p95 response time in 15-minute buckets with totals. It explicitly names the sibling tool that handles a different granularity (tideways_get_performance), so the agent can tell the two apart without opening either 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?
"Use for trends, before/after comparisons and spotting incidents" gives concrete use cases, and "For per-minute detail and top transactions use tideways_get_performance" names the alternative and the condition that selects it. 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.
tideways_get_transactionGet one transactionARead-onlyIdempotent
Timeline of one transaction over 1-1440 minutes ending at "end" (default now): per minute (or per bucket above 60 minutes) requests, errors, requests over the response-time target, p95/median/average and time per layer, plus totals with a response-time histogram. Use it to see when a transaction got slow and in which layer. Take transactionId from transactions[].id of tideways_get_performance.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Last minute included, "YYYY-MM-DD HH:mm" in UTC. Defaults to now. | |
| minutes | No | Window length in minutes (max 1440 = 24h). Above 60 the timeline is downsampled to at most 60 points; bucketMinutes says how long each one is. | |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else the project's default service. A project can have several services; tideways_list_services lists them. When results come back, an unknown name fails with an error. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. | |
| transactionId | Yes | Numeric transaction ID from transactions[].id of tideways_get_performance |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| name | Yes | |
| totals | Yes | |
| project | Yes | |
| criteria | Yes | What Tideways actually queried. Times are UTC "YYYY-MM-DD HH:mm". |
| timeline | Yes | |
| bucketMinutes | Yes | Minutes covered by each timeline point; null when the timeline is too short to tell |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds valuable behavioral context beyond that: the window cap (1-1440 minutes), downsampling above 60 minutes into buckets, the default end=now, and the rich result shape (per-minute metrics plus a response-time histogram and totals).
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 sentences, front-loaded with what the timeline returns, then the diagnostic use case, then the ID source. The metric enumeration is dense but every clause carries information; no filler sentences.
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 an output schema present, the description needn't explain return values, yet it still sketches them usefully, and it covers windowing, defaults, and ID provenance. It omits any mention of the project/service/environment scoping parameters, but those are fully documented in the schema, so nothing essential 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 every parameter including defaults and the downsampling rule; baseline is 3. The description's mention of the 1-1440 range and bucketing largely restates the schema rather than adding new syntax or format meaning, and project/service/environment scoping is left 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?
The description states a concrete verb+resource ('Timeline of one transaction') and enumerates exactly what the timeline contains (requests, errors, p95/median/average, time per layer, histogram). It also names the sibling tool that supplies the ID, so an agent can distinguish it from tideways_get_performance and tideways_get_performance_summary.
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 an explicit usage condition ('Use it to see when a transaction got slow and in which layer') and tells the agent where to obtain transactionId (transactions[].id of tideways_get_performance), which is real routing guidance. It stops short of stating when not to use it versus get_performance_summary, so it is not a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_list_issuesList issuesARead-onlyIdempotent
List error, slow-SQL, deprecation, warning or notice issues of a project, newest occurrence first, 10 per page, with the total count. Use to find what is failing or slow and how often. Reads all services unless "service" is passed or configured; "transactionIds" narrows to issues of given transactions. One type and one status per call. There is no time filter; use lastOccurred to judge recency.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number; 10 issues per page | |
| type | No | error = exceptions and fatal errors, slowsql = slow SQL queries, deprecated = deprecations, warning = PHP warnings, notice = PHP notices | error |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| status | No | open (default) = unresolved; all = open and ignored together; resolved, ignored and not_error are triaged states; "new" currently returns the same list as "open". | open |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else all services of the project; tideways_list_services lists them. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. | |
| transactionIds | No | Only issues raised in these transactions: numeric IDs from transactions[].id of tideways_get_performance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| issues | Yes | |
| hasMore | Yes | True when later pages exist; request the next page for more |
| project | Yes | |
| criteria | Yes | |
| totalItems | Yes | Issues matching the filters on all pages |
| totalPages | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real behavior: 10-per-page paging with a total count, newest-first ordering, one type and one status per call, no time filtering, and how service/environment defaults resolve. It omits return-shape and error/pagination-failure behavior, so not 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 purpose, sorting and page size before the scoping caveats; dense but nearly every clause carries information. Slightly sentence-heavy with several defaults packed into one paragraph.
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?
An output schema exists so return values need no explanation, and the description covers scope, defaults and filtering adequately. The only gap is that it never points to tideways_get_issue for per-issue detail, which matters given nine siblings.
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 contributes beyond it: the single-type/single-status-per-call constraint and the default-resolution rules for service and environment. It largely parallels what the schema already documents for page, type, status, detail and transactionIds.
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 issues of a project) with scope details: the five issue types, sort order (newest occurrence first), page size (10) and total count. This is clearly distinguishable from the singular sibling tideways_get_issue.
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?
"Use to find what is failing or slow and how often" gives an explicit context, and the description routes the agent (tideways_list_projects for valid names, tideways_list_services for services) plus notes there is no time filter and to use lastOccurred for recency. It does not name tideways_get_issue as the alternative for drilling into one issue, so it stops short of 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.
tideways_list_projectsList Tideways projectsARead-onlyIdempotent
List the projects and scopes of the configured Tideways API token, and how much of the organization's hourly rate limit is left. Call this first when unsure which project to use, or after a scope or unknown-project error.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| scopes | Yes | Token scopes: metrics (performance, summary, history), traces, errors (issues, observations) |
| projects | Yes | |
| rateLimit | Yes | Rate-limit headers from the last counted request (null until another tool has made a request in this session; any data call, e.g. tideways_get_observations, fills it). The hourly limit depends on the Tideways plan and is shared by all tokens and projects of the organization. |
| organization | Yes | The token's organization (null if its projects span several) |
| tokenExpired | Yes | |
| defaultProject | Yes | Project used when a call omits "project" (null if none can be chosen) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds real context beyond that: results are limited to the caller's configured token scopes and include a rate-limit reading, which tells the agent why an empty or partial result may occur.
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?
One sentence for what it returns, one for when to call it, both front-loaded and free of filler. No sentence restates the name or annotations.
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?
An output schema exists, so return values need no elaboration. For a parameterless, read-only discovery tool the description covers purpose, invocation trigger, and the token-scoped nature of the result, leaving nothing material unstated.
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?
Zero parameters, so the schema carries no parameter semantics for the description to enrich. Baseline of 4 applies; nothing further is needed here.
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?
Names a specific verb (List) and resource (projects and scopes) scoped to the configured API token, plus a secondary payload (remaining hourly rate limit). This is clearly distinguishable from every sibling, which all operate on issues, services, traces, or performance 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 explicit triggering conditions: call first when the right project is unknown, or after a scope or unknown-project error. It establishes precedence over other tools but does not name a specific alternative or state when not to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_list_servicesList servicesARead-onlyIdempotent
List the services of a project (web, APIs, workers, CLI) named by its issues, the default service first. Call it when the user names an app, API or worker that is not a project, or a transaction that tideways_search_traces does not find in the default service, with "search" set to one word of it: each service is searched for that word and the services are sorted by matching traces, so the first ones serve it. Costs 4 requests, plus 1 per service searched: at most 30, fewer when the hourly rate limit is small or nearly used up. Only services named by the newest open or ignored issues are listed; the Tideways UI service selector lists all.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | One whole word of the app, API, worker or transaction to find (e.g. "voucher"). Searches the traces of each service for it (one request per service: at most 30 services, fewer when the hourly rate limit is small or nearly used up) and sorts the services by matching traces. | |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; "environment" in the result shows which was used. When results come back, an unknown name fails with an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| search | No | Present only with "search" |
| project | Yes | |
| services | Yes | Services named by the newest open or ignored errors, slow SQL queries and deprecations of all services (first page of each), plus the default service; other services are missing, and the Tideways UI service selector lists all. Sorted default first, then by issues; with "search", by matchingTraces. |
| environment | Yes | Environment whose issues were read |
| defaultService | Yes | The project's default service, read when no service is passed or configured |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which already mark it read-only/idempotent) by disclosing cost (4 requests plus 1 per service, capped at 30, reduced under rate limits) and a real scope limitation: only services named by the newest open/ignored issues are listed, unlike the UI selector which lists all. This is the kind of behavior an agent needs before calling.
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 is front-loaded in the first sentence, and the cost and scope sentences each carry weight. Some phrasing is dense and slightly awkward ('named by its issues', 'so the first ones serve it'), but there is 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?
With a rich output schema already covering return values, the description completes the picture by covering when to use it, the search parameter's role, request cost, rate-limit behavior, and the listing-scope limitation. 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 coverage is 100%, so the schema already documents all three parameters in detail, including search semantics and environment defaults. The description reinforces the search flow ('one word of it' → sorted by matching traces) but adds little beyond what the schema descriptions state; 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?
Specific verb+resource: it lists the services of a project, enumerating the kinds (web, APIs, workers, CLI) and noting the default service leads. It also distinguishes itself from siblings by contrasting with tideways_search_traces when the default service misses a transaction.
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: call it when the user names an app/API/worker that is not a project, or when tideways_search_traces fails to find a transaction in the default service. It names the alternative and the exact condition that selects this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tideways_search_tracesSearch tracesARead-onlyIdempotent
Find individual request traces (30 per call unless "limit" asks for up to 100; newest first unless sortBy is set) with response time, memory, bottlenecks and the slowest layers. Use to investigate specific slow or failing requests; filter by transaction IDs from tideways_get_performance, text, time window and response time.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Latest trace time (inclusive), "YYYY-MM-DD HH:mm" UTC; needs "from" as well | |
| from | No | Earliest trace time, "YYYY-MM-DD HH:mm" UTC; needs "to" as well | |
| limit | No | Traces to return, up to 100. Raise it to cover a busy window or to find rarer examples, such as traces with an nplus1 bottleneck. | |
| detail | No | "concise" (default) returns a trimmed summary. "full" also includes the unmodified API response under "raw"; it can be very large. | concise |
| search | No | One whole word from the transaction name or URL path (e.g. "checkout"), matched against transaction, host and URL tokens. Several words match any of them and widen the result. | |
| sortBy | No | response_time = slowest first, memory = highest first; omit for newest first. Without from/to, sorted results span all retained traces (~30 days). | |
| project | No | Tideways project as "project" or "organization/project". Defaults to the defaultProject that tideways_list_projects reports; call it for valid names. | |
| service | No | Service, e.g. "web" or "worker". Defaults to the configured service, else the project's default service. A project can have several services; tideways_list_services lists them. When results come back, an unknown name fails with an error. | |
| environment | No | Environment, e.g. "production" or "staging". Defaults to the configured environment, else production; criteria.environment (traces: each trace's environment) shows which was used. When results come back, an unknown name fails with an error. | |
| withCallgraph | No | true = only traces that have a full callgraph (profile) | |
| transactionIds | No | Only traces of these transactions: numeric IDs from transactions[].id of tideways_get_performance. Combines with search, environment, service, sortBy and the from/to window. | |
| maxResponseTimeMs | No | ||
| minResponseTimeMs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| raw | No | Unmodified Tideways API response; present only when detail is "full". |
| count | Yes | |
| traces | Yes | |
| project | Yes | |
| limitReached | Yes | True when as many traces came back as "limit" asked for: raise "limit" (up to 100), narrow the time window or change sortBy to see others |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the bar is lower; the description nevertheless adds real behavioral facts beyond them: default page size of 30 (max 100) and the default sort order (newest first unless sortBy is set). It does not repeat the schema's warning about detail="full" being very large, which is the one behavior worth surfacing at selection time.
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?
Two sentences: the first front-loads result contents and default paging/ordering, the second front-loads the use case before the filter list. The dense parenthetical earns its space by answering 'how many, in what order' in one clause.
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 13 optional params, an output schema, and 85% schema coverage, the description supplies the missing selection-level context (defaults, ordering) and need not explain return values. It omits only the caveats about from/to being mutually required and the verbose detail="full" payload size, which are relevant before calling but are covered in 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 coverage is 85%, so the schema already documents nearly every parameter in detail; the description mainly summarizes (limit, sortBy, transactionIds, text, time window, response time). It adds the ordering default only implicitly ('newest first unless sortBy is set'), which duplicates the sortBy schema text rather than extending it. 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 and resource ("Find individual request traces") and immediately lists what each result carries: response time, memory, bottlenecks, slowest layers. That contrasts cleanly with siblings like tideways_get_transaction (single trace) and tideways_get_performance (aggregated data), so an agent can pick it 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 gives the use case ("investigate specific slow or failing requests") and names tideways_get_performance as the upstream source for transactionIds, which is a concrete routing rule. It stops short of saying when *not* to use it (e.g. versus tideways_get_transaction for a single known trace), so it is contextually clear but has no exclusions.
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.
9 tool updates
v2.1.1- Changed
tideways_get_history6 fields changed- added
Output schema / properties / dateRange / properties / end / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / dateRange / properties / end / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / dateRange / properties / start / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / dateRange / properties / start / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / timeline / items / properties / time / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "description": "\"YYYY-MM-DD\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" + } +] - removed
Output schema / properties / timeline / items / properties / time / typeRemoved value: -"string"
- Added
tideways_get_issue - Changed
tideways_get_performance8 fields changed- added
Output schema / properties / criteria / properties / end / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / criteria / properties / end / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / criteria / properties / start / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / criteria / properties / start / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / timeline / items / properties / time / descriptionAdded value: +"\"YYYY-MM-DD HH:mm\"" - added
Output schema / properties / timeline / items / properties / time / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$" - added
Output schema / properties / transactions / items / properties / idAdded value: +{ + "description": "Transaction ID: pass it as \"transactionId\" of tideways_get_transaction or in \"transactionIds\" of tideways_list_issues or tideways_search_traces", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / transactions / items / requiredPrevious value: -[ - "name", - "requests", - "averageMs", - "p95Ms", - "maxMs", - "memory", - "impactPercent" -]New value: +[ + "id", + "name", + "requests", + "averageMs", + "p95Ms", + "maxMs", + "memory", + "impactPercent" +]
- Changed
tideways_get_performance_summary10 fields changed- added
Output schema / properties / buckets / items / properties / time / descriptionAdded value: +"\"YYYY-MM-DD HH:mm\"" - added
Output schema / properties / buckets / items / properties / time / patternAdded value: +"^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$" - added
Output schema / properties / criteria / properties / end / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / criteria / properties / end / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / criteria / properties / start / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / criteria / properties / start / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / window / properties / from / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / window / properties / from / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / window / properties / to / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / window / properties / to / typeRemoved value: -[ - "string", - "null" -]
- Added
tideways_get_transaction - Changed
tideways_list_issues27 fields changed- added
Input schema / properties / serviceAdded value: +{ + "description": "Service, e.g. \"web\" or \"worker\". Defaults to the configured service, else all services of the project; tideways_list_services lists them.", + "maxLength": 100, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / status / descriptionPrevious value: -"open (default) = unresolved; resolved, ignored and not_error are triaged states; \"new\" currently returns the same list as \"open\". There is no \"all\"; call once per status you need."New value: +"open (default) = unresolved; all = open and ignored together; resolved, ignored and not_error are triaged states; \"new\" currently returns the same list as \"open\"." - changed
Input schema / properties / status / enumPrevious value: -[ - "open", - "new", - "resolved", - "not_error", - "ignored" -]New value: +[ + "open", + "all", + "new", + "resolved", + "not_error", + "ignored" +] - added
Input schema / properties / transactionIdsAdded value: +{ + "description": "Only issues raised in these transactions: numeric IDs from transactions[].id of tideways_get_performance.", + "items": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Input schema / properties / type / descriptionPrevious value: -"error = exceptions and fatal errors, slowsql = slow SQL queries, deprecated = deprecations"New value: +"error = exceptions and fatal errors, slowsql = slow SQL queries, deprecated = deprecations, warning = PHP warnings, notice = PHP notices" - changed
Input schema / properties / type / enumPrevious value: -[ - "error", - "slowsql", - "deprecated" -]New value: +[ + "error", + "slowsql", + "deprecated", + "warning", + "notice" +] - added
Output schema / properties / criteria / properties / service / descriptionAdded value: +"Service whose issues were read; null = all services" - changed
Output schema / properties / criteria / properties / type / enumPrevious value: -[ - "error", - "slowsql", - "deprecated" -]New value: +[ + "error", + "slowsql", + "deprecated", + "warning", + "notice" +] - changed
Output schema / properties / hasMore / descriptionPrevious value: -"True when the page is full; request the next page for more. The API reports no total."New value: +"True when later pages exist; request the next page for more" - added
Output schema / properties / issues / items / properties / durationMsAdded value: +{ + "description": "Slow SQL queries: duration of the query in ms; null for other types", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / issues / items / properties / firstOccurred / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / issues / items / properties / firstOccurred / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / issues / items / properties / lastOccurred / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / issues / items / properties / lastOccurred / typeRemoved value: -[ - "string", - "null" -] - added
Output schema / properties / issues / items / properties / originatingFunction / descriptionAdded value: +"Always null; source names the code" - changed
Output schema / properties / issues / items / properties / topFrame / descriptionPrevious value: -"Innermost stack frame of the last occurrence"New value: +"Always null: tideways_get_issue returns the stack trace; source names the file and line" - added
Output schema / properties / issues / items / properties / transactionCount / descriptionAdded value: +"Always null: tideways_get_issue returns the affected transactions" - changed
Output schema / properties / issues / items / properties / transactionCount / typePrevious value: -"number"New value: +[ + "number", + "null" +] - added
Output schema / properties / issues / items / properties / transactions / anyOfAdded value: +[ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } +] - changed
Output schema / properties / issues / items / properties / transactions / descriptionPrevious value: -"First 5 of transactionCount affected transactions, in no particular order; detail \"full\" lists all (large)"New value: +"Always null: tideways_get_issue returns the affected transactions with counts; filter the list by transaction with \"transactionIds\"" - removed
Output schema / properties / issues / items / properties / transactions / itemsRemoved value: -{ - "type": "string" -} - removed
Output schema / properties / issues / items / properties / transactions / typeRemoved value: -"array" - added
Output schema / properties / issues / items / properties / type / descriptionAdded value: +"The requested type; tideways_get_issue takes it with the id" - changed
Output schema / properties / issues / items / requiredPrevious value: -[ - "id", - "type", - "title", - "message", - "source", - "originatingFunction", - "status", - "occurrences", - "occurrencesSinceLastRelease", - "firstOccurred", - "lastOccurred", - "environments", - "services", - "transactionCount", - "transactions", - "topFrame" -]New value: +[ + "id", + "type", + "title", + "message", + "source", + "originatingFunction", + "status", + "occurrences", + "occurrencesSinceLastRelease", + "firstOccurred", + "lastOccurred", + "environments", + "services", + "durationMs", + "transactionCount", + "transactions", + "topFrame" +] - added
Output schema / properties / totalItemsAdded value: +{ + "description": "Issues matching the filters on all pages", + "type": "number" +} - added
Output schema / properties / totalPagesAdded value: +{ + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "project", - "criteria", - "issues", - "hasMore" -]New value: +[ + "project", + "criteria", + "issues", + "hasMore", + "totalItems", + "totalPages" +]
- Changed
tideways_list_projects1 field changed- changed
Output schema / properties / rateLimit / descriptionPrevious value: -"Rate-limit headers from the last counted request (null until another tool has made a request in this session; any data call, e.g. tideways_get_observations, fills it). The hourly limit is shared by all projects of the token."New value: +"Rate-limit headers from the last counted request (null until another tool has made a request in this session; any data call, e.g. tideways_get_observations, fills it). The hourly limit depends on the Tideways plan and is shared by all tokens and projects of the organization."
- Changed
tideways_list_services5 fields changed- changed
Input schema / properties / search / descriptionPrevious value: -"One whole word of the app, API, worker or transaction to find (e.g. \"voucher\"). Searches the traces of each service for it (one request per service: at most 30 services, and no more than a tenth of the hourly rate limit) and sorts the services by matching traces."New value: +"One whole word of the app, API, worker or transaction to find (e.g. \"voucher\"). Searches the traces of each service for it (one request per service: at most 30 services, fewer when the hourly rate limit is small or nearly used up) and sorts the services by matching traces." - changed
Output schema / properties / search / properties / notSearched / descriptionPrevious value: -"Services left out: one call searches at most 30 services, no more than a tenth of the hourly rate limit, and keeps 10 requests in reserve; search them with tideways_search_traces"New value: +"Services left out: one call searches at most 30 services, stays within a tenth of the hourly rate limit and keeps 10 requests in reserve; search them with tideways_search_traces" - changed
Output schema / properties / services / descriptionPrevious value: -"Services named by the newest open errors, slow SQL queries and deprecations (first page of each), plus the default service; other services are missing, and the Tideways UI service selector lists all. Sorted default first, then by issues; with \"search\", by matchingTraces."New value: +"Services named by the newest open or ignored errors, slow SQL queries and deprecations of all services (first page of each), plus the default service; other services are missing, and the Tideways UI service selector lists all. Sorted default first, then by issues; with \"search\", by matchingTraces." - changed
Output schema / properties / services / items / properties / example / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "date": { - "description": "UTC \"YYYY-MM-DD HH:mm\"", - "type": [ - "string", - "null" - ] - }, - "transaction": { - "type": [ - "string", - "null" - ] - }, - "url": { - "description": "Request URL without query string", - "type": [ - "string", - "null" - ] - } - }, - "required": [ - "transaction", - "url", - "date" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "date": { + "anyOf": [ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "UTC \"YYYY-MM-DD HH:mm\"" + }, + "transaction": { + "type": [ + "string", + "null" + ] + }, + "url": { + "description": "Request URL without query string", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "transaction", + "url", + "date" + ], + "type": "object" + }, + { + "type": "null" + } +] - changed
Output schema / properties / services / items / properties / issues / descriptionPrevious value: -"How many of the open issues this call read name this service"New value: +"How many of the issues this call read (open and ignored) name this service"
- Changed
tideways_search_traces5 fields changed- added
Input schema / properties / limitAdded value: +{ + "default": 30, + "description": "Traces to return, up to 100. Raise it to cover a busy window or to find rarer examples, such as traces with an nplus1 bottleneck.", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / transactionIdsAdded value: +{ + "description": "Only traces of these transactions: numeric IDs from transactions[].id of tideways_get_performance. Combines with search, environment, service, sortBy and the from/to window.", + "items": { + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "maxItems": 20, + "minItems": 1, + "type": "array" +} - changed
Output schema / properties / limitReached / descriptionPrevious value: -"True when 30 traces came back, the API maximum: narrow the time window or change sortBy to see others"New value: +"True when as many traces came back as \"limit\" asked for: raise \"limit\" (up to 100), narrow the time window or change sortBy to see others" - added
Output schema / properties / traces / items / properties / date / anyOfAdded value: +[ + { + "description": "\"YYYY-MM-DD HH:mm\"", + "pattern": "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}$", + "type": "string" + }, + { + "type": "null" + } +] - removed
Output schema / properties / traces / items / properties / date / typeRemoved value: -[ - "string", - "null" -]
8 tool updates
v2.0.0- First observed
tideways_get_history - First observed
tideways_get_observations - First observed
tideways_get_performance - First observed
tideways_get_performance_summary - First observed
tideways_list_issues - First observed
tideways_list_projects - First observed
tideways_list_services - First observed
tideways_search_traces
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes (list_issues vs get_issue, search_traces vs get_transaction). The performance family—get_performance, get_performance_summary, get_history, get_transaction—overlaps in domain but the descriptions carefully delineate granularity and use cases, leaving only mild ambiguity.
All tools follow a consistent tideways_<verb>_<noun> pattern (list_issues, get_performance, search_traces, get_observations). Prefix and verb/noun conventions are uniform throughout with no deviations.
Ten tools is well-scoped for an observability/monitoring server. Each tool maps to a distinct facet (issues, projects, services, performance, traces, history, observations) without redundancy.
The surface covers the core read workflows well: discovery (projects/services), performance windows, transactions, traces, issues and automatic findings. It is read-only by nature, so lifecycle coverage is reasonable, though some deeper drill-downs (e.g. arbitrary trace-by-bottleneck filtering) are noted as unavailable.
Maintenance
Related MCP Connectors
Connects AI assistants to TrackingTime for querying time entries, projects, tasks, customers, and team data using natural language.
Manage uptime monitors and incidents and search logs, metrics and traces from an AI assistant.
Ask your AI about your Airbnb and VRBO listings, bookings, guest messages and reviews. Read-only.
Ask your AI cost, runway, and guardrails from your real AtlasBurn data — read-only.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceEnables AI assistants to interact with Mender IoT platform for device management, deployment monitoring, and fleet analysis through natural language commands. Provides read-only access to device status, deployment logs, releases, and system monitoring capabilities.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language querying and analysis of OpenTelemetry traces, metrics, and logs stored in Elasticsearch/OpenSearch, allowing AI assistants to investigate performance issues, find root causes, and explore system behavior.7 npm14MIT
- AlicenseNot gradedqualityCmaintenanceConnects AI assistants to New Relic with read-only access to NRQL, logs, metrics, traces, alerts, and more. Offers optional, gated write operations with a dry-run and confirmation workflow.19 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceProvides Claude and other AI agents with read-only, guardrailed access to Pinpoint APM data, enabling production debugging through traces, metrics, transactions, and service topology.Apache 2.0