Newer
Older
TelosDB / document / overview.md
@楽曲作りまくりおじさん 楽曲作りまくりおじさん 8 days ago 2 KB Add comprehensive test suite (35 tests) and update journal

SQLite Vector MCP Server(Electron + Bun)

概要

このプロジェクトは、Electron で常駐する MCP サーバーを立ち上げ、SQLite + sqlite-vec を使ってベクトル検索を提供します。MCP への接続は SSE(Server-Sent Events)で行い、埋め込み生成とテキスト生成は llama.cpp を利用します。

構成

  • Electron: 常駐アプリ(トレイ)としての実行基盤
  • MCP Server: SSE でツールを提供
  • DB: better-sqlite3 + sqlite-vec
  • ORM: knexitems テーブルの操作に使用)
  • LLM: 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

ER図

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

API 定義(REST / SSE)

SSE 接続

  • GET /sse
    • MCP の SSE セッションを開始します。

MCP メッセージ送信

  • POST /messages
    • MCP のリクエスト/レスポンスメッセージを送信します。
    • SSE セッションが未接続の場合は 400 を返します。

注: /messages のペイロードは MCP 仕様に準拠します。

REST(追加予定)

現在は MCP 経由のツール呼び出しが主です。REST API を追加する場合は以下のような構成になります。

  • POST /api/items

    • テキストから埋め込みを生成して保存
    • Body: { "content": "..." }
  • POST /api/search

    • テキストから埋め込みを生成して検索
    • Body: { "content": "..." }

MCP 設定例

mcp.json などに以下を設定します。

{
  "mcpServers": {
    "sqlite-vector-electron": {
      "url": "http://localhost:3000/sse"
    }
  }
}