@ryancardin/azuredevops-mcp-server
Version:
MCP server for Azure DevOps integration - provides seamless access to work items, repositories, projects, boards, and sprints
233 lines • 7.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProjectService = void 0;
const CoreInterfaces_1 = require("azure-devops-node-api/interfaces/CoreInterfaces");
const AzureDevOpsService_1 = require("./AzureDevOpsService");
class ProjectService extends AzureDevOpsService_1.AzureDevOpsService {
constructor(config) {
super(config);
}
/**
* Get the Core API client
*/
async getCoreApi() {
return await this.connection.getCoreApi();
}
/**
* Get the Process API client
*/
async getProcessApi() {
return await this.connection.getWorkItemTrackingProcessApi();
}
/**
* List projects
*/
async listProjects(params) {
try {
const coreApi = await this.getCoreApi();
// Call getProjects without the stateFilter parameter
const projects = await coreApi.getProjects(params.top, params.skip);
// Filter by state if provided
let filteredProjects = projects;
if (params.stateFilter) {
filteredProjects = projects.filter(project => {
if (params.stateFilter === 'all')
return true;
return project.state === params.stateFilter;
});
}
return filteredProjects;
}
catch (error) {
console.error('Error listing projects:', error);
throw error;
}
}
/**
* Get project details
*/
async getProjectDetails(params) {
try {
const coreApi = await this.getCoreApi();
const project = await coreApi.getProject(params.projectId, params.includeCapabilities);
return project;
}
catch (error) {
console.error(`Error getting project details for ${params.projectId}:`, error);
throw error;
}
}
/**
* Create project
*/
async createProject(params) {
try {
const coreApi = await this.getCoreApi();
// Convert string visibility to enum
let visibility;
if (params.visibility === 'private') {
visibility = CoreInterfaces_1.ProjectVisibility.Private;
}
else if (params.visibility === 'public') {
visibility = CoreInterfaces_1.ProjectVisibility.Public;
}
else {
visibility = CoreInterfaces_1.ProjectVisibility.Private; // Default
}
// Create project with valid properties
const project = await coreApi.queueCreateProject({
name: params.name,
description: params.description,
visibility: visibility,
capabilities: params.capabilities || {}
// Removed processTemplateId as it's not a valid property
});
return project;
}
catch (error) {
console.error(`Error creating project ${params.name}:`, error);
throw error;
}
}
/**
* Get areas
*/
async getAreas(params) {
try {
const coreApi = await this.getCoreApi();
// Use getProject as a workaround
const project = await coreApi.getProject(params.projectId);
// Return project info as a workaround
return {
project,
message: "Direct classification node API not available, returning project info instead"
};
}
catch (error) {
console.error(`Error getting areas for project ${params.projectId}:`, error);
throw error;
}
}
/**
* Get iterations
*/
async getIterations(params) {
try {
const coreApi = await this.getCoreApi();
// Use getProject as a workaround
const project = await coreApi.getProject(params.projectId);
// Return project info as a workaround
return {
project,
message: "Direct classification node API not available, returning project info instead"
};
}
catch (error) {
console.error(`Error getting iterations for project ${params.projectId}:`, error);
throw error;
}
}
/**
* Create area
*/
async createArea(params) {
try {
// Return a mock response as a workaround
return {
id: "mock-area-id",
name: params.name,
path: params.parentPath || "",
structureType: "area",
message: "Direct classification node creation API not available, returning mock data"
};
}
catch (error) {
console.error(`Error creating area ${params.name}:`, error);
throw error;
}
}
/**
* Create iteration
*/
async createIteration(params) {
try {
const attributes = {};
if (params.startDate)
attributes.startDate = params.startDate;
if (params.finishDate)
attributes.finishDate = params.finishDate;
// Return a mock response as a workaround
return {
id: "mock-iteration-id",
name: params.name,
path: params.parentPath || "",
structureType: "iteration",
attributes: Object.keys(attributes).length > 0 ? attributes : undefined,
message: "Direct classification node creation API not available, returning mock data"
};
}
catch (error) {
console.error(`Error creating iteration ${params.name}:`, error);
throw error;
}
}
/**
* Get processes
*/
async getProcesses(params) {
try {
// Return a mock response as a workaround
return [
{
id: "mock-process-id",
name: "Agile",
description: "Agile process template",
message: "Direct process API not available, returning mock data"
}
];
}
catch (error) {
console.error('Error getting processes:', error);
throw error;
}
}
/**
* Get work item types
*/
async getWorkItemTypes(params) {
try {
const witProcessApi = await this.getProcessApi();
const workItemTypes = await witProcessApi.getProcessWorkItemTypes(params.processId);
return workItemTypes;
}
catch (error) {
console.error(`Error getting work item types for process ${params.processId}:`, error);
throw error;
}
}
/**
* Get work item type fields
*/
async getWorkItemTypeFields(params) {
try {
const witProcessApi = await this.getProcessApi();
// Use getProcessWorkItemTypes as a workaround
const types = await witProcessApi.getProcessWorkItemTypes(params.processId);
// Filter to the requested type if specified
let filteredTypes = types;
if (params.witRefName) {
filteredTypes = types.filter(type => type.referenceName === params.witRefName);
}
return {
types: filteredTypes,
message: "Direct field API not available, returning work item types instead"
};
}
catch (error) {
console.error(`Error getting work item type fields for ${params.witRefName}:`, error);
throw error;
}
}
}
exports.ProjectService = ProjectService;
//# sourceMappingURL=ProjectService.js.map