Centerfield Visitor Mcp

io.github.hmkimPublished by GitHub account hmkimv0.3.0Updated Nov 11, 2026

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

Overview

AI-generated overview

Registers visitors for the Centerfield building in Seoul: validates tenant settings, previews attendee lists, and submits reservations.

What you can do
  • Validate tenant configuration (company, approval contact, floors) against the live Centerfield site without booking
  • Preview visitor lists pasted as text or read from Excel/CSV/TSV files, with masked phone numbers and emails
  • Register a single visitor, optionally as a dry run that validates without submitting
  • Bulk-register visitors from pasted text or files, with default date, time, floor and purpose for lists lacking those columns
  • Filter attendee rows by participation type and report per-row status (succeeded, failed, unknown, not submitted)
When to use it
Use it when you regularly pre-register visitors for the Centerfield building and want an assistant to turn pasted lists, survey exports or spreadsheets into reservations, with a preview step before anything is submitted.
Requirements
Runs locally over stdio via uvx (Python), or as a streamable HTTP server for remote clients. Needs CF_COMPANY_NAME and CF_PERSON_IN_CHARGE_MOBILE, typically in ~/.config/centerfield-visitor-mcp/.env or a file named by CF_ENV_FILE. Network access to the Centerfield site is required; visitor mobile numbers must be Korean.
Before you install
The register tools create real reservations on the Centerfield site; there is no cancel API, so wrong bookings must be cancelled in the Centerfield app. The server does not enforce a preview-then-approve binding, so keep per-call approval on and consider CF_EXPOSE_WRITE_TOOLS=false for preview-only use. Bulk runs stop at the first UNKNOWN outcome, which must not be retried blindly. Visitor names, phone numbers and emails are sent to the Centerfield site.

Installation

In SourceWeft

  1. Open Centerfield Visitor Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

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

Source: README.md at commit c7d20dc

Tools

6

validate_configuration

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

Takes no parameters.

preview_visitors_from_text

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

Parameterstextrequireddefault_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

Parametersfloordry_runvisit_daterequiredvisit_timerequiredvisitor_namerequiredvisit_purposevisitor_emailrequiredvisitor_mobilerequiredvisitor_company_namerequired

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, 일괄 등록, 방문자 목록

Parameterstextrequireddry_rundefault_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

preview_visitors_from_file

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

Parametersfile_pathrequireddefault_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, 방문자 명단

Parametersdry_runfile_pathrequireddefault_floorparticipationdefault_purposedefault_visit_datedefault_visit_time

Version history

2
  1. v0.3.0LatestNov 7, 2026
  2. v0.2.1Sep 29, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts