Skip to main content
Glama
developer-ashish31

Leave Manager MCP Server

Leave Manager MCP Server

TypeScript로 구축된 커스텀 Model Context Protocol (MCP) 서버로, Claude Desktop과 같은 AI 클라이언트를 통해 직원 휴가 관련 작업을 관리합니다.

이 프로젝트는 현재 내부 개발 및 테스트용으로 설계되었으며, 프로덕션 데이터베이스 대신 더미/인메모리 데이터베이스를 사용합니다.

아키텍처는 MCP 도구 인터페이스를 변경하지 않고 더미 데이터베이스를 나중에 실제 데이터베이스나 내부 휴가 관리 API로 교체할 수 있도록 설계되었습니다.


목차


개요

Leave Manager MCP 서버는 휴가 관리 기능을 AI 클라이언트가 사용할 수 있는 MCP 도구로 노출합니다.

예를 들어, 사용자는 API를 직접 호출하는 대신 Claude에게 다음과 같이 질문할 수 있습니다:

제 보상 휴가가 며칠 남았나요?

Claude는 적절한 MCP 도구를 식별하고 다음을 호출할 수 있습니다:

get_leave_balance

MCP 서버는 요청을 처리하고 Claude가 자연어 응답을 생성하는 데 사용할 수 있는 구조화된 정보를 반환합니다.

예시

User
 │
 │ "How many leaves do I have?"
 ▼
Claude Desktop
 │
 │ MCP Tool Call
 ▼
Leave Manager MCP Server
 │
 ▼
Dummy Database
 │
 ▼
Leave Balance
 │
 ▼
Claude Desktop
 │
 ▼
Natural Language Response

기능

현재 버전은 다음과 같은 MCP 도구를 제공합니다:

  • 직원 휴가 잔여 일수 조회

  • 직원 휴가 내역 조회

  • 사용 가능한 휴가 유형 조회

  • 휴가 신청

  • 휴가 취소

  • Zod를 사용한 입력 검증

  • 더미/인메모리 데이터베이스

  • TypeScript 구현

  • stdio 기반 MCP 전송

  • MCP Inspector 지원

  • Claude Desktop 통합


아키텍처

현재 아키텍처는 다음과 같습니다:

                    ┌──────────────────────┐
                    │    Claude Desktop    │
                    │                      │
                    │   User Interaction   │
                    └──────────┬───────────┘
                               │
                               │ MCP / stdio
                               ▼
                    ┌──────────────────────┐
                    │ Leave Manager MCP    │
                    │      Server          │
                    │                      │
                    │ MCP Tool Layer       │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │    Leave Service     │
                    │    / Repository      │
                    └──────────┬───────────┘
                               │
                               ▼
                    ┌──────────────────────┐
                    │     Dummy DB         │
                    │                      │
                    │ employees[]          │
                    │ leaveBalances[]      │
                    │ leaveRequests[]      │
                    └──────────────────────┘

서버는 stdio를 사용합니다. Claude Desktop이 MCP 서버를 로컬 프로세스로 실행하고 표준 입력/출력을 통해 통신할 수 있기 때문입니다. MCP TypeScript SDK는 이 사용 사례를 위해 serveStdio()를 제공합니다.


기술 스택

기술

용도

TypeScript

애플리케이션 개발

Node.js

런타임

npm

의존성 관리

MCP TypeScript SDK

MCP 서버 구현

Zod

입력 검증

Claude Desktop

MCP 클라이언트

MCP Inspector

로컬 MCP 테스트

더미 DB

임시 데이터 저장

현재 MCP TypeScript SDK v2는 안정적인 SDK 라인이며 @modelcontextprotocol/server를 사용합니다.


사전 요구 사항

시작하기 전에 다음이 설치되어 있는지 확인하세요.

Related MCP server: Enterprise Data MCP Server

Node.js

Node.js 20 이상이 필요합니다.

설치된 버전 확인:

node --version

예시:

v22.9.0

npm 확인:

npm --version

Claude Desktop

머신에 Claude Desktop을 설치하세요.

Claude Desktop은 MCP 클라이언트 역할을 하며 Leave Manager MCP 서버를 로컬에서 실행합니다.


