Skip to main content
Glama

kwikset-mcp

Claude가 Kwikset Halo 계열 스마트 잠금장치(Halo, Halo Keypad, Halo Touch, Halo Select / Select Plus)를 확인하고 제어할 수 있게 해 주는 MCP 서버입니다.

이 프로젝트는 이전 Python 버전을 Node.js로 다시 작성한 것입니다. Windows에서 Python 특유의 설정 문제(인터프리터 없음, virtualenv 활성화, PATH 별칭)를 피하고자 전환했습니다. Node에는 이전 버전이 의존했던 Python 라이브러리 aiokwikset과 정확히 대응하는 것이 없으므로, 이 버전은 Kwikset의 클라우드 API와 직접 통신합니다. 로그인은 AWS Cognito, 홈/기기/잠금/잠금 해제 처리에는 간단한 REST API를 사용합니다.

API 세부 정보의 출처: Kwikset은 공식 API를 제공하지 않습니다. 이 서버가 사용하는 Cognito 풀/클라이언트 ID, API 호스트, REST 경로는 Apache-2.0 라이선스로 공개된 homebridge-kwikset-halo(이 잠금장치용 커뮤니티 Homebridge 플러그인)의 소스에서 추출했습니다. 이 플러그인은 다시 이 값들을 처음 문서화한 aiokwikset에 공로를 인정합니다. 자세한 내용은 src/const.js와 src/cognito.js의 주석을 참조하세요. 이 방식은 Kwikset이 공식적으로 지원하는 것이 아니며, Kwikset 쪽에서 서버 설정을 바꾸면 동작이 중단될 수 있습니다.

테스트 상태: 이 서버의 모든 로직 조각 — Cognito 로그인 흐름(2단계 전화번호 인증 챌린지 포함), 토큰 갱신 및 영속화, REST 필드 매핑, unlock_door 확인 가드, 그리고 모든 MCP 엔드투엔드 테스트 — 는 AWS Cognito, Kwikset REST API, MCP SDK 대신 손으로 작성한 mock으로 검증했고, 모두 통과했습니다. 여기서 테스트하지 못한 것은 실제 Kwikset 서비스 호출입니다. 실제 계정과 물리적 잠금장치가 필요하기 때문입니다. 첫 list_locks 호출을 실제 스모크 테스트로 간주하세요. 호출 자체가 완전히 실패하면(단지 일부 필드가 null인 수준이 아니라면) 풀/호스트 상수가 오래된 것일 수 있습니다. 도구가 null을 반환하면 debug_raw_devices를 실행해 실제 필드 이름을 확인하고 src/kwikset-client.js와 비교해 보세요.

로그인이 별도 단계인 이유

Kwikset 비밀번호는 LLM 대화를 거쳐서는 안 됩니다. 따라서 인증은 일반 터미널에서 auth-setup.js를 통해 한 번만 수행되며, 결과로 얻은 세션 토큰만 로컬에 저장합니다(비밀번호는 저장하지 않습니다). MCP 서버는 연결할 때마다 그 토큰을 읽고 자동으로 갱신하며, Claude나 Claude를 통한 당신에게 비밀번호를 묻지 않습니다.

Related MCP server: Home Assistant MCP Server

설치

  1. Node.js 설치 (18+): 아직 없다면 nodejs.org에서 LTS 설치 프로그램을 받으세요. 다음처럼 확인할 수 있습니다.

node --version
  1. 의존성 설치 — 이 폴더 안에서 실행하세요.

npm install
  1. 로그인을 한 번 하세요. 자격 증명은 세 가지 방법으로 지정할 수 있고, 다음 순서로 확인됩니다.

# 1. CLI flags (any OS/shell)
node auth-setup.js --email you@example.com --password "hunter2"
# 2. Environment variables (preferred over the flag above - a
#    command-line password is visible to other processes/users on the
#    machine and lands in shell history)

