Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.jarmstrong158/context-keeper

PYPI · CONTEXT-KEEPER-MCP

Durable project-memory MCP: decisions, constraints, and pipelines across Claude sessions.

Available components

−15 this week 80 Trust /100

Last scanned (16 hours ago)

Scores higher than 80% of PyPI servers

Category Memory and Knowledge

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security50
  • Malware scan not yet available for this package.Unverified
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
  • No production dependencies, so there is no dependency health to assess. View diagnostics → Pass
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to jarmstrong158/context-keeper). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 90 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability76
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 1839 tokens (~131/item across 14 items; 14 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
  • No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 99% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 14 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 14 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a current MCP spec version (2026-07-28).Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Nov 26 −15
    • Malware scan: pass → unverified ▼ security
  • 31 Oct 26 0
    • Stability: 0.97 → pass security
    • Security disclosure: unverified → fail ▼ functional
  • 30 Oct 26 0
    • Security disclosure: fail → unverified ▼ functional
    • Stability: pass → 0.97 functional
  • 24 Oct 26 0
    • Stability: 0.97 → pass security
  • 23 Oct 26 0
    • Stability: pass → 0.97 functional
  • 17 Oct 26 0
    • Stability: 0.97 → pass security
  • 16 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 14 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed pypi/context-keeper-mcp@0.19.0

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem pypi
Reason Verified
Discovered via Registry attestation endpoint
Source repo jarmstrong158/context-keeper
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/jarmstrong158/context-keeper/.github/workflows/publish.yml@refs/tags/v0.19.0
Rekor log index 2352664893
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:4ad2e30f21efa8acf9c9ab3dcb8d4fe72ae1c4d04fda3b11260483a5d54836c2

Background: How many MCP packages publish verified provenance →

Install scripts 1 script
Hook Tier Command
build_backend allowlisted hatchling.build

Background: Why install scripts are a supply-chain risk →

Dependencies 0 packages
Packages resolved 0
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 14 exposed · ~1,839 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
deprecate_entry ~135

Mark an entry as deprecated. For decisions, optionally link to the superseding decision.

NameTypeReqDescription
idstringyesEntry ID to deprecate
merge_intostring–Dedup merge: fold this entry's unique content into this same-type target, then deprecate this one with superseded_by=target. Non-destructive — the target is only added to.
project_dirstring–Absolute path to another project whose entry should be deprecated
reasonstringyesWhy this is being deprecated
superseded_bystring–ID of the replacing decision (decisions only)

No output schema declared.

No examples provided.

export_markdown ~67

Regenerate DECISIONS.md from the decisions store — a derived, read-only projection; overwrites the file whole.

NameTypeReqDescription
pathstring–Output path relative to project root. Default: config markdown_export.path.
project_dirstring–Absolute path to the target project.

No output schema declared.

No examples provided.

export_snapshot ~86

Write the whole store to a compressed, committable snapshot at .context-keeper/memory.json.gz (next to the project) and add a .gitattributes merge=ours guard. For sharing project memory with a team via git. Committing it is opt-in. Non-destructive to the working store.

NameTypeReqDescription
project_dirstring–Absolute path to the target project.

No output schema declared.

No examples provided.

get_compaction_report ~46

Check if the last compaction lost or modified any context entries. Surface discrepancies to the user before proceeding.

NameTypeReqDescription
project_dirstring–Absolute path to another project to check

No output schema declared.

No examples provided.

get_context ~203

Retrieve relevant project context ranked by relevance within a token budget. Pass an id to fetch a single entry at full fidelity.

NameTypeReqDescription
beforestring–Entries verified/created strictly before this ISO date.
idstring–Fetch a single entry by ID (e.g. 'dec-001')
include_relatedboolean–Also pull entries linked via related_to (depth 1). Default: true.
project_dirstring–Absolute path to another project to read context from
querystring–Free-text description of what you're working on
scopestring–File or module path to focus on
sincestring–Entries verified/created on or after this ISO date.
tagsarray–Filter to entries with any of these tags
token_budgetinteger–Max tokens to return (default: from config)
typesarray–Limit to specific entry types. Default: all.

No output schema declared.

No examples provided.

get_project_summary ~82

The single orienting call for conversation start: counts by kind and status, active constraints (compact), recent decisions, the full id list, and the human-readable summary — all in one response.

NameTypeReqDescription
project_dirstring–Absolute path to another project to summarize
token_budgetinteger–Max tokens for the summary (default: 2000)

No output schema declared.

No examples provided.

import_snapshot ~64

Import the committed .context-keeper/memory.json.gz snapshot into the working store. Non-destructive: a store that already has entries is left untouched. Runs automatically on first use when the store is empty.

NameTypeReqDescription
project_dirstring–Absolute path to the target project.

No output schema declared.

No examples provided.

mirror ~79

Sync entries with the remote store. op='pull' merges remote entries into local (newest wins); op='backfill' pushes all local entries to remote (upsert). No-op if remote unconfigured.

NameTypeReqDescription
opstringyespull = remote→local merge; backfill = local→remote push.
project_dirstring––

No output schema declared.

No examples provided.

prune_stale ~69

Find entries not verified in N days. Returns them for review — does not delete. Call periodically to keep context fresh.

NameTypeReqDescription
daysinteger–Entries not verified in this many days are flagged (default: from config)
project_dirstring–Absolute path to another project to prune

No output schema declared.

No examples provided.

query_entries ~354

Structured field filter — exact AND-combined predicates, NOT relevance search. Use when you know the field values (e.g. absolute constraints scoped to 'hooks/'). Stable ID order, no ranking; empty is a real answer. Includes superseded/deprecated unless you filter status.

NameTypeReqDescription
beforestring–Verified/created strictly before this ISO date.
hardnessstring|array–Constraint hardness absolute/advisory (string or list).
kindstring|array–Singular alias for `types`. `types` wins if both given.
limitinteger–Cap entries returned (matched_entries reports the total).
originstring|array–user/agent/import (string or list). Missing counts as 'agent'.
project_dirstring–Absolute path to another project to query.
scopestring–Exact, case-sensitive match on a constraint's scope (e.g. 'hooks/').
sincestring–Verified/created on or after this ISO date.
statusstring|array–active/superseded/deprecated (string or list).
superseded_bystring–Entries replaced by this id (superseded_by == id).
supersedesstring–The entry that superseded this id.
tags_allarray–Entries with ALL of these tags.
tags_anyarray–Entries with AT LEAST ONE of these tags.
textstring–Free text over text fields; every term must appear (AND, substring).
token_budgetinteger–Max tokens returned (default from config).
typesarray–Restrict to these entry types. Default: all.

No output schema declared.

No examples provided.

record_entry ~438

Unified write tool: record a decision, constraint, or pipeline. Required fields by kind (validated server-side): decision needs summary/problem/why_chosen; constraint needs rule/reason; pipeline needs name/purpose/steps.

NameTypeReqDescription
alternativesarray–decision: options considered and why rejected.
constraintsarray–pipeline: rules that apply.
constraints_createdarray–decision: new constraints this introduces.
enforced_bystring–constraint: test/command that checks it (named, never run).
hardnessstring–constraint: absolute vs advisory.
kindstringyesWhich kind of entry to record.
namestring–pipeline: name.
originstring–who authored this (default agent).
problemstring–decision: what forced it. Min 40 chars.
project_dirstring–Absolute path to the target project. Creates .context/ if needed.
purposestring–pipeline: why it exists. Min 40 chars.
reasonstring–constraint: why it exists. Min 40 chars.
related_toarray–ids of related entries; get_context traverses these.
retrieval_hintsarray–2-4 alternate phrasings for retrieval.
rulestring–constraint: the rule, imperative.
scopestring–constraint: 'global' or a file/module path.
stepsarray–pipeline: ordered steps.
summarystring–decision: what was decided (1-2 sentences).
supersedesarray–decision: ids of prior decisions this replaces.
tagsarray–tags for retrieval.
tradeoffsstring–decision: what was given up. Encouraged.
triggering_incidentstring–constraint: the incident behind it.
what_we_triedstring–decision: prior attempts. Encouraged.
when_to_invokestring–pipeline: triggers. Encouraged.
why_chosenstring–decision: the reasoning. Min 60 chars.

No output schema declared.

No examples provided.

reload_constraints ~53

Re-surface the project's constraints only (not the full store) when a long session has buried the ones injected at start. Same block as session start.

NameTypeReqDescription
project_dirstring–Absolute path to the target project.

No output schema declared.

No examples provided.

update_entry ~90

Update an existing decision, pipeline, or constraint by ID. Refreshes verified_at timestamp automatically.

NameTypeReqDescription
idstringyesEntry ID (e.g. 'dec-001', 'pipe-003', 'con-012')
project_dirstring–Absolute path to another project whose entry should be updated
updatesobjectyesFields to update. Any field except id and created_at.

No output schema declared.

No examples provided.

verify_quality ~73

Scan entries for quality issues (legacy schema, thin reasoning, missing tags, isolated entries) and return them for enrichment via update_entry.

NameTypeReqDescription
min_reason_charsinteger–Below this length, flag the entry as thin (default: 80)
project_dirstring–Absolute path to another project to verify

No output schema declared.

No examples provided.

Install

How do I install the io.github.jarmstrong158/context-keeper MCP server?

io.github.jarmstrong158/context-keeper runs locally as a PyPI package, launched with uvx context-keeper-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · context-keeper-mcp

# add to Claude Code
claude mcp add jarmstrong158-context-keeper -- uvx context-keeper-mcp
Common questions

What is the io.github.jarmstrong158/context-keeper MCP server?

io.github.jarmstrong158/context-keeper is an MCP server listed in the public MCP registry as io.github.jarmstrong158/context-keeper. Durable project-memory MCP: decisions, constraints, and pipelines across Claude sessions. This page covers its PyPI package (context-keeper-mcp).

Is the io.github.jarmstrong158/context-keeper MCP server safe to use?

io.github.jarmstrong158/context-keeper scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the io.github.jarmstrong158/context-keeper MCP server expose?

io.github.jarmstrong158/context-keeper exposes 14 tools: record_entry, get_context, query_entries, get_project_summary, update_entry, and 9 more. Their descriptions and schemas cost roughly 1,839 tokens of context every time the server is loaded.

Is the io.github.jarmstrong158/context-keeper MCP server still maintained?

io.github.jarmstrong158/context-keeper is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the io.github.jarmstrong158/context-keeper MCP server under?

io.github.jarmstrong158/context-keeper declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.