Centerfield Visitor Mcp

io.github.hmkim由 GitHub 帳號 hmkim 發布v0.3.0更新於 Nov 11, 2026

Centerfield building (Seoul) visitor pre-registration: validate, preview and register visitors.

已驗證STDIO僅桌面效率與工作流商業與電商

概覽

AI 產生的概覽

為首爾 Centerfield 大樓登記訪客:驗證租戶設定、預覽訪客名單,並向網站送出預約。

可以做什麼
  • 對照 Centerfield 線上網站驗證租戶設定(公司名稱、核准聯絡人、樓層),不建立預約
  • 預覽以文字貼上或從 Excel/CSV/TSV 檔案讀取的訪客名單,手機號碼與電子郵件會遮蔽
  • 登記單一訪客,可選擇 dry run 只做驗證而不送出
  • 從貼上文字或檔案批次登記訪客,可為缺少日期、時間、樓層、事由欄位的名單指定預設值
  • 依參與方式篩選名單列,並逐列回報結果(成功、失敗、結果不明、未送出)
適用情境
適合經常為 Centerfield 大樓預先登記訪客、希望由助理把貼上的名單、問卷匯出檔或試算表轉成預約,並在送出前先預覽確認的情境。
執行需求
透過 uvx 以 stdio 在本機執行(Python),也可作為 streamable HTTP 服務供遠端用戶端使用。需要 CF_COMPANY_NAME 與 CF_PERSON_IN_CHARGE_MOBILE,通常放在 ~/.config/centerfield-visitor-mcp/.env 或由 CF_ENV_FILE 指定的檔案中。需要連線至 Centerfield 網站的網路,訪客手機號碼須為韓國號碼。
安裝前請注意
register 系列工具會在 Centerfield 網站建立真實預約,且沒有取消 API,錯誤預約須在 Centerfield 應用程式內取消。伺服器不強制「先預覽再核准」的綁定,建議對寫入操作保持逐次確認,只需預覽的端點可設 CF_EXPOSE_WRITE_TOOLS=false。批次送出遇到第一個 UNKNOWN 即停止,不應盲目重試。訪客姓名、電話與電子郵件會傳送到 Centerfield 網站。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Centerfield Visitor Mcp,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

Centerfield Visitor MCP

An MCP (Model Context Protocol) server that automates visitor reservations for the Centerfield building (www.centerfield.co.kr). Use it from any MCP-compatible agent — Kiro CLI / Kiro IDE / KiroCrew, Claude Code, Claude Desktop, Codex CLI, Cursor, Strands Agents (local stdio) and Amazon Quick or any remote client (streamable HTTP) — to register visitors with natural language: single entries, pasted text, survey exports, or Excel/CSV files.

센터필드 빌딩 방문예약을 자동화하는 MCP 서버입니다. 로컬 에이전트(Kiro, Claude Code, Codex, Cursor …)는 stdio로, Amazon Quick 같은 원격 에이전트는 streamable HTTP로 같은 서버를 씁니다.

The stdio server runs entirely locally — uvx downloads and runs it on your machine, and it talks directly to www.centerfield.co.kr. No backend service is required for local agents.

Quick start

bash
mkdir -p ~/.config/centerfield-visitor-mcpcp .env.example ~/.config/centerfield-visitor-mcp/.env   # fill CF_COMPANY_NAME, CF_PERSON_IN_CHARGE_MOBILEuvx centerfield-visitor-mcp                               # stdio; every client below can launch this

~/.config/centerfield-visitor-mcp/.env is read automatically, so client configs need no secrets.

Client setup

ClientHowDetails
Kiro CLI~/.kiro/settings/mcp.jsonclients/kiro/mcp.json
Kiro IDE.kiro/settings/mcp.json (workspace)same file
KiroCrewagent JSON mcpServers + toolsclients/kirocrew/agent-snippet.json
Claude Codeclaude mcp add centerfield-visitor --scope user -- uvx centerfield-visitor-mcpclients/claude-code/
Claude Desktopclaude_desktop_config.jsonclients/claude-desktop/
Codex CLI~/.codex/config.toml [mcp_servers.centerfield-visitor]clients/codex/config.toml
Cursor.cursor/mcp.jsonclients/cursor/mcp.json
Strands AgentsMCPClient(stdio_client(...))clients/strands/example.py
Amazon Quickremote streamable HTTP + OAuth 2LOclients/remote/README.md

