Skip to main content
Glama
olaj

unofficial-trackjs-mcp

by olaj

unofficial-trackjs-mcp

CI npm License: MIT

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?"

IMPORTANT

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

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

TRACKJS_API_KEY

yes

Data API key. Sent in the Authorization header. Treat it as a secret.

TRACKJS_CUSTOMER_ID

yes

Your Customer ID, used in the API URL (https://api.trackjs.com/{CUSTOMER_ID}/v1/...).

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-mcp

Put 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: npx

  • args: ["-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

list_errors

GET /errors

Individual error occurrences, newest first. Search with query (same as dashboard search: messages, URLs, metadata, user IDs). Optional stack traces with includeStack.

top_messages

GET /errors/messages

Error counts grouped by message, with affected users, triage status, and last seen.

errors_by_url

GET /errors/urls

Error counts grouped by page URL.

errors_by_day

GET /errors/daily

Error and affected-user counts per day.

errors_by_hour

GET /errors/hourly

Error and affected-user counts per hour.

page_views_by_day

GET /hits/daily

Page views (agent loads) per day. Useful for error rates.

page_views_by_hour

GET /hits/hourly

Page views per hour.

usage_by_hour

GET /usage/hourly

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-01 or 2026-10-01T14:00:00Z.

  • page / size: paging. size is 1–1000; TrackJS defaults to 20.

  • sortBy / sortDirection: on the grouped and per-period tools. The server sends them as the API's sort=field|direction string.

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 first maxStackLines lines (default 20), with a … N more lines note.

  • Every response has a paging block (page, size, returned, hasMore, nextPage, totalCount where available). Every item has a link to the matching TrackJS dashboard page.

  • Time-series tools include totals. usage_by_hour returns rows as arrays with a columns header.

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-After when TrackJS sends it.

  • Timeouts (30s), network failures, 5xx, and invalid input (bad dates, size out of range, startDate after endDate) 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.js

You can also inspect it with the MCP Inspector:

npx @modelcontextprotocol/inspector -e TRACKJS_API_KEY=... -e TRACKJS_CUSTOMER_ID=... node dist/index.js

Project 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 docs

License

MIT © Ola. Not affiliated with TrackJS.

Available Tools

8 tools
errors_by_dayErrors per dayA
Read-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).

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. Set to the number of days wanted, e.g. 30.
sortByNoSort field: date (default), count, or usercount.
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.
sortDirectionNoSort direction. Defaults to desc.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 hourA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. Set to the number of hours wanted, e.g. 48.
sortByNoSort field: date (default), count, or usercount.
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.
sortDirectionNoSort direction. Defaults to desc.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 URLA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. 20-50 is usually enough.
sortByNoSort field: count (occurrences, default) or usercount (affected users).
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.
sortDirectionNoSort direction. Defaults to desc.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 errorsA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. Keep it small (e.g. 5-20) when includeStack is true.
queryNoSearch text, same as TrackJS dashboard search, e.g. "Cannot read properties of undefined" or a user ID.
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.
includeStackNoInclude each error's stack trace. Off by default because traces are large.
maxStackLinesNoWhen includeStack is true, keep at most this many stack lines per error (default 20).

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 dayA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. Set to the number of days wanted, e.g. 30.
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 hourA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. Set to the number of hours wanted, e.g. 48.
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 messagesA
Read-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.

NameRequiredDescriptionDefault
pageNo1-based page number. Defaults to 1. Use paging.nextPage from a previous result to continue.
sizeNoItems per page, 1-1000. TrackJS defaults to 20. 20-50 is usually enough for a top-N overview.
sortByNoSort field: count (occurrences, default) or usercount (affected users).
endDateNoOnly 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.
startDateNoOnly 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.
applicationNoLimit results to one TrackJS application key (as configured in TrackJS). Omit for all applications.
sortDirectionNoSort direction. Defaults to desc.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 hourA
Read-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.

NameRequiredDescriptionDefault
endDateNoOnly 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.
startDateNoOnly 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.
granularityNohour (default) returns the API's hourly rows; day sums them per UTC day to save space.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 8 tool updatesv0.1.0
    • First observederrors_by_day
    • First observederrors_by_hour
    • First observederrors_by_url
    • First observedlist_errors
    • First observedpage_views_by_day
    • First observedpage_views_by_hour
    • First observedtop_messages
    • First observedusage_by_hour

TDQS

A4/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants read-only access to Sprinklr data via MCP, allowing querying reports, searching cases, and calling Sprinklr API endpoints.
    4 npm
    ISC
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables 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 npm
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    27
    37 npm
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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