Give Claude a memory that survives the conversation - an MCP server that turns TriliumNext into a persistent, graph-structured second brain. MIT.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add brainllm --env TRILIUM_BASE_URL='<TRILIUM_BASE_URL>' --env TRILIUM_ETAPI_TOKEN='<TRILIUM_ETAPI_TOKEN>' --env TRILIUM_PASSWORD='<TRILIUM_PASSWORD>' --env BRAINLLM_OWNER_PASSWORD='<BRAINLLM_OWNER_PASSWORD>' --env BRAINLLM_OAUTH_SECRET='<BRAINLLM_OAUTH_SECRET>' -- npx -y brainllm~/.codex/config.toml
[mcp_servers.brainllm]
command = "npx"
args = ["-y", "brainllm"]
env = { TRILIUM_BASE_URL = "<TRILIUM_BASE_URL>", TRILIUM_ETAPI_TOKEN = "<TRILIUM_ETAPI_TOKEN>", TRILIUM_PASSWORD = "<TRILIUM_PASSWORD>", BRAINLLM_OWNER_PASSWORD = "<BRAINLLM_OWNER_PASSWORD>", BRAINLLM_OAUTH_SECRET = "<BRAINLLM_OAUTH_SECRET>" }
# codex mcp add brainllm --env TRILIUM_BASE_URL='<TRILIUM_BASE_URL>' --env TRILIUM_ETAPI_TOKEN='<TRILIUM_ETAPI_TOKEN>' --env TRILIUM_PASSWORD='<TRILIUM_PASSWORD>' --env BRAINLLM_OWNER_PASSWORD='<BRAINLLM_OWNER_PASSWORD>' --env BRAINLLM_OAUTH_SECRET='<BRAINLLM_OAUTH_SECRET>' -- npx -y brainllm~/.cursor/mcp.json
{
"mcpServers": {
"brainllm": {
"command": "npx",
"args": [
"-y",
"brainllm"
],
"env": {
"TRILIUM_BASE_URL": "<TRILIUM_BASE_URL>",
"TRILIUM_ETAPI_TOKEN": "<TRILIUM_ETAPI_TOKEN>",
"TRILIUM_PASSWORD": "<TRILIUM_PASSWORD>",
"BRAINLLM_OWNER_PASSWORD": "<BRAINLLM_OWNER_PASSWORD>",
"BRAINLLM_OAUTH_SECRET": "<BRAINLLM_OAUTH_SECRET>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"brainllm": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"brainllm"
],
"env": {
"TRILIUM_BASE_URL": "<TRILIUM_BASE_URL>",
"TRILIUM_ETAPI_TOKEN": "<TRILIUM_ETAPI_TOKEN>",
"TRILIUM_PASSWORD": "<TRILIUM_PASSWORD>",
"BRAINLLM_OWNER_PASSWORD": "<BRAINLLM_OWNER_PASSWORD>",
"BRAINLLM_OAUTH_SECRET": "<BRAINLLM_OAUTH_SECRET>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"brainllm": {
"command": "npx",
"args": [
"-y",
"brainllm"
],
"env": {
"TRILIUM_BASE_URL": "<TRILIUM_BASE_URL>",
"TRILIUM_ETAPI_TOKEN": "<TRILIUM_ETAPI_TOKEN>",
"TRILIUM_PASSWORD": "<TRILIUM_PASSWORD>",
"BRAINLLM_OWNER_PASSWORD": "<BRAINLLM_OWNER_PASSWORD>",
"BRAINLLM_OAUTH_SECRET": "<BRAINLLM_OAUTH_SECRET>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"brainllm": {
"command": "npx",
"args": [
"-y",
"brainllm"
],
"env": {
"TRILIUM_BASE_URL": "<TRILIUM_BASE_URL>",
"TRILIUM_ETAPI_TOKEN": "<TRILIUM_ETAPI_TOKEN>",
"TRILIUM_PASSWORD": "<TRILIUM_PASSWORD>",
"BRAINLLM_OWNER_PASSWORD": "<BRAINLLM_OWNER_PASSWORD>",
"BRAINLLM_OAUTH_SECRET": "<BRAINLLM_OAUTH_SECRET>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"brainllm": {
"command": "npx",
"args": [
"-y",
"brainllm"
],
"env": {
"TRILIUM_BASE_URL": "<TRILIUM_BASE_URL>",
"TRILIUM_ETAPI_TOKEN": "<TRILIUM_ETAPI_TOKEN>",
"TRILIUM_PASSWORD": "<TRILIUM_PASSWORD>",
"BRAINLLM_OWNER_PASSWORD": "<BRAINLLM_OWNER_PASSWORD>",
"BRAINLLM_OAUTH_SECRET": "<BRAINLLM_OAUTH_SECRET>"
}
}
}
}Environment variables
TRILIUM_BASE_URLTRILIUM_ETAPI_TOKENTRILIUM_PASSWORDBRAINLLM_OWNER_PASSWORDBRAINLLM_OAUTH_SECRET
Replace the placeholders with your own credentials and keep them out of version control.