Skip to main content
Glama
mingovvv

tlc-portal-mcp

by mingovvv

tlc-portal-mcp

TwolineCloud 포털의 휴가와 타임테이블 기능을 Claude Code, Codex 같은 MCP 클라이언트에서 사용할 수 있게 만든 stdio 기반 MCP 서버입니다.

패키지를 npx로 실행하면 브라우저 로그인, 휴가 조회/신청, 타임테이블 조회/입력, 버전 진단 같은 작업을 MCP 도구로 사용할 수 있습니다.

현재 지원 기능

  • 포털 로그인과 인증 상태 확인

  • 휴가 유형, 잔여 휴가, 휴가 신청 이력 조회

  • 휴가 신청, 취소

  • 타임테이블 관리 정보, 입력 가능 기간, 일별 상세 조회

  • 타임테이블 프로젝트 목록 조회

  • 휴가를 반영한 일별 입력 가능 시간 계산

  • 타임테이블 단건/기간 입력 준비 및 제출

  • 타임테이블 일별 전체 삭제

  • 현재 서버 버전 확인 및 npm 최신 버전 비교

Related MCP server: azure-devops-cli-mcp

요구 사항

  • Node.js 18+

  • 포털 로그인이 가능한 브라우저 환경

설치 및 등록

Claude Code

# 사용자 전역 등록
claude mcp add tlc-portal-mcp --scope user -- npx -y tlc-portal-mcp

# 현재 프로젝트에만 등록
claude mcp add tlc-portal-mcp -- npx -y tlc-portal-mcp

Codex CLI

# 사용자 전역 등록
codex mcp add tlc-portal-mcp -- npx -y tlc-portal-mcp

Codex는 현재 프로젝트 전용 add 명령이 별도로 없으므로, 필요하면 프로젝트 루트의 .codex/config.toml에 직접 추가할 수 있습니다.

[mcp_servers.tlc-portal-mcp]
command = "npx"
args = ["-y", "tlc-portal-mcp"]

실행 방식 메모

  • mcp add ... -- npx -y tlc-portal-mcp는 전역 설치가 아니라 실행 명령 등록입니다.

  • 실제 패키지 다운로드는 클라이언트가 서버를 처음 실행할 때 일어납니다.

  • 매번 새로 설치하는 것은 아니고, 실행 환경에 따라 캐시된 버전이 재사용될 수 있습니다.

  • 그래서 서버에는 현재 버전과 최신 버전을 확인하는 system.* 도구가 포함되어 있습니다.

인증 방법

권장: auth.login

브라우저를 열어 사용자가 직접 로그인하면 localStorage['vuex']의 JWT를 자동 저장합니다.

  1. auth.login 실행

  2. 브라우저에서 포털 로그인과 MFA 완료

  3. 로그인 성공 후 토큰 자동 저장

  4. auth.status로 인증 상태 확인

로그인 성공 후 브라우저에는 안내 오버레이가 표시됩니다.

대체: auth.import_vuex

자동 로그인 흐름을 쓰기 어렵다면 브라우저에서 vuex 값을 직접 가져와 붙여넣을 수 있습니다.

  1. 브라우저에서 포털 로그인

  2. DevTools에서 Application > Local Storage > https://portal.twolinecloud.com 이동

  3. vuex 값 복사

  4. auth.import_vuex 실행 후 붙여넣기

도구 목록

시스템

Tool

설명

system.info

현재 실행 중인 서버 이름, 버전, 등록된 도구 목록 반환

system.check_update

npm 최신 버전과 현재 버전을 비교

인증

Tool

설명

auth.login

브라우저 로그인 후 JWT 자동 저장

auth.import_vuex

localStorage['vuex']를 붙여넣어 인증

auth.status

현재 인증 상태 확인

auth.clear

로컬 세션 삭제

휴가

Tool

설명

leave.list_types

지원하는 휴가 유형 조회

leave.get_balances

잔여 휴가 조회

leave.list_requests

휴가 신청 이력 조회

leave.prepare_request

휴가 신청 payload 준비

leave.submit_prepared_request

준비된 휴가 신청 제출

leave.cancel_request

