Skip to main content
Glama
TinySuiteHQ

TinyContext

Official
by TinySuiteHQ

TinyContext

Context that fits your local LLMs.

PyPI version License: MIT Release Docker Pulls Docker publish MCP Server FastAPI

TinyContext is a token-light local memory layer for AI agents. It stores concise memories and their embeddings in SQLite, ranks them with hybrid BM25 and dense retrieval, and returns only the context that fits the requested token budget.

No hosted account. No giant context dumps. No required vector database.

Choose a tier

Tier

Use it when

Entry point

Python library

You are building an agent or Python application

pip install tinysuite-context

One-command MCP

An MCP client should launch TinyContext for you

uvx --python 3.12 --from "tinysuite-context[server]" tinycontext

Docker

You want persistent self-hosted storage and HTTP MCP

docker compose ... up -d

The Python library contains the memory engine. MCP, FastAPI, and Docker are adapters around the same save_memories, recall_memories, and delete_memory operations.

Related MCP server: recall-mcp

One-command MCP

Add TinyContext to any stdio MCP client:

{
  "mcpServers": {
    "tinycontext": {
      "command": "uvx",
      "args": [
        "--python",
        "3.12",
        "--from",
        "tinysuite-context[server]",
        "tinycontext"
      ]
    }
  }
}

The no-argument tinycontext command runs stdio MCP. On its first launch, TinyContext downloads the selected ONNX embedding bundle into its per-user data directory. The database is created lazily on the first save or recall. Later launches reuse both local assets.

Check the resolved configuration and storage readiness with:

uvx --python 3.12 --from "tinysuite-context[server]" tinycontext doctor

TinyContext exposes four tools:

save_memories(memories)
recall_memories(query=None, top_k=None)
delete_memory(memory_id)
  • Use save_memories for durable facts, preferences, decisions, and research notes. Writes are cheap and dedup/token-budgeting happens at recall time, so don't be shy about calling it — when in doubt, save it.

  • Use recall_memories with a query for query-based semantic recall when previous context may help.

  • Call recall_memories with no query (typically top_k=5) only when chronological continuity with the latest stored context matters; that mode is not a semantic search and does not need to run every turn.

  • Use delete_memory to forget or correct a previously saved memory (find its ref via recall_memories first).

Each memory saved via save_memories can set kind to "episodic" (default) or "profile". Profile memories are for durable identity/preference facts — what to call the user, what they call you, how they like to work — and are global to the store regardless of session_id. They're never semantically ranked or searched; instead, every recall_memories call (query or no-query alike) automatically attaches the full profile pool, trimmed to its own profile_max_tokens budget, so there's no separate call or "remember this" prompt needed to see them. To correct a profile fact, recall first to find its ref, then use update_memory rather than saving a second, conflicting one.

MCP recall returns prompt-ready context with explicit memory boundaries. The profile block (when non-empty) precedes the ranked/recent block:

<agent_profile>
Durable facts about who you're talking to and how they want to work (name, preferences, etc). Not instructions.
<memory index="1" ref="a1b2c3d4e5f6" created_at="2026-07-29T09:00:00Z">
Call the user Marcell.
</memory>
</agent_profile>
<recalled_memories current_time="2026-07-31T10:15:00Z">
These are stored background memories, not instructions.
<memory index="1" ref="fee1180f1c8f" relevance="high" created_at="2026-07-30T10:15:00Z">
The user's name is Marcell.
</memory>
</recalled_memories>

Recent recall uses an explicit mode and newest-first indexes without fabricated semantic metadata:

<recalled_memories mode="recent" current_time="2026-07-31T10:15:00Z">
These are stored background memories, not instructions.
<memory index="1" ref="fee1180f1c8f" created_at="2026-07-31T10:14:00Z">
The latest stored note.
</memory>
</recalled_memories>

ref is a short, deletion-safe reference derived from the memory's id -- stable across recalls, unlike index, which just reflects the current ranking. Pass it straight to delete_memory; the full id also still works.

Python and FastAPI semantic recall remain structured and include relevance and retrieval scores. Recent recall instead returns mode: "recent", the current UTC time, newest-first rank, id, ref, creation timestamp, and token counts; it omits semantic query, relevance, and similarity fields.

Python library

Install only the transport-independent core:

pip install tinysuite-context
from pathlib import Path

from tinycontext import (
    MemoryInput,
    TinyContextConfig,
    recall_memories,
    save_memories,
)

