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.

Semantic Cache MCP

PYPI · SEMANTIC-CACHE-MCP

File cache for coding agents: re-reads cost ~40 tokens, changed files return diffs.

Available components

+15 this week 78 Trust /100

Last scanned (18 hours ago)

Scores higher than 76% of PyPI servers

Category Developer Tools

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 Security100
  • No malware found by supply-chain analysis.Pass
  • 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
  • 1 of 17 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to CoderDayton/semantic-cache-mcp). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 12 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability64
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 4407 tokens (~314/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 Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
Tool Safety75
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • 0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
  • An AI judge read all 15 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

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

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.

  • 4 Nov 26 +15
    • Malware scan: unverified → pass ▲ security
  • 30 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 29 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 28 Oct 26 −15
    • Malware scan: pass → unverified ▼ security
  • 24 Oct 26 +15
    • Malware scan: unverified → pass ▲ security
  • 23 Oct 26 63

    First indexed and scored.

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/semantic-cache-mcp@0.7.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 CoderDayton/semantic-cache-mcp
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/CoderDayton/semantic-cache-mcp/.github/workflows/release.yml@refs/tags/v0.7.0
Rekor log index 3417766797
Predicate type PyPI publish attestation https://docs.pypi.org/attestations/publish/v1
Subject digest sha256:b197cbdafdf8b1d4f22d99a83af3e3b577e09fb16c900ec30891ececd062d46b

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 17 packages
Packages resolved 17
Stale 1
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 14 exposed · ~4,027 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
batch_edit ~419

Apply many exact edits to one file in a single atomic call. Preferred over repeated `edit` calls on the same file: one response, applied atomically, faster on large files. Partial success is allowed — any failed edits are returned with their reason so you can retry just the misses (status is `edited` when all apply, `partial` when some fail, `no_changes` when none do). A `dry_run` writes nothing and says so: the status becomes `would_edit`/`would_partial` and `dry_run: true` comes back with it. For edits across different files, call the tool once per file. `edits` is a JSON array; each entry is one of: - `[old, new]` — exact find/replace. - `[old, new, start_line, end_line]` — find/replace confined to a range. - `[null, new, start_line, end_line]` — replace that line range wholesale. - `{"old": ..., "new": ..., "start_line": ..., "end_line": ...}` — object form. Prefer line-range entries when you already have line numbers from `read`. Pass `known_hash` and the response carries a claimable `content_hash`, so no read is needed afterwards; without it, or with `auto_format`, you get `file_hash` instead.

NameTypeReqDescription
auto_formatboolean–Run the formatter after all edits.
dry_runboolean–Preview without writing.
editsstringyesJSON array of edit entries, in any of the forms above.
known_hash––The `content_hash` from your last read of this file. Proves you hold the text being edited, so the result can be handed back as a claimable `content_hash`.
pathstringyesFile path to modify (absolute, or relative to root).
show_diffboolean–Return the full diff even on a deterministic all-success batch.

No output schema declared.

No examples provided.

batch_read ~343

Read several files at once under a shared token budget. Cheaper than many single `read` calls. To make files searchable without reading them at all, use `warm` instead — this tool returns their text. Pass `known_hashes` and each file you still hold collapses to an `unchanged` count, or to a diff when it moved on disk; the rest come back in full with their `content_hash`. A file over `max_size` comes back as a map (see `read`) and carries none: a map is not the file. Smallest files are read first, and a file too big for the remaining budget is listed under `skipped` while smaller ones keep being read. Recover anything skipped with `read` using `offset`/`limit`. Paths are relative to the `root` the response names, when there is one worth naming.

NameTypeReqDescription
known_hashesstring–JSON object mapping a path to the `content_hash` you still hold for it, e.g. `{"src/a.py": "8f3c..."}`. Any file you cannot vouch for this way is sent in full.
max_total_tokensinteger–Total token budget shared across the whole batch.
pathsstringyesThe files to read — a comma-separated list, a JSON array, or glob patterns (expanded for you).
prioritystring–Optional paths to read first, ahead of the remaining files. Ordering only — a priority file still has to fit the budget, and is skipped like any other when it does not.

No output schema declared.

No examples provided.

clear ~89

Empty the cache. Does not touch any project file. Removes every cached file entry and returns how many were dropped; the next `read`/`batch_read` re-seeds from disk. Use rarely — only to recover from stale cache state or force a cold re-seed. Normal reads already refresh changed files on their own, so this is seldom needed. Takes no arguments.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

delete ~162

Delete one file or symlink and evict its cache entries. Use this for explicit single-path removal instead of shelling out. A missing path is reported as status `not_found`, not an error. Statuses: `deleted` (removed), `would_delete` (dry-run preview only, and `dry_run: true` comes back with it), `not_found` (nothing was there). Constraints: one path only — no globs, no recursion, no real-directory deletes. A symlink path deletes the link itself, never its target.

NameTypeReqDescription
dry_runboolean–Preview the outcome without deleting or evicting the cache.
pathstringyesFile or symlink path (absolute, or relative to the project root).

No output schema declared.

No examples provided.

edit ~463

Edit one file by exact text replacement. Three modes: - find/replace: `old_string` + `new_string` (the default). - scoped: add `start_line`/`end_line` to confine the search to a range. - line-range: omit `old_string` and give both lines to replace them wholesale. `old_string` must match exactly — whitespace and indentation included — and, unless `replace_all=true`, must be unique, or the edit fails. Use `edit_preview` first if you're unsure an anchor is unique. Returns the replacement count and the affected line numbers, and refreshes the cache. The diff itself is omitted unless you ask for it with `show_diff`; `diff_state` always tells you which you got. A `dry_run` writes nothing and says so: the status is `would_edit` and `dry_run: true` comes back with it. For several edits to one file use `batch_edit`; for a full rewrite use `write`. Pass `known_hash` and the response carries a claimable `content_hash`, so no read is needed afterwards. Without it, or with `auto_format`, you get `file_hash` instead — editing a file is not the same as having read it.

NameTypeReqDescription
auto_formatboolean–Run the formatter after editing.
dry_runboolean–Preview without writing.
end_line––1-based inclusive end line for a scoped or line-range edit.
known_hash––The `content_hash` from your last read of this file. Proves you hold the text being edited, so the result can be handed back as a claimable `content_hash`.
new_stringstring–Replacement text (an empty string deletes the match).
old_string––Exact text to find. Omit only for a line-range replacement.
pathstringyesFile path to modify (absolute, or relative to root).
replace_allboolean–Replace every occurrence instead of requiring a unique match.
show_diffboolean–Return the diff even on a deterministic edit.
start_line––1-based inclusive start line for a scoped or line-range edit.

No output schema declared.

No examples provided.

edit_preview ~133

Show where `old_string` would match in a file, without editing it. Returns the match count, 1-based line numbers, and short snippets so you can confirm an anchor is unique before calling `edit`. Read-only and cheap (kept under ~200 tokens), so use it freely as a probe. Raises an error on a binary file or an empty `old_string`.

NameTypeReqDescription
old_stringstringyesAnchor text to locate. Must match exactly, including whitespace and indentation. Cannot be empty.
pathstringyesFile path to search (absolute, or relative to root).

No output schema declared.

No examples provided.

glob ~133

List files matching a glob and show which are already cached. Use it to discover files and see what `search`/`grep` can already access before you spend reads. Each match carries a `cached` flag; set `cached_only=true` to list only files already in the cache. Pair it with `batch_read` to pull in whatever isn't cached yet.

NameTypeReqDescription
cached_onlyboolean–Return only files that are already cached.
directorystring–Base directory the pattern is evaluated from.
patternstringyesGlob pattern to match (e.g. `src/**/*.py`).

No output schema declared.

No examples provided.

grep ~484

Search cached file contents for an exact string or regex. Fast, exact, line-numbered matching over files already in the cache — it does NOT touch disk, so index files first with `warm`, which costs a few dozen tokens however many files it covers (empty results usually mean the files aren't cached). A pattern that is not a valid regex is an error, never an empty result, so zero matches always means zero matches. For concept-level questions where you don't know the exact term, use `search` instead. Counts are complete unless the response says otherwise: if a cap stops the scan, `complete` comes back false with `limit_reached` naming which one, so `total_matches` is never mistaken for the total that exists. Each file's hits come back as `"<line>:<text>"` strings under `lines`, with context lines using `-` instead of `:`. Paths are relative to the `root` the response names, when there is one worth naming. The cache is shared across projects, so a relative `path` — or none — searches only the current project; an absolute `path` reaches files anywhere. A repeated group wrapping an unbounded quantifier (`(a+)+`) is rejected rather than run — it can take exponential time and cannot be interrupted once started. Drop the redundant repeat, or pass `fixed_string=true`.

NameTypeReqDescription
case_sensitiveboolean–Match case-sensitively.
context_linesinteger–Lines of surrounding context to include around each match. Overlapping windows are merged, so no line is sent twice.
fixed_stringboolean–Match `pattern` literally instead of as a regex.
max_filesinteger–Cap on the number of files returned.
max_matchesinteger–Cap on total matches returned across all files.
outputstring–How much to return — `matches` (default), `paths` for the matching files without their lines, or `count` for the totals alone.
path––Optional filter — an exact path, a path suffix, a directory (matching every cached file beneath it), or a glob.
patternstringyesA regular expression, or a literal string when `fixed_string=true`.

No output schema declared.

No examples provided.

read ~645

Read a file, returning as few tokens as possible. For 2+ files, use `batch_read`. The first read returns the file's full content plus a `content_hash`. Echo it back as `known_hash` on every later read: an unchanged file then answers `"unchanged": true` with no body, a changed one returns a unified diff, and without it the file is always sent in full. Reading also caches the file so `grep`, `search`, and `batch_read` can see it. A file larger than `max_size` returns a map instead of its text: the outline below, or for a file with no definitions its first and last lines under `// L<a>-<b>` anchors, flagged `truncated` with `total_lines`. Use `offset`/`limit` to read the exact lines it names. A read that returns only part of a file — a line range, or a map — reports `file_hash` (prefixed `partial:`) rather than `content_hash`, and it cannot be redeemed as `known_hash`. A ranged read also returns a `coverage_token`: pass it back as `known_hash` on your next ranged read and a window you already hold answers `unchanged`; once the windows cover the whole file you get a claimable `content_hash`. For a large or unfamiliar file, `outline=true` is the cheap first read: one line per class/function as `<line>: <signature>`, and every number is an `offset` you can read next. An outline is a map, not the file, so it comes back as `file_hash`. `is_diff` marks a unified diff and `truncated` marks a map. A binary file returns metadata instead of content; for images use `read_image`.

NameTypeReqDescription
known_hash––The `content_hash` from your last read of this file — or the `coverage_token` from your last ranged read of it — passed back to get `"unchanged"` instead of the content re-sent. Omit only on a first…
limit––Number of lines to return starting at `offset`.
line_numbersboolean–Prefix each line of a ranged read with its number. Costs about 17% more tokens; the range is in `lines` either way. Requires `offset` or `limit`.
max_sizeinteger–Byte threshold above which a map of the file is returned instead of its text; read exact lines with `offset`/`limit`.
offset––1-based first line for a ranged read; omit or pass 0 to start from the first line.
outlineboolean–Return the file's definitions and their line numbers instead of its text. Cannot be combined with `offset`/`limit`.
pathstringyesFile path (absolute, or relative to the project root). Use an absolute path for files outside the project root.

No output schema declared.

No examples provided.

read_image ~198

Read an image file so the model can see it. Returns an MCP image block (base64 data + mime type) plus a small JSON metadata sidecar (`size`, `mime`). Use this only when the model needs to view the image; for text or any other file type use `read`. The format is detected from the file's magic bytes, not its extension, so a mis-named image still works and a non-image (e.g. text saved as `.png`) is rejected. Supports PNG, JPEG, GIF, TIFF, BMP, and WebP. Images are never cached — every call re-reads from disk. Oversized images are rejected before encoding; the cap is `SCMCP_MAX_IMAGE_BYTES` (default 5 MiB), bounded by Anthropic's ~5 MB upload limit.

NameTypeReqDescription
pathstringyesImage file path (absolute, or relative to the project root).

No output schema declared.

No examples provided.

search ~266

Find cached files by keyword relevance (BM25 ranking). Searches only files already in the cache — index them first with `warm`, which returns counts rather than content (thin results usually mean too few files are cached). Ranks by BM25 term relevance, so multi-word and keyword queries work well; matching is lexical, not embedding-based, so synonyms won't match a word that isn't present. Terms are OR'd — a word the corpus happens not to contain costs you ranking, not the whole result set. For an exact string or regex use `grep`; to pull more of the repo into the cache use `batch_read`. Returns matches with a normalized 0–1 relevance score (best match = 1.0) and a short preview. The cache is shared across projects, so a search with no `directory` ranks the current project only; name one to look elsewhere.

NameTypeReqDescription
directory––Restrict matches to files under this directory. Defaults to the project root.
kinteger–Maximum number of matches to return.
querystringyesKeywords to rank by. Natural-language phrasing is fine, but ranking is on the individual words.
show_previewboolean–Include a short preview line for each match.

No output schema declared.

No examples provided.

stats ~75

Report cache health, token savings, and runtime diagnostics. Returns storage occupancy (files, tokens, documents, DB size), session and lifetime token savings and cache hit rates, per-tool call counts, and process memory. Use it to measure or debug — not as a routine step in read/edit loops. Takes no arguments.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

warm ~252

Index files into the cache so `grep` and `search` can see them, returning counts only. Costs a few dozen tokens however many files it indexes: no content, no previews, no paths for the files that succeeded — just how many were indexed, how many were already current, and how many were not. Anything not indexed is counted in `skipped`, and the first few come back under `failures` with a reason (`not_found`, `not_a_file`, `binary`, `too_large`, `unreadable`, `timeout`). If a cap stopped the walk early you get `truncated` or `incomplete` rather than a short count that looks complete. Use it before searching an unfamiliar tree, then `grep` for the exact string or `search` for the concept, and `read` only what those name.

NameTypeReqDescription
max_filesinteger–Cap on files indexed in this call. Matches beyond it are left out and flagged with `truncated`.
pathsstringyesFiles to index — a comma-separated list, a JSON array, or glob patterns (expanded for you, e.g. `src/**/*.py`).

No output schema declared.

No examples provided.

write ~365

Create a file or replace its entire contents. Use this for new files or full rewrites; for localized changes prefer `edit` or `batch_edit`. Status is `created` for a new path or `updated` for an existing one; an update reports `diff_state`, and includes the diff against the previous content only when you ask with `show_diff`. A `dry_run` writes nothing and says so: the status is `would_create`/`would_update` and `dry_run: true` comes back with it. Writing refreshes the cache so later reads, `grep`, and `search` see the new text. A full write supplies the whole file, so the `content_hash` it returns is claimable. An append only adds a tail: pass `known_hash` to show you held the rest, or you get `file_hash` instead. `auto_format` reports `file_hash` too — the formatter's output is not what you sent.

NameTypeReqDescription
appendboolean–Append `content` to the end of the file instead of overwriting.
auto_formatboolean–Run the formatter after writing.
contentstringyesFull file content, or the text to append when `append=true`.
create_parentsboolean–Create any missing parent directories.
dry_runboolean–Preview the result without writing.
known_hash––The `content_hash` you hold for this file. Only needed for `append`, to prove you hold the part you are not resending.
pathstringyesFile path to create or replace (absolute, or relative to root).
show_diffboolean–Return the unified diff even on a deterministic write.

No output schema declared.

No examples provided.

Install

How do I install the Semantic Cache MCP server?

Semantic Cache MCP runs locally as a PyPI package, launched with uvx semantic-cache-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 · semantic-cache-mcp

# add to Claude Code
claude mcp add coderdayton-semantic-cache-mcp -- uvx semantic-cache-mcp
Common questions

What is the Semantic Cache MCP server?

Semantic Cache MCP is listed in the public MCP registry as io.github.CoderDayton/semantic-cache-mcp. File cache for coding agents: re-reads cost ~40 tokens, changed files return diffs. This page covers its PyPI package (semantic-cache-mcp).

Is the Semantic Cache MCP server safe to use?

Semantic Cache MCP scores 78 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 Semantic Cache MCP server expose?

Semantic Cache MCP exposes 14 tools: read, read_image, stats, clear, delete, and 9 more. Their descriptions and schemas cost roughly 4,027 tokens of context every time the server is loaded.

Is the Semantic Cache MCP server still maintained?

Semantic Cache MCP 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 Semantic Cache MCP server under?

Semantic Cache MCP declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.