설치

1. 리포지토리 클론

git clone <YOUR_REPOSITORY_URL>

프로젝트로 이동:

cd leave-manager-mcp

2. 의존성 설치

실행:

npm install

프로젝트는 MCP TypeScript 서버 패키지를 사용합니다:

npm install @modelcontextprotocol/server

Zod는 도구 입력 검증에 사용됩니다:

npm install zod

TypeScript 개발용:

npm install -D typescript tsx @types/node

공식 MCP 서버 설정은 현재 Node.js 20+, ES 모듈, @modelcontextprotocol/server, Zod, tsx를 사용합니다.


프로젝트 구조

권장 프로젝트 구조:

leave-manager-mcp/
│
├── src/
│   │
│   ├── index.ts
│   │
│   ├── data/
│   │   └── dummy-db.ts
│   │
│   ├── models/
│   │   └── leave.ts
│   │
│   ├── repositories/
│   │   └── leave-repository.ts
│   │
│   └── tools/
│       └── leave-tools.ts
│
├── dist/
│
├── package.json
├── package-lock.json
├── tsconfig.json
└── README.md

역할

src/index.ts

MCP 서버를 생성하고 시작합니다.

src/models/leave.ts

직원 및 휴가와 관련된 TypeScript 모델/인터페이스를 포함합니다.

src/data/dummy-db.ts

임시 인메모리 테스트 데이터를 포함합니다.

src/repositories/leave-repository.ts

데이터 액세스 작업을 제공합니다.

src/tools/leave-tools.ts

Claude가 호출할 수 있는 MCP 도구를 등록합니다.


구성

package.json

일반적인 구성:

{
  "name": "leave-manager-mcp",
  "version": "1.0.0",
  "description": "Leave Manager MCP Server",
  "type": "module",
  "scripts": {
    "dev": "tsx src/index.ts",
    "build": "tsc",
    "start": "node dist/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/server": "^2.0.0",
    "zod": "^4.0.0"
  },
  "devDependencies": {
    "@types/node": "^24.0.0",
    "tsx": "^4.0.0",
    "typescript": "^6.0.0"
  }
}

의존성 버전은 npm install 실행 시점에 따라 다를 수 있습니다. 항상 npm이 생성한 버전을 우선 사용하세요.


TypeScript 구성

tsconfig.json 생성:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "types": ["node"],
    "outDir": "dist"
  },
  "include": [
    "src/**/*.ts"
  ]
}

Node types 항목은 현재 TypeScript 버전에서 중요합니다. MCP SDK의 게시된 타입 정의가 Node API를 참조하기 때문입니다.


사용 가능한 MCP 도구

현재 Leave Manager MCP 서버는 다음 도구를 노출합니다.

1. get_leave_balance

직원의 현재 휴가 잔여 일수를 반환합니다.

입력

{
  "employeeId": "EMP001"
}

결과 예시

{
  "employeeId": "EMP001",
  "casual": 8,
  "sick": 5,
  "earned": 12,
  "unpaid": 0
}

2. get_leave_history

직원의 휴가 내역을 반환합니다.

입력

{
  "employeeId": "EMP001"
}

결과 예시

[
  {
    "id": "LR001",
    "employeeId": "EMP001",
    "leaveType": "CASUAL",
    "startDate": "2026-08-20",
    "endDate": "2026-08-21",
    "reason": "Personal work",
    "status": "APPROVED"
  }
]

3. get_leave_types

사용 가능한 휴가 유형을 반환합니다.

결과 예시

[
  {
    "type": "CASUAL",
    "description": "Casual leave"
  },
  {
    "type": "SICK",
    "description": "Sick leave"
  },
  {
    "type": "EARNED",
    "description": "Earned leave"
  },
  {
    "type": "UNPAID",
    "description": "Unpaid leave"
  }
]

4. apply_leave

새 휴가 요청을 생성합니다.

입력

{
  "employeeId": "EMP001",
  "leaveType": "CASUAL",
  "startDate": "2026-09-10",
  "endDate": "2026-09-11",
  "reason": "Family function"
}

결과 예시

