このプロジェクトは、Electron で常駐する MCP サーバーを立ち上げ、SQLite + sqlite-vec を使ってベクトル検索を提供します。MCP への接続は SSE(Server-Sent Events)で行い、埋め込み生成とテキスト生成は llama.cpp を利用します。
better-sqlite3 + sqlite-vecknex(items テーブルの操作に使用)llama.cpp(埋め込み生成・テキスト生成)src/db.js: DB 接続・初期化src/mcp-tools.js: MCP ツール定義src/mcp-handlers.js: ツールの処理src/mcp-server.js: SSE と MCP の接続src/main.js: Electron 起動と常駐処理src/llama-client.js: llama.cpp API クライアントadd_item_text: テキストから埋め込みを生成して保存add_item: ベクトルを直接指定して保存search_text: テキストから埋め込みを生成して検索search_vector: ベクトルで検索llm_generate: llama.cpp でテキスト生成graph TD
A[MCP Client] -->|SSE| B[Express /sse]
B --> C[MCP Server]
C --> D{Tool Handler}
D -->|embedding| L[llama.cpp]
D -->|add_item| E[knex: items]
D -->|add_item| F[sqlite-vec: vec_items]
D -->|search_vector| F
F --> G[Result]
E --> G
G --> C
C --> B
B --> A
erDiagram
items {
INTEGER id PK
TEXT content
TEXT path
TEXT created_at
TEXT updated_at
}
vec_items {
INTEGER id PK
FLOAT embedding[VEC_DIM]
}
items ||--|| vec_items : "id = id"
.env に以下を設定します。
LLAMA_CPP_BASE_URL=http://127.0.0.1:8080 LLAMA_CPP_EMBEDDING_MODEL= LLAMA_CPP_MODEL= VEC_DIM=3
bun start
/sse
/messages
注:
/messagesのペイロードは MCP 仕様に準拠します。
現在は MCP 経由のツール呼び出しが主です。REST API を追加する場合は以下のような構成になります。
POST /api/items
{ "content": "..." }POST /api/search
{ "content": "..." }mcp.json などに以下を設定します。
{
"mcpServers": {
"sqlite-vector-electron": {
"url": "http://localhost:3000/sse"
}
}
}
問題:
knex は標準的な SQL クエリビルダーですsqlite-vec 拡張で提供される MATCH 演算子には対応していませんMATCH 演算子がエスケープされてしまい、検索が機能しません現在の解決方法:
// ベクトル検索は db.prepare() + raw SQL で実行
const results = db.prepare(`
SELECT ... FROM vec_items v
WHERE embedding MATCH ? // ← sqlite-vec の MATCH 演算子
ORDER BY distance
LIMIT 5
`).all(new Float32Array(embedding));
// 通常のテーブル操作は knex で実行
const insertIds = await knexDb("items").insert({ content, path });
ベストプラクティス:
vec_items): db.prepare() + raw SQL を使用するitems): knex で効率的に実行するsqlite-vec は現在 alpha 版 (0.1.7-alpha.2)