Agent skill (Agent Skills spec, works in Claude Code / Kiro / KiroCrew): SKILL.md — also shipped as the project skill .claude/skills/centerfield-visitor/SKILL.md.

Tools

ToolSide effectNotes
validate_configuration()noneChecks company, approval contact and floor list against the live site
preview_visitors_from_text(text, default_visit_date, default_visit_time, default_floor, default_purpose, participation)noneParse + validate pasted CSV/TSV
register_visitor(..., dry_run)creates a reservationdry_run=true validates (input + site) without submitting
register_visitors_from_text(text, defaults…, participation, dry_run)creates reservationsSequential, one summary string returned
preview_visitors_from_file(file_path, defaults…, participation)nonestdio deployments only (needs a shared filesystem)
register_visitors_from_file(file_path, defaults…, participation, dry_run)creates reservationsstdio deployments only

register_* tools exist only while CF_EXPOSE_WRITE_TOOLS is true (default).

Recommended flow: validate_configuration once → preview_* → human confirms → register_*. The default_* arguments fill columns that attendee lists usually lack (visit date/time/floor). participation keeps only rows whose attendance-type column contains the given text (see below). Previews mask mobile numbers and emails (010******78, h***@example.com); pass the original values to register_*.

With CF_EXPOSE_WRITE_TOOLS=false the three register_* tools are not registered at all, so the server is preview-only regardless of what a client sends.

Reservation outcomes

Every visitor gets one status (ReservationResult.status; success is kept for compatibility and is true only for SUCCEEDED):

StatusMeaningWhat to do
SUCCEEDEDCenterfield answered success: true (dry run: validated, nothing submitted). No reservation id is returned by the sitedone
FAILEDDefinitely not created: explicit success: false, HTTP 4xx except 408/429, validation/setup error, or the connection was never establishedfix the cause, run a new preview, get approval, retry that row only
UNKNOWNThe request may have been processed but the outcome is unconfirmed: HTTP 408/429/5xx, read/write timeout, read/write error, remote protocol error, non-JSON or unrecognised responsedo not retry; check the Centerfield app/site first
NOT_SUBMITTEDNot sent because an earlier row in the same bulk call was UNKNOWNresolve the UNKNOWN row, then preview + approve again

Bulk calls stop at the first UNKNOWN. The summary always reads 총 N명 중 A명 성공, B명 실패, C명 결과 불명(UNKNOWN), D명 미제출(NOT_SUBMITTED); BulkReservationOut carries succeeded, failed, unknown, not_submitted (they add up to total) and stopped_on_unknown. failed now counts only definite failures (it used to be total - succeeded).

Logs record only the error class and HTTP status, never the site's response text or visitor data.

Input constraints

FieldRule
visit_timeHH:MM, 30-minute intervals, 08:00–20:00 (HH:MM:SS from spreadsheets tolerated)
visit_dateYYYY-MM-DD, today or later in Asia/Seoul, whatever the host time zone; date + time already passed in Seoul is rejected
floor12 or 18; if omitted, CF_DEFAULT_FLOOR (default 12)
visit_purposemeeting (default), visit_business, interview, tour, construction, others
visitor_mobileKorean mobile only (a site requirement); 010-1234-5678, 010 1234 5678, +82 10-1234-5678 are normalized to 01012345678; empty or non-Korean numbers are rejected. Visitors without a Korean mobile need Centerfield's manual process
visitor_emailvalid email address
duplicatesrows with the same mobile + date + time inside one request are skipped and reported

File / text format

Header row in Korean or English; survey-export headers are recognized too (Full Name, Email, 연락처(…), 소속/회사 (…)). Unknown columns are ignored.

이름,회사,전화번호,이메일,방문일,방문시간,층홍길동,ABC주식회사,01012345678,[email protected],2026-11-15,10:00,12