{
  "id": "LR002",
  "employeeId": "EMP001",
  "leaveType": "CASUAL",
  "startDate": "2026-09-10",
  "endDate": "2026-09-11",
  "reason": "Family function",
  "status": "PENDING"
}

5. cancel_leave

기존 휴가 요청을 취소합니다.

입력

{
  "leaveId": "LR002"
}

결과 예시

{
  "id": "LR002",
  "status": "CANCELLED"
}

MCP 서버 실행

개발 중 서버를 실행하는 방법은 두 가지가 있습니다.


옵션 1: tsx로 직접 실행

개발 중에는 이 방법을 권장합니다.

npm run dev

내부적으로 다음을 실행합니다:

tsx src/index.ts

다음이 표시되어야 합니다:

Leave Manager MCP server running...

stdio MCP 서버는 클라이언트가 통신할 때까지 대기하므로 프로세스는 계속 실행됩니다.

다음을 사용하여 서버를 중지합니다:

Ctrl + C

프로젝트 빌드

컴파일된 버전을 사용하기 전에 다음을 실행합니다:

npm run build

다음을 실행합니다:

tsc

컴파일된 JavaScript 파일은 다음 위치에 생성됩니다:

dist/

예상 구조:

dist/
├── index.js
├── data/
│   └── dummy-db.js
├── models/
│   └── leave.js
├── repositories/
│   └── leave-repository.js
└── tools/
    └── leave-tools.js

프로덕션 빌드 실행

빌드 후:

npm start

다음을 실행합니다:

node dist/index.js

MCP 서버는 컴파일된 JavaScript로 시작됩니다.


MCP Inspector로 테스트

서버를 Claude Desktop에 연결하기 전에 MCP Inspector로 테스트하는 것이 좋습니다.

MCP Inspector는 MCP 서버에 연결하고 해당 도구를 직접 호출할 수 있는 로컬 UI를 제공합니다.

Inspector 시작

프로젝트 루트에서:

npx @modelcontextprotocol/inspector npm run dev

또는:

npx @modelcontextprotocol/inspector npx tsx src/index.ts

Inspector는 브라우저 URL을 제공합니다.

브라우저에서 해당 URL을 엽니다.


MCP Inspector에서 도구 테스트

서버 연결 후 다음을 엽니다:

Tools

섹션.

다음이 표시되어야 합니다:

get_leave_balance
get_leave_history
get_leave_types
apply_leave
cancel_leave

get_leave_balance 테스트

선택:

get_leave_balance

입력:

{
  "employeeId": "EMP001"
}

예상 응답:

{
  "employeeId": "EMP001",
  "casual": 8,
  "sick": 5,
  "earned": 12,
  "unpaid": 0
}

get_leave_history 테스트

입력:

{
  "employeeId": "EMP001"
}

get_leave_types 테스트

이 도구는 입력이 필요하지 않습니다.


apply_leave 테스트

입력:

{
  "employeeId": "EMP001",
  "leaveType": "CASUAL",
  "startDate": "2026-09-10",
  "endDate": "2026-09-11",
  "reason": "Family function"
}

cancel_leave 테스트

입력:

{
  "leaveId": "LR002"
}

Claude Desktop 연결

서버가 MCP Inspector에서 올바르게 작동하면 Claude Desktop에 연결합니다.

Claude Desktop이 프로세스를 실행하고 stdin/stdout을 통해 통신하므로 MCP 서버는 로컬 stdio 서버로 구성되어야 합니다.


1. 프로젝트 빌드

먼저 실행:

npm run build

이 파일이 존재하는지 확인:

dist/index.js

2. 절대 프로젝트 경로 가져오기

프로젝트 루트에서:

pwd

예시:

/Users/ashish/projects/leave-manager-mcp

따라서 서버 경로는 다음과 같습니다:

/Users/ashish/projects/leave-manager-mcp/dist/index.js

Claude Desktop 구성에서 절대 경로를 사용하세요.


Claude Desktop 구성

Leave Manager MCP 서버를 Claude Desktop의 MCP 구성에 추가합니다.

예시:

