From e10f2113326f91341adef9e93878adfe5e732999 Mon Sep 17 00:00:00 2001 From: jarhun88 Date: Tue, 21 Jul 2026 18:38:56 -0400 Subject: [PATCH 1/2] @W-23146707: Loosen record-event event_type validation Drop the .max(64) and SCREAMING_SNAKE_CASE regex on event_type so it accepts any string; keep the message 1024-char truncation. Removes the now-obsolete rejection test. --- src/tools/web/recordEvent/recordEvent.test.ts | 11 ----------- src/tools/web/recordEvent/recordEvent.ts | 6 ++---- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/tools/web/recordEvent/recordEvent.test.ts b/src/tools/web/recordEvent/recordEvent.test.ts index c05f0f5c7..2d67993a9 100644 --- a/src/tools/web/recordEvent/recordEvent.test.ts +++ b/src/tools/web/recordEvent/recordEvent.test.ts @@ -88,17 +88,6 @@ describe('getRecordEventTool', () => { } }); - it('rejects event_type that is too long or not SCREAMING_SNAKE_CASE', async () => { - const schema = z.object( - await Provider.from(getRecordEventTool(new WebMcpServer()).paramsSchema), - ); - expect(schema.safeParse({ event_type: 'A'.repeat(65) }).success).toBe(false); // too long - expect(schema.safeParse({ event_type: 'tool_error' }).success).toBe(false); // lowercase - expect(schema.safeParse({ event_type: 'TOOL ERROR' }).success).toBe(false); // spaces - expect(schema.safeParse({ event_type: '1TOOL_ERROR' }).success).toBe(false); // leading digit - expect(schema.safeParse({ event_type: '_TOOL_ERROR' }).success).toBe(false); // leading underscore - }); - it('truncates message longer than 1024 characters in the forwarded event', async () => { const extra = getMockRequestHandlerExtra(); const longMessage = 'x'.repeat(2000); diff --git a/src/tools/web/recordEvent/recordEvent.ts b/src/tools/web/recordEvent/recordEvent.ts index 693a58e6b..0e45c3fff 100644 --- a/src/tools/web/recordEvent/recordEvent.ts +++ b/src/tools/web/recordEvent/recordEvent.ts @@ -9,12 +9,10 @@ import { WebTool } from '../tool.js'; // Starting field set — the final app-supplied schema is expected to grow later. const paramsSchema = { - // Bounded free-form string rather than a hard enum: the event-type set is intentionally - // app-extensible (see above), so we reject malformed values but not unknown-yet-valid ones. + // Free-form string rather than a hard enum: the event-type set is intentionally + // app-extensible (see above), so we accept any value rather than reject unknown-yet-valid ones. event_type: z .string() - .max(64) - .regex(/^[A-Z][A-Z0-9_]*$/, 'event_type must be SCREAMING_SNAKE_CASE (e.g. TOOL_ERROR).') .describe( 'The event type for product telemetry, e.g. TOOL_ERROR, PARSE_ERROR, AUTH_ERROR, EMBED_LOAD_ERROR, MCP_APP_CLICKED.', ), From bf6160b7f26b79a569f34b4226ceb04947e72d47 Mon Sep 17 00:00:00 2001 From: jarhun88 Date: Tue, 21 Jul 2026 18:39:49 -0400 Subject: [PATCH 2/2] @W-23146707: Bump patch version to 3.5.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0e09563ea..0e0462e2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tableau/mcp-server", - "version": "3.5.3", + "version": "3.5.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@tableau/mcp-server", - "version": "3.5.3", + "version": "3.5.4", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/ext-apps": "^1.7.2", diff --git a/package.json b/package.json index 1e24d2130..d1a1edc18 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@tableau/mcp-server", "description": "Helping agents see and understand data.", - "version": "3.5.3", + "version": "3.5.4", "repository": { "type": "git", "url": "git+https://github.com/tableau/tableau-mcp.git"