Kisi MCP by usefulapi
Read Kisi places, doors, users, groups, access rights and access logs (no unlocking).
사용해야 할까요
품질 및 안전성
도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.
컨텍스트 비용
이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.
설치
원클릭 설치
`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"
}커뮤니티
증거