{
  "mcpServers": {
    "leave-manager": {
      "command": "node",
      "args": [
        "/ABSOLUTE/PATH/TO/leave-manager-mcp/dist/index.js"
      ]
    }
  }
}

예를 들어, macOS에서:

{
  "mcpServers": {
    "leave-manager": {
      "command": "node",
      "args": [
        "/Users/ashish/projects/leave-manager-mcp/dist/index.js"
      ]
    }
  }
}

경로를 실제 머신의 절대 경로로 바꾸세요.


중요: Claude Desktop 다시 시작

MCP 구성을 변경한 후:

  1. 구성을 저장합니다.

  2. Claude Desktop을 완전히 종료합니다.

  3. Claude Desktop을 다시 시작합니다.

  4. 새 대화를 엽니다.

  5. 사용 가능한 MCP 도구를 확인합니다.

Leave Manager 서버와 해당 도구가 표시되어야 합니다.


Claude로 Leave Manager 테스트

연결되면 MCP 도구를 수동으로 호출할 필요가 없습니다.

Claude에게 자연어로 질문하기만 하면 됩니다.


예시 1 — 휴가 잔여 일수

질문:

How many leaves does EMP001 have?

Claude는 다음을 사용해야 합니다:

get_leave_balance

다음과 함께:

{
  "employeeId": "EMP001"
}

예시 2 — 휴가 내역

질문:

Show me the leave history of EMP001.

Claude는 다음을 사용해야 합니다:

get_leave_history

예시 3 — 사용 가능한 휴가 유형

질문:

What types of leaves are available?

Claude는 다음을 사용해야 합니다:

get_leave_types

예시 4 — 휴가 신청

질문:

Apply casual leave for EMP001 from September 10 to September 11 because of a family function.

Claude는 다음을 사용해야 합니다:

apply_leave

적절한 매개변수와 함께.


예시 5 — 휴가 취소

질문:

Cancel leave request LR002.

Claude는 다음을 사용해야 합니다:

cancel_leave

더미 데이터베이스

현재 구현은 인메모리 데이터베이스를 사용합니다.

예시:

export const employees = [
  {
    id: "EMP001",
    name: "Ashish Kushwaha",
    email: "ashish@example.com",
    department: "Engineering"
  }
];

휴가 잔여 일수:

export const leaveBalances = [
  {
    employeeId: "EMP001",
    casual: 8,
    sick: 5,
    earned: 12,
    unpaid: 0
  }
];

휴가 요청:

export const leaveRequests = [
  {
    id: "LR001",
    employeeId: "EMP001",
    leaveType: "CASUAL",
    startDate: "2026-08-20",
    endDate: "2026-08-21",
    reason: "Personal work",
    status: "APPROVED",
    createdAt: "2026-08-10"
  }
];

더미 DB 중요 제한 사항

현재 데이터베이스는 애플리케이션 메모리에 저장됩니다.

따라서:

Server starts
      ↓
Dummy data loaded
      ↓
Apply leave
      ↓
New request added
      ↓
Server stops
      ↓
Data is lost

이는 예상된 동작입니다.

더미 데이터베이스는 개발 및 MCP 테스트용으로만 사용됩니다.


개발 워크플로

권장 개발 워크플로:

1. Modify TypeScript
        ↓
2. Run npm run build
        ↓
3. Run MCP Inspector
        ↓
4. Test MCP tools
        ↓
5. Fix issues
        ↓
6. Test with Claude Desktop
        ↓
7. Commit changes

개발 중에는 다음을 사용할 수도 있습니다:

npm run dev

매번 변경 후 빌드하는 대신.


로깅

서버가 stdio를 사용하므로 일반 서버 로깅에 console.log()를 사용하지 마세요.

피해야 할 것:

console.log("Server started");

사용할 것:

console.error("Server started");

이유는 stdout이 MCP 프로토콜 통신에 사용되기 때문입니다. stdout에 일반 로그를 작성하면 JSON-RPC/MCP 통신 스트림이 손상될 수 있습니다.


문제 해결

문제: Cannot find module

실행:

rm -rf node_modules
rm -f package-lock.json
npm install

그런 다음:

npm run build

문제: TypeScript 빌드 오류

실행:

