unofficial-trackjs-mcp
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., "@unofficial-trackjs-mcpwhat are our top JS errors this week by affected users?"
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.
unofficial-trackjs-mcp
An MCP server that lets AI assistants (Claude Code, Claude Desktop, Cursor, and other MCP clients) query your JavaScript error data through the TrackJS Data API.
Ask things like:
"What are our top 10 JavaScript errors this week, by affected users?"
"Did errors spike after yesterday's deploy? Compare errors per page view by hour."
"Show me a few stack traces for
Cannot read properties of undefined (reading 'map').""Which pages are the most broken?"
This is an unofficial, community project. It is not made, endorsed, or supported by TrackJS. "TrackJS" is a trademark of its owner and is used here only to describe what the server connects to. For issues with this server, open an issue in this repository, not with TrackJS support.
It is read-only: it only calls the Data API's GET endpoints. It cannot change triage status, ignore rules, or any other settings.
Requirements
Node.js 18 or newer
A TrackJS API key and Customer ID. Both are only visible to the Account Owner, under Account Settings → Organization.
Related MCP server: Roster
Install
The server runs over stdio with npx, so there is nothing to install globally. It reads two environment variables:
Variable | Required | Description |
| yes | Data API key. Sent in the |
| yes | Your Customer ID, used in the API URL ( |
If either is missing, the server exits at startup with a message saying which one.
Claude Code
claude mcp add trackjs --transport stdio --env TRACKJS_API_KEY=your-api-key --env TRACKJS_CUSTOMER_ID=your-customer-id -- npx -y unofficial-trackjs-mcpPut the server name (trackjs) first and the --env options last, right before --. --env accepts several values in a row, so a name placed after it is read as another variable.
Add --scope user to make it available in every project, or --scope project to write it to a shared .mcp.json (don't commit real keys; .mcp.json supports ${TRACKJS_API_KEY} style environment expansion).
Check it with claude mcp list, or /mcp inside a session.
Claude Desktop
Edit claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"trackjs": {
"command": "npx",
"args": ["-y", "unofficial-trackjs-mcp"],
"env": {
"TRACKJS_API_KEY": "your-api-key",
"TRACKJS_CUSTOMER_ID": "your-customer-id"
}
}
}
}Restart Claude Desktop afterwards. On Windows, if the server fails to start, use "command": "cmd" and "args": ["/c", "npx", "-y", "unofficial-trackjs-mcp"].
Other MCP clients (Cursor, VS Code, Windsurf, …)
Any client that supports stdio servers works. The generic shape is:
command:
npxargs:
["-y", "unofficial-trackjs-mcp"]env:
TRACKJS_API_KEY,TRACKJS_CUSTOMER_ID
For example, Cursor's .cursor/mcp.json uses the same mcpServers block as Claude Desktop above. You can also install it globally (npm install -g unofficial-trackjs-mcp) and use unofficial-trackjs-mcp as the command.
Tools
Each tool maps to one documented Data API endpoint, and the parameter names match the API (query, size, page, startDate, endDate, application, includeStack, sort).
Tool | Endpoint | What it returns |
|
| Individual error occurrences, newest first. Search with |
|
| Error counts grouped by message, with affected users, triage status, and last seen. |
|
| Error counts grouped by page URL. |
|
| Error and affected-user counts per day. |
|
| Error and affected-user counts per hour. |
|
| Page views (agent loads) per day. Useful for error rates. |
|
| Page views per hour. |
|
| Account-wide hourly usage: page views and total/processed/ignored/dropped errors. Can roll up to days. |
Common parameters:
application: limit to one TrackJS application key.startDate/endDate: ISO 8601 dates or date-times (UTC), e.g.2026-10-01or2026-10-01T14:00:00Z.page/size: paging.sizeis 1–1000; TrackJS defaults to 20.sortBy/sortDirection: on the grouped and per-period tools. The server sends them as the API'ssort=field|directionstring.
The TrackJS Data API has no endpoints for browsers, applications, or single-error lookup, so this server doesn't offer tools for them. To narrow errors by browser or anything else searchable, use list_errors with query.
Output
Results are compact JSON meant to keep the agent's context small:
Empty fields are dropped. Long messages, URLs, and metadata values are truncated with a
… [+N chars]marker.Stack traces are off unless
includeStack: true. They are then cut to the firstmaxStackLineslines (default 20), with a… N more linesnote.Every response has a
pagingblock (page,size,returned,hasMore,nextPage,totalCountwhere available). Every item has alinkto the matching TrackJS dashboard page.Time-series tools include
totals.usage_by_hourreturns rows as arrays with acolumnsheader.
Example top_messages result:
{"paging":{"page":1,"size":3,"returned":1,"hasMore":true,"nextPage":2,"startDate":"2014-09-11T00:00:00Z"},"link":"https://my.trackjs.com/messages","messages":[{"message":"Cannot read property on of undefined","count":54,"userCount":12,"status":"Investigating","lastSeen":"2016-09-22T22:42:23.579+00:00","link":"https://my.trackjs.com/messages/filtered?message=Cannot+read+property+%27on%27+of+undefined&"}]}Errors
API failures come back as tool errors written for the agent:
401: the API key was rejected. Check
TRACKJS_API_KEY.403: the key and Customer ID don't match, or the account has no Data API access.
404: usually a wrong
TRACKJS_CUSTOMER_ID.429: rate limited. Includes
Retry-Afterwhen TrackJS sends it.Timeouts (30s), network failures, 5xx, and invalid input (bad dates,
sizeout of range,startDateafterendDate) are reported the same way.
The API key is only sent in the Authorization header. It never appears in URLs, logs, or error messages.
Development
git clone https://github.com/olaj/unofficial-trackjs-mcp.git
cd unofficial-trackjs-mcp
npm install
npm run check # typecheck + lint + tests
npm run build # compiles to dist/The dev toolchain (vitest) needs Node 22+. The built package runs on Node 18+.
Tests use fixtures in test/fixtures/ shaped from the examples in the Data API docs, plus an in-memory MCP client. They make no network calls.
To try a local build in Claude Code:
npm run build
claude mcp add trackjs-dev --env TRACKJS_API_KEY=... --env TRACKJS_CUSTOMER_ID=... -- node /absolute/path/to/dist/index.jsYou can also inspect it with the MCP Inspector:
npx @modelcontextprotocol/inspector -e TRACKJS_API_KEY=... -e TRACKJS_CUSTOMER_ID=... node dist/index.jsProject layout:
src/index.ts entry point: env config + stdio transport
src/server.ts McpServer setup
src/tools.ts tool definitions (zod input schemas)
src/client.ts Data API client (built-in fetch) and error messages
src/format.ts output compaction (truncation, stack trimming, paging)
src/types.ts response types from the docsLicense
MIT © Ola. Not affiliated with TrackJS.
Available Tools
8 toolserrors_by_dayErrors per dayARead-onlyIdempotent
Daily error totals with affected-user counts and TrackJS links (GET /errors/daily), newest day first by default. Use for trends, spotting spikes and comparing before/after a deploy. Set size to the number of days you need (max 1000).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. Set to the number of days wanted, e.g. 30. | |
| sortBy | No | Sort field: date (default), count, or usercount. | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. | |
| sortDirection | No | Sort direction. Defaults to desc. |
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 real behavioral context on top: default ordering (newest day first), the backing route GET /errors/daily, the 1000-day cap, and that results include user counts and links. It does not describe pagination behavior, though the schema's page field 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?
Three sentences, front-loaded with what the tool returns and its default ordering, then usage, then the one parameter worth calling out. No filler, though the size sentence duplicates schema text and slightly dilutes the otherwise tight structure.
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 seven-parameter, all-optional read tool with rich annotations and full schema coverage, the description supplies what the structured fields cannot: return payload contents, default sort order, and intended analytical use. No output schema exists, and the description adequately previews the shape of results (totals, user counts, links).
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, including the page/size/sort semantics. The description's note 'Set size to the number of days you need (max 1000)' largely restates the schema's own example, adding little new meaning. 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 resource and granularity — 'Daily error totals with affected-user counts and TrackJS links' — plus the underlying endpoint GET /errors/daily, which unambiguously separates it from siblings like list_errors or top_messages. The only gap is that the nearest sibling, errors_by_hour, is never named or contrasted, though 'Daily' implies the distinction.
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 use cases: 'Use for trends, spotting spikes and comparing before/after a deploy.' That is clear contextual guidance beyond the name. It stops short of exclusions or pointing to alternatives such as errors_by_hour for intra-day analysis, so it falls 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.
errors_by_hourErrors per hourARead-onlyIdempotent
Hourly error totals with affected-user counts and TrackJS links (GET /errors/hourly), newest hour first by default. Use to pinpoint when a spike started. Pass date-times (e.g. 2026-10-18T06:00:00Z) to narrow the window.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. Set to the number of hours wanted, e.g. 48. | |
| sortBy | No | Sort field: date (default), count, or usercount. | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. | |
| sortDirection | No | Sort direction. Defaults to desc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, so the description only needs to add what they don't cover. It does exactly that by disclosing the default ordering (newest hour first) and the returned fields (hourly totals, affected-user counts, links). Pagination behavior is left to 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?
One tightly written sentence plus a usage clause; the return contents and default ordering are front-loaded before the guidance, 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?
No output schema exists, so the description usefully enumerates what comes back, which is what an agent needs here. The remaining gaps (paging continuation, application scoping) are already fully handled by 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 100%, with every parameter documented including enums, defaults and paging.nextPage guidance, so the baseline is 3. The description only echoes the date-time format already given in the schema's startDate/endDate descriptions and adds no new parameter meaning.
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: hourly error totals with affected-user counts and TrackJS links, and names the underlying endpoint GET /errors/hourly. It is clearly distinguishable from errors_by_day, but that distinction comes mainly from the name rather than the prose.
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 pinpoint when a spike started" gives a concrete selection condition, and the date-time guidance tells the agent how to narrow the window. It does not name an explicit alternative (e.g. errors_by_day for trends) or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
errors_by_urlErrors by page URLARead-onlyIdempotent
Error counts grouped by the page URL where errors happened, with affected-user counts and a TrackJS link (GET /errors/urls). Sorted by count descending by default. Use to find which pages are most broken.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. 20-50 is usually enough. | |
| sortBy | No | Sort field: count (occurrences, default) or usercount (affected users). | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. | |
| sortDirection | No | Sort direction. Defaults to desc. |
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 context: the default sort is count descending, results carry affected-user counts and a TrackJS deep link, and the backing endpoint is disclosed. It omits default time-range behavior when startDate/endDate are absent, which is the main residual 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?
Three short sentences: what it returns, how it's sorted, and when to use it. The grouping dimension is front-loaded and nothing is repeated or 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?
With no output schema, the description usefully previews the return shape (error counts, affected users, TrackJS link) and default ordering, which is enough to call it confidently across 7 optional params. The one hole is what time window applies when no dates are supplied.
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 (page, size, sortBy, sortDirection, dates, application) is already documented. The description's 'sorted by count descending by default' merely restates the schema's default sortBy/sortDirection and adds no syntax or edge-case detail beyond 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+resource ('error counts grouped by the page URL') plus the aggregation dimension, which implicitly separates it from top_messages (grouped by message) and list_errors (individual events). It also names the underlying endpoint and the returned fields. It never explicitly names a sibling, so it stops short of 5.
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 which pages are most broken' gives a concrete selection context, which pairs naturally with top_messages for message-level triage. There are no explicit exclusions or named alternatives, so it lands at clear-context-but-no-exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_errorsList TrackJS errorsARead-onlyIdempotent
List individual JavaScript error occurrences captured by TrackJS, newest first (GET /errors). Use query to search like the TrackJS dashboard search (matches error messages, URLs, metadata and user IDs). Each error includes message, page URL, file:line:column, browser, user/session IDs, triage status, custom metadata and a link to its TrackJS details page. Set includeStack=true to get stack traces (trimmed to maxStackLines). For 'what is breaking most' questions, call top_messages first, then use this tool with query set to a message to see examples.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. Keep it small (e.g. 5-20) when includeStack is true. | |
| query | No | Search text, same as TrackJS dashboard search, e.g. "Cannot read properties of undefined" or a user ID. | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. | |
| includeStack | No | Include each error's stack trace. Off by default because traces are large. | |
| maxStackLines | No | When includeStack is true, keep at most this many stack lines per error (default 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and open-world behavior, so the bar is lower. The description still adds real context: result ordering, the fields each error carries, and the size cost of includeStack with maxStackLines trimming. It does not cover auth or rate limits, keeping it from 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 verb, resource and ordering, then parameter guidance, then the sibling-routing tip. It is dense but every sentence 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?
No output schema exists, but the description enumerates the returned fields (message, URL, file:line:column, browser, user/session IDs, triage status, metadata, details link). Combined with the schema's pagination guidance for eight optional parameters, 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 goes beyond by explaining what `query` actually matches (messages, URLs, metadata, user IDs) and warns to keep page size small when includeStack is on. Date range and application scoping are 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?
States a specific verb and resource ('List individual JavaScript error occurrences captured by TrackJS'), adds ordering ('newest first') and the underlying endpoint (GET /errors). It is clearly distinguished from the aggregating siblings like top_messages and errors_by_day.
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 routes the agent: for 'what is breaking most' questions, call top_messages first, then return here with `query` set to a message to see examples. That names both the alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_views_by_dayPage views per dayARead-onlyIdempotent
Daily page view counts (times the TrackJS agent loaded) newest first (GET /hits/daily). Combine with errors_by_day to compute an error rate and tell real regressions apart from traffic changes.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. Set to the number of days wanted, e.g. 30. | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. |
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 ordering (newest first) and pins the metric definition, which prevents misreading 'page view' as user sessions. It does not mention result-set shape or paging beyond what the schema's page/size docs imply.
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, zero filler: the first defines the resource and its ordering, the second gives the actionable use case. Front-loaded with the core meaning before the analytical hint.
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, but the description covers what the tool returns conceptually (daily counts, newest first) and how to use it with a sibling. The only gap is response envelope/pagination shape, which an agent must infer from the schema's paging hint.
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 five parameters are already documented with defaults, ranges, and formats. The description contributes no additional parameter guidance (e.g. how startDate/endDate interact with daily bucketing), 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?
Names a specific resource and granularity ('Daily page view counts'), defines the metric parenthetically ('times the TrackJS agent loaded'), and gives the backing endpoint (GET /hits/daily) plus sort order. An agent can distinguish it from page_views_by_hour on granularity and from errors_* on metric 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 states the analytical use case: combine with errors_by_day to compute an error rate and separate regressions from traffic changes. That is clear when-to-use guidance. It stops short of stating exclusions, e.g. 'use page_views_by_hour when hourly resolution is needed'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
page_views_by_hourPage views per hourARead-onlyIdempotent
Hourly page view counts (times the TrackJS agent loaded) newest first (GET /hits/hourly). Combine with errors_by_hour to see whether a spike in errors is just a spike in traffic.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. Set to the number of hours wanted, e.g. 48. | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds useful beyond-schema context: result ordering (newest first) and the fact that the metric counts agent loads rather than page renders, which affects interpretation.
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, zero filler. The definition and ordering come first and the cross-tool usage hint follows, so the most important identification information is front-loaded.
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 read-only list tool with a fully documented schema and no output schema, the description covers the metric definition, ordering, and a cross-referencing use case. Minor gap: it doesn't characterize the returned record fields, though the ordering note partly compensates.
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 every parameter carries a detailed description (including the paging.nextPage continuation hint), so the description's job here is minimal. It adds no parameter-level meaning beyond what the schema already provides, making the baseline 3 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 resource and granularity (hourly page view counts), defines the metric precisely ('times the TrackJS agent loaded'), and adds ordering plus the underlying endpoint GET /hits/hourly. The hourly granularity implicitly distinguishes it from page_views_by_day, but no sibling is named directly.
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 a concrete usage context: combine with errors_by_hour to distinguish an error spike from a traffic spike. That is genuine guidance on when this tool is the right one, though it stops short of exclusions or stating when to prefer page_views_by_day instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_messagesTop error messagesARead-onlyIdempotent
Error counts grouped by error message, with affected-user counts, triage status, first/last seen and a TrackJS link (GET /errors/messages). Sorted by count descending by default. Best starting point for 'what are our most common / most impactful errors?'. Sort by usercount to rank by number of affected users.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue. | |
| size | No | Items per page, 1-1000. TrackJS defaults to 20. 20-50 is usually enough for a top-N overview. | |
| sortBy | No | Sort field: count (occurrences, default) or usercount (affected users). | |
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| application | No | Limit results to one TrackJS application key (as configured in TrackJS). Omit for all applications. | |
| sortDirection | No | Sort direction. Defaults to desc. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world. Beyond that, the description discloses the return shape (counts, affected users, triage status, first/last seen, TrackJS link), the default sort order, and the endpoint. Missing pagination/result-set size behavior, though the schema hints at paging.
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 sentences, front-loaded with what the tool returns, then default ordering, then the primary use case. Slight redundancy in restating sortBy guidance that the schema already carries, but 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, and the description compensates by enumerating returned fields. With fully documented parameters and rich annotations, the only meaningful gap is pagination/result-volume behavior.
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 parameters are already fully documented, and the description adds only the default sort and the usercount alternative, which largely duplicates the sortBy schema description. 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 operation: error counts grouped by error message, with a named list of returned fields and the underlying endpoint (GET /errors/messages). This clearly distinguishes it from sibling tools like list_errors (raw error list) and errors_by_url/day/hour (different grouping dimensions).
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 the tool as "best starting point for 'what are our most common / most impactful errors?'" and gives a concrete alternative sorting strategy (sort by usercount). It doesn't name sibling tools or state when not to use it, so it falls 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.
usage_by_hourAccount usage per hourARead-onlyIdempotent
Account-wide usage per hour, oldest first (GET /usage/hourly): page views, total/processed/ignored/dropped errors and errors per page view. Not broken down by application. Useful for checking plan usage, ignore-rule effects and dropped (over-quota) errors. Set granularity=day to roll hours up into UTC days for long ranges. Always pass a startDate/endDate window; long hourly ranges produce many rows.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Only include data before this ISO 8601 date/date-time (UTC), e.g. 2026-10-08 or 2026-10-08T00:00:00Z. Precision is 1 second. | |
| startDate | No | Only include data after this ISO 8601 date/date-time (UTC), e.g. 2026-10-01 or 2026-10-01T14:00:00Z. Precision is 1 second. | |
| granularity | No | hour (default) returns the API's hourly rows; day sums them per UTC day to save space. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds useful behavioral context beyond that: oldest-first ordering, exact returned metrics, UTC-day aggregation when granularity=day, and a warning that long hourly ranges produce many rows.
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 description is dense and front-loaded: it starts with the core resource and returned metrics, then adds scope constraints, use cases, granularity advice, and the row-volume warning. Every sentence contributes useful selection or invocation guidance without repetition.
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 appropriately explains what the tool returns, including the metric set and ordering. It also covers the key invocation constraints around date windows, granularity, and long-range row volume, so an agent has enough context 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 schema already documents all three parameters, making the baseline 3. The description adds meaningful practical semantics by explaining that granularity=day rolls hourly rows into UTC days and that a date window should always be supplied.
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 specific resource and scope: account-wide hourly usage, with page views and several error metrics, and explicitly says it is not broken down by application. This distinguishes it from narrower siblings like errors_by_hour and page_views_by_hour, though it does not name those alternatives directly.
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 clear use cases such as checking plan usage, ignore-rule effects, and dropped over-quota errors, plus practical guidance to use granularity=day for long ranges and always pass a startDate/endDate window. It does not explicitly say when to choose this over the sibling hourly tools, so it stops short of full alternative routing.
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.
8 tool updates
v0.1.0- First observed
errors_by_day - First observed
errors_by_hour - First observed
errors_by_url - First observed
list_errors - First observed
page_views_by_day - First observed
page_views_by_hour - First observed
top_messages - First observed
usage_by_hour
TDQS
Scored across 8 tools
Each tool targets a distinct aggregation dimension (individual errors, by message, by URL, by day, by hour, page views, usage), and descriptions explicitly state when to prefer one over another (e.g. top_messages before list_errors). The main potential confusion is between the parallel day/hour variants and between page_views_by_hour and usage_by_hour, but the granularity/scope wording keeps them distinguishable.
Six of eight tools follow a clean resource_by_dimension pattern (errors_by_url, errors_by_day, page_views_by_hour, usage_by_hour). Two outliers use verb-first naming (list_errors, top_messages) which is readable and arguably intentional for 'list raw items' vs 'aggregate', but breaks strict uniformity.
Eight tools is well-scoped for an error-analytics server; each tool covers a distinct report shape (raw errors, groupings, time series, traffic, account usage) with no redundant entries.
The read-oriented analytics surface is solid (individual errors, groupings, daily/hourly trends, traffic for error-rate math), but triage status is only ever read, never updated, and there are no breakdowns by browser, release, or application despite such data being present in error records. Agents can answer 'what is breaking' questions but cannot manage or slice errors beyond URL/time.
Maintenance
Related MCP Connectors
Read-only MCP access to sessions, funnels, campaigns, errors, live visitors, and anomalies.
Query real user session replay data: tapes, transcripts, error/rage-click filters, alerts.
- LogBrewOAuthco.logbrew
Read issues, logs, traces, metrics, releases, and analytics from approved LogBrew projects.
Read-only access to your Nexly web analytics: traffic, pages, acquisition, events, and reports.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants read-only access to Sprinklr data via MCP, allowing querying reports, searching cases, and calling Sprinklr API endpoints.4 npmISC
- AlicenseNot gradedqualityBmaintenanceEnables querying your team's work (stats, overdue, workload, active members, etc.) via natural language, scoped to your department with read-only signed-token access.25 npmMIT
- AlicenseAqualityAmaintenanceEnables MCP clients to query Google Analytics 4 reporting and configuration data through 27 read-only tools, including pivots, funnels, realtime reports, Admin API inspection, and diagnostics, with identifiers redacted by default.2737 npmApache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to perform automated root-cause analysis of slow Apache Spark and Databricks jobs by listing applications, planning and running diagnoses, retrieving stage and SQL plan details, and listing diagnosis rules via read-only MCP tools.Apache 2.0