Skip to main content
Glama
rickey-cpu

tfs-mcp-server

by rickey-cpu
README.md
# tfs-mcp-server

MCP server kết nối trực tiếp với **TFS (Team Foundation Server) on-premise** qua REST API, cho phép Claude đọc/ghi work item, backlog, sprint, và Pull Request mà không cần copy/paste thủ công.

> **Lưu ý về phiên bản**: bạn nhắc "TFS 2027" — hiện tại chưa có phiên bản TFS nào tên như vậy (dòng TFS dừng ở 2018, sau đó đổi tên thành Azure DevOps Server 2019/2020/2022). Có thể ý bạn là **TFS 2017** hoặc **TFS 2018**. Server này được viết để dùng với REST API chuẩn của TFS 2017/2018 (và tương thích ngược với Azure DevOps Server các bản sau nếu chỉnh `TFS_API_VERSION`). Nếu bạn cho biết đúng phiên bản, mình chỉnh lại `api-version` mặc định cho khớp.

## Yêu cầu

- Node.js 18 trở lên, chạy trên máy có thể truy cập mạng nội bộ tới server TFS
- TFS đã **bật Personal Access Token (PAT)** — có từ TFS 2017 Update 1 trở lên. Vào TFS: góc trên phải → **Security** → **Personal access tokens** → tạo token mới với quyền:
  - Work Items: Read & write
  - Code: Read
  - Project and Team: Read

Nếu TFS của bạn **chỉ hỗ trợ NTLM/Windows Authentication** (chưa bật được PAT), báo lại — code hiện tại cần chỉnh lại phần xác thực trong `src/tfsClient.ts` bằng thư viện hỗ trợ NTLM (ví dụ `axios-ntlm`) thay vì Basic Auth với PAT.

## Cài đặt

```bash
npm install
npm run build
```

## Cấu hình

Copy `.env.example` thành `.env` và điền thông tin:

```bash
cp .env.example .env
```

```
TFS_BASE_URL=http://tfs.congty.local:8080/tfs
TFS_COLLECTION=DefaultCollection
TFS_DEFAULT_PROJECT=YourProject
TFS_PAT=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TFS_API_VERSION=4.1
```

Nếu không chắc `TFS_API_VERSION`, cứ thử 4.1 trước — nếu tool báo lỗi HTTP 400/404 khi gọi, hạ xuống 3.2 rồi 2.3 (đây là các phiên bản REST API tương ứng TFS 2017).

## Đăng ký với Claude

### Claude Code

Thêm vào file `.mcp.json` ở thư mục project (hoặc `~/.claude.json` cho toàn cục):

```json
{
  "mcpServers": {
    "tfs": {
      "command": "node",
      "args": ["/duong-dan-tuyet-doi-toi/tfs-mcp-server/dist/index.js"],
      "env": {
        "TFS_BASE_URL": "http://tfs.congty.local:8080/tfs",
        "TFS_COLLECTION": "DefaultCollection",
        "TFS_DEFAULT_PROJECT": "YourProject",
        "TFS_PAT": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "TFS_API_VERSION": "4.1"
      }
    }
  }
}
```

### Claude Desktop

Mở `claude_desktop_config.json` (Settings → Developer → Edit Config), thêm mục tương tự vào `mcpServers`.

Sau khi thêm, khởi động lại Claude Code/Desktop — các tool `tfs_*` sẽ xuất hiện trong danh sách tool khả dụng.

## Danh sách tool