npx tsc --noEmit

파일을 생성하지 않고 TypeScript 오류를 표시합니다.


문제: dist/index.js가 존재하지 않음

실행:

npm run build

그런 다음 확인:

ls dist

문제: Claude Desktop에 MCP 서버가 표시되지 않음

확인:

  1. MCP 구성이 유효한 JSON인지.

  2. dist/index.js 경로가 절대 경로인지.

  3. npm run build가 성공적으로 완료되었는지.

  4. dist/index.js가 존재하는지.

  5. Node.js가 설치되어 있는지.

  6. Claude Desktop이 완전히 다시 시작되었는지.

  7. MCP 서버가 MCP Inspector에서 작동하는지.


문제: MCP Inspector가 연결할 수 없음

먼저 실행:

npm run dev

서버가 성공적으로 시작되면 중지하고 다음을 실행:

npx @modelcontextprotocol/inspector npm run dev

터미널에서 오류를 확인하세요.


문제: 서버가 시작되지만 도구가 표시되지 않음

확인:

src/index.ts

도구가 등록되어 있는지 확인:

registerLeaveTools(
  server,
  repository
);

또한 serveStdio()가 호출되는지 확인:

void serveStdio(createServer);

문제: JSON-RPC/MCP 프로토콜 오류

코드에서 다음을 확인:

console.log(...)

일반 로깅을 다음으로 교체:

console.error(...)

stdout은 MCP 프로토콜 통신을 위해 사용 가능한 상태로 유지되어야 합니다.


향후 개선 사항

현재 버전은 프로토타입입니다. 다음 개선 사항이 권장됩니다.

데이터베이스

더미 데이터베이스를 다음으로 교체:

PostgreSQL
MySQL
MongoDB

또는 기존 내부 휴가 관리 API.


인증

사용자가 다음을 직접 제공하지 않도록 직원 인증 추가:

employeeId

수동으로.

향후 아키텍처:

Claude
   ↓
MCP Server
   ↓
Authentication
   ↓
Employee Context
   ↓
Leave Service

휴가 검증

비즈니스 규칙 추가:

  • 휴가 날짜 검증

  • 휴가 잔여 일수 검증

  • 중복 휴가 방지

  • 회사 공휴일 확인

  • 주말 확인

  • 최소/최대 휴가 기간 검증

  • 직원 상태 검증

  • 휴가 유형 검증

  • 해당되는 경우 승인 후 취소 방지


관리자 승인

다음과 같은 도구 추가:

get_pending_leave_requests
approve_leave
reject_leave

팀 캘린더

추가:

get_team_leave_calendar

사용자 요청 예시:

Who from my team is on leave next week?

알림

다음과 통합:

Email
Slack
Microsoft Teams

직원과 관리자에게 알림.


권장 프로덕션 아키텍처

장기 아키텍처는 MCP를 비즈니스 로직에서 분리해야 합니다:

                    Claude Desktop
                          │
                          │ MCP
                          ▼
                ┌───────────────────┐
                │    MCP Server     │
                │                   │
                │ Tool Definitions  │
                │ Input Validation  │
                └─────────┬─────────┘
                          │
                          ▼
                ┌───────────────────┐
                │   Leave Service   │
                │                   │
                │ Business Rules    │
                │ Validation        │
                │ Authorization     │
                └─────────┬─────────┘
                          │
                          ▼
                ┌───────────────────┐
                │ Leave Repository  │
                └─────────┬─────────┘
                          │
                 ┌────────┴────────┐
                 ▼                 ▼
          Internal Leave API    Database

이렇게 하면 Claude에 노출된 도구를 변경하지 않고 더미 데이터베이스를 교체할 수 있습니다.


보안 고려 사항

현재 프로젝트는 개발/테스트 전용입니다.

