Query Markup Documents - On-device hybrid search for markdown files with BM25, vector search, and LLM reranking
BrainLLM is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
BrainLLM gives MCP clients persistent, graph-structured memory in a self-hosted TriliumNext instance. Five areas hold the user, the assistant, memory, knowledge and insights. The model supplies content; the server owns placement, labels, dates and lifecycle.
Preview targeted edits without writing. Move queued work destination-first, with revision safeguards and recoverable progress. The session close gate checks the required review and diary calls.
Setup: run TriliumNext and configure TRILIUM_BASE_URL plus TRILIUM_ETAPI_TOKEN. TRILIUM_PASSWORD is an alternative to the ETAPI token. Start with the setup guide: https://miisodev.github.io/BrainLLM/connect.html
The default core mode exposes 45 brain-aware tools. Full mode adds 33 raw ETAPI tools. MIT licensed and free; you operate the server and keep your notes in Trilium. Source and skill downloads: https://github.com/miisodev/BrainLLM
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --env 'TRILIUM_BASE_URL=${TRILIUM_BASE_URL}' --transport stdio brainllm-mcp '--' npx -y brainllm
# 2 — ask your agent for something these tools do
# BrainLLM, master, master_recall and 76 more
It needs TRILIUM_BASE_URL: this reads it from your environment, so export it first.
BrainLLM costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts BrainLLM as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. Claude Code reads TRILIUM_BASE_URL (Base URL of the TriliumNext instance, e.g. http://localhost:8080) from your environment each time it starts the server, so the value stays out of its config: export it in your shell profile (macOS, Linux), or run setx TRILIUM_BASE_URL … and open a new terminal (Windows). The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user --env 'TRILIUM_BASE_URL=${TRILIUM_BASE_URL}' --transport stdio brainllm-mcp '--' npx -y brainllmReconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs settings only you can give it: TRILIUM_BASE_URL — Base URL of the TriliumNext instance, e.g. http://localhost:8080. You set it in your own client’s config, on your machine — this marketplace never holds it.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
79 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
Self-hosted memory for LLMs in TriliumNext, structured by the server and editable by you.
No parameter schema on file.
Read a master singleton — biography, goals or preferences — with its id and relations. section="<heading>" reads one section.
No parameter schema on file.
Skim all three Master singletons — the opening lines of biography, goals, and preferences (with ids and relation snippets).
No parameter schema on file.
Read an LLM singleton — responsibilities, protocols or selfcorrection — or a diary entry by id (block="14:05" or "-1" reads one of its addendum blocks). Self-correction holds general rules learned from mistakes; read it before work that has gone wrong before (audits, large edits, completeness…
No parameter schema on file.
Skim the LLM surface: responsibilities, protocols & self-correction opening lines (with relation snippets), plus recent diary entries.
No parameter schema on file.
Read a Memory note by id — a thread or a session. A dated thread returns its Context and Resolution plus an index of its [yyyy-mm-dd] children (newest first: the latest 30, fewer if their index passes ~24k characters, unless limit= says otherwise; with the total count), each listed by its addendum…
No parameter schema on file.
Skim Memory: active threads and recent sessions (ids + previews). An optional query filters threads by title.
No parameter schema on file.
Read a knowledge note by id — user knowledge, a domain information note or a Sources note. section="<heading>" reads one section (outline() lists them); use it on anything large.
No parameter schema on file.
Skim Knowledge. With a domain: that domain's Sources + information notes. Without: user-knowledge notes plus the list of domains.
No parameter schema on file.
Read the BrainLLM's change log for a day (default: today). Format: YYYY-MM-DD. section="<heading>" reads one section instead of the whole log.
No parameter schema on file.
Skim the most recent daily change logs (dates + previews), newest first. limit sets how many days (default 14). For one day's full log use insights(date).
No parameter schema on file.
Opens a BrainLLM session: runs the lite maintenance sweep, creates today's diary and session notes if they do not exist yet, and returns the date and weekday, the user's stored preferences and protocols in full, the other singletons as section headings with a preview (depth="full" inlines…
No parameter schema on file.
Pre-close review. Returns the six singletons as {id, lastModified} stubs (full=true inlines them), today's diary as {id, blocks, size}, the maintained notes changed today with their write counts, runs the lite maintenance sweep, and returns pending= (what each remaining close step has to do),…
No parameter schema on file.
Returns writing prompts for the diary: questions about how the session went and about BrainLLM itself (problems, usability, ideas). Records the remarks step of the close gate, which close() checks came after session() and before diary(). Writes no note content.
No parameter schema on file.
Writes the session log, normally the last call of a session. Refuses unless session(), addendum(), maintain(), remarks() and diary() ran and session → remarks → diary held; a session that wrote no content (light close) needs only session(), remarks() and diary() (force=true bypasses a step with…
No parameter schema on file.
Named database snapshot. close() already backs up into a rolling weekday slot (brainllm-mon … brainllm-sun, overwritten weekly); use this before a large restructure. A named backup is kept until someone deletes it on the server, so name milestones sparingly: every one is a full copy of the…
No parameter schema on file.
The brain's storage and runtime health: Trilium's version, an estimate of the database's size (content, attachments and revisions), the heaviest notes with their revision counts, and the named backups this server has taken. Each backup is a full database copy kept on Trilium's volume, which ETAPI…
No parameter schema on file.
Appends a timestamped block to today's diary note: the assistant's own first-person account of the session, followed by notes on BrainLLM. identity= is required. The close gate counts the diary only when its latest block was written after session() and remarks().
No parameter schema on file.
Store something the moment it matters; the server owns placement, labels and dedup. Kinds: biography | goals | preferences | responsibilities | protocols (singletons, upsert) · thread (goal= required to create; shape="collection" for a titled-entry thread; appends need identity=) · threadEntry (a…
No parameter schema on file.
Ranked search across the whole brain — label, title and full-text strategies merged, with kind and status. Pass domain= whenever you know the area. orderBy/orderDirection sort by date; fastSearch= scans titles and labels only; regex= matches note bodies with a real regular expression; a fuzzy pass…
No parameter schema on file.
Everything for a domain, topic or project: its knowledge book (if any) plus every note carrying a matching #domain or #topic slug, grouped by kind, each with idle days and a stale flag; outline=true adds every maintained note's headings and size. The reliable retrieval path for an area; use…
No parameter schema on file.
Several note bodies in one round trip: ids=[…] (up to 10) → {notes:[{id, title, kind, chars, content, relations}]}. Every entry carries chars, the size of that note's body in characters, so follow-up reads can be planned from this response alone. Bodies are returned in order until about 80k…
No parameter schema on file.
No parameter schema on file.
Close a thread (or any resolvable note) with a substantive outcome: writes the Resolution, sets the terminal status and archives it in place. "done" is not an outcome.
No parameter schema on file.
Move whole sections (heading + body, nested sub-sections included) out of a note into a new note under the same parent, typed and labelled like the source; the source keeps a pointer and a ~references edge. Use it when a note is past the read ceiling or holds two subjects. sections=[heading…
No parameter schema on file.
Return an archived or resolved thread to active and note the withdrawal on the book. Use when closed work resurfaces.
No parameter schema on file.
Set or remove one label (remove=true). Refused on containers. noteType cannot be changed or removed, but can be set on an untyped note to repair it. status must be one of …; domain and topic are slugged. register (value "") marks a register — a maintained table whose rows carry evidence dates — so…
No parameter schema on file.
Wire a typed relation between two notes when you notice a real connection. Vocabulary (closed): …. worksWith is symmetric and wired both ways automatically. Existing edges are detected — calling twice is safe. Use remove=true to delete an edge.
No parameter schema on file.
Walk the relation graph around a note. mode=links what this note points to (one hop) mode=backlinks what points to this note (one hop) mode=neighborhood everything within N hops, both directions (depth, optional relation filter); via is prefixed ← for edges…
No parameter schema on file.
Does the brain agree with itself? pattern= is a regex with ONE capture group naming the value that should match across notes, e.g. "(\\d+) mailboxes"; the result groups every asserting note by value with agreement unanimous or DISAGREEMENT. Multiple values co-asserted within one note — two true…
No parameter schema on file.
A note's heading tree without its body: each h2–h4 with level and occurrence index (and raw stored text where inline markup differs), table key columns, size, and structural findings. Read it before a section= edit you're not sure of. Notes over 15k also get a first-block preview per section.
No parameter schema on file.
Everything about one note: every label, relation and attachment, type/mime, parent and child ids, dates. content=true adds the raw body (section= narrows it). find="<literal>" counts occurrences (total, per addendum block, per section), returns the stored element around each one (up to 10: its…
No parameter schema on file.
Does the brain still agree with the world? Register a checkable assertion and record whether it holds. BrainLLM never runs the check — it stores it as inert text; you run it and report. assertion + check → register (deduped by assertion); claimId + holds + evidence → verify (evidence required);…
No parameter schema on file.
What a write actually changed: a revision snapshot (default the latest) against the note as it stands, as changed lines with context and added/removed counts. The revision list comes back on every call; pass revisionId to compare against an earlier one. since="today" (or a date, or "YYYY-MM-DD…
No parameter schema on file.
Upsert a raw artifact (file, image, blob) on a note by title (content given; mime=, encoding="base64" for binary) or read one back (content omitted). List with inspect(), remove with detach().
No parameter schema on file.
Remove an attachment by attachmentId, or by noteId + title. Permanent; retry-safe.
No parameter schema on file.
Find pending addendum blocks on notes that must stay merged documents (master and LLM singletons, knowledge notes). Fold each into its section with revise(section=/find=) and leave no marker; only sessions, diary, logs and dated thread entries accumulate addenda. The call marks its close-gate step.
No parameter schema on file.
Brain hygiene. Lite (automatic in start/close): ages threads active → dormant → archived and checks labels. deep=true adds stale notes, orphans and sinks, structural lint (duplicate headings, unbalanced tags, missing required sections, dated prose in timeless notes, oversized notes), duplicate…
No parameter schema on file.
Archive a note (default — hidden from default recall, recoverable with recover()) or hard-delete it (hard=true, refused while backlinked).
No parameter schema on file.
Restore an archived or resolved note: clears #archived and #closed and resets status. Content is untouched — use revise(), or get_revisions for an older snapshot. Notes deleted from Trilium need undelete_note.
No parameter schema on file.
The canonical structure for a kind: skeleton, top-to-bottom structure, and the rules writes are held to (including what stays authorial). Read it before your first write of a kind; then read an existing sibling and match its shape.
No parameter schema on file.
Render the relation graph as a Mermaid flowchart — the whole brain, or a neighborhood (noteId + depth). Returns the source and writes it to the Insights/Graph note. On demand only; a scoped call replaces the note's content.
No parameter schema on file.
The new-day sweep in one call: whether today is fresh (no addendum blocks in today's session note), the previous session in full, that day's log, and the notes touched since. Present what the touched notes evidence in the first message. recap=true instead returns every addendum block written…
No parameter schema on file.
The full inventory: every content note across all five areas with id, title, kind, status, parent and dates, grouped by area (Insights returns logs and claims). Use it to audit or locate a note; read parent, not position — each group is flat. includeArchived= adds archived notes.
No parameter schema on file.
What the brain holds: every note by title, grouped under its surface with that surface's purpose. Dated collections (sessions, diary, logs) collapse to a count and span; domains nest their notes; threads group by status. The awareness read — use brain() instead to audit or locate by id. area=…
No parameter schema on file.
Create the BrainLLM structure in Trilium, or verify and refresh it when it exists (idempotent): the five areas with their containers, singletons and engraved purposes, plus brainllm.json. Only creates a new tree when the stored root is confirmed deleted.
No parameter schema on file.
Raw Trilium query search. Native query language: #label=value, note.title =* "x", note.dateModified >= 'YYYY-MM-DD', AND/OR. Unscoped unless ancestorNoteId is given.
No parameter schema on file.
Full note metadata: title, type, mime, attributes (labels + relations), parent/child ids, dates.
No parameter schema on file.
Raw note content. Text returns the body; binary returns {encoding:'base64', mime, content} without lossy decoding.
No parameter schema on file.
Create a note at an explicit parent. Types: text/code/book/canvas/mermaid/relationMap/render/search/file/image. The note gets no #noteType, icon or placement, so core tools cannot see it until it is typed with label(id, "noteType", <kind>); use remember() for a memory.
No parameter schema on file.
Replace a note's full content. Binary input must use encoding=base64; text remains UTF-8. No revision is taken and nothing is sanitised: call create_revision first to keep the prior content recoverable, and prefer revise() for any BrainLLM note.
No parameter schema on file.
Mutate note metadata: title, type, or mime.
No parameter schema on file.
Hard-delete a single note. Irreversible. Refused (blocked: true) while any relation points at it (backlinks_exist), while it has children or more than one parent (blast_radius), or if the backlink check itself fails. Remove or retarget those first; for a recoverable removal use forget().
No parameter schema on file.
Restore a note deleted in Trilium (check note_history for canBeUndeleted) and re-apply its BrainLLM labels. For BrainLLM-archived notes use recover().
No parameter schema on file.
Recent changes feed (creations / modifications / deletions), newest first.
No parameter schema on file.
Fetch a single attribute by id.
No parameter schema on file.
Add a #label to a note (empty value = boolean flag). Adds a new attribute; does not dedupe.
No parameter schema on file.
Add a ~relation with a conservative identifier name (the core connect() enforces the canonical vocabulary).
No parameter schema on file.
Update an attribute's value (labels) and/or position by id.
No parameter schema on file.
Delete any label or relation by attributeId.
No parameter schema on file.
Fetch a branch (a note's placement under one parent).
No parameter schema on file.
Place a note under an additional parent (multi-parent branch; shared content, no copy).
No parameter schema on file.
Move a note to a new parent (clone to the new parent, then remove the old branch).
No parameter schema on file.
Remove one placement of a note (deletes the note if it was the last branch).
No parameter schema on file.
Snapshot a note's current content as a revision.
No parameter schema on file.
List a note's revisions, newest first.
No parameter schema on file.
Content of a historical revision snapshot. Binary snapshots return a base64 envelope.
No parameter schema on file.
List attachments on a note (id + title + mime + size).
No parameter schema on file.
Read an attachment. Text returns its body; binary returns {encoding:'base64', mime, content}.
No parameter schema on file.
Attach a file or text blob to a note (role: file | image). Binary content uses standard base64 and is uploaded as raw bytes.
No parameter schema on file.
Update an attachment's content and/or metadata. MIME changes are applied before raw binary content so the server never coerces bytes using the old type.
No parameter schema on file.
Permanently delete an attachment. Irreversible.
No parameter schema on file.
Get (or auto-create) the journal day note. Format: YYYY-MM-DD (default: today).
No parameter schema on file.
Get (or auto-create) the journal week note. Format: YYYY-Www.
No parameter schema on file.
Get (or auto-create) the journal month note. Format: YYYY-MM.
No parameter schema on file.
Get (or auto-create) the journal year note. Format: YYYY.
No parameter schema on file.
Get the Trilium inbox note for a date (fixed #inbox note, or the day note). Format: YYYY-MM-DD.
No parameter schema on file.
Trilium server version, DB version, runtime metadata.
No parameter schema on file.
Self-hosted memory for LLMs in TriliumNext, structured by the server and editable by you.
No parameter schema on file.
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install BrainLLM or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | source | publisher verification (provenance) — cryptographic build provenance ties the artifact to its source | −0 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
No tools were enumerated, so prompt-injection, capability and toxic-flow analysis had no tool surface to inspect. To grade a package’s real runtime tools, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| No per-tool rows for this release — see the note below. | ||
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 13.2.0. Pin a release below and the command asks for exactly that one.
- Update the MCP SDK to 1.32.2 and @hono/node-server to 2.1.5, which clears GHSA-rmxm-3fg6-px4f (serveStatic path double-decoding; BrainLLM does not serve static files through it). Pin @types/bun to a version range instead of latest so bun.lock and package-lock.json resolve the same dependency tree, and refresh both within existing ranges. CodeQL init and analyze move to 4.39.1 together. Validation: 525 unit tests, explicit typecheck, build, HTTP authentication smoke, manifest/release checks, npm lock integrity and both dependency audits (zero advisories) pass. A fresh read-only production MCP smoke reports 13.1.2. Memory tools and stored data are unchanged; the skill archive is unchanged.
- Patch the HTTP dependency chain, including the body-parser denial-of-service advisory. Keep CodeQL's coupled action steps on the same version and group future updates. Memory tools and stored data are unchanged. Verified with 525 unit tests, typechecking, build, HTTP authentication smoke and a fresh read-only production MCP check.
- Safe Changes: preview targeted edits without writing, move queue items in ordered batches, and retain source items if a destination write fails. Revision failures now stop writes. Consistency checks report scan coverage. Includes BrainLLM connector icons, Zod 4 support and dependency updates.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
- The version this listing was on when mcprush began following its releases. The registry was not asked when it shipped, so this row carries no date.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish BrainLLM can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.