Kybase
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
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_notesA | List notes, sorted by recency (newest first). Optional filters: folder_id, tag, created_after/created_before, updated_after/updated_before, limit (max 200). created_after answers "what is new" — a note's creation date never changes after it is made. updated_after answers "what changed since I was last here" — it moves only when this note's own title/content/folder/tags were actually edited, NOT when renaming some other note rewrote a [[link]] to it in passing (that still touches updated_at, returned separately, but not this filter/sort). They are NOT interchangeable: a note edited today but created months ago matches updated_after, not created_after. sort picks which of the two dates drives the ordering (default "updated"). Each note carries content_length (characters in the full note) so you can tell a long note from a short one before spending a get_note call on it. Pass trashed:true to see soft-deleted notes instead (recoverable with restore_note until they age out of the trash) — other filters are ignored in that mode. |
| get_noteA | Get full note content by id or title. Title matching is case-insensitive and forgiving: an exact match wins, otherwise it falls back to prefix then substring, so a unique partial title resolves. An ambiguous title returns the candidate list (id + title) to retry with. Large notes are windowed: content is capped at 20000 chars by default (see limit/offset) — check content_truncated and content_total_length in the response, and pass next_offset back as |
| create_noteA | Create a new note. Embedding is generated automatically in the background. The server instructions' wikilink and tag rules apply: search_notes for the topic first and link the related notes it finds, and call list_tags before coining a new tag. |
| update_noteA | Update note fields. Re-embeds if title or content changed. Updates wikilinks if title changed. The server instructions' wikilink and tag rules apply when substantially rewriting — in particular, call list_tags before coining a new tag. Pass expected_updated_at (the updated_at you read) to be refused instead of overwriting a change made in between. |
| append_to_noteA | Add text to a note without resending the rest — prefer it over update_note for journals, logs and running lists. A blank line separates your text from what was there. Re-embeds in the background like any content change. |
| replace_in_noteA | Replace exact text in a note without resending the rest. Refuses unless find occurs exactly expected_count times (default 1) — protects against a loose find rewriting more than intended. Accepts either find/replace or old_string/new_string (same pair, either naming works). For several replacements in one note, pass |
| delete_noteA | Soft-delete a note by id — it disappears from list_notes/search/get_note/the graph, but is recoverable with restore_note for 30 days before being purged for good. Use list_notes with trashed:true to see what's currently in the trash. |
| restore_noteA | Undo delete_note: brings a soft-deleted note back. Errors if the note isn't in the trash (never deleted, already restored, or purged past the retention window), or if a live note has since taken the same title (rename one of them first, then retry). |
| search_notesA | Search notes. type: "text" (fast), "semantic" (meaning-based), "hybrid" (best, uses RRF). Hybrid is the right default; prefer type=text for exact identifiers, code fragments, or quoted phrases, where FTS beats meaning-matching. Returns short excerpts, not full notes — call get_note on the top 1-2 hits to read them. A query is required, because this ranks text against text: to list or filter notes by folder, tag or recency with no keywords, use list_notes instead. A hit in a long note may carry Read the SECTION, not the note. When a hit carries This is candidate retrieval, not a factual answer, and the search does NOT decide for you whether the vault knows something. Semantic search returns the nearest passages it has; by default nothing is filtered out for being too dissimilar, so an EMPTY result means the index returned nothing at all — and a NON-empty one is not evidence that what you asked about is in there. (An owner may configure a minimum similarity; So a hit found ONLY by the semantic arm (
|
| indexing_statusA | Semantic-index progress: total/indexed/pending notes, complete=true when pending=0. Pending notes are still found by text search; notes with previous embeddings remain in semantic search with their last vector, while notes never embedded are excluded from semantic/hybrid until processed (automatic, background). Stuck pending count while nothing is being edited = check Ollama/server logs. Also names the active embedding model and says whether any automatic semantic cutoff is in force. By default there is none: semantic_profile reads "none" and semantic_min_similarity is null, meaning semantic search returns its nearest matches and refuses nothing on its own. Automatic abstention is deliberately not part of the default retrieval contract — a shipped per-model cutoff was measured and withdrawn, because it cost real answers (cross-language matches share no words, so nothing else finds them) without reliably stopping confident near-misses. An owner who has measured their own corpus can set one; then semantic_profile reads "configured" and the number is theirs. Raw cosines are NOT comparable between models: a number that means a good match on one means noise on another, which is why the model is named here rather than left to be inferred from the score. |
| list_tagsA | List tags in use with the number of notes carrying each, most-used first, capped at |
| list_foldersA | List all folders (flat array) with the full path already resolved — no need to walk parent_id yourself. Pass a folder's own id as parent_id to create_folder/update_folder to nest under it. |
| create_folderB | Create a new folder. Optionally nested under a parent. |
| update_folderA | Rename a folder and/or move it under a different parent (set parent_id to null for top level). Provide at least one of name/parent_id. The response includes the resolved |
| delete_folderA | Delete a folder and its full subtree of child folders (cascade). Every note inside — including notes in nested subfolders — is soft-deleted into the trash along with it (see delete_note), recoverable via restore_note within the retention window. To preserve organization instead, move notes/subfolders out first. |
| get_backlinksA | Get notes that link to the given note via [[Title]] wikilinks. By default returns id/title/folder_path plus a short snippet around the link occurrence, not full content — pass include_content:true for the full text of each (expensive if many notes link here; prefer the default and call get_note on specific ids instead). Paginated like get_note. Takes id or title, like get_note — title resolves the same forgiving way (exact, then prefix, then substring). |
| get_neighborsA | What is around ONE note in the [[wikilink]] graph, out to depth hops. Answers "what is this connected to" with a flat list of titles — no node indices to decode, no whole-vault payload. For the shape of that neighbourhood — which notes link to each other, not just which are near — use get_graph with root_title and depth instead; it scopes the same way and keeps the edges. Traversal is undirected: a note linking HERE is a neighbour just as much as one linked FROM here, because "what is this connected to" means both. These are LINKS people wrote, not similarity — a note about the same subject that nobody linked is not here. get_graph's semantic_edges cover that, and search covers finding it at all. An empty result means nothing links to or from this note, which is a fact about the writing, not about the topic. |
| get_graphA | Get the knowledge graph: note nodes, directed edges from [[wikilinks]], and undirected semantic_edges (embedding cosine similarity) between related notes that may lack explicit links. Nodes are |
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 18 tools
Most tools are clearly distinct (get_note vs list_notes vs search_notes; create/update/delete/restore_note; folder operations). The only mild overlap is get_neighbors vs get_graph, but their descriptions explicitly differentiate scope and output shape, so an agent can choose correctly.
All tools follow a consistent verb_noun pattern: get_note, list_notes, create_note, update_note, delete_note, restore_note, search_notes, list_folders, create_folder, update_folder, delete_folder, get_graph, get_backlinks, get_neighbors, append_to_note, replace_in_note, indexing_status, list_tags. No mixed conventions or vague verbs.
18 tools is on the higher end but appropriate for a knowledge-management server covering notes, folders, search, graph, and indexing. Each tool earns its place; the count is justified by the domain breadth.
The surface covers the full note lifecycle (create, read, update, append, replace, delete, restore), folder management, search (text/semantic/hybrid), graph traversal, backlinks, tags, and indexing status. No obvious dead ends: every write has a corresponding read, and soft-delete has restore.