import type { SentryGetProjectParams, SentryGetProjectResponse } from '@/tools/sentry/types' import type { ToolConfig } from '@/tools/types' export const getProjectTool: ToolConfig = { id: 'sentry_projects_get', name: 'Get Project', description: 'Retrieve detailed information about a specific Sentry project by its slug. Returns complete project details including teams, features, and configuration.', version: '1.0.0', params: { apiKey: { type: 'string', required: true, visibility: 'user-only', description: 'Sentry API authentication token', }, organizationSlug: { type: 'string', required: true, visibility: 'user-or-llm', description: 'The slug of the organization (e.g., "my-org")', }, projectSlug: { type: 'string', required: true, visibility: 'user-or-llm', description: 'The slug of the project to retrieve (e.g., "my-project")', }, }, request: { url: (params) => `https://sentry.io/api/0/projects/${params.organizationSlug}/${params.projectSlug}/`, method: 'GET', headers: (params) => ({ Authorization: `Bearer ${params.apiKey}`, 'Content-Type': 'application/json', }), }, transformResponse: async (response: Response) => { const project = await response.json() return { success: true, output: { project: { id: project.id, slug: project.slug, name: project.name, platform: project.platform ?? null, dateCreated: project.dateCreated, isBookmarked: project.isBookmarked, isMember: project.isMember, features: project.features || [], firstEvent: project.firstEvent ?? null, firstTransactionEvent: project.firstTransactionEvent ?? null, access: project.access || [], hasAccess: project.hasAccess, hasMinifiedStackTrace: project.hasMinifiedStackTrace, hasMonitors: project.hasMonitors, hasProfiles: project.hasProfiles, hasReplays: project.hasReplays, hasSessions: project.hasSessions, isInternal: project.isInternal, organization: { id: project.organization?.id || '', slug: project.organization?.slug || '', name: project.organization?.name || '', }, team: { id: project.team?.id || '', name: project.team?.name || '', slug: project.team?.slug || '', }, teams: project.teams?.map((team: any) => ({ id: team.id, name: team.name, slug: team.slug, })) || [], status: project.status ?? null, color: project.color ?? null, isPublic: project.isPublic, }, }, } }, outputs: { project: { type: 'object', description: 'Detailed information about the Sentry project', properties: { id: { type: 'string', description: 'Unique project ID' }, slug: { type: 'string', description: 'URL-friendly project identifier' }, name: { type: 'string', description: 'Project name' }, platform: { type: 'string', description: 'Platform/language (e.g., javascript, python)', optional: true, }, dateCreated: { type: 'string', description: 'When the project was created (ISO timestamp)', }, isBookmarked: { type: 'boolean', description: 'Whether the project is bookmarked' }, isMember: { type: 'boolean', description: 'Whether the user is a member of the project' }, features: { type: 'array', description: 'Enabled features for the project', items: { type: 'string' }, }, firstEvent: { type: 'string', description: 'When the first event was received (ISO timestamp)', optional: true, }, firstTransactionEvent: { type: 'boolean', description: 'Whether the project has received its first transaction event', optional: true, }, access: { type: 'array', description: 'Access permissions' }, organization: { type: 'object', description: 'Organization information', properties: { id: { type: 'string', description: 'Organization ID' }, slug: { type: 'string', description: 'Organization slug' }, name: { type: 'string', description: 'Organization name' }, }, }, team: { type: 'object', description: 'Primary team for the project', properties: { id: { type: 'string', description: 'Team ID' }, name: { type: 'string', description: 'Team name' }, slug: { type: 'string', description: 'Team slug' }, }, }, teams: { type: 'array', description: 'Teams associated with the project', items: { type: 'object', properties: { id: { type: 'string', description: 'Team ID' }, name: { type: 'string', description: 'Team name' }, slug: { type: 'string', description: 'Team slug' }, }, }, }, status: { type: 'string', description: 'Project status', optional: true }, color: { type: 'string', description: 'Project color code', optional: true }, isPublic: { type: 'boolean', description: 'Whether the project is publicly visible' }, isInternal: { type: 'boolean', description: 'Whether the project is internal' }, hasAccess: { type: 'boolean', description: 'Whether the user has access to this project' }, hasMinifiedStackTrace: { type: 'boolean', description: 'Whether minified stack traces are available', }, hasMonitors: { type: 'boolean', description: 'Whether the project has monitors configured', }, hasProfiles: { type: 'boolean', description: 'Whether the project has profiling enabled' }, hasReplays: { type: 'boolean', description: 'Whether the project has session replays enabled', }, hasSessions: { type: 'boolean', description: 'Whether the project has sessions enabled' }, }, }, }, }