kbb-mcp-relay
MCP relay for InfoRapid KnowledgeBase Builder
npm · fingerprint cbd050a8fe3db5ae6769fb74 · repository · RSS
What changed
Changed 2026-10-08 13:39 UTC
2 descriptions rewritten, 1 schema or annotation change with the description left byte-identical.
--- pinned/kbb_set_diagram +++ observed/kbb_set_diagram { "description": "Sets diagram visual properties (background, palette colors, line width, etc.). For layout and display mode, use the dedicated tools kbb_set_layout / kbb_set_display_mode.", "execution": { - "description": "Key-value pairs of diagram properties, e.g. {\"bp\":\"nebula\"} or {\"bc\":[14,22,40]}. Every key is written through and the diagram is redrawn, so keys missing from this list still work. Known keys: ba bc bp bp3d bpi bpi3d bpin bpin3d c1 c2 c3 c4 col dce hrl ia ico ics iex irc lw mi ml mri sdrao swm to3d tv wcl wtr wud udf udt. col controls colouring: 0 = item-wise (required for per-item colours from kbb_set_style), 1 = level-wise, 2 = parent-wise (default), 3 = category-wise. For tv use kbb_set_display_mode. BACKGROUND: bp is the pattern of the 2D view only (none, perspective, checkered-paper, blueprint, polka-dots, cross-stitch, honeycomb, edge-circles, triangles, phyllotaxis-full, nebula, image-from-root, image-from-repository); bp3d is the separate pattern of the 3D view (none, starfield, grid, image-from-root, image-from-repository, default starfield). bc is the background COLOUR and is shared by both views — there is no bc3d. The dark night sky behind starfield/grid appears only while bc is unset; any bc, including a light one from a template, wins in 3D too and leaves the starfield in front of a bright wall. For a dark 3D background pass bc: [0,0,0] explicitly. Redrawing is asynchronous, wait ~2 s before a screenshot. USER DATA: wud shows the data fields of an item as rows of its table (0 or 1). udf and udt declare the data fields and the item types of THIS database and are arrays of objects, laid over the built-in catalogue; the same key replaces, a new one is added. A field is {key, type: date|text|number|choice|flag, label, and depending on the type time, decimals, options, optionLabels}; a type is {key, label, fields: [field keys], timeline: [{start, end, shape}]}. Read the merged result with kbb_get_userdata_schema. Names may hold letters, digits and underscore only; a declaration that does not pass is dropped, not stored wrongly.", + "description": "Key-value pairs of diagram properties, e.g. {\"bp\":\"nebula\"} or {\"bc\":[14,22,40]}. Every key is written through and the diagram is redrawn, so keys missing from this list still work. Known keys: ba bc bp bp3d bpi bpi3d bpin bpin3d c1 c2 c3 c4 col dce hrl ia ico ics iex irc lw mi ml mri sdrao swm to3d tv wcl wtr wud udf udt. col controls the automatic colouring of nodes that have no colour set: 0 = item-wise, 1 = level-wise, 2 = parent-wise (default), 3 = category-wise; a category's colour and a node's own colour are drawn in every mode. For tv use kbb_set_display_mode. BACKGROUND: bp is the pattern of the 2D view only (none, perspective, checkered-paper, blueprint, polka-dots, cross-stitch, honeycomb, edge-circles, triangles, phyllotaxis-full, nebula, image-from-root, image-from-repository); bp3d is the separate pattern of the 3D view (none, starfield, grid, image-from-root, image-from-repository, default starfield). bc is the background COLOUR and is shared by both views — there is no bc3d. The dark night sky behind starfield/grid appears only while bc is unset; any bc, including a light one from a template, wins in 3D too and leaves the starfield in front of a bright wall. For a dark 3D background pass bc: [0,0,0] explicitly. Redrawing is asynchronous, wait ~2 s before a screenshot. USER DATA: wud shows the data fields of an item as rows of its table (0 or 1). udf and udt declare the data fields and the item types of THIS database and are arrays of objects, laid over the built-in catalogue; the same key replaces, a new one is added. A field is {key, type: date|text|number|choice|flag, label, and depending on the type time, decimals, options, optionLabels}; a type is {key, label, fields: [field keys], timeline: [{start, end, shape}]}. Read the merged result with kbb_get_userdata_schema. Names may hold letters, digits and underscore only; a declaration that does not pass is dropped, not stored wrongly.", "type": "object" }, "undoLabel": {
--- pinned/kbb_set_style +++ observed/kbb_set_style { - "description": "Sets color, text color, shape, or icon for one or more nodes, and line color, line style, line width or arrows for one or more connections. Give itemIds, relationIds, or both. Per-item colours are only drawn when the colouring mode is item-wise - if it is not, the answer carries a warning telling you to call kbb_set_diagram({properties:{col:0}}) first. Nodes and connections must be drawn; navigate there with kbb_focus_node first. Labels and the 'as table' switch of a connection belong to kbb_update_relation.", + "description": "Sets color, text color, shape, or icon for one or more nodes, and line color, line style, line width or arrows for one or more connections. Give itemIds, relationIds, or both. The style is written to the node itself, but a node that belongs to a category is drawn with its category's style only - for such nodes the style is stored but not visible, and the answer carries a warning plus the list 'categorized'. Style those through kbb_update_category (applies to every node of the category) or remove them from their category first. The colouring mode (col) does not matter here; it only colours nodes that have no colour set. Nodes and connections must be drawn; navigate there with kbb_focus_node first. Labels and the 'as table' switch of a connection belong to kbb_update_relation.", "execution": { "taskSupport": "forbidden" },
--- pinned/kbb_timeline +++ observed/kbb_timeline { - "description": "Shows, hides and steers the timeline strip below the diagram. The strip is a navigation aid like the search field: it stays open across a change of the root item and of the database, and a click on one of its entries makes that node the centre of the diagram. 'fit' scales the visible period to the data, 'range' sets it explicitly, 'state' only reports. Without a field of its own the strip draws every date field the types of the database declare, which is how it starts; naming a 'field' pins it to that one, and 'field': null hands it back to that automatic choice. The answer says which of the two is in force under 'autoFields' and lists the fields actually queried under 'fields'.", + "description": "Shows, hides and steers the timeline strip below the diagram. The strip starts closed unless a saved view of the database opens it; it then stays open across a change of the root item, but a change of the database closes it again and the new database decides anew. A click on one of its entries makes that node the centre of the diagram. 'fit' scales the visible period to the data, 'range' sets it explicitly, 'state' only reports. Without a field of its own the strip draws every date field the types of the database declare, which is how it starts; naming a 'field' pins it to that one, and 'field': null hands it back to that automatic choice. The answer says which of the two is in force under 'autoFields' and lists the fields actually queried under 'fields'.", "execution": { "taskSupport": "forbidden" },
Changed 2026-10-05 14:34 UTC
3 schema or annotation changes with the description left byte-identical, 8 tools added.
+ tool added: kbb_find_by_date
+ tool added: kbb_fit_view
+ tool added: kbb_get_camera_3d
+ tool added: kbb_get_dates
+ tool added: kbb_get_userdata_schema
+ tool added: kbb_measure_view
+ tool added: kbb_set_dates
--- pinned/kbb_set_diagram +++ observed/kbb_set_diagram { "description": "Sets diagram visual properties (background, palette colors, line width, etc.). For layout and display mode, use the dedicated tools kbb_set_layout / kbb_set_display_mode.", "execution": { - "items": { - "type": "number" - }, + "items": {}, "type": "array" } ] - "description": "Key-value pairs of diagram properties, e.g. {\"ba\":\"#101010\"} or {\"bc\":[14,22,40]}. Known keys: ba bc c1 c2 c3 c4 col dce hrl ia ico ics iex irc lw mi ml mri sdrao swm to3d tv wcl wtr. The diagram is redrawn, so iex/dce/wcl/wtr and friends take effect immediately. col controls colouring: 0 = item-wise (required for per-item colours from kbb_set_style), 1 = level-wise, 2 = parent-wise (default), 3 = category-wise. For tv use kbb_set_display_mode.", + "description": "Key-value pairs of diagram properties, e.g. {\"bp\":\"nebula\"} or {\"bc\":[14,22,40]}. Every key is written through and the diagram is redrawn, so keys missing from this list still work. Known keys: ba bc bp bp3d bpi bpi3d bpin bpin3d c1 c2 c3 c4 col dce hrl ia ico ics iex irc lw mi ml mri sdrao swm to3d tv wcl wtr wud udf udt. col controls colouring: 0 = item-wise (required for per-item colours from kbb_set_style), 1 = level-wise, 2 = parent-wise (default), 3 = category-wise. For tv use kbb_set_display_mode. BACKGROUND: bp is the pattern of the 2D view only (none, perspective, checkered-paper, blueprint, polka-dots, cross-stitch, honeycomb, edge-circles, triangles, phyllotaxis-full, nebula, image-from-root, image-from-repository); bp3d is the separate pattern of the 3D view (none, starfield, grid, image-from-root, image-from-repository, default starfield). bc is the background COLOUR and is shared by both views — there is no bc3d. The dark night sky behind starfield/grid appears only while bc is unset; any bc, including a light one from a template, wins in 3D too and leaves the starfield in front of a bright wall. For a dark 3D background pass bc: [0,0,0] explicitly. Redrawing is asynchronous, wait ~2 s before a screenshot. USER DATA: wud shows the data fields of an item as rows of its table (0 or 1). udf and udt declare the data fields and the item types of THIS database and are arrays of objects, laid over the built-in catalogue; the same key replaces, a new one is added. A field is {key, type: date|text|number|choice|flag, label, and depending on the type time, decimals, options, optionLabels}; a type is {key, label, fields: [field keys], timeline: [{start, end, shape}]}. Read the merged result with kbb_get_userdata_schema. Names may hold letters, digits and underscore only; a declaration that does not pass is dropped, not stored wrongly.", "type": "object" }, "undoLabel": {
--- pinned/kbb_set_view_options +++ observed/kbb_set_view_options { "description": "Sets the switches of the \"Adjust view\" gallery by ABSOLUTE value, not by toggling — so a call is repeatable and needs no prior DOM read. Omitted options stay as they are; the answer always reports the state of every option afterwards. These are the switches of the diagram and label sections; zoom, stretch, rotation and perspective are sliders and belong to kbb_adjust_view, and the layout belongs to kbb_set_layout. The diagram switches are stored as diagram properties and survive a reload; the label switches are part of the session, exactly as when clicked by hand.", "execution": { + }, + "userData": { + "description": "Show the data fields of an item as rows of its table ('wud'). The values come from the item's user data; which fields exist is kbb_get_userdata_schema. Off by default.", + "type": "boolean" } }, "type": "object"
--- pinned/kbb_show_callout +++ observed/kbb_show_callout { "description": "Shows an explanatory callout box that points at a control or a diagram node, the way a manual annotates a screenshot. Several callouts can be open at once; each has an id and can be closed on its own. The box follows its target while the diagram is zoomed, panned or redrawn. Styles: 'card' (light manual card with a leader line), 'bubble' (speech bubble with a tail at the target), 'spotlight' (dims the app and cuts the targets out), 'glass' (dark translucent, fits dark diagrams), 'pins' (numbered pin at the target, text in a shared legend on the right — best when annotating many things at once). Every part of the look can be overridden per call — scale for the whole box at once, or fontSize, titleFontSize, backgroundColor, textColor, boxShadow, padding and friends one by one; what is left out keeps the style default. The target must be visible; navigate there with kbb_focus_node or open the relevant panel first. For a picture that carries several annotations pass them all in 'callouts' — one call instead of one per box.", "execution": { - "$ref": "#/properties/callouts/items/properties/backgroundColor" + "description": "Background of the box, any CSS color, e.g. '#FFFFFF' or 'rgba(17,24,34,0.9)'.", + "type": "string" }, "borderRadius": { - "$ref": "#/properties/callouts/items/properties/borderRadius" + "description": "Corner radius in pixels.", + "type": "number" }, "boxPoint": { - "$ref": "#/properties/callouts/items/properties/boxPoint" + "description": "Viewport [x, y] the box itself is pinned to, instead of letting it float beside the target — for recordings in which the text always sits in the same corner. The leader line still runs to the target.", + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" }, "boxShadow": { - "$ref": "#/properties/callouts/items/properties/boxShadow" + "description": "Own drop shadow, e.g. '0 16px 40px rgba(0,0,0,0.5)'. Replaces the style's shadow.", + "type": "string" }, "buttons": { - "$ref": "#/properties/callouts/items/properties/buttons" + "description": "'spotlight': buttons in the footer. Clicking one closes the callout.", + "items": { + "additionalProperties": false, + "properties": { + "label": { + "description": "Button caption.", + "type": "string" + }, + "primary": { + "description": "Render as the filled primary button.", + "type": "boolean" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" }, "callouts": { "description": "Several callouts in ONE call, shown in order — one round trip instead of one per box, which is what makes a picture with five annotations affordable. Each entry takes the same fields as the single form; action, being about the call and not about a box, stays outside. Given alongside a single callout with a target of its own, that one is shown first. The answer lists the ids in order; a box whose target is not visible is reported under 'failed', and the rest are still shown.", - "$ref": "#/properties/callouts/items/properties/closable" + "description": "Show the close cross. Default true.", + "type": "boolean" }, "color": { - "$ref": "#/properties/callouts/items/properties/color" + "description": "Accent color. Convention: blue = controls and modes, orange = interactions and editing, green = results and confirmations, purple = delete and close, red = warnings. Default 'blue'.", + "enum": [ + "blue", + "orange", + "green", + "purple", + "red" + ], + "type": "string" }, "distance": { - "$ref": "#/properties/callouts/items/properties/distance" + "description": "Gap between target and box in pixels. Default 76 (18 for 'bubble').", + "type": "number" }, "fontFamily": { - "$ref": "#/properties/callouts/items/properties/fontFamily" + "description": "Font family of the box, e.g. 'Segoe UI, Arial, sans-serif'.", + "type": "string" }, "fontSize": { - "$ref": "#/properties/callouts/items/properties/fontSize" + "description": "Body text size in pixels. Style default for 'card' is 22.", + "type": "number" }, "id": { - "$ref": "#/properties/callouts/items/properties/id" + "description": "Callout id. Required for 'hide'; on 'show' it replaces a callout of the same id. Generated when omitted.", + "type": "string" }, "itemId": { - "$ref": "#/properties/callouts/items/properties/itemId" + "description": "Id of the diagram node to point at.", + "type": "integer" }, "itemName": { - "$ref": "#/properties/callouts/items/properties/itemName" + "description": "Name of the diagram node to point at (first match).", + "type": "string" }, "kicker": { - "$ref": "#/properties/callouts/items/properties/kicker" + "description": "Small uppercase label above the title ('card' and 'spotlight'), e.g. the area of the UI.", + "type": "string" }, "kickerFontSize": { - "$ref": "#/properties/callouts/items/properties/kickerFontSize" + "description": "Size of the uppercase kicker in pixels.", + "type": "number" }, "legendHeadline": { - "$ref": "#/properties/callouts/items/properties/legendHeadline" + "description": "'pins': headline of the legend panel.", + "type": "string" }, "number": { - "$ref": "#/properties/callouts/items/properties/number" + "description": "Number in the badge or pin. Counted up automatically when omitted.", + "type": "integer" }, "opacity": { - "$ref": "#/properties/callouts/items/properties/opacity" + "description": "Opacity of the whole box, 0 to 1.", + "maximum": 1, + "minimum": 0, + "type": "number" }, "padding": { - "$ref": "#/properties/callouts/items/properties/padding" + "description": "Inner spacing as a CSS shorthand, e.g. '24px 28px 26px 36px'.", + "type": "string" }, "placement": { - "$ref": "#/properties/callouts/items/properties/placement" + "description": "Preferred side of the target. Default 'auto', which picks the side with the most room.", + "enum": [ + "auto", + "left", + "right", + "top", + "bottom" + ], + "type": "string" }, "point": { - "$ref": "#/properties/callouts/items/properties/point" + "description": "Viewport [x, y] of the target — the same as x plus y, as one pair.", + "items": { + "type": "number" + }, + "maxItems": 2, + "minItems": 2, + "type": "array" }, "scale": { - "$ref": "#/properties/callouts/items/properties/scale" + "description": "One knob for the whole box: multiplies every default — width, padding, corner radius, font sizes, number badge. 1.6 to 2.0 makes a callout readable in a portrait phone video, 0.6 gives the compact card of a desktop screenshot. Default 1.", + "type": "number" }, "step": { - "$ref": "#/properties/callouts/items/properties/step" + "description": "'spotlight': which step is the current one, starting at 1.", + "type": "integer" }, "steps": { - "$ref": "#/properties/callouts/items/properties/steps" + "description": "'spotlight': number of dots in the step bar.", + "type": "integer" }, "style": { - "$ref": "#/properties/callouts/items/properties/style" + "description": "Visual style. Default 'card'.", + "enum": [ + "card", + "bubble", + "spotlight", + "glass", + "pins" + ], + "type": "string" }, "tag": { - "$ref": "#/properties/callouts/items/properties/tag" + "description": "Small tinted chip under the text ('glass'), e.g. the macro or shortcut behind the command.", + "type": "string" }, "targetSelector": { - "$ref": "#/properties/callouts/items/properties/targetSelector" + "description": "CSS selector of the control to point at, e.g. '.id-viewmode' — resolved inside the widget first.", + "type": "string" }, "text": { - "$ref": "#/properties/callouts/items/properties/text" + "description": "Body text. Inline HTML such as <b> is allowed.", + "type": "string" }, "textColor": { - "$ref": "#/properties/callouts/items/properties/textColor" + "description": "Body text color. The headline and the close cross follow it unless titleColor is set.", + "type": "string" }, "title": { - "$ref": "#/properties/callouts/items/properties/title" + "description": "Headline of the callout. Inline HTML is allowed.", + "type": "string" }, "titleColor": { - "$ref": "#/properties/callouts/items/properties/titleColor" + "description": "Headline color, when it should differ from textColor.", + "type": "string" }, "titleFontSize": { - "$ref": "#/properties/callouts/items/properties/titleFontSize" + "description": "Headline size in pixels. Style default for 'card' is 28.", + "type": "number" }, "width": { - "$ref": "#/properties/callouts/items/properties/width" + "description": "Box width in pixels. Default depends on the style.", + "type": "number" }, "x": { - "$ref": "#/properties/callouts/items/properties/x" + "description": "Viewport x of the target, when it is neither a control nor a node.", + "type": "number" }, "y": { - "$ref": "#/properties/callouts/items/properties/y" + "description": "Viewport y of the target.", + "type": "number" } }, "type": "object"
+ tool added: kbb_timeline
Changed 2026-09-04 10:39 UTC
1 description rewritten.
--- pinned/kbb_import_attachment +++ observed/kbb_import_attachment { - "description": "Puts a NEW file into the attachment repository and, when attachToItemId is given, links it to a node or connection in the same undo step. The file travels as a data URI, so it works on every platform — no drag and drop, no file dialog. Images are shown in the document view straight away; for a document (PDF, Office, text) add a previewDataUri, otherwise the entry has no thumbnail, and pass its extracted text as 'text' so the full-text search finds it. With updateExisting an entry of the same uri (or the same name and type) is overwritten instead of duplicated, and every existing link to it survives. Attention: the whole file passes through the conversation as base64 — keep it small, a few megabytes at most.", + "description": "Puts a NEW file into the attachment repository and, when attachToItemId is given, links it to a node or connection in the same undo step. There are two ways in. PREFERRED: filePath — the relay reads the file from the local disk, so nothing travels through the conversation, and it fills in the full text and the thumbnail itself using whatever extractors the machine already has (built in for txt/md/csv/json/xml/html/rtf/docx/xlsx/pptx/odt/ods/odp; pdftotext, pdfjs-dist or pdf-parse for PDF text; pdftoppm, pdftocairo, magick or ghostscript for the page image; LibreOffice for the old binary Office formats). It never installs anything — a missing extractor simply means that step is skipped and the answer says so. FALLBACK: dataUri, for a file the relay cannot reach; then the whole file passes as base64 — keep it to a few megabytes at most. Anything you pass yourself (text, previewDataUri, previewFilePath, name, description) always wins over what the relay extracts. Images need no preview: the app makes its own. With updateExisting an entry of the same uri (or the same name and type) is overwritten instead of duplicated, and every existing link to it survives. dryRun reports what the relay read and what it would import without changing anything — that is also the way to see which extractors this machine has.", "execution": { "taskSupport": "forbidden" }, - "description": "The file itself as a data URI, e.g. \"data:application/pdf;base64,JVBERi0…\".", + "description": "The file itself as a data URI, e.g. \"data:application/pdf;base64,JVBERi0…\". Only needed when the relay cannot read the file from disk; then fileName is required.", "type": "string" }, "description": { + "extractPreview": { + "description": "Let the relay render a thumbnail for documents. Default true; switch it off to keep the payload small or to skip a slow LibreOffice conversion.", + "type": "boolean" + }, + "extractText": { + "description": "Let the relay extract the text. Default true, unless 'text' is given.", + "type": "boolean" + }, "fileName": { - "description": "File name including the extension, e.g. \"Handbuch.pdf\". The extension becomes the entry type, the part before it the entry name unless 'name' says otherwise.", + "description": "File name including the extension, e.g. \"Handbuch.pdf\". The extension becomes the entry type, the part before it the entry name unless 'name' says otherwise. With filePath it defaults to the name on disk.", "type": "string" }, + "filePath": { + "description": "Path of the file on the machine the relay runs on. The relay reads it itself and derives fileName, MIME type, text and thumbnail. Preferred over dataUri.", + "type": "string" + }, "isRelation": { "description": "attachToItemId denotes a connection. Default false.", "type": "boolean" + "maxTextChars": { + "description": "Upper bound for the extracted text. Default 100000, as in generate_metadata.py.", + "maximum": 1000000, + "minimum": 1000, + "type": "integer" + }, "name": { "description": "Entry name. Default: the file name without its extension.", "type": "string" - "description": "Thumbnail as a data URI, \"data:image/png;base64,…\". Required for anything that is not an image, otherwise the entry stays without a preview.", + "description": "Thumbnail as a data URI, \"data:image/png;base64,…\". Only needed when the relay cannot render one itself; for images the app makes its own.", "type": "string" }, + "previewFilePath": { + "description": "Thumbnail as a local image file, read by the relay. Wins over its own rendering.", + "type": "string" + }, "text": { - "description": "Text content of the file, so the full-text search reaches it.", + "description": "Text content of the file, so the full-text search reaches it. Leave it out to let the relay extract the text itself.", "type": "string" }, "undoLabel": { - "required": [ - "fileName", - "dataUri" - ], "type": "object" }, "name": "kbb_import_attachment",
Current tools
Show all 79 tool fingerprints
Watch this server yourself
If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.
npx -y mcp-pin@0.2.3 -- <your kbb-mcp-relay command>
Or subscribe to this page's RSS feed to be told when it changes.
Badge
The badge states one fact about time and nothing else. It never claims a server is safe.
[](https://mcp-pin.gautamkhosla.com/servers/b7239b1df5dc4f57.html)