Lists without date/time columns: pass default_visit_date="2026-11-15", default_visit_time="10:00".

Attendance type (survey exports): a column such as 참석 형태 / 어떤 형태로 참석하시나요? / Participation is detected and summarised in the preview (참석 형태 컬럼 감지: 온라인 7, 오프라인 3). Pass participation="오프라인" to process only rows whose value contains that text (case/space-insensitive; rows with an empty value are dropped and counted). If a filter is requested but the input has no such column, register_* refuses instead of registering everyone, and preview_* shows the unfiltered rows under a warning.

Configuration

VariableDescriptionDefaultRequired
CF_COMPANY_NAMETenant company name as registered in Centerfield(empty)✅
CF_PERSON_IN_CHARGE_MOBILEMobile number of the approval contact registered in Centerfield(empty)✅
CF_BUILDING / CF_BUILDING_KEYBuilding code / display keyeast / East
CF_DEFAULT_FLOORFloor when a row omits it (12 or 18)12
CF_TRANSPORTstdio or streamable-httpstdio
CF_HTTP_HOST / CF_HTTP_PORT / CF_HTTP_PATHHTTP bind address and path127.0.0.1 / 8000 / /mcp
CF_HTTP_STATELESS / CF_HTTP_JSON_RESPONSEStreamable HTTP modetrue / true
CF_HTTP_ALLOWED_HOSTSHost allow-list for DNS-rebinding protection (host:* = any port). Empty: loopback binds use a built-in localhost list; other binds run with protection off and log a warning(empty)
CF_EXPOSE_FILE_TOOLSForce file tools on/offon for stdio, off for HTTP
CF_EXPOSE_WRITE_TOOLSRegister the reservation-creating register_* tools. false = preview-only server (tools absent from the tool list). Remote deployments should set it explicitly per endpointtrue
CF_CENTERFIELD_BASE_URLCenterfield base URLhttps://www.centerfield.co.kr
CF_REQUEST_TIMEOUTHTTP timeout (seconds)30
CF_BULK_MAX_VISITORSMax visitors per bulk request (default 20; use 10 as a conservative Amazon Quick cap)20
CF_REQUEST_DELAYDelay between submissions (seconds)0.5
CF_ENV_FILEExtra .env to load(unset)

.env load order (later overrides earlier): ~/.config/centerfield-visitor-mcp/.env → ./.env → $CF_ENV_FILE; process environment variables always win. Startup logs (stderr) list the files read and any problems.

CF_PERSON_IN_CHARGE_MOBILE must be the mobile number registered as the tenant's approval contact. Run validate_configuration after setup — it checks both values live without creating a reservation.

Remote mode (Amazon Quick, hosted deployments)

bash
CF_TRANSPORT=streamable-http CF_HTTP_HOST=0.0.0.0 uvx centerfield-visitor-mcp    # http://host:8000/mcpdocker build --platform linux/arm64 -t centerfield-visitor-mcp .                 # or the container image

See clients/remote/README.md for the AgentCore Runtime + Cognito recipe and the Amazon Quick connector steps. Works with mcp SDK 1.x and 2.x.

Development & testing

bash
uv sync --group devuv run pytest                          # offline unit tests (mocked HTTP)uv run --with "mcp<2" pytest           # same suite on mcp SDK 1.xuv run python scripts/smoke_http.py    # streamable-http transport smoke testuv run pytest -m live                  # read-only checks against the live site (needs a real .env)CF_LIVE_REGISTER=1 CF_TEST_VISITOR_NAME=... CF_TEST_VISITOR_MOBILE=... CF_TEST_VISITOR_EMAIL=... uv run pytest -m live

The last command creates one real reservation; confirm it in the Centerfield mobile app and cancel it there (there is no cancel API).

How it works

The server holds a single session against the Centerfield site, manages CSRF tokens, verifies the tenant company and approval contact, resolves the floor key, then submits the reservation form. Bulk requests are processed sequentially with a configurable delay and stop at the first UNKNOWN outcome.

