From 493a5a5bc0aa7266fddab77b7c65cd444cf1ec60 Mon Sep 17 00:00:00 2001 From: "sentry-junior[bot]" <264270552+sentry-junior[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 12:32:09 +0000 Subject: [PATCH 1/3] chore: Update SDK to v11.1.0 and migrate tags to attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update @sentry/cloudflare, core, node and react from 11.0.0-rc.0 to 11.1.0. SDK v11 streams spans, and streamed spans only carry attributes. Scope tags still reach error events, but no longer reach spans. Only organization.slug was migrated so far, so project, issue, trace and client context was missing from spans. Add setTagAndAttribute(), which sets a value as a scope tag for errors and as a scope attribute for spans, logs and metrics. Use it for every tag that the tools and the server set, and replace setOrganizationContext with it. Add initialScope.attributes next to initialScope.tags in the stdio, Cloudflare and test client Sentry.init calls. The test client also calls setConversationId, so gen_ai spans carry the conversation ID. Co-Authored-By: Jan Peer Stöcklmair --- docs/contributing/adding-tools.md | 7 +- docs/operations/monitoring.md | 15 +- .../src/server/sentry.config.ts | 17 +- packages/mcp-core/src/server.ts | 16 +- packages/mcp-core/src/telem/organization.ts | 7 - .../{organization.test.ts => scope.test.ts} | 71 ++- packages/mcp-core/src/telem/scope.ts | 14 + .../src/tools/catalog/add-issue-note.ts | 13 +- .../src/tools/catalog/add-team-to-project.ts | 15 +- .../tools/catalog/analyze-issue-with-seer.ts | 30 +- .../src/tools/catalog/create-alert-rule.ts | 6 +- .../mcp-core/src/tools/catalog/create-dsn.ts | 13 +- .../tools/catalog/create-metric-monitor.ts | 7 +- .../src/tools/catalog/create-project.ts | 19 +- .../mcp-core/src/tools/catalog/create-team.ts | 8 +- .../tools/catalog/create-uptime-monitor.ts | 7 +- .../src/tools/catalog/delete-alert-rule.ts | 4 +- .../tools/catalog/delete-metric-monitor.ts | 4 +- .../tools/catalog/delete-uptime-monitor.ts | 9 +- .../src/tools/catalog/find-alert-rules.ts | 7 +- .../src/tools/catalog/find-dashboards.ts | 13 +- .../mcp-core/src/tools/catalog/find-dsns.ts | 7 +- .../src/tools/catalog/find-metric-monitors.ts | 7 +- .../src/tools/catalog/find-monitors.ts | 13 +- .../src/tools/catalog/find-projects.ts | 4 +- .../src/tools/catalog/find-releases.ts | 10 +- .../mcp-core/src/tools/catalog/find-teams.ts | 4 +- .../src/tools/catalog/find-uptime-monitors.ts | 7 +- .../catalog/get-agent-conversation-details.ts | 13 +- .../src/tools/catalog/get-alert-options.ts | 4 +- .../src/tools/catalog/get-alert-rule.ts | 7 +- .../tools/catalog/get-dashboard-details.ts | 15 +- .../mcp-core/src/tools/catalog/get-doc.ts | 10 +- .../src/tools/catalog/get-event-attachment.ts | 4 +- .../src/tools/catalog/get-event-stacktrace.ts | 7 +- .../src/tools/catalog/get-issue-activity.ts | 15 +- .../tools/catalog/get-issue-breadcrumbs.ts | 7 +- .../src/tools/catalog/get-issue-details.ts | 26 +- .../src/tools/catalog/get-issue-tag-values.ts | 20 +- .../tools/catalog/get-issue-user-reports.ts | 13 +- .../tools/catalog/get-latest-base-snapshot.ts | 13 +- .../catalog/get-metric-monitor-details.ts | 7 +- .../src/tools/catalog/get-monitor-details.ts | 19 +- .../src/tools/catalog/get-profile-details.ts | 31 +- .../mcp-core/src/tools/catalog/get-profile.ts | 35 +- .../src/tools/catalog/get-release-details.ts | 21 +- .../src/tools/catalog/get-replay-details.ts | 15 +- .../src/tools/catalog/get-sentry-resource.ts | 10 +- .../src/tools/catalog/get-snapshot-image.ts | 4 +- .../src/tools/catalog/get-snapshot.ts | 4 +- .../src/tools/catalog/get-trace-details.ts | 11 +- .../catalog/get-uptime-monitor-details.ts | 9 +- .../tools/catalog/onboarding-status-update.ts | 6 +- .../tools/catalog/remove-team-from-project.ts | 17 +- .../catalog/search-agent-conversations.ts | 16 +- .../src/tools/catalog/search-issue-events.ts | 24 +- .../src/tools/catalog/search-issues.ts | 12 +- .../src/tools/catalog/update-alert-rule.ts | 17 +- .../mcp-core/src/tools/catalog/update-dsn.ts | 15 +- .../src/tools/catalog/update-issue.ts | 32 +- .../tools/catalog/update-metric-monitor.ts | 7 +- .../src/tools/catalog/update-project.ts | 23 +- .../tools/catalog/update-uptime-monitor.ts | 9 +- .../src/tools/support/issue-linking/tool.ts | 4 +- .../src/tools/support/search-events/search.ts | 9 +- packages/mcp-server/src/index.ts | 43 +- packages/mcp-test-client/src/index.ts | 35 +- pnpm-lock.yaml | 532 ++++++++++++------ pnpm-workspace.yaml | 34 +- 69 files changed, 865 insertions(+), 644 deletions(-) delete mode 100644 packages/mcp-core/src/telem/organization.ts rename packages/mcp-core/src/telem/{organization.test.ts => scope.test.ts} (67%) create mode 100644 packages/mcp-core/src/telem/scope.ts diff --git a/docs/contributing/adding-tools.md b/docs/contributing/adding-tools.md index 1200ff85f..6254ca6ae 100644 --- a/docs/contributing/adding-tools.md +++ b/docs/contributing/adding-tools.md @@ -164,9 +164,10 @@ async handler(params, context: ServerContext) { ); } - // 3. Set organization telemetry for streamed spans and error events - // Import from ../../telem/organization. - setOrganizationContext(params.organizationSlug); + // 3. Set telemetry context for streamed spans and error events + // Import from ../../telem/scope. + setTagAndAttribute("organization.slug", params.organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); // 4. Call API const data = await api.yourMethod(params); diff --git a/docs/operations/monitoring.md b/docs/operations/monitoring.md index 260813885..f674a6bc9 100644 --- a/docs/operations/monitoring.md +++ b/docs/operations/monitoring.md @@ -44,12 +44,17 @@ export async function createTracedToolHandler( } ``` -### Organization Context +### Request Context -Call `setOrganizationContext(slug)` from `src/telem/organization.ts` after -resolving the organization, including from URLs. It sets `organization.slug` -as a scope attribute for streamed spans, logs, and metrics, and as a tag for -errors. SDK v11 no longer copies scope tags onto spans. +Use `setTagAndAttribute(key, value)` from `src/telem/scope.ts` for request +values that must be searchable, such as `organization.slug`, `project.slug`, +or `issue.id`. It sets the value as a scope attribute for streamed spans, +logs, and metrics, and as a tag for errors. SDK v11 no longer copies scope +tags onto spans, so do not call `setTag` from `@sentry/core` alone. + +Set `organization.slug` after resolving the organization, including from +URLs. For values set at startup, put the same keys in both +`initialScope.tags` and `initialScope.attributes` of `Sentry.init`. ### Span Management diff --git a/packages/mcp-cloudflare/src/server/sentry.config.ts b/packages/mcp-cloudflare/src/server/sentry.config.ts index 19e7417ff..e2ae97b8f 100644 --- a/packages/mcp-cloudflare/src/server/sentry.config.ts +++ b/packages/mcp-cloudflare/src/server/sentry.config.ts @@ -1,21 +1,24 @@ -import * as Sentry from "@sentry/cloudflare"; import type { CloudflareOptions } from "@sentry/cloudflare"; +import * as Sentry from "@sentry/cloudflare"; import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; import { LIB_VERSION } from "@sentry/mcp-core/version"; import type { Env } from "./types"; export default function getSentryConfig(env: Env): CloudflareOptions { const versionId = env.CF_VERSION_METADATA?.id; + const scopeContext = { + "app.server.version": LIB_VERSION, + "app.upstream.host": env.SENTRY_HOST, + }; return { dsn: env.SENTRY_DSN, tracesSampleRate: 0.3, beforeSend: sentryBeforeSend, initialScope: { - tags: { - "app.server.version": LIB_VERSION, - "app.upstream.host": env.SENTRY_HOST, - }, + tags: scopeContext, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: scopeContext, }, ...(versionId ? { release: versionId } : {}), environment: @@ -39,6 +42,10 @@ getSentryConfig.partial = (config: Partial) => { ...((defaultConfig.initialScope ?? {}) as any).tags, ...((config.initialScope ?? {}) as any).tags, }, + attributes: { + ...((defaultConfig.initialScope ?? {}) as any).attributes, + ...((config.initialScope ?? {}) as any).attributes, + }, }, }; }; diff --git a/packages/mcp-core/src/server.ts b/packages/mcp-core/src/server.ts index 055362bc4..e05c2b843 100644 --- a/packages/mcp-core/src/server.ts +++ b/packages/mcp-core/src/server.ts @@ -21,12 +21,7 @@ import { McpServer as LegacyMcpServer } from "@modelcontextprotocol/sdk/server/m */ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { McpServer as ModernMcpServer } from "@modelcontextprotocol/server"; -import { - getActiveSpan, - type SpanAttributeValue, - setTag, - setUser, -} from "@sentry/core"; +import { getActiveSpan, type SpanAttributeValue, setUser } from "@sentry/core"; import { wrapMcpServerWithSentry } from "@sentry/core/server"; import { isApiAuthenticationErrorDeep } from "./api-client"; import { MCP_SERVER_NAME } from "./constants"; @@ -37,6 +32,7 @@ import { } from "./internal/error-handling"; import type { Skill } from "./skills"; import { type LogIssueOptions, logIssue } from "./telem/logging"; +import { setTagAndAttribute } from "./telem/scope"; import { executeToolHandler, getAvailableTools, @@ -302,15 +298,15 @@ function configureServer({ setUser(user); } if (context.clientId) { - setTag("client.id", context.clientId); + setTagAndAttribute("client.id", context.clientId); } if (context.clientFamily) { - setTag("app.client.family", context.clientFamily); + setTagAndAttribute("app.client.family", context.clientFamily); } if (context.transport) { - setTag("app.transport", context.transport); + setTagAndAttribute("app.transport", context.transport); } - setTag("app.server.mode.experimental", experimentalMode); + setTagAndAttribute("app.server.mode.experimental", experimentalMode); // Hoisted so both the handler path and the catch (onError) share one // narrowing instead of re-casting `params`. diff --git a/packages/mcp-core/src/telem/organization.ts b/packages/mcp-core/src/telem/organization.ts deleted file mode 100644 index 2cde4b448..000000000 --- a/packages/mcp-core/src/telem/organization.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { setAttribute, setTag } from "@sentry/core"; - -export function setOrganizationContext(organizationSlug: string): void { - // Streamed spans use scope attributes; errors still use scope tags. - setAttribute("organization.slug", organizationSlug); - setTag("organization.slug", organizationSlug); -} diff --git a/packages/mcp-core/src/telem/organization.test.ts b/packages/mcp-core/src/telem/scope.test.ts similarity index 67% rename from packages/mcp-core/src/telem/organization.test.ts rename to packages/mcp-core/src/telem/scope.test.ts index a777a6558..8ef61c936 100644 --- a/packages/mcp-core/src/telem/organization.test.ts +++ b/packages/mcp-core/src/telem/scope.test.ts @@ -13,6 +13,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { buildServer } from "../server"; import { getServerContext } from "../test-setup"; import findProjects from "../tools/catalog/find-projects"; +import type { ServerContext } from "../types"; const beforeSendSpan = vi.fn((span: StreamedSpanJSON) => span); const beforeSend = vi.fn((event: ErrorEvent) => event); @@ -45,6 +46,27 @@ afterEach(async () => { getIsolationScope().setTag("organization.slug", undefined); }); +async function callTool( + context: ServerContext, + name: string, + args: Record, +): Promise { + const server = buildServer({ context }); + const client = new Client({ name: "telemetry-test", version: "1.0.0" }); + const [clientTransport, serverTransport] = + InMemoryTransport.createLinkedPair(); + try { + await server.connect(serverTransport); + await client.connect(clientTransport); + const result = await client.callTool({ name, arguments: args }); + expect(result.isError).not.toBe(true); + } finally { + await client.close(); + await server.close(); + } + await sentry.flush(); +} + describe("organization telemetry", () => { it.each([ { @@ -74,25 +96,14 @@ describe("organization telemetry", () => { ])( "includes $description on streamed root spans", async ({ name, args, constraints }) => { - const server = buildServer({ - context: getServerContext({ + await callTool( + getServerContext({ constraints, grantedSkills: new Set(["inspect"]), }), - }); - const client = new Client({ name: "telemetry-test", version: "1.0.0" }); - const [clientTransport, serverTransport] = - InMemoryTransport.createLinkedPair(); - try { - await server.connect(serverTransport); - await client.connect(clientTransport); - const result = await client.callTool({ name, arguments: args }); - expect(result.isError).not.toBe(true); - } finally { - await client.close(); - await server.close(); - } - await sentry.flush(); + name, + args, + ); expect(beforeSendSpan).toHaveBeenCalledWith( expect.objectContaining({ is_segment: true, @@ -126,3 +137,31 @@ describe("organization telemetry", () => { ); }); }); + +describe("request and tool telemetry", () => { + it("includes request and tool context on streamed root spans", async () => { + await callTool( + getServerContext({ + clientId: "telemetry-test-client", + grantedSkills: new Set(["inspect"]), + }), + "execute_sentry_tool", + { + name: "get_issue_breadcrumbs", + arguments: { + issueUrl: + "https://sentry-mcp-evals.sentry.io/issues/CLOUDFLARE-MCP-41/", + }, + }, + ); + expect(beforeSendSpan).toHaveBeenCalledWith( + expect.objectContaining({ + is_segment: true, + attributes: expect.objectContaining({ + "client.id": "telemetry-test-client", + "issue.id": "CLOUDFLARE-MCP-41", + }), + }), + ); + }); +}); diff --git a/packages/mcp-core/src/telem/scope.ts b/packages/mcp-core/src/telem/scope.ts new file mode 100644 index 000000000..ac2efd865 --- /dev/null +++ b/packages/mcp-core/src/telem/scope.ts @@ -0,0 +1,14 @@ +import { setAttribute, setTag } from "@sentry/core"; + +/** + * Sets `key` on the isolation scope as a tag for error events and as an + * attribute for streamed spans, logs, and metrics. SDK v11 does not copy + * scope tags onto spans. + */ +export function setTagAndAttribute( + key: string, + value: string | number | boolean, +): void { + setAttribute(key, value); + setTag(key, value); +} diff --git a/packages/mcp-core/src/tools/catalog/add-issue-note.ts b/packages/mcp-core/src/tools/catalog/add-issue-note.ts index 814d32d17..09533d690 100644 --- a/packages/mcp-core/src/tools/catalog/add-issue-note.ts +++ b/packages/mcp-core/src/tools/catalog/add-issue-note.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { IssueComment } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { IssueComment } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatActor, formatDate, @@ -86,8 +85,8 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTagAndAttribute("organization.slug", parsed.organizationSlug); + setTagAndAttribute("issue.id", parsed.issueId); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts index ba5f2d852..e8d6762c5 100644 --- a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts +++ b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts @@ -1,17 +1,16 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Team } from "../../api-client/index"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { Team } from "../../api-client/index"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ id: z.string(), @@ -72,9 +71,9 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("team.slug", params.teamSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); + setTagAndAttribute("team.slug", params.teamSlug); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts index cfa625159..dcbe2bd55 100644 --- a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts +++ b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts @@ -1,34 +1,34 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { ApiError, ApiServerError } from "../../api-client/index"; +import { retryWithBackoff } from "../../internal/fetch-utils"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { - parseIssueParams, assertIssueWithinProjectConstraint, + parseIssueParams, } from "../../internal/tool-helpers/issue"; import { - getStatusDisplayName, - isTerminalStatus, + getActiveAutofixTodo, getHumanInterventionGuidance, getOutputForAutofixRun, - wrapSeerContent, - getActiveAutofixTodo, getSeerUnsupportedIssueMessage, + getStatusDisplayName, isSeerSupportedIssue, + isTerminalStatus, + SEER_INITIAL_RETRY_DELAY, + SEER_MAX_RETRIES, SEER_POLLING_INTERVAL, SEER_TIMEOUT, - SEER_MAX_RETRIES, - SEER_INITIAL_RETRY_DELAY, + wrapSeerContent, } from "../../internal/tool-helpers/seer"; -import { retryWithBackoff } from "../../internal/fetch-utils"; -import type { ServerContext } from "../../types"; -import { ApiError, ApiServerError } from "../../api-client/index"; import { - ParamOrganizationSlug, - ParamRegionUrl, ParamIssueShortId, ParamIssueUrl, + ParamOrganizationSlug, + ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export default defineTool({ name: "analyze_issue_with_seer", @@ -102,7 +102,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTagAndAttribute("organization.slug", orgSlug); const issue = await apiService.getIssue({ organizationSlug: orgSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts index a5ce3c373..81f63bd01 100644 --- a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts @@ -8,9 +8,8 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; -import { resolveAlertRuleConnections } from "../support/alert-rule-connections"; import { alertRuleConfigFields, alertRuleSummarySchema, @@ -19,6 +18,7 @@ import { ParamNewAlertTriggers, toAlertRuleSummary, } from "../support/alert-rule-config"; +import { resolveAlertRuleConnections } from "../support/alert-rule-connections"; export default defineTool({ name: "create_alert_rule", @@ -76,7 +76,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); const project = context.constraints.projectSlug ? await api.getProject({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-dsn.ts b/packages/mcp-core/src/tools/catalog/create-dsn.ts index 66d2ffa00..f17105b25 100644 --- a/packages/mcp-core/src/tools/catalog/create-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/create-dsn.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const createDsnOutputSchema = z.object({ dsn: z.object({ @@ -68,8 +67,8 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); const clientKey = await apiService.createClientKey({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts index 8f49e9e69..874177bec 100644 --- a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { Detector } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -9,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorCreateFields, @@ -60,8 +59,8 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); const { timeWindowSeconds, ...query } = params.query; const body = { type: "metric_issue" as const, diff --git a/packages/mcp-core/src/tools/catalog/create-project.ts b/packages/mcp-core/src/tools/catalog/create-project.ts index 08e84390f..c5aa8ea15 100644 --- a/packages/mcp-core/src/tools/catalog/create-project.ts +++ b/packages/mcp-core/src/tools/catalog/create-project.ts @@ -1,19 +1,18 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import type { ClientKey, SentryApiService } from "../../api-client/index"; import { UserInputError } from "../../errors"; -import { logWarn } from "../../telem/logging"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, + ParamPlatform, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, - ParamPlatform, } from "../../schema"; -import type { ClientKey, SentryApiService } from "../../api-client/index"; +import { logWarn } from "../../telem/logging"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; type RepositoryMatch = { name: string; @@ -174,8 +173,8 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("team.slug", params.teamSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("team.slug", params.teamSlug); // Resolve repository intent before creating the project so bad or ambiguous // repo input cannot leave behind an otherwise unwanted project. diff --git a/packages/mcp-core/src/tools/catalog/create-team.ts b/packages/mcp-core/src/tools/catalog/create-team.ts index be1843151..7b624515d 100644 --- a/packages/mcp-core/src/tools/catalog/create-team.ts +++ b/packages/mcp-core/src/tools/catalog/create-team.ts @@ -1,10 +1,10 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const createTeamOutputSchema = z.object({ team: z.object({ @@ -56,7 +56,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const team = await apiService.createTeam({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts index 2ea9d821b..54b189e10 100644 --- a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -102,8 +101,8 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts index 5c8d863f3..01dce283b 100644 --- a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { validateAlertRuleProjectScope } from "../support/alert-rule-connections"; @@ -48,7 +48,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); await validateAlertRuleProjectScope(api, { organizationSlug: params.organizationSlug, ruleId: params.ruleId, diff --git a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts index 347a69f3f..4b3378b47 100644 --- a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -32,7 +32,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); await getMetricMonitor(api, { ...params, scopedProjectSlug: context.constraints.projectSlug, diff --git a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts index d07489feb..50ae97e9b 100644 --- a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -55,9 +54,9 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); + setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts index 451ca743a..bc14620cd 100644 --- a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts +++ b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -10,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitorReference, @@ -174,9 +173,9 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); if (projectSlug) { - setTag("project.slug", projectSlug); + setTagAndAttribute("project.slug", projectSlug); } const includeIssue = params.kind !== "metric"; diff --git a/packages/mcp-core/src/tools/catalog/find-dashboards.ts b/packages/mcp-core/src/tools/catalog/find-dashboards.ts index cf1b09ff7..d4d264cc0 100644 --- a/packages/mcp-core/src/tools/catalog/find-dashboards.ts +++ b/packages/mcp-core/src/tools/catalog/find-dashboards.ts @@ -1,13 +1,12 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { DashboardListItem, SentryApiService } from "../../api-client"; import { UserInputError } from "../../errors"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { filterDashboardsByProjectConstraint, resolveDashboardProjectConstraint, @@ -285,7 +284,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -293,8 +292,8 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTag("project.slug", scopedProject.slug); - setTag("project.id", String(scopedProject.id)); + setTagAndAttribute("project.slug", scopedProject.slug); + setTagAndAttribute("project.id", String(scopedProject.id)); } let dashboards: DashboardListItem[]; diff --git a/packages/mcp-core/src/tools/catalog/find-dsns.ts b/packages/mcp-core/src/tools/catalog/find-dsns.ts index 0855613f1..af69e0d99 100644 --- a/packages/mcp-core/src/tools/catalog/find-dsns.ts +++ b/packages/mcp-core/src/tools/catalog/find-dsns.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const findDsnsOutputSchema = z.object({ @@ -53,8 +52,8 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); const clientKeys = await apiService.listClientKeys({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts index 71e883560..c6eb80cb1 100644 --- a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -8,7 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { listMetricMonitors, @@ -68,8 +67,8 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProject; - setOrganizationContext(params.organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/find-monitors.ts b/packages/mcp-core/src/tools/catalog/find-monitors.ts index a8706b47c..ddfb5a761 100644 --- a/packages/mcp-core/src/tools/catalog/find-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-monitors.ts @@ -1,16 +1,15 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Monitor } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { Monitor } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; const ENVIRONMENT_LIMIT = 5; @@ -197,7 +196,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" ? params.projectSlug @@ -211,7 +210,7 @@ export default defineTool({ } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; if (projectSlug) { - setTag("project.slug", projectSlug); + setTagAndAttribute("project.slug", projectSlug); } const monitors = await apiService.listMonitors({ diff --git a/packages/mcp-core/src/tools/catalog/find-projects.ts b/packages/mcp-core/src/tools/catalog/find-projects.ts index 5077a5646..c7d0d97a8 100644 --- a/packages/mcp-core/src/tools/catalog/find-projects.ts +++ b/packages/mcp-core/src/tools/catalog/find-projects.ts @@ -10,7 +10,7 @@ import { ParamSearchQuery, } from "../../schema"; import { ALL_SKILLS } from "../../skills"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const { projects, nextCursor } = await apiService.listProjects( organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-releases.ts b/packages/mcp-core/src/tools/catalog/find-releases.ts index 17fe37585..90c8532d8 100644 --- a/packages/mcp-core/src/tools/catalog/find-releases.ts +++ b/packages/mcp-core/src/tools/catalog/find-releases.ts @@ -1,14 +1,14 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlugOrAll, + ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -98,7 +98,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const releases = await apiService.listReleases({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-teams.ts b/packages/mcp-core/src/tools/catalog/find-teams.ts index a7529910a..d29dd2f6d 100644 --- a/packages/mcp-core/src/tools/catalog/find-teams.ts +++ b/packages/mcp-core/src/tools/catalog/find-teams.ts @@ -9,7 +9,7 @@ import { ParamRegionUrl, ParamSearchQuery, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const { teams, nextCursor } = await apiService.listTeams(organizationSlug, { query: params.query ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts index 2e56c7740..ee1911ad5 100644 --- a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; @@ -9,6 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -85,7 +84,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" @@ -100,7 +99,7 @@ export default defineTool({ } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; if (projectSlug) { - setTag("project.slug", projectSlug); + setTagAndAttribute("project.slug", projectSlug); } const monitors = await apiService.listUptimeMonitors({ diff --git a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts index fbea74eab..d5719c13f 100644 --- a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts @@ -2,14 +2,13 @@ // transcript projection and keeps detail output chronological and debugger // oriented instead of mirroring every raw span attribute. import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { AIConversationSpan, SentryApiService } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { UserInputError } from "../../errors"; -import type { AIConversationSpan, SentryApiService } from "../../api-client"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; type ToolCall = { @@ -704,8 +703,8 @@ export default defineTool({ outputSchema: aiConversationDetailsOutputSchema, async handler(params, context: ServerContext) { - setOrganizationContext(params.organizationSlug); - setTag("ai_conversation.id", params.conversationId); + setTagAndAttribute("organization.slug", params.organizationSlug); + setTagAndAttribute("ai_conversation.id", params.conversationId); if ((params.start && !params.end) || (!params.start && params.end)) { throw new UserInputError("`start` and `end` must be provided together."); diff --git a/packages/mcp-core/src/tools/catalog/get-alert-options.ts b/packages/mcp-core/src/tools/catalog/get-alert-options.ts index 352359ca9..2fd55e656 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-options.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-options.ts @@ -12,7 +12,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -145,7 +145,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const pageParams = { organizationSlug, cursor: params.cursor ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts index 7ce7aa348..e9acca95c 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { Detector, IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -10,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getAlertRuleDetails } from "../support/alert-rule-details"; import { @@ -106,9 +105,9 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); if (projectSlug) { - setTag("project.slug", projectSlug); + setTagAndAttribute("project.slug", projectSlug); } let match: AlertRuleMatch; diff --git a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts index fd446df99..a97f08759 100644 --- a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import type { ServerContext } from "../../types"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { assertDashboardWithinProjectConstraint, formatDashboardDetails, - resolveDashboardProjectConstraint, resolveDashboardId, + resolveDashboardProjectConstraint, } from "../support/dashboards"; export default defineTool({ @@ -55,7 +54,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -63,8 +62,8 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTag("project.slug", scopedProject.slug); - setTag("project.id", String(scopedProject.id)); + setTagAndAttribute("project.slug", scopedProject.slug); + setTagAndAttribute("project.id", String(scopedProject.id)); } const dashboardId = await resolveDashboardId({ diff --git a/packages/mcp-core/src/tools/catalog/get-doc.ts b/packages/mcp-core/src/tools/catalog/get-doc.ts index 3ab42227e..c0dacd427 100644 --- a/packages/mcp-core/src/tools/catalog/get-doc.ts +++ b/packages/mcp-core/src/tools/catalog/get-doc.ts @@ -1,9 +1,9 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { fetchWithTimeout } from "../../internal/fetch-utils"; -import { UserInputError } from "../../errors"; import { ApiError } from "../../api-client/index"; +import { UserInputError } from "../../errors"; +import { fetchWithTimeout } from "../../internal/fetch-utils"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { USER_AGENT } from "../../version"; @@ -47,7 +47,7 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setTag("doc.path", params.path); + setTagAndAttribute("doc.path", params.path); let output = `# Documentation Content\n\n`; output += `**Path**: ${params.path}\n\n`; diff --git a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts index 54aa226d3..2f779a04c 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts @@ -3,7 +3,6 @@ import type { ImageContent, TextContent, } from "@modelcontextprotocol/sdk/types.js"; -import { setOrganizationContext } from "../../telem/organization"; import { DEFAULT_MAX_INLINE_ATTACHMENT_BYTES } from "../../api-client"; import { bytesToBase64 } from "../../internal/blob-utils"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -16,6 +15,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; function formatMegabytes(bytes: number): string { @@ -131,7 +131,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); // If attachmentId is provided, download the specific attachment if (params.attachmentId) { diff --git a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts index 9b55c713e..2f0ce8b99 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { ApiNotFoundError } from "../../api-client"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -12,6 +10,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchAndFormatEventStacktrace } from "../support/event-stacktrace"; @@ -61,8 +60,8 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("issue.id", params.issueId); + setTagAndAttribute("organization.slug", params.organizationSlug); + setTagAndAttribute("issue.id", params.issueId); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts index f9e3bfb76..628e85fdf 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts @@ -1,22 +1,21 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { IssueActivity, IssueComment } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { IssueActivity, IssueComment } from "../../api-client/types"; -import { isPlainObject } from "../../internal/type-guards"; import { formatAvailableToolCallInstruction } from "../../internal/tool-helpers/tool-call-formatting"; -import type { ServerContext } from "../../types"; +import { isPlainObject } from "../../internal/type-guards"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatActor, formatDate, @@ -95,8 +94,8 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTagAndAttribute("organization.slug", parsed.organizationSlug); + setTagAndAttribute("issue.id", parsed.issueId); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts index 74155cfac..7efe2155d 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import { ApiNotFoundError } from "../../api-client"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { fetchAndFormatBreadcrumbs } from "../../internal/tool-helpers/breadcrumbs"; @@ -16,6 +14,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; export default defineTool({ @@ -61,8 +60,8 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTagAndAttribute("organization.slug", parsed.organizationSlug); + setTagAndAttribute("issue.id", parsed.issueId); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-details.ts b/packages/mcp-core/src/tools/catalog/get-issue-details.ts index c372b3cf4..ea76c4b2d 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-details.ts @@ -1,5 +1,4 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService } from "../../api-client"; import { ApiClientError, ApiNotFoundError } from "../../api-client"; import type { @@ -15,28 +14,28 @@ import type { } from "../../api-client/types"; import { ConfigurationError, UserInputError } from "../../errors"; import type { CodeLocation } from "../../internal/code-location"; -import type { AIConversationReference } from "../../internal/tool-helpers/ai-conversation-actions"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; -import { structuredResult } from "../../internal/tool-helpers/results"; import { dedupeReplayIds, getReplayIdFromEvent, - isPerformanceIssueType, getSeerActionabilityLabel, getSuspectCommit, + isPerformanceIssueType, usesSharedFormatterBody, } from "../../internal/formatting"; -import { - getAutofixArtifactSummaries, - getStatusDisplayName, -} from "../../internal/tool-helpers/seer"; +import type { AIConversationReference } from "../../internal/tool-helpers/ai-conversation-actions"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; import { assertIssueWithinProjectConstraint, formatIssueOutput, parseIssueParams, } from "../../internal/tool-helpers/issue"; +import { structuredResult } from "../../internal/tool-helpers/results"; +import { + getAutofixArtifactSummaries, + getStatusDisplayName, +} from "../../internal/tool-helpers/seer"; import { ParamEventId, ParamIssueShortId, @@ -45,6 +44,7 @@ import { ParamRegionUrl, } from "../../schema"; import { logError, logIssue } from "../../telem/logging"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { resolveCodeLocation } from "../support/code-location"; @@ -390,7 +390,7 @@ export default defineTool({ ); } - setOrganizationContext(orgSlug); + setTagAndAttribute("organization.slug", orgSlug); // Use issueId directly if provided (e.g., from URL parsing), otherwise search by eventId let issue: Awaited>; if (params.issueId) { @@ -510,7 +510,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTagAndAttribute("organization.slug", orgSlug); // For the main issue lookup, provide parameter context on 404 let issue: Awaited>; diff --git a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts index 6ea41e9bc..8938d5a0c 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts @@ -1,22 +1,22 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { ApiNotFoundError } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { structuredResult } from "../../internal/tool-helpers/results"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import { enhanceNotFoundError } from "../../internal/tool-helpers/enhance-error"; -import { ApiNotFoundError } from "../../api-client"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { - ParamOrganizationSlug, - ParamRegionUrl, ParamIssueShortId, ParamIssueUrl, + ParamOrganizationSlug, + ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const getIssueTagValuesOutputSchema = z.object({ tag: z.object({ @@ -133,7 +133,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTagAndAttribute("organization.slug", orgSlug); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts index 0921d08c9..be9cfe684 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { UserReportList } from "../../api-client/types"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import type { UserReportList } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { ParamIssueShortId, ParamIssueUrl, ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatDate } from "./support/api-formatting"; function getReporter(report: UserReportList[number]): string { @@ -98,8 +97,8 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(parsed.organizationSlug); - setTag("issue.id", parsed.issueId); + setTagAndAttribute("organization.slug", parsed.organizationSlug); + setTagAndAttribute("issue.id", parsed.issueId); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts index 19b02d7db..0d669a0fa 100644 --- a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts @@ -1,10 +1,9 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import type { ServerContext } from "../../types"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import { renderSnapshotImageTreeSection } from "../support/snapshots/formatting"; @@ -77,7 +76,7 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, @@ -86,8 +85,8 @@ export default defineTool({ const project = params.project ?? undefined; const projectId = project && isNumericId(project) ? project : undefined; const projectSlug = project && !isNumericId(project) ? project : undefined; - if (projectId) setTag("project.id", projectId); - if (projectSlug) setTag("project.slug", projectSlug); + if (projectId) setTagAndAttribute("project.id", projectId); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); const data = (await apiService.getLatestBaseSnapshot({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts index 2bf09f1ed..cf6a62f3e 100644 --- a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts @@ -1,9 +1,8 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -36,8 +35,8 @@ export default defineTool({ }, async handler(params, context: ServerContext) { const projectSlug = context.constraints.projectSlug ?? params.projectSlug; - setOrganizationContext(params.organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts index 486e4197b..e5df09125 100644 --- a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { UserInputError } from "../../errors"; import type { Monitor, MonitorCheckIn, MonitorStat, } from "../../api-client/types"; -import type { ServerContext } from "../../types"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamPeriod, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { compactLines, @@ -162,16 +161,16 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("monitor.slug", params.monitorSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("monitor.slug", params.monitorSlug); const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = requestedProjectSlugOrId ?? context.constraints.projectSlug ?? null; if (projectSlugOrId) { if (isNumericId(projectSlugOrId)) { - setTag("project.id", projectSlugOrId); + setTagAndAttribute("project.id", projectSlugOrId); } else { - setTag("project.slug", projectSlugOrId); + setTagAndAttribute("project.slug", projectSlugOrId); } } if (requestedProjectSlugOrId && !isNumericId(requestedProjectSlugOrId)) { diff --git a/packages/mcp-core/src/tools/catalog/get-profile-details.ts b/packages/mcp-core/src/tools/catalog/get-profile-details.ts index f5de2cf27..ab7f5c23a 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile-details.ts @@ -1,22 +1,21 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { resolveRegionUrlForOrganization } from "../../internal/tool-helpers/resolve-region-url"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { isProfileUrl, parseSentryUrl } from "../../internal/url-helpers"; +import { + resolveScopedOrganizationSlug, + resolveScopedProjectSlugOrId, +} from "../../internal/url-scope"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateResourceId, validateSlugOrId, } from "../../utils/slug-validation"; -import { parseSentryUrl, isProfileUrl } from "../../internal/url-helpers"; -import { - resolveScopedOrganizationSlug, - resolveScopedProjectSlugOrId, -} from "../../internal/url-scope"; import { formatProfileChunkAnalysis, formatTransactionProfileAnalysis, @@ -303,10 +302,10 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(resolved.organizationSlug); + setTagAndAttribute("organization.slug", resolved.organizationSlug); if (resolved.mode === "transaction") { - setTag("profile.id", resolved.profileId); + setTagAndAttribute("profile.id", resolved.profileId); const isNumericProjectInput = typeof resolved.projectSlugOrId === "number" || isNumericId(String(resolved.projectSlugOrId)); @@ -337,7 +336,7 @@ export default defineTool({ }); } - setTag("project.slug", projectSlug); + setTagAndAttribute("project.slug", projectSlug); const profileUrl = params.profileUrl ?? @@ -362,7 +361,7 @@ export default defineTool({ }); } - setTag("profiler.id", resolved.profilerId); + setTagAndAttribute("profiler.id", resolved.profilerId); const { projectId, projectSlug } = await resolveProjectContext( apiService, @@ -371,8 +370,8 @@ export default defineTool({ { requireNumericId: true }, ); - setTag("project.slug", projectSlug); - setTag("project.id", String(projectId)); + setTagAndAttribute("project.slug", projectSlug); + setTagAndAttribute("project.id", String(projectId)); const chunk = await apiService.getProfileChunk({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-profile.ts b/packages/mcp-core/src/tools/catalog/get-profile.ts index b287a33e8..5b56f586f 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile.ts @@ -1,26 +1,25 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { isProfileUrl, parseSentryUrl } from "../../internal/url-helpers"; +import { + resolveScopedOrganizationSlug, + resolveScopedProjectSlugOrId, +} from "../../internal/url-scope"; import { ParamOrganizationSlug, ParamPeriod, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; +import { hasProfileData } from "../support/profile/analyzer"; import { formatFlamegraphAnalysis, formatFlamegraphComparison, } from "../support/profile/formatter"; -import { hasProfileData } from "../support/profile/analyzer"; -import { parseSentryUrl, isProfileUrl } from "../../internal/url-helpers"; -import { - resolveScopedOrganizationSlug, - resolveScopedProjectSlugOrId, -} from "../../internal/url-scope"; interface ResolvedProfileParams { organizationSlug: string; @@ -228,7 +227,7 @@ export default defineTool({ isNumericId(String(projectSlugOrId)) ) { projectId = projectSlugOrId; - setTag("project.id", String(projectSlugOrId)); + setTagAndAttribute("project.id", String(projectSlugOrId)); } else { // It's a slug, resolve to ID const project = await apiService.getProject({ @@ -236,17 +235,17 @@ export default defineTool({ projectSlugOrId: String(projectSlugOrId), }); projectId = project.id; - setTag("project.slug", String(projectSlugOrId)); - setTag("project.id", String(project.id)); + setTagAndAttribute("project.slug", String(projectSlugOrId)); + setTagAndAttribute("project.id", String(project.id)); } - setOrganizationContext(organizationSlug); - setTag("transaction.name", transactionName); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("transaction.name", transactionName); // Comparison mode: compare two time periods if (params.compareAgainstPeriod) { - setTag("baseline.period", params.compareAgainstPeriod); - setTag("current.period", params.period); + setTagAndAttribute("baseline.period", params.compareAgainstPeriod); + setTagAndAttribute("current.period", params.period); // Fetch both flamegraphs in parallel const [baselineFlamegraph, currentFlamegraph] = await Promise.all([ diff --git a/packages/mcp-core/src/tools/catalog/get-release-details.ts b/packages/mcp-core/src/tools/catalog/get-release-details.ts index 14aff487c..659f4cb0f 100644 --- a/packages/mcp-core/src/tools/catalog/get-release-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-release-details.ts @@ -1,13 +1,12 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { UserInputError } from "../../errors"; import type { Commit, Deploy, ReleaseDetails } from "../../api-client/types"; -import type { ServerContext } from "../../types"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { validateSlugOrId, isNumericId } from "../../utils/slug-validation"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; +import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { compactLines, formatActor, @@ -141,17 +140,17 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("release.version", params.releaseVersion); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("release.version", params.releaseVersion); const scopedProjectSlug = context.constraints.projectSlug ?? undefined; const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = scopedProjectSlug ?? requestedProjectSlugOrId; if (projectSlugOrId) { if (isNumericId(projectSlugOrId)) { - setTag("project.id", projectSlugOrId); + setTagAndAttribute("project.id", projectSlugOrId); } else { - setTag("project.slug", projectSlugOrId); + setTagAndAttribute("project.slug", projectSlugOrId); } } diff --git a/packages/mcp-core/src/tools/catalog/get-replay-details.ts b/packages/mcp-core/src/tools/catalog/get-replay-details.ts index 1df649abd..b1e56fdc1 100644 --- a/packages/mcp-core/src/tools/catalog/get-replay-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-replay-details.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { Issue, ReplayDetails, @@ -8,19 +6,20 @@ import type { SentryApiService, TraceMeta, } from "../../api-client"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { resolveRegionUrlForOrganization } from "../../internal/tool-helpers/resolve-region-url"; import { parseSentryUrl } from "../../internal/url-helpers"; import { resolveScopedOrganizationSlug } from "../../internal/url-scope"; -import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, - ParamReplayId, ParamRegionUrl, + ParamReplayId, ParamReplayUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; interface ResolvedReplayParams { organizationSlug: string; @@ -98,8 +97,8 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(resolved.organizationSlug); - setTag("replay.id", resolved.replayId); + setTagAndAttribute("organization.slug", resolved.organizationSlug); + setTagAndAttribute("replay.id", resolved.replayId); const replay = await apiService.getReplayDetails({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts index de0c8344c..0dc6236f0 100644 --- a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts +++ b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts @@ -1,6 +1,5 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService } from "../../api-client"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -15,6 +14,7 @@ import { resolveScopedProjectSlug, } from "../../internal/url-scope"; import { ParamOrganizationSlug } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import getAIConversationDetails from "./get-agent-conversation-details"; @@ -528,10 +528,10 @@ export default defineTool({ projectSlug: context.constraints.projectSlug, }); - setTag("resource.type", resolved.type); - setOrganizationContext(resolved.organizationSlug); + setTagAndAttribute("resource.type", resolved.type); + setTagAndAttribute("organization.slug", resolved.organizationSlug); if (resolved.spanId) { - setTag("trace.span_id", resolved.spanId); + setTagAndAttribute("trace.span_id", resolved.spanId); } getActiveSpan()?.setAttribute("app.resource.type", resolved.type); diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts index f56995e99..a6cf265f3 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts @@ -1,9 +1,9 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotImage } from "../support/snapshots/handlers"; @@ -74,7 +74,7 @@ export default defineTool({ ); } - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-snapshot.ts index 1978f609c..d75f91a7f 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot.ts @@ -1,10 +1,10 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { formatToolCallInstruction } from "../../internal/tool-helpers/tool-call-formatting"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotSummary } from "../support/snapshots/handlers"; @@ -91,7 +91,7 @@ export default defineTool({ ); } - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-trace-details.ts b/packages/mcp-core/src/tools/catalog/get-trace-details.ts index c1debf7c1..452f48528 100644 --- a/packages/mcp-core/src/tools/catalog/get-trace-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-trace-details.ts @@ -1,5 +1,3 @@ -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; import type { SentryApiService, Trace, TraceSpan } from "../../api-client"; import { UserInputError } from "../../errors"; import { hasAgentProvider } from "../../internal/agents/provider-factory"; @@ -17,6 +15,7 @@ import { ParamSpanId, ParamTraceId, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatSemanticSpanDisplay } from "../support/traces/semantic-display.js"; @@ -131,14 +130,14 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); - setTag("trace.id", params.traceId); + setTagAndAttribute("organization.slug", params.organizationSlug); + setTagAndAttribute("trace.id", params.traceId); if (params.spanId) { - setTag("trace.span_id", params.spanId); + setTagAndAttribute("trace.span_id", params.spanId); } if (context.constraints.projectSlug) { - setTag("project.slug", context.constraints.projectSlug); + setTagAndAttribute("project.slug", context.constraints.projectSlug); } // Get trace metadata for overview diff --git a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts index fe32bdd62..b9d032299 100644 --- a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -10,6 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { compactLines, formatDate } from "./support/api-formatting"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -122,9 +121,9 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); + setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts index bda63513a..abe5cc0a6 100644 --- a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts +++ b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts @@ -1,8 +1,7 @@ import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { - AgenticOnboardingRunTokenSchema, AgenticOnboardingRunStatusUpdateSchema, + AgenticOnboardingRunTokenSchema, AgenticOnboardingStageSchema, AgenticOnboardingStageStatusUpdateSchema, AgenticOnboardingStatusUpdateSchema, @@ -11,6 +10,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; import { ALL_SKILLS } from "../../skills"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; const updateBaseSchema = z @@ -130,7 +130,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); const update = AgenticOnboardingStatusUpdateSchema.parse({ schemaVersion: 1, diff --git a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts index f9a895fb7..5b6800e34 100644 --- a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts +++ b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts @@ -1,18 +1,17 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Team } from "../../api-client/index"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { UserInputError } from "../../errors"; -import type { Team } from "../../api-client/index"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, ParamTeamSlug, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ id: z.string(), @@ -74,9 +73,9 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("team.slug", params.teamSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); + setTagAndAttribute("team.slug", params.teamSlug); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts index 67799199b..52b17fa63 100644 --- a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts +++ b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts @@ -2,20 +2,20 @@ // Sentry's conversation list endpoint and intentionally exposes backend default // ordering until alternate sorting is applied by the API. import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { AIConversationSummary, SentryApiService } from "../../api-client"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamPeriod, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; -import { UserInputError } from "../../errors"; -import { structuredResult } from "../../internal/tool-helpers/results"; -import { isNumericId } from "../../utils/slug-validation"; -import type { AIConversationSummary, SentryApiService } from "../../api-client"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; +import { isNumericId } from "../../utils/slug-validation"; const PREVIEW_LENGTH = 240; const TRACE_ID_SAMPLE_SIZE = 3; @@ -270,7 +270,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const projectIds = await resolveProjectIds({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/search-issue-events.ts b/packages/mcp-core/src/tools/catalog/search-issue-events.ts index 5c997135a..a1b41c9eb 100644 --- a/packages/mcp-core/src/tools/catalog/search-issue-events.ts +++ b/packages/mcp-core/src/tools/catalog/search-issue-events.ts @@ -1,21 +1,21 @@ +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { getActiveSpan, setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import { UserInputError } from "../../errors"; +import { hasAgentProvider } from "../../internal/agents/provider-factory"; +import { withProviderFallback } from "../../internal/agents/provider-fallback"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ensureIssueWithinProjectConstraint } from "../../internal/tool-helpers/issue"; -import type { ServerContext } from "../../types"; import { ParamOrganizationSlug, ParamPeriod, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; -import { hasAgentProvider } from "../../internal/agents/provider-factory"; -import { withProviderFallback } from "../../internal/agents/provider-fallback"; -import { UserInputError } from "../../errors"; -import { searchIssueEventsAgent } from "../support/search-issue-events/agent"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { formatErrorResults } from "../support/search-events/formatters"; +import { searchIssueEventsAgent } from "../support/search-issue-events/agent"; import { RECOMMENDED_FIELDS } from "../support/search-issue-events/config"; import { parseIssueParams } from "../support/search-issue-events/utils"; @@ -143,10 +143,10 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); - setTag("issue.id", issueId); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("issue.id", issueId); if (params.projectSlug) { - setTag("project.slug", params.projectSlug); + setTagAndAttribute("project.slug", params.projectSlug); } await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/search-issues.ts b/packages/mcp-core/src/tools/catalog/search-issues.ts index e158502f2..52471d9dc 100644 --- a/packages/mcp-core/src/tools/catalog/search-issues.ts +++ b/packages/mcp-core/src/tools/catalog/search-issues.ts @@ -1,18 +1,18 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { SEARCH_ISSUES_PERIOD_VALUES } from "../../constants"; import { hasAgentProvider } from "../../internal/agents/provider-factory"; import { withProviderFallback } from "../../internal/agents/provider-fallback"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { searchIssuesAgent } from "../support/search-issues/agent"; import { - formatIssueResults, formatExplanation, + formatIssueResults, } from "../support/search-issues/formatters"; const ProjectSlugOrIdSchema = z.string().trim().superRefine(validateSlugOrId); @@ -120,12 +120,12 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setOrganizationContext(params.organizationSlug); + setTagAndAttribute("organization.slug", params.organizationSlug); if (params.projectSlugOrId) { if (isNumericId(params.projectSlugOrId)) { - setTag("project.id", params.projectSlugOrId); + setTagAndAttribute("project.id", params.projectSlugOrId); } else { - setTag("project.slug", params.projectSlugOrId); + setTagAndAttribute("project.slug", params.projectSlugOrId); } } diff --git a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts index a9cae11cc..8b769df24 100644 --- a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts @@ -1,4 +1,3 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import type { AlertRuleUpdate, IssueAlertRule } from "../../api-client/types"; import { UserInputError } from "../../errors"; @@ -6,25 +5,25 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { isPlainObject } from "../../internal/type-guards"; -import { setOrganizationContext } from "../../telem/organization"; import { ParamOrganizationSlug, ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { - resolveAlertRuleConnections, - validateAlertRuleProjectScope, -} from "../support/alert-rule-connections"; -import { - alertRuleSummarySchema, alertRuleConfigFields, + alertRuleSummarySchema, assertResolvedAlertDestinations, ParamAlertActionFilters, ParamAlertTriggers, toAlertRuleSummary, } from "../support/alert-rule-config"; +import { + resolveAlertRuleConnections, + validateAlertRuleProjectScope, +} from "../support/alert-rule-connections"; import { findExactIssueAlertRuleMatches, isNumericAlertRuleId, @@ -173,8 +172,8 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); let ruleId = params.ruleIdOrName; if (!isNumericAlertRuleId(ruleId)) { const matches = await findExactIssueAlertRuleMatches(apiService, { diff --git a/packages/mcp-core/src/tools/catalog/update-dsn.ts b/packages/mcp-core/src/tools/catalog/update-dsn.ts index 3a8bb63a0..3b89221aa 100644 --- a/packages/mcp-core/src/tools/catalog/update-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/update-dsn.ts @@ -1,15 +1,14 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { UserInputError } from "../../errors"; -import type { ServerContext } from "../../types"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, - ParamRegionUrl, ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; import { validateResourceId } from "../../utils/slug-validation"; export default defineTool({ @@ -137,8 +136,8 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); const hasUpdates = params.name !== undefined || diff --git a/packages/mcp-core/src/tools/catalog/update-issue.ts b/packages/mcp-core/src/tools/catalog/update-issue.ts index d4568891c..c8cc7a9f7 100644 --- a/packages/mcp-core/src/tools/catalog/update-issue.ts +++ b/packages/mcp-core/src/tools/catalog/update-issue.ts @@ -1,30 +1,30 @@ -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; +import type { Issue } from "../../api-client/types"; +import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { formatAssignedTo } from "../../internal/tool-helpers/formatting"; import { assertIssueWithinProjectConstraint, parseIssueParams, } from "../../internal/tool-helpers/issue"; -import { formatAssignedTo } from "../../internal/tool-helpers/formatting"; -import { logIssue } from "../../telem/logging"; -import { UserInputError } from "../../errors"; -import type { Issue } from "../../api-client/types"; -import type { ServerContext } from "../../types"; import { - ParamOrganizationSlug, - ParamRegionUrl, - ParamIssueShortId, - ParamIssueUrl, - ParamIssueStatus, - ParamIssueIgnoreMode, ParamAssignedTo, - ParamIgnoreDurationMinutes, ParamIgnoreCount, - ParamIgnoreWindowMinutes, + ParamIgnoreDurationMinutes, ParamIgnoreUserCount, ParamIgnoreUserWindowMinutes, + ParamIgnoreWindowMinutes, + ParamIssueIgnoreMode, + ParamIssueShortId, + ParamIssueStatus, + ParamIssueUrl, + ParamOrganizationSlug, ParamReason, + ParamRegionUrl, } from "../../schema"; +import { logIssue } from "../../telem/logging"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; type IgnoreMode = | "untilEscalating" @@ -710,7 +710,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setOrganizationContext(orgSlug); + setTagAndAttribute("organization.slug", orgSlug); // Get current issue details first const currentIssue = await apiService.getIssue({ diff --git a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts index 83025eeb9..56da94357 100644 --- a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts @@ -1,9 +1,8 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setOrganizationContext } from "../../telem/organization"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorConfigFields, @@ -52,8 +51,8 @@ export default defineTool({ ...changes } = params; const projectSlug = context.constraints.projectSlug ?? requestedProject; - setOrganizationContext(organizationSlug); - if (projectSlug) setTag("project.slug", projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); const api = apiServiceFromContext(context, { regionUrl: regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/update-project.ts b/packages/mcp-core/src/tools/catalog/update-project.ts index d20f78bba..a623235ba 100644 --- a/packages/mcp-core/src/tools/catalog/update-project.ts +++ b/packages/mcp-core/src/tools/catalog/update-project.ts @@ -1,20 +1,19 @@ import { z } from "zod"; -import { setTag } from "@sentry/core"; -import { setOrganizationContext } from "../../telem/organization"; -import { defineTool } from "../../internal/tool-helpers/define"; -import { apiServiceFromContext } from "../../internal/tool-helpers/api"; -import { structuredResult } from "../../internal/tool-helpers/results"; -import { logIssue } from "../../telem/logging"; -import { UserInputError } from "../../errors"; import { ApiClientError } from "../../api-client"; -import type { ServerContext } from "../../types"; import type { Project } from "../../api-client/index"; +import { UserInputError } from "../../errors"; +import { apiServiceFromContext } from "../../internal/tool-helpers/api"; +import { defineTool } from "../../internal/tool-helpers/define"; +import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, - ParamRegionUrl, - ParamProjectSlug, ParamPlatform, + ParamProjectSlug, + ParamRegionUrl, } from "../../schema"; +import { logIssue } from "../../telem/logging"; +import { setTagAndAttribute } from "../../telem/scope"; +import type { ServerContext } from "../../types"; export const updateProjectOutputSchema = z.object({ project: z.object({ @@ -91,8 +90,8 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); const hasProjectUpdates = params.name || params.slug || params.platform; if (!hasProjectUpdates) { diff --git a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts index aa0916d43..e3d44464d 100644 --- a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts @@ -1,6 +1,4 @@ -import { setTag } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../telem/organization"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; @@ -10,6 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; +import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -106,9 +105,9 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - setTag("project.slug", params.projectSlug); - setTag("uptime.monitor_id", params.uptimeMonitorId); + setTagAndAttribute("organization.slug", organizationSlug); + setTagAndAttribute("project.slug", params.projectSlug); + setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/support/issue-linking/tool.ts b/packages/mcp-core/src/tools/support/issue-linking/tool.ts index 8e29cefc9..e2243f998 100644 --- a/packages/mcp-core/src/tools/support/issue-linking/tool.ts +++ b/packages/mcp-core/src/tools/support/issue-linking/tool.ts @@ -12,7 +12,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../../schema"; -import { setOrganizationContext } from "../../../telem/organization"; +import { setTagAndAttribute } from "../../../telem/scope"; import type { ServerContext } from "../../../types"; export const issueLinkInputSchema = { @@ -68,7 +68,7 @@ export async function resolveIssueLinkContext( const apiService = apiServiceFromContext(context, { regionUrl: context.constraints.regionUrl ?? params.regionUrl ?? undefined, }); - setOrganizationContext(organizationSlug); + setTagAndAttribute("organization.slug", organizationSlug); const issue = await apiService.getIssue({ organizationSlug, issueId }); assertIssueWithinProjectConstraint({ issue, diff --git a/packages/mcp-core/src/tools/support/search-events/search.ts b/packages/mcp-core/src/tools/support/search-events/search.ts index a2147be85..fb5d560c0 100644 --- a/packages/mcp-core/src/tools/support/search-events/search.ts +++ b/packages/mcp-core/src/tools/support/search-events/search.ts @@ -1,6 +1,6 @@ -import { getActiveSpan, setTag } from "@sentry/core"; +import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setOrganizationContext } from "../../../telem/organization"; +import { setTagAndAttribute } from "../../../telem/scope"; import { UserInputError } from "../../../errors"; import { hasAgentProvider } from "../../../internal/agents/provider-factory"; import { withProviderFallback } from "../../../internal/agents/provider-fallback"; @@ -608,8 +608,9 @@ export async function runSearchEvents( }); const organizationSlug = params.organizationSlug; - setOrganizationContext(organizationSlug); - if (params.projectSlug) setTag("project.slug", params.projectSlug); + setTagAndAttribute("organization.slug", organizationSlug); + if (params.projectSlug) + setTagAndAttribute("project.slug", params.projectSlug); const inputDataset = params.dataset ?? "errors"; const hasStructuredQuery = looksLikeSentrySearchSyntax(params.query); diff --git a/packages/mcp-server/src/index.ts b/packages/mcp-server/src/index.ts index 2a771680b..d89e305b5 100644 --- a/packages/mcp-server/src/index.ts +++ b/packages/mcp-server/src/index.ts @@ -20,24 +20,24 @@ * ``` */ -import { buildServer } from "@sentry/mcp-core/server"; -import { startStdio } from "./transports/stdio"; -import * as Sentry from "@sentry/node"; -import { LIB_VERSION } from "@sentry/mcp-core/version"; -import { buildUsage } from "./cli/usage"; -import { printCliLine } from "./cli/output"; -import { parseArgv, parseEnv, merge } from "./cli/parse"; -import { finalize } from "./cli/resolve"; -import { resolveAccessToken } from "./auth/resolve-token"; -import { authCommand } from "./cli/commands/auth"; -import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; -import { SKILLS } from "@sentry/mcp-core/skills"; import { getAgentProvider, + getResolvedProviderType, setAgentProvider, setProviderBaseUrls, - getResolvedProviderType, } from "@sentry/mcp-core/internal/agents/provider-factory"; +import { buildServer } from "@sentry/mcp-core/server"; +import { SKILLS } from "@sentry/mcp-core/skills"; +import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; +import { LIB_VERSION } from "@sentry/mcp-core/version"; +import * as Sentry from "@sentry/node"; +import { resolveAccessToken } from "./auth/resolve-token"; +import { authCommand } from "./cli/commands/auth"; +import { printCliLine } from "./cli/output"; +import { merge, parseArgv, parseEnv } from "./cli/parse"; +import { finalize } from "./cli/resolve"; +import { buildUsage } from "./cli/usage"; +import { startStdio } from "./transports/stdio"; const packageName = "@sentry/mcp-server"; const allSkills = Object.keys(SKILLS) as ReadonlyArray< @@ -276,17 +276,26 @@ async function main() { console.warn(""); } + const scopeContext = { + "app.server.version": LIB_VERSION, + "app.transport": "stdio", + "app.upstream.host": cfg.sentryHost, + "app.url.full": cfg.mcpUrl, + }; + Sentry.init({ dsn: cfg.sentryDsn, tracesSampleRate: 1, beforeSend: sentryBeforeSend, initialScope: { tags: { - "app.server.version": LIB_VERSION, - "app.transport": "stdio", + ...scopeContext, "app.server.mode.experimental": cli.experimental ? "true" : "false", - "app.upstream.host": cfg.sentryHost, - "app.url.full": cfg.mcpUrl, + }, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: { + ...scopeContext, + "app.server.mode.experimental": cli.experimental === true, }, }, release: process.env.SENTRY_RELEASE, diff --git a/packages/mcp-test-client/src/index.ts b/packages/mcp-test-client/src/index.ts index 9fcd8ba7e..282a6c4a5 100644 --- a/packages/mcp-test-client/src/index.ts +++ b/packages/mcp-test-client/src/index.ts @@ -1,25 +1,25 @@ #!/usr/bin/env node +import path from "node:path"; +import { stdin as input, stdout as output } from "node:process"; /** * CLI entry point for MCP QA: loads env, resolves transport/provider, then runs * either tool discovery or the test agent against a single MCP connection. */ import * as readline from "node:readline/promises"; -import { stdin as input, stdout as output } from "node:process"; -import { Command, Option } from "commander"; -import { config } from "dotenv"; -import path from "node:path"; import { fileURLToPath } from "node:url"; -import chalk from "chalk"; +import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; import * as Sentry from "@sentry/node"; -import { connectToMCPServer } from "./mcp-test-client.js"; -import { connectToRemoteMCPServer } from "./mcp-test-client-remote.js"; +import chalk from "chalk"; +import { Command, Option } from "commander"; +import { config } from "dotenv"; import { runAgent } from "./agent.js"; +import { resolveAgentProvider } from "./agent-provider.js"; import { logError, logInfo } from "./logger.js"; -import { sentryBeforeSend } from "@sentry/mcp-core/telem/sentry"; -import type { MCPConnection } from "./types.js"; +import { connectToMCPServer } from "./mcp-test-client.js"; +import { connectToRemoteMCPServer } from "./mcp-test-client-remote.js"; import { resolveTransportMode } from "./transport.js"; -import { resolveAgentProvider } from "./agent-provider.js"; +import type { MCPConnection } from "./types.js"; const __dirname = path.dirname(fileURLToPath(import.meta.url)); const rootDir = path.resolve(__dirname, "../../../"); @@ -70,15 +70,19 @@ program process.env.SENTRY_DSN || process.env.DEFAULT_SENTRY_DSN; + const scopeContext = { + "gen_ai.agent.name": "sentry-mcp-agent", + "gen_ai.provider.name": agentProvider ?? "unknown", + }; + Sentry.init({ dsn: sentryDsn, tracesSampleRate: 1, beforeSend: sentryBeforeSend, initialScope: { - tags: { - "gen_ai.agent.name": "sentry-mcp-agent", - "gen_ai.provider.name": agentProvider ?? "unknown", - }, + tags: scopeContext, + // SDK v11 does not copy scope tags onto streamed spans. + attributes: scopeContext, }, release: process.env.SENTRY_RELEASE, integrations: [ @@ -141,8 +145,9 @@ program }); } - // Set conversation ID as a global tag for all traces + // The tag reaches error events; setConversationId puts the ID on gen_ai spans. Sentry.setTag("gen_ai.conversation.id", connection.sessionId); + Sentry.setConversationId(connection.sessionId); const agentConfig = { model: options.model, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 579f3e6b4..c8c5e4f64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,17 +43,17 @@ catalogs: specifier: ^1.2.3 version: 1.2.3 '@sentry/cloudflare': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/core': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/node': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/react': - specifier: 11.0.0-rc.0 - version: 11.0.0-rc.0 + specifier: 11.1.0 + version: 11.1.0 '@sentry/vite-plugin': specifier: ^4.6.1 version: 4.6.1 @@ -214,7 +214,7 @@ importers: version: 2.13.1 tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -291,7 +291,7 @@ importers: version: 10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940) '@sentry/node': specifier: 10.65.0 - version: 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1) + version: 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) '@sentry/node-core': specifier: 10.63.0 version: 10.63.0(patch_hash=0a5f08471bd72cb833a2b36220c96001d966e5c390d71aaf598fdef75b552640)(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) @@ -465,10 +465,10 @@ importers: version: 1.2.3(@types/react@19.1.8)(react@19.2.8) '@sentry/cloudflare': specifier: 'catalog:' - version: 11.0.0-rc.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5)) + version: 11.1.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5)) '@sentry/react': specifier: 'catalog:' - version: 11.0.0-rc.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) + version: 11.1.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8) agents: specifier: 'catalog:' version: 0.20.1(@ai-sdk/react@3.0.232(react@19.2.8)(zod@4.4.3))(@babel/core@7.28.0)(@babel/runtime@7.28.4)(@cloudflare/workers-types@4.20260405.1)(@modelcontextprotocol/client@2.0.0)(@modelcontextprotocol/sdk@1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3))(@modelcontextprotocol/server@2.0.0)(ai@6.0.64(zod@4.4.3))(chat@4.40.0(ai@6.0.64(zod@4.4.3))(zod@4.4.3))(react@19.2.8)(rolldown@1.0.0-beta.23)(vite@6.3.5(@types/node@24.13.5)(jiti@2.4.2)(lightningcss@1.32.0)(tsx@4.20.3)(yaml@2.8.3))(zod@4.4.3) @@ -607,7 +607,7 @@ importers: version: 2.0.0 '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 ai: specifier: 'catalog:' version: 6.0.64(zod@4.4.3) @@ -653,10 +653,10 @@ importers: version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 '@sentry/node': specifier: 'catalog:' - version: 11.0.0-rc.0(rollup@4.62.4) + version: 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) dotenv: specifier: 'catalog:' version: 16.6.1 @@ -678,7 +678,7 @@ importers: version: 22.16.0 tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -762,13 +762,13 @@ importers: version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3) '@sentry/core': specifier: 'catalog:' - version: 11.0.0-rc.0 + version: 11.1.0 '@sentry/mcp-core': specifier: workspace:* version: link:../mcp-core '@sentry/node': specifier: 'catalog:' - version: 11.0.0-rc.0(rollup@4.62.4) + version: 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) ai: specifier: 'catalog:' version: 6.0.64(zod@4.4.3) @@ -790,7 +790,7 @@ importers: devDependencies: tsdown: specifier: 'catalog:' - version: 0.12.9(supports-color@8.1.1)(typescript@5.8.3) + version: 0.12.9(typescript@5.8.3) tsx: specifier: 'catalog:' version: 4.20.3 @@ -2813,10 +2813,135 @@ packages: '@oslojs/encoding@1.1.0': resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + '@oxc-parser/binding-android-arm-eabi@0.143.0': + resolution: {integrity: sha512-n9uozULWflPqBtdmI8lAabLqGKNgLVNN0ZH8HfgCwpKGNtzRzauB76jTiW/3YLkcA7N1zskpi9GdVnZuu1SAvg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-parser/binding-android-arm64@0.143.0': + resolution: {integrity: sha512-9BbdjHETk6O3zH/DDid9IgBtF0GlpLabNKN231uraXpRDSfY+iiZxTP5bk1Z63GBownVdhdINFIeddmMz4MzpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.143.0': + resolution: {integrity: sha512-gh+6ecoHUy4/sUcolBl/1qPXKBbYNxFY0Pk0ujgQvINTMSftJY7o4yb8gOkDJPeZeB8+a+u7xTe6umoP8N5HFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.143.0': + resolution: {integrity: sha512-qd1hl2d+lXgHv/VQ/M9qm8TrMC5T4RqDBwtOnl+1D0QMjwcz+8AaB4JSg8STgeag0GP6a6L74XEGAsrTSJWNzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.143.0': + resolution: {integrity: sha512-M5XXcNa7aOqLPKTR41msfghKu2yQ4xWvCm11/gwU0JzOzHNk5sgW//rVEjJ+LO48+VDAMzXTSzurUVxIDKwozw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + resolution: {integrity: sha512-T/GXusuOkPNQhCQCSBbcU/N8j0rAypuDBl1IyFK+lyYT594XsVz80clPC/OtbSSpBGyJxj8uYEfctxVuxVYoww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + resolution: {integrity: sha512-oKu4RcBlXSqo3OC62dp6YTnQaZIurNDpCX3BnAM3+bJxt7s8J2TJKMnC0UYer1qhlRaDCg6wkTaTw+2IlsZ12w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + resolution: {integrity: sha512-WJBbD186AZmMGaSIhlktC+rPl8L3peCTXAh88Ih9uEvK0en2mPojGyCGYiL6mHtV1RPV3JyfJW5t6n5hh0lXhA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + resolution: {integrity: sha512-t1AcYOwEzgceadT4v5e+vaCCb0AncCA3v5AyzfBAz/tMq11qzVccXKzNHtkWdjBsgvTKwRkaUF3QvT4kot8vcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + resolution: {integrity: sha512-RsnO/NoD8376LMJq8JS8TwI0ieNaFRTuNe2GVJntQg6gwZNMENZsEbknHdVwjpOmxdGLGodcwaGSbAeRr5Bgjw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + resolution: {integrity: sha512-48fSVfR9TZi5CASZFyv0VC6z6BCoeihFsX031mAD/oSH7d9PYsPgIqza7d9mjP7Z2KTEpTFyH6SIu0Ui6R1vdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + resolution: {integrity: sha512-T8CpdD+SfE01DnIOD4HpVxu0ZJOfMJ/VhCvikKfaXAxkZ+9veyLM/D2hpi7Y2hFUyPmVQO3FNZHmYzV/WlVR4g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + resolution: {integrity: sha512-QLdeMsCcacenPEFsfxnBUDF1y6opyz5+fmOz9bfD5Y7fiGCMupUCuB3KTPQhNwshIG1P9fPqar9MHxuBDd4bwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + resolution: {integrity: sha512-659ujfqLy6k7cuH3sbzhd8b+ztSq+i6E2E9pG78Q0BmHjAExfGIdgc8cGgMdwAozDXeZFHkJ+LXYJdWsaGdgyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + resolution: {integrity: sha512-/Mw/9j4TfZcnKphPrzOE6t4MMknXadcAAuVUlDRTF/ETWB5xOgQvOJV2Mh9We/bWxZdoxaGAdc+hy4GuYwQ2yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + resolution: {integrity: sha512-8rIKWR2BFuifbIK/1XB9wTaSdtuJ25dlE7ZQYDnEwj/2xH2vHsxnvIjHT3ZjSVuLLwGGlSslIG/fbOJ8TV8rTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + resolution: {integrity: sha512-5U9kQYMfRRI6Zq7KDxgbIP0RMnKrfn3gLepRMgJuRkPSUALTiRCk9d/uyhb4lGDjUdzwK7mBkKqhLgzBPCmLpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + resolution: {integrity: sha512-25P7AaHk4R88Yv2XH4gToDVmh0cOu+bEURQU10CRrmvgabfRArSGAP5osmwUKeSUHj0VS50upbpbRWWW/m7mHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + resolution: {integrity: sha512-ORMh3JE1s6V7ySicdRK7vgaDQnn5o+UHg9ct989PlWHbel8O9ARrmWXM6kZjrBMtNucxNayQ8g69G0VfWzhANw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-project/runtime@0.75.0': resolution: {integrity: sha512-gzRmVI/vorsPmbDXt7GD4Uh2lD3rCOku/1xWPB4Yx48k0EP4TZmzQudWapjN4+7Vv+rgXr0RqCHQadeaMvdBuw==} engines: {node: '>=6.9.0'} + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxc-project/types@0.150.0': resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} @@ -3402,16 +3527,16 @@ packages: resolution: {integrity: sha512-yZfdQ87RLat/7retF8zA6Z9zCAT12IyaPvIiu+bbi1E1V1OqDpS8MKNa/6LF69Ap7DVTORi9ITEgjlAqTXF0xQ==} engines: {node: '>=18'} - '@sentry/browser-utils@11.0.0-rc.0': - resolution: {integrity: sha512-Mxate9W4UEkx8Ez+78ygWdxB3KFMVjwXFSd5dwXjHl/Bv/+t375l8JCV1vW5IQ/V5qQBWi/ess/IA4Rq7pmQjQ==} + '@sentry/browser-utils@11.1.0': + resolution: {integrity: sha512-1Bcv2FOKQUXKCSfGmCUMTthQZbmyxoWkiePFQzF7hrchdLlwsgYKJic1t1QwxBMZCBCA+352C4/5tZ9/DWgOVw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/browser@10.75.0': resolution: {integrity: sha512-CKGSJLWISQ6LgMaGnMpY+XvwWQ2iiHTayUs6SGLIvYeaGo2GTjS/Z4pnbCVHb2t1VxLZksyehgcC6ZYGJeQpzQ==} engines: {node: '>=18'} - '@sentry/browser@11.0.0-rc.0': - resolution: {integrity: sha512-S/PSQvvoI0vtwJZt1jUMUJau4cxMH1a+rN8Ul5KOvDHP5P8tGkB5fl7GtHVchlil8JPp5xd4bp7PyFHPkvAPPw==} + '@sentry/browser@11.1.0': + resolution: {integrity: sha512-9uXvMg5U8q6hcyzRUYywDJKdaQu1PqjVoqKJ7owwlLFSXjzYihYnfAUmUUalJUQ7Hibe8PydyOV/8r9aL6m72A==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/bundler-plugin-core@4.6.1': @@ -3430,13 +3555,16 @@ packages: webpack: optional: true - '@sentry/bundler-plugins@11.0.0-rc.0': - resolution: {integrity: sha512-mfRtTo7MNMgAghHsTzcRV5XwdpV+YqdqA4OGgOSRqLEY5H1jxfO8j+orEjUvLk8pCgR4Y1cORsXKqpVXI4nh3w==} + '@sentry/bundler-plugins@11.1.0': + resolution: {integrity: sha512-0p22SeSdyCnr7PaFkSHZnOzc8lpPlkiA+rsjye9JACR9Hd/n7e9Ssvanw19R7LdqS05foYQSViJIsrVbk45Y3w==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: + '@babel/core': ^7.18.5 rollup: '>=3.2.0' - webpack: '>=5.0.0' + webpack: '>=5.1.0' peerDependenciesMeta: + '@babel/core': + optional: true rollup: optional: true webpack: @@ -3546,8 +3674,8 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/cloudflare@11.0.0-rc.0': - resolution: {integrity: sha512-mzhLWRvXn7HrNzTjK2FI9MoSse/MVDxGLQJvKIur/KXZS402fcOURX1n3nBqJfzkgL3rZ1oQAM4eKOF5BY3QkA==} + '@sentry/cloudflare@11.1.0': + resolution: {integrity: sha512-Y/1nNLES7IcHrtkecss381Qpr5NXwdbi6QCNYx2he5FShRRzrIKnpa+N1FByMqJO7joFAmdMj/PgCeG/nJyKEw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: '@cloudflare/workers-types': ^4.x || ^5.x @@ -3570,8 +3698,8 @@ packages: resolution: {integrity: sha512-fO9PLmHdVURcSPUpWCItWAtgKiMwGdJHbovoSEyLplX5sxs2ugvI4CBPTrkkgqhObnZOD0CnWBKDzSVQYBKEyQ==} engines: {node: '>=14'} - '@sentry/conventions@0.23.0': - resolution: {integrity: sha512-+Euyo7CNVecoOusgUnq27oV97oshifgceKfnGnuKfXrPUVWA/cisvii3E1rlvy2yBrKvl9K1gCEo1Jqog5zjEQ==} + '@sentry/conventions@0.24.0': + resolution: {integrity: sha512-pmmF2mLy7A23z8gnLRG87lYu4SSPIBColtfqu9cfkh1omn/0CI3w0/AqZ/uf/VGAtM/wJMN61J58Ks/IWBCHpQ==} engines: {node: '>=14'} '@sentry/core@10.63.0': @@ -3586,8 +3714,8 @@ packages: resolution: {integrity: sha512-5wDQpQqjJ6RHdPR+z6Q+47XlwoxRKBv0yyB0LKHqL/1azPOQbR+nllyLmmQDcoJpaksuLSmLA1q6hFX7gjDT2w==} engines: {node: '>=18'} - '@sentry/core@11.0.0-rc.0': - resolution: {integrity: sha512-6KXLKGq1YgysUIzeD0cYQH/8Tg62V+UJV1d9FVNvKb0HnRgbiO9VWCCm1wGyYSENdGPdSa9zOOnk5ZC7WxLaAw==} + '@sentry/core@11.1.0': + resolution: {integrity: sha512-ObM47oMWxRQiVxUdkV6bs2BeHxPVWim571hw1iT3suyAc8iRfJ27f+QdIdmDKZtvHFGJ0Vh/LpeTZP5Z8FXyEA==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/core@9.34.0': @@ -3598,8 +3726,8 @@ packages: resolution: {integrity: sha512-YLVAFQXELJAOg7ke4oLkd8t5l0fJUockLlTQJg/2Trh7SB5Q4mkSwlnAkEAqDQ618vnpFsG/tnYMwtfZeffHjA==} engines: {node: '>=18'} - '@sentry/feedback@11.0.0-rc.0': - resolution: {integrity: sha512-jb/xd0kxtYM8XVAZtsMxayv27Agv4aWHBumnVT0jxUSNj2eoX5Tfz0PsinV7lcqITZ8HaLeYkUQcll4ANqjX5w==} + '@sentry/feedback@11.1.0': + resolution: {integrity: sha512-ZHZwmJEWcvxJP/rvaJlrO6NFpGHkewsxVmvHLJHkbd1XSChtwgdUI8W/+Gu4jcGXRz0JJPFrpRFNuVTp1QWCjg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/node-core@10.63.0': @@ -3673,8 +3801,8 @@ packages: resolution: {integrity: sha512-XdYW+SEiscQnuugh1hMldfnHurmleKSTSDqgfro6Y1yd7s0r2csnZ5/SEYxIeL4lSl1QXg1lIA1pBmAXjcdnKA==} engines: {node: '>=18'} - '@sentry/node@11.0.0-rc.0': - resolution: {integrity: sha512-hztnJEx8Fcyp0wNJgVbrgWIy9jgkefo7A3c7Y7r7wrCwCl5gKwzzo53XYOkY2lf/rjTLaJCG8b21VjHaFldOZw==} + '@sentry/node@11.1.0': + resolution: {integrity: sha512-8QPZILpVGkggpCe1Qt9VaPQ8UWy6EAVY/94HB2EWqSn6Xx9J7f3pMlncxOQfwv09S7iZDs1Lmfj/Zf7iftinZw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/opentelemetry@10.63.0': @@ -3701,14 +3829,14 @@ packages: '@opentelemetry/core': ^1.30.1 || ^2.1.0 '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@sentry/opentelemetry@11.0.0-rc.0': - resolution: {integrity: sha512-28Yy+Qoo84Ckxu40f2sB/NE+J2uacVkT+rD/GnK3+ExZfW/o2nV7eotIwKUprhoHM1w8EaMQusjZAMTzHc4geQ==} + '@sentry/opentelemetry@11.1.0': + resolution: {integrity: sha512-ZFRwYDSuTIzpS1yOFTMn6p568tQW8k7KIjwzlI8VMOYYAEDkXQK+D/ZUGedSA/iu9fbiZXX+/wFfKqk7AYIiGg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: '@opentelemetry/api': ^1.9.0 - '@sentry/react@11.0.0-rc.0': - resolution: {integrity: sha512-IsXgQ5E6DtIVBhoIxZqkZJqyDgFN8RJX/FrUUwDIDjSCXftK1SZnfPXxPWUE/vF9RBrF0UScqstvOKvJJkq1Mw==} + '@sentry/react@11.1.0': + resolution: {integrity: sha512-Xa+URJBG2r5jE9z5sYEvWA5KmYhtNNTKQXYMYysogGW4WRM8z5xipVo1WLDwDCtA4EqC/ybEVfM7N0Ta3331DQ==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} peerDependencies: react: 17.x || 18.x || 19.x @@ -3721,20 +3849,20 @@ packages: resolution: {integrity: sha512-LNokI5Ud22nZ/o2il/2SfbNIARupWrbS6Mh9jZroZTjD38FN0Oi9vIexj6h1HN81C6+lP2Tmpaj+fl3/wOizzA==} engines: {node: '>=18'} - '@sentry/replay-canvas@11.0.0-rc.0': - resolution: {integrity: sha512-7KSOyhmhRjlMg0NX4P+gNsgaT40uAWhJrI+3hsHxSU1dsvBdylhBzHM3/2Qie5QuFvrdBWqJefeQ5tFs7GCPoQ==} + '@sentry/replay-canvas@11.1.0': + resolution: {integrity: sha512-nHWrcN5B6tkxSNvFkI1xT9llNi3NJfUV5JUGhUTtt9urcL55dIMtT7GSflub2fBtrsE//FzeoL1T3Wt4r8+CMQ==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/replay@10.75.0': resolution: {integrity: sha512-p4xxEo/ayiMZG9tygr09YjqYAd52uq8Qi0EVoRRgUe70nQda0HVPVW519JLq0G+Th/5O5sKME9y1layLU3xlPg==} engines: {node: '>=18'} - '@sentry/replay@11.0.0-rc.0': - resolution: {integrity: sha512-7TIGKTFc0dfmC7uGj4HZ4sRyk25ZuUdvMO8yY4gcflIZfZAE18USE1S9fM+QTmCMlbrPEXgni7Iw2ij4zsxMYQ==} + '@sentry/replay@11.1.0': + resolution: {integrity: sha512-11J/iTBOHqYXQxu9b/KRPxUeHakFdLPnHmDz4hrJ198R4QQQeY245tnYxL8o/1yaQdSo0AMEWJ38lo9GtIWfhg==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} - '@sentry/server-runtime-injection@11.0.0-rc.0': - resolution: {integrity: sha512-x8XppxyzDZxweoHlfsW0l12ghquvp79o2UNXOcXETRb+40ud+RF+YdPtnv4yvsrByXScPkNzKVdJSjxevJCcrA==} + '@sentry/server-runtime-injection@11.1.0': + resolution: {integrity: sha512-tp5ihEibsCQG/qTqL7yqU3PXQLsXM9Nm+ELPMy6hptkyuiOCuDOXpAzthWcSDHVIdBYIC7iUPmpcZihfTXx6Mw==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/server-utils@10.65.0': @@ -3745,8 +3873,8 @@ packages: resolution: {integrity: sha512-7fIa9vFGNzB13hmxl8Sip3xImSkqpc4wETzuQ7CLzVOwPvwI6y/gVEm0pxRhtJSq8SzfOp26eJWl80u8v78Osg==} engines: {node: '>=18'} - '@sentry/server-utils@11.0.0-rc.0': - resolution: {integrity: sha512-0+nsGmRdz8U+U5Cbe52FVfsBztcSY8v7u37id3lsEOktZQi8uJRQShp7BgvD8+ReXEuoVK/L2w7LxzTdtmxQig==} + '@sentry/server-utils@11.1.0': + resolution: {integrity: sha512-5IQtU8SommZyTZgJxZFunQQHay8Vq78D8P0qP9ggQ1hTa6GU6kQKBDDN8eNayUA/Hl2qPei/LAmvmyiZNDIJ0Q==} engines: {node: '>=20.19.0 <22.0.0 || >=22.12.0 <23.0.0 || >=23.2.0'} '@sentry/sqlish@1.0.1': @@ -6651,6 +6779,10 @@ packages: outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + oxc-parser@0.143.0: + resolution: {integrity: sha512-ov0NzaDCOInknS7mP1cwKdJERt3utPW8ldjtdUXQ8Ty0GEFD08wk422vCUN0d7pST6kqtV7dxoI9w1Zi0l/9TA==} + engines: {node: ^20.19.0 || >=22.12.0} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -8485,7 +8617,7 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@anthropic-ai/sdk@0.39.0': dependencies: @@ -8515,10 +8647,10 @@ snapshots: semifies: 1.0.0 source-map: 0.6.1 - '@apm-js-collab/tracing-hooks@0.10.1(supports-color@8.1.1)': + '@apm-js-collab/tracing-hooks@0.10.1': dependencies: '@apm-js-collab/code-transformer': 0.15.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -8748,7 +8880,7 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 @@ -8767,32 +8899,12 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - '@babel/types': 7.28.0 - convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/core@7.28.0(supports-color@8.1.1)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0(supports-color@8.1.1))(supports-color@8.1.1) - '@babel/helpers': 7.27.6 - '@babel/parser': 7.28.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - '@babel/types': 7.28.0 + '@babel/traverse': 7.28.0 + '@babel/types': 7.29.8 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8801,8 +8913,8 @@ snapshots: '@babel/generator@7.28.0': dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -8848,28 +8960,19 @@ snapshots: '@babel/traverse': 8.0.4 '@babel/types': 8.0.4 - '@babel/helper-module-imports@7.27.1(supports-color@8.1.1)': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.0(supports-color@8.1.1) + '@babel/traverse': 7.28.0 '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0(supports-color@8.1.1))(supports-color@8.1.1)': - dependencies: - '@babel/core': 7.28.0(supports-color@8.1.1) - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0(supports-color@8.1.1) + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.28.0 transitivePeerDependencies: - supports-color @@ -8912,7 +9015,7 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/types': 7.29.8 '@babel/parser@7.28.0': dependencies: @@ -8961,8 +9064,8 @@ snapshots: '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@babel/template@8.0.0': dependencies: @@ -8970,15 +9073,15 @@ snapshots: '@babel/parser': 8.0.4 '@babel/types': 8.0.4 - '@babel/traverse@7.28.0(supports-color@8.1.1)': + '@babel/traverse@7.28.0': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.0 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 + '@babel/parser': 7.29.8 '@babel/template': 7.27.2 - '@babel/types': 7.28.0 - debug: 4.4.3(supports-color@8.1.1) + '@babel/types': 7.29.8 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9339,7 +9442,7 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1(supports-color@8.1.1) + '@babel/helper-module-imports': 7.27.1 '@babel/runtime': 7.28.4 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -10268,8 +10371,67 @@ snapshots: '@oslojs/encoding@1.1.0': {} + '@oxc-parser/binding-android-arm-eabi@0.143.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.143.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-ppc64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.143.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.143.0': + optional: true + + '@oxc-parser/binding-openharmony-arm64@0.143.0': + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-ia32-msvc@0.143.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.143.0': + optional: true + '@oxc-project/runtime@0.75.0': {} + '@oxc-project/types@0.143.0': {} + '@oxc-project/types@0.150.0': {} '@oxc-project/types@0.75.0': {} @@ -10663,10 +10825,10 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/browser-utils@11.0.0-rc.0': + '@sentry/browser-utils@11.1.0': dependencies: - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 web-vitals: 6.2.1 '@sentry/browser@10.75.0': @@ -10678,14 +10840,14 @@ snapshots: '@sentry/replay': 10.75.0 '@sentry/replay-canvas': 10.75.0 - '@sentry/browser@11.0.0-rc.0': + '@sentry/browser@11.1.0': dependencies: - '@sentry/browser-utils': 11.0.0-rc.0 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/feedback': 11.0.0-rc.0 - '@sentry/replay': 11.0.0-rc.0 - '@sentry/replay-canvas': 11.0.0-rc.0 + '@sentry/browser-utils': 11.1.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/feedback': 11.1.0 + '@sentry/replay': 11.1.0 + '@sentry/replay-canvas': 11.1.0 '@sentry/bundler-plugin-core@4.6.1': dependencies: @@ -10716,16 +10878,17 @@ snapshots: - encoding - supports-color - '@sentry/bundler-plugins@11.0.0-rc.0(rollup@4.62.4)': + '@sentry/bundler-plugins@11.1.0(@babel/core@7.28.0)(rollup@4.62.4)': dependencies: - '@babel/core': 7.28.0(supports-color@8.1.1) - '@sentry/core': 11.0.0-rc.0 + '@sentry/core': 11.1.0 dotenv: 17.4.2 glob: 13.0.6 magic-string: 0.30.21 + oxc-parser: 0.143.0 sentry: 0.44.1 supports-color: 8.1.1 optionalDependencies: + '@babel/core': 7.28.0 rollup: 4.62.4 '@sentry/cli-darwin@2.58.2': @@ -10816,13 +10979,13 @@ snapshots: - encoding - supports-color - '@sentry/cloudflare@11.0.0-rc.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5))': + '@sentry/cloudflare@11.1.0(@cloudflare/workers-types@4.20260405.1)(wrangler@4.80.0(@cloudflare/workers-types@4.20260405.1)(@types/node@24.13.5))': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/opentelemetry': 11.0.0-rc.0(@opentelemetry/api@1.9.1) - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/opentelemetry': 11.1.0(@opentelemetry/api@1.9.1) + '@sentry/server-utils': 11.1.0 magic-string: 0.30.21 optionalDependencies: '@cloudflare/workers-types': 4.20260405.1 @@ -10834,7 +10997,7 @@ snapshots: '@sentry/conventions@0.16.0': {} - '@sentry/conventions@0.23.0': {} + '@sentry/conventions@0.24.0': {} '@sentry/core@10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940)': {} @@ -10846,9 +11009,9 @@ snapshots: dependencies: '@sentry/conventions': 0.16.0 - '@sentry/core@11.0.0-rc.0': + '@sentry/core@11.1.0': dependencies: - '@sentry/conventions': 0.23.0 + '@sentry/conventions': 0.24.0 '@sentry/core@9.34.0': {} @@ -10856,9 +11019,9 @@ snapshots: dependencies: '@sentry/core': 10.75.0 - '@sentry/feedback@11.0.0-rc.0': + '@sentry/feedback@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 + '@sentry/core': 11.1.0 '@sentry/node-core@10.63.0(patch_hash=0a5f08471bd72cb833a2b36220c96001d966e5c390d71aaf598fdef75b552640)(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1))': dependencies: @@ -10896,7 +11059,7 @@ snapshots: '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) '@opentelemetry/sdk-trace-base': 2.11.0(@opentelemetry/api@1.9.1) - '@sentry/node@10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1)': + '@sentry/node@10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))': dependencies: '@opentelemetry/api': 1.9.1 '@opentelemetry/instrumentation': 0.220.0(@opentelemetry/api@1.9.1) @@ -10905,7 +11068,7 @@ snapshots: '@sentry/core': 10.65.0 '@sentry/node-core': 10.65.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/instrumentation@0.220.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) '@sentry/opentelemetry': 10.65.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@2.11.0(@opentelemetry/api@1.9.1)) - '@sentry/server-utils': 10.65.0(supports-color@8.1.1) + '@sentry/server-utils': 10.65.0 import-in-the-middle: 3.5.1 transitivePeerDependencies: - '@opentelemetry/core' @@ -10928,16 +11091,17 @@ snapshots: - '@opentelemetry/exporter-trace-otlp-http' - supports-color - '@sentry/node@11.0.0-rc.0(rollup@4.62.4)': + '@sentry/node@11.1.0(@babel/core@7.28.0)(rollup@4.62.4)': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/bundler-plugins': 11.0.0-rc.0(rollup@4.62.4) - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 - '@sentry/opentelemetry': 11.0.0-rc.0(@opentelemetry/api@1.9.1) - '@sentry/server-runtime-injection': 11.0.0-rc.0 - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/bundler-plugins': 11.1.0(@babel/core@7.28.0)(rollup@4.62.4) + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 + '@sentry/opentelemetry': 11.1.0(@opentelemetry/api@1.9.1) + '@sentry/server-runtime-injection': 11.1.0 + '@sentry/server-utils': 11.1.0 transitivePeerDependencies: + - '@babel/core' - rollup - webpack @@ -10965,17 +11129,17 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/opentelemetry@11.0.0-rc.0(@opentelemetry/api@1.9.1)': + '@sentry/opentelemetry@11.1.0(@opentelemetry/api@1.9.1)': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 - '@sentry/react@11.0.0-rc.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': + '@sentry/react@11.1.0(react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)': dependencies: - '@sentry/browser': 11.0.0-rc.0 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/browser': 11.1.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 react: 19.2.8 optionalDependencies: react-router: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -10985,31 +11149,31 @@ snapshots: '@sentry/core': 10.75.0 '@sentry/replay': 10.75.0 - '@sentry/replay-canvas@11.0.0-rc.0': + '@sentry/replay-canvas@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 - '@sentry/replay': 11.0.0-rc.0 + '@sentry/core': 11.1.0 + '@sentry/replay': 11.1.0 '@sentry/replay@10.75.0': dependencies: '@sentry/browser-utils': 10.75.0 '@sentry/core': 10.75.0 - '@sentry/replay@11.0.0-rc.0': + '@sentry/replay@11.1.0': dependencies: - '@sentry/browser-utils': 11.0.0-rc.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/browser-utils': 11.1.0 + '@sentry/core': 11.1.0 - '@sentry/server-runtime-injection@11.0.0-rc.0': + '@sentry/server-runtime-injection@11.1.0': dependencies: - '@sentry/core': 11.0.0-rc.0 - '@sentry/server-utils': 11.0.0-rc.0 + '@sentry/core': 11.1.0 + '@sentry/server-utils': 11.1.0 - '@sentry/server-utils@10.65.0(supports-color@8.1.1)': + '@sentry/server-utils@10.65.0': dependencies: '@apm-js-collab/code-transformer': 0.15.0 '@apm-js-collab/code-transformer-bundler-plugins': 0.5.0 - '@apm-js-collab/tracing-hooks': 0.10.1(supports-color@8.1.1) + '@apm-js-collab/tracing-hooks': 0.10.1 '@sentry/conventions': 0.15.1 '@sentry/core': 10.65.0 magic-string: 0.30.21 @@ -11021,11 +11185,11 @@ snapshots: '@sentry/conventions': 0.16.0 '@sentry/core': 10.75.0 - '@sentry/server-utils@11.0.0-rc.0': + '@sentry/server-utils@11.1.0': dependencies: '@opentelemetry/api': 1.9.1 - '@sentry/conventions': 0.23.0 - '@sentry/core': 11.0.0-rc.0 + '@sentry/conventions': 0.24.0 + '@sentry/core': 11.1.0 '@sentry/sqlish@1.0.1(react@19.2.8)': optionalDependencies: @@ -11166,7 +11330,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 '@modelcontextprotocol/sdk': 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.6.5) '@sentry/core': 10.63.0(patch_hash=e663994979ff877a26ab6d4dea5968fbaee4ccdfdeb85623983535a572678940) - '@sentry/node': 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1))(supports-color@8.1.1) + '@sentry/node': 10.65.0(@opentelemetry/core@2.11.0(@opentelemetry/api@1.9.1)) anser: 2.3.5 chalk: 5.6.2 eventsource: 4.1.1 @@ -11578,7 +11742,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -11914,7 +12078,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 http-errors: 2.0.0 iconv-lite: 0.7.0 on-finished: 2.4.1 @@ -12252,11 +12416,9 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.3(supports-color@8.1.1): + debug@4.4.3: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 8.1.1 decode-named-character-reference@1.2.0: dependencies: @@ -12662,7 +12824,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 @@ -12774,7 +12936,7 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -13195,7 +13357,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -14158,7 +14320,7 @@ snapshots: micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -14528,6 +14690,30 @@ snapshots: outvariant@1.4.3: {} + oxc-parser@0.143.0: + dependencies: + '@oxc-project/types': 0.143.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.143.0 + '@oxc-parser/binding-android-arm64': 0.143.0 + '@oxc-parser/binding-darwin-arm64': 0.143.0 + '@oxc-parser/binding-darwin-x64': 0.143.0 + '@oxc-parser/binding-freebsd-x64': 0.143.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.143.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.143.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.143.0 + '@oxc-parser/binding-linux-arm64-musl': 0.143.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.143.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.143.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-gnu': 0.143.0 + '@oxc-parser/binding-linux-x64-musl': 0.143.0 + '@oxc-parser/binding-openharmony-arm64': 0.143.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.143.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.143.0 + '@oxc-parser/binding-win32-x64-msvc': 0.143.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -15040,7 +15226,7 @@ snapshots: require-in-the-middle@8.0.1: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 module-details-from-path: 1.0.4 transitivePeerDependencies: - supports-color @@ -15100,14 +15286,14 @@ snapshots: rfdc@1.4.1: {} - rolldown-plugin-dts@0.13.13(rolldown@1.0.0-beta.23)(supports-color@8.1.1)(typescript@5.8.3): + rolldown-plugin-dts@0.13.13(rolldown@1.0.0-beta.23)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.0 '@babel/parser': 7.28.0 '@babel/types': 7.28.0 ast-kit: 2.1.1 birpc: 2.4.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 rolldown: 1.0.0-beta.23 @@ -15124,7 +15310,7 @@ snapshots: '@babel/types': 7.28.0 ast-kit: 2.1.1 birpc: 2.4.0 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 dts-resolver: 2.1.1 get-tsconfig: 4.10.1 rolldown: 1.0.0-beta.23 @@ -15209,7 +15395,7 @@ snapshots: router@2.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -15282,7 +15468,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -15721,17 +15907,17 @@ snapshots: dependencies: typescript: 5.7.3 - tsdown@0.12.9(supports-color@8.1.1)(typescript@5.8.3): + tsdown@0.12.9(typescript@5.8.3): dependencies: ansis: 4.1.0 cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 rolldown: 1.0.0-beta.23 - rolldown-plugin-dts: 0.13.13(rolldown@1.0.0-beta.23)(supports-color@8.1.1)(typescript@5.8.3) + rolldown-plugin-dts: 0.13.13(rolldown@1.0.0-beta.23)(typescript@5.8.3) semver: 7.7.4 tinyexec: 1.0.4 tinyglobby: 0.2.15 @@ -15749,7 +15935,7 @@ snapshots: ansis: 4.1.0 cac: 6.7.14 chokidar: 4.0.3 - debug: 4.4.3(supports-color@8.1.1) + debug: 4.4.3 diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c8af0b1f4..aec5e43f7 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -47,10 +47,10 @@ catalog: "@modelcontextprotocol/server": 2.0.0 "@radix-ui/react-accordion": ^1.2.20 "@radix-ui/react-slot": ^1.2.3 - "@sentry/cloudflare": 11.0.0-rc.0 - "@sentry/core": 11.0.0-rc.0 - "@sentry/node": 11.0.0-rc.0 - "@sentry/react": 11.0.0-rc.0 + "@sentry/cloudflare": 11.1.0 + "@sentry/core": 11.1.0 + "@sentry/node": 11.1.0 + "@sentry/react": 11.1.0 "@sentry/vite-plugin": ^4.6.1 "@tailwindcss/typography": ^0.5.16 "@tailwindcss/vite": ^4.3.3 @@ -99,16 +99,16 @@ minimumReleaseAgeExclude: - '@ai-sdk/react@3.0.232' - ai@6.0.230 - agents@0.20.1 - - '@sentry/browser-utils@11.0.0-rc.0' - - '@sentry/browser@11.0.0-rc.0' - - '@sentry/bundler-plugins@11.0.0-rc.0' - - '@sentry/cloudflare@11.0.0-rc.0' - - '@sentry/core@11.0.0-rc.0' - - '@sentry/feedback@11.0.0-rc.0' - - '@sentry/node@11.0.0-rc.0' - - '@sentry/opentelemetry@11.0.0-rc.0' - - '@sentry/react@11.0.0-rc.0' - - '@sentry/replay-canvas@11.0.0-rc.0' - - '@sentry/replay@11.0.0-rc.0' - - '@sentry/server-runtime-injection@11.0.0-rc.0' - - '@sentry/server-utils@11.0.0-rc.0' + - '@sentry/browser-utils@11.1.0' + - '@sentry/browser@11.1.0' + - '@sentry/bundler-plugins@11.1.0' + - '@sentry/cloudflare@11.1.0' + - '@sentry/core@11.1.0' + - '@sentry/feedback@11.1.0' + - '@sentry/node@11.1.0' + - '@sentry/opentelemetry@11.1.0' + - '@sentry/react@11.1.0' + - '@sentry/replay-canvas@11.1.0' + - '@sentry/replay@11.1.0' + - '@sentry/server-runtime-injection@11.1.0' + - '@sentry/server-utils@11.1.0' From b60635f1ffbd37db6d4921c29beeb4da65ffbebd Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Fri, 2 Oct 2026 10:39:44 +0200 Subject: [PATCH 2/3] fixup! chore: Update SDK to v11.1.0 and migrate tags to attributes --- docs/contributing/adding-tools.md | 3 +- docs/operations/monitoring.md | 26 +++-- packages/mcp-core/src/server.test.ts | 2 + packages/mcp-core/src/server.ts | 29 +++-- packages/mcp-core/src/telem/scope.test.ts | 110 +++++++++++++++++- packages/mcp-core/src/telem/scope.ts | 75 +++++++++++- .../src/tools/catalog/add-issue-note.ts | 8 +- .../src/tools/catalog/add-team-to-project.ts | 6 +- .../tools/catalog/analyze-issue-with-seer.ts | 4 +- .../src/tools/catalog/create-alert-rule.ts | 4 +- .../mcp-core/src/tools/catalog/create-dsn.ts | 5 +- .../tools/catalog/create-metric-monitor.ts | 5 +- .../src/tools/catalog/create-project.ts | 5 +- .../mcp-core/src/tools/catalog/create-team.ts | 4 +- .../tools/catalog/create-uptime-monitor.ts | 5 +- .../src/tools/catalog/delete-alert-rule.ts | 4 +- .../tools/catalog/delete-metric-monitor.ts | 4 +- .../tools/catalog/delete-uptime-monitor.ts | 6 +- .../src/tools/catalog/find-alert-rules.ts | 7 +- .../src/tools/catalog/find-dashboards.ts | 11 +- .../mcp-core/src/tools/catalog/find-dsns.ts | 5 +- .../src/tools/catalog/find-metric-monitors.ts | 8 +- .../src/tools/catalog/find-monitors.ts | 7 +- .../src/tools/catalog/find-projects.ts | 4 +- .../src/tools/catalog/find-releases.ts | 4 +- .../mcp-core/src/tools/catalog/find-teams.ts | 4 +- .../src/tools/catalog/find-uptime-monitors.ts | 8 +- .../catalog/get-agent-conversation-details.ts | 8 +- .../src/tools/catalog/get-alert-options.ts | 4 +- .../src/tools/catalog/get-alert-rule.ts | 7 +- .../tools/catalog/get-dashboard-details.ts | 11 +- .../mcp-core/src/tools/catalog/get-doc.ts | 6 +- .../src/tools/catalog/get-event-attachment.ts | 4 +- .../src/tools/catalog/get-event-stacktrace.ts | 5 +- .../src/tools/catalog/get-issue-activity.ts | 8 +- .../tools/catalog/get-issue-breadcrumbs.ts | 8 +- .../src/tools/catalog/get-issue-details.ts | 6 +- .../src/tools/catalog/get-issue-tag-values.ts | 4 +- .../tools/catalog/get-issue-user-reports.ts | 8 +- .../tools/catalog/get-latest-base-snapshot.ts | 11 +- .../catalog/get-metric-monitor-details.ts | 8 +- .../src/tools/catalog/get-monitor-details.ts | 16 +-- .../src/tools/catalog/get-profile-details.ts | 26 +++-- .../mcp-core/src/tools/catalog/get-profile.ts | 27 +++-- .../src/tools/catalog/get-release-details.ts | 19 ++- .../src/tools/catalog/get-replay-details.ts | 8 +- .../src/tools/catalog/get-sentry-resource.ts | 16 +-- .../src/tools/catalog/get-snapshot-image.ts | 4 +- .../src/tools/catalog/get-snapshot.ts | 4 +- .../src/tools/catalog/get-trace-details.ts | 17 ++- .../catalog/get-uptime-monitor-details.ts | 6 +- .../tools/catalog/onboarding-status-update.ts | 4 +- .../tools/catalog/remove-team-from-project.ts | 6 +- .../catalog/search-agent-conversations.ts | 4 +- .../src/tools/catalog/search-issue-events.ts | 12 +- .../src/tools/catalog/search-issues.ts | 11 +- .../src/tools/catalog/update-alert-rule.ts | 5 +- .../mcp-core/src/tools/catalog/update-dsn.ts | 5 +- .../src/tools/catalog/update-issue.ts | 4 +- .../tools/catalog/update-metric-monitor.ts | 5 +- .../src/tools/catalog/update-project.ts | 5 +- .../tools/catalog/update-uptime-monitor.ts | 6 +- .../src/tools/support/issue-linking/tool.ts | 4 +- .../src/tools/support/search-events/search.ts | 6 +- 64 files changed, 429 insertions(+), 252 deletions(-) diff --git a/docs/contributing/adding-tools.md b/docs/contributing/adding-tools.md index 6254ca6ae..bfce2fd22 100644 --- a/docs/contributing/adding-tools.md +++ b/docs/contributing/adding-tools.md @@ -166,8 +166,7 @@ async handler(params, context: ServerContext) { // 3. Set telemetry context for streamed spans and error events // Import from ../../telem/scope. - setTagAndAttribute("organization.slug", params.organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); // 4. Call API const data = await api.yourMethod(params); diff --git a/docs/operations/monitoring.md b/docs/operations/monitoring.md index f674a6bc9..00215d644 100644 --- a/docs/operations/monitoring.md +++ b/docs/operations/monitoring.md @@ -46,15 +46,23 @@ export async function createTracedToolHandler( ### Request Context -Use `setTagAndAttribute(key, value)` from `src/telem/scope.ts` for request -values that must be searchable, such as `organization.slug`, `project.slug`, -or `issue.id`. It sets the value as a scope attribute for streamed spans, -logs, and metrics, and as a tag for errors. SDK v11 no longer copies scope -tags onto spans, so do not call `setTag` from `@sentry/core` alone. - -Set `organization.slug` after resolving the organization, including from -URLs. For values set at startup, put the same keys in both -`initialScope.tags` and `initialScope.attributes` of `Sentry.init`. +Call `setTargetTagsAndAttributes()` from `src/telem/scope.ts` after +resolving the organization, including from URLs. It sets the Sentry +resources that the tool call targets as scope attributes for streamed spans, +logs, and metrics, and as tags for errors. It requires `organizationSlug`. +All other `Target` fields are optional, such as `projectSlug`, `teamSlug`, +`issueId`, or `traceId`, so a tool can pass its `params` directly when they +use these names. A numeric `projectSlugOrId` becomes `project.id`, any other +value `project.slug`. To send a new kind of resource, add a field to +`Target` and its key to `targetKeys`. + +For other searchable values that are not a target, such as `client.id` or +`doc.path`, put the keys in one object and pass it to both `setTags` and +`setAttributes` from `@sentry/core`. SDK v11 no longer copies scope tags +onto spans, so do not call `setTag` alone. + +For values set at startup, put the same keys in both `initialScope.tags` and +`initialScope.attributes` of `Sentry.init`. ### Span Management diff --git a/packages/mcp-core/src/server.test.ts b/packages/mcp-core/src/server.test.ts index 3370d3a23..57c0cb4de 100644 --- a/packages/mcp-core/src/server.test.ts +++ b/packages/mcp-core/src/server.test.ts @@ -28,7 +28,9 @@ import { LIB_VERSION } from "./version"; // Mock the Sentry core module vi.mock("@sentry/core", () => ({ setTag: vi.fn(), + setTags: vi.fn(), setAttribute: vi.fn(), + setAttributes: vi.fn(), setUser: vi.fn(), getActiveSpan: vi.fn(), startSpan: vi.fn(), diff --git a/packages/mcp-core/src/server.ts b/packages/mcp-core/src/server.ts index e05c2b843..56c1e1be1 100644 --- a/packages/mcp-core/src/server.ts +++ b/packages/mcp-core/src/server.ts @@ -21,7 +21,13 @@ import { McpServer as LegacyMcpServer } from "@modelcontextprotocol/sdk/server/m */ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js"; import { McpServer as ModernMcpServer } from "@modelcontextprotocol/server"; -import { getActiveSpan, type SpanAttributeValue, setUser } from "@sentry/core"; +import { + getActiveSpan, + type SpanAttributeValue, + setUser, + setAttributes, + setTags, +} from "@sentry/core"; import { wrapMcpServerWithSentry } from "@sentry/core/server"; import { isApiAuthenticationErrorDeep } from "./api-client"; import { MCP_SERVER_NAME } from "./constants"; @@ -32,7 +38,6 @@ import { } from "./internal/error-handling"; import type { Skill } from "./skills"; import { type LogIssueOptions, logIssue } from "./telem/logging"; -import { setTagAndAttribute } from "./telem/scope"; import { executeToolHandler, getAvailableTools, @@ -297,16 +302,16 @@ function configureServer({ }; setUser(user); } - if (context.clientId) { - setTagAndAttribute("client.id", context.clientId); - } - if (context.clientFamily) { - setTagAndAttribute("app.client.family", context.clientFamily); - } - if (context.transport) { - setTagAndAttribute("app.transport", context.transport); - } - setTagAndAttribute("app.server.mode.experimental", experimentalMode); + const requestContext = { + ...(context.clientId ? { "client.id": context.clientId } : {}), + ...(context.clientFamily + ? { "app.client.family": context.clientFamily } + : {}), + ...(context.transport ? { "app.transport": context.transport } : {}), + "app.server.mode.experimental": experimentalMode, + }; + setTags(requestContext); + setAttributes(requestContext); // Hoisted so both the handler path and the catch (onError) share one // narrowing instead of re-casting `params`. diff --git a/packages/mcp-core/src/telem/scope.test.ts b/packages/mcp-core/src/telem/scope.test.ts index 8ef61c936..d53e5f59a 100644 --- a/packages/mcp-core/src/telem/scope.test.ts +++ b/packages/mcp-core/src/telem/scope.test.ts @@ -14,15 +14,41 @@ import { buildServer } from "../server"; import { getServerContext } from "../test-setup"; import findProjects from "../tools/catalog/find-projects"; import type { ServerContext } from "../types"; +import { type Target, setTargetTagsAndAttributes } from "./scope"; const beforeSendSpan = vi.fn((span: StreamedSpanJSON) => span); const beforeSend = vi.fn((event: ErrorEvent) => event); let sentry: ServerRuntimeClient; +// Without an async context strategy, withIsolationScope does not fork the +// isolation scope, so values set by one test stay there for the next one. +function resetScopeContext(): void { + const scope = getIsolationScope(); + for (const key of [ + "organization.slug", + "project.slug", + "project.id", + "team.slug", + "issue.id", + "trace.id", + "trace.span_id", + "monitor.slug", + "uptime.monitor_id", + "release.version", + "replay.id", + "profile.id", + "profiler.id", + "ai_conversation.id", + "client.id", + ]) { + scope.setAttribute(key, undefined); + scope.setTag(key, undefined); + } +} + beforeEach(() => { vi.clearAllMocks(); - getIsolationScope().setAttribute("organization.slug", undefined); - getIsolationScope().setTag("organization.slug", undefined); + resetScopeContext(); sentry = new ServerRuntimeClient({ dsn: "https://public@example.com/1", integrations: [], @@ -42,8 +68,7 @@ beforeEach(() => { afterEach(async () => { await sentry.close(); getCurrentScope().setClient(undefined); - getIsolationScope().setAttribute("organization.slug", undefined); - getIsolationScope().setTag("organization.slug", undefined); + resetScopeContext(); }); async function callTool( @@ -165,3 +190,80 @@ describe("request and tool telemetry", () => { ); }); }); + +describe("setTargetTagsAndAttributes", () => { + function scopeValuesFor(target: Target) { + setTargetTagsAndAttributes(target); + const { tags, attributes } = getIsolationScope().getScopeData(); + return { tags, attributes }; + } + + it("sets every target field as a tag and an attribute", () => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlug: "javascript", + projectId: 42, + teamSlug: "sdk", + issueId: "JAVASCRIPT-1", + traceId: "a".repeat(32), + spanId: "b".repeat(16), + monitorSlug: "nightly", + uptimeMonitorId: "7", + releaseVersion: "1.0.0", + replayId: "c".repeat(32), + profileId: "d".repeat(32), + profilerId: "e".repeat(32), + aiConversationId: "conversation-1", + }); + const expected = { + "organization.slug": "sentry", + "project.slug": "javascript", + "project.id": "42", + "team.slug": "sdk", + "issue.id": "JAVASCRIPT-1", + "trace.id": "a".repeat(32), + "trace.span_id": "b".repeat(16), + "monitor.slug": "nightly", + "uptime.monitor_id": "7", + "release.version": "1.0.0", + "replay.id": "c".repeat(32), + "profile.id": "d".repeat(32), + "profiler.id": "e".repeat(32), + "ai_conversation.id": "conversation-1", + }; + expect(tags).toMatchObject(expected); + expect(attributes).toMatchObject(expected); + }); + + it.each([ + { projectSlugOrId: "42", key: "project.id", other: "project.slug" }, + { projectSlugOrId: "javascript", key: "project.slug", other: "project.id" }, + ])( + "maps projectSlugOrId $projectSlugOrId to $key", + ({ projectSlugOrId, key, other }) => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlugOrId, + }); + expect(tags[key]).toBe(projectSlugOrId); + expect(attributes[key]).toBe(projectSlugOrId); + expect(tags[other]).toBeUndefined(); + expect(attributes[other]).toBeUndefined(); + }, + ); + + it("skips empty project and team values", () => { + const { tags, attributes } = scopeValuesFor({ + organizationSlug: "sentry", + projectSlug: null, + projectId: undefined, + projectSlugOrId: "", + teamSlug: null, + }); + for (const key of ["project.slug", "project.id", "team.slug"]) { + expect(tags[key]).toBeUndefined(); + expect(attributes[key]).toBeUndefined(); + } + expect(attributes["organization.slug"]).toBe("sentry"); + }); +}); diff --git a/packages/mcp-core/src/telem/scope.ts b/packages/mcp-core/src/telem/scope.ts index ac2efd865..77bff4a64 100644 --- a/packages/mcp-core/src/telem/scope.ts +++ b/packages/mcp-core/src/telem/scope.ts @@ -1,14 +1,81 @@ import { setAttribute, setTag } from "@sentry/core"; +import { isNumericId } from "../utils/slug-validation"; + +/** + * The Sentry resources that a tool call targets. Each field with a value is + * sent as a tag and an attribute, for example `issueId` as `issue.id`. + * `targetKeys` holds the key for each field. + */ +export interface Target { + organizationSlug: string; + projectSlug?: string | null; + /** Numeric project ID. */ + projectId?: string | number | null; + /** + * Project reference as the user gave it: a numeric value is sent as + * `project.id`, any other value as `project.slug`. + */ + projectSlugOrId?: string | null; + teamSlug?: string | null; + issueId?: string | null; + traceId?: string | null; + /** Span ID inside `traceId`. */ + spanId?: string | null; + monitorSlug?: string | null; + uptimeMonitorId?: string | null; + releaseVersion?: string | null; + replayId?: string | null; + profileId?: string | null; + profilerId?: string | null; + /** ID of the AI agent conversation that the tool reads. */ + aiConversationId?: string | null; +} + +const targetKeys = { + teamSlug: "team.slug", + issueId: "issue.id", + traceId: "trace.id", + spanId: "trace.span_id", + monitorSlug: "monitor.slug", + uptimeMonitorId: "uptime.monitor_id", + releaseVersion: "release.version", + replayId: "replay.id", + profileId: "profile.id", + profilerId: "profiler.id", + aiConversationId: "ai_conversation.id", +} as const satisfies Partial>; /** * Sets `key` on the isolation scope as a tag for error events and as an * attribute for streamed spans, logs, and metrics. SDK v11 does not copy * scope tags onto spans. */ -export function setTagAndAttribute( - key: string, - value: string | number | boolean, -): void { +function setTagAndAttribute(key: string, value: string): void { setAttribute(key, value); setTag(key, value); } + +/** + * Sets each `Target` field that has a value as a tag and as an attribute: + * `organization.slug`, `project.slug`, `project.id`, and the keys in + * `targetKeys`. Accepts tool `params` directly when they use these field + * names. + */ +export function setTargetTagsAndAttributes(target: Target): void { + const { organizationSlug, projectSlugOrId } = target; + const isProjectId = projectSlugOrId ? isNumericId(projectSlugOrId) : false; + const projectSlug = + target.projectSlug ?? (isProjectId ? undefined : projectSlugOrId); + const projectId = + target.projectId ?? (isProjectId ? projectSlugOrId : undefined); + + setTagAndAttribute("organization.slug", organizationSlug); + if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + if (projectId != null && projectId !== "") { + setTagAndAttribute("project.id", String(projectId)); + } + for (const [field, key] of Object.entries(targetKeys)) { + const value = target[field as keyof typeof targetKeys]; + if (value) setTagAndAttribute(key, value); + } +} diff --git a/packages/mcp-core/src/tools/catalog/add-issue-note.ts b/packages/mcp-core/src/tools/catalog/add-issue-note.ts index 09533d690..1a0403c69 100644 --- a/packages/mcp-core/src/tools/catalog/add-issue-note.ts +++ b/packages/mcp-core/src/tools/catalog/add-issue-note.ts @@ -12,7 +12,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatActor, @@ -85,8 +85,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", parsed.organizationSlug); - setTagAndAttribute("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts index e8d6762c5..accfeec91 100644 --- a/packages/mcp-core/src/tools/catalog/add-team-to-project.ts +++ b/packages/mcp-core/src/tools/catalog/add-team-to-project.ts @@ -9,7 +9,7 @@ import { ParamRegionUrl, ParamTeamSlug, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ @@ -71,9 +71,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); - setTagAndAttribute("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts index dcbe2bd55..20da93674 100644 --- a/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts +++ b/packages/mcp-core/src/tools/catalog/analyze-issue-with-seer.ts @@ -27,7 +27,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export default defineTool({ @@ -102,7 +102,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setTagAndAttribute("organization.slug", orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); const issue = await apiService.getIssue({ organizationSlug: orgSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts index 81f63bd01..1501ede5b 100644 --- a/packages/mcp-core/src/tools/catalog/create-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/create-alert-rule.ts @@ -8,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { alertRuleConfigFields, @@ -76,7 +76,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); const project = context.constraints.projectSlug ? await api.getProject({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-dsn.ts b/packages/mcp-core/src/tools/catalog/create-dsn.ts index f17105b25..8606e2439 100644 --- a/packages/mcp-core/src/tools/catalog/create-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/create-dsn.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const createDsnOutputSchema = z.object({ @@ -67,8 +67,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const clientKey = await apiService.createClientKey({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts index 874177bec..c7748fc5a 100644 --- a/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-metric-monitor.ts @@ -8,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorCreateFields, @@ -59,8 +59,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const { timeWindowSeconds, ...query } = params.query; const body = { type: "metric_issue" as const, diff --git a/packages/mcp-core/src/tools/catalog/create-project.ts b/packages/mcp-core/src/tools/catalog/create-project.ts index c5aa8ea15..520b0d257 100644 --- a/packages/mcp-core/src/tools/catalog/create-project.ts +++ b/packages/mcp-core/src/tools/catalog/create-project.ts @@ -11,7 +11,7 @@ import { ParamTeamSlug, } from "../../schema"; import { logWarn } from "../../telem/logging"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; type RepositoryMatch = { @@ -173,8 +173,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); // Resolve repository intent before creating the project so bad or ambiguous // repo input cannot leave behind an otherwise unwanted project. diff --git a/packages/mcp-core/src/tools/catalog/create-team.ts b/packages/mcp-core/src/tools/catalog/create-team.ts index 7b624515d..17de91822 100644 --- a/packages/mcp-core/src/tools/catalog/create-team.ts +++ b/packages/mcp-core/src/tools/catalog/create-team.ts @@ -3,7 +3,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const createTeamOutputSchema = z.object({ @@ -56,7 +56,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const team = await apiService.createTeam({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts index 54b189e10..9d1394f25 100644 --- a/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/create-uptime-monitor.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -101,8 +101,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts index 01dce283b..bf38c714f 100644 --- a/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/delete-alert-rule.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { validateAlertRuleProjectScope } from "../support/alert-rule-connections"; @@ -48,7 +48,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); await validateAlertRuleProjectScope(api, { organizationSlug: params.organizationSlug, ruleId: params.ruleId, diff --git a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts index 4b3378b47..9b829c96e 100644 --- a/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-metric-monitor.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -32,7 +32,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); await getMetricMonitor(api, { ...params, scopedProjectSlug: context.constraints.projectSlug, diff --git a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts index 50ae97e9b..1892ccb77 100644 --- a/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/delete-uptime-monitor.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -54,9 +54,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); - setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts index bc14620cd..7d4d17ef1 100644 --- a/packages/mcp-core/src/tools/catalog/find-alert-rules.ts +++ b/packages/mcp-core/src/tools/catalog/find-alert-rules.ts @@ -9,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitorReference, @@ -173,10 +173,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - if (projectSlug) { - setTagAndAttribute("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const includeIssue = params.kind !== "metric"; const includeMetric = params.kind !== "issue"; diff --git a/packages/mcp-core/src/tools/catalog/find-dashboards.ts b/packages/mcp-core/src/tools/catalog/find-dashboards.ts index d4d264cc0..1952730df 100644 --- a/packages/mcp-core/src/tools/catalog/find-dashboards.ts +++ b/packages/mcp-core/src/tools/catalog/find-dashboards.ts @@ -5,7 +5,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { filterDashboardsByProjectConstraint, @@ -284,7 +284,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -292,8 +292,11 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTagAndAttribute("project.slug", scopedProject.slug); - setTagAndAttribute("project.id", String(scopedProject.id)); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: scopedProject.slug, + projectId: scopedProject.id, + }); } let dashboards: DashboardListItem[]; diff --git a/packages/mcp-core/src/tools/catalog/find-dsns.ts b/packages/mcp-core/src/tools/catalog/find-dsns.ts index af69e0d99..f9886986a 100644 --- a/packages/mcp-core/src/tools/catalog/find-dsns.ts +++ b/packages/mcp-core/src/tools/catalog/find-dsns.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const findDsnsOutputSchema = z.object({ @@ -52,8 +52,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const clientKeys = await apiService.listClientKeys({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts index c6eb80cb1..6df392174 100644 --- a/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-metric-monitors.ts @@ -7,7 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { listMetricMonitors, @@ -67,8 +67,10 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProject; - setTagAndAttribute("organization.slug", params.organizationSlug); - if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug, + }); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/find-monitors.ts b/packages/mcp-core/src/tools/catalog/find-monitors.ts index ddfb5a761..fcc88c217 100644 --- a/packages/mcp-core/src/tools/catalog/find-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-monitors.ts @@ -8,7 +8,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -196,7 +196,6 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" ? params.projectSlug @@ -209,9 +208,7 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; - if (projectSlug) { - setTagAndAttribute("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const monitors = await apiService.listMonitors({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-projects.ts b/packages/mcp-core/src/tools/catalog/find-projects.ts index c7d0d97a8..e0d7cdb2f 100644 --- a/packages/mcp-core/src/tools/catalog/find-projects.ts +++ b/packages/mcp-core/src/tools/catalog/find-projects.ts @@ -10,7 +10,7 @@ import { ParamSearchQuery, } from "../../schema"; import { ALL_SKILLS } from "../../skills"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const { projects, nextCursor } = await apiService.listProjects( organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-releases.ts b/packages/mcp-core/src/tools/catalog/find-releases.ts index 90c8532d8..2f5c40b86 100644 --- a/packages/mcp-core/src/tools/catalog/find-releases.ts +++ b/packages/mcp-core/src/tools/catalog/find-releases.ts @@ -7,7 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -98,7 +98,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const releases = await apiService.listReleases({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/find-teams.ts b/packages/mcp-core/src/tools/catalog/find-teams.ts index d29dd2f6d..55dcea1c0 100644 --- a/packages/mcp-core/src/tools/catalog/find-teams.ts +++ b/packages/mcp-core/src/tools/catalog/find-teams.ts @@ -9,7 +9,7 @@ import { ParamRegionUrl, ParamSearchQuery, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const RESULT_LIMIT = 25; @@ -63,7 +63,7 @@ export default defineTool({ ); } - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const { teams, nextCursor } = await apiService.listTeams(organizationSlug, { query: params.query ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts index ee1911ad5..61405b4a7 100644 --- a/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts +++ b/packages/mcp-core/src/tools/catalog/find-uptime-monitors.ts @@ -7,7 +7,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -84,8 +84,6 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - const requestedProjectSlug = params.projectSlug && params.projectSlug !== "all" ? params.projectSlug @@ -98,9 +96,7 @@ export default defineTool({ }); } const projectSlug = context.constraints.projectSlug ?? requestedProjectSlug; - if (projectSlug) { - setTagAndAttribute("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const monitors = await apiService.listUptimeMonitors({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts index d5719c13f..601ba33c9 100644 --- a/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-agent-conversation-details.ts @@ -8,7 +8,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; type ToolCall = { @@ -703,8 +703,10 @@ export default defineTool({ outputSchema: aiConversationDetailsOutputSchema, async handler(params, context: ServerContext) { - setTagAndAttribute("organization.slug", params.organizationSlug); - setTagAndAttribute("ai_conversation.id", params.conversationId); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + aiConversationId: params.conversationId, + }); if ((params.start && !params.end) || (!params.start && params.end)) { throw new UserInputError("`start` and `end` must be provided together."); diff --git a/packages/mcp-core/src/tools/catalog/get-alert-options.ts b/packages/mcp-core/src/tools/catalog/get-alert-options.ts index 2fd55e656..9550dffeb 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-options.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-options.ts @@ -12,7 +12,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -145,7 +145,7 @@ export default defineTool({ const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const pageParams = { organizationSlug, cursor: params.cursor ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts index e9acca95c..039527f68 100644 --- a/packages/mcp-core/src/tools/catalog/get-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/get-alert-rule.ts @@ -9,7 +9,7 @@ import { ParamProjectSlugOrAll, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getAlertRuleDetails } from "../support/alert-rule-details"; import { @@ -105,10 +105,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - if (projectSlug) { - setTagAndAttribute("project.slug", projectSlug); - } + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); let match: AlertRuleMatch; if (params.kind === "issue") { diff --git a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts index a97f08759..febb61981 100644 --- a/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-dashboard-details.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertDashboardWithinProjectConstraint, @@ -54,7 +54,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const scopedProject = await resolveDashboardProjectConstraint({ apiService, @@ -62,8 +62,11 @@ export default defineTool({ scopedProjectSlug: context.constraints.projectSlug, }); if (scopedProject) { - setTagAndAttribute("project.slug", scopedProject.slug); - setTagAndAttribute("project.id", String(scopedProject.id)); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: scopedProject.slug, + projectId: scopedProject.id, + }); } const dashboardId = await resolveDashboardId({ diff --git a/packages/mcp-core/src/tools/catalog/get-doc.ts b/packages/mcp-core/src/tools/catalog/get-doc.ts index c0dacd427..1108f7716 100644 --- a/packages/mcp-core/src/tools/catalog/get-doc.ts +++ b/packages/mcp-core/src/tools/catalog/get-doc.ts @@ -1,9 +1,9 @@ +import { setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; import { ApiError } from "../../api-client/index"; import { UserInputError } from "../../errors"; import { fetchWithTimeout } from "../../internal/fetch-utils"; import { defineTool } from "../../internal/tool-helpers/define"; -import { setTagAndAttribute } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { USER_AGENT } from "../../version"; @@ -47,7 +47,9 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setTagAndAttribute("doc.path", params.path); + const docContext = { "doc.path": params.path }; + setTags(docContext); + setAttributes(docContext); let output = `# Documentation Content\n\n`; output += `**Path**: ${params.path}\n\n`; diff --git a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts index 2f779a04c..dd124610a 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-attachment.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-attachment.ts @@ -15,7 +15,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; function formatMegabytes(bytes: number): string { @@ -131,7 +131,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); // If attachmentId is provided, download the specific attachment if (params.attachmentId) { diff --git a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts index 2f0ce8b99..3f8f400e2 100644 --- a/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts +++ b/packages/mcp-core/src/tools/catalog/get-event-stacktrace.ts @@ -10,7 +10,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchAndFormatEventStacktrace } from "../support/event-stacktrace"; @@ -60,8 +60,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); - setTagAndAttribute("issue.id", params.issueId); + setTargetTagsAndAttributes(params); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts index 628e85fdf..5bf5fa503 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-activity.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-activity.ts @@ -14,7 +14,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatActor, @@ -94,8 +94,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", parsed.organizationSlug); - setTagAndAttribute("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts index 7efe2155d..351a80a29 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-breadcrumbs.ts @@ -14,7 +14,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export default defineTool({ @@ -60,8 +60,10 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", parsed.organizationSlug); - setTagAndAttribute("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); try { await ensureIssueWithinProjectConstraint({ diff --git a/packages/mcp-core/src/tools/catalog/get-issue-details.ts b/packages/mcp-core/src/tools/catalog/get-issue-details.ts index ea76c4b2d..76674722a 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-details.ts @@ -44,7 +44,7 @@ import { ParamRegionUrl, } from "../../schema"; import { logError, logIssue } from "../../telem/logging"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { resolveCodeLocation } from "../support/code-location"; @@ -390,7 +390,7 @@ export default defineTool({ ); } - setTagAndAttribute("organization.slug", orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // Use issueId directly if provided (e.g., from URL parsing), otherwise search by eventId let issue: Awaited>; if (params.issueId) { @@ -510,7 +510,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setTagAndAttribute("organization.slug", orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // For the main issue lookup, provide parameter context on 404 let issue: Awaited>; diff --git a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts index 8938d5a0c..d693eebcf 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-tag-values.ts @@ -15,7 +15,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const getIssueTagValuesOutputSchema = z.object({ @@ -133,7 +133,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setTagAndAttribute("organization.slug", orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts index be9cfe684..82e9d1ef6 100644 --- a/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts +++ b/packages/mcp-core/src/tools/catalog/get-issue-user-reports.ts @@ -12,7 +12,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatDate } from "./support/api-formatting"; @@ -97,8 +97,10 @@ export default defineTool({ const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", parsed.organizationSlug); - setTagAndAttribute("issue.id", parsed.issueId); + setTargetTagsAndAttributes({ + organizationSlug: parsed.organizationSlug, + issueId: parsed.issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts index 0d669a0fa..4f6a5c669 100644 --- a/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-latest-base-snapshot.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import { renderSnapshotImageTreeSection } from "../support/snapshots/formatting"; @@ -76,8 +76,6 @@ export default defineTool({ openWorldHint: true, }, async handler(params, context: ServerContext) { - setTagAndAttribute("organization.slug", params.organizationSlug); - const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); @@ -85,8 +83,11 @@ export default defineTool({ const project = params.project ?? undefined; const projectId = project && isNumericId(project) ? project : undefined; const projectSlug = project && !isNumericId(project) ? project : undefined; - if (projectId) setTagAndAttribute("project.id", projectId); - if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectId, + projectSlug, + }); const data = (await apiService.getLatestBaseSnapshot({ organizationSlug: params.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts index cf6a62f3e..32a7886f7 100644 --- a/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-metric-monitor-details.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { getMetricMonitor, @@ -35,8 +35,10 @@ export default defineTool({ }, async handler(params, context: ServerContext) { const projectSlug = context.constraints.projectSlug ?? params.projectSlug; - setTagAndAttribute("organization.slug", params.organizationSlug); - if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug, + }); const api = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts index e5df09125..c3b008acb 100644 --- a/packages/mcp-core/src/tools/catalog/get-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-monitor-details.ts @@ -12,7 +12,7 @@ import { ParamPeriod, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { @@ -161,18 +161,14 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("monitor.slug", params.monitorSlug); const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = requestedProjectSlugOrId ?? context.constraints.projectSlug ?? null; - if (projectSlugOrId) { - if (isNumericId(projectSlugOrId)) { - setTagAndAttribute("project.id", projectSlugOrId); - } else { - setTagAndAttribute("project.slug", projectSlugOrId); - } - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId, + monitorSlug: params.monitorSlug, + }); if (requestedProjectSlugOrId && !isNumericId(requestedProjectSlugOrId)) { assertProjectRefWithinConstraint({ resourceLabel: "Monitor", diff --git a/packages/mcp-core/src/tools/catalog/get-profile-details.ts b/packages/mcp-core/src/tools/catalog/get-profile-details.ts index ab7f5c23a..fc93060d5 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile-details.ts @@ -9,7 +9,7 @@ import { resolveScopedProjectSlugOrId, } from "../../internal/url-scope"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, @@ -302,10 +302,13 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", resolved.organizationSlug); + setTargetTagsAndAttributes({ organizationSlug: resolved.organizationSlug }); if (resolved.mode === "transaction") { - setTagAndAttribute("profile.id", resolved.profileId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + profileId: resolved.profileId, + }); const isNumericProjectInput = typeof resolved.projectSlugOrId === "number" || isNumericId(String(resolved.projectSlugOrId)); @@ -336,7 +339,10 @@ export default defineTool({ }); } - setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + projectSlug, + }); const profileUrl = params.profileUrl ?? @@ -361,7 +367,10 @@ export default defineTool({ }); } - setTagAndAttribute("profiler.id", resolved.profilerId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + profilerId: resolved.profilerId, + }); const { projectId, projectSlug } = await resolveProjectContext( apiService, @@ -370,8 +379,11 @@ export default defineTool({ { requireNumericId: true }, ); - setTagAndAttribute("project.slug", projectSlug); - setTagAndAttribute("project.id", String(projectId)); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + projectSlug, + projectId, + }); const chunk = await apiService.getProfileChunk({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-profile.ts b/packages/mcp-core/src/tools/catalog/get-profile.ts index 5b56f586f..1f17cb5c1 100644 --- a/packages/mcp-core/src/tools/catalog/get-profile.ts +++ b/packages/mcp-core/src/tools/catalog/get-profile.ts @@ -1,3 +1,4 @@ +import { setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; @@ -12,7 +13,7 @@ import { ParamPeriod, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { hasProfileData } from "../support/profile/analyzer"; @@ -227,7 +228,6 @@ export default defineTool({ isNumericId(String(projectSlugOrId)) ) { projectId = projectSlugOrId; - setTagAndAttribute("project.id", String(projectSlugOrId)); } else { // It's a slug, resolve to ID const project = await apiService.getProject({ @@ -235,18 +235,27 @@ export default defineTool({ projectSlugOrId: String(projectSlugOrId), }); projectId = project.id; - setTagAndAttribute("project.slug", String(projectSlugOrId)); - setTagAndAttribute("project.id", String(project.id)); } - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("transaction.name", transactionName); + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId: String(projectSlugOrId), + projectId, + }); + const profileContext = { + "transaction.name": transactionName, + ...(params.compareAgainstPeriod + ? { + "baseline.period": params.compareAgainstPeriod, + "current.period": params.period, + } + : {}), + }; + setTags(profileContext); + setAttributes(profileContext); // Comparison mode: compare two time periods if (params.compareAgainstPeriod) { - setTagAndAttribute("baseline.period", params.compareAgainstPeriod); - setTagAndAttribute("current.period", params.period); - // Fetch both flamegraphs in parallel const [baselineFlamegraph, currentFlamegraph] = await Promise.all([ apiService.getFlamegraph({ diff --git a/packages/mcp-core/src/tools/catalog/get-release-details.ts b/packages/mcp-core/src/tools/catalog/get-release-details.ts index 659f4cb0f..8b8c36d49 100644 --- a/packages/mcp-core/src/tools/catalog/get-release-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-release-details.ts @@ -4,9 +4,9 @@ import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; -import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; +import { validateSlugOrId } from "../../utils/slug-validation"; import { compactLines, formatActor, @@ -140,19 +140,14 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("release.version", params.releaseVersion); const scopedProjectSlug = context.constraints.projectSlug ?? undefined; const requestedProjectSlugOrId = params.projectSlugOrId ?? undefined; const projectSlugOrId = scopedProjectSlug ?? requestedProjectSlugOrId; - - if (projectSlugOrId) { - if (isNumericId(projectSlugOrId)) { - setTagAndAttribute("project.id", projectSlugOrId); - } else { - setTagAndAttribute("project.slug", projectSlugOrId); - } - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlugOrId, + releaseVersion: params.releaseVersion, + }); if ( scopedProjectSlug && diff --git a/packages/mcp-core/src/tools/catalog/get-replay-details.ts b/packages/mcp-core/src/tools/catalog/get-replay-details.ts index b1e56fdc1..e1a29bbd2 100644 --- a/packages/mcp-core/src/tools/catalog/get-replay-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-replay-details.ts @@ -18,7 +18,7 @@ import { ParamReplayId, ParamReplayUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; interface ResolvedReplayParams { @@ -97,8 +97,10 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", resolved.organizationSlug); - setTagAndAttribute("replay.id", resolved.replayId); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + replayId: resolved.replayId, + }); const replay = await apiService.getReplayDetails({ organizationSlug: resolved.organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts index 0dc6236f0..d7fdd2008 100644 --- a/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts +++ b/packages/mcp-core/src/tools/catalog/get-sentry-resource.ts @@ -1,4 +1,4 @@ -import { getActiveSpan } from "@sentry/core"; +import { getActiveSpan, setAttributes, setTags } from "@sentry/core"; import { z } from "zod"; import type { SentryApiService } from "../../api-client"; import { UserInputError } from "../../errors"; @@ -14,7 +14,7 @@ import { resolveScopedProjectSlug, } from "../../internal/url-scope"; import { ParamOrganizationSlug } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; import getAIConversationDetails from "./get-agent-conversation-details"; @@ -528,11 +528,13 @@ export default defineTool({ projectSlug: context.constraints.projectSlug, }); - setTagAndAttribute("resource.type", resolved.type); - setTagAndAttribute("organization.slug", resolved.organizationSlug); - if (resolved.spanId) { - setTagAndAttribute("trace.span_id", resolved.spanId); - } + const resourceContext = { "resource.type": resolved.type }; + setTags(resourceContext); + setAttributes(resourceContext); + setTargetTagsAndAttributes({ + organizationSlug: resolved.organizationSlug, + spanId: resolved.spanId, + }); getActiveSpan()?.setAttribute("app.resource.type", resolved.type); diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts index a6cf265f3..56fcd0df4 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot-image.ts @@ -3,7 +3,7 @@ import { UserInputError } from "../../errors"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotImage } from "../support/snapshots/handlers"; @@ -74,7 +74,7 @@ export default defineTool({ ); } - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-snapshot.ts b/packages/mcp-core/src/tools/catalog/get-snapshot.ts index d75f91a7f..83aec7136 100644 --- a/packages/mcp-core/src/tools/catalog/get-snapshot.ts +++ b/packages/mcp-core/src/tools/catalog/get-snapshot.ts @@ -4,7 +4,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { formatToolCallInstruction } from "../../internal/tool-helpers/tool-call-formatting"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { fetchSnapshotSummary } from "../support/snapshots/handlers"; @@ -91,7 +91,7 @@ export default defineTool({ ); } - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); const apiService = apiServiceFromContext(context, { regionUrl: params.regionUrl ?? undefined, diff --git a/packages/mcp-core/src/tools/catalog/get-trace-details.ts b/packages/mcp-core/src/tools/catalog/get-trace-details.ts index 452f48528..ba2758b10 100644 --- a/packages/mcp-core/src/tools/catalog/get-trace-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-trace-details.ts @@ -15,7 +15,7 @@ import { ParamSpanId, ParamTraceId, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatSemanticSpanDisplay } from "../support/traces/semantic-display.js"; @@ -130,15 +130,12 @@ export default defineTool({ regionUrl: regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); - setTagAndAttribute("trace.id", params.traceId); - if (params.spanId) { - setTagAndAttribute("trace.span_id", params.spanId); - } - - if (context.constraints.projectSlug) { - setTagAndAttribute("project.slug", context.constraints.projectSlug); - } + setTargetTagsAndAttributes({ + organizationSlug: params.organizationSlug, + projectSlug: context.constraints.projectSlug, + traceId: params.traceId, + spanId: params.spanId, + }); // Get trace metadata for overview const traceMeta = await apiService.getTraceMeta({ diff --git a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts index b9d032299..d1a06cdea 100644 --- a/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts +++ b/packages/mcp-core/src/tools/catalog/get-uptime-monitor-details.ts @@ -8,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { compactLines, formatDate } from "./support/api-formatting"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; @@ -121,9 +121,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); - setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts index abe5cc0a6..c5c152868 100644 --- a/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts +++ b/packages/mcp-core/src/tools/catalog/onboarding-status-update.ts @@ -10,7 +10,7 @@ import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; import { ALL_SKILLS } from "../../skills"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const updateBaseSchema = z @@ -130,7 +130,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? context.constraints.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); + setTargetTagsAndAttributes(params); const update = AgenticOnboardingStatusUpdateSchema.parse({ schemaVersion: 1, diff --git a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts index 5b6800e34..59fc94b39 100644 --- a/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts +++ b/packages/mcp-core/src/tools/catalog/remove-team-from-project.ts @@ -10,7 +10,7 @@ import { ParamRegionUrl, ParamTeamSlug, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; const assignedTeamSchema = z.object({ @@ -73,9 +73,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); - setTagAndAttribute("team.slug", params.teamSlug); + setTargetTagsAndAttributes(params); const currentTeams = await apiService.listProjectTeams({ organizationSlug, diff --git a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts index 52b17fa63..87994cfd7 100644 --- a/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts +++ b/packages/mcp-core/src/tools/catalog/search-agent-conversations.ts @@ -13,7 +13,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId } from "../../utils/slug-validation"; @@ -270,7 +270,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const projectIds = await resolveProjectIds({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/search-issue-events.ts b/packages/mcp-core/src/tools/catalog/search-issue-events.ts index a1b41c9eb..1bba0b92e 100644 --- a/packages/mcp-core/src/tools/catalog/search-issue-events.ts +++ b/packages/mcp-core/src/tools/catalog/search-issue-events.ts @@ -12,7 +12,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { formatErrorResults } from "../support/search-events/formatters"; import { searchIssueEventsAgent } from "../support/search-issue-events/agent"; @@ -143,11 +143,11 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("issue.id", issueId); - if (params.projectSlug) { - setTagAndAttribute("project.slug", params.projectSlug); - } + setTargetTagsAndAttributes({ + organizationSlug, + projectSlug: params.projectSlug, + issueId, + }); await ensureIssueWithinProjectConstraint({ apiService, diff --git a/packages/mcp-core/src/tools/catalog/search-issues.ts b/packages/mcp-core/src/tools/catalog/search-issues.ts index 52471d9dc..e89249ae2 100644 --- a/packages/mcp-core/src/tools/catalog/search-issues.ts +++ b/packages/mcp-core/src/tools/catalog/search-issues.ts @@ -6,7 +6,7 @@ import { withProviderFallback } from "../../internal/agents/provider-fallback"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { ParamOrganizationSlug, ParamRegionUrl } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { isNumericId, validateSlugOrId } from "../../utils/slug-validation"; import { searchIssuesAgent } from "../support/search-issues/agent"; @@ -120,14 +120,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", params.organizationSlug); - if (params.projectSlugOrId) { - if (isNumericId(params.projectSlugOrId)) { - setTagAndAttribute("project.id", params.projectSlugOrId); - } else { - setTagAndAttribute("project.slug", params.projectSlugOrId); - } - } + setTargetTagsAndAttributes(params); let query: string; let sort: "date" | "freq" | "new" | "user" | "recommended"; diff --git a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts index 8b769df24..0d1395ad5 100644 --- a/packages/mcp-core/src/tools/catalog/update-alert-rule.ts +++ b/packages/mcp-core/src/tools/catalog/update-alert-rule.ts @@ -10,7 +10,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { alertRuleConfigFields, @@ -172,8 +172,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); let ruleId = params.ruleIdOrName; if (!isNumericAlertRuleId(ruleId)) { const matches = await findExactIssueAlertRuleMatches(apiService, { diff --git a/packages/mcp-core/src/tools/catalog/update-dsn.ts b/packages/mcp-core/src/tools/catalog/update-dsn.ts index 3b89221aa..f0cd77762 100644 --- a/packages/mcp-core/src/tools/catalog/update-dsn.ts +++ b/packages/mcp-core/src/tools/catalog/update-dsn.ts @@ -7,7 +7,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { validateResourceId } from "../../utils/slug-validation"; @@ -136,8 +136,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const hasUpdates = params.name !== undefined || diff --git a/packages/mcp-core/src/tools/catalog/update-issue.ts b/packages/mcp-core/src/tools/catalog/update-issue.ts index c8cc7a9f7..3298e2e79 100644 --- a/packages/mcp-core/src/tools/catalog/update-issue.ts +++ b/packages/mcp-core/src/tools/catalog/update-issue.ts @@ -23,7 +23,7 @@ import { ParamRegionUrl, } from "../../schema"; import { logIssue } from "../../telem/logging"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; type IgnoreMode = @@ -710,7 +710,7 @@ export default defineTool({ issueUrl: params.issueUrl, }); - setTagAndAttribute("organization.slug", orgSlug); + setTargetTagsAndAttributes({ organizationSlug: orgSlug }); // Get current issue details first const currentIssue = await apiService.getIssue({ diff --git a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts index 56da94357..bb2402e52 100644 --- a/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-metric-monitor.ts @@ -2,7 +2,7 @@ import { z } from "zod"; import { apiServiceFromContext } from "../../internal/tool-helpers/api"; import { defineTool } from "../../internal/tool-helpers/define"; import { structuredResult } from "../../internal/tool-helpers/results"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { metricMonitorConfigFields, @@ -51,8 +51,7 @@ export default defineTool({ ...changes } = params; const projectSlug = context.constraints.projectSlug ?? requestedProject; - setTagAndAttribute("organization.slug", organizationSlug); - if (projectSlug) setTagAndAttribute("project.slug", projectSlug); + setTargetTagsAndAttributes({ organizationSlug, projectSlug }); const api = apiServiceFromContext(context, { regionUrl: regionUrl ?? undefined, }); diff --git a/packages/mcp-core/src/tools/catalog/update-project.ts b/packages/mcp-core/src/tools/catalog/update-project.ts index a623235ba..30b31406b 100644 --- a/packages/mcp-core/src/tools/catalog/update-project.ts +++ b/packages/mcp-core/src/tools/catalog/update-project.ts @@ -12,7 +12,7 @@ import { ParamRegionUrl, } from "../../schema"; import { logIssue } from "../../telem/logging"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; export const updateProjectOutputSchema = z.object({ @@ -90,8 +90,7 @@ export default defineTool({ }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const hasProjectUpdates = params.name || params.slug || params.platform; if (!hasProjectUpdates) { diff --git a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts index e3d44464d..9f3926476 100644 --- a/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts +++ b/packages/mcp-core/src/tools/catalog/update-uptime-monitor.ts @@ -8,7 +8,7 @@ import { ParamProjectSlug, ParamRegionUrl, } from "../../schema"; -import { setTagAndAttribute } from "../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../telem/scope"; import type { ServerContext } from "../../types"; import { assertProjectRefWithinConstraint } from "./support/project-constraints"; import { @@ -105,9 +105,7 @@ export default defineTool({ regionUrl: params.regionUrl ?? undefined, }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - setTagAndAttribute("project.slug", params.projectSlug); - setTagAndAttribute("uptime.monitor_id", params.uptimeMonitorId); + setTargetTagsAndAttributes(params); assertProjectRefWithinConstraint({ resourceLabel: "Uptime monitor", diff --git a/packages/mcp-core/src/tools/support/issue-linking/tool.ts b/packages/mcp-core/src/tools/support/issue-linking/tool.ts index e2243f998..b17746a2a 100644 --- a/packages/mcp-core/src/tools/support/issue-linking/tool.ts +++ b/packages/mcp-core/src/tools/support/issue-linking/tool.ts @@ -12,7 +12,7 @@ import { ParamOrganizationSlug, ParamRegionUrl, } from "../../../schema"; -import { setTagAndAttribute } from "../../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../../telem/scope"; import type { ServerContext } from "../../../types"; export const issueLinkInputSchema = { @@ -68,7 +68,7 @@ export async function resolveIssueLinkContext( const apiService = apiServiceFromContext(context, { regionUrl: context.constraints.regionUrl ?? params.regionUrl ?? undefined, }); - setTagAndAttribute("organization.slug", organizationSlug); + setTargetTagsAndAttributes({ organizationSlug }); const issue = await apiService.getIssue({ organizationSlug, issueId }); assertIssueWithinProjectConstraint({ issue, diff --git a/packages/mcp-core/src/tools/support/search-events/search.ts b/packages/mcp-core/src/tools/support/search-events/search.ts index fb5d560c0..3879ccf45 100644 --- a/packages/mcp-core/src/tools/support/search-events/search.ts +++ b/packages/mcp-core/src/tools/support/search-events/search.ts @@ -1,6 +1,6 @@ import { getActiveSpan } from "@sentry/core"; import { z } from "zod"; -import { setTagAndAttribute } from "../../../telem/scope"; +import { setTargetTagsAndAttributes } from "../../../telem/scope"; import { UserInputError } from "../../../errors"; import { hasAgentProvider } from "../../../internal/agents/provider-factory"; import { withProviderFallback } from "../../../internal/agents/provider-fallback"; @@ -608,9 +608,7 @@ export async function runSearchEvents( }); const organizationSlug = params.organizationSlug; - setTagAndAttribute("organization.slug", organizationSlug); - if (params.projectSlug) - setTagAndAttribute("project.slug", params.projectSlug); + setTargetTagsAndAttributes(params); const inputDataset = params.dataset ?? "errors"; const hasStructuredQuery = looksLikeSentrySearchSyntax(params.query); From 7f3d2992889db032f2fc4e925894681f91aebc92 Mon Sep 17 00:00:00 2001 From: JPeer264 Date: Mon, 5 Oct 2026 09:17:44 +0200 Subject: [PATCH 3/3] fixup! chore: Update SDK to v11.1.0 and migrate tags to attributes --- packages/mcp-core/src/telem/scope.test.ts | 37 ++++++++++++----------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/packages/mcp-core/src/telem/scope.test.ts b/packages/mcp-core/src/telem/scope.test.ts index d53e5f59a..a26796599 100644 --- a/packages/mcp-core/src/telem/scope.test.ts +++ b/packages/mcp-core/src/telem/scope.test.ts @@ -20,27 +20,30 @@ const beforeSendSpan = vi.fn((span: StreamedSpanJSON) => span); const beforeSend = vi.fn((event: ErrorEvent) => event); let sentry: ServerRuntimeClient; +// Tag and attribute keys that the tests in this file set on the isolation scope. +const SCOPE_CONTEXT_KEYS = new Set([ + "organization.slug", + "project.slug", + "project.id", + "team.slug", + "issue.id", + "trace.id", + "trace.span_id", + "monitor.slug", + "uptime.monitor_id", + "release.version", + "replay.id", + "profile.id", + "profiler.id", + "ai_conversation.id", + "client.id", +]); + // Without an async context strategy, withIsolationScope does not fork the // isolation scope, so values set by one test stay there for the next one. function resetScopeContext(): void { const scope = getIsolationScope(); - for (const key of [ - "organization.slug", - "project.slug", - "project.id", - "team.slug", - "issue.id", - "trace.id", - "trace.span_id", - "monitor.slug", - "uptime.monitor_id", - "release.version", - "replay.id", - "profile.id", - "profiler.id", - "ai_conversation.id", - "client.id", - ]) { + for (const key of SCOPE_CONTEXT_KEYS) { scope.setAttribute(key, undefined); scope.setTag(key, undefined); }