실제 직원 데이터와 함께 사용하기 전에:

  • 인증을 추가하세요.

  • 권한 부여를 추가하세요.

  • 모델이 제공한 employeeId를 신뢰하지 마세요.

  • 모든 도구 입력의 유효성을 검사하세요.

  • 직원 정보를 보호하세요.

  • 불필요한 직원 데이터를 노출하지 마세요.

  • 감사 로깅을 추가하세요.

  • 역할 기반 액세스 제어를 구현하세요.

  • 관리자 전용 작업을 보호하세요.

  • 해당되는 경우 속도 제한을 추가하세요.

  • 소스 코드에 비밀을 저장하지 마세요.

  • 자격 증명에는 환경 변수를 사용하세요.

  • 내부 API/데이터베이스에 대한 연결을 보호하세요.

MCP 서버는 Claude가 보안 결정을 내리도록 하는 대신 비즈니스 권한을 강제해야 합니다.


환경 변수

실제 서비스에 연결할 때는 환경 변수를 사용하세요.

예시 .env:

LEAVE_API_URL=https://internal.example.com/api
LEAVE_API_KEY=your-api-key

.env를 Git에 커밋하지 마세요.

추가:

.env

.gitignore에.


Git 무시

권장 .gitignore:

node_modules/
dist/
.env
.DS_Store
*.log

유용한 명령어

종속성 설치

npm install

개발

npm run dev

빌드

npm run build

컴파일된 서버 실행

npm start

타입 검사

npx tsc --noEmit

MCP Inspector 실행

npx @modelcontextprotocol/inspector npm run dev

Node 버전 확인

node --version

npm 버전 확인

npm --version

MCP 개발 체크리스트

MCP 서버가 내부 테스트 준비가 되었다고 간주하기 전에:

  • Node.js 20+ 설치됨

  • 종속성 설치됨

  • TypeScript 빌드 성공

  • 더미 데이터베이스 구성됨

  • MCP 서버가 성공적으로 시작됨

  • MCP Inspector가 성공적으로 연결됨

  • get_leave_balance 테스트됨

  • get_leave_history 테스트됨

  • get_leave_types 테스트됨

  • apply_leave 테스트됨

  • cancel_leave 테스트됨

  • Claude Desktop 구성 추가됨

  • Claude Desktop 다시 시작됨

  • Claude에서 Leave Manager 도구 표시됨

  • 자연어 요청 테스트됨

  • 오류 시나리오 테스트됨


예시 사용자 쿼리

Claude Desktop에 연결되면 사용자는 다음과 같은 질문을 할 수 있어야 합니다:

How many casual leaves do I have?
Show my leave history.
What leave types are available?
Apply casual leave from September 10 to September 11.
Cancel my leave request LR002.

향후 예시:

Do I have enough leave for next Monday?
Who from my team is on leave next week?
Show all pending leave requests.
Approve Rahul's leave request.

MCP 리소스

공식 MCP TypeScript SDK:

https://ts.sdk.modelcontextprotocol.io/v2/

공식 첫 서버 가이드:

https://ts.sdk.modelcontextprotocol.io/v2/get-started/first-server

공식 서버 API:

https://ts.sdk.modelcontextprotocol.io/v2/api/@modelcontextprotocol/server/

이 프로젝트는 현재 MCP TypeScript SDK v2 아키텍처와 최신 2026-07-28 프로토콜 라인을 따릅니다.


라이선스

이 프로젝트는 내부 개발 및 테스트를 위한 것입니다.

여기에 조직의 라이선스 및 사용 정책을 추가하세요.


관리자

Ashish Kushwaha

Leave Manager MCP Server TypeScript + MCP + Claude Desktop


빠른 시작

숙련된 개발자의 경우 전체 설정은 다음과 같이 요약할 수 있습니다:

# Clone
git clone <YOUR_REPOSITORY_URL>

# Enter project
cd leave-manager-mcp

# Install
npm install

# Build
npm run build

# Run
npm start

# Development
npm run dev

# MCP Inspector
npx @modelcontextprotocol/inspector npm run dev

그런 다음 Claude Desktop이 시작하도록 구성합니다:

dist/index.js

사용:

{
  "mcpServers": {
    "leave-manager": {
      "command": "node",
      "args": [
        "/ABSOLUTE/PATH/TO/leave-manager-mcp/dist/index.js"
      ]
    }
  }
}

Claude Desktop을 다시 시작하고 Leave Manager MCP 도구 테스트를 시작하세요.

Available Tools