기존 휴가 신청 취소

타임테이블

Tool

설명

timetable.get_manage_info

타임테이블 관리/마감 정보 조회

timetable.get_user_summary

현재 사용자의 타임테이블 현황 조회

timetable.get_available_range

입력 가능 기간 조회

timetable.get_day

특정 날짜 타임테이블 상세 조회

timetable.get_range_overview

날짜 범위 전체를 타임테이블 + 공휴일/휴가 capacity와 함께 요약

timetable.list_projects

타임테이블에 입력 가능한 프로젝트 목록 조회

timetable.get_day_capacity

휴가를 반영한 해당 날짜 입력 가능 시간 계산

timetable.prepare_day_entry

단일 날짜 타임테이블 입력 준비

timetable.submit_prepared_day_entry

준비된 단일 날짜 입력 제출

timetable.prepare_bulk_entries

기간 기준 일괄 입력 준비

timetable.submit_prepared_bulk_entries

준비된 일괄 입력 제출

timetable.clear_day

특정 날짜 타임테이블 전체 삭제

타임테이블 규칙

  • 기본 입력 가능 시간은 하루 8시간입니다.

  • 반차(AM, PM, admitAm, admitPm)가 있으면 최대 4시간만 기록할 수 있습니다.

  • 종일 휴가(allDay, admit)가 있으면 해당 날짜에는 기록할 수 없습니다.

  • 한국 공휴일은 기본적으로 Nager.Date API에서 조회하고, 실패 시 내장 fallback 데이터를 사용합니다.

  • 주말과 회사 공통 휴무일(PORTAL_COMPANY_HOLIDAYS)도 입력 불가로 처리합니다.

  • 개인 휴가 overlay는 포털 overview 규칙에 맞춰 vacation-svc/request/securerequestDt 정렬 결과를 기준으로 계산합니다.

  • workDatetaskType은 항상 필요합니다.

  • projectId는 기본적으로 필요합니다.

  • 단, taskType === NORMAL이면 projectId 없이 입력할 수 있습니다.

  • 쓰기 작업은 prepare -> submit 흐름을 따릅니다.

권장 사용 순서

초기 진단

  1. system.info

  2. system.check_update

  3. auth.status

  4. 필요 시 auth.login

휴가 흐름

  1. leave.get_balances

  2. leave.list_requests

  3. leave.prepare_request

  4. leave.submit_prepared_request

타임테이블 흐름

  1. timetable.get_available_range

  2. timetable.get_range_overview

  3. timetable.list_projects

  4. timetable.get_day_capacity

  5. timetable.prepare_day_entry 또는 timetable.prepare_bulk_entries

  6. timetable.submit_prepared_day_entry 또는 timetable.submit_prepared_bulk_entries

사용 예시

"현재 서버 버전이랑 최신 버전 비교해줘"
-> system.check_update

"내 휴가 잔여 일수 보여줘"
-> leave.get_balances

"이번 달 휴가 신청 이력 보여줘"
-> leave.list_requests

"4월 30일 오전 반차 신청 준비해줘"
-> leave.prepare_request

"오늘 입력 가능한 타임테이블 시간 계산해줘"
-> timetable.get_day_capacity

"2026년 2월 타임테이블 전체를 공휴일 포함해서 요약해줘"
-> timetable.get_range_overview

"2026-04-05에 프로젝트 274로 4시간, taskType EXECUTE로 입력 준비해줘"
-> timetable.prepare_day_entry

"오늘 일반업무 2시간, taskType NORMAL로 입력 준비해줘"
-> timetable.prepare_day_entry

"4월 1일부터 4월 3일까지 같은 내용으로 일괄 입력 준비해줘"
-> timetable.prepare_bulk_entries

환경 변수

변수

기본값

설명

PORTAL_BASE_URL

https://portal.twolinecloud.com

포털 기본 주소

PORTAL_LOGIN_PATH

/

로그인 진입 경로

PORTAL_LOGIN_SUCCESS_URL

/dashboard/landing

로그인 성공 후 도달 URL

PORTAL_MCP_SESSION_FILE

.portal-session.json

로컬 세션 저장 파일