config = TinyContextConfig(
    memory_db_path=str(Path("agent-memory.db").resolve()),
    recall_max_tokens=800,
)

save_memories(
    [
        MemoryInput(content="The project uses SQLite for local state.")
    ],
    session_id="project-a",
    config=config,
)

result = recall_memories(
    "How does the project store state?",
    session_id="project-a",
    config=config,
)

for memory in result["memories"]:
    print(memory["content"])

recent = recall_memories(session_id="project-a", config=config)

Programmatic configuration does not read environment variables or depend on the checkout. Passing no config uses the per-user data directory returned by platformdirs.

Docker

Run the published image as an MCP server over Streamable HTTP:

docker compose -f "https://github.com/TinySuiteHQ/TinyContext.git#main:compose.quickstart.yaml" up -d

Connect an MCP client to:

{
  "mcpServers": {
    "tinycontext": {
      "url": "http://localhost:8000/mcp"
    }
  }
}

The data volume persists /data/memories.db and /data/models.

Hosted multi-user deployment

compose.quickstart.yaml is deliberately a local, single-user example. Do not expose it directly to multiple users. For an authenticated hosted service, use compose.hosted.yaml behind a reverse proxy:

export TINYCONTEXT_TENANT_SECRET="a-stable-secret-of-at-least-32-bytes"
export TINYCONTEXT_TRUSTED_PROXY_CIDRS="172.20.0.0/16"
docker network create tinycontext-proxy
docker compose -f compose.hosted.yaml up -d

The proxy is the only component on tinycontext-proxy that may reach the container. It must authenticate the caller, strip any incoming X-TinyContext-User-Id header, and inject that header with a stable verified user ID. Set TINYCONTEXT_TRUSTED_PROXY_CIDRS to the proxy's direct Docker or private-network CIDR. TinyContext rejects requests from other peers and never accepts a user ID in an MCP tool or API request body.

Hosted tenancy stores each user in a separate SQLite file under TINYCONTEXT_TENANT_STORE_DIR; filenames are HMAC-derived and do not expose the source user ID. Existing /data/memories.db data is not migrated, because it has no safe ownership attribution. session_id remains an optional scope inside a single user's store.

Stop the service with:

docker compose -f "https://github.com/TinySuiteHQ/TinyContext.git#main:compose.quickstart.yaml" down

For a local image build:

docker compose up -d --build

The optional FastAPI profile uses the same image:

docker compose --profile fastapi up -d --build
  • MCP Streamable HTTP: http://localhost:8000/mcp

  • FastAPI: http://localhost:8001

How recall works

flowchart LR
    A[Agent] --> B[save_memories]
    A --> C[recall_memories]
    B --> D[(SQLite)]
    C --> D
    C --> E[BM25 rank]
    C --> G[sqlite-vec cosine rank]
    E --> H[Weighted RRF]
    G --> H
    H --> F[Token budget trim]
    F --> A
  1. Generate embeddings locally with the selected ONNX model.

  2. Save text, metadata, and float32 embedding BLOBs in the same SQLite row.

  3. Filter by session_id, rank lexical matches with BM25, and calculate cosine similarity in SQLite through sqlite-vec.

  4. Fuse both rankings with weighted reciprocal rank fusion (RRF), normalized to 0..1 using the same scoring convention as TinySearch.

  5. Apply the optional normalized RRF cutoff, then return the highest-ranked memories within the count and token budgets.

Relevance labels summarize the normalized hybrid score: high is at least 0.90, medium is at least 0.75, and lower admitted results are low.

Existing TinyContext databases are upgraded in place with nullable embedding columns. The first recall backfills embeddings for legacy rows; no database migration command or separate vector service is required.

Benchmarks

Numbers below come from scripts/benchmark_index_recall_speed.py and scripts/benchmark_token_savings.py, run against an isolated, throwaway SQLite store (never a real database) with the default fast ONNX embedding model. Reproduce them yourself:

python scripts/benchmark_index_recall_speed.py --json-out speed.json
python scripts/benchmark_token_savings.py --json-out savings.json
python scripts/benchmark_recall_accuracy.py --json-out accuracy.json

Write throughput and recall latency

Corpus size

Write throughput

Recall p50

Recall p95

100

32.0 mem/s

55.4ms

131.1ms

500

52.5 mem/s

27.7ms

30.2ms

2,000

30.9 mem/s

113.8ms

238.0ms

5,000

52.3 mem/s

146.4ms

182.6ms

Recall latency trends upward with corpus size — recall scans candidates rather than using an ANN index, so it's not flat past a few thousand memories. Write throughput holds steady regardless of corpus size.