6 tools
apply_leaveC

Apply for leave for an employee.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonYes
endDateYes
leaveTypeYes
startDateYes
employeeIdYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden of explaining behavior. It only states that leave is applied for, but does not disclose side effects, potential validations, approval implications, or return behavior. This is insufficient for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The one-line description is clear and front-loaded, with no filler or redundant phrasing. It is short and easy to parse, though its brevity sacrifices important operational details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that this is a 5-required-parameter mutation tool with no annotations, output schema, or parameter explanations, the description is not sufficient to support correct invocation. It captures the core action but leaves critical operational context undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and no mention of parameters in the description, the agent receives no additional semantic meaning. The schema provides names and types, but nothing explains date formats, reason expectations, or how the employeeId is resolved.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Apply for leave for an employee' uses a specific verb and resource, clearly communicating what the tool does. It also distinguishes itself from the sibling read and cancel tools by indicating the creation/submission action.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus the sibling tools, nor does it mention prerequisites or exclusions. Usage can only be inferred from the action itself, making this a weak dimension.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_leaveC

Cancel an existing leave request.

ParametersJSON Schema
NameRequiredDescriptionDefault
leaveIdYes

TDQS

C2.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description must carry full burden. 'Cancel' implies a mutation, but it doesn't disclose side effects (e.g., whether the cancellation is irreversible, whether it requires special permissions, how it affects leave balance). Does not contradict any annotations since none exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, perfectly concise. No fluff, front-loaded action. It serves the purpose with minimal words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation tool with no annotations and no output schema, the description is lacking. It doesn't mention expected outcome, error conditions, or anything about the cancellation process. For a simple tool with one param, it is minimal but functional, yet incomplete in providing useful context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, meaning the description doesn't explain the leaveId parameter beyond its name from the schema. The description simply says 'an existing leave request' without adding meaning like what the ID format is or where to find it. With 0% coverage, the description must compensate, but it does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb+resource: 'Cancel an existing leave request.' It specifies the action and object, and while it doesn't explicitly differentiate from siblings, the sibling tools like apply_leave and get_leave_history are distinct. It is direct and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It doesn't mention any conditions for cancellation, such as approval status or time limitations. The context is implied but not stated, so no exclusions or alternative references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_employee_details_by_employeeIdC

Get employee details by employeeId.

ParametersJSON Schema
NameRequiredDescriptionDefault
employeeIdYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It does not disclose any behavioral traits such as whether it is read-only, side effects, authentication requirements, or error handling. For a get operation, it implies read-only but does not state it, and no output schema is provided, leaving behavior largely opaque.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely short (5 words), which could be considered concise, but it under-specifies rather than being efficiently informative. It is front-loaded with the purpose, but the brevity results in missing critical information, making it insufficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has one parameter, no output schema, and no annotations. Given this, the description should at least indicate what 'employee details' entails (e.g., which fields are returned) and any special cases. It does not, so it is incomplete for practical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%: the parameter employeeId has no description in the schema. The tool description repeats 'by employeeId' but adds no additional meaning. Given low coverage, the description should compensate but does not clarify format (e.g., UUID, string) or any constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states it retrieves employee details by employeeId, which is a clear verb+resource+identifier. However, it lacks differentiation from sibling tools (e.g., get_leave_balance, apply_leave) which are about leave, not employee details, so there is some implicit distinction. It is not a tautology but is minimal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No usage guidelines are provided. The description does not specify when to use this tool versus alternatives, but since it is the only employee details tool among leave-focused siblings, the usage context is somewhat implied. Still, no explicit guidance for when-not-to-use or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leave_balanceC

Get the current leave balance of an employee.

