Second Brain について
Second Brainは、複数のAIエージェントで共有する長期記憶システムです。Markdownノートとwikilinkでグラフを作り、モデルに関連する文脈を検索します。REST API、JavaScript SDK、CLI、Obsidian対応の保管庫に加え、タスクキューやエージェント間メッセージ機能を備えます。
主な機能
- 01Markdownとwikilinkによる記憶グラフ
- 02キーワード・グラフ・任意の意味検索
- 03トークン予算内で文脈を想起
- 04ファイル変更時のインデックス更新
- 05タスクキューとエージェント間メッセージ
- 06REST API、JavaScript SDK、CLI
活用シーン
- 01複数エージェント間でプロジェクトの決定を共有
- 02関連ノートをモデルの文脈として取得
- 03タスクキューで未完了作業を調整
- 04Obsidianでエージェントの記憶を確認・編集
MCP 対応
stdio JSON-RPCのMCPサーバーを提供し、REST APIの機能をツールとしてMCPクライアントに公開します。APIが未起動の場合、サーバーが自動で起動します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y mind-mri-second-brainBRAIN_VAULTFolder holding the markdown vault. Defaults to ~/.second-brain/vault when installed from npm.BRAIN_PORTPort of the local API server the MCP server starts and talks to (default 3747).BRAIN_KEYシークレットOptional API key; when set the local API requires it as a Bearer token.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
12掲載時のツール一覧 · 1 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| hops | integer | いいえ | 一致したノートからたどる [[wikilink]] のステップ数。0 = 一致項目のみ、1(デフォルト)= 直接リンクされたノートを追加、3 を超える値は 3 に制限されます。 |
| query | string | はい | 知りたいことを平易な言葉で入力してください。例:"why did we choose SQLite for the cache"。具体的なクエリほど、関連情報を適切に呼び出せます。 |
| maxTokens | integer | いいえ | 返されるコンテキストのトークン予算です。収まらないノートは省略されます。8000 を超える値は 8000 に制限されます。 |
詳細
🧠 自律型エージェントのセカンドブレイン — Graph-RAG メモリーコア
自律型 AI エージェントが長期記憶を共有し、調査内容を蓄積し、ワークフローを連携できる、依存関係ゼロでオフライン優先の Graph-RAG メモリーシステムです。
ファイルシステム上でObsidian Vaultとしてネイティブに動作するよう設計されており、シンプルな REST API と Javascript SDK を提供します。メモリーを相互に接続されたノード([[wikilinks]])として表現し、グラフ探索、キーワード検索、任意のセマンティック類似度、情報の新しさを単一のランキングシグナルに統合することで、LLM に的を絞ったコンテキストを抽出して提供します。ファイルやディレクトリ全体ではなく、クエリに関連するノートだけを、トークン予算内で返します。