# macOS / Linux
KWIKSET_EMAIL=you@example.com KWIKSET_PASSWORD='hunter2' node auth-setup.js
# Windows PowerShell
$env:KWIKSET_EMAIL = "you@example.com"
$env:KWIKSET_PASSWORD = "hunter2"
node auth-setup.js
# 3. Interactive prompt (any OS/shell; default if nothing else is given)
node auth-setup.js

계정에 전화번호 인증이 필요하면 Kwikset이 문자로 보낸 코드를 입력하라는 메시지가 표시됩니다(또는 --mfa-code / $KWIKSET_MFA_CODE로 미리 전달할 수도 있습니다). 이 과정은 소유자만 읽고 쓸 수 있는 ~/.kwikset-mcp/tokens.json 파일을 생성합니다. 이후 비밀번호는 다시 사용되지 않습니다.

  1. Claude에 서버를 연결하세요.

Claude Code에서는 이 프로젝트 디렉터리에서 다음을 실행합니다.

# macOS / Linux
claude mcp add kwikset -- node "$(pwd)/src/server.js"
# Windows PowerShell
claude mcp add kwikset -- node "$PWD\src\server.js"

Claude Desktop에서는 claude_desktop_config.json(Settings → Developer → Edit Config)에 다음 내용을 추가하세요. 이 폴더에 있는 src/server.js의 절대 경로로 바꿔서 넣어야 합니다.

{
  "mcpServers": {
    "kwikset": {
      "command": "node",
      "args": ["/absolute/path/to/kwikset-mcp/src/server.js"]
    }
  }
}

Windows에서 JSON 경로에는 이중 백슬래시를 사용합니다. 예: "C:\\Users\\you\\kwikset-mcp\\src\\server.js".

그런 다음 Claude 클라이언트를 다시 실행하면 새 서버를 인식합니다.

  1. 사용해 보세요. Claude에게 "list my Kwikset locks" 또는 "is the front door locked?"처럼 물어보면 됩니다. 그러면 list_locks / get_lock_status를 호출할 것입니다. 잠금 해제는 명확한 요청이 필요합니다. unlock_door는 confirm=true로 호출해야만 실제 잠금 해제를 수행하며, Claude는 사용자가 해당 문을 잠금 해제하라고 명확히 요청한 경우에만 confirm=true를 전달합니다.

제공되는 도구

도구

설명

list_locks

계정의 모든 잠금장치 (상태, 배터리 %, 홈 포함)

get_lock_status(device_id)

잠금장치 하나의 상태/배터리/모델/시리얼

lock_door(device_id)

문 잠금

unlock_door(device_id, confirm)

문 잠금 해제 (confirm=true 필수)

debug_raw_devices

진단용: Kwikset API에서 가공하지 않은 원시 홈/기기 JSON

다시 인증

토큰이 만료되고 조용히 갱신할 수 없는 경우(예: Kwikset 비밀번호가 변경되었거나 2FA가 초기화된 경우) 도구 호출은 안내와 함께 auth_required 오류를 반환합니다. 그냥 node auth-setup.js를 다시 실행하세요.

파일

kwikset-mcp/
├── auth-setup.js           # run once, by hand, to log in
├── src/
│   ├── const.js             # Cognito pool/client IDs, API host (see caveats above)
│   ├── auth.js               # local token file read/write
│   ├── cognito.js            # AWS Cognito login/refresh (amazon-cognito-identity-js)
│   ├── kwikset-client.js     # REST calls: homes, devices, lock/unlock
│   └── server.js             # MCP server + tool definitions
├── package.json
└── .gitignore

Available Tools

5 tools
debug_raw_devicesA

Diagnostic tool: dumps the raw, unprocessed home/device JSON straight from Kwikset's API. Use this only when another tool returns null fields (name/status/battery, etc) - that means Kwikset renamed a field this server looks for, and this shows the real field names.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations provided, the description carries the full disclosure burden. It clearly states this is a diagnostic read-only dump and explains the failure mode it addresses. It doesn't explicitly state side effects or caveats, but 'dumps' combined with 'Diagnostic tool' implies no mutation, and the scope is well defined.

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 exactly two sentences, with the most essential fact ('Diagnostic tool') front-loaded. Every clause earns its place: the source of data, the triggering condition, and the reason for the null-field symptom. No filler or repetition exists.

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

