Kisi MCP by usefulapi

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

Sollte ich dies verwenden

Qualität und Sicherheit

A
Qualität der Beschreibung
97%
Vollständigkeit des Schemas
85%
Qualität der Benennung
80%
Risiko der Vergiftung
100%
Übereinstimmung der Berechtigungen
100%
Einhaltung des Protokolls
100%

Basierend auf einer automatisierten Analyse der Tool-Definitionen und der Einhaltung des Protokolls.

Kontextkosten

~4,387Tokens (Tool-Definitionen)
~1.7 KBTypische Antwortgröße
Erhebliche Auswirkung auf die Aufmerksamkeit (3.43% von 128k Kontext)

Dies ist die ungefähre Anzahl der Tokens, die jedes Mal verbraucht werden, wenn die Tools des Servers in den Kontext eines Modells geladen werden. Höhere Werte verringern die Aufmerksamkeit, die für andere Aufgaben verfügbar ist.

Installieren

Installation mit einem Klick

Fügen Sie dies Ihrer Datei `claude_desktop_config.json` hinzu:

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

Remote-Endpunkte

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

Was es kann

Tool-Inventar

Tools (20)

🟢 Nur lesen🟡 Schreiben🔴 Löschen⚪ Unbekannt
🟢kisi_get_current_user

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

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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}.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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}.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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}.

Eingabe-Schema

{
  "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=.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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}.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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.

Eingabe-Schema

{
  "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}.

Eingabe-Schema

{
  "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.

Eingabe-Schema

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

Community

Diesen Server bewerten

Nachweis

Aktuelle Beobachtungen

verifiziertVersion nicht aufgezeichnet20 Tools