From 6da4392001ef552a1cc8bb37ad4ff3b23a43d55b Mon Sep 17 00:00:00 2001 From: Adesh Gairola Date: Tue, 1 Jul 2025 15:26:36 +1000 Subject: [PATCH 1/8] new dash --- app/analytics/page.tsx | 230 +++++++++------- app/api/oauth/register/route.ts | 24 ++ app/api/oauth/token/route.ts | 45 +++- components/analytics/dashboard-header.tsx | 13 - components/analytics/index.ts | 6 +- .../analytics/oauth-client-activity.tsx | 103 ++++++++ components/analytics/oauth-overview.tsx | 71 +++++ components/analytics/oauth-security-panel.tsx | 186 +++++++++++++ components/analytics/security-panel.tsx | 2 +- components/analytics/tool-usage-panel.tsx | 137 ++++++++++ generated/prisma/edge.js | 17 +- generated/prisma/index-browser.js | 11 +- generated/prisma/index.d.ts | 248 +++++++++++++++++- generated/prisma/index.js | 17 +- generated/prisma/package.json | 2 +- generated/prisma/schema.prisma | 11 + generated/prisma/wasm.js | 11 +- lib/analytics-db.ts | 10 +- middleware.ts | 36 ++- prisma/schema.prisma | 11 + 20 files changed, 1053 insertions(+), 138 deletions(-) create mode 100644 components/analytics/oauth-client-activity.tsx create mode 100644 components/analytics/oauth-overview.tsx create mode 100644 components/analytics/oauth-security-panel.tsx create mode 100644 components/analytics/tool-usage-panel.tsx diff --git a/app/analytics/page.tsx b/app/analytics/page.tsx index aaadf7b..2be3611 100644 --- a/app/analytics/page.tsx +++ b/app/analytics/page.tsx @@ -9,12 +9,17 @@ import { SecurityPanel, LoadingSkeleton, DashboardHeader, - StatusBadge + StatusBadge, + OAuthOverview, + OAuthSecurityPanel, + OAuthClientActivity, + TokenExpiration, + GrantTypeDistribution, + ToolUsagePanel } from "@/components/analytics" import { BarChart3, Globe, - Users, Activity, Clock, AlertTriangle, @@ -32,6 +37,65 @@ export default function AnalyticsPage() { p95ResponseTime: number errorRate: number } + oauth?: { + totalClients: number + activeTokens: number + tokenRefreshRate: number + pkceAdoption: number + clientGrowth?: string + tokenGrowth?: string + refreshGrowth?: string + pkceGrowth?: string + clients?: { + name: string + clientId: string + tokenCount: number + lastActivity: string + grantType: string + pkceEnabled: boolean + }[] + expiringTokens?: { + clientName: string + tokenCount: number + hoursUntilExpiry: number + }[] + grantTypes?: { + type: string + count: number + percentage: number + }[] + } + oauthSecurity?: { + totalEvents: number + invalidClientAttempts: number + invalidGrantAttempts: number + unauthorizedScopes: number + events?: { + clientName: string + clientId: string + eventType: string + severity: string + count: number + lastOccurred: string + }[] + } + toolUsage?: { + tools: { + toolName: string + mcpMethod: string + usageCount: number + uniqueUsers: number + avgResponseTime?: number + }[] + geographic: { + country: string + city?: string + count: number + percentage: number + }[] + totalCalls: number + activeUsers: number + } topEndpoints?: { endpoint: string; count: number }[] geography?: { country: string; count: number }[] security?: { @@ -104,10 +168,30 @@ export default function AnalyticsPage() { const getHealthStatus = () => { - if (!data?.performance) return { status: "unknown", color: "bg-muted" } - const { errorRate, avgResponseTime } = data.performance - if (errorRate > 5 || avgResponseTime > 1000) return { status: "critical", color: "bg-destructive" } - if (errorRate > 1 || avgResponseTime > 500) return { status: "warning", color: "bg-yellow-500" } + if (!data?.performance && !data?.oauth) return { status: "unknown", color: "bg-muted" } + + let criticalIssues = 0 + let warningIssues = 0 + + // Check performance health + if (data?.performance) { + const { errorRate, avgResponseTime } = data.performance + if (errorRate > 5 || avgResponseTime > 1000) criticalIssues++ + else if (errorRate > 1 || avgResponseTime > 500) warningIssues++ + } + + // Check OAuth security health + if (data?.oauthSecurity) { + const { invalidClientAttempts, invalidGrantAttempts, unauthorizedScopes } = data.oauthSecurity + if (invalidClientAttempts > 10 || invalidGrantAttempts > 20) criticalIssues++ + else if (invalidClientAttempts > 5 || invalidGrantAttempts > 10 || unauthorizedScopes > 5) warningIssues++ + } + + // Check PKCE adoption + if (data?.oauth && data.oauth.pkceAdoption < 50) warningIssues++ + + if (criticalIssues > 0) return { status: "critical", color: "bg-destructive" } + if (warningIssues > 0) return { status: "warning", color: "bg-yellow-500" } return { status: "healthy", color: "bg-green-500" } } @@ -193,108 +277,72 @@ export default function AnalyticsPage() {
- {/* Performance Overview */} - {data.performance && ( -
-

- Performance Overview -

-
- - - - 5 ? AlertTriangle : CheckCircle} - variant="secondary" - change={data.performance.errorRate > 5 ? "+2.1%" : "-0.5%"} - changeType={data.performance.errorRate > 5 ? "negative" : "positive"} - subtitle="error percentage" - /> -
-
+ {/* OAuth Overview */} + {data.oauth && ( + )} {/* Main Content Grid */}
- {/* Left Column - Endpoints & Geography */} + {/* Left Column - OAuth Client Management */}
- {/* Top Endpoints */} - {data.topEndpoints && data.topEndpoints.length > 0 && ( - ({ - primary: endpoint.endpoint, - value: endpoint.count - }))} - emptyMessage="No endpoint data available" + {/* OAuth Client Activity */} + {data.oauth?.clients && data.oauth.clients.length > 0 && ( + )} - {/* Geographic Distribution */} - {data.geography && data.geography.length > 0 && ( - ({ - primary: country.country, - value: country.count - }))} - emptyMessage="No geographic data available" - /> + {/* Token Expiration Tracking */} + {data.oauth?.expiringTokens && data.oauth.expiringTokens.length > 0 && ( + + )} + + {/* Grant Type Distribution */} + {data.oauth?.grantTypes && data.oauth.grantTypes.length > 0 && ( + )}
- {/* Middle Column - Enterprise Analytics */} + {/* Middle Column - Tool Usage & Geography */}
- - - {/* Tool Usage */} - {data.enterprise?.toolUsage && data.enterprise.toolUsage.length > 0 && ( - ({ - primary: tool.toolName, - secondary: tool.mcpMethod, - value: `${tool.usageCount} calls`, - badge: `${tool.uniqueUsers} users` - }))} - emptyMessage="No tool usage data available" - maxItems={4} + {/* Enhanced Tool Usage Panel */} + {data.toolUsage && ( + )}
- {/* Right Column - Security */} + {/* Right Column - Security Focus */}
- {data.security && ( + {/* OAuth Security Panel */} + {data.oauthSecurity && ( + + )} + + {/* General Security Events (Fallback) */} + {data.security && !data.oauthSecurity && ( { + return clients.slice(0, maxItems).map(client => ({ + primary: client.name, + secondary: client.grantType, + value: `${client.tokenCount} tokens`, + badge: client.pkceEnabled ? "PKCE" : "Basic", + badgeVariant: (client.pkceEnabled ? "secondary" : "outline") as "secondary" | "outline" + })) + } + + return ( + + ) +} + +interface TokenExpirationProps { + expiringTokens: { + clientName: string + tokenCount: number + hoursUntilExpiry: number + }[] +} + +export function TokenExpiration({ expiringTokens }: TokenExpirationProps) { + const formatData = (tokens: typeof expiringTokens) => { + return tokens.map(token => ({ + primary: token.clientName, + secondary: `${token.hoursUntilExpiry}h remaining`, + value: `${token.tokenCount} tokens`, + badge: token.hoursUntilExpiry < 1 ? "Critical" : token.hoursUntilExpiry < 24 ? "Warning" : "Normal", + badgeVariant: (token.hoursUntilExpiry < 1 ? "destructive" : token.hoursUntilExpiry < 24 ? "outline" : "secondary") as "destructive" | "outline" | "secondary" + })) + } + + return ( + + ) +} + +interface GrantTypeDistributionProps { + grantTypes: { + type: string + count: number + percentage: number + }[] +} + +export function GrantTypeDistribution({ grantTypes }: GrantTypeDistributionProps) { + const formatData = (grants: typeof grantTypes) => { + return grants.map(grant => ({ + primary: grant.type.replace('_', ' ').replace(/\b\w/g, l => l.toUpperCase()), + secondary: `${grant.percentage}% of total`, + value: grant.count.toLocaleString(), + badge: grant.type === 'authorization_code' ? "Standard" : grant.type === 'refresh_token' ? "Refresh" : "Other" + })) + } + + return ( + + ) +} \ No newline at end of file diff --git a/components/analytics/oauth-overview.tsx b/components/analytics/oauth-overview.tsx new file mode 100644 index 0000000..cbc3100 --- /dev/null +++ b/components/analytics/oauth-overview.tsx @@ -0,0 +1,71 @@ +import type React from "react" +import { Key, Users, RefreshCw, Shield } from "lucide-react" +import { MetricCard } from "./metric-card" + +interface OAuthOverviewProps { + totalClients: number + activeTokens: number + tokenRefreshRate: number + pkceAdoption: number + clientGrowth?: string + tokenGrowth?: string + refreshGrowth?: string + pkceGrowth?: string +} + +export function OAuthOverview({ + totalClients, + activeTokens, + tokenRefreshRate, + pkceAdoption, + clientGrowth = "+0%", + tokenGrowth = "+0%", + refreshGrowth = "+0%", + pkceGrowth = "+0%" +}: OAuthOverviewProps) { + return ( +
+

+ OAuth Server Overview +

+
+ + + + = 80 ? "positive" : pkceAdoption >= 50 ? "neutral" : "negative"} + subtitle="security compliance" + /> +
+
+ ) +} \ No newline at end of file diff --git a/components/analytics/oauth-security-panel.tsx b/components/analytics/oauth-security-panel.tsx new file mode 100644 index 0000000..580b7a6 --- /dev/null +++ b/components/analytics/oauth-security-panel.tsx @@ -0,0 +1,186 @@ +import type React from "react" +import { CheckCircle, AlertTriangle, Shield, ShieldCheck, ShieldX } from "lucide-react" +import { cn } from "@/lib/utils" +import { + Accordion, + AccordionContent, + AccordionItem, + AccordionTrigger, +} from "@/components/ui/accordion" + +interface OAuthSecurityEvent { + clientName: string + clientId: string + eventType: string + severity: string + count: number + lastOccurred: string +} + +interface OAuthSecurityPanelProps { + totalEvents: number + oauthEvents?: OAuthSecurityEvent[] + invalidClientAttempts?: number + invalidGrantAttempts?: number + unauthorizedScopes?: number +} + +export function OAuthSecurityPanel({ + totalEvents, + oauthEvents = [], + invalidClientAttempts = 0, + invalidGrantAttempts = 0, + unauthorizedScopes = 0 +}: OAuthSecurityPanelProps) { + const hasSecurityIssues = totalEvents > 0 || invalidClientAttempts > 0 || invalidGrantAttempts > 0 || unauthorizedScopes > 0 + + const getEventIcon = (eventType: string) => { + switch (eventType.toLowerCase()) { + case 'oauth_invalid_client': + return + case 'oauth_invalid_grant': + return + case 'oauth_invalid_scope': + return + default: + return + } + } + + const getSeverityColor = (severity: string) => { + switch (severity.toLowerCase()) { + case 'critical': + return 'text-destructive bg-destructive/10' + case 'high': + return 'text-orange-600 bg-orange-100 dark:bg-orange-900/20' + case 'medium': + return 'text-yellow-600 bg-yellow-100 dark:bg-yellow-900/20' + case 'low': + return 'text-blue-600 bg-blue-100 dark:bg-blue-900/20' + default: + return 'text-muted-foreground bg-muted' + } + } + + return ( +
+
+ {/* Header */} +
+
+
+ {hasSecurityIssues ? ( + + ) : ( + + )} +
+
+

OAuth Security

+

+ {hasSecurityIssues + ? `${totalEvents} security events detected` + : "All OAuth flows secure" + } +

+
+
+ + {/* Status Badge */} +
+ {hasSecurityIssues ? ( + <> + + Issues Detected + + ) : ( + <> + + Secure + + )} +
+
+ + {/* Quick Stats */} + {hasSecurityIssues && ( +
+
+
{invalidClientAttempts}
+
Invalid Clients
+
+
+
{invalidGrantAttempts}
+
Invalid Grants
+
+
+
{unauthorizedScopes}
+
Scope Issues
+
+
+ )} + + {/* Events Details */} + {oauthEvents.length > 0 && ( + + + +
+ + OAuth Security Events ({oauthEvents.length}) +
+
+ +
+ {oauthEvents.map((event, index) => ( +
+ {getEventIcon(event.eventType)} +
+
+ + {event.clientName} + + + {event.severity} + +
+
+ {event.eventType.replace('OAUTH_', '').replace('_', ' ').toLowerCase()} +
+
+ {event.count} occurrences • Last: {event.lastOccurred} +
+
+
+ ))} +
+
+
+
+ )} + + {/* All Clear State */} + {!hasSecurityIssues && ( +
+ +

OAuth Security All Clear

+

+ No security events detected in your OAuth flows +

+
+ )} +
+
+ ) +} \ No newline at end of file diff --git a/components/analytics/security-panel.tsx b/components/analytics/security-panel.tsx index 8609f33..d502cb2 100644 --- a/components/analytics/security-panel.tsx +++ b/components/analytics/security-panel.tsx @@ -1,5 +1,5 @@ import type React from "react" -import { CheckCircle, AlertTriangle, Shield, Users, TrendingUp } from "lucide-react" +import { CheckCircle, AlertTriangle, Shield, TrendingUp } from "lucide-react" import { cn } from "@/lib/utils" import { Accordion, diff --git a/components/analytics/tool-usage-panel.tsx b/components/analytics/tool-usage-panel.tsx new file mode 100644 index 0000000..0851080 --- /dev/null +++ b/components/analytics/tool-usage-panel.tsx @@ -0,0 +1,137 @@ +import type React from "react" +import { Wrench, MapPin, Clock, TrendingUp } from "lucide-react" +import { DataTable } from "./data-table" + +interface ToolUsage { + toolName: string + mcpMethod: string + usageCount: number + uniqueUsers: number + avgResponseTime?: number +} + +interface GeographicUsage { + country: string + city?: string + count: number + percentage: number +} + +interface ToolUsagePanelProps { + toolUsage: ToolUsage[] + geographicUsage: GeographicUsage[] + totalCalls?: number + activeUsers?: number +} + +export function ToolUsagePanel({ + toolUsage, + geographicUsage, + totalCalls = 0, + activeUsers = 0 +}: ToolUsagePanelProps) { + const formatToolData = (tools: ToolUsage[]) => { + return tools.map(tool => ({ + primary: tool.toolName, + secondary: tool.mcpMethod, + value: `${tool.usageCount} calls`, + badge: `${tool.uniqueUsers} users`, + badgeVariant: "secondary" as const + })) + } + + const formatGeoData = (geo: GeographicUsage[]) => { + return geo.map(location => ({ + primary: location.country, + secondary: location.city || "Multiple cities", + value: location.count.toLocaleString(), + badge: `${location.percentage}%`, + badgeVariant: "outline" as const + })) + } + + return ( +
+ {/* Tool Usage Statistics */} +
+
+
+ +
+
+

Tool Usage Overview

+

+ {totalCalls.toLocaleString()} total calls by {activeUsers} active users +

+
+
+ + {/* Quick Stats */} +
+
+
{toolUsage.length}
+
Active Tools
+
+
+
+ {Math.round(totalCalls / (activeUsers || 1))} +
+
Calls per User
+
+
+
+ + {/* Popular Tools */} + {toolUsage.length > 0 && ( + + )} + + {/* Geographic Distribution */} + {geographicUsage.length > 0 && ( + + )} + + {/* Performance Insights */} +
+
+
+ +
+
+

Performance Insights

+

Tool response times and efficiency

+
+
+ +
+ {toolUsage.slice(0, 3).map((tool, index) => ( +
+
+
{tool.toolName}
+
{tool.mcpMethod}
+
+
+
+ {tool.avgResponseTime ? `${tool.avgResponseTime}ms` : 'N/A'} +
+
avg response
+
+
+ ))} +
+
+
+ ) +} \ No newline at end of file diff --git a/generated/prisma/edge.js b/generated/prisma/edge.js index 71fd578..3108c91 100644 --- a/generated/prisma/edge.js +++ b/generated/prisma/edge.js @@ -203,7 +203,11 @@ exports.Prisma.AnalyticsRequestScalarFieldEnum = { clientType: 'clientType', platform: 'platform', mcpMethod: 'mcpMethod', - toolName: 'toolName' + toolName: 'toolName', + oauthGrantType: 'oauthGrantType', + tokenScopes: 'tokenScopes', + usePKCE: 'usePKCE', + redirectUri: 'redirectUri' }; exports.Prisma.AnalyticsSecurityScalarFieldEnum = { @@ -262,7 +266,10 @@ exports.SecurityEventType = exports.$Enums.SecurityEventType = { UNUSUAL_LOCATION: 'UNUSUAL_LOCATION', PRIVILEGE_ESCALATION: 'PRIVILEGE_ESCALATION', MALFORMED_REQUEST: 'MALFORMED_REQUEST', - BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT' + BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT', + OAUTH_INVALID_CLIENT: 'OAUTH_INVALID_CLIENT', + OAUTH_INVALID_GRANT: 'OAUTH_INVALID_GRANT', + OAUTH_INVALID_SCOPE: 'OAUTH_INVALID_SCOPE' }; exports.Prisma.ModelName = { @@ -326,13 +333,13 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n engineType = \"library\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(cuid())\n name String?\n email String? @unique\n emailVerified DateTime?\n image String?\n accounts Account[]\n sessions Session[]\n clients Client[]\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n}\n\nmodel Account {\n id String @id @default(cuid())\n userId String\n type String\n provider String\n providerAccountId String\n refresh_token String? @db.Text\n access_token String? @db.Text\n expires_at Int?\n token_type String?\n scope String?\n id_token String? @db.Text\n session_state String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([provider, providerAccountId])\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionToken String @unique\n userId String\n expires DateTime\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel VerificationToken {\n identifier String\n token String\n expires DateTime\n\n @@unique([identifier, token])\n}\n\nmodel Client {\n id String @id @default(cuid())\n clientId String @unique @default(cuid())\n clientSecret String\n name String\n redirectUris String[]\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel AccessToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel AuthCode {\n id String @id @default(cuid())\n code String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n redirectUri String\n codeChallenge String?\n codeChallengeMethod String?\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel RefreshToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\n// Enhanced Analytics Schema for Enterprise MCP\nmodel MCPServer {\n id String @id @default(cuid())\n name String // \"CRM Server\", \"Finance API\", etc\n identifier String @unique // mcp://crm.company.com\n description String?\n version String?\n\n // Relations\n requests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n}\n\nmodel AnalyticsRequest {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n endpoint String // /mcp/sse, /mcp/mcp, etc\n method String // GET, POST, etc\n statusCode Int\n responseTime Int // milliseconds\n\n // Enhanced client/user tracking with proper relations\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n userId String?\n user User? @relation(fields: [userId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Enterprise SSO context\n ssoProvider String? // \"google\", \"azure-ad\", \"okta\"\n userRole String? // from JWT claims\n scopes String[] // OAuth scopes used\n organization String? // from SSO claims\n\n // Request metadata\n ipAddress String\n userAgent String @db.Text\n\n // Geographic data (optional, populated async)\n country String?\n city String?\n\n // Derived fields for performance\n clientType String? // mcp-client, browser, etc\n platform String? // windows, macos, linux\n\n // MCP-specific tracking\n mcpMethod String? // \"tools/list\", \"tools/call\", etc\n toolName String? // specific tool being called\n\n // Indexes for fast queries\n @@index([timestamp])\n @@index([endpoint])\n @@index([clientId])\n @@index([userId])\n @@index([mcpServerId])\n @@index([statusCode])\n @@index([timestamp, endpoint])\n @@index([timestamp, clientId])\n @@index([timestamp, userId])\n @@index([organization])\n @@index([ssoProvider])\n}\n\nenum SecurityEventType {\n AUTH_FAILURE\n INVALID_TOKEN\n SUSPICIOUS_ACTIVITY\n RATE_LIMIT_EXCEEDED\n UNAUTHORIZED_ACCESS\n TOKEN_REUSE\n UNUSUAL_LOCATION\n PRIVILEGE_ESCALATION\n MALFORMED_REQUEST\n BRUTE_FORCE_ATTEMPT\n}\n\nmodel AnalyticsSecurity {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n eventType SecurityEventType\n severity String // \"low\", \"medium\", \"high\", \"critical\"\n\n // Enhanced context\n userId String?\n user User? @relation(fields: [userId], references: [id])\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Request context\n ipAddress String\n userAgent String @db.Text\n endpoint String? // endpoint where event occurred\n\n // Geographic tracking\n country String?\n city String?\n\n // Enterprise context\n organization String?\n ssoProvider String?\n\n // Structured event details\n details Json // structured data instead of text\n\n // Risk scoring\n riskScore Int @default(0) // 0-100\n resolved Boolean @default(false)\n resolvedAt DateTime?\n resolvedBy String? // admin who resolved\n\n // Indexes for security queries\n @@index([timestamp])\n @@index([eventType])\n @@index([severity])\n @@index([ipAddress])\n @@index([userId])\n @@index([clientId])\n @@index([mcpServerId])\n @@index([timestamp, eventType])\n @@index([timestamp, severity])\n @@index([organization])\n @@index([resolved])\n @@index([riskScore])\n}\n", - "inlineSchemaHash": "6e39df96fa8b453ddd2f6ebcd37a5f7e6bec7c4c4ce65c34bece574730aeca32", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n engineType = \"library\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(cuid())\n name String?\n email String? @unique\n emailVerified DateTime?\n image String?\n accounts Account[]\n sessions Session[]\n clients Client[]\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n}\n\nmodel Account {\n id String @id @default(cuid())\n userId String\n type String\n provider String\n providerAccountId String\n refresh_token String? @db.Text\n access_token String? @db.Text\n expires_at Int?\n token_type String?\n scope String?\n id_token String? @db.Text\n session_state String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([provider, providerAccountId])\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionToken String @unique\n userId String\n expires DateTime\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel VerificationToken {\n identifier String\n token String\n expires DateTime\n\n @@unique([identifier, token])\n}\n\nmodel Client {\n id String @id @default(cuid())\n clientId String @unique @default(cuid())\n clientSecret String\n name String\n redirectUris String[]\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel AccessToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel AuthCode {\n id String @id @default(cuid())\n code String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n redirectUri String\n codeChallenge String?\n codeChallengeMethod String?\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel RefreshToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\n// Enhanced Analytics Schema for Enterprise MCP\nmodel MCPServer {\n id String @id @default(cuid())\n name String // \"CRM Server\", \"Finance API\", etc\n identifier String @unique // mcp://crm.company.com\n description String?\n version String?\n\n // Relations\n requests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n}\n\nmodel AnalyticsRequest {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n endpoint String // /mcp/sse, /mcp/mcp, etc\n method String // GET, POST, etc\n statusCode Int\n responseTime Int // milliseconds\n\n // Enhanced client/user tracking with proper relations\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n userId String?\n user User? @relation(fields: [userId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Enterprise SSO context\n ssoProvider String? // \"google\", \"azure-ad\", \"okta\"\n userRole String? // from JWT claims\n scopes String[] // OAuth scopes used\n organization String? // from SSO claims\n\n // Request metadata\n ipAddress String\n userAgent String @db.Text\n\n // Geographic data (optional, populated async)\n country String?\n city String?\n\n // Derived fields for performance\n clientType String? // mcp-client, browser, etc\n platform String? // windows, macos, linux\n\n // MCP-specific tracking\n mcpMethod String? // \"tools/list\", \"tools/call\", etc\n toolName String? // specific tool being called\n\n // OAuth-specific tracking\n oauthGrantType String? // \"authorization_code\", \"refresh_token\", \"client_credentials\"\n tokenScopes String[] // OAuth scopes granted/requested\n usePKCE Boolean? // Whether PKCE was used in this flow\n redirectUri String? // OAuth redirect URI used\n\n // Indexes for fast queries\n @@index([timestamp])\n @@index([endpoint])\n @@index([clientId])\n @@index([userId])\n @@index([mcpServerId])\n @@index([statusCode])\n @@index([timestamp, endpoint])\n @@index([timestamp, clientId])\n @@index([timestamp, userId])\n @@index([organization])\n @@index([ssoProvider])\n @@index([oauthGrantType])\n @@index([usePKCE])\n}\n\nenum SecurityEventType {\n AUTH_FAILURE\n INVALID_TOKEN\n SUSPICIOUS_ACTIVITY\n RATE_LIMIT_EXCEEDED\n UNAUTHORIZED_ACCESS\n TOKEN_REUSE\n UNUSUAL_LOCATION\n PRIVILEGE_ESCALATION\n MALFORMED_REQUEST\n BRUTE_FORCE_ATTEMPT\n OAUTH_INVALID_CLIENT\n OAUTH_INVALID_GRANT\n OAUTH_INVALID_SCOPE\n}\n\nmodel AnalyticsSecurity {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n eventType SecurityEventType\n severity String // \"low\", \"medium\", \"high\", \"critical\"\n\n // Enhanced context\n userId String?\n user User? @relation(fields: [userId], references: [id])\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Request context\n ipAddress String\n userAgent String @db.Text\n endpoint String? // endpoint where event occurred\n\n // Geographic tracking\n country String?\n city String?\n\n // Enterprise context\n organization String?\n ssoProvider String?\n\n // Structured event details\n details Json // structured data instead of text\n\n // Risk scoring\n riskScore Int @default(0) // 0-100\n resolved Boolean @default(false)\n resolvedAt DateTime?\n resolvedBy String? // admin who resolved\n\n // Indexes for security queries\n @@index([timestamp])\n @@index([eventType])\n @@index([severity])\n @@index([ipAddress])\n @@index([userId])\n @@index([clientId])\n @@index([mcpServerId])\n @@index([timestamp, eventType])\n @@index([timestamp, severity])\n @@index([organization])\n @@index([resolved])\n @@index([riskScore])\n}\n", + "inlineSchemaHash": "2df96eb60da0ca696b9a100a8371d1c423a326b13c07cafe74319174f0b9156e", "copyEngine": false } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"image\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Account\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clients\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Account\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refresh_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"access_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires_at\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token_type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"id_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"session_state\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"provider\",\"providerAccountId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"provider\",\"providerAccountId\"]}],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessionToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"VerificationToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"identifier\",\"token\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"identifier\",\"token\"]}],\"isGenerated\":false},\"Client\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientSecret\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUris\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AccessToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuthCode\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallengeMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RefreshToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MCPServer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"statusCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"responseTime\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userRole\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toolName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsSecurity\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SecurityEventType\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"severity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"details\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"riskScore\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolved\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"SecurityEventType\":{\"values\":[{\"name\":\"AUTH_FAILURE\",\"dbName\":null},{\"name\":\"INVALID_TOKEN\",\"dbName\":null},{\"name\":\"SUSPICIOUS_ACTIVITY\",\"dbName\":null},{\"name\":\"RATE_LIMIT_EXCEEDED\",\"dbName\":null},{\"name\":\"UNAUTHORIZED_ACCESS\",\"dbName\":null},{\"name\":\"TOKEN_REUSE\",\"dbName\":null},{\"name\":\"UNUSUAL_LOCATION\",\"dbName\":null},{\"name\":\"PRIVILEGE_ESCALATION\",\"dbName\":null},{\"name\":\"MALFORMED_REQUEST\",\"dbName\":null},{\"name\":\"BRUTE_FORCE_ATTEMPT\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"image\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Account\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clients\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Account\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refresh_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"access_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires_at\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token_type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"id_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"session_state\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"provider\",\"providerAccountId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"provider\",\"providerAccountId\"]}],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessionToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"VerificationToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"identifier\",\"token\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"identifier\",\"token\"]}],\"isGenerated\":false},\"Client\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientSecret\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUris\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AccessToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuthCode\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallengeMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RefreshToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MCPServer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"statusCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"responseTime\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userRole\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toolName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthGrantType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenScopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usePKCE\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsSecurity\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SecurityEventType\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"severity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"details\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"riskScore\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolved\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"SecurityEventType\":{\"values\":[{\"name\":\"AUTH_FAILURE\",\"dbName\":null},{\"name\":\"INVALID_TOKEN\",\"dbName\":null},{\"name\":\"SUSPICIOUS_ACTIVITY\",\"dbName\":null},{\"name\":\"RATE_LIMIT_EXCEEDED\",\"dbName\":null},{\"name\":\"UNAUTHORIZED_ACCESS\",\"dbName\":null},{\"name\":\"TOKEN_REUSE\",\"dbName\":null},{\"name\":\"UNUSUAL_LOCATION\",\"dbName\":null},{\"name\":\"PRIVILEGE_ESCALATION\",\"dbName\":null},{\"name\":\"MALFORMED_REQUEST\",\"dbName\":null},{\"name\":\"BRUTE_FORCE_ATTEMPT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_CLIENT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_GRANT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_SCOPE\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/generated/prisma/index-browser.js b/generated/prisma/index-browser.js index b515eaf..c87316d 100644 --- a/generated/prisma/index-browser.js +++ b/generated/prisma/index-browser.js @@ -231,7 +231,11 @@ exports.Prisma.AnalyticsRequestScalarFieldEnum = { clientType: 'clientType', platform: 'platform', mcpMethod: 'mcpMethod', - toolName: 'toolName' + toolName: 'toolName', + oauthGrantType: 'oauthGrantType', + tokenScopes: 'tokenScopes', + usePKCE: 'usePKCE', + redirectUri: 'redirectUri' }; exports.Prisma.AnalyticsSecurityScalarFieldEnum = { @@ -290,7 +294,10 @@ exports.SecurityEventType = exports.$Enums.SecurityEventType = { UNUSUAL_LOCATION: 'UNUSUAL_LOCATION', PRIVILEGE_ESCALATION: 'PRIVILEGE_ESCALATION', MALFORMED_REQUEST: 'MALFORMED_REQUEST', - BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT' + BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT', + OAUTH_INVALID_CLIENT: 'OAUTH_INVALID_CLIENT', + OAUTH_INVALID_GRANT: 'OAUTH_INVALID_GRANT', + OAUTH_INVALID_SCOPE: 'OAUTH_INVALID_SCOPE' }; exports.Prisma.ModelName = { diff --git a/generated/prisma/index.d.ts b/generated/prisma/index.d.ts index 2b3d243..5152cd6 100644 --- a/generated/prisma/index.d.ts +++ b/generated/prisma/index.d.ts @@ -83,7 +83,10 @@ export namespace $Enums { UNUSUAL_LOCATION: 'UNUSUAL_LOCATION', PRIVILEGE_ESCALATION: 'PRIVILEGE_ESCALATION', MALFORMED_REQUEST: 'MALFORMED_REQUEST', - BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT' + BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT', + OAUTH_INVALID_CLIENT: 'OAUTH_INVALID_CLIENT', + OAUTH_INVALID_GRANT: 'OAUTH_INVALID_GRANT', + OAUTH_INVALID_SCOPE: 'OAUTH_INVALID_SCOPE' }; export type SecurityEventType = (typeof SecurityEventType)[keyof typeof SecurityEventType] @@ -12203,6 +12206,9 @@ export namespace Prisma { platform: string | null mcpMethod: string | null toolName: string | null + oauthGrantType: string | null + usePKCE: boolean | null + redirectUri: string | null } export type AnalyticsRequestMaxAggregateOutputType = { @@ -12226,6 +12232,9 @@ export namespace Prisma { platform: string | null mcpMethod: string | null toolName: string | null + oauthGrantType: string | null + usePKCE: boolean | null + redirectUri: string | null } export type AnalyticsRequestCountAggregateOutputType = { @@ -12250,6 +12259,10 @@ export namespace Prisma { platform: number mcpMethod: number toolName: number + oauthGrantType: number + tokenScopes: number + usePKCE: number + redirectUri: number _all: number } @@ -12285,6 +12298,9 @@ export namespace Prisma { platform?: true mcpMethod?: true toolName?: true + oauthGrantType?: true + usePKCE?: true + redirectUri?: true } export type AnalyticsRequestMaxAggregateInputType = { @@ -12308,6 +12324,9 @@ export namespace Prisma { platform?: true mcpMethod?: true toolName?: true + oauthGrantType?: true + usePKCE?: true + redirectUri?: true } export type AnalyticsRequestCountAggregateInputType = { @@ -12332,6 +12351,10 @@ export namespace Prisma { platform?: true mcpMethod?: true toolName?: true + oauthGrantType?: true + tokenScopes?: true + usePKCE?: true + redirectUri?: true _all?: true } @@ -12443,6 +12466,10 @@ export namespace Prisma { platform: string | null mcpMethod: string | null toolName: string | null + oauthGrantType: string | null + tokenScopes: string[] + usePKCE: boolean | null + redirectUri: string | null _count: AnalyticsRequestCountAggregateOutputType | null _avg: AnalyticsRequestAvgAggregateOutputType | null _sum: AnalyticsRequestSumAggregateOutputType | null @@ -12486,6 +12513,10 @@ export namespace Prisma { platform?: boolean mcpMethod?: boolean toolName?: boolean + oauthGrantType?: boolean + tokenScopes?: boolean + usePKCE?: boolean + redirectUri?: boolean client?: boolean | AnalyticsRequest$clientArgs user?: boolean | AnalyticsRequest$userArgs mcpServer?: boolean | AnalyticsRequest$mcpServerArgs @@ -12513,6 +12544,10 @@ export namespace Prisma { platform?: boolean mcpMethod?: boolean toolName?: boolean + oauthGrantType?: boolean + tokenScopes?: boolean + usePKCE?: boolean + redirectUri?: boolean client?: boolean | AnalyticsRequest$clientArgs user?: boolean | AnalyticsRequest$userArgs mcpServer?: boolean | AnalyticsRequest$mcpServerArgs @@ -12540,6 +12575,10 @@ export namespace Prisma { platform?: boolean mcpMethod?: boolean toolName?: boolean + oauthGrantType?: boolean + tokenScopes?: boolean + usePKCE?: boolean + redirectUri?: boolean client?: boolean | AnalyticsRequest$clientArgs user?: boolean | AnalyticsRequest$userArgs mcpServer?: boolean | AnalyticsRequest$mcpServerArgs @@ -12567,9 +12606,13 @@ export namespace Prisma { platform?: boolean mcpMethod?: boolean toolName?: boolean + oauthGrantType?: boolean + tokenScopes?: boolean + usePKCE?: boolean + redirectUri?: boolean } - export type AnalyticsRequestOmit = $Extensions.GetOmit<"id" | "timestamp" | "endpoint" | "method" | "statusCode" | "responseTime" | "clientId" | "userId" | "mcpServerId" | "ssoProvider" | "userRole" | "scopes" | "organization" | "ipAddress" | "userAgent" | "country" | "city" | "clientType" | "platform" | "mcpMethod" | "toolName", ExtArgs["result"]["analyticsRequest"]> + export type AnalyticsRequestOmit = $Extensions.GetOmit<"id" | "timestamp" | "endpoint" | "method" | "statusCode" | "responseTime" | "clientId" | "userId" | "mcpServerId" | "ssoProvider" | "userRole" | "scopes" | "organization" | "ipAddress" | "userAgent" | "country" | "city" | "clientType" | "platform" | "mcpMethod" | "toolName" | "oauthGrantType" | "tokenScopes" | "usePKCE" | "redirectUri", ExtArgs["result"]["analyticsRequest"]> export type AnalyticsRequestInclude = { client?: boolean | AnalyticsRequest$clientArgs user?: boolean | AnalyticsRequest$userArgs @@ -12615,6 +12658,10 @@ export namespace Prisma { platform: string | null mcpMethod: string | null toolName: string | null + oauthGrantType: string | null + tokenScopes: string[] + usePKCE: boolean | null + redirectUri: string | null }, ExtArgs["result"]["analyticsRequest"]> composites: {} } @@ -13062,6 +13109,10 @@ export namespace Prisma { readonly platform: FieldRef<"AnalyticsRequest", 'String'> readonly mcpMethod: FieldRef<"AnalyticsRequest", 'String'> readonly toolName: FieldRef<"AnalyticsRequest", 'String'> + readonly oauthGrantType: FieldRef<"AnalyticsRequest", 'String'> + readonly tokenScopes: FieldRef<"AnalyticsRequest", 'String[]'> + readonly usePKCE: FieldRef<"AnalyticsRequest", 'Boolean'> + readonly redirectUri: FieldRef<"AnalyticsRequest", 'String'> } @@ -15028,7 +15079,11 @@ export namespace Prisma { clientType: 'clientType', platform: 'platform', mcpMethod: 'mcpMethod', - toolName: 'toolName' + toolName: 'toolName', + oauthGrantType: 'oauthGrantType', + tokenScopes: 'tokenScopes', + usePKCE: 'usePKCE', + redirectUri: 'redirectUri' }; export type AnalyticsRequestScalarFieldEnum = (typeof AnalyticsRequestScalarFieldEnum)[keyof typeof AnalyticsRequestScalarFieldEnum] @@ -15146,6 +15201,13 @@ export namespace Prisma { + /** + * Reference to a field of type 'Boolean' + */ + export type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'> + + + /** * Reference to a field of type 'SecurityEventType' */ @@ -15174,13 +15236,6 @@ export namespace Prisma { - /** - * Reference to a field of type 'Boolean' - */ - export type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'> - - - /** * Reference to a field of type 'Float' */ @@ -15857,6 +15912,10 @@ export namespace Prisma { platform?: StringNullableFilter<"AnalyticsRequest"> | string | null mcpMethod?: StringNullableFilter<"AnalyticsRequest"> | string | null toolName?: StringNullableFilter<"AnalyticsRequest"> | string | null + oauthGrantType?: StringNullableFilter<"AnalyticsRequest"> | string | null + tokenScopes?: StringNullableListFilter<"AnalyticsRequest"> + usePKCE?: BoolNullableFilter<"AnalyticsRequest"> | boolean | null + redirectUri?: StringNullableFilter<"AnalyticsRequest"> | string | null client?: XOR | null user?: XOR | null mcpServer?: XOR | null @@ -15884,6 +15943,10 @@ export namespace Prisma { platform?: SortOrderInput | SortOrder mcpMethod?: SortOrderInput | SortOrder toolName?: SortOrderInput | SortOrder + oauthGrantType?: SortOrderInput | SortOrder + tokenScopes?: SortOrder + usePKCE?: SortOrderInput | SortOrder + redirectUri?: SortOrderInput | SortOrder client?: ClientOrderByWithRelationInput user?: UserOrderByWithRelationInput mcpServer?: MCPServerOrderByWithRelationInput @@ -15914,6 +15977,10 @@ export namespace Prisma { platform?: StringNullableFilter<"AnalyticsRequest"> | string | null mcpMethod?: StringNullableFilter<"AnalyticsRequest"> | string | null toolName?: StringNullableFilter<"AnalyticsRequest"> | string | null + oauthGrantType?: StringNullableFilter<"AnalyticsRequest"> | string | null + tokenScopes?: StringNullableListFilter<"AnalyticsRequest"> + usePKCE?: BoolNullableFilter<"AnalyticsRequest"> | boolean | null + redirectUri?: StringNullableFilter<"AnalyticsRequest"> | string | null client?: XOR | null user?: XOR | null mcpServer?: XOR | null @@ -15941,6 +16008,10 @@ export namespace Prisma { platform?: SortOrderInput | SortOrder mcpMethod?: SortOrderInput | SortOrder toolName?: SortOrderInput | SortOrder + oauthGrantType?: SortOrderInput | SortOrder + tokenScopes?: SortOrder + usePKCE?: SortOrderInput | SortOrder + redirectUri?: SortOrderInput | SortOrder _count?: AnalyticsRequestCountOrderByAggregateInput _avg?: AnalyticsRequestAvgOrderByAggregateInput _max?: AnalyticsRequestMaxOrderByAggregateInput @@ -15973,6 +16044,10 @@ export namespace Prisma { platform?: StringNullableWithAggregatesFilter<"AnalyticsRequest"> | string | null mcpMethod?: StringNullableWithAggregatesFilter<"AnalyticsRequest"> | string | null toolName?: StringNullableWithAggregatesFilter<"AnalyticsRequest"> | string | null + oauthGrantType?: StringNullableWithAggregatesFilter<"AnalyticsRequest"> | string | null + tokenScopes?: StringNullableListFilter<"AnalyticsRequest"> + usePKCE?: BoolNullableWithAggregatesFilter<"AnalyticsRequest"> | boolean | null + redirectUri?: StringNullableWithAggregatesFilter<"AnalyticsRequest"> | string | null } export type AnalyticsSecurityWhereInput = { @@ -16808,6 +16883,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null client?: ClientCreateNestedOneWithoutAnalyticsRequestsInput user?: UserCreateNestedOneWithoutAnalyticsRequestsInput mcpServer?: MCPServerCreateNestedOneWithoutRequestsInput @@ -16835,6 +16914,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsRequestUpdateInput = { @@ -16856,6 +16939,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null client?: ClientUpdateOneWithoutAnalyticsRequestsNestedInput user?: UserUpdateOneWithoutAnalyticsRequestsNestedInput mcpServer?: MCPServerUpdateOneWithoutRequestsNestedInput @@ -16883,6 +16970,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsRequestCreateManyInput = { @@ -16907,6 +16998,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsRequestUpdateManyMutationInput = { @@ -16928,6 +17023,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsRequestUncheckedUpdateManyInput = { @@ -16952,6 +17051,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsSecurityCreateInput = { @@ -17653,6 +17756,11 @@ export namespace Prisma { not?: NestedIntFilter<$PrismaModel> | number } + export type BoolNullableFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> | null + not?: NestedBoolNullableFilter<$PrismaModel> | boolean | null + } + export type ClientNullableScalarRelationFilter = { is?: ClientWhereInput | null isNot?: ClientWhereInput | null @@ -17685,6 +17793,10 @@ export namespace Prisma { platform?: SortOrder mcpMethod?: SortOrder toolName?: SortOrder + oauthGrantType?: SortOrder + tokenScopes?: SortOrder + usePKCE?: SortOrder + redirectUri?: SortOrder } export type AnalyticsRequestAvgOrderByAggregateInput = { @@ -17713,6 +17825,9 @@ export namespace Prisma { platform?: SortOrder mcpMethod?: SortOrder toolName?: SortOrder + oauthGrantType?: SortOrder + usePKCE?: SortOrder + redirectUri?: SortOrder } export type AnalyticsRequestMinOrderByAggregateInput = { @@ -17736,6 +17851,9 @@ export namespace Prisma { platform?: SortOrder mcpMethod?: SortOrder toolName?: SortOrder + oauthGrantType?: SortOrder + usePKCE?: SortOrder + redirectUri?: SortOrder } export type AnalyticsRequestSumOrderByAggregateInput = { @@ -17759,6 +17877,14 @@ export namespace Prisma { _max?: NestedIntFilter<$PrismaModel> } + export type BoolNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> | null + not?: NestedBoolNullableWithAggregatesFilter<$PrismaModel> | boolean | null + _count?: NestedIntNullableFilter<$PrismaModel> + _min?: NestedBoolNullableFilter<$PrismaModel> + _max?: NestedBoolNullableFilter<$PrismaModel> + } + export type EnumSecurityEventTypeFilter<$PrismaModel = never> = { equals?: $Enums.SecurityEventType | EnumSecurityEventTypeFieldRefInput<$PrismaModel> in?: $Enums.SecurityEventType[] | ListEnumSecurityEventTypeFieldRefInput<$PrismaModel> @@ -18705,6 +18831,10 @@ export namespace Prisma { set: string[] } + export type AnalyticsRequestCreatetokenScopesInput = { + set: string[] + } + export type ClientCreateNestedOneWithoutAnalyticsRequestsInput = { create?: XOR connectOrCreate?: ClientCreateOrConnectWithoutAnalyticsRequestsInput @@ -18736,6 +18866,15 @@ export namespace Prisma { push?: string | string[] } + export type AnalyticsRequestUpdatetokenScopesInput = { + set?: string[] + push?: string | string[] + } + + export type NullableBoolFieldUpdateOperationsInput = { + set?: boolean | null + } + export type ClientUpdateOneWithoutAnalyticsRequestsNestedInput = { create?: XOR connectOrCreate?: ClientCreateOrConnectWithoutAnalyticsRequestsInput @@ -18983,6 +19122,11 @@ export namespace Prisma { _max?: NestedDateTimeFilter<$PrismaModel> } + export type NestedBoolNullableFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> | null + not?: NestedBoolNullableFilter<$PrismaModel> | boolean | null + } + export type NestedIntWithAggregatesFilter<$PrismaModel = never> = { equals?: number | IntFieldRefInput<$PrismaModel> in?: number[] | ListIntFieldRefInput<$PrismaModel> @@ -19010,6 +19154,14 @@ export namespace Prisma { not?: NestedFloatFilter<$PrismaModel> | number } + export type NestedBoolNullableWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> | null + not?: NestedBoolNullableWithAggregatesFilter<$PrismaModel> | boolean | null + _count?: NestedIntNullableFilter<$PrismaModel> + _min?: NestedBoolNullableFilter<$PrismaModel> + _max?: NestedBoolNullableFilter<$PrismaModel> + } + export type NestedEnumSecurityEventTypeFilter<$PrismaModel = never> = { equals?: $Enums.SecurityEventType | EnumSecurityEventTypeFieldRefInput<$PrismaModel> in?: $Enums.SecurityEventType[] | ListEnumSecurityEventTypeFieldRefInput<$PrismaModel> @@ -19272,6 +19424,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null client?: ClientCreateNestedOneWithoutAnalyticsRequestsInput mcpServer?: MCPServerCreateNestedOneWithoutRequestsInput } @@ -19297,6 +19453,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsRequestCreateOrConnectWithoutUserInput = { @@ -19582,6 +19742,10 @@ export namespace Prisma { platform?: StringNullableFilter<"AnalyticsRequest"> | string | null mcpMethod?: StringNullableFilter<"AnalyticsRequest"> | string | null toolName?: StringNullableFilter<"AnalyticsRequest"> | string | null + oauthGrantType?: StringNullableFilter<"AnalyticsRequest"> | string | null + tokenScopes?: StringNullableListFilter<"AnalyticsRequest"> + usePKCE?: BoolNullableFilter<"AnalyticsRequest"> | boolean | null + redirectUri?: StringNullableFilter<"AnalyticsRequest"> | string | null } export type AnalyticsSecurityUpsertWithWhereUniqueWithoutUserInput = { @@ -19921,6 +20085,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null user?: UserCreateNestedOneWithoutAnalyticsRequestsInput mcpServer?: MCPServerCreateNestedOneWithoutRequestsInput } @@ -19946,6 +20114,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsRequestCreateOrConnectWithoutClientInput = { @@ -20606,6 +20778,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null client?: ClientCreateNestedOneWithoutAnalyticsRequestsInput user?: UserCreateNestedOneWithoutAnalyticsRequestsInput } @@ -20631,6 +20807,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsRequestCreateOrConnectWithoutMcpServerInput = { @@ -21232,6 +21412,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsSecurityCreateManyUserInput = { @@ -21464,6 +21648,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null client?: ClientUpdateOneWithoutAnalyticsRequestsNestedInput mcpServer?: MCPServerUpdateOneWithoutRequestsNestedInput } @@ -21489,6 +21677,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsRequestUncheckedUpdateManyWithoutUserInput = { @@ -21512,6 +21704,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsSecurityUpdateWithoutUserInput = { @@ -21628,6 +21824,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsSecurityCreateManyClientInput = { @@ -21760,6 +21960,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null user?: UserUpdateOneWithoutAnalyticsRequestsNestedInput mcpServer?: MCPServerUpdateOneWithoutRequestsNestedInput } @@ -21785,6 +21989,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsRequestUncheckedUpdateManyWithoutClientInput = { @@ -21808,6 +22016,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsSecurityUpdateWithoutClientInput = { @@ -21894,6 +22106,10 @@ export namespace Prisma { platform?: string | null mcpMethod?: string | null toolName?: string | null + oauthGrantType?: string | null + tokenScopes?: AnalyticsRequestCreatetokenScopesInput | string[] + usePKCE?: boolean | null + redirectUri?: string | null } export type AnalyticsSecurityCreateManyMcpServerInput = { @@ -21936,6 +22152,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null client?: ClientUpdateOneWithoutAnalyticsRequestsNestedInput user?: UserUpdateOneWithoutAnalyticsRequestsNestedInput } @@ -21961,6 +22181,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsRequestUncheckedUpdateManyWithoutMcpServerInput = { @@ -21984,6 +22208,10 @@ export namespace Prisma { platform?: NullableStringFieldUpdateOperationsInput | string | null mcpMethod?: NullableStringFieldUpdateOperationsInput | string | null toolName?: NullableStringFieldUpdateOperationsInput | string | null + oauthGrantType?: NullableStringFieldUpdateOperationsInput | string | null + tokenScopes?: AnalyticsRequestUpdatetokenScopesInput | string[] + usePKCE?: NullableBoolFieldUpdateOperationsInput | boolean | null + redirectUri?: NullableStringFieldUpdateOperationsInput | string | null } export type AnalyticsSecurityUpdateWithoutMcpServerInput = { diff --git a/generated/prisma/index.js b/generated/prisma/index.js index 54d115a..489c0dd 100644 --- a/generated/prisma/index.js +++ b/generated/prisma/index.js @@ -204,7 +204,11 @@ exports.Prisma.AnalyticsRequestScalarFieldEnum = { clientType: 'clientType', platform: 'platform', mcpMethod: 'mcpMethod', - toolName: 'toolName' + toolName: 'toolName', + oauthGrantType: 'oauthGrantType', + tokenScopes: 'tokenScopes', + usePKCE: 'usePKCE', + redirectUri: 'redirectUri' }; exports.Prisma.AnalyticsSecurityScalarFieldEnum = { @@ -263,7 +267,10 @@ exports.SecurityEventType = exports.$Enums.SecurityEventType = { UNUSUAL_LOCATION: 'UNUSUAL_LOCATION', PRIVILEGE_ESCALATION: 'PRIVILEGE_ESCALATION', MALFORMED_REQUEST: 'MALFORMED_REQUEST', - BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT' + BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT', + OAUTH_INVALID_CLIENT: 'OAUTH_INVALID_CLIENT', + OAUTH_INVALID_GRANT: 'OAUTH_INVALID_GRANT', + OAUTH_INVALID_SCOPE: 'OAUTH_INVALID_SCOPE' }; exports.Prisma.ModelName = { @@ -327,8 +334,8 @@ const config = { } } }, - "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n engineType = \"library\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(cuid())\n name String?\n email String? @unique\n emailVerified DateTime?\n image String?\n accounts Account[]\n sessions Session[]\n clients Client[]\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n}\n\nmodel Account {\n id String @id @default(cuid())\n userId String\n type String\n provider String\n providerAccountId String\n refresh_token String? @db.Text\n access_token String? @db.Text\n expires_at Int?\n token_type String?\n scope String?\n id_token String? @db.Text\n session_state String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([provider, providerAccountId])\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionToken String @unique\n userId String\n expires DateTime\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel VerificationToken {\n identifier String\n token String\n expires DateTime\n\n @@unique([identifier, token])\n}\n\nmodel Client {\n id String @id @default(cuid())\n clientId String @unique @default(cuid())\n clientSecret String\n name String\n redirectUris String[]\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel AccessToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel AuthCode {\n id String @id @default(cuid())\n code String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n redirectUri String\n codeChallenge String?\n codeChallengeMethod String?\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel RefreshToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\n// Enhanced Analytics Schema for Enterprise MCP\nmodel MCPServer {\n id String @id @default(cuid())\n name String // \"CRM Server\", \"Finance API\", etc\n identifier String @unique // mcp://crm.company.com\n description String?\n version String?\n\n // Relations\n requests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n}\n\nmodel AnalyticsRequest {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n endpoint String // /mcp/sse, /mcp/mcp, etc\n method String // GET, POST, etc\n statusCode Int\n responseTime Int // milliseconds\n\n // Enhanced client/user tracking with proper relations\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n userId String?\n user User? @relation(fields: [userId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Enterprise SSO context\n ssoProvider String? // \"google\", \"azure-ad\", \"okta\"\n userRole String? // from JWT claims\n scopes String[] // OAuth scopes used\n organization String? // from SSO claims\n\n // Request metadata\n ipAddress String\n userAgent String @db.Text\n\n // Geographic data (optional, populated async)\n country String?\n city String?\n\n // Derived fields for performance\n clientType String? // mcp-client, browser, etc\n platform String? // windows, macos, linux\n\n // MCP-specific tracking\n mcpMethod String? // \"tools/list\", \"tools/call\", etc\n toolName String? // specific tool being called\n\n // Indexes for fast queries\n @@index([timestamp])\n @@index([endpoint])\n @@index([clientId])\n @@index([userId])\n @@index([mcpServerId])\n @@index([statusCode])\n @@index([timestamp, endpoint])\n @@index([timestamp, clientId])\n @@index([timestamp, userId])\n @@index([organization])\n @@index([ssoProvider])\n}\n\nenum SecurityEventType {\n AUTH_FAILURE\n INVALID_TOKEN\n SUSPICIOUS_ACTIVITY\n RATE_LIMIT_EXCEEDED\n UNAUTHORIZED_ACCESS\n TOKEN_REUSE\n UNUSUAL_LOCATION\n PRIVILEGE_ESCALATION\n MALFORMED_REQUEST\n BRUTE_FORCE_ATTEMPT\n}\n\nmodel AnalyticsSecurity {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n eventType SecurityEventType\n severity String // \"low\", \"medium\", \"high\", \"critical\"\n\n // Enhanced context\n userId String?\n user User? @relation(fields: [userId], references: [id])\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Request context\n ipAddress String\n userAgent String @db.Text\n endpoint String? // endpoint where event occurred\n\n // Geographic tracking\n country String?\n city String?\n\n // Enterprise context\n organization String?\n ssoProvider String?\n\n // Structured event details\n details Json // structured data instead of text\n\n // Risk scoring\n riskScore Int @default(0) // 0-100\n resolved Boolean @default(false)\n resolvedAt DateTime?\n resolvedBy String? // admin who resolved\n\n // Indexes for security queries\n @@index([timestamp])\n @@index([eventType])\n @@index([severity])\n @@index([ipAddress])\n @@index([userId])\n @@index([clientId])\n @@index([mcpServerId])\n @@index([timestamp, eventType])\n @@index([timestamp, severity])\n @@index([organization])\n @@index([resolved])\n @@index([riskScore])\n}\n", - "inlineSchemaHash": "6e39df96fa8b453ddd2f6ebcd37a5f7e6bec7c4c4ce65c34bece574730aeca32", + "inlineSchema": "generator client {\n provider = \"prisma-client-js\"\n output = \"../generated/prisma\"\n engineType = \"library\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel User {\n id String @id @default(cuid())\n name String?\n email String? @unique\n emailVerified DateTime?\n image String?\n accounts Account[]\n sessions Session[]\n clients Client[]\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n}\n\nmodel Account {\n id String @id @default(cuid())\n userId String\n type String\n provider String\n providerAccountId String\n refresh_token String? @db.Text\n access_token String? @db.Text\n expires_at Int?\n token_type String?\n scope String?\n id_token String? @db.Text\n session_state String?\n\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([provider, providerAccountId])\n}\n\nmodel Session {\n id String @id @default(cuid())\n sessionToken String @unique\n userId String\n expires DateTime\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n}\n\nmodel VerificationToken {\n identifier String\n token String\n expires DateTime\n\n @@unique([identifier, token])\n}\n\nmodel Client {\n id String @id @default(cuid())\n clientId String @unique @default(cuid())\n clientSecret String\n name String\n redirectUris String[]\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessTokens AccessToken[]\n authCodes AuthCode[]\n refreshTokens RefreshToken[]\n\n // Analytics relations\n analyticsRequests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel AccessToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel AuthCode {\n id String @id @default(cuid())\n code String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n redirectUri String\n codeChallenge String?\n codeChallengeMethod String?\n resource String?\n\n createdAt DateTime @default(now())\n}\n\nmodel RefreshToken {\n id String @id @default(cuid())\n token String @unique\n expiresAt DateTime\n clientId String\n client Client @relation(fields: [clientId], references: [id], onDelete: Cascade)\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n resource String?\n\n createdAt DateTime @default(now())\n}\n\n// Enhanced Analytics Schema for Enterprise MCP\nmodel MCPServer {\n id String @id @default(cuid())\n name String // \"CRM Server\", \"Finance API\", etc\n identifier String @unique // mcp://crm.company.com\n description String?\n version String?\n\n // Relations\n requests AnalyticsRequest[]\n securityEvents AnalyticsSecurity[]\n\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n}\n\nmodel AnalyticsRequest {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n endpoint String // /mcp/sse, /mcp/mcp, etc\n method String // GET, POST, etc\n statusCode Int\n responseTime Int // milliseconds\n\n // Enhanced client/user tracking with proper relations\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n userId String?\n user User? @relation(fields: [userId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Enterprise SSO context\n ssoProvider String? // \"google\", \"azure-ad\", \"okta\"\n userRole String? // from JWT claims\n scopes String[] // OAuth scopes used\n organization String? // from SSO claims\n\n // Request metadata\n ipAddress String\n userAgent String @db.Text\n\n // Geographic data (optional, populated async)\n country String?\n city String?\n\n // Derived fields for performance\n clientType String? // mcp-client, browser, etc\n platform String? // windows, macos, linux\n\n // MCP-specific tracking\n mcpMethod String? // \"tools/list\", \"tools/call\", etc\n toolName String? // specific tool being called\n\n // OAuth-specific tracking\n oauthGrantType String? // \"authorization_code\", \"refresh_token\", \"client_credentials\"\n tokenScopes String[] // OAuth scopes granted/requested\n usePKCE Boolean? // Whether PKCE was used in this flow\n redirectUri String? // OAuth redirect URI used\n\n // Indexes for fast queries\n @@index([timestamp])\n @@index([endpoint])\n @@index([clientId])\n @@index([userId])\n @@index([mcpServerId])\n @@index([statusCode])\n @@index([timestamp, endpoint])\n @@index([timestamp, clientId])\n @@index([timestamp, userId])\n @@index([organization])\n @@index([ssoProvider])\n @@index([oauthGrantType])\n @@index([usePKCE])\n}\n\nenum SecurityEventType {\n AUTH_FAILURE\n INVALID_TOKEN\n SUSPICIOUS_ACTIVITY\n RATE_LIMIT_EXCEEDED\n UNAUTHORIZED_ACCESS\n TOKEN_REUSE\n UNUSUAL_LOCATION\n PRIVILEGE_ESCALATION\n MALFORMED_REQUEST\n BRUTE_FORCE_ATTEMPT\n OAUTH_INVALID_CLIENT\n OAUTH_INVALID_GRANT\n OAUTH_INVALID_SCOPE\n}\n\nmodel AnalyticsSecurity {\n id String @id @default(cuid())\n timestamp DateTime @default(now())\n eventType SecurityEventType\n severity String // \"low\", \"medium\", \"high\", \"critical\"\n\n // Enhanced context\n userId String?\n user User? @relation(fields: [userId], references: [id])\n clientId String?\n client Client? @relation(fields: [clientId], references: [id])\n\n // MCP Server context\n mcpServerId String?\n mcpServer MCPServer? @relation(fields: [mcpServerId], references: [id])\n\n // Request context\n ipAddress String\n userAgent String @db.Text\n endpoint String? // endpoint where event occurred\n\n // Geographic tracking\n country String?\n city String?\n\n // Enterprise context\n organization String?\n ssoProvider String?\n\n // Structured event details\n details Json // structured data instead of text\n\n // Risk scoring\n riskScore Int @default(0) // 0-100\n resolved Boolean @default(false)\n resolvedAt DateTime?\n resolvedBy String? // admin who resolved\n\n // Indexes for security queries\n @@index([timestamp])\n @@index([eventType])\n @@index([severity])\n @@index([ipAddress])\n @@index([userId])\n @@index([clientId])\n @@index([mcpServerId])\n @@index([timestamp, eventType])\n @@index([timestamp, severity])\n @@index([organization])\n @@index([resolved])\n @@index([riskScore])\n}\n", + "inlineSchemaHash": "2df96eb60da0ca696b9a100a8371d1c423a326b13c07cafe74319174f0b9156e", "copyEngine": false } @@ -349,7 +356,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"image\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Account\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clients\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Account\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refresh_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"access_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires_at\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token_type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"id_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"session_state\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"provider\",\"providerAccountId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"provider\",\"providerAccountId\"]}],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessionToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"VerificationToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"identifier\",\"token\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"identifier\",\"token\"]}],\"isGenerated\":false},\"Client\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientSecret\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUris\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AccessToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuthCode\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallengeMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RefreshToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MCPServer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"statusCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"responseTime\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userRole\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toolName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsSecurity\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SecurityEventType\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"severity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"details\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"riskScore\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolved\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"SecurityEventType\":{\"values\":[{\"name\":\"AUTH_FAILURE\",\"dbName\":null},{\"name\":\"INVALID_TOKEN\",\"dbName\":null},{\"name\":\"SUSPICIOUS_ACTIVITY\",\"dbName\":null},{\"name\":\"RATE_LIMIT_EXCEEDED\",\"dbName\":null},{\"name\":\"UNAUTHORIZED_ACCESS\",\"dbName\":null},{\"name\":\"TOKEN_REUSE\",\"dbName\":null},{\"name\":\"UNUSUAL_LOCATION\",\"dbName\":null},{\"name\":\"PRIVILEGE_ESCALATION\",\"dbName\":null},{\"name\":\"MALFORMED_REQUEST\",\"dbName\":null},{\"name\":\"BRUTE_FORCE_ATTEMPT\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"email\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"image\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accounts\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Account\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessions\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Session\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clients\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Account\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"provider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"providerAccountId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refresh_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"access_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires_at\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token_type\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scope\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"id_token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"session_state\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccountToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"provider\",\"providerAccountId\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"provider\",\"providerAccountId\"]}],\"isGenerated\":false},\"Session\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"sessionToken\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"SessionToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"VerificationToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expires\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[[\"identifier\",\"token\"]],\"uniqueIndexes\":[{\"name\":null,\"fields\":[\"identifier\",\"token\"]}],\"isGenerated\":false},\"Client\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientSecret\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUris\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"ClientToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"accessTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AccessToken\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"authCodes\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AuthCode\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"refreshTokens\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"RefreshToken\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"analyticsRequests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AccessToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AccessTokenToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AccessTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AuthCode\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"code\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AuthCodeToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AuthCodeToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallenge\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"codeChallengeMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"RefreshToken\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"token\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"ClientToRefreshToken\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"RefreshTokenToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"relationOnDelete\":\"Cascade\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resource\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"MCPServer\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"identifier\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":true,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"description\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"requests\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsRequest\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"securityEvents\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"AnalyticsSecurity\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsRequest\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"method\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"statusCode\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"responseTime\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Int\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsRequestToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userRole\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"scopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"platform\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpMethod\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"toolName\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"oauthGrantType\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"tokenScopes\",\"kind\":\"scalar\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"usePKCE\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Boolean\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"redirectUri\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"AnalyticsSecurity\":{\"dbName\":null,\"schema\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"nativeType\":null,\"default\":{\"name\":\"cuid\",\"args\":[1]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"timestamp\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"nativeType\":null,\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"eventType\",\"kind\":\"enum\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"SecurityEventType\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"severity\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"user\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"User\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToUser\",\"relationFromFields\":[\"userId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"clientId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"client\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Client\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToClient\",\"relationFromFields\":[\"clientId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServerId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"mcpServer\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"MCPServer\",\"nativeType\":null,\"relationName\":\"AnalyticsSecurityToMCPServer\",\"relationFromFields\":[\"mcpServerId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":[\"Text\",[]],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"endpoint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"country\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"city\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"organization\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"ssoProvider\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"details\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Json\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"riskScore\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"nativeType\":null,\"default\":0,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolved\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"nativeType\":null,\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"resolvedBy\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"nativeType\":null,\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{\"SecurityEventType\":{\"values\":[{\"name\":\"AUTH_FAILURE\",\"dbName\":null},{\"name\":\"INVALID_TOKEN\",\"dbName\":null},{\"name\":\"SUSPICIOUS_ACTIVITY\",\"dbName\":null},{\"name\":\"RATE_LIMIT_EXCEEDED\",\"dbName\":null},{\"name\":\"UNAUTHORIZED_ACCESS\",\"dbName\":null},{\"name\":\"TOKEN_REUSE\",\"dbName\":null},{\"name\":\"UNUSUAL_LOCATION\",\"dbName\":null},{\"name\":\"PRIVILEGE_ESCALATION\",\"dbName\":null},{\"name\":\"MALFORMED_REQUEST\",\"dbName\":null},{\"name\":\"BRUTE_FORCE_ATTEMPT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_CLIENT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_GRANT\",\"dbName\":null},{\"name\":\"OAUTH_INVALID_SCOPE\",\"dbName\":null}],\"dbName\":null}},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined config.compilerWasm = undefined diff --git a/generated/prisma/package.json b/generated/prisma/package.json index 47c4492..5ef415f 100644 --- a/generated/prisma/package.json +++ b/generated/prisma/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-d3edf3846df8439dc0e0852928dc811d60ec22548bdbcac4071a46d1df5cbed7", + "name": "prisma-client-3fac36b4d77012252e99518c9f1100dca299accdd5b1765eace09d8f5bbf58e2", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/generated/prisma/schema.prisma b/generated/prisma/schema.prisma index fce58a3..2a9e2d0 100644 --- a/generated/prisma/schema.prisma +++ b/generated/prisma/schema.prisma @@ -182,6 +182,12 @@ model AnalyticsRequest { mcpMethod String? // "tools/list", "tools/call", etc toolName String? // specific tool being called + // OAuth-specific tracking + oauthGrantType String? // "authorization_code", "refresh_token", "client_credentials" + tokenScopes String[] // OAuth scopes granted/requested + usePKCE Boolean? // Whether PKCE was used in this flow + redirectUri String? // OAuth redirect URI used + // Indexes for fast queries @@index([timestamp]) @@index([endpoint]) @@ -194,6 +200,8 @@ model AnalyticsRequest { @@index([timestamp, userId]) @@index([organization]) @@index([ssoProvider]) + @@index([oauthGrantType]) + @@index([usePKCE]) } enum SecurityEventType { @@ -207,6 +215,9 @@ enum SecurityEventType { PRIVILEGE_ESCALATION MALFORMED_REQUEST BRUTE_FORCE_ATTEMPT + OAUTH_INVALID_CLIENT + OAUTH_INVALID_GRANT + OAUTH_INVALID_SCOPE } model AnalyticsSecurity { diff --git a/generated/prisma/wasm.js b/generated/prisma/wasm.js index b515eaf..c87316d 100644 --- a/generated/prisma/wasm.js +++ b/generated/prisma/wasm.js @@ -231,7 +231,11 @@ exports.Prisma.AnalyticsRequestScalarFieldEnum = { clientType: 'clientType', platform: 'platform', mcpMethod: 'mcpMethod', - toolName: 'toolName' + toolName: 'toolName', + oauthGrantType: 'oauthGrantType', + tokenScopes: 'tokenScopes', + usePKCE: 'usePKCE', + redirectUri: 'redirectUri' }; exports.Prisma.AnalyticsSecurityScalarFieldEnum = { @@ -290,7 +294,10 @@ exports.SecurityEventType = exports.$Enums.SecurityEventType = { UNUSUAL_LOCATION: 'UNUSUAL_LOCATION', PRIVILEGE_ESCALATION: 'PRIVILEGE_ESCALATION', MALFORMED_REQUEST: 'MALFORMED_REQUEST', - BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT' + BRUTE_FORCE_ATTEMPT: 'BRUTE_FORCE_ATTEMPT', + OAUTH_INVALID_CLIENT: 'OAUTH_INVALID_CLIENT', + OAUTH_INVALID_GRANT: 'OAUTH_INVALID_GRANT', + OAUTH_INVALID_SCOPE: 'OAUTH_INVALID_SCOPE' }; exports.Prisma.ModelName = { diff --git a/lib/analytics-db.ts b/lib/analytics-db.ts index 4afdbc5..bd57a43 100644 --- a/lib/analytics-db.ts +++ b/lib/analytics-db.ts @@ -23,6 +23,10 @@ interface RequestAnalytics { platform?: string; mcpMethod?: string; toolName?: string; + oauthGrantType?: string; + tokenScopes?: string[]; + usePKCE?: boolean; + redirectUri?: string; } interface SecurityEvent { @@ -109,7 +113,11 @@ class OptimizedAnalyticsCollector { clientType: req.clientType, platform: req.platform, mcpMethod: req.mcpMethod, - toolName: req.toolName + toolName: req.toolName, + oauthGrantType: req.oauthGrantType, + tokenScopes: req.tokenScopes || [], + usePKCE: req.usePKCE, + redirectUri: req.redirectUri })), skipDuplicates: true }); diff --git a/middleware.ts b/middleware.ts index cd157a4..c981ec9 100644 --- a/middleware.ts +++ b/middleware.ts @@ -25,8 +25,8 @@ export async function middleware(request: NextRequest) { const startTime = Date.now(); const pathname = request.nextUrl.pathname; - // Only collect analytics for MCP endpoints - const shouldCollectAnalytics = pathname.startsWith('/mcp/'); + // Collect analytics for MCP and OAuth endpoints + const shouldCollectAnalytics = pathname.startsWith('/mcp/') || pathname.startsWith('/api/oauth/'); // Let the request proceed const response = NextResponse.next(); @@ -61,10 +61,31 @@ export async function middleware(request: NextRequest) { let mcpMethod: string | undefined; let toolName: string | undefined; + // OAuth-specific context + let oauthGrantType: string | undefined; + let tokenScopes: string[] = []; + let usePKCE: boolean | undefined; + let redirectUri: string | undefined; + // Extract from request path/body if available if (pathname.includes('/mcp/')) { - // This would be more sophisticated in practice mcpMethod = request.method === 'POST' ? 'tools/call' : 'tools/list'; + } else if (pathname.includes('/oauth/')) { + // Extract OAuth-specific data from request + if (pathname.includes('/authorize')) { + const url = new URL(request.url); + oauthGrantType = 'authorization_code'; + usePKCE = url.searchParams.has('code_challenge'); + redirectUri = url.searchParams.get('redirect_uri') || undefined; + const scope = url.searchParams.get('scope'); + if (scope) tokenScopes = scope.split(' '); + } else if (pathname.includes('/token')) { + const contentType = request.headers.get('content-type'); + if (contentType?.includes('application/x-www-form-urlencoded')) { + // Would need to parse body for grant_type, but that's complex in middleware + // We'll set this in the OAuth route handlers instead + } + } } // Enhanced analytics data with enterprise context @@ -84,7 +105,11 @@ export async function middleware(request: NextRequest) { ipAddress: ip, userAgent, mcpMethod, - toolName + toolName, + oauthGrantType, + tokenScopes, + usePKCE, + redirectUri }; // Make a fetch call to our analytics API endpoint @@ -142,7 +167,8 @@ export async function middleware(request: NextRequest) { export const config = { matcher: [ - // Only match MCP endpoints for analytics collection + // Match MCP and OAuth endpoints for analytics collection '/mcp/:path*', + '/api/oauth/:path*', ], }; \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2dbb78f..aed9f06 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -182,6 +182,12 @@ model AnalyticsRequest { mcpMethod String? // "tools/list", "tools/call", etc toolName String? // specific tool being called + // OAuth-specific tracking + oauthGrantType String? // "authorization_code", "refresh_token", "client_credentials" + tokenScopes String[] // OAuth scopes granted/requested + usePKCE Boolean? // Whether PKCE was used in this flow + redirectUri String? // OAuth redirect URI used + // Indexes for fast queries @@index([timestamp]) @@index([endpoint]) @@ -194,6 +200,8 @@ model AnalyticsRequest { @@index([timestamp, userId]) @@index([organization]) @@index([ssoProvider]) + @@index([oauthGrantType]) + @@index([usePKCE]) } enum SecurityEventType { @@ -207,6 +215,9 @@ enum SecurityEventType { PRIVILEGE_ESCALATION MALFORMED_REQUEST BRUTE_FORCE_ATTEMPT + OAUTH_INVALID_CLIENT + OAUTH_INVALID_GRANT + OAUTH_INVALID_SCOPE } model AnalyticsSecurity { From ed2c5fa415c41d2938c07c2b055f4933bef3b4a3 Mon Sep 17 00:00:00 2001 From: Adesh Gairola Date: Tue, 1 Jul 2025 15:30:19 +1000 Subject: [PATCH 2/8] v0.4 --- app/analytics/page.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/app/analytics/page.tsx b/app/analytics/page.tsx index 2be3611..3d27d05 100644 --- a/app/analytics/page.tsx +++ b/app/analytics/page.tsx @@ -4,8 +4,6 @@ import { useState, useEffect, useCallback } from "react" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { - MetricCard, - DataTable, SecurityPanel, LoadingSkeleton, DashboardHeader, @@ -19,13 +17,8 @@ import { } from "@/components/analytics" import { BarChart3, - Globe, Activity, - Clock, AlertTriangle, - CheckCircle, - TrendingUp, - Server, Zap, } from "lucide-react" From 856e14fb516101682f36ee287f082a54f4a9aed8 Mon Sep 17 00:00:00 2001 From: Adesh Gairola Date: Tue, 1 Jul 2025 19:45:10 +1000 Subject: [PATCH 3/8] v0.5 --- app/analytics/page.tsx | 46 ++- app/api/analytics/route.ts | 32 +- app/mcp/[transport]/route.ts | 5 +- app/oauth/authorize/page.tsx | 45 +-- components/analytics/analytics-pie-chart.tsx | 108 ++++++ components/analytics/geographic-map.tsx | 245 ++++++++++++ components/analytics/grant-type-chart.tsx | 91 +++++ components/analytics/index.ts | 4 +- .../analytics/oauth-client-activity.tsx | 16 +- components/analytics/oauth-overview.tsx | 68 ++-- components/analytics/tool-usage-panel.tsx | 24 +- components/ui/chart.tsx | 353 ++++++++++++++++++ generated/prisma/edge.js | 3 +- generated/prisma/index.js | 9 +- .../libquery_engine-darwin-arm64.dylib.node | Bin 0 -> 19387696 bytes lib/analytics-db.ts | 347 ++++++++++++++++- package.json | 1 + pnpm-lock.yaml | 302 +++++++++++++++ 18 files changed, 1596 insertions(+), 103 deletions(-) create mode 100644 components/analytics/analytics-pie-chart.tsx create mode 100644 components/analytics/geographic-map.tsx create mode 100644 components/analytics/grant-type-chart.tsx create mode 100644 components/ui/chart.tsx create mode 100755 generated/prisma/libquery_engine-darwin-arm64.dylib.node diff --git a/app/analytics/page.tsx b/app/analytics/page.tsx index 3d27d05..5d24f35 100644 --- a/app/analytics/page.tsx +++ b/app/analytics/page.tsx @@ -7,13 +7,12 @@ import { SecurityPanel, LoadingSkeleton, DashboardHeader, - StatusBadge, OAuthOverview, OAuthSecurityPanel, OAuthClientActivity, TokenExpiration, - GrantTypeDistribution, - ToolUsagePanel + ToolUsagePanel, + GrantTypeChart } from "@/components/analytics" import { BarChart3, @@ -31,21 +30,25 @@ export default function AnalyticsPage() { errorRate: number } oauth?: { + totalUsers: number + activeUsers: number totalClients: number + activeClients: number activeTokens: number + recentAuthorizations: number tokenRefreshRate: number pkceAdoption: number - clientGrowth?: string - tokenGrowth?: string - refreshGrowth?: string - pkceGrowth?: string + userActivity?: string + clientActivity?: string clients?: { name: string clientId: string - tokenCount: number + uniqueUsers: number + activeTokens: number + recentRequests: number lastActivity: string - grantType: string - pkceEnabled: boolean + userNames: string + status: string }[] expiringTokens?: { clientName: string @@ -125,9 +128,12 @@ export default function AnalyticsPage() { const fetchAnalytics = useCallback(async () => { try { setLoading(true) - const response = await fetch(`/api/analytics?hours=${timeRange}`) + const response = await fetch(`/api/analytics?hours=${timeRange}`, { + credentials: 'include' + }) if (!response.ok) { - throw new Error("Failed to fetch analytics") + const errorData = await response.json() + throw new Error(errorData.error || "Failed to fetch analytics") } const analyticsData = await response.json() setData(analyticsData) @@ -237,7 +243,6 @@ export default function AnalyticsPage() { serverName={data.enterprise?.usersByMCPServer?.[0]?.mcpServerName} serverUrl={data.enterprise?.usersByMCPServer?.[0]?.mcpServerIdentifier} > - @@ -273,14 +278,15 @@ export default function AnalyticsPage() { {/* OAuth Overview */} {data.oauth && ( )} @@ -292,7 +298,7 @@ export default function AnalyticsPage() { {data.oauth?.clients && data.oauth.clients.length > 0 && ( )} @@ -302,9 +308,9 @@ export default function AnalyticsPage() { )} - {/* Grant Type Distribution */} + {/* Grant Type Distribution - Pie Chart */} {data.oauth?.grantTypes && data.oauth.grantTypes.length > 0 && ( - + )}
diff --git a/app/api/analytics/route.ts b/app/api/analytics/route.ts index 1373fbb..7599d0b 100644 --- a/app/api/analytics/route.ts +++ b/app/api/analytics/route.ts @@ -4,6 +4,7 @@ import { auth } from '@/app/auth'; export async function GET(request: NextRequest) { try { + // console.log('Request:', request); // Authentication check const session = await auth(); if (!session) { @@ -14,7 +15,7 @@ export async function GET(request: NextRequest) { const { searchParams } = new URL(request.url); const hours = parseInt(searchParams.get('hours') || '24'); - return getEnhancedAnalytics(hours); + return await getEnhancedAnalytics(hours); } catch (error) { console.error('Analytics API error:', error); return NextResponse.json( @@ -41,7 +42,13 @@ async function getEnhancedAnalytics(hours = 24) { usersByMCP, securityByOrg, privilegeEscalations, - toolUsage + toolUsage, + toolGeography, + oauthMetrics, + oauthClientActivity, + expiringTokens, + grantTypeDistribution, + oauthSecurityEvents ] = await Promise.all([ analyticsDB.getPerformanceMetrics(hours), analyticsDB.getTopEndpoints(hours, 10), @@ -50,13 +57,32 @@ async function getEnhancedAnalytics(hours = 24) { analyticsDB.getUsersByMCPServer(hours), analyticsDB.getSecurityEventsByOrganization(hours), analyticsDB.getUserPrivilegeEscalations(168), // Last 7 days - analyticsDB.getMCPToolUsage(hours) + analyticsDB.getMCPToolUsage(hours), + analyticsDB.getToolGeographyStats(hours), + analyticsDB.getOAuthMetrics(hours), + analyticsDB.getOAuthClientActivity(hours, 6), + analyticsDB.getExpiringTokens(24), + analyticsDB.getGrantTypeDistribution(hours), + analyticsDB.getOAuthSecurityEvents(hours) ]); const data = { performance, topEndpoints: endpoints, geography, + oauth: { + ...oauthMetrics, + clients: oauthClientActivity, + expiringTokens, + grantTypes: grantTypeDistribution + }, + oauthSecurity: oauthSecurityEvents, + toolUsage: { + tools: toolUsage, + geographic: toolGeography, + totalCalls: toolUsage.reduce((sum, tool) => sum + tool.usageCount, 0), + activeUsers: toolUsage.reduce((sum, tool) => sum + tool.uniqueUsers, 0) + }, security: { events: securityEvents, eventCount: securityEvents.length, diff --git a/app/mcp/[transport]/route.ts b/app/mcp/[transport]/route.ts index 2517de7..e6ea07f 100644 --- a/app/mcp/[transport]/route.ts +++ b/app/mcp/[transport]/route.ts @@ -180,6 +180,7 @@ async function logEnhancedAnalytics( toolName = params.name; } } + console.log('[MCP Analytics] Extracted:', { mcpMethod, toolName, hasParams: !!requestBody.params }); } // Get or create MCP server registration @@ -255,8 +256,8 @@ async function logEnhancedAnalytics( 'Content-Type': 'application/json', }, body: JSON.stringify(analyticsData) - }).catch(() => { - // Silent fail - analytics shouldn't break MCP requests + }).catch((error) => { + console.warn('Analytics collection failed:', error, 'Data:', analyticsData); }); } catch (error) { diff --git a/app/oauth/authorize/page.tsx b/app/oauth/authorize/page.tsx index 395003d..e6c786a 100644 --- a/app/oauth/authorize/page.tsx +++ b/app/oauth/authorize/page.tsx @@ -162,28 +162,29 @@ export default async function AuthorizePage({ } return ( -
-
-

- Authorize Application -

-
-

- The application{' '} - {client.name} is - requesting access to your account. -

-

- Do you want to grant access? -

-
-
-
+
+
+
+
+

+ Authorize Application +

+

+ The application{' '} + {client.name} is + requesting access to your account. +

+

+ Do you want to grant access? +

+
+ + @@ -191,13 +192,13 @@ export default async function AuthorizePage({ type="submit" name="consent" value="deny" - className="px-4 py-2 bg-gray-200 text-gray-800 rounded-md hover:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-gray-400 focus:ring-opacity-50" + className="w-full border border-border text-foreground hover:bg-muted px-4 py-2 rounded-md focus:outline-none focus:ring-2 focus:ring-border focus:ring-opacity-50 transition-colors" > Deny -
- + +
-
+
); } diff --git a/components/analytics/analytics-pie-chart.tsx b/components/analytics/analytics-pie-chart.tsx new file mode 100644 index 0000000..5bcd6bf --- /dev/null +++ b/components/analytics/analytics-pie-chart.tsx @@ -0,0 +1,108 @@ +"use client" + +import { Pie, PieChart, Cell, ResponsiveContainer } from "recharts" +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card" +import { + ChartConfig, + ChartContainer, + ChartLegend, + ChartLegendContent, +} from "@/components/ui/chart" + +interface PieChartData { + name: string + value: number + percentage?: number + fill?: string +} + +interface AnalyticsPieChartProps { + title: string + description?: string + data: PieChartData[] + dataKey?: string + nameKey?: string + className?: string + config?: ChartConfig +} + +// Default color palette using your globals.css colors +const defaultColors = [ + "var(--primary-600)", // Main primary color + "var(--secondary-600)", // Secondary color + "var(--primary-300)", // Lighter primary + "var(--secondary-300)", // Lighter secondary + "var(--primary-800)", // Darker primary + "var(--secondary-800)", // Darker secondary + "var(--base-600)", // Neutral + "var(--base-400)" // Light neutral +] + +export function AnalyticsPieChart({ + title, + description, + data, + dataKey = "value", + nameKey = "name", + className, + config +}: AnalyticsPieChartProps) { + + // Add colors to data if not provided + const chartData = data.map((item, index) => ({ + ...item, + fill: item.fill || defaultColors[index % defaultColors.length] + })) + + // Generate config if not provided + const chartConfig = config || chartData.reduce((acc, item, index) => { + const key = item.name.toLowerCase().replace(/[^a-z0-9]/g, '') + acc[key] = { + label: item.name, + color: item.fill || defaultColors[index % defaultColors.length] + } + return acc + }, {} as ChartConfig) + + return ( + + + {title} + {description && ( + {description} + )} + + + + + + {chartData.map((entry, index) => ( + + ))} + + } + className="-translate-y-2 flex-wrap gap-2 *:basis-1/4 *:justify-center" + /> + + + + + ) +} \ No newline at end of file diff --git a/components/analytics/geographic-map.tsx b/components/analytics/geographic-map.tsx new file mode 100644 index 0000000..960e8b0 --- /dev/null +++ b/components/analytics/geographic-map.tsx @@ -0,0 +1,245 @@ +"use client" + +import { useEffect, useRef } from "react" +import * as d3 from "d3" +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card" + +interface GeographicData { + country: string + city?: string | null + count: number + percentage: number + // You'd need to add coordinates for mapping + latitude?: number + longitude?: number +} + +interface GeographicMapProps { + data: GeographicData[] + title?: string + description?: string + className?: string +} + +export function GeographicMap({ + data, + title = "Tool Usage by Location", + description = "Geographic distribution of MCP tool calls", + className +}: GeographicMapProps) { + const svgRef = useRef(null) + + useEffect(() => { + if (!data.length || !svgRef.current) return + + // Clear previous content + d3.select(svgRef.current).selectAll("*").remove() + + // Map dimensions + const width = 800 + const height = 500 + const margin = { top: 20, right: 20, bottom: 20, left: 20 } + + // Create SVG + const svg = d3.select(svgRef.current) + .attr("viewBox", [0, 0, width, height]) + .attr("width", "100%") + .attr("height", "100%") + .style("max-width", "100%") + .style("height", "auto") + + // For now, create a simple world map placeholder with bubbles + // In a real implementation, you'd load world map data (TopoJSON/GeoJSON) + + // Mock coordinates for common countries (you'd get these from a geocoding service) + const countryCoords: Record = { + "United States": [-95.7129, 37.0902], + "Canada": [-106.3468, 56.1304], + "United Kingdom": [-2.0000, 53.0000], + "Germany": [10.0000, 51.0000], + "France": [2.0000, 46.0000], + "Japan": [138.0000, 36.0000], + "Australia": [133.0000, -25.0000], + "Brazil": [-55.0000, -10.0000], + "India": [77.0000, 20.0000], + "China": [104.0000, 35.0000] + } + + // Simple map projection (you'd use a proper projection in real implementation) + const xScale = d3.scaleLinear() + .domain([-180, 180]) + .range([margin.left, width - margin.right]) + + const yScale = d3.scaleLinear() + .domain([90, -90]) + .range([margin.top, height - margin.bottom]) + + // Color and size scales + const maxCount = d3.max(data, d => d.count) || 1 + const radiusScale = d3.scaleSqrt() + .domain([0, maxCount]) + .range([5, 30]) + + const colorScale = d3.scaleSequential() + .domain([0, maxCount]) + .interpolator(d3.interpolateBlues) + + // Add background + svg.append("rect") + .attr("width", width) + .attr("height", height) + .attr("fill", "var(--muted)") + .attr("stroke", "var(--border)") + + // Add grid lines + const xAxis = d3.axisBottom(xScale).tickSize(-height + margin.top + margin.bottom) + const yAxis = d3.axisLeft(yScale).tickSize(-width + margin.left + margin.right) + + svg.append("g") + .attr("class", "grid") + .attr("transform", `translate(0,${height - margin.bottom})`) + .call(xAxis) + .selectAll("text").remove() // Hide tick labels + .selectAll(".grid line") + .attr("stroke", "var(--border)") + .attr("stroke-opacity", 0.3) + + svg.append("g") + .attr("class", "grid") + .attr("transform", `translate(${margin.left},0)`) + .call(yAxis) + .selectAll("text").remove() // Hide tick labels + .selectAll(".grid line") + .attr("stroke", "var(--border)") + .attr("stroke-opacity", 0.3) + + // Add circles for each country with data + const circles = svg.selectAll("circle") + .data(data.filter(d => countryCoords[d.country])) + .enter() + .append("circle") + .attr("cx", d => { + const coords = countryCoords[d.country] + return coords ? xScale(coords[0]) : 0 + }) + .attr("cy", d => { + const coords = countryCoords[d.country] + return coords ? yScale(coords[1]) : 0 + }) + .attr("r", 0) // Start with 0 radius for animation + .attr("fill", d => colorScale(d.count)) + .attr("stroke", "var(--primary)") + .attr("stroke-width", 2) + .attr("opacity", 0.8) + .style("cursor", "pointer") + + // Animate circles + circles.transition() + .duration(1000) + .delay((d, i) => i * 100) + .attr("r", d => radiusScale(d.count)) + + // Add tooltips + const tooltip = d3.select("body").append("div") + .attr("class", "d3-tooltip") + .style("position", "absolute") + .style("background", "var(--background)") + .style("border", "1px solid var(--border)") + .style("border-radius", "6px") + .style("padding", "8px") + .style("font-size", "12px") + .style("box-shadow", "0 4px 6px rgba(0, 0, 0, 0.1)") + .style("pointer-events", "none") + .style("opacity", 0) + .style("z-index", 1000) + + circles + .on("mouseover", (event, d) => { + tooltip.transition().duration(200).style("opacity", 1) + tooltip.html(` + ${d.country}
+ ${d.city ? `${d.city}
` : ''} + ${d.count} tool calls
+ ${d.percentage}% of total usage + `) + .style("left", (event.pageX + 10) + "px") + .style("top", (event.pageY - 10) + "px") + }) + .on("mousemove", (event) => { + tooltip + .style("left", (event.pageX + 10) + "px") + .style("top", (event.pageY - 10) + "px") + }) + .on("mouseout", () => { + tooltip.transition().duration(200).style("opacity", 0) + }) + + // Add labels for countries + svg.selectAll("text.country-label") + .data(data.filter(d => countryCoords[d.country])) + .enter() + .append("text") + .attr("class", "country-label") + .attr("x", d => { + const coords = countryCoords[d.country] + return coords ? xScale(coords[0]) : 0 + }) + .attr("y", d => { + const coords = countryCoords[d.country] + return coords ? yScale(coords[1]) + radiusScale(d.count) + 15 : 0 + }) + .attr("text-anchor", "middle") + .attr("font-size", "12px") + .attr("fill", "var(--foreground)") + .attr("font-weight", "500") + .text(d => d.country) + + // Cleanup function + return () => { + d3.select("body").selectAll(".d3-tooltip").remove() + } + + }, [data]) + + return ( + + + {title} + {description && ( + {description} + )} + + +
+ +
+ + {/* Legend */} +
+
+
+ Low usage +
+
+
+ Medium usage +
+
+
+ High usage +
+
+
+
+ ) +} \ No newline at end of file diff --git a/components/analytics/grant-type-chart.tsx b/components/analytics/grant-type-chart.tsx new file mode 100644 index 0000000..5d06469 --- /dev/null +++ b/components/analytics/grant-type-chart.tsx @@ -0,0 +1,91 @@ +"use client" + +import { AnalyticsPieChart } from "./analytics-pie-chart" + +interface GrantType { + type: string + count: number + percentage: number +} + +interface GrantTypeChartProps { + grantTypes: GrantType[] + className?: string +} + +export function GrantTypeChart({ grantTypes, className }: GrantTypeChartProps) { + // Color mapping for grant types + const getGrantTypeColor = (type: string) => { + switch (type) { + case 'authorization_code': + return "var(--primary-600)" + case 'refresh_token': + return "var(--secondary-600)" + case 'client_credentials': + return "var(--primary-300)" + case 'client_registration': + return "var(--secondary-300)" + case 'device_code': + return "var(--base-600)" + default: + return "var(--base-400)" + } + } + + // Transform grant type data for the pie chart - key is using the original type + const chartData = grantTypes.map(grant => ({ + grantType: grant.type, // Keep original for config key + name: formatGrantTypeName(grant.type), // Display name + value: grant.count, + percentage: grant.percentage, + fill: getGrantTypeColor(grant.type) + })) + + // Custom config for grant types - keys must match data keys + const grantTypeConfig = grantTypes.reduce((config, grant) => { + config[grant.type] = { + label: formatGrantTypeName(grant.type), + color: getGrantTypeColor(grant.type) + } + return config + }, {} as Record) + + // Add the main data key config + grantTypeConfig.value = { + label: "Count", + color: "transparent" // Not used for pie charts + } + + return ( + + ) +} + +// Helper function to format grant type names for display +function formatGrantTypeName(type: string): string { + switch (type) { + case 'authorization_code': + return 'Authorization Code' + case 'refresh_token': + return 'Refresh Token' + case 'client_credentials': + return 'Client Credentials' + case 'client_registration': + return 'Client Registration' + case 'device_code': + return 'Device Code' + default: + // Fallback: capitalize and replace underscores + return type + .split('_') + .map(word => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' ') + } +} \ No newline at end of file diff --git a/components/analytics/index.ts b/components/analytics/index.ts index 2fd7abe..c19b34c 100644 --- a/components/analytics/index.ts +++ b/components/analytics/index.ts @@ -6,4 +6,6 @@ export { DashboardHeader, StatusBadge } from "./dashboard-header" export { OAuthOverview } from "./oauth-overview" export { OAuthSecurityPanel } from "./oauth-security-panel" export { OAuthClientActivity, TokenExpiration, GrantTypeDistribution } from "./oauth-client-activity" -export { ToolUsagePanel } from "./tool-usage-panel" \ No newline at end of file +export { ToolUsagePanel } from "./tool-usage-panel" +export { AnalyticsPieChart } from "./analytics-pie-chart" +export { GrantTypeChart } from "./grant-type-chart" \ No newline at end of file diff --git a/components/analytics/oauth-client-activity.tsx b/components/analytics/oauth-client-activity.tsx index b08dbd2..70749ec 100644 --- a/components/analytics/oauth-client-activity.tsx +++ b/components/analytics/oauth-client-activity.tsx @@ -5,10 +5,12 @@ import { DataTable } from "./data-table" interface OAuthClient { name: string clientId: string - tokenCount: number + uniqueUsers: number + activeTokens: number + recentRequests: number lastActivity: string - grantType: string - pkceEnabled: boolean + userNames: string + status: string } interface OAuthClientActivityProps { @@ -25,10 +27,10 @@ export function OAuthClientActivity({ const formatData = (clients: OAuthClient[]) => { return clients.slice(0, maxItems).map(client => ({ primary: client.name, - secondary: client.grantType, - value: `${client.tokenCount} tokens`, - badge: client.pkceEnabled ? "PKCE" : "Basic", - badgeVariant: (client.pkceEnabled ? "secondary" : "outline") as "secondary" | "outline" + secondary: `${client.uniqueUsers} user${client.uniqueUsers !== 1 ? 's' : ''} • ${client.userNames}`, + value: `${client.activeTokens} active tokens`, + badge: client.status, + badgeVariant: (client.status === "Active" ? "secondary" : "outline") as "secondary" | "outline" })) } diff --git a/components/analytics/oauth-overview.tsx b/components/analytics/oauth-overview.tsx index cbc3100..2fd07de 100644 --- a/components/analytics/oauth-overview.tsx +++ b/components/analytics/oauth-overview.tsx @@ -1,69 +1,73 @@ import type React from "react" -import { Key, Users, RefreshCw, Shield } from "lucide-react" +import { Key, Users, RefreshCw, UserCheck } from "lucide-react" import { MetricCard } from "./metric-card" interface OAuthOverviewProps { + totalUsers: number + activeUsers: number totalClients: number activeTokens: number + recentAuthorizations: number tokenRefreshRate: number pkceAdoption: number - clientGrowth?: string - tokenGrowth?: string - refreshGrowth?: string - pkceGrowth?: string + userActivity?: string + clientActivity?: string } export function OAuthOverview({ + totalUsers, + activeUsers, totalClients, activeTokens, + recentAuthorizations, tokenRefreshRate, pkceAdoption, - clientGrowth = "+0%", - tokenGrowth = "+0%", - refreshGrowth = "+0%", - pkceGrowth = "+0%" + userActivity, + clientActivity }: OAuthOverviewProps) { + const userActivityRate = totalUsers > 0 ? Math.round((activeUsers / totalUsers) * 100) : 0; + return (

- OAuth Server Overview + MCP OAuth Server Overview

= 70 ? "positive" : userActivityRate >= 30 ? "neutral" : "negative"} + subtitle="authorized MCP access" + /> + = 70 ? "positive" : userActivityRate >= 30 ? "neutral" : "negative"} + subtitle="with valid tokens" /> - = 80 ? "positive" : pkceAdoption >= 50 ? "neutral" : "negative"} - subtitle="security compliance" + change={`${Math.round(tokenRefreshRate * 100) / 100}/h refreshes`} + changeType={recentAuthorizations > 0 ? "positive" : "neutral"} + subtitle="new OAuth flows" />
diff --git a/components/analytics/tool-usage-panel.tsx b/components/analytics/tool-usage-panel.tsx index 0851080..d39372d 100644 --- a/components/analytics/tool-usage-panel.tsx +++ b/components/analytics/tool-usage-panel.tsx @@ -8,6 +8,10 @@ interface ToolUsage { usageCount: number uniqueUsers: number avgResponseTime?: number + maxResponseTime?: number + minResponseTime?: number + errorCount?: number + errorRate?: number } interface GeographicUsage { @@ -31,13 +35,19 @@ export function ToolUsagePanel({ activeUsers = 0 }: ToolUsagePanelProps) { const formatToolData = (tools: ToolUsage[]) => { - return tools.map(tool => ({ - primary: tool.toolName, - secondary: tool.mcpMethod, - value: `${tool.usageCount} calls`, - badge: `${tool.uniqueUsers} users`, - badgeVariant: "secondary" as const - })) + return tools.map(tool => { + const responseTime = tool.avgResponseTime || 0; + return { + primary: tool.toolName, + secondary: `${tool.mcpMethod} • ${responseTime}ms avg`, + value: `${tool.usageCount} calls`, + badge: responseTime > 1000 ? `SLOW (${responseTime}ms)` : + responseTime > 500 ? `${responseTime}ms` : + `${responseTime}ms`, + badgeVariant: (responseTime > 1000 ? "destructive" : + responseTime > 500 ? "outline" : "secondary") as "destructive" | "outline" | "secondary" + }; + }); } const formatGeoData = (geo: GeographicUsage[]) => { diff --git a/components/ui/chart.tsx b/components/ui/chart.tsx new file mode 100644 index 0000000..97cc280 --- /dev/null +++ b/components/ui/chart.tsx @@ -0,0 +1,353 @@ +"use client" + +import * as React from "react" +import * as RechartsPrimitive from "recharts" + +import { cn } from "@/lib/utils" + +// Format: { THEME_NAME: CSS_SELECTOR } +const THEMES = { light: "", dark: ".dark" } as const + +export type ChartConfig = { + [k in string]: { + label?: React.ReactNode + icon?: React.ComponentType + } & ( + | { color?: string; theme?: never } + | { color?: never; theme: Record } + ) +} + +type ChartContextProps = { + config: ChartConfig +} + +const ChartContext = React.createContext(null) + +function useChart() { + const context = React.useContext(ChartContext) + + if (!context) { + throw new Error("useChart must be used within a ") + } + + return context +} + +function ChartContainer({ + id, + className, + children, + config, + ...props +}: React.ComponentProps<"div"> & { + config: ChartConfig + children: React.ComponentProps< + typeof RechartsPrimitive.ResponsiveContainer + >["children"] +}) { + const uniqueId = React.useId() + const chartId = `chart-${id || uniqueId.replace(/:/g, "")}` + + return ( + +
+ + + {children} + +
+
+ ) +} + +const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => { + const colorConfig = Object.entries(config).filter( + ([, config]) => config.theme || config.color + ) + + if (!colorConfig.length) { + return null + } + + return ( +