killbottleneck-mcp
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KB_URL | Yes | The URL of your killBottleneck instance (e.g., http://SERVER-IP:8090) | |
| KB_API_KEY | Yes | API key generated in the killBottleneck app (user menu → API keys) with at least read access; 'Read and write' scope for write operations |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_mapsA | List goal maps the key owner can see — own, team and shared maps (id, title, node count, last update, access: owner/edit/work/read). Use archived=true to list archived maps instead. |
| get_mapA | Read one map as an indented tree with node ids, statuses ([✓] done, [~] in progress, [ ] todo), deadlines and owners. The header shows the key's access level (owner/edit = full write; work and read = only the status of the key owner's own nodes, like ticking off in the app). Always call this before modifying a map you have not read yet. |
| create_mapA | Create a new goal map from an outline. The map gets an apex (root goal) from |
| update_mapA | Rename a map or change its description (the project as a whole — not the apex node; the list of maps and the database show this title). Only |
| add_nodesA | Add a subtree of nodes to an existing map under parent_id (or under the apex when parent_id is omitted). A node is a goal; a node with an assignee (owner) OR a deadline IS a task — that is the only kind of task in killBottleneck (there is no separate task record; new work = new node). NOTE: this re-computes the layout of the whole map. Max 200 nodes per call. Returns the updated tree. |
| update_nodeB | Update fields of one node: title, status (todo/in_progress/done), description, deadline (YYYY-MM-DD, empty string clears), planned_on (YYYY-MM-DD, today to +7 days, empty string clears — WHEN the key owner plans to work on it; this is how killBottleneck expresses priority, never by moving the deadline), owner (e-mail, empty string clears), wait_for_children, colour, icon (one emoji), who performs it (executor_kind / executor_name) and the automation wish (automation_wanted / automation_note). Unknown fields are rejected with the list of allowed ones. Marking status done may unblock waiting nodes, notify their owners and trigger automations on them. |
| delete_nodeA | Delete a node INCLUDING its whole subtree. The apex (root) cannot be deleted and whole maps cannot be deleted via the API. Irreversible — read the map first and double-check the node id. |
| create_ruleA | Create an automation rule on a map: WHEN trigger fires (and optional AND conditions match) DO the actions in order. Rules run for changes made in the UI, via API and by agents alike. Structural limits: 50 rules per map, 10 actions, 20 conditions — there is NO monthly run quota. A rule applies only to future events, never retroactively. node_id scopes the rule to one node (required for schedule rules whose actions target a node). |
| list_rulesA | List automation rules of a map: id, name, enabled, scope node, trigger, conditions, actions, last_fired and last_error (a non-empty last_error means the rule is misconfigured and its owner was notified). |
| update_ruleA | Update an automation rule. Pass only |
| delete_ruleA | Delete an automation rule. Its run log stays (with the rule name snapshot). Irreversible. |
| list_rule_runsA | Read the run log of a map's automation rules (newest first, max 100): what fired, on which node, ok/failed/skipped and what the actions did. skipped = a safety stop (rule chain depth or per-save cap), detail says which. |
| list_rule_templatesA | List the instance-wide library of rule templates (shape of a rule without a map or node scope). To use one, read it and call create_rule on the target map with its trigger/conditions/actions — the created rule is an independent copy. |
| save_rule_templateA | Save a rule shape into the instance-wide template library (create, or update with template_id — only the author or an admin may update). Templates carry no map and no node scope; create_subnodes may only use parent=trigger_node. Template names are unique. |
| delete_rule_templateA | Delete a rule template from the library (author or admin only). Rules already created from it are independent copies and stay untouched. |
| get_org_structureA | Read the organization structure (the org map): positions and functions with node ids, holders and deputies. Use the node ids as dynamic rule targets "position:" / "deputy_of_position:". Read-only — holders and deputies are appointed by an admin in the app. |
| list_peopleA | List the people work can be assigned to: instance members (e-mail, display name, role) and external contacts visible to the key owner (their owner_email is a pseudo e-mail usable as owner). Use these e-mails as |
| get_portfolioA | Read the portfolio overview across all team and shared maps the key owner can read (private maps are excluded, exactly like the Organization page): per-project completion, overdue and stuck items, people with overdue work and a 7-day change summary. Optional today=YYYY-MM-DD. Read-only. |
| create_eventA | Create a calendar EVENT with a time (meeting, call, dentist…) — NOT a task and not part of any map. Personal by default; |
| create_eventsA | Create SEVERAL calendar events at once — e.g. every date of a lecture schedule, a seminar invitation or a training plan ("every Tuesday until January" = list each date). All or nothing: when one item is invalid nothing is written and the error names the item. An event that is already in the calendar (same title, day and time) is skipped and reported. calendar, participants and remind_before_min apply to all items. Max 30 items; time off goes one by one via create_event. |
| update_eventA | Change an existing event by id: your own, one in a shared calendar as admin/manager, or your own time off. Only the given fields change; an empty string clears time, end_day, end_time or calendar (calendar "" = make it personal). Moving |
| delete_eventA | Delete an event by id (your own, or one in a shared calendar as admin/manager). If you were only invited, you leave the event instead and it stays for the others. |
| list_eventsA | List the calendar events the key owner sees — own, invited, and every event of the shared calendars — in a day range; default today−365 … +730. A multi-day event counts when it overlaps the range. Optional calendar = only that shared calendar. Read-only. |
| list_calendarsA | List the shared calendars of the instance — company events (shared), rooms and other bookable things (resource), vacations and time off (absence) — with kind, color, who may add entries (write_access) and whether time off needs approval. Read-only. |
| create_calendarA | Create a shared calendar (admin or manager only): kind shared = company events, resource = a room, car or other bookable thing (overlapping bookings are refused), absence = vacations and time off (needs_approval makes new entries wait for an admin/manager decision). visibility all = the whole team sees it (default); members = only the listed members (e-mails from list_people), and the creator — like a project shared with chosen people (an admin who is not listed does not see it either). write_access admins limits new entries to admins and managers. Archive a calendar to keep its history; delete_calendar removes it with all its events. |
| delete_calendarA | Delete a shared calendar by id or name together with ALL its events (admin or manager only). Cannot be undone — prefer archiving (not offered here) when the history should stay. |
| who_is_awayA | Who is away — time off from absence calendars that is approved or not subject to approval (pending and rejected requests are excluded) — in a day range; default today … +14. One line per person and absence. Read-only. |
| create_reminderA | Set a timed REMINDER for a map node relative to its deadline: offset_days before the deadline (0 = on the deadline day, 1 = the day before) at time HH:MM, instance local time. One reminder per person and node (calling again replaces it). Does NOT change the deadline; the node must already have one (set it with update_node first). Private to the key owner. |
| list_pagesA | List the key owner's pages — single-file HTML artifacts (presentations, overviews, small apps) created by the assistant or an agent: id, title, status (ceka = queued, pise = being written, hotovo = ready, chyba = failed), size, public link, team visibility. |
| get_pageA | Read one page (page_id from list_pages): its metadata and the full HTML. Read it before changing a page with update_page. |
| generate_imageA | Draw a picture (illustration, banner, header image, poster) with the instance's image model and return a public link to the JPEG. Write |
| create_pageA | Create a page from a COMPLETE single-file HTML document you wrote yourself (inline CSS/JS; external libraries only from https CDNs; no fetch to other servers; size limit per instance, typically 300 kB). The page appears in the user's Pages panel in the app and runs sandboxed (no access to the app's session). team_visible=true shows it to all members of the organization. Returns the id and the public link if one is on. |
| update_pageA | Replace the HTML and/or the title of an existing page (page_id from list_pages). Send the WHOLE new document, not a diff; the previous version is kept and the user can restore it. |
| share_pageA | Change sharing of a page: link_on = public link for anyone with the link (no account needed), link_off = turn it off, link_new = replace the link (the old one stops working), team_on / team_off = show or hide the page for all members of the organization, user_on / user_off = share with / unshare from one named member (pass |
| delete_pageA | Delete a page for good (page_id from list_pages). Cannot be undone. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 35 tools
Tools generally target distinct resources and actions across maps, nodes, rules, calendars, events, pages and images. Minor friction exists between create_event and create_events, and between create_rule/save_rule_template, but descriptions make the boundaries readable.
Most tools follow a clear verb_noun pattern (list_maps, create_map, update_node, delete_rule, list_pages). Exceptions like who_is_away and some plural forms (create_events) are minor and do not impede predictability.
35 tools is heavy for one MCP server and spans many largely independent product areas: goal maps, automations, org data, calendars, pages and image generation. A tighter surface or domain-splitting would reduce cognitive load and misselection risk.
Core map, node, rule and page workflows have solid coverage, but there are notable lifecycle gaps: calendars cannot be updated, reminders can be created but not listed/deleted/updated, and whole-map deletion is explicitly unavailable. These create some dead ends for agents.