Universal Source Management System
zongmin-yu/sqlite-literature-management-fastmcp-mcp-server · 19 stars · Python · MIT
MCP server A flexible system for managing various types of sources (papers, books, webpages, etc.) and integrating them with knowledge graphs.
Install
The repo has no one-line install. Follow its README.
Files
Universal Source Management System
A lightweight FastMCP server for managing literature, notes, entity links, and reading-list resources in a local SQLite database.
Current Scope
This repository provides:
- Local SQLite-backed source management
- Notes attached to sources
- Entity links between sources and named concepts
- Read-only database inspection tools
- MCP resources for source lookup and reading lists
- Normalized identifier storage with a transitional JSON cache
It does not integrate with MCP Memory Server or an external memory graph.
Quick Start
- Create a database from the current schema:
sqlite3 sources.db < create_sources_db.sql
- Install the FastMCP server with your database path:
fastmcp install sqlite-paper-fastmcp-server.py --name "Source Manager" -e SQLITE_DB_PATH=/path/to/sources.db
- Optional: use the checked-in demo fixture at
examples/sources.db.
Docker
This server can be packaged as a containerized stdio MCP server.
Build the image:
docker build -t sqlite-lit-mcp .
Run it with a persistent SQLite volume:
mkdir -p data docker run --rm -i \ -e SQLITE_DB_PATH=/data/sources.db \ -v "$(pwd)/data:/data" \ sqlite-lit-mcp
Notes:
- The image defaults
SQLITE_DB_PATHto/data/sources.db. - If the database file does not exist, the container initializes it from
create_sources_db.sql. - If you are mounting an older database, apply the required migrations under
migrations/before starting the server. - This repo runs as a stdio MCP server, so there is no HTTP port to expose by default.
With Docker Compose:
docker compose run --rm sqlite-lit-mcp
Current Tool Surface
Implemented tools:
read_querylist_tablesdescribe_tableget_table_statsget_database_infovacuum_databaseadd_sourcesadd_notesupdate_statusadd_identifierslink_to_entitiesget_source_entitiesupdate_entity_linksremove_entity_linksget_entity_sources
Implemented resources:
source://<id>source://by-identifier/<type>/<value>reading-list://unreadreading-list://readingentity://<entity_name>
Schema Notes
The current schema centers on four tables:
sourcessource_identifierssource_notessource_entity_links
sources.identifiers is still kept as a transitional JSON cache, but identifier lookups now use source_identifiers.
Supported identifier types:
semantic_scholardoiarxivopenalexpmidisbnurl
Supported entity relation types:
discussesintroducesextendsevaluatesappliescritiquessupportscontradictsrefutes
Lightweight provenance fields live on sources:
providerdiscovered_viadiscovered_at
The schema now uses PRAGMA user_version = 3.
Migration
If you have a version 0 or version 1 database, apply:
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
If you already migrated to version 2, apply:
sqlite3 /path/to/sources.db < migrations/2026-03-09__expand-entity-relation-types.sql
These migrations:
- adds
source_identifiers - backfills identifier rows from the legacy JSON column
- adds provenance fields
- expands
source_entity_links.relation_typeto includesupports,contradicts, andrefutes - updates
PRAGMA user_versionto3
The server checks PRAGMA user_version on connection and will reject older databases until they are migrated.
Package Layout
The implementation is organized under sqlite_lit_server/:
app.pycreates the FastMCP instance and registers tools/resourcesdb.pyowns connection setup and schema-version checksrepository.pykeeps SQL-heavy lookup logic close to the data layertools_admin.py,tools_sources.py, andtools_entities.pyhold the MCP toolsresources.pydefines the MCP resources
sqlite-paper-fastmcp-server.py remains as a thin compatibility shim.
Batch Import Sources
add_sources is the batch import entrypoint for new sources. It accepts one argument named sources, where each item is:
[title, source_type, identifier_type, identifier_value, initial_note]
initial_note must be either null or an object with both title and content.
Supported source_type values:
paperwebpagebookvideoblog
Supported identifier_type values:
semantic_scholardoiarxivopenalexpmidisbnurl
Duplicate handling:
- Exact identifier matches return
Source already existstogether with the existing source payload. - Title-based fuzzy matches return
Potential duplicates found. Please verify or use add_identifiers if these are the same source. - Successful batch writes return one result per input item in the same order as the request.
Example MCP/JSON payload:
{
"sources": [
[
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
{
"title": "Initial thoughts",
"content": "Transformers start here."
}
],
[
"OpenAlex Import",
"paper",
"openalex",
"W1234567890",
null
]
]
}
Example Python call:
add_sources([
(
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
{
"title": "Initial thoughts",
"content": "Transformers start here.",
},
),
(
"OpenAlex Import",
"paper",
"openalex",
"W1234567890",
None,
),
])
The same tool payloads work whether you start the server locally or through Docker with docker compose run --rm sqlite-lit-mcp.
Batch Write Conventions
Plural write tools accept lists and return a per-input result list in the same order. Related batch tools include:
add_notesadd_identifiersupdate_statuslink_to_entities
Example Usage
Add another identifier:
add_identifiers([
(
"Attention Is All You Need",
"paper",
"arxiv",
"1706.03762",
"semantic_scholar",
"204e3073870fae3d05bcbc2f6a8e263d9b72e776",
),
])
Read a source resource:
source://by-identifier/arxiv/1706.03762
Facts
- Kind
- MCP server
- Group
- Uncategorized
- Stars
- 19
- License
- MIT
- Language
- Python
- Last push
- 2026-03-09
- Forks
- 9
- Topics
- agent, fastmcp, llm, mcp, memory, sqlite
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k