@framedash/mcp-server 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @framedash/mcp-server
2
2
 
3
- MCP (Model Context Protocol) server for the Framedash game telemetry platform. Provides 12 read-only tools and 4 resources for querying analytics data from LLM-powered tools.
3
+ MCP (Model Context Protocol) server for the Framedash game telemetry platform. This server provides 14 read-only tools over stdio and 4 resources for querying analytics data from LLM-powered tools. Version 0.2.0 provides 12 tools and does not include the build comparison tools or structured heatmap context.
4
4
 
5
5
  ## Setup
6
6
 
@@ -69,6 +69,24 @@ require an explicit `project_id` argument per call.
69
69
  | `list_content` | List content registry entries |
70
70
  | `list_alerts` | List alert rules |
71
71
  | `get_alert_history` | Alert trigger history |
72
+ | `list_builds` | List builds or find an exact build ID |
73
+ | `compare_builds` | Compare two builds without applying a CI threshold |
74
+
75
+ ### Build comparison and heatmap context
76
+
77
+ When the hosted OAuth endpoint runs this server revision, it exposes 13 tools: `query` is omitted because OAuth cannot grant `data:admin`. Hosted availability depends on the deployed server revision.
78
+
79
+ | Tool | Scope | Input / output |
80
+ |------|-------|----------------|
81
+ | `list_builds` | `analytics:read` | Optional `project_id`, `days` (7/14/30/90; default 30), exact `build_id`, `fresh` (default false). Returns the existing builds payload; an exact build avoids the newest-50 list cap. |
82
+ | `compare_builds` | `analytics:read` | Required distinct `baseline`/`candidate` build IDs; optional `project_id`, `days` (7/14/30/90; default 30), `map_id`, `platform`, `fresh` (default false). Returns the existing P50/P95 comparison payload and sample/session counts; does not apply a CI threshold. |
83
+ | `get_heatmap` context | `analytics:read` | Legacy text remains unchanged. `structuredContent.cells` contains the same complete cells as the legacy JSON prefix; `total`, `returned`, and `truncated` describe response truncation. `context` records filters, world-coordinate units, metric units, and unknown axis/null causes; use `list_maps.upAxis` to determine X/Z versus X/Y. |
84
+
85
+ Heatmap response truncation is a presentation limit, not ingestion readiness or missing telemetry. Legacy text retains its existing 51,200 UTF-16-unit limit and, on overflow, at most 50 complete cells. Structured cells are recovered from that bounded JSON prefix without serializing the full source array again. If one cell exceeds the text limit and only a partial cell is displayed, structured cells are empty and `returned: 0, truncated: true` makes that omission explicit. `total` is the source cell count.
86
+
87
+ Metadata filter strings (`project_id`, `map_id`, `event_name`) are limited to 256 UTF-16 units. Names in `context.truncated_fields` identify prefix values; the actual API request uses the full filter. Metadata truncation is separate from cell truncation. Including both text and structured representations, the JSON-encoded tool result stays within `6 * 51,200 + 8,192 = 315,392` bytes: each bounded representation needs at most three UTF-8 bytes per UTF-16 unit, and 8 KiB covers the fixed context, capped filter values and result fields. JSON-RPC envelope IDs are client-controlled and outside this tool-result budget.
88
+
89
+ `compare_builds.isRegression` reports direction, not a threshold breach or statistical certainty. Sample/session counts do not verify expected samples or completed ingestion. Map/platform filters change the population; `load_time_ms` is unavailable with a map filter. Null metric causes remain unknown. The existing CLI `framedash perf-diff --threshold <pct> --fail-on-regression` provides an opt-in CI gate without requiring raw SQL access.
72
90
 
73
91
  ## Resources
74
92
 
@@ -79,6 +97,12 @@ require an explicit `project_id` argument per call.
79
97
  | `framedash://projects/{projectId}/content` | Content registry |
80
98
  | `framedash://projects/{projectId}/status` | Project health status |
81
99
 