PORTAL_TIMEOUT_SECONDS

15

API 요청 타임아웃 초

PORTAL_COMPANY_HOLIDAYS

``

쉼표로 구분한 회사 공통 휴무일 목록 (YYYY-MM-DD,YYYY-MM-DD)

PORTAL_HOLIDAY_API_BASE_URL

https://date.nager.at/api/v3

한국 공휴일 조회 API base URL

제한 사항

  • JWT 유효 시간은 현재 기준 약 2시간입니다.

  • 토큰이 만료되면 auth.login 또는 auth.import_vuex를 다시 실행해야 합니다.

  • Refresh token은 사용하지 않습니다.

  • 세션 파일은 로컬에만 저장되며 서버로 업로드되지 않습니다.

  • system.check_update는 npm registry 접근이 가능한 환경에서만 최신 버전을 확인할 수 있습니다.

  • 공휴일 조회 API가 실패하면 내장 fallback 데이터로 판정합니다.

  • 타임테이블의 NORMAL + projectId 없음 조합은 문서 기준 허용 흐름으로 구현되어 있지만, 실제 포털 백엔드 수용 여부는 운영 환경에서 추가 확인이 필요합니다.

Available Tools

10 tools
auth.clearA

저장된 인증 세션을 삭제한다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It correctly identifies the destructive operation (deletion of sessions) but lacks critical context such as whether this affects only local state or server-side sessions, idempotency, or side effects on subsequent tool calls.

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?

The description consists of a single efficient sentence that immediately conveys the action and target. No redundancy or extraneous information present; front-loaded with the core operation.

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

Completeness3/5

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

While adequate for a zero-parameter tool, the description lacks safety context expected for a destructive authentication operation given the absence of annotations and output schema. Should specify scope (local vs remote) and immediate consequences for user state.

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 input schema contains zero parameters (empty properties object), establishing baseline 4. The description appropriately requires no parameter explanation since the tool operates without inputs.

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 provides a specific verb (삭제한다/deletes) and resource (저장된 인증 세션/saved authentication session). It clearly distinguishes this tool from sibling auth.login (which creates sessions) and auth.status (which checks sessions) by specifying the destructive clearing action.

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?

While the destructive nature implies use for logout or credential reset scenarios, the description provides no explicit guidance on when to invoke this versus auth.login, nor does it mention prerequisites like requiring an active session or the consequences of clearing.

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

auth.import_vuexB

브라우저 localStorage['vuex'] 값을 붙여넣어 인증 상태를 가져온다.

ParametersJSON Schema
NameRequiredDescriptionDefault
vuex_payloadYes

TDQS

B3.1/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 full burden of behavioral disclosure. It fails to mention whether this overwrites existing sessions, validates the payload format, or what errors occur on invalid input. The mutation risk (importing state) is implied but not explicitly disclosed.

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 efficient sentence with no redundancy. However, given the lack of annotations and schema descriptions, it is slightly too terse—additional context about behavioral implications would improve utility without being verbose.

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

Completeness3/5

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

For a single-parameter authentication tool, the description covers the core mechanism adequately but leaves gaps typical of mutation operations. Without annotations or output schema, it should disclose side effects (session replacement) and validation behavior to be complete.

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?

With 0% schema description coverage, the description compensates by explicitly identifying the vuex_payload as the value from 'browser localStorage['vuex']'. This gives the agent clear semantic context for sourcing the parameter, though it could specify expected format (JSON string, encoded object, etc.).

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 imports authentication state by pasting the browser's localStorage['vuex'] value. It uses a specific verb (붙여넣어/paste) and resource (인증 상태/authentication state), distinguishing it from sibling auth.login (fresh authentication) and auth.clear (removal).

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 explicit guidance on when to use this tool versus auth.login or auth.status. While it implies this is for restoring existing sessions rather than new logins, it does not state prerequisites (e.g., 'use when you have exported Vuex data') or warn against using it with invalid payloads.

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

auth.loginC

브라우저를 열어 사용자가 직접 로그인하면 JWT를 자동 저장한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
timeout_secondsNo

TDQS

C2.7/5.0
Behavior3/5

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

