Skip to content

Kisi MCP by usefulapi

by usefulapi.io · remote · no sign-in to list tools · v1.7.3 · published by io.usefulapi

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

Changes · 2

20 tools: 2 change things and 18 only read.

Scanned Oct 21, 2026

2 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http kisi https://kisi.usefulapi.io/mcp

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "kisi_list_group_locks" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kisi_list_group_locks" says "list": a word for reading.

    What this check looks for
  • The server marks "kisi_search_events" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "kisi_search_events" says "search": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

20 tools

Changes things 2Claude Code: ask
  • kisi_list_group_locksThe locks/doors an access group opens.1 finding

    Why it is in this group

    • The name "kisi_list_group_locks" says "list": a word for reading.
    • The description's first verb is "lock": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "kisi_list_group_locks" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The name "kisi_list_group_locks" says "list": a word for reading.

      What this check looks for
    Description, as the server wrote it
    The locks/doors an access group opens. GET /group_locks?group_id=.

    Annotations the server declares

    • title: List a group's locks
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_search_eventsSearch the access log (unlocks, denied attempts, lockdowns, admin changes) and return the first page.1 finding

    Why it is in this group

    • The name "kisi_search_events" says "search": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "kisi_search_events" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "kisi_search_events" says "search": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Search access events
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Only reads 18Claude Code: allow
  • kisi_get_current_userThe Kisi user the API key belongs to (id, name, email, organization).No findings

    Why it is in this group

    • The name "kisi_get_current_user" says "get": a word for reading.
    Description, as the server wrote it
    The Kisi user the API key belongs to (id, name, email, organization). Good first call. GET /user.

    Annotations the server declares

    • title: Get the current user
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_event_setRead an event set from kisi_search_events: its status and events.No findings

    Why it is in this group

    • The name "kisi_get_event_set" says "get": a word for reading.
    Description, as the server wrote it
    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}.

    Annotations the server declares

    • title: Get an event set page
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_groupOne access group by id (name, description, place, member/lock counts, restrictions).No findings

    Why it is in this group

    • The name "kisi_get_group" says "get": a word for reading.
    Description, as the server wrote it
    One access group by id (name, description, place, member/lock counts, restrictions). GET /groups/{id}.

    Annotations the server declares

    • title: Get an access group
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_lockOne lock/door by id: online/unlocked/locked-down state, place, floor, settings.No findings

    Why it is in this group

    • The name "kisi_get_lock" says "get": a word for reading.
    Description, as the server wrote it
    One lock/door by id: online/unlocked/locked-down state, place, floor, settings. GET /locks/{id}.

    Annotations the server declares

    • title: Get a lock (door)
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_organizationThe current Kisi organization (name, domain, settings summary).No findings

    Why it is in this group

    • The name "kisi_get_organization" says "get": a word for reading.
    Description, as the server wrote it
    The current Kisi organization (name, domain, settings summary). GET /organization.

    Annotations the server declares

    • title: Get the organization
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_placeOne place by id, including lockdown state.No findings

    Why it is in this group

    • The name "kisi_get_place" says "get": a word for reading.
    Description, as the server wrote it
    One place by id, including lockdown state. GET /places/{id}.

    Annotations the server declares

    • title: Get a place
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_get_userOne user by id.No findings

    Why it is in this group

    • The name "kisi_get_user" says "get": a word for reading.
    Description, as the server wrote it
    One user by id. GET /users/{id}.

    Annotations the server declares

    • title: Get a user
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_cardsList access cards with status (activated/deactivated/unassigned), assignee and last use.No findings

    Why it is in this group

    • The name "kisi_list_cards" says "list": a word for reading.
    Description, as the server wrote it
    List access cards with status (activated/deactivated/unassigned), assignee and last use. GET /cards.

    Annotations the server declares

    • title: List access cards
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_controllersKisi controllers (door hardware hubs) with online/offline status.No findings

    Why it is in this group

    • The name "kisi_list_controllers" says "list": a word for reading.
    Description, as the server wrote it
    Kisi controllers (door hardware hubs) with online/offline status. Filter by place, lock or status. GET /controllers.

    Annotations the server declares

    • title: List controllers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_event_typesAll event type names usable as the type filter of kisi_search_events (e.g.No findings

    Why it is in this group

    • The name "kisi_list_event_types" says "list": a word for reading.
    Description, as the server wrote it
    All event type names usable as the type filter of kisi_search_events (e.g. lock.unlock). GET /events/types.

    Annotations the server declares

    • title: List event types
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_groupsList access groups (who-can-open-what bundles of doors).No findings

    Why it is in this group

    • The name "kisi_list_groups" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List access groups
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_locksList locks/doors with their state: online, unlocked, locked_down, configured, place and floor.No findings

    Why it is in this group

    • The name "kisi_list_locks" says "list": a word for reading.
    Description, as the server wrote it
    List locks/doors with their state: online, unlocked, locked_down, configured, place and floor. Filter to find offline or locked-down doors. GET /locks.

    Annotations the server declares

    • title: List locks (doors)
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_placesList places (sites/buildings) in the organization with address, time zone and lock/member counts.No findings

    Why it is in this group

    • The name "kisi_list_places" says "list": a word for reading.
    Description, as the server wrote it
    List places (sites/buildings) in the organization with address, time zone and lock/member counts. GET /places.

    Annotations the server declares

    • title: List places
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_presencesWho was present at a place on a given day (derived from unlocks): actor, first/last unlock, last door.No findings

    Why it is in this group

    • The name "kisi_list_presences" says "list": a word for reading.
    Description, as the server wrote it
    Who was present at a place on a given day (derived from unlocks): actor, first/last unlock, last door. GET /presences.

    Annotations the server declares

    • title: List presences at a place
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_readersKisi readers (card/phone readers at doors) with model and online/offline status.No findings

    Why it is in this group

    • The name "kisi_list_readers" says "list": a word for reading.
    Description, as the server wrote it
    Kisi readers (card/phone readers at doors) with model and online/offline status. GET /readers.

    Annotations the server declares

    • title: List readers
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_role_assignmentsWho holds which role where: a user/team/guest's role on the organization, a place or a group (group members = door access).No findings

    Why it is in this group

    • The name "kisi_list_role_assignments" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List role assignments (access rights)
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_schedulesTime rules: when a group's access is allowed, when doors auto-unlock (unlock timer), first-to-arrive, elevator permit timers.No findings

    Why it is in this group

    • The name "kisi_list_schedules" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List schedules
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true
  • kisi_list_usersList users (members) of the organization.No findings

    Why it is in this group

    • The name "kisi_list_users" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List users
    • readOnlyHint: true
    • destructiveHint: false
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.7.3. Values in angle brackets are yours to fill in.

claude mcp add --transport http kisi https://kisi.usefulapi.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__kisi__kisi_get_current_user",
      "mcp__kisi__kisi_get_organization",
      "mcp__kisi__kisi_list_places",
      "mcp__kisi__kisi_get_place",
      "mcp__kisi__kisi_list_locks",
      "mcp__kisi__kisi_get_lock",
      "mcp__kisi__kisi_list_groups",
      "mcp__kisi__kisi_get_group",
      "mcp__kisi__kisi_list_users",
      "mcp__kisi__kisi_get_user",
      "mcp__kisi__kisi_list_role_assignments",
      "mcp__kisi__kisi_list_cards",
      "mcp__kisi__kisi_list_presences",
      "mcp__kisi__kisi_list_schedules",
      "mcp__kisi__kisi_list_controllers",
      "mcp__kisi__kisi_list_readers",
      "mcp__kisi__kisi_get_event_set",
      "mcp__kisi__kisi_list_event_types"
    ],
    "ask": [
      "mcp__kisi__kisi_list_group_locks",
      "mcp__kisi__kisi_search_events"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as kisi. Review it before you use it.