⚡ クイックスタート(MCP)
Claude Code、Claude Desktop、Cursor、または任意の MCP クライアントに、1 行で共有可能な永続メモリーを追加できます。Node 22.5 以降が必要です。インストールや API キーは不要です。
claude mcp add second-brain -- npx -y mind-mri-second-brain
その他のクライアントでは、MCP 設定に {"mcpServers":{"second-brain":{"command":"npx","args":["-y","mind-mri-second-brain"]}}} を追加してください。ノートは ~/.second-brain/vault 内の通常の Markdown ファイルなので、Obsidian でフォルダーを開き、エージェントが記憶した内容をすべて読んだり編集したりできます。ツール一覧とオプションについては、MCP サーバーを参照してください。
セッションの例(ツールからの実際の出力。長さを短縮しています):
brain_remember title "Decision - Use SQLite for the cache", type decision,
content "We chose SQLite over Redis ... See [[Project - Atlas]]."
→ { "success": true, "id": "agents/atlas/Decision - Use SQLite for the cache", "version": 1 }
brain_recall query "what database does Atlas use and why", hops 1
→ 2 notes, ~77 tokens:
### Decision - Use SQLite for the cache [DECISION]
We chose SQLite over Redis for the local cache: zero ops, one file ...
### Project - Atlas [MEMORY] ← pulled in through the [[wikilink]]
Atlas is the internal reporting service. Stack: Node, SQLite ...
brain_node_update id "agents/atlas/Decision - Use SQLite ...", content "Update: confirmed after load test, p95 read latency 3 ms."
→ { "success": true, "mode": "append" }
Recall は、トークン予算内で関連するノートと、それらがリンクするノートだけを返します。また、指示ではなく参照データとしてモデルに提示します。
🚀 このプロジェクトの特長(ポートフォリオの見どころ)
このプロジェクトでは、高度なバックエンドエンジニアリングの原則とデータモデリングのアーキテクチャをいくつか紹介しています。
- 依存関係ゼロの Node.js バックエンド: 純粋なネイティブ Node.js ES Modules(
http、fs、path、child_process、node:sqlite、node:test)を使用して構築されています。数ミリ秒で起動し、依存関係の脆弱性連鎖に対する安全性が高く、非常にポータブルです。1.0 以降に追加されたすべての機能(セマンティック検索、重複排除、タスクキュー、メッセージング、サンドボックス実行)も、「必須の npm 依存関係は一切なし」という同じルールに従います。任意の依存要素(クラウド埋め込みキー、Docker、@huggingface/transformers)がない場合は、クラッシュするのではなく「利用不可」として適切に機能を縮退させます。 - Graph-RAG と Flat-RAG: Flat RAG システム(単純なベクトル類似度を使用)では、コンテキストが失われた、つながりのないテキストチャンクが生成されます。このエンジンは Obsidian 形式のウィキリンク(
[[Page Name]])を解析して隣接マップを構築し、アイデア間の論理的なつながりをたどります。 - Reciprocal Rank Fusion によるハイブリッド検索:
/searchと/recallは、キーワード検索(変更されていない既存のキャッシュ済み TF-IDF エンジン)と、任意のセマンティック類似度検索(キャッシュ済み埋め込みに対するコサイン類似度)を、Reciprocal Rank Fusion で融合します。これは、生のスコアを正規化せずに、比較できない独立したランキングシグナルを統合するために使われる、順位ベースの統合手法です。埋め込みプロバイダーが設定されていない場合、セマンティック検索側は空の結果を返すため、融合結果は通常の TF-IDF が返す結果と完全に一致し、従来のキーワードのみの動作と同一であることが保証されます。 - トークンエコノミー(最適化されたコンテキスト): 生のファイル構造(約 50k トークン)や任意のチャンクを LLM のコンテキストウィンドウに渡すのではなく、エージェントは
/recallを問い合わせて、カスタムのトークン上限(約 300~2,000 トークン)に収まるよう事前に構成されたコンテキストペイロードを取得し、モデルの注意力の低下を防ぎます。 - ネイティブファイルシステムのホットリロード(
fs.watch()): ファイルが編集されると(Obsidian で手動編集した場合も、API 経由でプログラムから編集した場合も)、メモリーインデックスを自動的に無効化し、リアルタイムで更新します。ネイティブのファイルシステムイベントとデバウンスタイマーを使用して構築されており、メモリー内インデックスに対するクエリを高速に保ちます。 - キャッシュ済み TF-IDF 検索エンジンの最適化: 検索を高速に保つため、バックエンドはグラフキャッシュの読み込み時に Vault の内容を事前にトークン化し、逆文書頻度(IDF)とベクトルの大きさをあらかじめ計算します。これにより、検索のたびに発生する O(N) のトークン化と正規表現解析をなくします。
- SQLite を利用したセマンティック埋め込み:
node:sqlite(Node ≥22.5 に組み込み済みで、インストールもネイティブコンパイルも不要)を使ったノード単位の任意のベクトル保存に対応します。単一の肥大化し続ける JSON オブジェクトではなく、実際にインデックス化された行ごとの読み書きとトランザクションを使用します。複数のプロバイダーから取得でき(OpenAI、Gemini)、任意でローカルモデルを最終手段として利用するため、クラウドキーのクォータが切れただけでセマンティック検索が完全に停止することはありません。 - 楽観的同時実行制御(OCC): 同時書き込みによる上書きを防ぎます。ノードには YAML フロントマターに
versionプロパティがあり、実際に更新された場合にインクリメントされます。versionを含むPATCH呼び出しでは、指定された値が現在の値と一致する必要があり、メモが同時に変更されていた場合は409 Conflictで失敗します(チェックを省略するにはversionを省略します)。 - 厳密なノードスキーマ検証: ファイルをディスクに書き込む前に、受信したペイロード(
titleのファイル名に使えない文字、typeの列挙値、importanceの範囲、tagsの形式)を検証します。タイトルはファイル名になるため、< > : " / \ | ? *と制御文字は API で拒否されます。SDK はこれらを自動的に-に正規化します。 - 読み取りと書き込みをきめ細かく制御する認証セキュリティ:
BRAIN_KEYが設定されている場合、検索、リコール、グラフ表示を含むすべてのエンドポイントで Bearer Token 認証が必須になります。テレメトリストリームのエンドポイント(/stream)では、公開 URL からの生データ露出を防ぐため、一致する?token=パラメーターが必要です。 - PII とシークレットの保護:
sdk/safeguard.jsはスタンドアロンの正規表現ベースのマスキングユーティリティです。約 20 のプロバイダーの API キー、DB 接続文字列、PEM 秘密鍵、JWT、SSN、Luhn チェック済みクレジットカード番号に対応し、プロジェクト内のどのコードパスからでも、テキストをログに記録、保存、またはそのまま返す前に呼び出せます。 - 近似重複メモリーの調整:
sdk/dedup.jsは、軽量な埋め込み類似度チェックで候補を絞り込んだ後、LLM の判定役に、類似する 2 つのメモが本当に同じ事実か(すべての詳細を保持して統合)、実質的に異なるか(両方を保持)を判断させます。エラー時はすべて処理を続行するため、重複排除の失敗が通常のメモリー書き込みを妨げることはありません。POST /dedup/scanは Vault 全体の候補を報告しますが、自動統合は行いません。 - マルチエージェント連携の基本機能: Vault を基盤とするタスクキュー(ステータスタグ、依存関係に基づくブロックと連鎖的な解除)と、エージェント間メッセンジャー(Vault ノードとしての受信箱/送信箱)に加え、Vault 内のペルソナタグ/フロントマターから読み取り専用で生成される組織図を備えています。これらは、共有可能で監査可能な Markdown ベースのタスクリストと受信箱を実現する、軽量な連携機能です。完全自律型のオーケストレーターではありません。
pendingタスクを監視して作業を実行するには、別の仕組みが必要です。 - サンドボックスでのコード実行:
POST /sandbox/executeは、ネットワークを無効化し、リソースを制限し、読み取り専用に設定したうえで、実行後に自動削除される Docker コンテナ内でコードを実行します。Docker がない場合、SANDBOX_ALLOW_LOCAL=1を明示的に設定しない限り、コードの実行を拒否します。この設定を有効にすると、キーワードのブラックリストだけで保護された隔離されていないローカルの子プロセスが実行されます。ブラックリストはセキュリティ境界ではないため、完全に信頼できる環境でのみ有効にしてください。 - 堅牢なパススコープ付き Git 同期:
sdk/git_sync.jsは、Vault フォルダー全体をステージする単純な自動コミット方式を置き換え、呼び出し元が実際に変更されたと指定したファイルだけをステージします。これにより、進行中の無関係な編集が他のユーザーのコミットに含まれることを防ぎます。また、.git/index.lockをめぐる競合を避けるため、同時書き込みを直列化してキューに入れます。 - 統合型マルチプロバイダー LLM ルーター:
sdk/llm_router.jsは、単一のインターフェースを通じて Anthropic、OpenAI 互換プロバイダー、Gemini、NVIDIA NIM、またはローカルの Ollama を呼び出します。失敗時は設定可能な優先順位に従ってフォールバックし、小型モデルがほぼ正しい JSON を出力する際によく見られる問題(文字列内のエスケープされていない制御文字)を修復します。 - MCP サーバーと CLI:
mcp/server.jsは依存関係ゼロの stdio JSON-RPC MCP サーバーで、この REST API を MCP 対応クライアント向けの MCP ツールとして公開し、API サーバーがまだ起動していない場合は自動で起動します。sdk/cli.js(npm run brain -- <command>)は、同じ API をラップして、ターミナルからすばやく利用できるようにします。 - 対話型エージェントシミュレーター UI: ダッシュボードには高機能なサイドバーフォームがあり、マルチエージェントのメモリー書き込みをシミュレートしながら、D3.js の可視化でノード、リンク、EventSource テレメトリが動的に更新される様子を確認できます。さらに、ベンダー同梱の Preact と htm で構築された 2 つ目の 組織図 タブもあります(UI アーキテクチャを参照)。
- 人間参加型のエージェント連携: メモリーは YAML フロントマター付きのプレーンな Markdown ファイル(
.md)としてシリアライズされるため、人間は同じフォルダーを Obsidian で開き、エージェントの推論を監査したり、メモを編集したり、グラフにガイドラインを直接追加したりできます。 - テストスイートと CI:
node:testベースのテストスイート(テストフレームワークへの依存もありません)が、テンポラリディレクトリ、モックしたfetch、環境変数の上書きで副作用を隔離しながら、上記のすべてのモジュールをカバーします。GitHub Actions は、mainへのプッシュ/PR ごとに Node 22.x/24.x でテストを実行し、さらにapi/、sdk/、mcp/内のすべてのファイルの構文チェックも実行します。
⚙️ 技術アーキテクチャ
graph TD
subgraph Client Environments
Agent1[Research Agent] -->|SDK: remember/recall| API[🧠 Second Brain REST API]
Agent2[Pipeline Agent] -->|SDK: remember/recall| API
Human[Human Operator] -->|Edits Notes| Obs[Obsidian Editor]
MCPClient[MCP-aware Client] -->|stdio JSON-RPC| MCP[mcp/server.js]
CLI[sdk/cli.js] -->|REST| API
MCP -->|auto-spawns / proxies| API
end
subgraph API Server
API --> Engine[Graph Engine]
Engine --> Search[Hybrid Search: TF-IDF + Semantic RRF]
Engine --> Cache[In-Memory Graph Cache]
Engine --> FS[Local FS Watcher]
API --> Tasks[Task Queue]
API --> Msg[Messenger]
API --> Org[Org Chart]
API --> Dedup[Dedup Scan]
API --> Sandbox[Sandboxed Execution]
end
subgraph Storage Layer
FS -->|Reads/Writes| Vault[(Markdown Vault)]
Search -->|Vectors| EmbedDB[(SQLite: .embeddings.db)]
Obs -->|Reads/Writes| Vault
Engine -->|Optional Async Sync| Git[Path-Scoped Git Sync]
end
subgraph LLM Layer
Dedup --> Router[LLM Router: Anthropic / OpenAI / Gemini / NVIDIA / Ollama]
end
Git -->|Auto Commit & Push| GitHub[Private GitHub Repo]
🎨 UI アーキテクチャ
このプロジェクトには、2 つのタブを備えた動的でハイテクなダッシュボードがあります。
- グラフタブ(オリジナル): D3.js (v7) と Marked.js で構築されています。力学的グラフのシミュレーション(ノードのサイズはリンク数に応じて変化し、種類ごとに色分けされます)、ノードの Markdown を読んだり、外部リンクやバックリンクをたどったりできるインタラクティブなコンテキストパネル、ライブフィルター、および
/reloadによるライブリロードを備えています。 - 組織図タブ(新規): vendored Preact + htm(
ui/preact.min.js、ui/htm.min.js— ローカルファイルを使用し、CDN もビルド手順も不要)で構築されています。htm.bind(preact.h)により、通常のタグ付きテンプレートが JSX と同じ VNode ツリーに変換され、GET /org-chartからデータを取得する実際のコンポーネントツリー(OrgMember、DepartmentCard、OrgChartView)としてpreact.renderでレンダリングされます。これは、今後このファイルに新しいビューを追加する際に推奨されるパターンです。ui/index.htmlの残りの部分(グラフタブ)を後から書き換えることはせず、意図的にバニラ JS/innerHTML のままにしています。
📡 REST API とインターフェース一覧
| メソッド | エンドポイント | ペイロード/クエリ | 説明 |
|---|---|---|---|
| GET | /health | — | サーバーの統計情報、ポート、vault のノード数とエッジ数を返します。 |
| GET | /nodes | — | プレビューを短縮した、すべてのインデックスノードの一覧を取得します。 |
| GET | /node/:id | — | 指定したノートの本文、解析済みの外向きリンク、受信バックリンクを取得します。 |
| GET | /search | ?q=query&limit=10 | キーワード検索とセマンティック検索を組み合わせたハイブリッド検索(Reciprocal Rank Fusion)を、元の TF-IDF ランキングと融合します。 |
| GET | /recall | ?q=query&hops=1 | エージェントのコアコンテキスト: ハイブリッド検索をシードとして、トークン予算内でグラフコンテキストを組み立てます。 |
| GET | /graph | — | 完全な隣接マップのノードとエッジを返します。 |
| POST | /remember | {title, content, type, agent} | 新しい Markdown ノードを vault ディレクトリにコミットします。 |
| PATCH | /node/:id | {title, content, type, tags} | 既存ファイルのテキスト内容または YAML フロントマターのメタデータを変更します(version を使った OCC)。 |
| DELETE | /node/:id | — | ディスクからノートを削除します。 |
| POST | /tasks/submit | {prompt, agents, priority, dependencies} | vault を基盤とするタスクキューにタスクを送信します。 |
| GET | /tasks | ?status=pending | タスクを一覧表示します。ステータスタグによる絞り込みも可能です。 |
| PATCH | /tasks/:id | {status, content} | タスクのステータスを更新し、依存タスクを自動的に解放して連鎖処理します。 |
| POST | /messages/send | {fromAgent, toAgent, content, subject} | エージェント間メッセージを送信します。 |
| GET | /messages/:agent | ?unread=false | エージェントの受信トレイを読み取ります。 |
| GET | /org-chart | — | ペルソナタグとフロントマターから導出した部署/リーダー構造を返します。 |
| POST | /dedup/scan | {dryRun, judge} | 重複に近いノード候補を報告します。自動マージは行いません。 |
| POST | /sandbox/execute | {code, language, timeoutMs} | コードスニペットをサンドボックス内で実行します(Docker、または制限付きのローカルフォールバックを使用)。 |
| POST | /embeddings/reindex | {} | vault のセマンティックベクトルをバックグラウンドで再計算します。 |
| GET | /type/:type, /tag/:tag, /agent/:name, /tags | — | ノードの種類、タグ、エージェントによる検索、およびすべてのタグの一覧を提供します。 |
| POST | /consolidate | {agent?, type?} | Gemini を使って memory ノートを 1 つのノートに統合し、元のノートをアーカイブします(GEMINI_API_KEY が必要です)。 |
| GET | /export | — | 完全な JSON エクスポートを返します。 |
| POST | /reload | — | メモリ内キャッシュを手動で更新します。 |
📦 SDK のクイックスタートとコード品質
クライアント SDK は、ネイティブの fetch を使用した、簡潔でモダンな Javascript で書かれています。
import { SecondBrain } from './sdk/index.js';
// Initialize Client (Reads optional BRAIN_API & BRAIN_KEY env variables)
const brain = new SecondBrain({
agent: 'pipeline-agent',
api: 'http://localhost:3747',
apiKey: process.env.BRAIN_KEY
});
/**
* Workflow Scenario: Context Recall -> Task Execution -> Memory Write
*/
async function runAutoPipeline() {
// 1. Fetch relevant context within 1 Graph Hop and 1500 token budget
const context = await brain.recall('API rate limiting design', 1, 1500);
// 2. Inject context directly into your LLM prompt
const llmPrompt = `
${context.systemPrompt}
Task: Design rate limiter middleware for backend services.
`;
const result = await myLlmClient.generate(llmPrompt);
// 3. Save learnings back to the shared memory bank for other agents
await brain.remember(result, {
title: 'Rate Limiting Middleware Specification',
type: 'research',
tags: ['infrastructure', 'security', 'rate-limit']
});
}
CLI
npm run brain -- status
npm run brain -- recall "API rate limiting design"
npm run brain -- tasks submit "Investigate rate limiting approaches" --agents=pipeline-agent
npm run brain -- org-chart
MCP サーバー
mcp/server.js は、あらゆる MCP クライアント(Claude Desktop、Claude Code、Cursor、…)に共有の永続メモリを提供する、依存関係ゼロの stdio MCP サーバーです。Node 22.5 以降が必要です。
インストール — クライアントの MCP 設定に以下を追加します(例:claude_desktop_config.json、または .cursor/mcp.json)。
{
"mcpServers": {
"second-brain": {
"command": "npx",
"args": ["-y", "mind-mri-second-brain"]
}
}
}
Claude Code の場合:claude mcp add second-brain -- npx -y mind-mri-second-brain。ネイティブの Windows(WSL ではない)では、Claude Code で npx を cmd /c でラップする必要があります:claude mcp add second-brain -- cmd /c npx -y mind-mri-second-brain。**コマンド プロンプト(cmd.exe)**から実行してください。Windows PowerShell 5.1 では -- 区切り文字が無視され、unknown option '-y' エラーが発生します(PowerShell 7 では問題ありません)。JSON 設定では、同等の指定は "command": "cmd", "args": ["/c", "npx", "-y", "mind-mri-second-brain"] です。
クローンから実行しますか?その場合は "command": "node", "args": ["/path/to/repo/mcp/server.js"] を使用します。
初回実行。 最初のツール呼び出し時に、MCP サーバーはローカル API(api/server.js、127.0.0.1 のみでバインド)をバックグラウンドで起動し、そのまま実行し続けます。ノートはプレーンな Markdown ファイルです。npm からインストールした場合は ~/.second-brain/vault、クローンでは ./vault に保存されます。BRAIN_VAULT で変更できます。任意の設定:BRAIN_PORT(デフォルトは 3747)および BRAIN_KEY(Bearer トークンを必須にします)。
| ツール | 目的 | 書き込み? |
|---|---|---|
brain_recall | クエリに対する Graph-RAG コンテキスト(wikilink のホップ数、トークン予算) | いいえ |
brain_search | キーワード検索(設定されている場合はセマンティック検索も含む)のランキング結果 | いいえ |
brain_node_get | アウトリンクとバックリンクを含む 1 件のノート | いいえ |
brain_node_update | 既存のノートへの追記または置換(バージョンチェックにより、同時に書き込んでも編集内容が失われません) | はい |
brain_remember | 新しいノートを保存(新しいファイルを作成し、既存のファイルは上書きしません) | はい |
brain_tasks_submit / brain_tasks_list / brain_tasks_update | 共有 Markdown タスクキュー:タスクの追加(依存関係を含む)、保留中の作業の検索、タスクの引き受けと結果を記録した完了。タスクを完了すると、それによってブロックされていたタスクが解放されます | submit、update |
brain_messages_send / brain_messages_get / brain_messages_mark_read | エージェント間の受信トレイ | send、mark read |
brain_health | サーバーと保管庫の統計 | いいえ |
読み取り専用ツールには、MCP の readOnlyHint アノテーションが付与されています。ノートを削除するツールはありません。既存のテキストを上書きできるのは brain_node_update のみ(replace モードの場合)なので、これだけが破壊的操作としてマークされ、クライアントは実行前に確認を求めます。
🔒 セキュリティと認証の設定
デフォルトでは、認証が無効のローカル/開発モードでサーバーが実行されます。クラウドへのデプロイ、マルチエージェントネットワーク、または REST API エンドポイントを公開する場合は、Bearer トークン認証を必ず有効にしてください。
- 秘密鍵を設定する:
システムまたはサーバーに
BRAIN_KEY環境変数を定義します:export BRAIN_KEY="your-highly-secure-secret-token" - 保護を有効化する:
BRAIN_KEYを設定すると、すべての変更を伴うエンドポイント(POST /remember、POST /reload、POST /consolidate、PATCH /node/:id、DELETE /node/:id、タスク/メッセージ/重複排除/サンドボックスの各エンドポイントなど)が未認証のリクエストをブロックし、401 Unauthorizedを返します。 - Authorization ヘッダー:
リクエストには、
Authorizationヘッダーにトークンを含める必要があります:Authorization: Bearer your-highly-secure-secret-token - クライアント SDK の設定:
Javascript クライアント SDK の初期化時に、
apiKey設定オプションを使ってトークンを渡します:const brain = new SecondBrain({ api: 'http://localhost:3747', apiKey: process.env.BRAIN_KEY // Or pass the token directly }); - 安全なデフォルト設定: サーバーは
127.0.0.1にバインドし、ワイルドカード CORS ヘッダーを返さず、リクエスト本文のサイズに上限を設け、絶対ファイルシステムパスを返さず、ノートへの書き込みと静的ファイルへのアクセスをvaultとui/の範囲内に制限します。ダッシュボードはすべてのノートテキストをエスケープし、レンダリングされた Markdown をサニタイズします。 - PII/秘密情報の保護:
sdk/safeguard.jsのsanitizeContent()は、永続化またはテキストのエコー出力の前に、API キー、DB URL、PEM キー、JWT、SSN、クレジットカード番号をマスキングしたいあらゆるコードパス(カスタムエンドポイント、取り込みパイプライン、ログ記録)で利用できます。
🧩 オプション機能(段階的な縮退)
以下の各機能は追加機能であり、オプトイン方式です。何も設定しない場合、サーバーは依存関係ゼロの通常の TF-IDF/グラフメモリストアとして動作し、これがデフォルトの動作です。
| 機能 | 設定方法 | 未設定の場合の動作 |
|---|---|---|
| セマンティック検索の検索系統、重複排除の類似度ゲート | OPENAI_API_KEY および/または GEMINI_API_KEY(またはローカルの最終手段モデルとして @huggingface/transformers をインストール) | セマンティック検索系統は候補を返しません。検索/想起はキーワードのみの TF-IDF と同じです。 |
| LLM による重複判定、LLM ルーター呼び出し | ANTHROPIC_API_KEY、OPENAI_API_KEY/OPENROUTER_API_KEY、GEMINI_API_KEY、NVIDIA_API_KEY のいずれか、または OLLAMA_HOST で指定されたローカル Ollama | プロバイダーチェーンをたどって Ollama にフォールバックします。接続可能なものがない場合、呼び出し元(重複判定など)は処理を続行します。 |
| Docker によるサンドボックス実行 | 起動中の Docker デーモン | /sandbox/execute はエラーを返します。隔離されないローカル環境へのフォールバックを許可するには、SANDBOX_ALLOW_LOCAL=1 を設定してください(信頼できる環境のみ)。 |
| Git の自動同期 | AUTO_GIT_SYNC=true | 何も行われません。コミットもプッシュもされません。 |
環境設定
| 変数 | 説明 | デフォルト |
|---|---|---|
BRAIN_PORT | REST API がリッスンするポートです。 | 3747 |
BRAIN_HOST | REST API がバインドするアドレスです。デフォルトではループバックのみです。0.0.0.0 に設定する場合は、必ず BRAIN_KEY も設定してください。 | 127.0.0.1 |
BRAIN_VAULT | Vault フォルダー(存在しない場合は作成されます)。 | ./vault |
BRAIN_ALLOW_ANY_VAULT | MCP サーバーのみ。デフォルトでは、すでに稼働している Second Brain の Vault が想定と異なる場合(または古すぎて確認できない場合)、その使用を拒否するため、ノートが誤った Vault に保存されることはありません。サーバーの使用を許可するには 1 に設定してください。 | 未設定 |
BRAIN_CORS_ORIGIN | このオリジンからのクロスオリジンのブラウザーアクセスを許可します。デフォルトでは無効です。同梱のダッシュボードは同一オリジンで動作するため、設定は不要です。 | 未設定 |
BRAIN_MAX_BODY_BYTES | リクエスト本文の最大サイズ(超過すると 413)。 | 2097152 |
SANDBOX_ALLOW_LOCAL | 1 にすると、Docker なしで /sandbox/execute を実行できます(隔離されません。信頼できる環境のみ)。 | 未設定 |
BRAIN_KEY | オプション。設定すると、/health、?token= を受け取る /stream、および静的ダッシュボードを除くすべてのエンドポイントで、一致するベアラートークンが必要になります。 | "" |
AUTO_GIT_SYNC | オプション。true にすると、サーバーは変更を GitHub にコミットしてプッシュします(パスの範囲を限定し、処理を直列化します。sdk/git_sync.js を参照)。 | false |
OPENAI_API_KEY / GEMINI_API_KEY | オプション。セマンティック検索/重複排除の埋め込み検索系統を有効にします。 | 未設定 |
ANTHROPIC_API_KEY / OPENROUTER_API_KEY / NVIDIA_API_KEY / OLLAMA_HOST | オプション。LLM ルーターのプロバイダーチェーンを設定します(sdk/models_config.js)。 | 未設定 / http://localhost:11434 |
LLM_PROVIDER_ORDER | オプション。ルーターのフォールバック優先順位を上書きします。 | anthropic,nvidia,gemini,openai,ollama |
🛠️ 設定とセットアップ
必要条件
- Node.js(>= 22.5.0 —
sdk/embeddings.jsは、これ以降のバージョンで利用可能な組み込みのnode:sqliteモジュールを使用します) - Web ブラウザー(ビジュアライザー UI 用)
インストール
リポジトリをクローンします:
git clone https://github.com/ara-5/mind-mri-agent-second-brain.git
cd mind-mri-agent-second-brain
サーバーの起動
# Production start
npm start
# Development watch mode
npm run dev
ビジュアライザー UI の起動
npm run ui
(稼働中の API サーバーが配信するダッシュボードを開きます。先に npm start を実行してください。ダッシュボードは API と同一オリジンのため、CORS の設定は不要です。)
テストの実行
npm test
node:test の全テストスイート(test/*.test.js)を実行します。テストフレームワークへの依存はなく、一時ディレクトリ、モックした fetch、環境変数の上書きによって副作用を分離します。CI(.github/workflows/ci.yml)では、main へのプッシュ/PR ごとに Node 22.x/24.x で実行されます。
Vault のマイグレーション
1 ファイルにつき 1 つのマイグレーションとし、冪等性を保ち、データを捏造しないという規約については migrations/README.md を参照してください。最初の実際のマイグレーション(曖昧さのないペルソナタイトルのキーワードから組織図のリード担当者を割り当てます)については、migrations/001-assign-department-leads.mjs を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。