Discloses critical interactive traits absent from annotations: requires browser opening, user intervention, and JWT persistence side-effects. However, fails to specify timeout expiration behavior, return values, or whether existing sessions are overwritten—significant gaps for a mutation tool with no annotation safety hints.

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?

Single Korean sentence is appropriately front-loaded and efficient, with no redundant words. Conciseness is technically good, though excessive brevity contributes to informational deficits in other scoring dimensions.

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?

Insufficient for an interactive authentication tool with no output schema or annotations. Missing: return value contract, error handling on timeout, browser requirements, and idempotency characteristics (can this be called multiple times?).

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?

Schema coverage is 0% (timeout_seconds lacks description field). Description provides zero compensation for this gap—does not mention the parameter, its units (seconds), or behavior when timeout is reached. Falls below minimum viable threshold.

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 combination ('로그인'/'login') and distinguishes from siblings (auth.clear, auth.status, auth.import_vuex). Explicitly identifies browser-based interactive flow, though could clarify scope regarding session overwrite behavior.

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 explicit when-to-use guidance or prerequisites (e.g., 'use when not authenticated'). No comparison to auth.import_vuex for importing existing tokens versus fresh browser authentication. Usage is only implied by the mechanistic description.

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

auth.statusB

현재 인증 상태를 반환한다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3/5.0
Behavior2/5

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

No annotations provided, so the description carries full burden. It fails to disclose what 'status' entails (boolean, user object, token details?), error behavior when unauthenticated, or whether this is a safe read-only operation.

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?

Single sentence is appropriately concise, though given the lack of annotations and output schema, it is arguably too brief rather than efficiently structured. No redundancy or filler present.

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?

No output schema exists and no annotations are provided. For an authentication utility, the description should compensate by describing the return value structure (fields, types, error states), but it provides only a high-level verb without payload details.

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?

Zero parameters with 100% schema coverage (vacuously true). Baseline score applies as there are no parameters requiring semantic clarification beyond the empty schema.

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 states a specific action (returns) and resource (current authentication status). It implicitly distinguishes from sibling auth.login and auth.clear by being a read operation, though it does not explicitly contrast with them.

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 provided on when to use this tool versus auth.login or auth.clear. Missing prerequisites (e.g., whether valid credentials must exist to call this) and no mention of alternative approaches.

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

leave.cancel_requestB

기존 휴가 신청을 취소한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYes취소할 휴가 신청 ID

TDQS

B3.1/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 full disclosure burden. It only states the action ('cancel') without describing side effects (leave balance restoration, notification triggers), reversibility, or required request states (pending vs. approved). Critical behavioral traits for a mutative operation are missing.

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 single-sentence description is appropriately front-loaded with zero redundancy. However, given the lack of annotations and behavioral detail, extreme brevity here contributes to informational gaps rather than efficient communication.

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?

For a cancellation operation (moderate business logic complexity) with zero annotations, no output schema, and mutative side effects, the description is insufficient. It omits expected outcomes, status change semantics, and balance implications that an agent needs to invoke this safely.

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?

With 100% schema description coverage, the input schema fully documents the 'request_id' parameter. The description adds no param-specific syntax or format details, but baseline 3 is appropriate when schema coverage is complete and the description doesn't introduce ambiguity.

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 '기존 휴가 신청을 취소한다' (Cancels an existing leave request) provides a specific verb (cancel) and resource (leave request). The term '기존' (existing) clearly distinguishes this from sibling tools like leave.submit_prepared_request (creating new) and leave.prepare_request (drafting), making the scope distinct.

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 states what the tool does but provides no guidance on when to use it versus alternatives, prerequisites (e.g., only cancelable states), or ownership restrictions (self vs. others). No exclusion criteria or alternative approaches are mentioned.

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

leave.get_balancesB

현재 잔여 휴가를 조회한다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Verb '조회' (query/retrieve) implies read-only behavior, but description lacks disclosure of return format, whether balances are per-user or aggregate, temporal scope of 'current', or pagination behavior. No mention of rate limits or caching.

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 of 5 words, front-loaded with no redundancy. Appropriate length for a simple read-only getter with no parameters. Every element earns its place.

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

Completeness3/5

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

Minimal but functional for low complexity. Missing output description (no output schema exists to compensate), doesn't clarify if balances are for authenticated user only or include breakdown by leave type. Adequate but clear gaps given lack of structured metadata.

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?

Zero parameters per input schema (empty object). With 0 params, baseline score is 4 as per rubric. Description correctly implies no filtering capabilities are needed for this operation.

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?

Description uses specific verb (조회하다/ retrieves) and resource (잔여 휴가/ remaining leave balance), clearly identifying this as a balance query operation. Implicitly distinguishes from sibling request-management tools (list_requests, cancel_request) by targeting 'balances' rather than 'requests', though explicit differentiation is absent.

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?

Provides no guidance on when to use versus alternatives (e.g., vs. list_requests for history), no prerequisites mentioned (e.g., authentication requirements implied by auth.* siblings but not stated), and no exclusion criteria.

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

leave.list_requestsC

휴가 신청 내역을 조회한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusesNo조회할 상태 목록
from_dateNo조회 시작일 (YYYY-MM-DD)
to_dateNo조회 종료일 (YYYY-MM-DD)
limitNo
offsetNo

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. While '조회' implies read-only access, the description fails to mention pagination behavior (limit/offset), filtering capabilities (date ranges, status filtering), or what the returned structure contains.

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 single-sentence description is efficient and front-loaded with the action verb, containing no wasted words. However, it arguably errs on the side of under-specification for a tool supporting complex filtering and pagination.

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 presence of 5 parameters, pagination support, and absence of both annotations and output schema, the description is insufficient. It omits critical operational context such as the default pagination limits, the fact that date ranges filter application dates, and the structure of returned request objects.

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?

Schema description coverage is 60% (limit and offset lack descriptions). The description provides no additional semantics to compensate for the undocumented pagination parameters or to explain the date filtering behavior, meeting the baseline expectation for moderate schema coverage.

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 '휴가 신청 내역을 조회한다' uses a specific verb (조회한다/retrieve) with a clear resource (휴가 신청 내역/leave request records). It implicitly distinguishes from siblings like cancel_request, submit_prepared_request, and get_balances by describing a read operation on request history rather than mutations or balance inquiries.

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 provided on when to use this tool versus alternatives (e.g., when to filter by status vs. using cancel_request), nor mention that all parameters are optional with defaults. The description merely states what the tool does, not when to invoke it.

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

leave.list_typesA

지원하는 휴가 유형 목록을 반환한다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It identifies the operation as read-only via the word 'returns,' but fails to describe what constitutes a 'type' object, whether the list is user-specific or global, caching behavior, or the structure/format of the returned data (critical given no output schema exists).

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?

The description is a single, efficient sentence consisting of six words in Korean. It is immediately front-loaded with the core action and resource, containing zero redundant or wasted clauses.

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

Completeness3/5

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

For a zero-parameter tool, the description is minimally sufficient to invoke the tool. However, given the absence of an output schema and annotations, the description should ideally describe the return structure (e.g., array of type objects with IDs and labels) or behavioral constraints to be fully complete.

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 input schema contains zero parameters, which establishes a baseline score of 4 per the evaluation rules. The description correctly implies no filtering parameters are needed to retrieve the full catalog of types.

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 uses a specific verb (반환한다/returns) and resource (휴가 유형 목록/list of leave types) that clearly identifies the tool's function. It effectively distinguishes from sibling leave.list_requests (which returns request instances, not type definitions) and other mutation operations like leave.submit_prepared_request.

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, nor does it mention prerequisites such as authentication (despite the presence of auth.* siblings) or when this data should be fetched relative to leave.prepare_request. No explicit when-not or alternative selection criteria are present.

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

leave.prepare_requestB

휴가 신청을 준비한다. 제출 전 확인 단계다.

ParametersJSON Schema
NameRequiredDescriptionDefault
leave_type_codeYes휴가 유형 코드
start_dateYes시작일
end_dateYes종료일
unitNofull_day
reasonNo휴가 사유
delegate_employee_idNo업무 인수인계 담당자 ID
contact_phoneNo비상 연락처

