Skip to main content
Glama

Azure DevOps MCP Server

# Development Guidelines for AI Agents - mcp-server-azure-devops **This document is exclusively for AI Agent operational use. DO NOT include general development knowledge.** ## 1. Project Overview ### Purpose - This project, `@tiberriver256/mcp-server-azure-devops`, is an MCP (Model Context Protocol) server. - Its primary function is to provide tools for interacting with Azure DevOps services. ### Technology Stack - **Core**: TypeScript, Node.js - **Key Libraries**: - `@modelcontextprotocol/sdk`: For MCP server and type definitions. - `azure-devops-node-api`: For interacting with Azure DevOps. - `@azure/identity`: For Azure authentication. - `zod`: For schema definition and validation. - `zod-to-json-schema`: For converting Zod schemas to JSON schemas for MCP tools. - **Testing**: Jest (for unit, integration, and e2e tests). - **Linting/Formatting**: ESLint, Prettier. - **Environment Management**: `dotenv`. ### Core Functionality - Provides MCP tools to interact with Azure DevOps features including, but not limited to: - Organizations - Projects (list, get, get details) - Repositories (list, get, get content, get tree) - Work Items (list, get, create, update, manage links) - Pull Requests (list, get, create, update, add/get comments) - Pipelines (list, trigger) - Search (code, wiki, work items) - Users (get current user) - Wikis (list, get page, create, update page) ## 2. Project Architecture ### Main Directory Structure - **`./` (Root)**: - [`package.json`](package.json:0): Project metadata, dependencies, and NPM scripts. **REFER** to this for available commands and dependencies. - [`tsconfig.json`](tsconfig.json:0): TypeScript compiler configuration. **ADHERE** to its settings. - [`.eslintrc.json`](.eslintrc.json:0): ESLint configuration for code linting. **ADHERE** to its rules. - [`README.md`](README.md:0): General project information. - `setup_env.sh`: Shell script for environment setup. - `CHANGELOG.md` (if present): Tracks changes between versions. - **`src/`**: Contains all TypeScript source code. - **`src/features/`**: Core application logic. Each subdirectory represents a distinct Azure DevOps feature set (e.g., `projects`, `repositories`). - `src/features/[feature-name]/`: Contains all files related to a specific feature. - `src/features/[feature-name]/index.ts`: Main export file for the feature. Exports request handlers (`isFeatureRequest`, `handleFeatureRequest`), tool definitions array (`featureTools`), schemas, types, and individual tool implementation functions. **MODIFY** this file when adding new tools or functionalities to the feature. - `src/features/[feature-name]/schemas.ts`: Defines Zod input/output schemas for all tools within this feature. **DEFINE** new schemas here. - `src/features/[feature-name]/tool-definitions.ts`: Defines MCP tools for the feature using `@modelcontextprotocol/sdk` and `zodToJsonSchema`. **ADD** new tool definitions here. - `src/features/[feature-name]/types.ts`: Contains TypeScript type definitions specific to this feature. **DEFINE** feature-specific types here. - `src/features/[feature-name]/[tool-name]/`: Subdirectory for a specific tool/action within the feature. - `src/features/[feature-name]/[tool-name]/feature.ts`: Implements the core logic for the specific tool (e.g., API calls, data transformation). **IMPLEMENT** tool logic here. - `src/features/[feature-name]/[tool-name]/index.ts`: Exports the `feature.ts` logic and potentially tool-specific schemas/types if not in the parent feature files. - `src/features/[feature-name]/[tool-name]/schema.ts` (optional, often re-exports from feature-level `schemas.ts`): Defines or re-exports Zod schemas for this specific tool. - `src/features/organizations/`, `src/features/pipelines/`, `src/features/projects/`, `src/features/pull-requests/`, `src/features/repositories/`, `src/features/search/`, `src/features/users/`, `src/features/wikis/`, `src/features/work-items/`: Existing feature modules. **REFER** to these for patterns. - **`src/shared/`**: Contains shared modules and utilities used across features. - `src/shared/api/`: Azure DevOps API client setup (e.g., `client.ts`). - `src/shared/auth/`: Authentication logic for Azure DevOps (e.g., `auth-factory.ts`, `client-factory.ts`). **USE** these factories; DO NOT implement custom auth. - `src/shared/config/`: Configuration management (e.g., `version.ts`). - `src/shared/errors/`: Shared error handling classes and utilities (e.g., `azure-devops-errors.ts`, `handle-request-error.ts`). **USE** these for consistent error handling. - `src/shared/types/`: Global TypeScript type definitions (e.g., `config.ts`, `request-handler.ts`, `tool-definition.ts`). - **`src/utils/`**: General utility functions. - `src/utils/environment.ts`: Provides default values for environment variables (e.g., `defaultProject`, `defaultOrg`). - [`src/index.ts`](src/index.ts:1): Main application entry point. Handles environment variable loading and server initialization. **Exports** server components. - [`src/server.ts`](src/server.ts:1): MCP server core logic. Initializes the server, registers all tool handlers from features, and sets up request routing. **MODIFY** this file to register new feature modules (their `isFeatureRequest` and `handleFeatureRequest` handlers, and `featureTools` array). - **`docs/`**: Currently empty. If documentation is added, **MAINTAIN** it in sync with code changes. - **`project-management/`**: Contains project planning and design documents. **REFER** to `architecture-guide.md` for high-level design. - **`tests/`**: Directory for global test setup or utilities if any. Most tests are co-located with source files (e.g., `*.spec.unit.ts`, `*.spec.int.ts`, `*.spec.e2e.ts`). ## 3. Code Standards ### Naming Conventions - **Files and Directories**: USE kebab-case (e.g., `my-feature`, `get-project-details.ts`). - **Variables and Functions**: USE camelCase (e.g., `projectId`, `listProjects`). - **Classes, Interfaces, Enums, Types**: USE PascalCase (e.g., `AzureDevOpsClient`, `TeamProject`, `AuthenticationMethod`). - **Test Files**: - Unit tests: `[filename].spec.unit.ts` (e.g., [`get-project.spec.unit.ts`](src/features/projects/get-project/feature.spec.unit.ts:0)). - Integration tests: `[filename].spec.int.ts` (e.g., [`get-project.spec.int.ts`](src/features/projects/get-project/feature.spec.int.ts:0)). - E2E tests: `[filename].spec.e2e.ts` (e.g., [`server.spec.e2e.ts`](src/server.spec.e2e.ts:0)). - **Feature Modules**: Place under `src/features/[feature-name]/`. - **Tool Logic**: Place in `src/features/[feature-name]/[tool-name]/feature.ts`. - **Schemas**: Define in `src/features/[feature-name]/schemas.ts`. - **Tool Definitions (MCP)**: Define in `src/features/[feature-name]/tool-definitions.ts`. - **Types**: Feature-specific types in `src/features/[feature-name]/types.ts`; global types in `src/shared/types/`. ### Formatting - **Prettier**: Enforced via ESLint and lint-staged. - **Rule**: ADHERE to formatting rules defined by Prettier (implicitly via [`.eslintrc.json`](.eslintrc.json:1) which extends `prettier`). - **Action**: ALWAYS run `npm run format` (or rely on lint-staged) before committing. ### Linting - **ESLint**: Configuration in [`.eslintrc.json`](.eslintrc.json:1). - **Rule**: ADHERE to linting rules. - **Action**: ALWAYS run `npm run lint` (or `npm run lint:fix`) and RESOLVE all errors/warnings before committing. - **Key Lint Rules (from [`.eslintrc.json`](.eslintrc.json:1))**: - `prettier/prettier: "error"` (Prettier violations are ESLint errors). - `@typescript-eslint/no-explicit-any: "warn"` (Avoid `any` where possible; it's "off" for `*.spec.unit.ts` and `tests/**/*.ts`). - `@typescript-eslint/no-unused-vars: ["error", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }]` (No unused variables, allowing `_` prefix for ignored ones). ### Comments - **TSDoc**: USE TSDoc for documenting public functions, classes, interfaces, and types (e.g., `/** ... */`). - **Inline Comments**: For complex logic blocks, ADD inline comments (`// ...`) explaining the purpose. ### TypeScript Specifics (from [`tsconfig.json`](tsconfig.json:1)) - `strict: true`: ADHERE to strict mode. - `noImplicitAny: true`: DO NOT use implicit `any`. Explicitly type all entities. - `noUnusedLocals: true`, `noUnusedParameters: true`: ENSURE no unused local variables or parameters. - `moduleResolution: "Node16"`: Be aware of Node.js ESM module resolution specifics. - `paths: { "@/*": ["src/*"] }`: USE path alias `@/*` for imports from `src/`. ## 4. Functionality Implementation Standards ### Adding a New Tool/Functionality to an Existing Feature 1. **Identify Feature**: Determine the relevant feature directory in `src/features/[feature-name]/`. 2. **Create Tool Directory**: Inside the feature directory, CREATE a new subdirectory for your tool, e.g., `src/features/[feature-name]/[new-tool-name]/`. 3. **Implement Logic**: CREATE `[new-tool-name]/feature.ts`. Implement the core Azure DevOps interaction logic here. - USE `getClient()` from `src/shared/api/client.ts` or `getConnection()` from [`src/server.ts`](src/server.ts:1) to get `WebApi`. - USE error handling from `src/shared/errors/`. 4. **Define Schema**: - ADD Zod schema for the tool's input to `src/features/[feature-name]/schemas.ts`. - EXPORT it. - If needed, CREATE `[new-tool-name]/schema.ts` and re-export the specific schema from the feature-level `schemas.ts`. 5. **Define MCP Tool**: - ADD tool definition to `src/features/[feature-name]/tool-definitions.ts`. - Import the Zod schema and use `zodToJsonSchema` for `inputSchema`. - Ensure `name` matches the intended tool name for MCP. 6. **Update Feature Index**: - In `src/features/[feature-name]/index.ts`: - EXPORT your new tool's logic function (from `[new-tool-name]/feature.ts` or its `index.ts`). - ADD your new tool's name to the `includes()` check in `isFeatureRequest` function. - ADD a `case` for your new tool in the `handleFeatureRequest` function to call your logic. Parse arguments using the Zod schema. 7. **Update Server**: No changes usually needed in [`src/server.ts`](src/server.ts:1) if the feature module is already registered. The feature's `tool-definitions.ts` and `handleFeatureRequest` will be picked up. 8. **Add Tests**: CREATE `[new-tool-name]/feature.spec.unit.ts` and `[new-tool-name]/feature.spec.int.ts`. ### Adding a New Feature Module (e.g., for a new Azure DevOps Service Area) 1. **Create Feature Directory**: CREATE `src/features/[new-feature-module-name]/`. 2. **Implement Tools**: Follow "Adding a New Tool" steps above for each tool within this new feature module. This includes creating `schemas.ts`, `tool-definitions.ts`, `types.ts` (if needed), and subdirectories for each tool's `feature.ts`. 3. **Create Feature Index**: CREATE `src/features/[new-feature-module-name]/index.ts`. - EXPORT all schemas, types, tool logic functions. - EXPORT the `[new-feature-module-name]Tools` array from `tool-definitions.ts`. - CREATE and EXPORT `is[NewFeatureModuleName]Request` (e.g., `isMyNewFeatureRequest`) type guard. - CREATE and EXPORT `handle[NewFeatureModuleName]Request` (e.g., `handleMyNewFeatureRequest`) request handler function. 4. **Register Feature in Server**: - In [`src/server.ts`](src/server.ts:1): - IMPORT `[new-feature-module-name]Tools`, `is[NewFeatureModuleName]Request`, and `handle[NewFeatureModuleName]Request` from your new feature's `index.ts`. - ADD `...[new-feature-module-name]Tools` to the `tools` array in the `ListToolsRequestSchema` handler. - ADD an `if (is[NewFeatureModuleName]Request(request)) { return await handle[NewFeatureModuleName]Request(connection, request); }` block in the `CallToolRequestSchema` handler. 5. **Add Tests**: Ensure comprehensive tests for the new feature module. ## 5. Framework/Plugin/Third-party Library Usage Standards - **`@modelcontextprotocol/sdk`**: - USE `Server` class from `@modelcontextprotocol/sdk/server/index.js` to create the MCP server ([`src/server.ts`](src/server.ts:1)). - USE `StdioServerTransport` for transport ([`src/index.ts`](src/index.ts:1)). - USE schema types like `CallToolRequestSchema` from `@modelcontextprotocol/sdk/types.js`. - DEFINE tools as `ToolDefinition[]` (see `src/shared/types/tool-definition.ts` and feature `tool-definitions.ts` files). - **`azure-devops-node-api`**: - This is the primary library for Azure DevOps interactions. - OBTAIN `WebApi` connection object via `getConnection()` from [`src/server.ts`](src/server.ts:1) or `AzureDevOpsClient` from `src/shared/auth/client-factory.ts`. - USE specific APIs from the connection (e.g., `connection.getCoreApi()`, `connection.getWorkItemTrackingApi()`). - **`@azure/identity`**: - Used for Azure authentication (e.g., `DefaultAzureCredential`). - Primarily abstracted via `AzureDevOpsClient` in `src/shared/auth/`. PREFER using this abstraction. - **`zod`**: - USE for all input/output schema definition and validation. - DEFINE schemas in `src/features/[feature-name]/schemas.ts`. - USE `z.object({...})`, `z.string()`, `z.boolean()`, etc. - USE `.optional()`, `.default()`, `.describe()` for schema fields. - **`zod-to-json-schema`**: - USE to convert Zod schemas to JSON schemas for MCP `inputSchema` in `tool-definitions.ts`. - **`dotenv`**: - Used in [`src/index.ts`](src/index.ts:1) to load environment variables from a `.env` file. - **Jest**: - Test files co-located with source files or in feature-specific `__test__` directories. - Configuration in `jest.unit.config.js`, `jest.int.config.js`, `jest.e2e.config.js`. - **ESLint/Prettier**: See "Code Standards". ## 6. Workflow Standards ### Development Workflow 1. **Branch**: CREATE or CHECKOUT a feature/bugfix branch from `main` (or relevant development branch). 2. **Implement**: WRITE code and corresponding tests. 3. **Test**: - RUN unit tests: `npm run test:unit`. - RUN integration tests: `npm run test:int`. - RUN E2E tests: `npm run test:e2e`. - Or run all tests: `npm test`. - ENSURE all tests pass. 4. **Lint & Format**: - RUN `npm run lint` (or `npm run lint:fix`). RESOLVE all issues. - RUN `npm run format`. 5. **Commit**: - USE Conventional Commits specification (e.g., `feat: ...`, `fix: ...`). - RECOMMENDED: Use `npm run commit` (uses `cz-conventional-changelog`) for guided commit messages. 6. **Pull Request**: PUSH branch and CREATE Pull Request against `main` (or relevant development branch). ### NPM Scripts (from [`package.json`](package.json:1)) - `build`: `tsc` (Compiles TypeScript to `dist/`). - `dev`: `ts-node-dev --respawn --transpile-only src/index.ts` (Runs server in development with auto-restart). - `start`: `node dist/index.js` (Runs compiled server). - `inspector`: `npm run build && npx @modelcontextprotocol/inspector node dist/index.js` (Runs server with MCP Inspector). - `test:unit`, `test:int`, `test:e2e`, `test`: Run respective test suites. - `lint`, `lint:fix`: Run ESLint. - `format`: Run Prettier. - `prepare`: `husky install` (Sets up Git hooks). - `commit`: `cz` (Interactive commitizen). ### CI/CD - No explicit CI/CD pipeline configuration files (e.g., `azure-pipelines.yml`, `.github/workflows/`) were found in the file listing. If added, **REFER** to them. ## 7. Key File Interaction Standards - **Adding/Modifying a Tool**: - TOUCH `src/features/[feature-name]/[tool-name]/feature.ts` (logic). - TOUCH `src/features/[feature-name]/schemas.ts` (Zod schema). - TOUCH `src/features/[feature-name]/tool-definitions.ts` (MCP tool definition). - TOUCH `src/features/[feature-name]/index.ts` (export logic, update request handler and guard). - TOUCH corresponding `*.spec.unit.ts` and `*.spec.int.ts` files. - **Adding a New Feature Module**: - CREATE files within `src/features/[new-feature-module-name]/` as per "Functionality Implementation Standards". - MODIFY [`src/server.ts`](src/server.ts:1) to import and register the new feature module's tools and handlers. - **Configuration Changes**: - Environment variables: Managed via `.env` file (loaded by `dotenv` in [`src/index.ts`](src/index.ts:1)). - TypeScript config: [`tsconfig.json`](tsconfig.json:1). - Linting config: [`.eslintrc.json`](.eslintrc.json:1). - **Dependency Management**: - MODIFY [`package.json`](package.json:1) to add/update dependencies. - RUN `npm install` or `npm ci`. - **Documentation**: - `docs/` directory is currently empty. If project documentation is added (e.g., `docs/feature-x.md`), **UPDATE** it when the corresponding feature `src/features/feature-x/` is modified. - [`README.md`](README.md:0): UPDATE for significant high-level changes. ## 8. AI Decision-making Standards ### When Adding a New Azure DevOps API Interaction: 1. **Goal**: To expose a new Azure DevOps API endpoint as an MCP tool. 2. **Decision: New or Existing Feature?** - IF the API relates to an existing service area (e.g., adding a new work item query type to `work-items` feature), MODIFY the existing feature module. - ELSE (e.g., interacting with Azure DevOps Audit Logs, a new service area), CREATE a new feature module. (See "Functionality Implementation Standards"). 3. **Pattern Adherence**: - FOLLOW the established pattern: - `src/features/[feature]/[tool]/feature.ts` for logic. - `src/features/[feature]/schemas.ts` for Zod schemas. - `src/features/[feature]/tool-definitions.ts` for MCP tool definitions. - `src/features/[feature]/index.ts` for feature-level exports, request guard (`isFeatureRequest`), and request handler (`handleFeatureRequest`). - **Example**: To add `get_pipeline_run_logs` to `pipelines` feature: - CREATE `src/features/pipelines/get-pipeline-run-logs/feature.ts`. - ADD `GetPipelineRunLogsSchema` to `src/features/pipelines/schemas.ts`. - ADD `get_pipeline_run_logs` definition to `src/features/pipelines/tool-definitions.ts`. - UPDATE `src/features/pipelines/index.ts` to export the new function, add to `isPipelinesRequest`, and handle in `handlePipelinesRequest`. 4. **Error Handling**: - ALWAYS use custom error classes from `src/shared/errors/azure-devops-errors.ts` (e.g., `AzureDevOpsResourceNotFoundError`). - WRAP external API calls in try/catch blocks. - USE `handleResponseError` from `src/shared/errors/handle-request-error.ts` in the top-level request handler in [`src/server.ts`](src/server.ts:1) (already done for existing features). Feature-specific handlers should re-throw custom errors. 5. **Testing**: - ALWAYS write unit tests for the new logic in `[tool-name]/feature.spec.unit.ts`. - ALWAYS write integration tests (NEVER mocking anything) in `[tool-name]/feature.spec.int.ts`. Prefer integration tests over unit tests. ### When Modifying Existing Functionality: 1. **Identify Impact**: DETERMINE all files affected by the change (logic, schemas, tool definitions, tests, potentially documentation). 2. **Maintain Consistency**: ENSURE changes are consistent with existing patterns within that feature module. 3. **Update Tests**: MODIFY existing tests or ADD new ones to cover the changes. ENSURE all tests pass. 4. **Version Bumping**: For significant changes, consider if a version bump in [`package.json`](package.json:1) is warranted (usually handled by `release-please`). ## 9. Prohibited Actions - **DO NOT** include general development knowledge or LLM-known facts in this `shrimp-rules.md` document. This document is for project-specific operational rules for AI. - **DO NOT** explain project functionality in terms of *what it does for an end-user*. Focus on *how to modify or add to it* for an AI developer. - **DO NOT** use `any` type implicitly. [`tsconfig.json`](tsconfig.json:1) enforces `noImplicitAny: true`. [`.eslintrc.json`](.eslintrc.json:1) warns on explicit `any` (`@typescript-eslint/no-explicit-any: "warn"`), except in unit tests. MINIMIZE explicit `any`. - **DO NOT** bypass linting (`npm run lint`) or formatting (`npm run format`) checks. Code MUST adhere to these standards. - **DO NOT** commit code that fails tests (`npm test`). - **DO NOT** implement custom Azure DevOps authentication logic. USE the provided `AzureDevOpsClient` from `src/shared/auth/`. - **DO NOT** hardcode configuration values (like PATs, Org URLs, Project IDs). These should come from environment variables (see [`src/index.ts`](src/index.ts:1) `getConfig` and `src/utils/environment.ts`). - **DO NOT** directly call Azure DevOps REST APIs if a corresponding function already exists in the `azure-devops-node-api` library or in shared project code (e.g., `src/shared/api/`). - **DO NOT** modify files in `dist/` directory directly. This directory is auto-generated by `npm run build`. - **DO NOT** ignore the `project-management/` directory for understanding architectural guidelines, but DO NOT replicate its content here. - **DO NOT** use mocks within integration tests.

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Tiberriver256/mcp-server-azure-devops'

If you have feedback or need assistance with the MCP directory API, please join our Discord server