Kisi MCP by usefulapi

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

我該用這個嗎

品質與安全性

A
說明品質
97%
結構描述完整度
85%
命名品質
80%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

根據工具定義與協定合規性的自動化分析。

上下文成本

~4,387Token(工具定義)
~1.7 KB典型回應大小
顯著的注意力影響(128k 上下文的 3.43%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `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"
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本20 個工具