Known limitations

  • No server-enforced preview → approval → write binding. The server does not issue a preview token that register_* must present, so "a human approved exactly this list" is enforced by the agent skill and the client's tool-approval prompt, not by the server. A token scheme was deliberately left out until a stateless design is settled (the HTTP transport is stateless, so the token must be verifiable without server-side storage, bound to the exact normalized input, short-lived, and replay-safe). Until then, keep per-call approval on for register_* in your client (do not "always allow"), and use CF_EXPOSE_WRITE_TOOLS=false for endpoints that should only preview.
  • No reservation id. The site's success response carries no identifier the server can return; SUCCEEDED means "the site answered success: true". Check the Centerfield app for the booking itself.
  • No cancel API. Cancel wrong bookings in the Centerfield app/site.

MCP Registry

Listed as io.github.hmkim/centerfield-visitor-mcp (see server.json).

mcp-name: io.github.hmkim/centerfield-visitor-mcp

License

MIT

來源:README.md,提交 c7d20dc

工具

6

validate_configuration

센터필드 MCP 설정(입주사명, 승인 담당자, 층 목록)을 실제 사이트에 조회해 확인합니다. 예약을 생성하지 않습니다. Keywords: 센터필드 설정 확인, validate configuration, 담당자 확인, dry run, 연결 테스트

無需輸入參數。

preview_visitors_from_text

텍스트(복사/붙여넣기)로 방문자 목록을 입력받아 등록 없이 파싱·검증 결과만 보여줍니다. 등록 전에 먼저 호출하세요. Keywords: 센터필드, 방문자 미리보기, 명단 확인, preview visitors, 텍스트 확인, 등록 전 확인

輸入參數text必填default_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

register_visitor

센터필드 빌딩 방문자 1명을 예약 등록합니다. dry_run=true면 사이트 검증까지만 하고 제출하지 않습니다. 결과 status: SUCCEEDED(센터필드 success=true 응답) / FAILED(명시적 실패) / UNKNOWN(결과 불명, 재시도 금지) / NOT_SUBMITTED(미제출). Keywords: 센터필드, 방문자 등록, 방문 예약, 방문 신청, visitor registration, centerfield reservation, register visitor, book visitor

輸入參數floordry_runvisit_date必填visit_time必填visitor_name必填visit_purposevisitor_email必填visitor_mobile必填visitor_company_name必填

register_visitors_from_text

텍스트(복사/붙여넣기)로 방문자 목록을 입력받아 일괄 등록합니다. 날짜/시간 컬럼이 없는 참석자 명단은 default_visit_date/default_visit_time을 함께 지정하세요. dry_run=true면 제출하지 않습니다. 첫 결과 불명 행에서 중단합니다. 결과 status: SUCCEEDED(센터필드 success=true 응답) / FAILED(명시적 실패) / UNKNOWN(결과 불명, 재시도 금지) / NOT_SUBMITTED(미제출). Keywords: 센터필드, 방문자 등록, 텍스트 입력, 복사 붙여넣기, paste visitors, text registration, 일괄 등록, 방문자 목록

輸入參數text必填dry_rundefault_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

preview_visitors_from_file

파일(.xlsx/.csv/.tsv)의 방문자 목록을 미리 확인합니다 (실제 등록하지 않음). Keywords: 센터필드, 방문자 미리보기, 파일 확인, preview visitors, 명단 확인, 등록 전 확인

輸入參數file_path必填default_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

register_visitors_from_file

Excel/CSV/TSV 파일에서 방문자 목록을 읽어 일괄 등록합니다. 날짜/시간 컬럼이 없으면 default_visit_date/default_visit_time 지정. dry_run=true면 미제출. 첫 결과 불명 행에서 중단합니다. 결과 status: SUCCEEDED(센터필드 success=true 응답) / FAILED(명시적 실패) / UNKNOWN(결과 불명, 재시도 금지) / NOT_SUBMITTED(미제출). Keywords: 센터필드, 방문자 일괄 등록, 대량 등록, bulk registration, 엑셀 등록, CSV 등록, 파일로 등록, batch visitor, 방문자 명단

輸入參數dry_runfile_path必填default_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

版本歷史

2
  1. v0.3.0最新Nov 7, 2026
  2. v0.2.1Sep 29, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分