UNPKG

@gohcltech/bitbucket-mcp

Version:

Bitbucket integration for Claude via Model Context Protocol

211 lines 7.72 kB
/** * @fileoverview Authentication capabilities and scope management for Bitbucket MCP server. * * This module defines the capability scopes available for different authentication methods * and maps them to tool categories. It allows the server to dynamically determine which * tools should be available based on the authenticated user's capabilities. * * ## Authentication Methods and Capabilities * * **API Token (username + token)** * - User-account level access * - Can access all workspaces and repositories the user has permission to * - Full scope support for all tool categories * * **Repository Token (bearer token)** * - Single repository access only * - Limited to the specific repository it was created for * - Cannot access workspace management or issues * * ## Scope Definitions * * Capabilities are organized by Bitbucket API scope: * - `workspace:read` - Read workspace data (list workspaces, get workspace info) * - `workspace:admin` - Manage workspace (create, update, delete workspaces) * - `repository:read` - Read repository data * - `repository:write` - Write to repositories (create, update) * - `repository:admin` - Administer repositories (delete, settings) * - `pullrequest:read` - Read pull request data * - `pullrequest:write` - Create and manage pull requests * - `issue:read` - Read issues and issue tracking data * - `issue:write` - Create and manage issues * - `issue:admin` - Administer issue tracking */ import { AuthMethod } from './types.js'; /** * Individual capability scope names that map to Bitbucket API permissions. */ export var Capability; (function (Capability) { Capability["WORKSPACE_READ"] = "workspace:read"; Capability["WORKSPACE_ADMIN"] = "workspace:admin"; Capability["REPOSITORY_READ"] = "repository:read"; Capability["REPOSITORY_WRITE"] = "repository:write"; Capability["REPOSITORY_ADMIN"] = "repository:admin"; Capability["PULLREQUEST_READ"] = "pullrequest:read"; Capability["PULLREQUEST_WRITE"] = "pullrequest:write"; Capability["ISSUE_READ"] = "issue:read"; Capability["ISSUE_WRITE"] = "issue:write"; Capability["ISSUE_ADMIN"] = "issue:admin"; })(Capability || (Capability = {})); /** * Tool categories that require specific capabilities to function. */ export var ToolCategory; (function (ToolCategory) { ToolCategory["WORKSPACE"] = "workspace"; ToolCategory["REPOSITORY"] = "repository"; ToolCategory["BRANCH"] = "branch"; ToolCategory["PULL_REQUEST"] = "pull_request"; ToolCategory["COMMIT"] = "commit"; ToolCategory["ISSUE"] = "issue"; })(ToolCategory || (ToolCategory = {})); /** * Maps tool categories to their required capabilities. * If a capability is missing, the tool category will be filtered out. */ const TOOL_CAPABILITY_REQUIREMENTS = { [ToolCategory.WORKSPACE]: [Capability.WORKSPACE_READ], [ToolCategory.REPOSITORY]: [Capability.REPOSITORY_READ], [ToolCategory.BRANCH]: [Capability.REPOSITORY_READ], [ToolCategory.PULL_REQUEST]: [Capability.PULLREQUEST_READ], [ToolCategory.COMMIT]: [Capability.REPOSITORY_READ], [ToolCategory.ISSUE]: [Capability.ISSUE_READ], }; /** * Capability sets for different authentication methods. * Defines what capabilities are available for each auth method. */ const AUTH_METHOD_CAPABILITIES = { [AuthMethod.API_TOKEN]: [ // API Tokens have full access to workspaces and repositories Capability.WORKSPACE_READ, Capability.WORKSPACE_ADMIN, Capability.REPOSITORY_READ, Capability.REPOSITORY_WRITE, Capability.REPOSITORY_ADMIN, Capability.PULLREQUEST_READ, Capability.PULLREQUEST_WRITE, Capability.ISSUE_READ, Capability.ISSUE_WRITE, Capability.ISSUE_ADMIN, ], [AuthMethod.REPOSITORY_TOKEN]: [ // Repository tokens are limited to single repository, no workspace or issue access Capability.REPOSITORY_READ, Capability.REPOSITORY_WRITE, Capability.PULLREQUEST_READ, Capability.PULLREQUEST_WRITE, // Notably missing: // - WORKSPACE_READ / WORKSPACE_ADMIN (cannot access workspace management) // - ISSUE_READ / ISSUE_WRITE / ISSUE_ADMIN (cannot access issue tracking) ], }; /** * Represents the set of capabilities available to the current authentication. */ export class AuthCapabilities { capabilities; authMethod; /** * Creates a new AuthCapabilities instance from authentication config. * * @param authConfig - The authentication configuration */ constructor(authConfig) { this.authMethod = authConfig.method; const caps = AUTH_METHOD_CAPABILITIES[authConfig.method] || []; this.capabilities = new Set(caps); } /** * Gets the authentication method used. * * @returns The authentication method */ getAuthMethod() { return this.authMethod; } /** * Checks if a specific capability is available. * * @param capability - The capability to check * @returns True if the capability is available */ hasCapability(capability) { return this.capabilities.has(capability); } /** * Checks if all required capabilities are available. * * @param capabilities - Array of capabilities to check * @returns True if all capabilities are available */ hasAllCapabilities(capabilities) { return capabilities.every(cap => this.capabilities.has(cap)); } /** * Gets all available capabilities. * * @returns Array of available capabilities */ getAvailableCapabilities() { return Array.from(this.capabilities); } /** * Checks if a tool category is available based on current capabilities. * * @param category - The tool category to check * @returns True if the tool category's requirements are met */ isToolCategoryAvailable(category) { const requirements = TOOL_CAPABILITY_REQUIREMENTS[category]; if (!requirements) { // Unknown category, allow it return true; } return this.hasAllCapabilities(requirements); } /** * Gets all available tool categories. * * @returns Array of available tool categories */ getAvailableToolCategories() { return Object.values(ToolCategory).filter(category => this.isToolCategoryAvailable(category)); } /** * Gets tool categories that are NOT available (filtered out). * * @returns Array of unavailable tool categories */ getUnavailableToolCategories() { return Object.values(ToolCategory).filter(category => !this.isToolCategoryAvailable(category)); } /** * Gets a detailed description of why a tool category is unavailable. * * @param category - The tool category to check * @returns String describing missing capabilities, or empty string if available */ getUnavailabilityReason(category) { if (this.isToolCategoryAvailable(category)) { return ''; } const requirements = TOOL_CAPABILITY_REQUIREMENTS[category]; if (!requirements) { return ''; } const missing = requirements.filter(req => !this.capabilities.has(req)); return `Missing capabilities: ${missing.join(', ')}`; } } /** * Creates an AuthCapabilities instance from authentication config. * * @param authConfig - The authentication configuration * @returns AuthCapabilities instance */ export function createAuthCapabilities(authConfig) { return new AuthCapabilities(authConfig); } //# sourceMappingURL=auth-capabilities.js.map