everkeep
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| EVERKEEP_TOKEN | No | The secret token used as the only key for authentication (Bearer header or `private_<token>` path). Set with the flag `--token-file` or the environment variable `EVERKEEP_TOKEN`. Default: a token generated into `<state_dir>/token` on first start. | |
| EVERKEEP_VAULT | Yes | The directory tree (the vault) that Everkeep's tools work on. Set with the flag `--vault` or the environment variable `EVERKEEP_VAULT`. There is no default; it is required. | |
| EVERKEEP_STATE_DIR | No | The directory where Everkeep keeps its state (token, document cache); must be outside the vault. Set with the environment variable `EVERKEEP_STATE_DIR`. Default is `~/.local/state/everkeep`. |
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": false
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| grep_filesA | Search file CONTENTS by regex, recursively. Per file returns path, rev, line count, then matching line numbers with their text. Long lines are clipped around the match (max_line_length, default 200). Line numbers and rev feed straight into read_text_file offset/limit and edit_file line edits. Documents (PDF, Word, spreadsheets…) are searched in their extracted text: matches as L (p.N / slide N / sheet Name), no rev; documents:false skips them. Other binaries and symlinks are skipped; output is capped and flags truncation when incomplete. To find files by name use search_files. |
| read_text_fileA | Read one file. Whole file by default; head/tail = N lines from an edge; offset/limit = an arbitrary 1-based line range, which also reports total lines and rev (needed for edit_file line edits). Documents (PDF, DOCX, XLSX, PPTX, ODF, EPUB, MSG…) come as numbered lines with section markers, no rev, read-only; HTML, RTF, EML and FB2 read raw, extract:true gives their text. Several files at once: read_multiple_files; images and page images: read_media_file / read_pdf_page. |
| read_fileB | DEPRECATED alias of read_text_file. |
| read_media_fileA | Read an image, audio or PDF file. PDF returns one page (default 1, or "#N" path suffix) as JPEG plus the total page count. For PDF text use read_pdf_text; one PDF page as an image: read_pdf_page. |
| read_pdf_pageA | Render one PDF page (1-based) as JPEG. Prefer read_pdf_text unless layout or graphics matter. |
| read_pdf_textA | Text of a PDF, whole or a page range, as numbered lines with page markers (the same numbers as read_text_file). Much cheaper than page images — prefer it; for scans use read_pdf_page. |
| sqlite_schemaA | Inspect a SQLite database file: schema-neutral, no interpretation of the data. File type is decided by the first 16 bytes, not the extension. Returns table/index/view/trigger DDL from sqlite_master, the journal_mode/page_size/page_count/encoding/user_version/application_id PRAGMAs, the sqlite3 version, whether -wal/-shm siblings exist next to the ORIGINAL file, plus path/size/mtime (UTC and local with numeric offset). A database with no journal (or an empty leftover one) is opened in place and leaves no new files behind; one with a real -wal is read from a private copy instead, cleaned up after the call — wal_copy/wal_copy_ms in the response say whether that happened and how long it took. Either way nothing is ever left next to the original. counts=true adds COUNT(*) per table, off by default — it is a full scan and can take minutes on a large database. counts_timeout_ms is a PER-TABLE budget covering the whole call (spawning sqlite3 and opening the file, not just the COUNT itself) — on a large database file a very small budget can time out even a tiny table. A table that does not finish is null in counts; every such table is listed in counts_incomplete.tables with one shared counts_incomplete.note, not a message repeated per table. The rest of the schema is always returned in full. Call once without counts first, then again with counts only if row counts are actually needed — the DDL comes back in full either way, so a second call re-sends everything already read, which matters on a database with a hundred tables. |
| sqlite_queryA | Run one read-only SQL statement on a SQLite file (sqlite3 -readonly -safe -json; ATTACH and other escapes are disabled). Must start with SELECT, WITH, VALUES, or EXPLAIN [QUERY PLAN] followed by one of those. Runs wrapped as SELECT * FROM () LIMIT <limit+1>; truncated=true means more rows exist. ";" is allowed only inside string literals, quoted identifiers and comments, plus one trailing. Bind parameters (?, :x, @x, $x, #x) are rejected — write values as literals. EXPLAIN describes the wrapped statement. BLOBs are not converted — use hex(col) or length(col). A database with a -wal journal is read from a temporary copy (wal_copy in the response). |
| read_multiple_filesA | Read several whole files at once (documents as numbered lines, as read_text_file; the trash is skipped). For a line range or rev use read_text_file. |
| write_fileA | Create or overwrite a file with given content. In a zone with policy overwrite="rev", overwriting an EXISTING file requires its current rev (creating a new one does not); the refusal message carries the rev to use. For a change inside a file use edit_file. Document formats (PDF, DOCX…) are not overwritten. |
| edit_fileA | Edit a file. Two mutually exclusive edit shapes: {oldText,newText} literal replacement, or line edits (1-based). {startLine,endLine,newText} replaces the inclusive range; newText "" deletes, no trailing newline. Omitting endLine INSERTS before startLine instead of replacing, and startLine = lines+1 appends at EOF. Line edits require rev and are applied bottom-up in one atomic pass, so numbers from a single grep/read stay valid; a stale rev is rejected, never applied. Returns the new rev. dryRun shows the diff. In a zone with policy overwrite="rev" every edit needs rev, including {oldText}; in overwrite="never" zones editing is refused outright. To replace a whole file use write_file. Document formats are read-only. |
| create_directoryA | Create a directory (and parents); an existing one is not an error. Refused where the zone policy forbids writing. |
| list_directoryA | List one directory; the first line is the policy in force. Sizes: list_directory_with_sizes; deeper levels: directory_tree. |
| list_directory_with_sizesA | List a directory with file sizes, sorted by name or size. Without sizes: list_directory. |
| directory_treeA | Recursive tree view, 2 levels deep. One level: list_directory. |
| move_fileA | Move or rename a file or directory. Taking a file out of a zone with policy overwrite="rev" requires its current rev, exactly like overwriting it in place; directories are not moved out of a strict zone at all. Use trash_file, not this, to discard something; moving a file out of the trash restores it. |
| trash_fileA | Discard a file by moving it into the trash of its own zone, keeping its relative path and adding an arrival timestamp to the name. There is no delete: this is the only way to remove something. Fails if the zone has no trash configured. In a zone with overwrite="rev" the current rev is required — you have to read a file before throwing it away. To restore, move_file it back out of the trash. |
| search_filesA | Find files by NAME substring, recursively. For content use grep_files. |
| get_file_infoA | Metadata for a file or directory: size, times, format, plus line count and rev for text files (the rev that writes in a strict zone ask for). Content: read_text_file. |
| list_allowed_directoriesA | The vault root; every path must be inside it. Start here if the vault path is unknown. |
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 20 tools
Most tools have clearly distinct purposes (grep vs search, read vs write vs edit, PDF text vs PDF image). The read family is large (read_text_file, read_file deprecated alias, read_multiple_files, read_media_file, read_pdf_page, read_pdf_text), but descriptions give strong routing guidance to avoid misselection.
Names are overwhelmingly consistent snake_case verb_noun (read_text_file, write_file, edit_file, move_file, trash_file, search_files, grep_files, create_directory). Minor deviations exist: the deprecated read_file alias, noun-first names like directory_tree, sqlite_schema, sqlite_query, and slight variance in list_* patterns.
Twenty tools is on the heavy side for a file-vault server and sits in the 16-25 'heavy' band. Specialized document/PDF/SQLite tools are justified, but the deprecated read_file alias and multiple overlapping read variants make the set larger than strictly needed.
Core lifecycle is well covered: list/search, read, write, edit, move, trash (delete equivalent), directory creation, metadata, plus document and SQLite inspection. Minor gaps remain—no copy operation and no explicit way to trash or remove a directory, only to move it.