ParametersJSON Schema
NameRequiredDescriptionDefault
employeeIdYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the action without explaining what the tool returns, whether it requires specific permissions, or any side effects. For a read operation, it doesn't mention the output format or any limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, concise sentence that is front-loaded with the main action. It is appropriately brief, though it could add a bit more detail without becoming verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no output schema), the description is minimal but lacks important context such as what the balance includes (e.g., annual, sick, etc.) or any time-based considerations. It is adequate for a basic read but incomplete for an agent to fully understand the tool's behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description doesn't explain the 'employeeId' parameter beyond its name. However, with only one parameter and a clear name, the meaning is fairly obvious. The description adds no extra semantic value, but the parameter is self-explanatory.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to retrieve the current leave balance for an employee. It uses a specific verb ('get') and resource ('leave balance'), and it is distinct from sibling tools like get_leave_history and get_leave_types, though it doesn't explicitly differentiate itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention any context, prerequisites, or exclusions. The sibling tools suggest related but different functions, but the description doesn't clarify when to choose this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leave_historyC

Get the leave history of an employee.

ParametersJSON Schema
NameRequiredDescriptionDefault
employeeIdYes

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations at all, so the description carries full burden. It only says 'get' implying a read, but does not disclose return format, whether it includes only approved leaves, date ranges, or any limits. It gives no behavioral details beyond the verb.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short, one line, and front-loaded with the purpose. It is concise, but it is under-specified rather than efficiently concise. Since it avoids fluff, it at least earns a baseline for conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema and no annotations, the description is insufficient. It does not explain what 'history' includes, whether there are any filters, pagination, or typical use cases. The complexity is moderate but the description is too thin to be complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter employeeId. The description does not elaborate on what employeeId is or any format requirements. It merely repeats the parameter name implicitly. The description adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get the leave history of an employee' which is a clear verb+resource. It distinguishes from siblings like get_leave_balance (which implies current balance) and apply_leave, but does not explicitly differentiate what 'history' includes (e.g., past applications, approved leaves, status over time). It is acceptable but lacks specifics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives. It doesn't mention that this is for historical records, nor does it contrast with get_leave_balance for current entitlements. The agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_leave_typesA

Get all available leave types.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It only states the action without mentioning side effects, authentication requirements, or whether it is a read-only operation. For a simple list tool, the lack of such disclosure is a gap, though the risk is low.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, clear sentence that conveys the entire purpose without any filler or unnecessary details. Perfectly concise and front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters, no output schema, no nested objects), the description is adequate. It covers the core purpose and does not leave critical gaps, though it could mention the return format or any filtering options for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema provides all necessary context. Per the baseline rule, a score of 4 is appropriate; the description adds no parameter-specific information, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get all available leave types' uses a specific verb ('Get') and resource ('leave types'), and clearly distinguishes from sibling tools like get_leave_balance or get_leave_history which deal with specific aspects of leave. It is unambiguous about what it returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states what the tool does but provides no guidance on when to use it versus alternatives. However, since the tool is a simple list operation with a unique purpose, the intended usage is easily inferred, though not explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 6 tool updatesv1.0.0
    • First observedapply_leave
    • First observedcancel_leave
    • First observedget_employee_details_by_employeeId
    • First observedget_leave_balance
    • First observedget_leave_history
    • First observedget_leave_types

TDQS

B3.1/5.0

Scored across 6 tools

Disambiguation4/5

The tools are mostly distinct: balance, history, types, apply, cancel, and employee details each target a clear purpose. The only mild overlap is between leave balance and leave history, but their intent is sufficiently separated.

Naming Consistency4/5

Most tools follow a get_/apply_/cancel_ pattern with snake_case. The outlier is get_employee_details_by_employeeId which mixes an 'employeeId' camelCase segment into an otherwise snake_case name, causing a minor inconsistency.

Tool Count5/5

Six tools is well-scoped for a leave management server. Each tool covers an essential function without unnecessary bloat or significant redundancy.

Completeness3/5

The core employee self-service workflow is covered: view balance, history, types, apply, and cancel. Missing tools for approval/rejection or checking pending leave requests create notable gaps for a 'manager' context.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    A Model Context Protocol server that enables users to manage employee leave through natural language. It provides tools to check leave balances, apply for leave, and view leave history via Claude integration.
    3
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server providing natural-language tools for managing and querying an employee database, including user CRUD, search, and statistics.
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for interacting with an HR database, enabling querying employee data and HR operations via natural language.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables natural-language-based employee leave management including leave balance checks, leave applications, approvals, and history retrieval through an MCP-compatible client.
    -