概要
ナレッジベース フェーズ1は、FastAPI、SQLite、ローカルファイルシステムストレージで構築された、実用最小限のファイルナレッジベースです。認証付きドキュメント管理、ネストされたフォルダー、ブラウザー内でのローカルプレビュー、メタデータとタグ、管理者向けツール、監査情報、Model Context Protocol(MCP)を介したAIエージェント向けの読み取り専用アクセスをサポートします。
このフェーズは意図的に軽量化されています。Docker、PostgreSQL、MinIO、LibreOffice、ONLYOFFICE、その他の稼働中のデータベースサービスは必要ありません。PostgreSQLとオブジェクトストレージへの移行は、後のフェーズで行います。
プロジェクトが提供する機能
- 管理者によるユーザー作成、ログイン、JWT認証。
- ネストされたフォルダーとパンくずナビゲーションを備えた公開ナレッジベース。
- フォルダー単位のドキュメント一覧表示、単一ファイルのアップロード、バッチアップロード。
- PDF、テキスト、Markdown、HTML、画像、PowerPoint、Word、Excelファイルのサポート。
- ドキュメントのメタデータ、タグ、所有者、アップロードユーザーの情報。
- 元ファイルのプレビューとダウンロード。
- テキスト、Markdown、PDF、DOCX、XLSX、PPTX、画像のアプリ内閲覧。
- 旧形式のDOC、XLS、PPTファイルに対するベストエフォートのテキスト抽出。
- 所有者のみが行えるドキュメント編集、論理削除、復元、フォルダー名の変更、空フォルダーの削除。
- 削除したドキュメント用のごみ箱。
- スコープをまたいだドキュメントとフォルダーのコピー。再帰的なフォルダーコピーと物理ストレージの複製を含みます。
- 管理者のみが利用できるユーザー管理、監査ログ、MCP呼び出しログ。
- 読み取り専用REST API、自動生成されたOpenAPIドキュメント、MCP統合。
ストレージの仕組み
アプリケーションはbackend/data/配下に実行時ファイルを作成します。SQLiteデータベースはbackend/data/knowledge_base.dbとして保存され、アップロードされたファイルと生成されたMarkdownファイルはbackend/data/storage/配下に配置されます。
ローカルストレージにはパストラバーサル対策が含まれています。既存のDocker Compose設定は、後のPostgreSQLおよびオブジェクトストレージへの移行を目的としており、このフェーズでは必要ありません。
バックエンドをインストールする
1. 環境ファイルを作成する
PowerShellを開き、リポジトリのbackendディレクトリに移動して、ルート環境テンプレートをbackend/.envにコピーします。
cd backend
Copy-Item ..\.env.example .env運用設定は.env.example、backend/app/core/config.py、およびscripts/配下のPowerShell制御ファイルで定義されています。
2. Python仮想環境を作成する
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtこれらのコマンドはbackendディレクトリで実行します。仮想環境を有効にすると、プロジェクトのパッケージをグローバルなPythonインストール環境から分離できます。
3. SQLiteを初期化する
python -m app.db.init_dbこのコマンドは、必要なSQLiteテーブルを初期化または再作成します。テーブルの再作成は既存データに影響する可能性があるため、ドキュメントの保存を開始した後は慎重に扱ってください。
4. FastAPIを起動する
uvicorn app.main:app --reload開発サーバーはhttp://127.0.0.1:8000で利用できるようになります。--reloadオプションを指定すると、ソースファイルの変更時にアプリケーションが自動的に再読み込みされます。
5. APIドキュメントを開く
http://127.0.0.1:8000/docsにアクセスして、自動生成されたOpenAPIエンドポイントを確認・試行できます。
インストールを確認する
テストを実行するには、バックエンドディレクトリをPYTHONPATHに設定する必要があります。Windowsのコマンドプロンプトでは、次を実行します。
set PYTHONPATH=.
python -m pytestPowerShellでは、次を使用します。
$env:PYTHONPATH = "."
python -m pytestリポジトリには、サービスの起動、再起動、停止、状態確認を行うためのPowerShell制御ファイルもscripts/配下に用意されています。
REST APIで認証する
ユーザーは管理者が作成します。アカウントを取得したら、ユーザー名とパスワードをログインエンドポイントに送信してください。レスポンスには、認証済みリクエストに必要なトークンが含まれます。
$body = @{
username = "demo"
password = "password-123"
} | ConvertTo-Json
$response = Invoke-RestMethod `
-Method Post `
-Uri http://127.0.0.1:8000/api/v1/auth/login `
-ContentType "application/json" `
-Body $body
$response返されたアクセストークンをコピーし、Bearer認証情報として使用します。トークンの権限は、認証されたユーザーの本人情報とロールに従います。
ドキュメントをアップロードする
アップロードエンドポイントはマルチパートフォームデータを受け付けます。ナレッジベースID、任意のタグ、ファイル、Bearerトークンを指定します。
$token = "<access_token>"
$knowledgeBaseId = 1
curl.exe `
-X POST `
"http://127.0.0.1:8000/api/v1/documents/upload" `
-H "Authorization: Bearer $token" `
-F "knowledge_base_id=$knowledgeBaseId" `
-F "tags=制度,测试" `
-F "file=@D:\path\to\guide.txt"このプロジェクトは、個別アップロードとバッチアップロードの両方をサポートします。アップロードされた元ファイルはローカルストレージに保持され、対応するコンテンツはアプリ内リーダーで開くことができます。
フォルダーを作成して使用する
フォルダーエンドポイントにナレッジベースIDと名前をPOSTして、フォルダーを作成します。
$body = @{
knowledge_base_id = 1
name = "实验方案"
} | ConvertTo-Json
Invoke-RestMethod `
-Method Post `
-Uri http://127.0.0.1:8000/api/v1/folders `
-Headers @{ Authorization = "Bearer $token" } `
-ContentType "application/json" `
-Body $body特定のフォルダーにアップロードするには、マルチパートアップロードフォームにfolder_idを追加します。Webインターフェースでは、フォルダーを選択すると自動的に追加されます。
ナレッジベースセレクターのデフォルトは全部で、「すべて」を意味します。このビューには、すべての公開ナレッジベースにあるルートドキュメントとフォルダーが表示されます。フォルダーを作成するときは、ダイアログで保存先のナレッジベースを選択してください。「すべてのナレッジベース」ビューからアップロードすると、フォルダーを選択していない限り、最初に利用可能なナレッジベースが使用されます。
ブラウザー上のローカルプレビューを理解する
フロントエンドは認証済みAPIを通じてファイルを取得し、ブラウザーのメモリ上に保持してローカルでレンダリングします。DOCX、PPTX、XLS、XLSXにはvue3-office-preview、PDFには@vue3-office/vue-pdf、Markdownには@deot/docs-markdownを使用します。PPTXのレンダリングには、同梱のpptx-rendererを使用します。
この方式では、LibreOffice、ONLYOFFICE、Docker、PythonのドキュメントプレビューSDKは必要ありません。元のファイルはローカルストレージに保存されたままです。Markdownの抽出と、従来形式の.doc、.xls、.pptファイルに対するフォールバック処理は、引き続きバックエンドの責任です。
MCPでAIエージェントを接続する
リポジトリには、読み取り専用の独立したMCPサービスが含まれています。このサービスは、FastAPIアプリケーションのSQLiteデータベース、ローカルストレージ、JWTシークレット、ドキュメントリーダーを共有します。Phase 1で利用できるツールは次のとおりです。
list_knowledge_baseslist_documentssearch_knowledgeget_documentget_document_metadata
MCPプロセスでは、アップロード、移動、削除、フォルダー管理はできません。ドキュメントへのアクセスは、関連付けられたユーザーに読み取りが許可されている範囲に制限されます。
MCPの依存関係をインストールする
backendディレクトリから、MCP専用の仮想環境を作成します。
cd backend
python -m venv .mcp-venv
.\.mcp-venv\Scripts\python.exe -m pip install -r requirements-mcp.txt標準入力と標準出力でMCPを実行する
APIと同じデータベースおよびストレージ設定でMCPプロセスを構成します。ログインアクセストークンをKB_MCP_TOKENに設定してから、サーバーを起動します。
$env:PYTHONPATH = "."
$env:KB_MCP_TOKEN = "<access_token>"
.\.mcp-venv\Scripts\python.exe -m app.mcp_serverローカルのstdioクライアントでは、KB_MCP_TOKENを省略できます。その場合、エージェントはユーザー名とパスワードを指定してauthenticateツールを1回呼び出す必要があります。生成された短時間有効のセッションは、MCPプロセスのメモリ内にのみ存在します。
stdio MCPサービスに通常の
print()呼び出しを追加しないでください。標準出力はプロトコルメッセージに使用されるため、診断情報は標準エラーに書き込む必要があります。
MCPスモークテストを実行する
$env:PYTHONPATH = "."
.\.mcp-venv\Scripts\python.exe scripts\mcp_stdio_smoke.pyStreamable HTTPでMCPを公開する
同じMCPモジュールを起動する前に、トランスポート、リッスンアドレス、ポート、パス、ステートレスモードを設定します。
$env:PYTHONPATH = "."
$env:MCP_TRANSPORT = "streamable-http"
$env:MCP_HOST = "0.0.0.0"
$env:MCP_PORT = "8020"
$env:MCP_PATH = "/mcp"
$env:MCP_STATELESS_HTTP = "true"
.\.mcp-venv\Scripts\python.exe -m app.mcp_serverHTTPSリバースプロキシを設定すると、公開エンドポイントはhttps://your-domain/mcpにできます。リモートクライアントはAuthorization: Bearer <access_token>を送信し、API接続と同じ保護されたBearer認証情報を使用してください。
ブラウザーページ/mcp-token.htmlでは、パスワードを読み取ったり保存したりせずに、ログイン中のアカウント用のMCPトークンを要求できます。管理者は/admin.htmlを使用して、ユーザーの状態、ロール、パスワード、ユーザーごとのMCPトークン有効期限ポリシーを管理できます。永続的な長期間有効のトークンも設定できます。
高度な運用のヒント
- APIとMCPの設定を一致させる。両サービスは同じSQLiteデータベースとストレージパスを参照し、同じJWTシークレットを使用する必要があります。
- 最小権限のIDを使用する。MCPエージェントは、トークンのユーザーが読み取り可能なドキュメント範囲を引き継ぎます。
- Bearerトークンを保護する。APIまたはMCPの認証情報をソース管理、ログ、通常のコンソール出力に記録しないでください。
- stdioプロトコルを維持する。MCPの診断情報は標準出力ではなく標準エラーに送信します。
- リモートではHTTPSを使用する。ローカルマシンの外部に公開する前に、Streamable HTTPエンドポイントをHTTPSリバースプロキシの背後に配置します。
- Phase 1の範囲を把握する。Docker Compose、PostgreSQL、オブジェクトストレージは移行対象であり、現在の実行時要件ではありません。
- 所有者制限を確認する。ドキュメントの編集、論理削除、復元、フォルダー名の変更、空フォルダーの削除は、所有者だけが実行できます。
- 生成されたAPIドキュメントを使用する。
/docsページは、ここに示した例以外で利用可能なリクエストフィールドとレスポンスを確認する最も直接的な方法です。
まとめ
Knowledge Base Phase 1は、認証済みのファイル整理、プレビュー、取得、エージェントアクセスのための実用的なローカル基盤を提供します。Python、SQLite、ローカルストレージだけでサービスを初期化し、構造化されたドキュメントコレクションをアップロードし、フォルダーとメタデータを管理し、ローカルstdioまたはリモートのStreamable HTTP MCPトランスポートを通じて読み取り専用のナレッジツールを安全に公開できます。
