Kisi MCP by usefulapi

Read Kisi places, doors, users, groups, access rights and access logs (no unlocking).

사용해야 할까요

품질 및 안전성

A
설명 품질
97%
스키마 완전성
85%
이름 품질
80%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~4,387토큰 (도구 정의)
~1.7 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 3.43%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "kisi": {
      "url": "https://kisi.usefulapi.io/mcp"
    }
  }
}

원격 엔드포인트

https://kisi.usefulapi.io/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (20)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢kisi_get_current_user

The Kisi user the API key belongs to (id, name, email, organization). Good first call. GET /user.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_organization

The current Kisi organization (name, domain, settings summary). GET /organization.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_places(query, ids, sort, limit, offset)

List places (sites/buildings) in the organization with address, time zone and lock/member counts. GET /places.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search over place name.",
      "type": "string"
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "sort": {
      "description": "Sort order.",
      "type": "string",
      "enum": [
        "name",
        "-name"
      ]
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_place(place_id)

One place by id, including lockdown state. GET /places/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "place_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The place id (numeric)."
    }
  },
  "required": [
    "place_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_locks(query, place_id, floor_id, online, unlocked, ...)

List locks/doors with their state: online, unlocked, locked_down, configured, place and floor. Filter to find offline or locked-down doors. GET /locks.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search over lock name.",
      "type": "string"
    },
    "place_id": {
      "description": "Only locks in this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "floor_id": {
      "description": "Only locks on this floor.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "online": {
      "description": "Filter by online (true) / offline (false).",
      "type": "boolean"
    },
    "unlocked": {
      "description": "Filter by currently unlocked (true) / locked (false).",
      "type": "boolean"
    },
    "locked_down": {
      "description": "Filter by lockdown state.",
      "type": "boolean"
    },
    "configured": {
      "description": "Filter by whether the lock is configured.",
      "type": "boolean"
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "sort": {
      "description": "Sort order.",
      "type": "string",
      "enum": [
        "name",
        "-name"
      ]
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_lock(lock_id)

One lock/door by id: online/unlocked/locked-down state, place, floor, settings. GET /locks/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "lock_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The lock id (numeric)."
    }
  },
  "required": [
    "lock_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_groups(query, place_id, lock_id, scope, ids, ...)

List access groups (who-can-open-what bundles of doors). Filter by place or by a lock to see which groups open that door. GET /groups.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search over group name.",
      "type": "string"
    },
    "place_id": {
      "description": "Only groups of this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "lock_id": {
      "description": "Only groups that include this lock.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "scope": {
      "description": "Organization-wide or place-scoped groups.",
      "type": "string",
      "enum": [
        "organization",
        "place"
      ]
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "sort": {
      "description": "Sort order.",
      "type": "string",
      "enum": [
        "name",
        "-name"
      ]
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_group(group_id)

One access group by id (name, description, place, member/lock counts, restrictions). GET /groups/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "group_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The group id (numeric)."
    }
  },
  "required": [
    "group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_group_locks(group_id, query, limit, offset)

The locks/doors an access group opens. GET /group_locks?group_id=.

입력 스키마

{
  "type": "object",
  "properties": {
    "group_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The group id (numeric)."
    },
    "query": {
      "description": "Free-text search over lock name.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "required": [
    "group_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_users(query, email, group_id, place_id, ids, ...)

List users (members) of the organization. Filter by group or place (users with access there), email, or free text over name/email/notes. Sort by last unlock. GET /users.

입력 스키마

{
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search over user email, name and notes.",
      "type": "string"
    },
    "email": {
      "description": "Exact email filter.",
      "type": "string"
    },
    "group_id": {
      "description": "Only members of this group.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "place_id": {
      "description": "Only users with access to this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "sort": {
      "description": "Sort order; 'unlock' = by last unlock.",
      "type": "string",
      "enum": [
        "name",
        "-name",
        "unlock",
        "-unlock",
        "access_enabled",
        "-access_enabled"
      ]
    },
    "limit": {
      "description": "Max results to return (1-100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_user(user_id)

One user by id. GET /users/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "user_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The user id (numeric)."
    }
  },
  "required": [
    "user_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_role_assignments(user_id, group_id, place_id, role_id, scope, ...)

Who holds which role where: a user/team/guest's role on the organization, a place or a group (group members = door access). Filter by user, group, place or role. GET /role_assignments.

입력 스키마

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Only assignments of this user.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "group_id": {
      "description": "Only assignments on this group.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "place_id": {
      "description": "Only assignments on this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "role_id": {
      "description": "Filter by role id, e.g. group_basic, group_manager, place_owner, organization_administrator.",
      "type": "string"
    },
    "scope": {
      "description": "Filter by scope.",
      "type": "string",
      "enum": [
        "organization",
        "place",
        "group",
        "team"
      ]
    },
    "query": {
      "description": "Free-text search over user email and name.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_cards(user_id, status, sort, ids, limit, ...)

List access cards with status (activated/deactivated/unassigned), assignee and last use. GET /cards.

입력 스키마

{
  "type": "object",
  "properties": {
    "user_id": {
      "description": "Only cards of this user.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "status": {
      "description": "Filter by status.",
      "type": "string",
      "enum": [
        "activated",
        "deactivated",
        "unassigned"
      ]
    },
    "sort": {
      "description": "Sort by last use.",
      "type": "string",
      "enum": [
        "last_used_at",
        "-last_used_at"
      ]
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_presences(place_id, date, limit, offset)

Who was present at a place on a given day (derived from unlocks): actor, first/last unlock, last door. GET /presences.

입력 스키마

{
  "type": "object",
  "properties": {
    "place_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The place id (numeric)."
    },
    "date": {
      "type": "string",
      "description": "The day: a date (2026-10-08) or an RFC 3339 date-time with offset (2026-10-08T09:00:00+02:00). Kisi reads it as a day in the place's time zone; a bare date is sent as noon UTC of that day."
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "required": [
    "place_id",
    "date"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_schedules(consequence, scheduleable_type, scheduleable_id, ids, limit, ...)

Time rules: when a group's access is allowed, when doors auto-unlock (unlock timer), first-to-arrive, elevator permit timers. Filter by consequence or by the group/lock it applies to. GET /schedules.

입력 스키마

{
  "type": "object",
  "properties": {
    "consequence": {
      "description": "Filter by what the schedule does.",
      "type": "string",
      "enum": [
        "allow",
        "first_to_arrive",
        "permit",
        "unlock"
      ]
    },
    "scheduleable_type": {
      "description": "Type of the object (use with scheduleable_id).",
      "type": "string",
      "enum": [
        "Group",
        "Lock",
        "ElevatorStop"
      ]
    },
    "scheduleable_id": {
      "description": "Id of the group/lock/elevator stop (use with scheduleable_type).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "ids": {
      "description": "Comma-separated list of ids to fetch.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_controllers(place_id, lock_id, status, query, limit, ...)

Kisi controllers (door hardware hubs) with online/offline status. Filter by place, lock or status. GET /controllers.

입력 스키마

{
  "type": "object",
  "properties": {
    "place_id": {
      "description": "Only controllers in this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "lock_id": {
      "description": "Only the controller of this lock.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "status": {
      "description": "Filter by status.",
      "type": "string",
      "enum": [
        "online",
        "offline"
      ]
    },
    "query": {
      "description": "Free-text search over name, device id and token.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_readers(place_id, lock_id, status, query, limit, ...)

Kisi readers (card/phone readers at doors) with model and online/offline status. GET /readers.

입력 스키마

{
  "type": "object",
  "properties": {
    "place_id": {
      "description": "Only readers in this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "lock_id": {
      "description": "Only readers of this lock.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "status": {
      "description": "Filter by status.",
      "type": "string",
      "enum": [
        "online",
        "offline"
      ]
    },
    "query": {
      "description": "Free-text search over name, device id and token.",
      "type": "string"
    },
    "limit": {
      "description": "Max results to return (1-250).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    },
    "offset": {
      "description": "Results to skip (offset paging; use pagination.next_offset).",
      "type": "integer",
      "minimum": 0,
      "maximum": 20000
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟡kisi_search_events(interval, type, success, place_id, actor_type, ...)

Search the access log (unlocks, denied attempts, lockdowns, admin changes) and return the first page. This CREATES a temporary saved search in Kisi (an event set, cursor-paginated, kept ~24 h); it changes no door, user or access right. Defaults to the past 90 days, the maximum width. If status is still in_progress or cursor is set, call kisi_get_event_set with the returned id. POST /event_sets.

입력 스키마

{
  "type": "object",
  "properties": {
    "interval": {
      "description": "ISO 8601 interval on event time, max 90 days: start/end (2026-10-01T00:00:00Z/2026-10-08T00:00:00Z), start/duration (2026-10-01T00:00:00Z/P7D) or duration/end (P1D/2026-10-08T00:00:00Z).",
      "type": "string"
    },
    "type": {
      "description": "Event type(s), comma-separated, e.g. lock.unlock (see kisi_list_event_types).",
      "type": "string"
    },
    "success": {
      "description": "Only successful (true) or failed/denied (false) events.",
      "type": "boolean"
    },
    "place_id": {
      "description": "Only events at this place.",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "actor_type": {
      "description": "Actor type (use with actor_id).",
      "type": "string",
      "enum": [
        "User",
        "Guest",
        "GroupLink",
        "MarketplaceInstallation"
      ]
    },
    "actor_id": {
      "description": "Only events by this actor (e.g. a user id).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    },
    "object_type": {
      "description": "Object type, e.g. Lock, Place, Group, User (use with object_id).",
      "type": "string"
    },
    "object_id": {
      "description": "Only events about this object (e.g. a lock id).",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_get_event_set(event_set_id, cursor, limit)

Read an event set from kisi_search_events: its status and events. Pass the previous page's cursor for the next page. GET /event_sets/{id}.

입력 스키마

{
  "type": "object",
  "properties": {
    "event_set_id": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "The event set id (numeric)."
    },
    "cursor": {
      "description": "The cursor from the previous page.",
      "type": "string"
    },
    "limit": {
      "description": "Events per page (default 50).",
      "type": "integer",
      "minimum": 1,
      "maximum": 250
    }
  },
  "required": [
    "event_set_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢kisi_list_event_types

All event type names usable as the type filter of kisi_search_events (e.g. lock.unlock). GET /events/types.

입력 스키마

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 20개