100
+ ## Hosted HTTP compatibility
101
+
102
+ The stateless hosted HTTP endpoint `/api/mcp` rejects request batches containing more than 100 messages with HTTP 400 and JSON-RPC error code -32600. This limit applies per POST request and is separate from the existing 1 MiB request-body limit. The independent stdio transport remains unaffected.
103
+
104
+ To accommodate this bound, update clients to split message batches into groups of at most 100 messages, or transmit messages as individual POST requests.
105
+
82
106
  ## Development
83
107
 
84
108
  Run from the repository root:
@@ -89,7 +113,7 @@ pnpm --filter @framedash/mcp-server... build
89
113
  pnpm --filter @framedash/mcp-server test
90
114
  ```
91
115
 
92
- With pnpm 9, the trailing `...` selects the MCP package plus its workspace
116
+ The trailing `...` selects the MCP package plus its workspace
93
117
  dependencies, including `@framedash/api-client`, before compiling from a clean
94
118
  checkout.
95
119
 
package/dist/helpers.d.ts CHANGED
@@ -7,6 +7,18 @@ export declare function textResult(data: unknown): {
7
7
  text: string;
8
8
  }[];
9
9
  };
10
+ export declare function structuredArrayResult(data: unknown): {
11
+ structuredContent: {
12
+ cells: unknown[];
13
+ total: number | null;
14
+ returned: number;
15
+ truncated: boolean;
16
+ };
17
+ content: {
18
+ type: "text";
19
+ text: string;
20
+ }[];
21
+ };
10
22
  export declare function getErrorMessage(err: unknown): string;
11
23
  export declare function errorResult(err: unknown): {
12
24
  content: {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA4KvD,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAM9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO;;;;;EAEvC;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO;;;;;;EAKvC;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAMpF"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA4KvD,+DAA+D;AAC/D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAM9C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO;;;;;EAEvC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO;;;;;;;;;;;EAqBlD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO;;;;;;EAKvC;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAMpF"}
package/dist/helpers.js CHANGED
@@ -155,6 +155,28 @@ export function truncate(data) {
155
155
  export function textResult(data) {
156
156
  return { content: [{ type: "text", text: truncate(data) }] };
157
157
  }
158
+ export function structuredArrayResult(data) {
159
+ const result = textResult(data);
160
+ const text = result.content[0]?.text ?? "null";
161
+ const footerStart = text.lastIndexOf(TRUNCATED_FOOTER_PREFIX);
162
+ const rowsTruncated = footerStart >= 0 && text.endsWith(TRUNCATED_FOOTER_SUFFIX);
163
+ const partial = text.endsWith(SIMPLE_TRUNCATED_FOOTER);
164
+ // Recover only the bounded legacy JSON, so structured output cannot revive omitted rows.
165
+ const decoded = JSON.parse(partial ? "null" : rowsTruncated ? text.slice(0, footerStart) : text);
166
+ const cells = Array.isArray(decoded) ? decoded : [];
167
+ const truncated = rowsTruncated || partial;
168
+ const total = truncated
169
+ ? Array.isArray(data)
170
+ ? data.length
171
+ : null
172
+ : Array.isArray(decoded)
173
+ ? cells.length
174
+ : null;
175
+ return {
176
+ ...result,
177
+ structuredContent: { cells, total, returned: cells.length, truncated },
178
+ };
179
+ }
158
180
  export function getErrorMessage(err) {
159
181
  return err instanceof Error ? err.message : String(err);
160
182
  }
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,7 +7,7 @@ import { StrictStdioServerTransport } from "./transport.js";
7
7
  // the advertised server version cannot drift from the published package.
8
8
  const VERSION = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"))
9
9
  .version;
10
- const apiKey = process.env.FRAMEDASH_API_KEY;
10
+ const apiKey = process.env.FRAMEDASH_API_KEY?.trim();
11
11
  if (!apiKey) {
12
12
  process.stderr.write("Error: FRAMEDASH_API_KEY environment variable is required. Create an API key on your project's API Keys page at https://app.framedash.dev and set FRAMEDASH_API_KEY. Docs: https://docs.framedash.dev\n");
13
13
  process.exit(1);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,+EAA+E;AAC/E,yEAAyE;AACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC3F,OAAiB,CAAC;AAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,yMAAyM,CACzM,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;AACzD,IAAI,CAAC,SAAS,EAAE,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,sGAAsG,CACtG,CAAC;AACH,CAAC;AACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B,CAAC;AAE9E,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,MAAM;QACN,SAAS;QACT,cAAc,EAAE,OAAO;QACvB,OAAO,CAAC,GAAG;YACV,MAAM,GAAG,CAAC;QACX,CAAC;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,0BAA0B,EAAE,CAAC;IACnD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAE5D,+EAA+E;AAC/E,yEAAyE;AACzE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;KAC3F,OAAiB,CAAC;AAEpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;AACrD,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,yMAAyM,CACzM,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;AACzD,IAAI,CAAC,SAAS,EAAE,CAAC;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,sGAAsG,CACtG,CAAC;AACH,CAAC;AACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B,CAAC;AAE9E,IAAI,CAAC;IACJ,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,OAAO;QACP,MAAM;QACN,SAAS;QACT,cAAc,EAAE,OAAO;QACvB,OAAO,CAAC,GAAG;YACV,MAAM,GAAG,CAAC;QACX,CAAC;KACD,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,0BAA0B,EAAE,CAAC;IACnD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,GAAG,IAAI,CAAC,CAAC;IAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC"}
package/dist/server.d.ts CHANGED
@@ -6,5 +6,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  * JSON at build time) so it cannot drift from the published package. Keeping the fs read OUT of
7
7
  * this module makes it bundler-safe for the Next.js remote endpoint.
8
8
  */
9
- export declare function createServer(apiClient: ApiClient, version: string): McpServer;
9
+ export declare function createServer(apiClient: ApiClient, version: string, options?: {
10
+ queryEnabled?: boolean;
11
+ }): McpServer;
10
12
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAa7E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE;;;;;GAKG;AACH,wBAAgB,YAAY,CAC3B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,SAAS,CAWX"}
package/dist/server.js CHANGED
@@ -2,6 +2,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { registerResources } from "./resources.js";
3
3
  import { registerAlertTools } from "./tools/alerts.js";
4
4
  import { registerAnalyticsTools } from "./tools/analytics.js";
5
+ import { registerBuildTools } from "./tools/builds.js";
5
6
  import { registerProjectTools } from "./tools/project.js";
6
7
  import { registerQueryTools } from "./tools/query.js";
7
8
  /**
@@ -10,13 +11,12 @@ import { registerQueryTools } from "./tools/query.js";
10
11
  * JSON at build time) so it cannot drift from the published package. Keeping the fs read OUT of
11
12
  * this module makes it bundler-safe for the Next.js remote endpoint.
12
13
  */
13
- export function createServer(apiClient, version) {
14
- const server = new McpServer({
15
- name: "framedash",
16
- version,
17
- });
18
- registerQueryTools(server, apiClient);
14
+ export function createServer(apiClient, version, options = {}) {
15
+ const server = new McpServer({ name: "framedash", version }, { maxToolInputElements: 16 });
16
+ if (options.queryEnabled !== false)
17
+ registerQueryTools(server, apiClient);
19
18
  registerAnalyticsTools(server, apiClient);
19
+ registerBuildTools(server, apiClient);
20
20
  registerProjectTools(server, apiClient);
21
21
  registerAlertTools(server, apiClient);
22
22
  registerResources(server, apiClient);
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,SAAoB,EAAE,OAAe;IACjE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC5B,IAAI,EAAE,WAAW;QACjB,OAAO;KACP,CAAC,CAAC;IAEH,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC3B,SAAoB,EACpB,OAAe,EACf,UAAsC,EAAE;IAExC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC;IAE3F,IAAI,OAAO,CAAC,YAAY,KAAK,KAAK;QAAE,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1E,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC1C,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,oBAAoB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACxC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAErC,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -3,7 +3,7 @@ import { errorResult, projectClient, textResult } from "../helpers.js";
3
3
  export function registerAlertTools(server, apiClient) {
4
4
  server.registerTool("list_alerts", {
5
5
  title: "List Alerts",
6
- description: "List all alert rules in the project.",
6
+ description: "List all alert rules in the project. Requires analytics:read.",
7
7
  inputSchema: {
8
8
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
9
9
  },
@@ -19,7 +19,7 @@ export function registerAlertTools(server, apiClient) {
19
19
  });
20
20
  server.registerTool("get_alert_history", {
21
21
  title: "Get Alert History",
22
- description: "Get alert event history (trigger/resolve events).",
22
+ description: "Get alert event history (trigger/resolve events). Requires analytics:read.",
23
23
  inputSchema: {
24
24
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
25
25
  limit: z
@@ -1 +1 @@
1
- {"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/tools/alerts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,YAAY,CAClB,aAAa,EACb;QACC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,sCAAsC;QACnD,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpF;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,mDAAmD;QAChE,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpF,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;SAC/C;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"alerts.js","sourceRoot":"","sources":["../../src/tools/alerts.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,YAAY,CAClB,aAAa,EACb;QACC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,+DAA+D;QAC5E,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpF;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,mBAAmB,EACnB;QACC,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpF,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,GAAG,CAAC;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mCAAmC,CAAC;SAC/C;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,KAAK;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAMd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA8IpF"}
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,SAAS,EAMd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkBzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA0LpF"}
@@ -1,6 +1,7 @@
1
1
  import { buildDashboardPath, buildFunnelPath, buildHeatmapPath, buildInsightsPath, buildRetentionPath, } from "@framedash/api-client";
2
2
  import { z } from "zod";
3
- import { errorResult, projectClient, textResult } from "../helpers.js";
3
+ import { errorResult, projectClient, structuredArrayResult, textResult } from "../helpers.js";
4
+ import { ANALYTICS_DAYS, allowedIntEnum } from "./schemas.js";
4
5
  // The REST API rejects values outside these sets with HTTP 400. They mirror the
5
6
  // web app's constants (ALLOWED_DAYS / ALLOWED_LIMITS in lib/analytics/constants,
6
7
  // ALLOWED_WINDOW_SECONDS in the funnels route, VALID_DAYS / VALID_CELL_SIZES in
@@ -8,25 +9,15 @@ import { errorResult, projectClient, textResult } from "../helpers.js";
8
9
  // them, so keep these in sync if the API changes. Constraining the input schema
9
10
  // lets the MCP client reject invalid values up front instead of after a server
10
11
  // round-trip.
11
- const ANALYTICS_DAYS = [7, 14, 30, 90];
12
12
  const INSIGHTS_LIMITS = [10, 20, 50];
13
13
  const FUNNEL_WINDOWS = [3600, 21600, 86400, 604800];
14
14
  const HEATMAP_DAYS = [1, 7, 14, 30];
15
15
  const HEATMAP_CELL_SIZES = [5, 10, 25, 50];
16
- /**
17
- * Built from z.union(z.literal(...)) rather than z.number().refine(...) so the allowed values
18
- * serialize into the JSON Schema the MCP SDK publishes -- `refine` runs opaque JS and is
19
- * dropped by the schema converter, which would leave the LLM unable to see the constraint and
20
- * reject out-of-set values before a server round-trip.
21
- */
22
- function allowedIntEnum(values, description) {
23
- const literals = values.map((v) => z.literal(v));
24
- return z.union(literals).optional().describe(description);
25
- }
16
+ const CONTEXT_FIELD_LIMIT = 256;
26
17
  export function registerAnalyticsTools(server, apiClient) {
27
18
  server.registerTool("get_dashboard", {
28
19
  title: "Get Dashboard",
29
- description: "Get project dashboard metrics (KPIs, daily active users, top events).",
20
+ description: "Get project dashboard metrics (KPIs, daily active users, top events). Requires analytics:read.",
30
21
  inputSchema: {
31
22
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
32
23
  days: allowedIntEnum(ANALYTICS_DAYS, "Time period: 7, 14, 30, or 90 days (default 30)"),
@@ -43,7 +34,7 @@ export function registerAnalyticsTools(server, apiClient) {
43
34
  });
44
35
  server.registerTool("get_retention", {
45
36
  title: "Get Retention",
46
- description: "Get player retention cohort analysis.",
37
+ description: "Get player retention cohort analysis. Requires analytics:read.",
47
38
  inputSchema: {
48
39
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
49
40
  days: allowedIntEnum(ANALYTICS_DAYS, "Time period: 7, 14, 30, or 90 days (default 30)"),
@@ -60,7 +51,7 @@ export function registerAnalyticsTools(server, apiClient) {
60
51
  });
61
52
  server.registerTool("get_funnel", {
62
53
  title: "Get Funnel",
63
- description: "Analyze event funnels. Requires 2-8 event names as steps.",
54
+ description: "Analyze event funnels. Requires analytics:read and 2-8 event names as steps.",
64
55
  inputSchema: {
65
56
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
66
57
  steps: z.string().describe("Comma-separated event names (2-8 steps)"),
@@ -79,7 +70,7 @@ export function registerAnalyticsTools(server, apiClient) {
79
70
  });
80
71
  server.registerTool("get_insights", {
81
72
  title: "Get Insights",
82
- description: "Get aggregated insights for a metric grouped by a dimension.",
73
+ description: "Get aggregated insights for a metric grouped by a dimension. Requires analytics:read. Results are the top groups, not an exact-build event breakdown; use list_builds/compare_builds for readonly build comparisons.",
83
74
  inputSchema: {
84
75
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
85
76
  metric: z.string().describe("Metric to aggregate: count or unique_players"),
@@ -106,14 +97,14 @@ export function registerAnalyticsTools(server, apiClient) {
106
97
  });
107
98
  server.registerTool("get_heatmap", {
108
99
  title: "Get Heatmap",
109
- description: "Get heatmap grid data for a map. Returns performance metrics per cell.",
100
+ description: "Get heatmap grid data for a map (analytics:read). Legacy text is unchanged; structuredContent.cells contains the same complete cell subset, with total/returned/truncated describing response truncation, not ingestion readiness. Context filter strings are prefixes when listed in context.truncated_fields. Coordinates and cell_size use engine world units, not image pixels. Consult list_maps for upAxis/bounds: Y-up maps (Unity, Godot) use x/z and omit y; otherwise x/y. Null metric causes are unknown.",
110
101
  inputSchema: {
111
102
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
112
103
  map_id: z
113
104
  .string()
114
105
  .describe("Map ID to query (accepts the row UUID or slug from list_maps)"),
115
106
  cell_size: allowedIntEnum(HEATMAP_CELL_SIZES, "Cell size: 5, 10, 25, or 50 (default 25)"),
116
- days: allowedIntEnum(HEATMAP_DAYS, "Time period: 1, 7, 14, or 30 days (default 7)"),
107
+ days: allowedIntEnum(HEATMAP_DAYS, "Time period: 1, 7, 14, or 30 days (default 30)"),
117
108
  event_name: z.string().optional().describe("Filter by event name"),
118
109
  },
119
110
  }, async (args) => {
@@ -124,8 +115,47 @@ export function registerAnalyticsTools(server, apiClient) {
124
115
  cellSize: args.cell_size,
125
116
  days: args.days,
126
117
  eventName: args.event_name,
118
+ coordinates: "world",
127
119
  })));
128
- return textResult(data);
120
+ const result = structuredArrayResult(data);
121
+ const filters = {
122
+ project_id: client.currentProjectId,
123
+ map_id: args.map_id,
124
+ event_name: args.event_name || null,
125
+ };
126
+ const truncatedFields = Object.entries(filters)
127
+ .filter(([, value]) => value !== null && value.length > CONTEXT_FIELD_LIMIT)
128
+ .map(([field]) => field);
129
+ return {
130
+ ...result,
131
+ structuredContent: {
132
+ ...result.structuredContent,
133
+ context: {
134
+ ...Object.fromEntries(Object.entries(filters).map(([field, value]) => [
135
+ field,
136
+ value?.slice(0, CONTEXT_FIELD_LIMIT) ?? null,
137
+ ])),
138
+ truncated_fields: truncatedFields,
139
+ days: args.days ?? 30,
140
+ cell_size: args.cell_size ?? 25,
141
+ coordinates: "world",
142
+ up_axis: null,
143
+ axis_source: "list_maps.upAxis",
144
+ units: {
145
+ coordinates: "engine world units",
146
+ cell_size: "engine world units",
147
+ weight: "events",
148
+ event_count: "events",
149
+ avg_fps: "frames/s",
150
+ avg_frame_time: "ms",
151
+ avg_gpu_time: "ms",
152
+ avg_memory: "MiB",
153
+ avg_mem_vram: "MiB",
154
+ },
155
+ null_reason: "unknown",
156
+ },
157
+ },
158
+ };
129
159
  }
130
160
  catch (err) {
131
161
  return errorResult(err);
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ApiClient } from "@framedash/api-client";
2
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ export declare function registerBuildTools(server: McpServer, apiClient: ApiClient): void;
4
+ //# sourceMappingURL=builds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builds.d.ts","sourceRoot":"","sources":["../../src/tools/builds.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAA0C,MAAM,uBAAuB,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA4EhF"}
@@ -0,0 +1,74 @@
1
+ import { buildBuildComparePath, buildBuildsPath } from "@framedash/api-client";
2
+ import { z } from "zod";
3
+ import { errorResult, projectClient, textResult } from "../helpers.js";
4
+ import { ANALYTICS_DAYS, allowedIntEnum } from "./schemas.js";
5
+ const days = allowedIntEnum(ANALYTICS_DAYS, "Time period: 7, 14, 30, or 90 days (default 30)");
6
+ // Zod's max counts code points; the REST filter limit counts UTF-16 units.
7
+ const filter = z
8
+ .string()
9
+ .trim()
10
+ .min(1)
11
+ .max(256)
12
+ .refine((value) => value.length <= 256 && [...value].every((char) => char.charCodeAt(0) >= 32), "Use 1-256 characters without control characters");
13
+ const projectId = z.string().uuid().optional().describe("Override the default project ID");
14
+ const fresh = z
15
+ .boolean()
16
+ .optional()
17
+ .describe("Bypass the aggregation cache (default false); useful when checking newly ingested samples");
18
+ export function registerBuildTools(server, apiClient) {
19
+ server.registerTool("list_builds", {
20
+ title: "List Builds",
21
+ description: "List builds and event/session/player counts. Requires analytics:read. By default returns the newest 50 builds; use build_id for an exact older build. Event counts are not per-metric sample counts or proof that ingestion is complete.",
22
+ annotations: { readOnlyHint: true },
23
+ inputSchema: {
24
+ project_id: projectId,
25
+ days,
26
+ build_id: filter
27
+ .optional()
28
+ .describe("Exact SDK-reported build_id; avoids the newest-50 list cap"),
29
+ fresh,
30
+ },
31
+ }, async (args) => {
32
+ try {
33
+ const client = projectClient(apiClient, args.project_id);
34
+ return textResult(await client.get(client.projectPath(buildBuildsPath({ days: args.days, buildId: args.build_id, fresh: args.fresh }))));
35
+ }
36
+ catch (err) {
37
+ return errorResult(err);
38
+ }
39
+ });
40
+ server.registerTool("compare_builds", {
41
+ title: "Compare Builds",
42
+ description: "Compare two builds using the readonly builds/compare API (analytics:read; no SQL/admin access required). Returns P50/P95, sample/session counts and diffs. isRegression reports direction only, not a threshold breach or statistical certainty. Null metrics have an unknown cause; do not infer unsupported SDKs. Verify expected samples and ingestion readiness separately. Unfiltered comparisons include the whole build; map/platform filters change the population. A map filter excludes map_load events, so load_time_ms is unavailable under that filter. For an opt-in CI gate use framedash perf-diff --threshold <pct> --fail-on-regression.",
43
+ annotations: { readOnlyHint: true },
44
+ inputSchema: {
45
+ project_id: projectId,
46
+ baseline: filter.describe("Known-good SDK-reported build_id"),
47
+ candidate: filter.describe("Different SDK-reported build_id to compare"),
48
+ days,
49
+ map_id: filter
50
+ .optional()
51
+ .describe("Restrict to one spatial map_id; excludes map_load samples"),
52
+ platform: filter.optional().describe("Restrict to one platform"),
53
+ fresh,
54
+ },
55
+ }, async (args) => {
56
+ try {
57
+ if (args.baseline === args.candidate)
58
+ throw new Error("baseline and candidate must be different build IDs");
59
+ const client = projectClient(apiClient, args.project_id);
60
+ return textResult(await client.get(client.projectPath(buildBuildComparePath({
61
+ baseline: args.baseline,
62
+ candidate: args.candidate,
63
+ days: args.days,
64
+ mapId: args.map_id,
65
+ platform: args.platform,
66
+ fresh: args.fresh,
67
+ }))));
68
+ }
69
+ catch (err) {
70
+ return errorResult(err);
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=builds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builds.js","sourceRoot":"","sources":["../../src/tools/builds.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CA6ElF"}
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAgFlF"}
@@ -4,7 +4,7 @@ import { errorResult, projectClient, textResult } from "../helpers.js";
4
4
  export function registerProjectTools(server, apiClient) {
5
5
  server.registerTool("list_projects", {
6
6
  title: "List Projects",
7
- description: "Show the project bound to the current API key.",
7
+ description: "List projects accessible to the current credential. Requires analytics:read.",
8
8
  }, async () => {
9
9
  try {
10
10
  const data = await apiClient.get("/api/v1/projects");
@@ -16,7 +16,7 @@ export function registerProjectTools(server, apiClient) {
16
16
  });
17
17
  server.registerTool("get_project_status", {
18
18
  title: "Get Project Status",
19
- description: "Get the status of a project (event counts, last event time, etc.).",
19
+ description: "Get the status of a project (event counts, last event time, etc.). Requires analytics:read.",
20
20
  inputSchema: {
21
21
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
22
22
  },
@@ -32,7 +32,7 @@ export function registerProjectTools(server, apiClient) {
32
32
  });
33
33
  server.registerTool("list_maps", {
34
34
  title: "List Maps",
35
- description: "List all maps in the project.",
35
+ description: "List all maps in the project, including upAxis and bounds for interpreting heatmap coordinates. Requires analytics:read.",
36
36
  inputSchema: {
37
37
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
38
38
  },
@@ -48,7 +48,7 @@ export function registerProjectTools(server, apiClient) {
48
48
  });
49
49
  server.registerTool("list_content", {
50
50
  title: "List Content",
51
- description: "List content registry entries (event names, display labels, etc.).",
51
+ description: "List content registry entries (event names, display labels, etc.). Requires analytics:read.",
52
52
  inputSchema: {
53
53
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
54
54
  type: z.string().optional().describe("Filter by content type"),
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,SAAoB;IAC3E,MAAM,CAAC,YAAY,CAClB,eAAe,EACf;QACC,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,gDAAgD;KAC7D,EACD,KAAK,IAAI,EAAE;QACV,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACrD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,oBAAoB,EACpB;QACC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpF;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAC9C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,WAAW,EACX;QACC,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,+BAA+B;QAC5C,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SACpF;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC5C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,CAAC,YAAY,CAClB,cAAc,EACd;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SAC9D;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/tools/project.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAiChF"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,CAkChF"}
@@ -3,7 +3,8 @@ import { errorResult, projectClient, textResult } from "../helpers.js";
3
3
  export function registerQueryTools(server, apiClient) {
4
4
  server.registerTool("query", {
5
5
  title: "Query Events",
6
- description: "Execute a read-only SQL query against the ClickHouse events table. Returns up to `limit` rows (default 100, max 1000).",
6
+ description: "Execute SELECT-only SQL against the ClickHouse events table. Requires an API key with data:admin; analytics:read alone and OAuth tokens cannot use this tool. For readonly access use list_builds, compare_builds, or get_insights instead; do not request elevated credentials for those tasks. Returns up to limit rows (default 100, max 1000).",
7
+ annotations: { readOnlyHint: true },
7
8
  inputSchema: {
8
9
  sql: z.string().describe("SQL query to execute"),
9
10
  project_id: z.string().uuid().optional().describe("Override the default project ID"),
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,YAAY,CAClB,OAAO,EACP;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,wHAAwH;QACzH,WAAW,EAAE;YACZ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpF,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;SAC9C;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;gBAC/C,UAAU,EAAE,MAAM,CAAC,gBAAgB;gBACnC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;aACxB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/tools/query.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,SAAoB;IACzE,MAAM,CAAC,YAAY,CAClB,OAAO,EACP;QACC,KAAK,EAAE,cAAc;QACrB,WAAW,EACV,oVAAoV;QACrV,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;QACnC,WAAW,EAAE;YACZ,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAChD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACpF,KAAK,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;SAC9C;KACD,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;gBAC/C,UAAU,EAAE,MAAM,CAAC,gBAAgB;gBACnC,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;aACxB,CAAC,CAAC;YACH,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC,CACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { z } from "zod";
2
+ export declare const ANALYTICS_DAYS: readonly [7, 14, 30, 90];
3
+ export declare function allowedIntEnum<T extends number>(values: readonly [T, T, ...T[]], description: string): z.ZodOptional<z.ZodUnion<[z.ZodLiteral<T>, z.ZodLiteral<T>, ...z.ZodLiteral<T>[]]>>;
4
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc,0BAA2B,CAAC;AAEvD,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,EAC9C,MAAM,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAC/B,WAAW,EAAE,MAAM,uFAQnB"}
@@ -0,0 +1,7 @@
1
+ import { z } from "zod";
2
+ export const ANALYTICS_DAYS = [7, 14, 30, 90];
3
+ export function allowedIntEnum(values, description) {
4
+ const literals = values.map((value) => z.literal(value));
5
+ return z.union(literals).optional().describe(description);
6
+ }
7
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/tools/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAU,CAAC;AAEvD,MAAM,UAAU,cAAc,CAC7B,MAA+B,EAC/B,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAItD,CAAC;IACF,OAAO,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAC3D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framedash/mcp-server",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "description": "MCP server for Framedash game telemetry: query game analytics, heatmaps, perf regressions, retention, and alerts from Claude and other AI agents",
5
5
  "mcpName": "io.github.crane-valley/framedash-mcp-server",
6
6
  "keywords": [
@@ -50,12 +50,12 @@
50
50
  "clean": "rm -rf dist"
51
51
  },
52
52
  "dependencies": {
53
- "@framedash/api-client": "0.1.6",
54
- "@modelcontextprotocol/sdk": "^1.29.0",
55
- "zod": "^4.3.6"
53
+ "@framedash/api-client": "0.2.1",
54
+ "@modelcontextprotocol/sdk": "^1.32.0",
55
+ "zod": "^4.6.6"
56
56
  },
57
57
  "engines": {
58
- "node": ">=20.0.0"
58
+ "node": ">=22.0.0"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@types/node": "^22.0.0",