Universal Source Management System について
Universal Source Management System は、文献、ノート、エンティティリンク、リーディングリストをローカルの SQLite データベースで管理する軽量な FastMCP サーバーです。論文、書籍、Web ページなどを整理する研究者に向けられており、識別子を正規化して保存します。
主な機能
- 01ローカル SQLite によるソース管理
- 02ソースに紐づくノート
- 03ソースと概念のエンティティリンク
- 04読み取り専用のデータベース確認ツール
- 05識別子検索とリーディングリストのリソース
- 06重複検出付きの一括インポート
活用シーン
- 01論文や書籍の文献リストの整理
- 02DOI や arXiv 識別子によるソース検索
- 03ソースと概念の関係の記録
MCP 対応
本プロジェクトは MCP サーバーであり、ソース管理ツールと source://、reading-list://、entity:// のリソースを MCP クライアントに公開します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Universal Source Management System
ローカルの SQLite データベースで、文献、メモ、エンティティリンク、読書リストのリソースを管理する軽量な FastMCP サーバーです。
現在の対象範囲
このリポジトリでは、以下を提供します。
- ローカルの SQLite を基盤とする文献管理
- 文献に紐づくメモ
- 文献と名前付き概念の間のエンティティリンク
- 読み取り専用のデータベース検査ツール
- 文献検索と読書リスト用の MCP リソース
- 移行期間中の JSON キャッシュを併用した正規化識別子の保存
MCP Memory Server や外部のメモリーグラフとの連携には対応していません。
クイックスタート
- 現在のスキーマからデータベースを作成します。
sqlite3 sources.db < create_sources_db.sql
- データベースのパスを指定して FastMCP サーバーをインストールします。
fastmcp install sqlite-paper-fastmcp-server.py --name "Source Manager" -e SQLITE_DB_PATH=/path/to/sources.db
- 任意:チェックイン済みのデモ用フィクスチャ
examples/sources.dbを使用します。
Docker
このサーバーは、コンテナ化された stdio MCP サーバーとしてパッケージ化できます。
イメージをビルドします。
docker build -t sqlite-lit-mcp .
永続的な SQLite ボリュームを使用して実行します。
mkdir -p data
docker run --rm -i \
-e SQLITE_DB_PATH=/data/sources.db \
-v "$(pwd)/data:/data" \
sqlite-lit-mcp
注意:
- イメージでは、
SQLITE_DB_PATHのデフォルト値が/data/sources.dbに設定されています。 - データベースファイルが存在しない場合、コンテナは
create_sources_db.sqlからデータベースを初期化します。 - 古いデータベースをマウントする場合は、サーバーを起動する前に
migrations/にある必要なマイグレーションを適用してください。 - このリポジトリは stdio MCP サーバーとして動作するため、デフォルトでは公開する HTTP ポートはありません。
Docker Compose を使用する場合:
docker compose run --rm sqlite-lit-mcp
現在のツール一覧
実装済みのツール:
read_querylist_tablesdescribe_tableget_table_statsget_database_infovacuum_databaseadd_sourcesadd_notesupdate_statusadd_identifierslink_to_entitiesget_source_entitiesupdate_entity_linksremove_entity_linksget_entity_sources
実装済みのリソース:
source://<id>source://by-identifier/<type>/<value>reading-list://unreadreading-list://readingentity://<entity_name>
スキーマに関する注意
現在のスキーマは、次の4つのテーブルを中心に構成されています。
sourcessource_identifierssource_notessource_entity_links
sources.identifiers は移行期間中の JSON キャッシュとして引き続き保持されますが、識別子の検索には source_identifiers を使用するようになりました。
対応している識別子の種類:
semantic_scholardoiarxivopenalexpmidisbnurl
対応しているエンティティ関係の種類:
discussesintroducesextendsevaluatesappliescritiquessupportscontradictsrefutes
軽量な出所情報のフィールドは sources にあります。
providerdiscovered_viadiscovered_at
スキーマでは現在、PRAGMA user_version = 3 を使用しています。
マイグレーション
バージョン0またはバージョン1のデータベースがある場合は、次を適用してください。
sqlite3 /path/to/sources.db < migrations/2026-03-09__normalize-identifiers.sql
sqlite3 /path/to/sources.db < migrations/2026-03-09__expand-entity-relation-types.sql
すでにバージョン2にマイグレーション済みの場合は、次を適用してください。
sqlite3 /path/to/sources.db < migrations/2026-03-09__expand-entity-relation-types.sql
これらのマイグレーションでは、以下を行います。
source_identifiersを追加します- 従来の JSON 列から識別子の行をバックフィルします
- 出所情報のフィールドを追加します
source_entity_links.relation_typeにsupports、contradicts、refutesを追加しますPRAGMA user_versionを3に更新します
サーバーは接続時に PRAGMA user_version を確認し、マイグレーションされるまで古いデータベースを拒否します。
パッケージ構成
実装は sqlite_lit_server/ 以下に整理されています。
app.pyは FastMCP インスタンスを作成し、ツールとリソースを登録しますdb.pyは接続のセットアップとスキーマバージョンの確認を担当しますrepository.pyは SQL を多用する検索ロジックをデータレイヤーの近くに配置しますtools_admin.py、tools_sources.py、tools_entities.pyは MCP ツールを格納しますresources.pyは MCP リソースを定義します
sqlite-paper-fastmcp-server.py は、薄い互換性シムとして残されています。
ソースの一括インポート
add_sources は、新しいソースを一括インポートするためのエントリーポイントです。sources という名前の引数を 1 つ受け取り、各項目は次の形式です。
[title, source_type, identifier_type, identifier_value, initial_note]
initial_note は null、または title と content の両方を含むオブジェクトである必要があります。
サポートされている source_type の値:
paperwebpagebookvideoblog
サポートされている identifier_type の値:
semantic_scholardoiarxivopenalexpmidisbnurl
重複の処理:
- 識別子が完全に一致する場合は、既存のソースのペイロードとともに
Source already existsを返します。 - タイトルに基づくあいまい一致の場合は、
Potential duplicates found. Please verify or use add_identifiers if these are the same source.を返します。 - 一括書き込みが成功すると、リクエストと同じ順序で、入力項目ごとに 1 つの結果を返します。
MCP/JSON ペイロードの例:
{
"sources": [
[
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
{
"title": "Initial thoughts",
"content": "Transformers start here."
}
],
[
"OpenAlex Import",
"paper",
"openalex",
"W1234567890",
null
]
]
}
Python 呼び出しの例:
add_sources([
(
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
{
"title": "Initial thoughts",
"content": "Transformers start here.",
},
),
(
"OpenAlex Import",
"paper",
"openalex",
"W1234567890",
None,
),
])
サーバーをローカルで起動する場合も、Docker で docker compose run --rm sqlite-lit-mcp を使って起動する場合も、同じツールのペイロードを使用できます。
一括書き込みの規約
複数形の書き込みツールはリストを受け取り、入力と同じ順序で入力項目ごとの結果リストを返します。関連する一括処理ツールは次のとおりです。
add_notesadd_identifiersupdate_statuslink_to_entities
使用例
別の識別子を追加する:
add_identifiers([
(
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
"semantic_scholar",
"204e3073870fae3d05bcbc2f6a8e263d9b72e776",
),
])
ソースのリソースを読み取る:
source://by-identifier/arxiv/1706.03762
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。