brain
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@brainremember that I prefer concise answers"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
brain
Your local second brain for Claude, ChatGPT and any AI agent.
brain is an MCP server that runs on your Mac and gives your AI agents a shared memory: your notes, your projects, what they know about you and the web pages you saved, with semantic search. Connect it once to Claude, ChatGPT, Cursor or whatever agent you use, and they all read and write the same knowledge base. Everything stays on your computer.
It ships with a web dashboard so you never have to touch the terminal: turn services on and off, fill in your profile, import the memory other chatbots have about you, connect agents, explore the connection graph and search what you saved.
curl -fsSL https://raw.githubusercontent.com/Lautaro005/brain/main/install.sh | bashThen type brain and the dashboard opens.
Website: https://lautaro005.github.io/brain/
Contents
Related MCP server: ClawMem MCP Server
What you can do
Let your agents know you. Write a profile (who you are, what you do, how you like to work) and import the memory ChatGPT, Claude or Gemini already have about you. Every connected agent reads it when it starts and saves anything new it learns with
add_memory.One knowledge base, shared by every agent. Markdown notes organized into projects and skills. What Claude writes today, ChatGPT can read tomorrow.
Save the web. Give brain a URL and it downloads the page, extracts the text (including sites built with JavaScript), indexes it and makes it available to semantic search: you search by meaning, not exact words.
See how everything connects. An interactive graph shows your profile, memories, projects, skills, sources and tags, and how they relate.
Undo anything. Every write goes into a version history. If an agent deletes or overwrites something, you get it back.
Private by design. Embeddings are computed on your machine with Ollama, and nothing leaves your computer.
Installation
Requirements: macOS (Apple Silicon or Intel) and git (xcode-select --install if you don't have it). The installer takes care of the rest.
curl -fsSL https://raw.githubusercontent.com/Lautaro005/brain/main/install.sh | bashThe installer:
Installs uv if you don't have it (it manages Python and the dependencies without touching the system Python).
Downloads brain into
~/.brain.Installs the dependencies and the headless Chromium used to scrape JavaScript sites.
Installs Ollama with Homebrew if needed, and pulls the
nomic-embed-textembedding model (~270 MB). Without Homebrew, it tells you where to download Ollama.Creates the
braincommand in~/.local/binand adds it to yourPATHif it wasn't there.
Running it again updates the install. To install somewhere else, set BRAIN_HOME=~/some/folder before bash.
git clone https://github.com/Lautaro005/brain ~/.brain && cd ~/.brain
uv sync
uv run playwright install chromium
ollama pull nomic-embed-text
./brain.shGetting started
Open the dashboard:
brain. It opens athttp://127.0.0.1:8765and starts Ollama and the Chroma server if they aren't running. Keep it open while you use your agents; Ctrl+C closes it.Connect your agents: Connect agent tab → Connect on Claude Desktop, ChatGPT or whichever you use.
Tell it who you are: Profile tab → fill in "About you" and import your memory from another chatbot.
Try it: in Claude, ask "what do you know about me according to brain?" or "save this URL to brain: …".
The dashboard
Tab | What it's for |
Dashboard | Switches to turn Chroma, Ollama and the MCP Inspector (a UI to try the tools by hand) on and off. Vault metrics, activity charts for the last 30 days, sources by domain, operations, system health and recent changes. |
Profile | Your details (name, headline, about me) and your memory. The importer takes 3 steps: pick the chatbot, copy a prompt that asks it for all its memory in a fixed format, and paste the answer (or upload a |
Connect agent | Connect and disconnect brain from Claude Desktop, ChatGPT, Claude Code, Codex, Cursor, VS Code, Windsurf and Gemini CLI in one click, plus manual setup for anything else. My connections shows which agents are connected and whether they point to this install. |
Graph | Interactive map of the vault: profile, memory, projects, skills, sources, folders and tags. Click a node to see its content and connections. Controls to zoom in, zoom out and re-center (also the |
Knowledge | Save a URL (optionally forcing JavaScript rendering), semantic search with a relevance score, and the list of saved sources. |
Logs | Live output of every service the dashboard manages. |
The bottom of the sidebar has the theme (system, light or dark) and the language (English / Español).
When you close the dashboard, it only stops what it started. If Ollama was already running (for example the menu-bar app), it shows up as External and is left alone.
Connecting agents
Each agent keeps its list of MCP servers in its own file. When you click Connect, brain adds its entry without touching the rest of the file, and saves a backup first (<file>.bak-brain).
Agent | Where it's configured | Notes |
Claude Desktop (chat and Cowork) |
| Claude rewrites this file when it quits, so it's edited with the app closed. If it's open, the dashboard offers to quit it, connect and reopen it. |
ChatGPT (desktop app) |
| Works in Codex and ChatGPT Work modes; regular ChatGPT chat doesn't use local servers. Afterwards: Settings → MCP servers → Restart. Shares its config with Codex CLI. |
Claude Code |
| Available in all your projects. |
Codex CLI |
| Same config as ChatGPT. |
Cursor |
| |
VS Code (Copilot, agent mode) |
| |
Windsurf |
| |
Gemini CLI |
| |
Anything else | The dashboard gives you ready-to-copy config as JSON, TOML, a command, or field by field. |
All of them launch the same server (uv run --directory ~/.brain python server.py) with absolute paths, so they work from any folder.
Apps with an "Add MCP server" form
Many apps have a dialog with two options, Run a command and Connect to a URL. Choose Run a command: brain is a local (stdio) server and doesn't expose a URL, so "Connect to a URL" won't work. Pointing it at the dashboard's address returns 403, because the dashboard only accepts requests from its own page.
Field | Value |
Server name |
|
Executable command | the absolute path to |
Arguments (one per line) |
|
Environment | empty |
The Connect agent tab shows these values already filled in for your machine, each with a copy button.
How it works
flowchart LR
subgraph Agents
A1[Claude Desktop]
A2[ChatGPT]
A3[Claude Code / Cursor / …]
end
subgraph brain["brain (your Mac)"]
S1[server.py<br/>one process per agent]
V[(vault/<br/>Markdown)]
H[(data/history.sqlite3<br/>versions)]
C[(Chroma<br/>shared HTTP server)]
O[Ollama<br/>nomic-embed-text]
P[Playwright<br/>headless Chromium]
D[Dashboard<br/>127.0.0.1:8765]
end
A1 & A2 & A3 -- MCP over stdio --> S1
S1 --> V
S1 --> H
S1 -- embeddings --> O
S1 -- chunks --> C
S1 -- JS sites --> P
D --> V & H & C
D -. starts/stops .-> C & OPieces:
MCP server (
server.py). Each agent launches its own process and talks to it over stdio (MCP's standard for local servers). It exposes the tools and tells the model to readBRAIN.md, your profile and your memory first.Vault (
~/.brain/vault/). Markdown files with YAML frontmatter:BRAIN.md: a short index the agent reads first.profile.md: your profile.memory/: one file per category ("Work", "Preferences"…) with one fact per bullet.projects/andskills/: your notes and reusable instructions.knowledge/sources/: the full text of every saved URL.
History (
data/history.sqlite3). Every write stores the file's previous and new content. A cross-process file lock makes writes atomic, so Claude, ChatGPT and the dashboard can write at the same time without clobbering each other.Chroma. The vector database behind semantic search. It runs as a single HTTP server on
127.0.0.1:8055, so every process shares it without fighting over the disk.Ollama. Computes embeddings on your machine with
nomic-embed-text, using the prefixes the model expects (search_document:when indexing,search_query:when searching).
What happens when you save a URL (save_url):
trafilatura downloads the page and extracts clean text.
If it gets fewer than 30 words (typical of JavaScript-built sites) or the download fails, it renders the page in headless Chromium with Playwright and extracts again.
It splits the text into ~500-word chunks with a 50-word overlap.
It embeds each chunk with Ollama and stores it in Chroma, with metadata pointing back to the source
.md.It writes
knowledge/sources/<slug>.mdwith the full text and its chunk ids. Saving the same URL again updates it instead of duplicating it.
How memory import works: the dashboard's prompt asks the chatbot for its memory grouped as ## Category / - fact. The parser also accepts plain lists, bold labels, numbered lists and JSON. It deduplicates, strips date prefixes, and when a memory mentions one of your projects by name, links them in the graph.
MCP tools
Tool | What it does |
| Lists vault files with their description |
| Reads a file |
| Creates or replaces a file |
| Appends to a file |
| Targeted replace ( |
| Deletes a file (recoverable) |
| A file's versions |
| Restores a file to an earlier version (also brings back deleted files) |
| Saves a fact about you to your memory, without duplicates |
| Skills: reusable instructions in |
| Scrapes, indexes and saves a URL |
| Semantic search over what you saved |
| Every saved URL |
The brain command
brain opens the dashboard and starts Ollama and Chroma
brain --port 8766 dashboard on another port
brain --no-autostart don't start Ollama/Chroma automatically
brain --no-browser don't open the browser
brain update updates to the latest version
brain path shows where it's installed
brain uninstall removes the command (keeps your data)
brain help helpData, privacy and security
Everything is local. Your data lives in
~/.brain/vault/and~/.brain/data/. Both folders are in.gitignore, so they're never uploaded anywhere, not even if you fork the repo.No external services. Embeddings are computed with Ollama on your machine. brain only goes online when you ask it to save a URL.
The dashboard only accepts requests from your own machine. It listens on
127.0.0.1, rejects requests with any otherHost(DNS-rebinding protection), and its actions require a custom header browsers won't send from other pages. No website you have open can start processes or write to your vault.Agents can't leave the vault. The tools reject paths with
.., absolute paths, hidden files and symlinks that point outside.Everything can be undone. Any write can be reverted with
file_history+restore_file.
To start from scratch: close the dashboard and your agents, and delete ~/.brain/vault and ~/.brain/data. They're recreated empty on the next start.
Troubleshooting
Problem | Fix |
"Ollama isn't running" | Turn on the Ollama switch in the Dashboard, or open the Ollama app. |
"The Chroma server isn't running" | Open the dashboard ( |
An app returns | You used "Connect to a URL". Use Run a command with the values from Apps with an "Add MCP server" form. |
brain doesn't show up in Claude Desktop | Connect it from Connect agent and restart Claude. Check My connections. |
brain doesn't show up in ChatGPT | Use Codex or ChatGPT Work mode and go to Settings → MCP servers → Restart. Regular chat doesn't use local servers. |
"Couldn't extract text from that URL" | The site may be paywalled or require a login. Try Force JS rendering. |
| Open a new terminal. If it persists, add |
Port 8765 is taken |
|
Uninstalling
In the dashboard, Connect agent → disconnect your agents (or remove the
brainentry from their config).brain uninstallremoves the command.rm -rf ~/.braindeletes the app and your data.
Development
CLAUDE.md: technical guide for agents working on the repo (architecture, conventions and gotchas).CHANGES.md: the log of every change and decision. New changes are appended at the end.BUILD.md: the original spec.docs/: the website, published with GitHub Pages.
git clone https://github.com/Lautaro005/brain && cd brain
uv sync && ./brain.shThe dashboard UI is available in English and Spanish; the internal docs (CLAUDE.md, CHANGES.md, BUILD.md) are in Spanish.
License
MIT © 2026 Lautaro Silva
Available Tools
14 toolsadd_memoryA
Guarda un hecho duradero sobre el usuario en memory/.md (sin duplicar). Ej: add_memory("Prefiere respuestas cortas", "Preferencias").
| Name | Required | Description | Default |
|---|---|---|---|
| fact | Yes | ||
| category | No | General |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It discloses the durable write behavior, the category-based file path, and deduplication. It does not describe failure modes or response details, but the output schema covers the latter and the main side-effect behavior is well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The core purpose, storage location, dedup behavior, and a useful invocation example are all packed into a very compact description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema, and the description covers purpose, file location, deduplication, and parameters via example. The only notable gaps are the missing explicit mention of the default category and lack of guidance about when not to use it, but these are minor for successful invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions are absent, so the description must compensate. It partially does by providing a concrete example mapping 'fact' to a preference string and 'category' to 'Preferencias', and by showing how category influences the file path. However, it does not explain that category defaults to 'General', which is only visible in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Guarda un hecho duradero sobre el usuario'), the storage target ('memory/<category>.md'), and a key behavior ('sin duplicar'). The example further clarifies exactly what kind of content belongs here, distinguishing it from generic file-writing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: when persisting durable user facts/preferences rather than writing arbitrary files. However, it does not explicitly name alternatives or exclusions, such as when to prefer write_file, append_file, or search_knowledge instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
append_fileB
Agrega contenido al final de un archivo del vault (lo crea si no existe). Queda en el historial.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description must carry the full burden. It discloses that the file is created if missing and that the action is recorded in history ('Queda en el historial'). However, it doesn't disclose potential side effects like overwriting, permission requirements, or error behavior, and it doesn't explicitly state whether the operation is atomic or reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and key exception (creating if missing). No wasted words; the history note is a useful extra. The structure is ideal for quick parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, and the description covers the essential behavior. However, it lacks details on return values (despite having an output schema), path syntax, and how it differs from write_file. Given the low complexity, this is adequate but not thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain both parameters. It refers to 'content' but doesn't clarify what format is expected or how 'path' should be specified (relative/absolute). The description adds minimal value beyond the raw parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Agrega' (adds) and the resource 'archivo del vault' (vault file), and includes the key behavior of creating the file if it doesn't exist. It's specific enough to distinguish from read_file or delete_file, though it doesn't explicitly contrast with write_file or str_replace_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to choose this tool over siblings like write_file (overwrites) or str_replace_file (replaces). The description implies appending as a distinct operation but never states when it's appropriate or preferable, leaving the agent to infer from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_fileB
Borra un archivo del vault. Recuperable con file_history + restore_file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses that deletion is recoverable via file_history + restore_file, a key behavioral trait. However, it does not mention permissions, behavior for missing paths, or whether deletion is permanent under some conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence with the primary action front-loaded and the recovery note appended. Every phrase earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one required parameter and an output schema, the description is nearly complete: it states the action and the recovery path. The main gap is missing parameter semantics for path, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, path, has 0% schema description coverage, and the description does not clarify what format path should take (vault-relative, absolute, file extension rules, etc.). The agent is left with only the schema's generic 'Path' title.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Borra un archivo del vault' (deletes a file from the vault). It clearly identifies the tool's core operation, though it does not explicitly contrast itself with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use this to delete a vault file. It also names file_history and restore_file as recovery alternatives, which hints at when recovery might matter, but it gives no explicit when-to-use or when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
file_historyA
Versiones de un archivo del vault, la más nueva primero (id, fecha, operación). El id sirve para restore_file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden. It discloses the ordering (newest first) and the fields, which is useful. However, it doesn't mention whether this tool mutates anything (it's likely read-only), what happens if the path doesn't exist, or details about pagination/limits. These gaps are not severe for a list operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. It front-loads the purpose and includes the key detail about the id being for restore_file, which is crucial for routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is an output schema, so return details are covered. The tool is simple with one param, and the description covers the basics. However, given the siblings include restore_file, it would help to mention that this is a read-only overview before restore. Also, path syntax is not specified, which could cause incorrect calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, path, is self-explanatory, but schema coverage is 0%, meaning the description must add meaning. The description implies the path points to a vault file, but doesn't clarify path format (e.g., relative to vault root). Since coverage is 0%, a baseline 1 might be argued, but the description's mention of 'archivo del vault' gives some context, so a 3 is fair.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists versions of a vault file, newest first, with fields id, date, and operation. It distinguishes from siblings like read_file and restore_file by focusing on history. However, it doesn't explicitly name a sibling for comparison, making differentiation slightly implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for viewing file versions, and mentions that the id is used for restore_file, which hints at when to use it (before restoring). But it doesn't provide explicit exclusions or alternatives; an agent might need to infer when to use this vs. read_file.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_skillA
Devuelve el contenido de un skill por nombre (ej. 'mi-skill' o 'mi-skill.md').
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It accurately states the operation (returns content) and demonstrates accepted name formats, but it does not disclose behavior on missing skills, extension normalization, or whether the operation is read-only beyond the verb 'Devuelve'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the action and resource, with useful examples. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter getter with an output schema, the description is largely sufficient: it specifies the resource, the input format, and the returned content. It could add a pointer to list_skills for discovery or error behavior, but these are not critical for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, and the description compensates by explaining that 'name' accepts either 'mi-skill' or 'mi-skill.md'. This adds format flexibility beyond the bare schema, though it does not specify case sensitivity or resolution rules.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Devuelve') and resource ('contenido de un skill') and gives two accepted name formats. It clearly identifies the tool as a skill-content getter, though it does not explicitly contrast it with list_skills or read_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or alternative guidance is provided. It implies use when you need a skill's content by name, but does not mention list_skills for discovery or read_file for arbitrary files, nor any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_skillsA
Lista los skills disponibles (skills/*.md) con su description, para decidir cuál aplica.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It discloses the exact source files it lists, that it includes descriptions, and that it is a listing operation rather than a mutation. It does not state read-only behavior explicitly, but 'Lista' and the file pattern make the non-destructive nature clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single efficient sentence that front-loads the action, specifies the source location, states what fields are included, and explains the purpose. Every phrase earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with an output schema, the description is complete: it tells an agent what will be listed, where it comes from, what metadata is included, and why the tool should be used. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no parameter documentation burden. The description correctly avoids inventing parameter details, and the empty input schema already communicates that no arguments are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lista'), a clear resource ('skills'), and a precise source pattern ('skills/*.md'). It also says the listing includes each skill's description and names the purpose ('para decidir cuál aplica'), which distinguishes it from sibling tools like get_skill.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: use this tool to review available skills and their descriptions when deciding which skill to apply. It does not explicitly mention exclusions or contrast it with get_skill, but the intended decision-making scenario is evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sourcesA
Lista todas las fuentes scrapeadas (url, fecha, path del .md, título).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. The verb 'Lista' clearly indicates a read-only operation and explicitly states the output fields, which is adequate for a parameterless listing tool. It does not mention potential pagination or data freshness, but these are minor for this simple use case.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with a parenthetical list of fields, front-loading the core action and resource. Every word earns its place with no redundant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are already structured. Combined with zero parameters, the description is sufficient for correct invocation. The only minor gap is not clarifying how 'sources' relate to sibling list_vault, but that does not block usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema description coverage is 100%, so there are no input semantics to clarify. The baseline of 4 applies because the description cannot add value for parameters that do not exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Lista') with a clear object ('todas las fuentes scrapeadas') and enumerates the returned fields (url, fecha, path del .md, título). This makes the tool's scope unmistakable and differentiates it from siblings like list_vault and list_skills by resource type.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives such as list_vault, search_knowledge, or save_url. There are no explicit conditions, exclusions, or references to sibling tools, so an agent must infer the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_vaultA
Lista archivos .md del vault (path + description del frontmatter). prefix opcional, ej. 'projects'.
| Name | Required | Description | Default |
|---|---|---|---|
| prefix | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden of behavioral disclosure. It correctly implies a read-only operation ('list') and specifies the output content (path + description). However, it omits behavioral details such as recursion, ordering, or handling of hidden files, which could matter in edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that front-loads the primary purpose and includes an illustrative example. Every component earns its place without redundancy or excessive detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, the description provides the core information needed: what it returns (paths and descriptions) and how prefix works. The presence of an output schema (not shown) reduces the need to explain return values. Missing details like whether files are listed recursively are likely minor for typical usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides no description for the 'prefix' parameter, leaving 0% schema coverage. The description adds meaning by stating it is optional and giving an example ('projects'), which implies it filters by path prefix. This is sufficient for the agent to understand the parameter's role.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'list' and the resource 'vault', specifying that it lists .md files with their path and frontmatter description. It does not explicitly name sibling tools to differentiate itself, but the purpose is unambiguous. The optional prefix is mentioned, adding specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like search_knowledge or list_sources. The description only explains what the tool does, not the contexts where it is preferred. There are no directives on prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_fileA
Devuelve el contenido completo de un archivo del vault (path relativo, ej. 'BRAIN.md').
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the burden. It states the tool returns the complete file content and that the path is vault-relative, which is useful. It does not disclose error behavior, encoding, or explicitly confirm no side effects, though 'Devuelve' implies a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every piece of information — return value, scope, and path format — is useful and immediately accessible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read operation with an output schema present, the description covers everything needed to invoke it correctly: the action, the result, and the path convention. No additional context is required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only lists 'path' with no description, so the description adds critical meaning: the path is relative and should be within the vault, with 'BRAIN.md' as an example. This fully compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Devuelve') and a specific resource ('contenido completo de un archivo del vault'), and gives a concrete path example. This clearly distinguishes read_file from write/delete siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: the tool returns file content, so an agent can infer when to use it. However, there is no explicit guidance about when to choose this over alternatives like list_vault or file_history, and no exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_fileA
Vuelve un archivo a como quedó en la versión version_id (ver file_history). La restauración también queda en el historial, así que se puede deshacer.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| version_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing side effects. It states that restoration adds to the history and is therefore undoable, which is a key behavioral trait. It does not mention permissions or error behavior, but for a simple mutation tool, this is adequate and goes beyond a bare 'restore' statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, with the core action front-loaded and the side effect (history entry/undoability) in the second sentence. Every word earns its place; there is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only two required parameters and an output schema (not detailed), the description covers the action, the source of version_id, and the reversibility. It does not detail when to use vs. alternatives, but that is addressed under usage guidelines. Overall, it is sufficient for an agent to call it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero description coverage for both parameters, so the description must compensate. It explains that version_id refers to a version from file_history, giving context that the schema lacks. Path is implicitly understood as the file to restore. This adds meaningful semantics, though it could be more explicit about the path parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'restore a file to how it was in version version_id'. It distinguishes itself from siblings like read_file, write_file, and file_history by focusing on the action of restoring a prior version, which is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It references 'file_history' as a source for version_id, implying the agent should consult history first to obtain a valid version. However, it does not explicitly state when to use this tool over alternatives like write_file or when not to use it. The guidance is implied rather than explicit, so it falls short of a higher score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_urlA
Scrapea una URL, la chunkea, la indexa en Chroma y crea/actualiza su .md en knowledge/sources/. Si la URL ya estaba guardada, la actualiza (no duplica). Si el fetch normal no saca texto útil (sitio con mucho JS), renderiza solo con Playwright; render_js=True fuerza ese camino directo.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| render_js | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden. It states the side effects (scrapes, chunks, indexes in Chroma, writes/updates a markdown file), explains the no-duplicate update behavior, and discloses the Playwright fallback path plus the flag that forces it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core pipeline is front-loaded first, followed by the update behavior and the conditional render_js logic, so an agent can quickly parse the essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter side-effecting tool with an output schema, this is complete: it names target storage, the on-disk output location, update semantics, and the JS-rendering fallback. No critical invocation detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 0%, the description adds real meaning to render_js by explaining the normal fetch path, the fallback condition, and the forced direct path. The url parameter is self-explanatory from its type and the tool's stated purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb (Scrapea) and resource (una URL), then lists the concrete pipeline: chunking, indexing in Chroma, and creating/updating the .md file in knowledge/sources/. This clearly separates it from the file and knowledge sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context: use this to save a URL into the knowledge base, and it can update an existing entry without duplicating. It does not explicitly name alternative sibling tools or give when-not-to-use guidance, but no direct sibling competes with this ingestion behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_knowledgeA
Búsqueda semántica en las fuentes scrapeadas. Devuelve chunks con url y source_md_path.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reveals that the tool performs semantic search and returns chunks with url and source_md_path, but it does not explicitly state read-only behavior, authentication needs, rate limits, or error behavior. It is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that leads with the operation and then the return shape. There is no filler, redundancy, or unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has an output schema, and the description conveys the core search behavior. However, the 0% parameter coverage and lack of usage guidance leave an agent to infer details about top_k and when this tool should be chosen over siblings. It is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate. It adds meaning to the query parameter through 'Búsqueda semántica' but says nothing about top_k, result limits, or how the query is interpreted. The schema's default value is the only clue for top_k.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation ('Búsqueda semántica') and a specific resource ('fuentes scrapeadas'), and it states the return shape ('chunks con url y source_md_path'). This makes the tool's purpose clear and distinguishes it from file-management and source-listing siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies that this tool is for querying scraped knowledge rather than for file operations or listing sources, but it does not explicitly state when to prefer it over alternatives or when not to use it. No exclusions or sibling comparisons are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
str_replace_fileC
Reemplazo puntual: 'old' debe aparecer exactamente una vez en el archivo. Queda en el historial.
| Name | Required | Description | Default |
|---|---|---|---|
| new | Yes | ||
| old | Yes | ||
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavior. It does state a critical constraint: 'old' must appear exactly once, and that the change is recorded in history (implying reversibility). However, it does not disclose what happens if the constraint is violated (e.g., failure or error), whether the operation is destructive, or what the response contains. It provides partial transparency but lacks important details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence, front-loading the key constraint and history note. It avoids unnecessary words and conveys the essential behavior in minimal space. It could be slightly more structured (e.g., separating constraint and history), but it is efficient and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no annotations, an output schema, and three required parameters, this description is insufficiently complete. It omits error behavior (what if 'old' is missing or appears multiple times), return values, and prerequisites. It also lacks any comparison to sibling tools, which are numerous. An agent would need to open the schema or experiment to understand full usage, making this a minimally viable but incomplete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meanings. It mentions 'old' and its uniqueness constraint, but does not explicitly define 'path' (file location) or 'new' (replacement string). An agent could infer these from the tool name, but the description adds minimal value beyond the schema's bare property names. The constraint on 'old' is useful, but the other two parameters are undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('reemplazo' = replace), the resource (file), and the key constraint that 'old' must appear exactly once. It distinguishes itself from siblings like write_file or append_file by implying a targeted replacement rather than a full overwrite or addition. However, it does not explicitly mention the 'path' or 'new' parameters, relying on inference from the tool name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is given on when to use this tool versus siblings. It doesn't say 'use this for single-occurrence replacements, use write_file for full rewrites'. The uniqueness constraint hints at a scenario, but it does not contrast with alternatives or state exclusions. The agent must infer usage from the name and context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
write_fileA
Crea o REEMPLAZA ENTERO un archivo del vault. Queda en el historial (file_history).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| content | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It clearly indicates a mutating action (create/replace entirely) and adds a notable side effect: the operation is recorded in file_history. This goes beyond a bare 'writes' and covers a meaningful behavior, though other traits (e.g., overwrite confirmation) are absent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, comprising two short phrases with no wasted words. The primary action is front-loaded, and the history note is appended efficiently. Perfectly sized for its simple purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values are covered. The description covers the core action and history side effect. However, with no annotations and sibling partial-edit tools, it could be more explicit about when to choose this over append_file or str_replace_file. The ambiguity is mitigated by 'entero' but not fully resolved, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does not explain the 'path' or 'content' parameters at all. Although the parameter names are self-explanatory, the description adds no meaning or format expectations beyond the bare schema, failing to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates or completely replaces a file in the vault, using the verb 'Crea o REEMPLAZA ENTERO' which distinguishes it from partial-edit siblings. It identifies the resource (vault file) and implies full-file operations, though it doesn't explicitly name alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (create or fully overwrite a file) but does not state when not to use it or explicitly mention alternatives like append_file or str_replace_file for partial edits. The 'entero' hints at full replacement but lacks explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
14 tool updates
v0.1.0- First observed
add_memory - First observed
append_file - First observed
delete_file - First observed
file_history - First observed
get_skill - First observed
list_skills - First observed
list_sources - First observed
list_vault - First observed
read_file - First observed
restore_file - First observed
save_url - First observed
search_knowledge - First observed
str_replace_file - First observed
write_file
TDQS
Scored across 14 tools
Each tool targets a distinct operation or resource: vault file listing/content/mutation/history, memory facts, skills, and knowledge sources are clearly separated. Even similar file-editing tools are distinguished by whole-file vs append vs targeted replace.
Almost all tools follow a clear verb_noun snake_case pattern (list_vault, write_file, save_url, search_knowledge). The only deviation is file_history, which is noun_noun rather than an action like get_file_history or list_file_history.
Fourteen tools is well-scoped for a personal knowledge/brain vault server: each tool covers a meaningful capability without redundancy. The count is in the ideal range.
The file lifecycle is fully covered with read/write/append/replace/delete plus history and restore. Minor gaps remain: memory facts only have an add operation (though vault tools can edit them), and there is no explicit way to remove a scraped source from the search index.
Maintenance
Related MCP Connectors
Persistent memory for AI agents. Semantic search, memory graph, W3C DID identity.
Personal wiki and memory layer for AI assistants. Persistent, structured memory across sessions.
Local-first memory and continuity for AI coding agents. No cloud backend; optional hosted lane.
Universal memory for AI agents and tools. Save, organize and search context anywhere.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceLocal-first, multi-user shared memory for AI agents with semantic search, offline support, and team synchronization.MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.535 npmMIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to search and retrieve memories from your Mac, including screen captures, meeting transcripts, and browsing history, all locally and privately.1-
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to capture, structure, remember, and retrieve source-backed memory as local Markdown files, with reviewable writes and no cloud dependency.186MIT