Completeness5/5

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

The description fully covers what an agent needs: when to invoke this tool, what it returns, and why the output matters. No parameters or output schema are required, and the diagnostic purpose is unlikely to require further detail about return values or error handling for correct selection and 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?

The tool has zero parameters and a 100% schema description coverage (vacuously, since the schema is empty). The description explains the nature of the output ('raw, unprocessed... JSON') and the diagnostic trigger, which is sufficient because no parameter guidance 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 states a specific action ('dumps the raw, unprocessed home/device JSON') and a clear resource ('straight from Kwikset's API'). It identifies itself as a 'Diagnostic tool,' which immediately distinguishes it from the sibling commands that perform listing, status, and locking actions.

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

Usage Guidelines5/5

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

The description gives an explicit condition for when to use it: 'Use this only when another tool returns null fields.' It also explains the reasoning (Kwikset renamed a field) and the expected value (shows real field names), leaving no ambiguity about when to choose this tool over siblings.

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

get_lock_statusA

Get the current status (locked/unlocked/jammed), battery level, and model/serial for one lock. Get device_id from list_locks first.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesA lock's device_id, from list_locks

TDQS

A4.2/5.0
Behavior3/5

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

With no annotations, the description carries the disclosure burden. It indicates a read-only retrieve operation by the word 'Get' and lists the data returned, but it does not explicitly state side-effect-free behavior, failure/error behavior for a bad device_id, or whether status is live vs cached.

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?

Two short sentences contain only useful information: what the tool returns and the required prerequisite. The action and scope are 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?

For a single-parameter read tool with no output schema, the description covers what will be returned and how to get the parameter. It omits edge-case behavior, but the essential calling context is present.

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?

Schema coverage is 100%, giving baseline 3. The description adds value beyond the schema by telling the agent where to obtain device_id and that it must be obtained first from list_locks.

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 starts with a specific verb ('Get'), names the exact resource ('current status ... for one lock'), and enumerates the returned fields (status, battery level, model/serial). This clearly differentiates it from sibling tools like list_locks (listing) and lock_door/unlock_door (actuation).

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

Usage Guidelines4/5

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

The description gives a clear prerequisite and data source: 'Get device_id from list_locks first.' It does not explicitly say when not to use this tool, but the operation is unique among the siblings, so the workflow instruction is the main needed guidance.

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

list_locksA

List every Kwikset lock on the account, with its current status, battery percentage, and the home it belongs to. Call this first to find a lock's device_id before locking/unlocking/checking it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

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

No annotations are provided, so the description must disclose behavior. It clearly states what the tool returns (locks with status, battery, and home) and implies that the device_id is obtainable from the result, which is essential for subsequent operations. It does not explicitly mention side effects (likely read-only) or edge cases, but for a simple listing tool this is sufficient.

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 two concise sentences, with the core purpose and returned content front-loaded and the usage guidance provided second. There is no wasted wording or off-topic detail.

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?

The description adequately covers what the tool does, what it returns, and when to use it relative to siblings. It does not mention pagination or ordering, but given the simple nature of the tool and absence of parameters or output schema, this is a minor gap and does not hinder correct 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?

The tool has zero parameters, so no parameter documentation is needed. The baseline of 4 for zero-parameter tools applies because there is nothing to explain, and the description does not omit any required parameter semantics.

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 ('List') and a specific resource ('every Kwikset lock on the account'), and enumerates the returned fields (status, battery, home). This clearly distinguishes it from sibling tools that target individual locks (lock_door, unlock_door, get_lock_status).

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Call this first to find a lock's device_id before locking/unlocking/checking it.' This gives a direct and clear usage directive that routes the agent to this tool before the sibling operations, and implies when not to use it (after you have the device_id).

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

lock_doorA

Lock a Kwikset door. Get device_id from list_locks first.

ParametersJSON Schema
NameRequiredDescriptionDefault
device_idYesA lock's device_id, from list_locks

TDQS

A3.7/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 for behavioral disclosure. It states the action but does not mention side effects beyond locking, required permissions, failure modes, idempotency, or what response to expect.

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?

Two tight sentences front-load the action and then give the essential prerequisite. There is no filler or redundant wording.

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?

The tool is simple with one well-documented parameter and a clear action, so the description is minimally viable. However, with no annotations and no output schema, it leaves return/error behavior and side-effect expectations unexplained.

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 coverage is 100% and the schema already says device_id comes from list_locks. The description repeats that prerequisite but adds no additional parameter semantics beyond what the schema provides, so the baseline score applies.

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 and resource ('Lock a Kwikset door') and the prerequisite ('Get device_id from list_locks first') further clarifies its role. It is clearly distinct from unlock_door and list_locks without needing to read their schemas.

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

Usage Guidelines4/5

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

The description gives a clear usage context by instructing the agent to obtain device_id from list_locks first. It does not explicitly mention when not to use it or name unlock_door as the alternative, but the command's action is self-explanatory enough for basic routing.

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

unlock_doorA

Unlock a Kwikset door. This is a physical-security-sensitive action - only call this after the user has explicitly asked to unlock this specific door, and pass confirm=true. Calling with confirm=false (the default) is a no-op that returns a reminder instead of unlocking.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to actually unlock the door.
device_idYesA lock's device_id, from list_locks

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations provided, the description carries full responsibility, and it delivers. It flags the action as physical-security-sensitive, states the confirmation requirement, and discloses that calling with confirm=false is a no-op that returns a reminder instead of unlocking.

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 two sentences with no filler. It front-loads the core action, then packs the security warning, caller precondition, and confirmation behavior into compact, high-value language.

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

Completeness5/5

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

For a simple two-parameter physical-security action with no output schema, the description covers everything needed to invoke it correctly: the requirement for explicit user consent, the needed confirmation flag, and the no-op fallback. Nothing critical is missing.

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?

Schema coverage is 100%, so parameters are already documented. The description adds meaningful behavioral context beyond the schema by specifying that confirm=true is required and that false leads to a no-op reminder, which is not fully captured in the schema alone.

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 states a specific verb and resource: 'Unlock a Kwikset door.' It is immediately distinguishable from sibling tools like lock_door and list_locks, leaving no ambiguity about the tool's function.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use guidance: only after the user has explicitly asked to unlock this specific door. It also requires confirm=true and explains that confirm=false is a deliberate no-op, providing clear behavior boundaries.

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. 5 tool updatesv0.1.0
    • First observeddebug_raw_devices
    • First observedget_lock_status
    • First observedlist_locks
    • First observedlock_door
    • First observedunlock_door

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a crystal-clear, non-overlapping purpose: listing all locks, fetching one lock's status, locking, unlocking, and debugging raw API data. No two tools could be confused for each other.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern (list_locks, get_lock_status, lock_door, unlock_door, debug_raw_devices). The naming is uniform and predictable.

Tool Count5/5

Five tools is perfectly scoped for a smart-lock management server. Each tool addresses an essential core function, with no redundancy and no obvious missing high-level operation.

Completeness5/5

The core lifecycle for lock management is fully covered: list, get status, lock, and unlock. The debug tool covers a diagnostic edge case, making the surface feel complete for its stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables control of smart locks through the Seam API, allowing users to lock/unlock doors, check status, and manage access codes across 100+ supported lock brands. Supports comprehensive access code management including temporary codes and multi-lock operations.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables Claude Desktop to read and control Home Assistant devices via natural language, with configurable safety restrictions on sensitive actions.
    2
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables Claude to control PetLibro RFID pet feeders and water fountains by checking food/battery/water status, dispensing food by the cup, and force-opening feeder lids via the PetLibro cloud API.
    GPL 3.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables checking and controlling Kwikset Halo-family smart locks, including listing locks, viewing status and battery, and locking/unlocking doors, with token-based authentication kept outside the LLM conversation.
    1
    -