TDQS

B3.1/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. While it mentions this is a verification step, it fails to disclose what state gets created (e.g., a draft request), whether the operation is idempotent, what validation occurs, or most critically, what the return value contains (likely a prepared request ID needed for submit_prepared_request).

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 two-sentence structure is appropriately front-loaded with the core action in the first sentence and the workflow stage in the second. While extremely terse given the tool's complexity, there is no wasted language or redundancy.

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 7 parameters, multi-step workflow (prepare→submit), and absence of an output schema, the description is incomplete. It fails to explain what this tool returns (critical for the agent to know how to invoke submit_prepared_request) and omits behavioral details necessary for stateful workflow coordination.

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?

With 86% schema description coverage, the structured schema already comprehensively documents parameters including date formats, enum values, and field purposes in Korean. The description adds no specific parameter guidance, but the baseline of 3 is appropriate given the schema's completeness.

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 Korean description clearly states it prepares a vacation request and identifies it as a 'pre-submission verification step', which distinguishes it from the sibling submit_prepared_request tool. However, it does not explicitly name the sibling or clarify that this tool likely returns a prepared request identifier required for the next step.

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?

It implies workflow order by stating this is the 'pre-submission' stage, suggesting it should be used before final submission. However, it lacks explicit guidance on when to use this versus direct submission (if available) or prerequisites, and does not explain the two-step prepare-then-submit pattern explicitly.

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

leave.submit_prepared_requestB

준비된 휴가 신청을 포탈에 제출한다.

ParametersJSON Schema
NameRequiredDescriptionDefault
prepared_request_idYes

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. While 'portal' implies an external system, the description lacks details on side effects, idempotency, or whether submission is reversible via leave.cancel_request.

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?

The single-sentence description is efficiently front-loaded with no extraneous information, conveying the essential action and target system immediately.

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

Completeness3/5

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

While adequate for a single-parameter tool, the description is incomplete regarding the two-step workflow (prepare then submit) implied by the sibling tools, which is critical information for successful invocation.

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?

With 0% schema description coverage, the description compensates effectively by referencing 'prepared vacation request' (준비된 휴가 신청), which clarifies that the prepared_request_id parameter refers to a request prepared via the prepare_request sibling.

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 submits a prepared leave request to a portal, using specific verbs and resources. While it distinguishes from siblings like leave.prepare_request by specifying the submission action, it could further clarify what 'prepared' entails.

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, and critically fails to mention that leave.prepare_request must be called first to generate the prepared_request_id required by this tool.

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. 10 tool updatesv0.1.0
    • First observedauth.clear
    • First observedauth.import_vuex
    • First observedauth.login
    • First observedauth.status
    • First observedleave.cancel_request
    • First observedleave.get_balances
    • First observedleave.list_requests
    • First observedleave.list_types
    • First observedleave.prepare_request
    • First observedleave.submit_prepared_request

TDQS

B3.4/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target distinct resources and actions, especially within the leave namespace. The only possible confusion is between auth.login and auth.import_vuex, but their descriptions clearly separate browser-based login from importing an existing Vuex auth state.

Naming Consistency4/5

Tool names consistently follow a verb_noun pattern with clear namespace prefixes like auth and leave. auth.status is a minor deviation as a noun, but overall the naming is predictable and easy to navigate.

Tool Count5/5

Ten tools is a well-scoped size for a portal MCP server covering authentication and leave management. Each tool has a clear role, and the count feels neither bloated nor thin.

Completeness4/5

The leave workflow is well covered: types, balances, listing, preparing, submitting, and cancelling requests. Minor gaps include no direct request detail view or update/edit path, but cancel-and-recreate is a reasonable workaround.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    A standalone MCP server that lets Claude Code, opencode, and other MCP clients control your real browser via the QoderWork browser connector extension, preserving login state and providing tools for navigation, clicking, typing, screenshots, and more.
    -
  • F
    license
    Not graded
    quality
    A
    maintenance
    Local stdio MCP server for working on Intern-hosted sites through guarded Git checkouts. It enables authentication, site preparation, testing, validation, and publishing via coding harnesses like Codex and Claude Code.
    690
    -