Kisi MCP by usefulapi
Read Kisi places, doors, users, groups, access rights and access logs (no unlocking).
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"kisi": {
"url": "https://kisi.usefulapi.io/mcp"
}
}
}Puntos de conexión remotos
https://kisi.usefulapi.io/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (20)
🟢kisi_get_current_user
The Kisi user the API key belongs to (id, name, email, organization). Good first call. GET /user.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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}.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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}.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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}.
Esquema de entrada
{
"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=.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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}.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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.
Esquema de entrada
{
"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}.
Esquema de entrada
{
"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.
Esquema de entrada
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Comunidad
Evidencia