Skip to main content
Glama
tlc-portal-mcp

tlc-portal-mcp

by mingovvv

tlc-portal-mcp

This is a stdio-based MCP server that allows MCP clients like Claude Code and Codex to use the vacation and timetable functions of the TwolineCloud portal.

By running the package with npx, you can use MCP tools for tasks such as browser login, leave inquiry/application, timetable inquiry/entry, and version diagnostics.

Currently Supported Features

  • Portal login and authentication status check

  • Inquiry of leave types, remaining leave, and leave application history

  • Leave application and cancellation

  • Timetable management information, available entry periods, and daily details

  • Inquiry of timetable project lists

  • Calculation of daily available hours reflecting leave

  • Preparation and submission of single/period timetable entries

  • Full daily deletion of timetable entries

  • Checking the current server version and comparing it with the latest npm version

Related MCP server: ATimeLogger MCP Server

Requirements

  • Node.js 18+

  • A browser environment capable of portal login

Installation and Registration

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

Since Codex does not currently have a separate add command for project-specific use, you can add it directly to .codex/config.toml in the project root if needed.

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

Execution Method Notes

  • mcp add ... -- npx -y tlc-portal-mcp is not a global installation but an execution command registration.

  • The actual package download occurs when the client runs the server for the first time.

  • It is not re-installed every time; cached versions may be reused depending on the execution environment.

  • Therefore, the server includes system.* tools to check the current version against the latest version.

Authentication Methods

When the user logs in manually via the opened browser, the JWT from localStorage['vuex'] is automatically saved.

  1. Run auth.login

  2. Complete portal login and MFA in the browser

  3. Token is automatically saved after successful login

  4. Check authentication status with auth.status

An instruction overlay is displayed in the browser after a successful login.

Alternative: auth.import_vuex

If the automatic login flow is difficult to use, you can manually copy and paste the vuex value from the browser.

  1. Log in to the portal in the browser

  2. Go to Application > Local Storage > https://portal.twolinecloud.com in DevTools

  3. Copy the vuex value

  4. Run auth.import_vuex and paste the value

Tool List

System

Tool

Description

system.info

Returns the currently running server name, version, and list of registered tools

system.check_update

Compares the latest npm version with the current version

Authentication

Tool

Description

auth.login

Automatically saves JWT after browser login

auth.import_vuex

Authenticates by pasting localStorage['vuex']

auth.status

Checks current authentication status

auth.clear

Deletes local session

Leave

Tool

Description

leave.list_types

Inquires supported leave types

leave.get_balances

Inquires remaining leave

leave.list_requests

Inquires leave application history

leave.prepare_request

Prepares leave application payload

leave.submit_prepared_request

Submits prepared leave application

leave.cancel_request

Cancels existing leave application

Timetable

Tool

Description

timetable.get_manage_info

Inquires timetable management/deadline information

timetable.get_user_summary

Inquires current user's timetable status

timetable.get_available_range

Inquires available entry periods

timetable.get_day

Inquires detailed timetable for a specific date

timetable.get_range_overview

Summarizes a date range with timetable + public holidays/leave capacity

timetable.list_projects

Inquires list of projects available for timetable entry

timetable.get_day_capacity

Calculates available hours for the date reflecting leave

timetable.prepare_day_entry

Prepares single-date timetable entry

timetable.submit_prepared_day_entry

Submits prepared single-date entry

timetable.prepare_bulk_entries

Prepares bulk entries based on a period

timetable.submit_prepared_bulk_entries

Submits prepared bulk entries

timetable.clear_day

Deletes entire timetable for a specific date

Timetable Rules

  • The default available entry time is 8 hours per day.

  • If there is a half-day leave (AM, PM, admitAm, admitPm), you can record a maximum of 4 hours.

  • If there is a full-day leave (allDay, admit), you cannot record entries for that date.

  • South Korean public holidays are primarily retrieved from the Nager.Date API, with built-in fallback data used upon failure.

  • Weekends and company-wide holidays (PORTAL_COMPANY_HOLIDAYS) are also treated as non-entry days.

  • Personal leave overlays are calculated based on the requestDt sorting results from vacation-svc/request/secure in accordance with portal overview rules.

  • workDate and taskType are always required.

  • projectId is required by default.

  • However, if taskType === NORMAL, you can enter without a projectId.

  • Write operations follow the prepare -> submit flow.

Initial Diagnosis

  1. system.info

  2. system.check_update

  3. auth.status

  4. auth.login if necessary

Leave Flow

  1. leave.get_balances

  2. leave.list_requests

  3. leave.prepare_request

  4. leave.submit_prepared_request

Timetable Flow

  1. timetable.get_available_range

  2. timetable.get_range_overview

  3. timetable.list_projects

  4. timetable.get_day_capacity

  5. timetable.prepare_day_entry or timetable.prepare_bulk_entries

  6. timetable.submit_prepared_day_entry or timetable.submit_prepared_bulk_entries

Usage Examples

"현재 서버 버전이랑 최신 버전 비교해줘"
-> 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

Environment Variables

Variable

Default Value

Description

PORTAL_BASE_URL

https://portal.twolinecloud.com

Portal base URL

PORTAL_LOGIN_PATH

/

Login entry path

PORTAL_LOGIN_SUCCESS_URL

/dashboard/landing

URL reached after successful login

PORTAL_MCP_SESSION_FILE

.portal-session.json

Local session storage file

PORTAL_TIMEOUT_SECONDS

15

API request timeout in seconds

PORTAL_COMPANY_HOLIDAYS

``

Comma-separated list of company-wide holidays (YYYY-MM-DD,YYYY-MM-DD)

PORTAL_HOLIDAY_API_BASE_URL

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

South Korean public holiday API base URL

Limitations

  • The JWT validity period is currently about 2 hours.

  • If the token expires, you must run auth.login or auth.import_vuex again.

  • Refresh tokens are not used.

  • The session file is stored only locally and is not uploaded to the server.

  • system.check_update can only check the latest version in environments with access to the npm registry.

  • If the public holiday lookup API fails, it defaults to built-in fallback data.

  • The NORMAL + no projectId combination for the timetable is implemented as an allowed flow based on documentation, but actual acceptance by the portal backend needs to be verified in the production environment.

Available Tools

10 tools
auth.clearA

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

Inputs: no named parameters.

auth.import_vuexB

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

Inputs: vuex_payload (required).

auth.loginC

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

Inputs: timeout_seconds.

auth.statusB

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

Inputs: no named parameters.

leave.cancel_requestB

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

Inputs: request_id (required).

leave.get_balancesB

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

Inputs: no named parameters.

leave.list_requestsC

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

Inputs: statuses, from_date, to_date, limit, +1 more.

leave.list_typesA

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

Inputs: no named parameters.

leave.prepare_requestB

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

Inputs: leave_type_code (required), start_date (required), end_date (required), unit, +3 more.

leave.submit_prepared_requestB

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

Inputs: prepared_request_id (required).

Tool Schema Changelog

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

Loading tool schema changelog…

    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 recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      A standalone MCP server that exposes the ATimeLogger REST API to Claude Desktop/Code over stdio, enabling activity tracking (start/stop/pause/log), reports/history, and activity type management.
      8
      64 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      D
      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.
      ISC