UNPKG

@gohcltech/bitbucket-mcp

Version:

Bitbucket integration for Claude via Model Context Protocol

278 lines 10.9 kB
/** * @fileoverview Consolidated repository management tool for v2.1. * * Replaces v2.0 tools: list_repositories, get_repository, create_repository, update_repository, delete_repository * Consolidates 5 tools into 1 with action-based routing. */ import { ConsolidatedBaseTool } from './consolidated-base-tool.js'; import { ToolCategory } from '../auth-capabilities.js'; import { ManageRepositoriesArgsSchema, } from '../types/consolidated-tools.js'; import { validateWithSchemaOrThrow, validateRequired } from '../utils/index.js'; /** * Consolidated repository management tool for v2.1. * * Provides unified repository management operations with action-based routing. * * **Replaces v2.0 tools:** * - list_repositories * - get_repository * - create_repository * - update_repository * - delete_repository * * **Actions:** * - `list`: List repositories in a workspace * - `get`: Get detailed repository information * - `create`: Create a new repository * - `update`: Update repository settings and metadata * - `delete`: Delete a repository * * @example * ```typescript * // List repositories in workspace * const response = await tool.execute({ * action: 'list', * workspaceSlug: 'my-workspace' * }); * * // Create a new repository * const response = await tool.execute({ * action: 'create', * workspaceSlug: 'my-workspace', * name: 'my-repo', * description: 'Repository description', * isPrivate: true * }); * * // Update repository * const response = await tool.execute({ * action: 'update', * workspaceSlug: 'my-workspace', * repoSlug: 'my-repo', * description: 'Updated description', * hasIssues: true * }); * ``` */ export class ManageRepositoriesTool extends ConsolidatedBaseTool { getTools() { return [ { name: 'manage_repositories', description: 'Manage repositories: list, get, create, update, or delete repositories', inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['list', 'get', 'create', 'update', 'delete'], description: 'Action to perform: list, get, create, update, or delete repositories', }, workspaceSlug: { type: 'string', description: 'Workspace slug (required)', }, repoSlug: { type: 'string', description: 'Repository slug (required for get/update/delete)', }, name: { type: 'string', description: 'Repository name (required for create, optional for update)', }, description: { type: 'string', description: 'Repository description (optional)', }, isPrivate: { type: 'boolean', description: 'Make repository private (optional)', }, language: { type: 'string', description: 'Primary language (optional, for update)', }, website: { type: 'string', description: 'Website URL (optional, for update)', }, hasIssues: { type: 'boolean', description: 'Enable/disable issues (optional, for update)', }, hasWiki: { type: 'boolean', description: 'Enable/disable wiki (optional, for update)', }, forkPolicy: { type: 'string', enum: ['allow_forks', 'no_public_forks', 'no_forks'], description: 'Fork policy (optional, for update)', }, }, required: ['action', 'workspaceSlug'], }, }, ]; } getToolCategory() { return ToolCategory.REPOSITORY; } getActionHandler(action) { const actionHandlers = { 'list': this.handleListRepositories.bind(this), 'get': this.handleGetRepository.bind(this), 'create': this.handleCreateRepository.bind(this), 'update': this.handleUpdateRepository.bind(this), 'delete': this.handleDeleteRepository.bind(this), }; return actionHandlers[action] || null; } validateActionParams(action, args) { // All actions require workspace validateRequired(args, ['workspaceSlug'], `manage_repositories.${action}`); switch (action) { case 'list': // Only requires workspace break; case 'get': case 'delete': validateRequired(args, ['repoSlug'], `manage_repositories.${action}`); break; case 'create': validateRequired(args, ['name'], `manage_repositories.${action}`); break; case 'update': validateRequired(args, ['repoSlug'], `manage_repositories.${action}`); break; } } /** * Handler for listing repositories in a workspace. * * @param args - Tool arguments (workspace) * @returns List of repositories with metadata */ async handleListRepositories(args) { return this.createToolResponse(async () => { // Validate arguments validateWithSchemaOrThrow(ManageRepositoriesArgsSchema, args, 'manage_repositories.list'); const typedArgs = args; // Fetch repositories const result = await this.client.getRepositories(typedArgs.workspaceSlug); return { repositories: result.values, count: result.values.length, page: result.page || 1, pageLen: result.pagelen || result.values.length, nextUrl: result.next, }; }, { toolName: 'manage_repositories', operationName: 'list_repositories', args, }); } /** * Handler for getting detailed information about a repository. * * @param args - Tool arguments (must include repoSlug) * @returns Detailed repository information */ async handleGetRepository(args) { return this.createToolResponse(async () => { // Validate arguments validateWithSchemaOrThrow(ManageRepositoriesArgsSchema, args, 'manage_repositories.get'); const typedArgs = args; // Fetch repository details const repository = await this.client.getRepository(typedArgs.workspaceSlug, typedArgs.repoSlug); return repository; }, { toolName: 'manage_repositories', operationName: 'get_repository', args, }); } /** * Handler for creating a new repository. * * @param args - Tool arguments (must include name) * @returns Created repository information */ async handleCreateRepository(args) { return this.createToolResponse(async () => { // Validate arguments validateWithSchemaOrThrow(ManageRepositoriesArgsSchema, args, 'manage_repositories.create'); const typedArgs = args; // Build repository creation payload const payload = {}; if (typedArgs.description !== undefined && typedArgs.description !== null) { payload.description = typedArgs.description; } if (typedArgs.isPrivate !== undefined && typedArgs.isPrivate !== null) { payload.is_private = typedArgs.isPrivate; } // Create repository const repository = await this.client.createRepository(typedArgs.workspaceSlug, typedArgs.name, payload); return repository; }, { toolName: 'manage_repositories', operationName: 'create_repository', args, }); } /** * Handler for updating repository settings. * * @param args - Tool arguments (must include repoSlug, optional update fields) * @returns Updated repository information */ async handleUpdateRepository(args) { return this.createToolResponse(async () => { // Validate arguments validateWithSchemaOrThrow(ManageRepositoriesArgsSchema, args, 'manage_repositories.update'); const typedArgs = args; // Build update payload from optional fields const payload = {}; const fields = ['name', 'description', 'isPrivate', 'language', 'website', 'hasIssues', 'hasWiki', 'forkPolicy']; for (const field of fields) { if (typedArgs[field] !== undefined && typedArgs[field] !== null) { payload[field] = typedArgs[field]; } } // Update repository const repository = await this.client.updateRepository(typedArgs.workspaceSlug, typedArgs.repoSlug, payload); return repository; }, { toolName: 'manage_repositories', operationName: 'update_repository', args, }); } /** * Handler for deleting a repository. * * @param args - Tool arguments (must include repoSlug) * @returns Confirmation of deletion */ async handleDeleteRepository(args) { return this.createToolResponse(async () => { // Validate arguments validateWithSchemaOrThrow(ManageRepositoriesArgsSchema, args, 'manage_repositories.delete'); const typedArgs = args; // Delete repository await this.client.deleteRepository(typedArgs.workspaceSlug, typedArgs.repoSlug); return { status: 'deleted', workspaceSlug: typedArgs.workspaceSlug, repoSlug: typedArgs.repoSlug, message: `Repository ${typedArgs.repoSlug} deleted successfully`, }; }, { toolName: 'manage_repositories', operationName: 'delete_repository', args, }); } } //# sourceMappingURL=repository-tools.js.map