Lancelot について
Lancelotは、ローカルのLanceDBデータベースを検索・取得するMCPサーバーです。OpenAI APIキーがあればベクトル検索を行い、なければテキスト照合を使います。
主な機能
- 01短い抜粋付きの順位検索
- 02文字数上限内でのコンテキスト取得
- 03ベクトル検索とテキスト検索
- 04データベースへの読み取り専用アクセス
- 05stdioとStreamable HTTPのトランスポート
活用シーン
- 01MCPクライアントからローカル文書を検索
- 02質問に関連するチャンクをコンテキストとして取得
MCP 対応
検索、コンテキスト取得、データベース状態、バージョンのツールをMCPクライアントに提供します。stdioとStreamable HTTPに対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @ayerselectronics/lancelotLANCEDB_PATHFolder that holds the LanceDB database. It must exist; Lancelot only reads it.OPENAI_API_KEYシークレットEnables vector search by sending query text to OpenAI to compute embeddings. Without it, search is text only and nothing leaves the machine.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Lancelot
Lancelot は、ローカルの LanceDB データベースに対する検索および取得クエリに回答する MCP サーバーです。API キーが設定されている場合はベクトル検索に OpenAI の埋め込みを使用し、設定されていない場合はプレーンテキストの マッチングを使用します。
データベースフォルダーを読み込みますが、書き込みは行いません。stdio 経由の MCP、および --http を指定した Streamable HTTP に対応しています(HTTP モードを参照)。
Ayers のドキュメントを対象とする一般公開の読み取り専用インスタンスは https://mcp.ayers.repair/lancelot にあります。Streamable HTTP に対応する MCP クライアントであれば、この URL を使用できます。ドキュメントは lancelot-index を使ってテーブルに構築されます。
ツール
| ツール | 説明 |
|---|---|
lancedb_search | テーブルを検索し、順位付けされた結果と短い抜粋を返します。 |
lancedb_query | 質問に関連するチャンクを取得し、文字数上限に合わせて切り詰めたコンテキストのブロックとして返します。 |
lancedb_status | 接続状況、行数を含むテーブル一覧、埋め込みが利用可能かどうかを報告します。 |
lancedb_version | Lancelot のバージョン、基盤となる SDK の MCP プロトコルバージョン、および有効な機能を報告します。 |
lancedb_search
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
query | string | はい | 検索テキストです。 |
limit | number | いいえ | 結果の最大件数です。1~200 を指定します。デフォルトは LANCEDB_DEFAULT_LIMIT で、20 です。 |
searchType | vector、text または auto | いいえ | vector は OpenAI でクエリを埋め込みます。text はテキスト列内の単語を照合します。auto(デフォルト)は、API キーが設定されている場合はベクトル検索を使用し、設定されていない場合はテキスト検索を使用します。 |
table | string | いいえ | 検索するテーブルです。デフォルトは LANCEDB_TABLE です。 |
textColumn | string | いいえ | テキストを格納する列です。デフォルトは LANCEDB_TEXT_COLUMN です。 |
vectorColumn | string | いいえ | ベクトルを格納する列です。デフォルトは LANCEDB_VECTOR_COLUMN です。 |
応答は JSON です。searchType フィールドには、結果を生成した検索方法である vector または
text が設定されます。指定した検索方法と異なる場合は、その理由(API キーがない、ベクトル
検索が失敗した、または auto で結果が見つからなかった)が note フィールドに記載されます。ベクトル検索の結果では、score は距離を表すため、値が小さいほど類似度が高くなります。テキスト検索の結果では、score は結果内で見つかったクエリ語の割合を表すため、値が大きいほど適合度が高くなります。
テキスト検索では、クエリ内の単語を大文字と小文字を区別せずに部分文字列として照合します。全文検索インデックスは使用せず、語幹処理も行いません。
lancedb_query
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
question | string | はい | コンテキストを取得するための質問です。 |
contextBudget | number | いいえ | コンテキストの最大文字数です。デフォルトは LANCEDB_CONTEXT_BUDGET で、8000 です。 |
warmStart | boolean | いいえ | question への回答の代わりに、プロジェクトの概要を取得します。デフォルトは false です。 |
table | string | いいえ | クエリ対象のテーブルです。デフォルトは LANCEDB_TABLE です。 |
limit | number | いいえ | 取得するチャンクの最大数です。1~200 を指定します。デフォルトは LANCEDB_DEFAULT_LIMIT です。 |
応答は Markdown ブロックです。ヘッダー(モード、検索方法、クエリ)に続いて、各チャンクのセクションにタイトル、ソース、テキストが含まれます。上限を超えるチャンクは省略され、ブロックに省略された件数が記載されます。
lancedb_status
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
verbose | boolean | いいえ | 各テーブルの列名を含めます。デフォルトは false です。 |
lancedb_version
パラメーターはありません。
テーブルのレイアウト
Lancelot は、テキスト列(デフォルトでは text)からテキストを読み込みます。行に title がある場合はタイトルとして読み込み、chunkSource、docSource、または path がある場合はソースとして読み込みます。前の 2 つは AnythingLLM が書き込むレイアウトで、path は lancelot-index が書き込むものです。その他の列は metadata として返されます。ベクトル検索には、EMBEDDING_MODEL と同じモデルで作成されたベクトルが必要です。
インストール
Claude Code MCP ドキュメントに記載されている stdio 形式を使う Claude Code:
claude mcp add --env LANCEDB_PATH=/path/to/db --env OPENAI_API_KEY=... --transport stdio lancelot -- npx -y @ayerselectronics/lancelot
--transport stdio が最後の --env とサーバー名の間に置かれているのは意図的です。CLI は --env の直後に続く名前を、別の変数として読み取るためです。-- 以降はすべてサーバーを実行します。
テキスト検索のみの場合は、--env OPENAI_API_KEY=... を省略してください。
その他の MCP クライアントでは、同じコマンドを mcpServers の設定に指定します:
{
"mcpServers": {
"lancelot": {
"command": "npx",
"args": ["-y", "@ayerselectronics/lancelot"],
"env": {
"LANCEDB_PATH": "/path/to/db",
"OPENAI_API_KEY": "sk-..."
}
}
}
}
インストールリンク
以下のいずれかをブラウザーまたはコマンドラインで開き、サーバーをエディターに追加します。その後、LANCEDB_PATH にデータベースのフォルダーを設定してください。
- VS Code:
vscode:mcp/install?%7B%22name%22%3A%22lancelot%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22%40ayerselectronics%2Flancelot%400.3.1%22%5D%2C%22env%22%3A%7B%22LANCEDB_PATH%22%3A%22%2Fpath%2Fto%2Fdb%22%7D%7D - Cursor:
cursor://anysphere.cursor-deeplink/mcp/install?name=lancelot&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsIkBheWVyc2VsZWN0cm9uaWNzL2xhbmNlbG90QDAuMy4xIl0sImVudiI6eyJMQU5DRURCX1BBVEgiOiIvcGF0aC90by9kYiJ9fQ==
リンクの形式は、VS Code MCP ガイドおよびCursor のインストールリンクに関するドキュメントに基づいています。
レジストリ
MCP レジストリの識別子:io.github.ayers-software-repair/lancelot。
セットアップコマンド
lancelot-init はデータベースのフォルダーと OpenAI API キーを尋ね、それらを次回以降の実行用に保存します。キーは keytar を通じてオペレーティングシステムのキーチェーンに保存されます。keytar が利用できない場合は、暗号化されたファイルに保存されます。npx -p @ayerselectronics/lancelot lancelot-init で実行してください。環境変数は保存された値を上書きします。
HTTP モード
npx -y @ayerselectronics/lancelot --http # http://127.0.0.1:3000/mcp
npx -y @ayerselectronics/lancelot --http 8080
npx -y @ayerselectronics/lancelot --http 8080 --host 0.0.0.0 # all interfaces
--http を指定しない場合、サーバーはこれまでどおり stdio で動作します。指定すると、サーバーは Lancelot の構築元である SDK のプロトコルバージョン、MCP 2025-06-18 のストリーム可能な HTTP トランスポートで通信します。--http には任意でポートを指定できます(デフォルトは 3000)。仕様の推奨どおり、--host で別のアドレスを指定しない限り、サーバーは 127.0.0.1 にバインドします。エンドポイントは /mcp です。それ以外のパスは 404 になります。
- オリジン。 仕様では、サーバーは
Originヘッダーを検証する必要があります。LANCELOT_ALLOWED_ORIGINSに含まれていないOriginを伴うリクエストは 403 になります。この変数が設定されていない場合、Originを伴うすべてのリクエストが 403 になります。Originヘッダーのないリクエストはブラウザーからのものではないため許可されます。SDK 自体のオリジンチェックはそうしたリクエストを拒否するため、Lancelot が独自にチェックします。 - ホスト。
LANCELOT_ALLOWED_HOSTSには、DNS リバインディング対策として、呼び出しを許可するHostヘッダーの値を列挙します。ループバックアドレスへのバインド時に設定されていない場合、デフォルトは127.0.0.1:<port>、localhost:<port>、[::1]:<port>です。--host 0.0.0.0を指定し、設定されていない場合はHostヘッダーはチェックされず、標準エラー出力に警告が表示されます。許可リストにないHostを伴うリクエストは 403 になります。 - ステートレス。 セッション ID は発行されません。各 POST リクエストで専用の MCP サーバーとトランスポートが作成され、レスポンスの終了時に閉じられ、1 つの JSON オブジェクトを返します。
GET(任意のイベントストリーム)とDELETE(セッションの終了)は、仕様で許可されているAllow: POSTヘッダー付きの 405 を返します。 - 制限。 64 KB を超える本文は 413 になります。JSON ではない本文は 400 になります。
- プロトコルバージョン。
MCP-Protocol-Versionヘッダーは SDK によってチェックされます。サポートされていないバージョンは 400 になり、ヘッダーがない場合は仕様のとおり 2025-03-26 として扱われます。
どちらの変数も、たとえば LANCELOT_ALLOWED_ORIGINS=https://app.example,https://other.example のように、カンマ区切りのリストを指定します。HTTP モードには認証機能がありません。ツールは読み取り専用ですが、ネットワークに公開するサーバーは、認証機能を備えたものの背後に配置してください。
AWS Lambda
dist/lambda.js は、payload format 2.0 を使用する API Gateway HTTP API 向けに handler(event) をエクスポートします。イベントを SDK のトランスポートが想定するリクエストに変換し、{ statusCode, headers, body } を返します。LANCEDB_PATH、LANCELOT_BASE_PATH(エンドポイントを提供するパス。例:/lancelot。未設定の場合はすべてのパスで提供)と、2 つの許可リスト用変数を読み取ります。データベース接続は初回の呼び出し時に開かれ、ウォーム状態の呼び出しでは再利用されます。この関数が書き込みに使用できるのは /tmp のみで、Lancelot はそこに独自の設定ファイルを保持します。
Dockerfile は、arm64 向けの AWS Node.js 24 ベースイメージを使用してコンテナイメージをビルドし、ハンドラーには dist/lambda.handler を指定します。先に dist をビルドしてください。
docker buildx build --platform linux/arm64 --provenance=false -t lancelot-lambda .
ドキュメントをインデックス化する
lancelot-index は、.md、.txt、.html ファイルを含むフォルダーから、サーバーが読み取るテーブルを作成します。
npx -p @ayerselectronics/lancelot lancelot-index ./docs ./db
npx -p @ayerselectronics/lancelot lancelot-index ./docs ./db --table documents
フォルダーとそのサブフォルダーをたどり(名前がドットで始まるものは除外)、HTML をテキストに変換し、段落の区切りで各ファイルを約 1,200 文字のチャンクに分割します。それより長い段落は空白で区切って分割します。各チャンクは { id, path, title, text } の行になります。id は相対パスとチャンク番号、path は相対パス、title はファイル内の最初の Markdown 見出し、またはファイル名です。ベクトルはないため、検索はテキスト検索です。
--table はテーブル名を指定します(デフォルトは documents)。指定したテーブルが存在する場合、このコマンドはテーブルを置き換えるため、再実行するとフォルダーの内容からテーブルが再構築されます。データベースに書き込むのは、このパッケージの中でこの部分だけです。サーバーがデータベースに書き込むことはありません。その後、LANCEDB_PATH をデータベースフォルダーに設定してください。
環境変数
設定は、環境変数、lancelot-init が書き込むファイル、デフォルト値の順に読み込まれます。空、または空白のみの変数は未設定として扱われます。空の任意値を代入する MCP クライアントは空文字列を渡しますが、Lancelot はその変数が存在しない場合と同じように動作します。OpenAI クライアントは作成されず、検索はテキストのみとなり、エラーとしてログに記録されることもありません。
| 変数 | デフォルト | 意味 |
|---|---|---|
LANCEDB_PATH | なし | LanceDB データベースフォルダーです。ツールの動作に必須です。フォルダーが存在している必要があり、Lancelot が作成することはありません。 |
LANCEDB_TABLE | documents | 呼び出しでテーブルが指定されていない場合に使用するテーブルです。 |
LANCEDB_TEXT_COLUMN | text | テキストを格納する列です。 |
LANCEDB_VECTOR_COLUMN | vector | ベクトルを格納する列です。 |
LANCEDB_DEFAULT_LIMIT | 20 | 呼び出しで limit が設定されていない場合に返す結果数です。 |
LANCEDB_CONTEXT_BUDGET | 8000 | 呼び出しで contextBudget が設定されていない場合に lancedb_query が返すコンテキストの文字数です。 |
OPENAI_API_KEY | なし | ベクトル検索を有効にします。未設定の場合は、次に認証情報ストアを確認します。 |
EMBEDDING_MODEL | text-embedding-ada-002 | クエリの埋め込みに使用する OpenAI モデルです。 |
EMBEDDING_DIMENSIONS | 1536 | lancedb_status が報告する値です。OpenAI には送信されません。 |
LANCELOT_LOG_LEVEL | info | error、warn、info、http、verbose、debug、silly のいずれかです。 |
LANCELOT_ALLOWED_ORIGINS | なし | HTTP モード:呼び出しを許可する Origin 値をカンマ区切りで指定します。HTTP モードを参照してください。 |
LANCELOT_ALLOWED_HOSTS | ポート上のループバック名 | HTTP モード:呼び出しを許可する Host ヘッダー値をカンマ区切りで指定します。 |
LANCELOT_BASE_PATH | すべてのパス | Lambda のみ:エンドポイントを提供するパス。例:/lancelot。 |
標準出力
MCP stdio トランスポート では、サーバーは有効な MCP メッセージのみを標準出力に書き込み、ログは標準エラー出力に書き込んでもよいと定められています。 Lancelot はこの仕様に従っています。
- すべてのログレベルを標準エラー出力に書き込みます。ロガーのトランスポートは、
stderrLevelsに記載された 7 つすべてのレベルを扱う winston の Console トランスポート 1 つです。 - サーバーのエントリーポイントは、
console.log、console.info、console.debugの出力先を標準エラー出力に設定しているため、出力するライブラリがあってもストリームは破損しません。 - サーバーはクライアントが stdin を閉じるまで読み込み、その後終了します。
HTTP モードでも同じルールを守り、標準出力には何も書き込みません。
lancelot-init と lancelot-index は標準出力に書き込みます。これらはターミナルの利用者と対話するものであり、サーバーとして起動されることはありません。
読み取り専用
4 つのツールはテーブルを開いてクエリを実行します。サーバーが実行するコードは、テーブルの作成、行の追加・更新・削除、インデックスの構築を行いません。また、パスが誤っていてもサーバーはデータベースフォルダーを作成しません。src にある唯一の例外は、テーブルを構築する別個のコマンド src/bin/lancelot-index.ts です(ドキュメントのインデックスを作成するを参照)。サーバーがこれをインポートすることはありません。
tests/readonly.test.ts は、ソースの残りの部分にこれらの呼び出しがないかをスキャンします。
Lancelot は独自の設定と認証情報をユーザーごとの設定ディレクトリに保存し、データベースフォルダーには保存しません。
プライバシー
OPENAI_API_KEY が設定されている場合、埋め込みを計算するためにクエリテキストが OpenAI に送信されます。キーが設定されていなければ、マシンの外にデータが送信されることはありません。
プライバシーポリシーと 利用規約:ホストされたエンドポイントが受け取る情報を含む、完全な説明です。
開発
npm ci
npm run check # typecheck, lint, test, build
Node 20 以降が必要です。CONTRIBUTING.md を参照してください。
ライセンス
Apache-2.0。LICENSE と NOTICE を参照してください。
Ayers Electronics が公開しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。