# io.github.jarmstrong158/context-keeper (pypi · context-keeper-mcp)

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

- Trust score: 50/100 (low)
- Change this week: +6
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- pypi · `context-keeper-mcp`: 50/100 (this document), [markdown](https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp.md), [page](https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp)

## Channel facts

- Registry: `pypi`
- Package: `context-keeper-mcp`
- Version: `0.18.0`
- Transport: `stdio`

## Trust breakdown

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. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised native-build step with no shell scripting around it.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 32/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 64/100
  - AI-judged instruction clarity (good).
  - 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.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 7/100
  - Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 99% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### Claude

```bash
claude mcp add jarmstrong158-context-keeper -- uvx context-keeper-mcp
```

### Codex

```bash
codex mcp add jarmstrong158-context-keeper -- uvx context-keeper-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "jarmstrong158-context-keeper": {
      "type": "local",
      "command": [
        "uvx",
        "context-keeper-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add jarmstrong158-context-keeper --command uvx --arg context-keeper-mcp
```

### Hermes

```yaml
mcp_servers:
  jarmstrong158-context-keeper:
    command: "uvx"
    args: ["context-keeper-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "jarmstrong158-context-keeper": {
      "command": "uvx",
      "args": [
        "context-keeper-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 50, +5)

- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Tool coverage: 100 → unverified
- [functional regression] Capabilities: fail → unverified
- [functional improvement] Stability: unverified → 0.03
- [functional improvement] MCP protocol: fail → pass
- [functional] Schema quality: Schema quality not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional] Package version: 0.17.0 → 0.18.0

### 2026-08-01 (score 45, +19)

- [security] First check of Stability: unverified
- [functional improvement] Tool coverage: unverified → 100
- [functional] First check of Schema quality: good
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 99
- [functional] First check of Schema quality: fail
- [functional] First check of MCP protocol: fail
- [functional] Package version: 0.15.0 → 0.17.0
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-31 (score 26, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-28 (score 44, 0)

- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.

### 2026-07-26 (score 44)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (14)

### `record_entry` (~438 tokens)

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.

Input parameters:

- `alternatives` (array): decision: options considered and why rejected.
- `constraints` (array): pipeline: rules that apply.
- `constraints_created` (array): decision: new constraints this introduces.
- `enforced_by` (string): constraint: test/command that checks it (named, never run).
- `hardness` (string): constraint: absolute vs advisory.
- `kind` (string, required): Which kind of entry to record.
- `name` (string): pipeline: name.
- `origin` (string): who authored this (default agent).
- `problem` (string): decision: what forced it. Min 40 chars.
- `project_dir` (string): Absolute path to the target project. Creates .context/ if needed.
- `purpose` (string): pipeline: why it exists. Min 40 chars.
- `reason` (string): constraint: why it exists. Min 40 chars.
- `related_to` (array): ids of related entries; get_context traverses these.
- `retrieval_hints` (array): 2-4 alternate phrasings for retrieval.
- `rule` (string): constraint: the rule, imperative.
- `scope` (string): constraint: 'global' or a file/module path.
- `steps` (array): pipeline: ordered steps.
- `summary` (string): decision: what was decided (1-2 sentences).
- `supersedes` (array): decision: ids of prior decisions this replaces.
- `tags` (array): tags for retrieval.
- `tradeoffs` (string): decision: what was given up. Encouraged.
- `triggering_incident` (string): constraint: the incident behind it.
- `what_we_tried` (string): decision: prior attempts. Encouraged.
- `when_to_invoke` (string): pipeline: triggers. Encouraged.
- `why_chosen` (string): decision: the reasoning. Min 60 chars.

### `get_context` (~203 tokens)

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

Input parameters:

- `before` (string): Entries verified/created strictly before this ISO date.
- `id` (string): Fetch a single entry by ID (e.g. 'dec-001')
- `include_related` (boolean): Also pull entries linked via related_to (depth 1). Default: true.
- `project_dir` (string): Absolute path to another project to read context from
- `query` (string): Free-text description of what you're working on
- `scope` (string): File or module path to focus on
- `since` (string): Entries verified/created on or after this ISO date.
- `tags` (array): Filter to entries with any of these tags
- `token_budget` (integer): Max tokens to return (default: from config)
- `types` (array): Limit to specific entry types. Default: all.

### `query_entries` (~354 tokens)

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.

Input parameters:

- `before` (string): Verified/created strictly before this ISO date.
- `hardness` (string|array): Constraint hardness absolute/advisory (string or list).
- `kind` (string|array): Singular alias for `types`. `types` wins if both given.
- `limit` (integer): Cap entries returned (matched_entries reports the total).
- `origin` (string|array): user/agent/import (string or list). Missing counts as 'agent'.
- `project_dir` (string): Absolute path to another project to query.
- `scope` (string): Exact, case-sensitive match on a constraint's scope (e.g. 'hooks/').
- `since` (string): Verified/created on or after this ISO date.
- `status` (string|array): active/superseded/deprecated (string or list).
- `superseded_by` (string): Entries replaced by this id (superseded_by == id).
- `supersedes` (string): The entry that superseded this id.
- `tags_all` (array): Entries with ALL of these tags.
- `tags_any` (array): Entries with AT LEAST ONE of these tags.
- `text` (string): Free text over text fields; every term must appear (AND, substring).
- `token_budget` (integer): Max tokens returned (default from config).
- `types` (array): Restrict to these entry types. Default: all.

### `get_project_summary` (~82 tokens)

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.

Input parameters:

- `project_dir` (string): Absolute path to another project to summarize
- `token_budget` (integer): Max tokens for the summary (default: 2000)

### `update_entry` (~90 tokens)

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

Input parameters:

- `id` (string, required): Entry ID (e.g. 'dec-001', 'pipe-003', 'con-012')
- `project_dir` (string): Absolute path to another project whose entry should be updated
- `updates` (object, required): Fields to update. Any field except id and created_at.

### `deprecate_entry` (~135 tokens)

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

Input parameters:

- `id` (string, required): Entry ID to deprecate
- `merge_into` (string): 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_dir` (string): Absolute path to another project whose entry should be deprecated
- `reason` (string, required): Why this is being deprecated
- `superseded_by` (string): ID of the replacing decision (decisions only)

