Kisi MCP by usefulapi

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

¿Debería usar esto?

Calidad y seguridad

A
Calidad de la descripción
97%
Integridad del esquema
85%
Calidad de los nombres
80%
Riesgo de envenenamiento
100%
Coincidencia de permisos
100%
Cumplimiento del protocolo
100%

Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.

Costo de contexto

~4,387Tokens (definiciones de herramientas)
~1.7 KBTamaño de respuesta típico
Impacto significativo en la atención (3.43% del contexto de 128k)

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-http

Qué puede hacer

Inventario de herramientas

Herramientas (20)

🟢 Solo lectura🟡 Escritura🔴 Eliminación⚪ Desconocido
🟢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

Califica este servidor

Evidencia

Observaciones recientes

verificadoversión no registrada20 herramientas