authorizeCurrentWorkspace( $request, 'manageTeam', 'Not authorized to manage API keys.', ); if (! $workspace instanceof Workspace) { return $workspace; } $validated = $request->validate(['api_key_id' => ['required', 'string']]); // Personal access API keys only — cannot revoke the caller's own MCP // OAuth session (even when it shares this workspace_id). $token = AccessToken::where('user_id', $request->user()->id) ->where('workspace_id', $workspace->id) ->where('revoked', false) ->personalAccessApiKey() ->find(data_get($validated, 'api_key_id')); if (! $token) { return Response::error('API key not found.'); } $token->forceFill(['revoked' => true])->saveQuietly(); return Response::structured(['deleted' => true]); } public function schema(JsonSchema $schema): array { return [ 'api_key_id' => $schema->string()->required()->description('The API key ID to revoke.'), ]; } }