@gohcltech/bitbucket-mcp
Version:
Bitbucket integration for Claude via Model Context Protocol
278 lines • 10.9 kB
JavaScript
/**
* @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