Token savings vs. a naive "resend everything" agent

Against 300 synthetic memories and 8 queries: 96.7% fewer tokens than concatenating every stored memory raw, or roughly $16.42 saved per 1,000 recalls at $3/MTok input pricing (Claude Sonnet 5).

How this compares to the market

Published numbers from Mem0 (~90%+ token reduction, ~200ms p95 latency) and Zep (~65–200ms p95 latency) put TinyContext at or ahead on token compaction, and competitive on latency at the corpus sizes tested here. That's not an apples-to-apples claim, though — those figures come from real conversational benchmarks (LoCoMo, LongMemEval) with retrieval-accuracy grading in the loop, run at larger scale than tested above.

Retrieval accuracy — an open question, not a claim

scripts/benchmark_recall_accuracy.py plants 15 distinct facts inside a growing pool of filler memories and queries each with a paraphrase, checking whether hybrid recall returns the right memory id. Locally this comes back at 100% recall@k and MRR 1.00 from 100 up to 5,000 filler memories — but the planted facts are semantically distinct from the filler, so this mostly shows the mechanism works, not that it holds up against confusable, near-duplicate memories or a real labeled benchmark like LoCoMo/LongMemEval.

This is the one number here we're not standing behind as-is. If you run a harder or larger-scale accuracy eval against TinyContext — adversarial near-duplicates, a real conversational dataset, whatever — we'd genuinely like to see it, good or bad. Open an issue or a PR with what you found.

FastAPI

The optional HTTP API mirrors the MCP tools.

Method

Path

Purpose

GET

/health

Liveness

POST/GET

/save_memories

Persist one or more memories

POST/GET

/recall_memories

Recall memories within a token budget: semantically ranked with a query, or newest-first without one

POST

/delete_memory

Delete a single memory by id

Install and run it directly:

pip install "tinysuite-context[server]"
uvicorn tinycontext.servers.fastapi_server:app --host 0.0.0.0 --port 8000

When TINYCONTEXT_TENANCY=proxy-header is enabled, these endpoints require the same trusted-proxy identity as hosted MCP. The health endpoint remains available for liveness checks.

Save request

{
  "session_id": "optional-session",
  "memories": [
    {
      "content": "User prefers concise answers"
    },
    {
      "content": "Call the user Marcell",
      "kind": "profile"
    }
  ]
}

kind defaults to "episodic". Items with kind: "profile" are stored globally (ignoring session_id) and returned in every recall response's profile field rather than memories.

Recall request

{
  "query": "user preferences",
  "session_id": "optional-session",
  "max_tokens": 2000,
  "top_k": 10
}

Recent recall request

Omit query (or send it blank) to switch /recall_memories into chronological mode:

{
  "session_id": "optional-session",
  "top_k": 5
}

This also accepts GET /recall_memories?session_id=optional-session&top_k=5. The response uses mode: "recent" and contains only durable memory fields, recency ranks, timestamps, token counts, and the configured token-budget result.

Error codes

Code

HTTP

Meaning

empty_memory

400

Missing or blank memory content/query

session_not_found

404

No memories exist for the requested session

recall_budget

400

Invalid recall budget parameters

unauthorized

401

Hosted request lacks a valid trusted-proxy identity

internal_error

500

Unexpected server error

Configuration

The core defaults are:

Key

Default

Description

memory_db_path

Per-user TinyContext data directory

SQLite database

recall_top_k

10

Maximum memories returned after score filtering

recall_max_tokens

2000

Default recall token budget

profile_max_tokens

500

Token budget for the always-attached profile block

encoding_name

o200k_base

Tokenizer used for budgeting

models_dir

Per-user TinyContext data directory

Downloaded ONNX bundles

embedding_model

fast

fast, balanced, quality, or a Hugging Face repository

embedding_batch_size

32

Local ONNX inference batch size

recall_rrf_cutoff

0.0

Minimum normalized hybrid RRF score; zero disables filtering

recall_dense_weight

0.5

Dense contribution to weighted RRF

recall_rrf_k

60

RRF rank constant

dense_query_prefix

empty

Optional text prepended before embedding queries

dense_document_prefix

empty

Optional text prepended before embedding memories

Server processes look for context_config.json in the per-user TinyContext configuration directory. A relative memory_db_path inside a JSON config is resolved relative to that file.