### `prune_stale` (~69 tokens)

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

Input parameters:

- `days` (integer): Entries not verified in this many days are flagged (default: from config)
- `project_dir` (string): Absolute path to another project to prune

### `get_compaction_report` (~46 tokens)

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

Input parameters:

- `project_dir` (string): Absolute path to another project to check

### `verify_quality` (~73 tokens)

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

Input parameters:

- `min_reason_chars` (integer): Below this length, flag the entry as thin (default: 80)
- `project_dir` (string): Absolute path to another project to verify

### `export_markdown` (~67 tokens)

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

Input parameters:

- `path` (string): Output path relative to project root. Default: config markdown_export.path.
- `project_dir` (string): Absolute path to the target project.

### `reload_constraints` (~53 tokens)

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.

Input parameters:

- `project_dir` (string): Absolute path to the target project.

### `export_snapshot` (~86 tokens)

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.

Input parameters:

- `project_dir` (string): Absolute path to the target project.

### `import_snapshot` (~64 tokens)

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.

Input parameters:

- `project_dir` (string): Absolute path to the target project.

### `mirror` (~79 tokens)

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.

Input parameters:

- `op` (string, required): pull = remote→local merge; backfill = local→remote push.
- `project_dir` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp#diagnostics

## Score history

- 2026-08-03: 50
- 2026-08-02: 50
- 2026-08-01: 45
- 2026-07-31: 26
- 2026-07-29: 44
- 2026-07-28: 44
- 2026-07-27: 44
- 2026-07-26: 44

## Links

- PyPI project: https://pypi.org/project/context-keeper-mcp/
- Socket report: https://socket.dev/pypi/package/context-keeper-mcp
- Repository: https://github.com/jarmstrong158/context-keeper
- Changelog RSS feed: https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/jarmstrong158-context-keeper/context-keeper-mcp