| Tool | Chức năng |
|---|---|
| `tfs_query_wiql` | Chạy truy vấn WIQL tùy chỉnh |
| `tfs_get_work_items` | Lấy chi tiết work item theo ID |
| `tfs_get_backlog` | Lấy danh sách work item trong một sprint/iteration |
| `tfs_get_iterations` | Lấy danh sách sprint theo cấp project, trả `iterationPath` dùng trực tiếp cho backlog |
| `tfs_list_pull_requests` | Liệt kê Pull Request theo trạng thái |
| `tfs_get_pull_request` | Chi tiết một Pull Request |
| `tfs_get_pr_changes` | Danh sách file thay đổi trong PR |
| `tfs_create_work_item` | Tạo work item mới: User Story, Task, Bug, Test Case... |
| `tfs_add_work_item_comment` | Thêm comment vào work item (thao tác ghi dữ liệu) |

Các tool này khớp trực tiếp với input mà các skill trong bộ `em-toolkit` (sprint-retro, sprint-planning-summary, pr-review-checklist, bug-triage) cần — khi cả hai được cài cùng lúc, Claude có thể tự lấy dữ liệu từ TFS thay vì bạn phải copy/paste.

### Tạo work item

Tool `tfs_create_work_item` dùng REST API JSON Patch của TFS/Azure DevOps. Ví dụ tạo User Story:

```json
{
  "workItemType": "User Story",
  "title": "[SAMPLE] Báo cáo tổng kết vòng lặp có đủ metric",
  "description": "User story mẫu để kiểm tra báo cáo velocity, bug ratio và chất lượng kiểm thử.",
  "areaPath": "EngineeringManagerToolkit",
  "iterationPath": "EngineeringManagerToolkit\\Alpha",
  "assignedTo": "user@example.com",
  "tags": ["em-toolkit-sample", "reporting"],
  "fields": {
    "Microsoft.VSTS.Scheduling.StoryPoints": 8,
    "Microsoft.VSTS.Common.Priority": 1
  }
}
```

Ví dụ tạo Bug:

```json
{
  "workItemType": "Bug",
  "title": "[SAMPLE] Báo cáo thiếu phân tích nguyên nhân bug",
  "iterationPath": "EngineeringManagerToolkit\\Alpha",
  "tags": ["em-toolkit-sample", "bug-ratio"],
  "fields": {
    "Microsoft.VSTS.Common.Severity": "2 - High",
    "Microsoft.VSTS.Common.Priority": 1
  }
}
```

Có thể truyền `validateOnly: true` để kiểm tra request nếu phiên bản TFS hỗ trợ, và truyền thêm field tùy biến qua object `fields` theo reference name.

## Bảo mật

- **Không commit file `.env`** — đã có PAT thật trong đó. Thêm `.env` vào `.gitignore`.
- PAT nên đặt hạn dùng ngắn (30-90 ngày) và chỉ cấp đúng quyền cần thiết.
- Server này chạy local trên máy bạn (qua stdio), không có thành phần nào gửi dữ liệu ra ngoài ngoại trừ chính TFS server bạn cấu hình.

## Gỡ lỗi thường gặp

- **401 Unauthorized**: kiểm tra PAT còn hạn không, có đúng quyền không, và TFS đã bật tính năng PAT chưa.
- **404 Not Found**: kiểm tra `TFS_COLLECTION`, tên project, tên repository có đúng chính xác (phân biệt hoa/thường và khoảng trắng) không.
- **400 Bad Request** ở các tool liên quan work item: thường do `TFS_API_VERSION` không khớp phiên bản server — thử các giá trị 2.3 / 3.0 / 3.2 / 4.1.

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct aspect of TFS: work items, backlog, iterations, pull requests, WIQL queries. No overlapping functionality detected.

Naming Consistency5/5

All tools follow a consistent 'tfs_<verb>_<noun>' pattern with snake_case, e.g., tfs_add_work_item_comment, tfs_get_backlog. Predictable and clear.

Tool Count5/5

8 tools cover the main TFS operations without redundancy. The number feels appropriate for the domain.

Completeness3/5

The set supports querying and reading (backlog, iterations, work items, PRs) and adding comments, but lacks create/update/delete work item tools, which are notable gaps.

Maintenance

ActivityMaintained
ResponsivenessSyncing