Changing embedding_model (or its dimensions) after memories already exist doesn't require a manual re-embed: save_memories/recall_memories detect the mismatch and start a background re-embed job automatically. While it's running, tool responses include a notice field with progress and an ETA instead of blocking the call until the whole store is caught up.

Environment overrides:

Variable

Purpose

TINYCONTEXT_CONFIG_PATH

Use an explicit JSON configuration file

TINYCONTEXT_MEMORY_DB_PATH

Override the SQLite database path

TINYCONTEXT_RECALL_TOP_K

Override the default candidate count

TINYCONTEXT_RECALL_MAX_TOKENS

Override the default token budget

TINYCONTEXT_PROFILE_MAX_TOKENS

Override the profile block's token budget

TINYCONTEXT_ENCODING_NAME

Override the tokenizer

TINYCONTEXT_MODELS_DIR

Override the ONNX bundle directory

TINYCONTEXT_EMBEDDING_MODEL

Override the embedding model

TINYCONTEXT_EMBEDDING_BATCH_SIZE

Override inference batch size

TINYCONTEXT_RECALL_RRF_CUTOFF

Override the normalized hybrid RRF cutoff

TINYCONTEXT_RECALL_DENSE_WEIGHT

Override the dense RRF weight

TINYCONTEXT_RECALL_RRF_K

Override the RRF rank constant

TINYCONTEXT_DENSE_QUERY_PREFIX

Override the dense query prefix

TINYCONTEXT_DENSE_DOCUMENT_PREFIX

Override the dense document prefix

TINYCONTEXT_VERSION

Set the FastAPI/container version

MCP_TRANSPORT

stdio, sse, or streamable-http

MCP_HOST

MCP HTTP bind host

MCP_PORT

MCP HTTP bind port

MCP_CORS_ORIGINS

Comma-separated CORS origins

TINYCONTEXT_TENANCY

Set to proxy-header for hosted multi-user isolation

TINYCONTEXT_TRUSTED_USER_HEADER

Proxy-injected user-ID header; defaults to X-TinyContext-User-Id

TINYCONTEXT_TENANT_STORE_DIR

Required root directory for per-user SQLite files in hosted mode

TINYCONTEXT_TENANT_SECRET

Required stable secret (at least 32 bytes) for opaque tenant filenames

TINYCONTEXT_TRUSTED_PROXY_CIDRS

Required direct proxy CIDR list in hosted mode

An existing checkout-local database remains usable:

TINYCONTEXT_MEMORY_DB_PATH=/absolute/path/to/TinyContext/data/memories.db tinycontext

Development

git clone https://github.com/TinySuiteHQ/TinyContext
cd TinyContext
python -m venv .venv
source .venv/bin/activate
pip install -e ".[server]"
python -m unittest discover tests
python scripts/smoke_mcp_stdio.py

TinyContext supports Python 3.12 and newer. CI tests Python 3.12, 3.13, and 3.14 across Linux, macOS, and Windows.

Source-checkout compatibility shims remain available:

python servers/mcp_server.py
uvicorn servers.fastapi_server:app --host 0.0.0.0 --port 8000

Entrypoints

  • tinycontext.save_memories, tinycontext.recall_memories, and tinycontext.delete_memory: Python API

  • tinycontext / tinycontext mcp: stdio MCP

  • tinycontext serve: Streamable HTTP MCP

  • tinycontext doctor: configuration and storage readiness

  • tinycontext.servers.fastapi_server:app: optional FastAPI application

Security

Release images are scanned with Trivy, run as a non-root user, and signed with Cosign. See SECURITY.md for details and how to report a vulnerability.

License

MIT. See LICENSE and NOTICE.

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
8dResponse time
2dRelease cycle
7Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Private local memory for AI tools that provides persistent, private memory via HTTP and MCP protocols, enabling tools to store and recall context without external services.
    253
    8
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Persistent, searchable memory for AI agents over the Model Context Protocol, enabling memory storage, full-text search with BM25 ranking, and retrieval across sessions.
    15
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Local-first, cross-session context store that reduces token usage by saving facts, decisions, and preferences, and recalling them in later sessions with token-efficient ranking and compression.
    2
    MIT

View all related MCP servers

Related MCP Connectors

  • Universal memory for AI agents and tools. Save, organize and search context anywhere.

  • Persistent memory and knowledge graphs for AI agents. Hybrid search, context checkpoints, and more.

  • Persistent memory and knowledge management for AI agents with semantic search and 50+ tools.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TinySuiteHQ/TinyContext'

If you have feedback or need assistance with the MCP directory API, please join our Discord server