Supports source identification and management using arXiv identifiers for academic papers
Supports source identification and management using DOI identifiers for academic publications
Supports source identification and management using Semantic Scholar identifiers for academic papers
Uses SQLite as the database backend for storing source information and relationships
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@literateMCPadd a note to the 'Attention Is All You Need' paper about implementation details"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
Related MCP server: ClickUp Operator
Quick Start
Create a database from the current schema:
sqlite3 sources.db < create_sources_db.sqlInstall the FastMCP server with your database path:
fastmcp install sqlite-paper-fastmcp-server.py --name "Source Manager" -e SQLITE_DB_PATH=/path/to/sources.dbOptional: 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-mcpNotes:
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-mcpCurrent 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.sqlIf you already migrated to version 2, apply:
sqlite3 /path/to/sources.db < migrations/2026-03-09__expand-entity-relation-types.sqlThese migrations:
adds
source_identifiersbackfills identifier rows from the legacy JSON column
adds provenance fields
expands
source_entity_links.relation_typeto includesupports,contradicts, andrefutesupdates
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