inspeximus: agent memory with provenance, GDPR erasure and a tamper-evident audit trail
PYPI · INSPEXIMUS
Self-correcting agent memory: recall, supersede, revert, forget, GDPR erasure, audit receipts.
Available components
Last scanned (19 minutes ago)
Scores higher than 74% of PyPI servers
Category Memory and Knowledge
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 setuptools.build_meta 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 & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to DanceNitra/inspeximus). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 7 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability78
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 25447 tokens (~184/item across 138 items; 135 tools + 3 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 Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (7% of tools); any adoption earns full credit.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "forget_pii" implies "erase" 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 137 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
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.
- 5 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- 31 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 29 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 3.25.0 → 3.26.0 functional
- 28 Oct 26 +15
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Malware scan: unverified → pass ▲ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 3.23.1 → 3.25.0 functional
- Package version: 3.23.1 → 3.24.0 functional
- 26 Oct 26 0
- Package version: 3.23.0 → 3.23.1 functional
- 24 Oct 26 0
- Stability: 0.97 → pass security
- 23 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.
- 22 Oct 26 0
- Package version: 3.22.0 → 3.23.0 functional
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 5 Nov 2026 · Analysed pypi/inspeximus@3.26.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 | DanceNitra/inspeximus |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/DanceNitra/inspeximus/.github/workflows/release.yml@refs/tags/v3.26.0 |
| Rekor log index | 3559639983 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:bed32610c57911e96e4590f42f25c3accc287991511d993a02dda94049946da5 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 0 packages
| Packages resolved | 0 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
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 →
identifier_contract ~476
WHAT ARE THIS STORE'S IDENTIFIERS, and which folds over them would LOSE information? The question a store outlives its writer to face: someone holds the file months later, the version that wrote it is gone, and whatever deformation happened is already in the bytes. They cannot run a conformance suite. What they need is narrower — which keys are canonical, which folds were DELIBERATE, and which are INVERTIBLE. At remediation time that last distinction is the one that matters: an injective deformation is a backfill job, a fold that maps two keys onto one cannot be undone. Returns `declared` (what the running writer promises — byte-exact, case-sensitive, no normalisation) beside `measured` (what each candidate fold would actually cost on THIS store's keys, independently of the claim). Measured on our own decision store: an 8-character prefix fold would merge 594 groups and lose 1,365 keys, and no field declared any policy at all. A ZERO COST HAS TWO CAUSES and they render identically, so each fold also carries a `verdict`. COST_MEASURED means keys demonstrably merge. NOT_YET_MEASURABLE means the population is too small for zero to mean anything — 13 UUID keys against an 8-hex-character fold collide with probability ~1e-8, so a zero there is the absence of a signal rather than a clean bill of health. ZERO_AT_SCALE is the only one that says the fold is harmless on keys like these. Prefix folds also carry `threshold_population` (how many more keys before a collision is expected, from the per-position perplexity of this store's own keys) and `collides_at_length` / `headroom_chars`, which need no model at all: how many characters shorter the fold would have to be before it started merging. HONEST SCOPE, in `limits`: `declared` speaks for the code running now, not for the version that wrote a record last year; and `measured` sees only surviving keys, so a fold that ALREADY collapsed two of them left no trace of the second. Absence of merging is not proof that none occur…
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
incident_report ~73
The Art. 73 report skeleton for incident `seq`: dates, the statutory deadline and whether it is overdue, the evidence entries with their memory state and any oversight on them, later entries that refer to the incident, and the fields the provider must add. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| seq | integer | yes | – |
No output schema declared.
No examples provided.
incident_reported ~90
Record that incident `seq` was reported (Art. 73, Art. 26(5)): to whom and when. A later entry that names the incident; incident_report and oversight_report treat it as closed from then on.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| note | – | – | – |
| reported_to | string | yes | – |
| reported_ts | – | – | – |
| seq | integer | yes | – |
No output schema declared.
No examples provided.
index_coherence ~83
Does the derived semantic index agree with the store? Reports active text records missing a vector while an embedder is configured (index behind store), persisted-vector recipe vs the current embedder, and the persistence regime. A governed store can still serve stale answers through a lagging index — this is the deterministic check for exactly that. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
influence_gate_report ~59
POISON / adversarial-integrity status: which memories are gated from influencing recall durability (self- asserted / uncorroborated / slashed) vs earned. The at-a-glance view of the store's poison-resistance state.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
irreversible_budget_report ~60
Audit view of the per-source lifetime IRREVERSIBLE-influence budget: how much durable pull each source has spent against its cap — the 'no single source can quietly entrench itself' ledger. Read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| budget | number | – | – |
No output schema declared.
No examples provided.
literacy_register ~27
Every Art. 4 measure recorded, with counts by audience and by measure. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
mandate_breaches ~143
Every recorded action that its signed mandate check marked outside the declared mandate, oldest first, with the reasons, how many actions were checked and how many ran with no mandate in force, and every mandate declaration with the handle that wrote it. A mandate is declared by the operator through ActionLedger.mandate(), never over MCP, so the agent it governs cannot widen it. Tool calls through this server are recorded as `mcp:<tool>` with no target, so a mandate for them names action patterns only. Read from the entries as written; nothing is re-judged or inferred.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | – | – | – |
| since | – | – | – |
No output schema declared.
No examples provided.
memory_index ~435
THE ALWAYS-LOADED INDEX: one line per record, budgeted, so the right one gets opened. A store too big to hold in context is read through a small index, and the agent decides what to open from those lines alone. The line is therefore the only surface a future need can reach: a record whose line does not distinguish it is present, correct, and never retrieved. MEASURED on a 316-note store, 120 questions written from the note bodies and shown to no line-writer, ranking all 316 candidates. recall@3 on full questions / on the three-to-eight words someone types into a search box: a hand-written title-and-hook 0.333 / 0.508; the title alone 0.300 / 0.450; title plus its highest-idf terms 0.350 / 0.533; a line saying what the record CONCLUDED 0.683 / 0.833; the full records, as a ceiling, 0.858 / 0.967. So the line worth having is a sentence about the conclusion, and no extraction produces one -- term-stuffing is a null on both registers. Which is why the useful call is not this one alone: read `needs_line`, write those sentences yourself, and store them with `set_index_line`. Without them this returns the fallback -- the record's opening sentence, measured through this same call at 0.442 / 0.525 against 0.692 / 0.842 with written lines -- and `limits` says which you got. `budget_tokens` shortens lines to fit and NEVER drops a record -- a record with no line cannot be found at all -- so a budget too small to hold one line each is reported as exceeded rather than silently met. The one exception is not the budget's: a record a standing Art. 21 objection withholds (record_objection) gets no line, and `withheld_by_objection` counts them.
| Name | Type | Req | Description |
|---|---|---|---|
| budget_tokens | integer | – | – |
No output schema declared.
No examples provided.
memory_report ~215
INSPECTOR overview — 'what is in memory, and is it clean': active/superseded counts, by type, likely duplicates (>= dup_threshold), and integrity posture. The at-a-glance store-health view. Read-only. NOT free, and the caller here is a model mid-conversation. The duplicate estimate samples 400 records and runs a FULL recall for each, so it is O(400 x n) over the whole store: measured ~2 s at n=2,000 and ~12 s at n=8,000 (no embedder; median of 5, run-to-run spread 15-25%, so two significant figures is all this supports). "At-a-glance" describes the output, not the wait. The counts (active/superseded/by_type/linked/decayed) are single passes and effectively free -- if that is all you need, this tool is the expensive way to get it.
| Name | Type | Req | Description |
|---|---|---|---|
| dup_threshold | number | – | – |
No output schema declared.
No examples provided.
neighbors ~119
Expand context AROUND a memory: the k memories most related to the one with `id` (compact snippets), by recalling on that memory's own text and excluding itself. Use it for on-demand local context after recall surfaces a relevant hit — a bounded expansion, not a whole-store dump. Returns [] if the id is unknown. Honours the active project scope, like recall: expanding around a hit must not be a side door back into another project's memories.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | – |
| k | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
notice_register ~31
The latest Art. 13 or 14 notice per subject and the items each one left out. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
objections ~25
Every Art. 21 objection this store has recorded, standing or resolved. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
observe ~327
READ-PATH review trigger — the mirror of a write-time hold-for-review. Feed it an OBSERVATION (evidence, NOT an authoritative write) that CONTRADICTS a settled memory: a different value for `key`, or object="" for a value-obscuring revert ("go back to what we had", names no value). Instead of silently trusting or ignoring it, this REOPENS that settled record for review. A NAMED contradiction (a different value) reopens only once it is CORROBORATED, so a lone stray restatement stays an echo and does not reopen: `support` (a list of the distinct grounds the observation rests on) is what corroboration counts, a restatement whose grounds were already seen is an echo, and it takes >= reopen_corroboration distinct novel grounds. A VALUE-OBSCURING revert (object="") reopens on FIRST sight: it names no value, so there is nothing a second observation could corroborate or echo, and the only safe outcome is a steward's decision. The record stays current meanwhile; nothing is restored until resolve_reopened says so. observe() NEVER supersedes or writes — it only flags; a steward closes the review with resolve_reopened(). Use it for contradicting evidence you don't want to act on blindly. Returns {reopened, key, pending, need, surfaced_prior, review_id}.
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | – |
| object | string | – | – |
| support | – | – | – |
| text | string | yes | – |
No output schema declared.
No examples provided.
open_partition ~180
Open a memory partition: a named scope per agent or per process with a size cap and an expiry (the CNIL's 2026 note on agentic AI). Writes made with `remember_in_partition` are tagged into it; `sweep_partitions` applies the expiry and cap with tombstones; `close_partition` ends the process (a context partition erases its records at close). `kind` is context, process or agent. Opening a name that is already open returns that partition when the rules match, and is refused when they differ: a partition's rules are fixed when it opens. The result states the rules IN FORCE, read back from the registry.
| Name | Type | Req | Description |
|---|---|---|---|
| agent | – | – | – |
| kind | string | – | – |
| max_age_days | – | – | – |
| max_records | – | – | – |
| name | string | yes | – |
No output schema declared.
No examples provided.
oversight_report ~55
Counts from the action ledger an auditor asks for: actions, oversight events by type and by actor, actions with a human decision attached, error actions with no oversight after them, stops, and disclosures by session. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
partitions_report ~60
Every partition with its rules, live count, oldest age, whether a sweep is due, and its closed state; plus how many active records sit outside any partition. The storage-limitation view (GDPR Art. 5(1)(e)).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
pii_report ~83
What PII the store currently holds, by type (emails, phones, cards, …) — a data-minimization / audit view. Every record the store holds is counted, superseded ones included (`superseded_with_pii` says how many), because forget_pii erases those too. Read-only; pair with forget_pii to act on it.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
poll_memory_events ~228
What changed in the store since `since_seq`, from the `memory_events` table the row writer appends to INSIDE its own transaction: {events: [...], tip: <highest seq now>}. Each event is {seq, ts, type, memory_id, agent, tenant, payload}; the automatic ones (record.added, record.changed, record.removed) carry only id, key, status and mtype, never text, so tail them and fetch the record with `get`/`recall` where the grants apply. Another process's write is visible on the next call, no reload. Keep `tip` and pass it back as `since_seq`. `event_type` "*" (or empty) means every type. A JSON-format store (INSPEXIMUS_STORE_FORMAT=json, an encrypted store) has no event table, and the call is an error there rather than an empty feed.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | – | – | – |
| event_type | – | – | – |
| limit | integer | – | – |
| since_seq | integer | – | – |
No output schema declared.
No examples provided.
post_market_report ~146
The Art. 72 post-market monitoring report for one period, from the ledgers: actions and errors, oversight by event, incidents and their clocks, rights requests, risks recorded (and those found from post-market data), retention, lifecycle, disclosures, the chain verifier's verdict, and the store's size. `plan` is the operator's monitoring plan, carried by name, version and hash. With `actor` the report is signed into the ledger as a `monitoring` entry; without it, read-only.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | – | – | – |
| note | – | – | – |
| plan | – | – | – |
| since | number | yes | – |
| until | – | – | – |
No output schema declared.
No examples provided.
processing_roles ~25
Every Art. 28 role declaration, with the current one named. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
projects ~118
List the project scopes present in this store, with a memory count each — the map for `all_projects` search and the check that your writes are landing where you think. `unscoped` counts memories carrying no project stamp: they are GLOBAL (visible from every project), which is what a store written before project scoping was adopted looks like, and why adopting a scope does not hide anything you already had. `active` is this server's own scope (null = it sees everything). Read-only, deterministic, no LLM.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
provenance ~174
WHERE DID THIS FACT COME FROM — one answer, assembled from the whole record: the declared source and the lineage it inherited through summarization, whether an origin attestation bound it to a verified key, its evidence grade, every value it has held and WHICH policy retired each one, and whether it still matches the write receipt committed at write time (so a later relabel is loud). Pass `key` (the fact, across all its values) or `id` (one record). Read-only; the returned `limits` state honestly what this does NOT prove. A quarantined record's text and value are withheld, unless `include_quarantined` is set.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | – |
| include_quarantined | boolean | – | – |
| key | string | – | – |
No output schema declared.
No examples provided.
qms_register ~42
The current QMS procedure per name, the ones overdue for review, and which Art. 17(1) aspects have a current procedure. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
read_guard_report ~91
What the read-path guards (3.5.0) hold back: every quarantined record (instruction-shaped text, with the shapes that put it there and whether a human released it) and every keyword-stuffed record (the repeated word and its share). Quarantined records are stored, exportable and erasable; they are kept out of recall unless asked for. Read-only.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
recall ~923
Retrieve the top-k memories by RELEVANCE × accrued VALUE (not recency). Use this to load relevant prior knowledge before reasoning. Records the read-path guards quarantined (instruction-shaped text, 3.5.0) are left out unless `include_quarantined` is set; keyword-stuffed records never outrank clean ones. `include_archive` also searches the archive segments beside the store (old captured mechanics moved out by `--archive`); it opens every segment, so it is slower and off by default. Compact by default: each hit is a small projection — {id, text, score, value, tags} — dropping internal bookkeeping fields the model doesn't reason over, which keeps recall cheap to drop into a prompt. FULL TEXT IS KEPT (no truncation by default). Pass `snippet_chars>0` to opt into snippet truncation (flags `truncated`; then use get(id) for full text) — note that truncation can cut off a corrected value past the boundary, so it is off by default. Set `full=True` to return complete records (all fields). `k` is hard-capped for safety. `mmr` (0..1, off by default) reranks for DIVERSITY so you don't get k near-duplicate memories — 1.0 = pure relevance, lower = more diverse (deterministic Maximal Marginal Relevance, zero-LLM). `trusted_only=True` (needs a configured trust root: INSPEXIMUS_TRUST_SEEDS on this server) returns only memories anchored to a trusted signing key or source — a deterministic defense against injected/poisoned memories from untrusted writers. With no trust root configured the call is an error, not an empty list that reads as "nothing trusted matched". `resolve_conflicts=True` (or server-wide INSPEXIMUS_READ_RESOLVER=1) resolves near-duplicate same-subject candidates at read time by value BIRTH — an un-keyed restatement of a superseded value is demoted below the correction instead of out-ranking it; the surviving hit carries `resolved_over` ids. Deterministic, zero-LLM. (Standard progressive-disclosure / small-to-big retrieval practice, not a inspeximus-specific techniq…
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | – | – | – |
| all_projects | boolean | – | – |
| full | boolean | – | – |
| include_archive | boolean | – | – |
| include_quarantined | boolean | – | – |
| k | integer | – | – |
| mmr | – | – | – |
| query | string | yes | – |
| rerank_by | – | – | – |
| resolve_conflicts | – | – | – |
| session_id | – | – | – |
| snippet_chars | integer | – | – |
| trusted_only | boolean | – | – |
| user_id | – | – | – |
| with_warrant | boolean | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
recall_as ~165
Recall AS a named agent: the same ranking as `recall`, hard-filtered to what that agent owns or has an active grant for. FAIL-CLOSED -- an agent with no grants sees only what it wrote itself, and a grant that cannot be evaluated authorises nothing. This is a SEPARATE tool rather than an `as_agent=` argument on `recall` on purpose: an access-control scope that is an optional parameter is one a caller can forget, and forgetting it would read the whole store. Here the scoped read is the only thing this tool can do.
| Name | Type | Req | Description |
|---|---|---|---|
| agent | string | yes | – |
| full | boolean | – | – |
| k | integer | – | – |
| query | string | yes | – |
| snippet_chars | integer | – | – |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | – |
No examples provided.
recall_followup ~427
MULTI-HOP recall, PHASE 2 of 2 — hand back the follow-up queries YOUR model wrote after reading `recall_iterative`'s round-1 hits, together with the `prior_ids` it returned. Each follow-up is retrieved and only the records you do NOT already hold come back, so the second round costs you the bridge evidence and nothing else. `prior_ids` is the whole continuation state — there is no session on the server, nothing to expire, and nothing that can be served to the wrong caller. Pass it. Without it every follow-up hit is reported as new, including the ones round 1 already gave you. Want a further round? Call this again with `merged_ids` from this result as the new `prior_ids`. Rounds are your loop; the server holds no state between them. Returns {followups_used, followups_dropped, new_hits, bridged, merged_ids, recall_calls, bounds}. `bridged` is how many records this hop added — 0 is a legitimate answer and means the bridge was not there. BOUND: at most min(len(followups), max_followups) recall() calls, `max_followups` itself capped at 8, and at most k * max_followups NEW records. Worst case with both at their ceilings: 8 retrievals, 400 records. Nothing here scales with store size. Honours the active project scope; `all_projects=True` crosses it, and must match what you passed to `recall_iterative` or round 2 searches a different pool than round 1.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | – | – | – |
| all_projects | boolean | – | – |
| followups | – | – | – |
| full | boolean | – | – |
| k | integer | – | – |
| max_followups | integer | – | – |
| prior_ids | – | – | – |
| query | string | yes | – |
| session_id | – | – | – |
| snippet_chars | integer | – | – |
| trusted_only | boolean | – | – |
| user_id | – | – | – |
No output schema declared.
No examples provided.
recall_iterative ~503
MULTI-HOP recall, PHASE 1 of 2 — use this instead of `recall` when the answer needs a fact that is reachable only THROUGH another one ("who manages the person who signed off on X", "what did the vendor we switched to in March charge us"). One-shot top-k systematically misses that second hop: the record holding it is similar to the BRIDGE entity, not to your question, so no amount of ranking brings it back. HOW THIS WORKS, AND WHY YOU ARE IN THE LOOP. The fix is to read round-1, name what is missing, and search again — which needs a model. inspeximus does not have one and will not grow one: no LLM on the write path and none inside the read path either. You ARE the model. So this returns round-1 hits plus `ask` (the instruction) and `prior_ids` (the continuation token), you decide what the bridge is, and you hand it back to `recall_followup`. Your model stays yours; the retrieval, dedup and merge stay deterministic and ours. Returns {k, max_followups, round, hits, prior_ids, ask, next_call, bounds} — your query is not echoed back (you sent it, and a memory server should not reflect caller text into a model's context). If `hits` already answer the question, stop here — the second call is optional and costs a retrieval. BOUND: exactly ONE recall() and at most `k` records back (`k` hard-capped at INSPEXIMUS_MAX_K). The response size is a function of `k` alone and does NOT grow with the store — unlike this server's `contradictions` surface, whose all-pairs output reached ~150 MB at n=2,000. Honours the active project scope, like `recall`; `all_projects=True` searches every project. A multi-hop walk must not be a side door out of the scope its first hop respected.
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | – | – | – |
| all_projects | boolean | – | – |
| full | boolean | – | – |
| k | integer | – | – |
| max_followups | integer | – | – |
| query | string | yes | – |
| session_id | – | – | – |
| snippet_chars | integer | – | – |
| trusted_only | boolean | – | – |
| user_id | – | – | – |
No output schema declared.
No examples provided.
recommit ~302
The remedy `verify_writes` names for UNSCOPED records: append a fresh write receipt that binds each named record's CURRENT value, context and partition. IT BINDS THE STATE AS IT IS NOW. It does not validate the past: a record edited out of band before this call is committed as edited, and verifies clean afterwards. Run it ONLY on records you have checked against a copy you trust (a backup, an export, the source they were written from). `ids`: the records to recommit, as the UNSCOPED line lists them. `all=True` recommits every active record this server reads instead, and is only for a store checked in full. Pass one of the two: neither, or both, is refused and writes nothing. There is no whole-store default. A record whose latest receipt already binds all three is `skipped`, and a named id that matched no active record is named in `problems`. With a project scope, only that project's records and the unscoped ones are recommitted. Also refused, writing nothing, when this server cannot sign the way the chain is signed (a signed chain and no receipt key here, or the reverse): the new receipts would leave a chain signed in places, and verify_writes reports that. Needs receipts on. Returns {recommitted, skipped, problems}.
| Name | Type | Req | Description |
|---|---|---|---|
| all | boolean | – | – |
| ids | – | – | – |
No output schema declared.
No examples provided.
record_attestation ~129
Attest for one Art. 5(1) prohibited-practice class (a, b, ba, bb, c, d, e, f, g, h) that the system is `not_used` for it, or that the class is `not_applicable` with the `basis` that rules it out. The register shows the latest attestation per class and the classes with none.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| basis | – | – | – |
| practice | string | yes | – |
| statement | string | yes | – |
| system | – | – | – |
| ts | – | – | – |
No output schema declared.
No examples provided.
record_authority_request ~135
Record a reasoned request from a competent authority (EU AI Act Art. 21) and what was handed over. `scope` is documentation (21(1)), logs (21(2)) or both; `provided` lists {item, sha256} references to what was given, never the content (21(3) confidentiality).
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| authority | string | yes | – |
| language | – | – | – |
| note | – | – | – |
| provided | – | – | – |
| provided_ts | – | – | – |
| received_ts | – | – | – |
| reference | string | yes | – |
| scope | string | yes | – |
No output schema declared.
No examples provided.
record_breach ~185
Record a personal data breach (GDPR Art. 33) with its 72-hour clock from `aware_ts` (default now) and the Art. 33(3) content as far as known: nature, categories and approximate numbers of subjects and records, contact point, likely consequences, measures. `high_risk` is the Art. 34(1) judgement that decides whether the subjects must be told. `refers_to` lists ledger seqs; each must exist.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| aware_ts | – | – | – |
| categories | – | – | – |
| consequences | – | – | – |
| contact | – | – | – |
| high_risk | – | – | – |
| measures | – | – | – |
| nature | string | yes | – |
| records_approx | – | – | – |
| refers_to | – | – | – |
| subjects_approx | – | – | – |
| title | string | yes | – |
No output schema declared.
No examples provided.
record_corrective_action ~184
Record a corrective action (EU AI Act Art. 20): `kind` is conformity, withdraw, disable or recall; `non_conformity` what was wrong; `refers_to` the ledger seqs that are the evidence (each must exist); `informed` a list of {party, ts, how} among distributor, deployer, authorised_representative, importer, market_surveillance_authority, notified_body; `presents_risk` the Art. 79(1) case where the authority must be informed (20(2)). The report names which parties were not informed.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| causes | – | – | – |
| informed | – | – | – |
| kind | string | yes | – |
| non_conformity | string | yes | – |
| presents_risk | boolean | – | – |
| refers_to | – | – | – |
No output schema declared.
No examples provided.
record_declaration ~303
Record an EU declaration of conformity (EU AI Act Art. 47) with the Annex V items: the system's name, type and reference; the provider's name and address; the standards or common specifications used; the Art. 43 procedure (annex_vi_internal_control or annex_vii_notified_body, the latter with the notified body's {name, id, certificate}); the place, date and signer. `annex_iv_sha256` pins the technical documentation the declaration rests on; `ce_marking` is {digital_access, affixed_to, notified_body_id} (Art. 48). The assessment itself is the provider's or the notified body's.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| annex_iv_sha256 | – | – | – |
| authorised_representative | – | – | – |
| ce_marking | – | – | – |
| common_specifications | – | – | – |
| conformity_procedure | string | yes | – |
| harmonised_standards | – | – | – |
| issue_ts | – | – | – |
| notified_body | – | – | – |
| other_union_law | – | – | – |
| personal_data | boolean | – | – |
| place | string | yes | – |
| provider_address | string | yes | – |
| provider_name | string | yes | – |
| signed_for | string | yes | – |
| signer_function | string | yes | – |
| signer_name | string | yes | – |
| system_name | string | yes | – |
| system_reference | string | yes | – |
| system_type | string | yes | – |
No output schema declared.
No examples provided.
record_disclosure ~159
Record an EU AI Act Art. 50 disclosure in the action ledger: that the user in `session` was shown `shown` (stored as a digest plus its length) in `channel`. `kind` is interaction (told they interact with an AI system), generated_content (output marked as generated), or another Art. 50 case. `agent` names the agent that disclosed and `principal` who it acts for, as the Commission's Art. 50 guidelines ask for at each new interaction.
| Name | Type | Req | Description |
|---|---|---|---|
| agent | – | – | – |
| channel | string | – | – |
| kind | string | – | – |
| locale | – | – | – |
| principal | – | – | – |
| session | string | yes | – |
| shown | string | yes | – |
No output schema declared.
No examples provided.
record_incident ~125
Record a serious incident (EU AI Act Art. 73) in the action ledger with its reporting clock: severity serious (15 days), widespread (2 days), death (10 days) or other. `evidence` lists ledger seqs that document it; each must exist. `aware_ts` is when the provider became aware (default now).
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| aware_ts | – | – | – |
| description | – | – | – |
| evidence | – | – | – |
| severity | string | yes | – |
| subject | – | – | – |
| title | string | yes | – |
No output schema declared.
No examples provided.
record_lifecycle ~124
Record a lifecycle event of the system in the action ledger: start, stop, pause, resume, configuration_change, key_rotation, substantial_modification (the Art. 3(23) change that ends Art. 111(2) grandfathering) or decommission, which needs `disposition` of the persistent memory (erased, archived, transferred, retained). Annex IV point 6 and the deployer report list these entries.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| disposition | – | – | – |
| event | string | yes | – |
| note | – | – | – |
No output schema declared.
No examples provided.
record_literacy ~175
Record one AI-literacy measure (EU AI Act Art. 4): `measure` is training, guidance, documentation, briefing or assessment; `audience` is staff, contractor, operator_of_the_system or other_person_on_behalf; `considered` lists the Art. 4 factors taken into account (technical_knowledge, experience, education, training, context_of_use, persons_affected). The article asks for measures, not a level reached by any individual, so no score is recorded.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| audience | string | yes | – |
| considered | – | – | – |
| context | – | – | – |
| description | string | yes | – |
| measure | string | yes | – |
| persons_affected | – | – | – |
| refers_to | – | – | – |
| system | – | – | – |
| ts | – | – | – |
No output schema declared.
No examples provided.
record_notice ~239
Record that a data subject was given the GDPR Art. 13 (data collected from them) or Art. 14 (data obtained elsewhere) information: the channel (ui, email, letter, api, voice, document), the items the notice carried (controller_identity, dpo_contact, purposes_and_legal_basis, legitimate_interests, recipients, third_country_transfer, retention_period, rights, withdraw_consent, complaint_to_authority, provision_required, automated_decision_making; for Art. 14 also data_categories, data_source), and `text_sha256` pinning the text. Art. 14 needs `source` and `timing` (at_collection, within_one_month, at_first_communication, at_first_disclosure). The entry lists the items it did not carry.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| article | integer | – | – |
| channel | string | yes | – |
| items | array | yes | – |
| request_id | – | – | – |
| source | – | – | – |
| subject | string | yes | – |
| text_sha256 | – | – | – |
| timing | – | – | – |
| ts | – | – | – |
No output schema declared.
No examples provided.
record_objection ~212
GDPR Art. 21: record the subject's objection and stop serving their records. From this call on, every read that searches or lists the store withholds every record whose source resolves to `subject`, including later writes, until the objection is resolved: recall and its variants, memory_index, verify_claim and check_conflict, and why_recalled explains such a record without quoting it. Every server on this store honours it from its next call. `get(id)` still returns a record by its exact id, and the records stay exportable under Art. 15 (export_subject); erasure is forget_subject. `ground` is own_situation (21(1)) or direct_marketing (21(2), never overridable); `scope` is all or profiling.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| allow_ambiguous | boolean | – | – |
| ground | string | yes | – |
| request_id | – | – | – |
| scope | string | – | – |
| subject | string | yes | – |
No output schema declared.
No examples provided.
record_oversight ~127
Record a HUMAN decision about the agent's work in the action ledger: approve, refuse, override, stop or review (EU AI Act Art. 14, GDPR Art. 22). `actor` is the person or role who decided and is required. `refers_to` is the seq of the action it concerns and must exist. `decision` is what the human substituted, stored as a digest.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| decision | – | – | – |
| event | string | yes | – |
| reason | – | – | – |
| refers_to | – | – | – |
No output schema declared.
No examples provided.
record_processing_role ~157
Record who this store's operator is for the personal data in it (GDPR Art. 28): controller, joint_controller, processor or sub_processor. A processor names the `controller` and the written `instructions_ref` (28(3)), pinned by `instructions_sha256`; `sub_processors` lists {name, authorised_by, authorised_ts} (28(2)); `purposes` and `categories` describe the processing.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| categories | – | – | – |
| controller | – | – | – |
| instructions_ref | – | – | – |
| instructions_sha256 | – | – | – |
| purposes | – | – | – |
| role | string | yes | – |
| store_ref | – | – | – |
| sub_processors | – | – | – |
| ts | – | – | – |
No output schema declared.
No examples provided.
record_qms ~161
Record one procedure of the provider's quality management system (AI Act Art. 17): name, version, owner, when its next review is due (epoch seconds), the Art. 17(1) aspect it covers (a letter a to m) and, for a document, its reference and sha256. A later entry for the same procedure is the current one. The QMS itself is the provider's; this is the signed record that it exists and who keeps it.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| aspect | – | – | – |
| owner | string | yes | – |
| procedure | string | yes | – |
| ref | – | – | – |
| review_due_ts | number | yes | – |
| sha256 | – | – | – |
| version | string | yes | – |
No output schema declared.
No examples provided.
record_responsibilities ~229
Record who carries which obligations along the value chain (EU AI Act Art. 25). `parties` is a list of {party, role, obligations} with roles provider, initial_provider, new_provider, product_manufacturer, distributor, importer, deployer, authorised_representative, third_party_supplier; one party must carry the provider's obligations. `trigger` is the 25(1) reason (name_or_trademark, substantial_modification, changed_intended_purpose); `cooperation` maps the 25(2) items (technical_documentation, known_limitations_and_failure_modes, targeted_technical_access) to references; `agreement_ref` names the 25(4) written agreement and `agreement_sha256` pins it.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| agreement_ref | string | yes | – |
| agreement_sha256 | – | – | – |
| cooperation | – | – | – |
| not_to_be_changed_into_high_risk | boolean | – | – |
| parties | array | yes | – |
| system | – | – | – |
| trigger | – | – | – |
| ts | – | – | – |
No output schema declared.
No examples provided.
record_risk ~279
Append one entry to the risk register (EU AI Act Art. 9). The same `risk_id` again is a review or a re-estimate; the register shows the latest state and how long since the last review. `source` is intended_use, foreseeable_misuse or post_market (9(2)(a) to (c)); `harm` is health, safety or fundamental_rights; `measure_kind` is eliminate, mitigate or inform (9(5)); `residual` plus `residual_acceptable` is the 9(5) judgement; `tests` lists {metric, threshold, observed, passed} against a threshold defined before the test (9(8)); `refers_to` lists ledger seqs and each must exist.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| affects_vulnerable_groups | boolean | – | – |
| evidence | – | – | – |
| harm | string | yes | – |
| hazard | string | yes | – |
| likelihood | string | – | – |
| measure | – | – | – |
| measure_kind | – | – | – |
| refers_to | – | – | – |
| residual | – | – | – |
| residual_acceptable | – | – | – |
| risk_id | string | yes | – |
| severity | string | – | – |
| source | string | yes | – |
| status | string | – | – |
| tests | – | – | – |
No output schema declared.
No examples provided.
rectify_subject ~167
GDPR Art. 16 rectification: supersede the value under `key` with `text` through the ordinary keyed write (every write guard applies), and record who asked and why as a rights:rectify entry on the action ledger bound to the memory receipt. `actor` and `reason` are required. Returns the verdict on the write as `remember` gives it. A correction a guard retired on arrival comes back `blocked: true` with the guard's `policy`: the old value still stands, and the ledger entry says `blocked`, not `ok`.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| key | string | yes | – |
| reason | string | yes | – |
| request_id | – | – | – |
| subject | – | – | – |
| text | string | yes | – |
No output schema declared.
No examples provided.
registration_export ~209
The Annex VIII fields for registration in the EU database (EU AI Act Art. 49). `section` A: provider of a high-risk system (Art. 49(1)); B: provider relying on Art. 6(3) (Art. 49(2)); C: deployer that is a public authority (Art. 49(3)). Evidence fills the traceability reference, the description of the information used, the instructions for use and, for C, the FRIA and DPIA summaries; everything else is marked OPERATOR INPUT REQUIRED. The content of a registration, not the registration itself. `expected_pubkey` (hex, optional) pins the memory chain verdict and defaults to INSPEXIMUS_RECEIPT_PUBKEY; the action ledger is signed with the writer key, so it is pinned only to a key passed here.
| Name | Type | Req | Description |
|---|---|---|---|
| expected_pubkey | – | – | – |
| operator_json | – | – | – |
| section | string | – | – |
No output schema declared.
No examples provided.
release_quarantine ~55
A human decision that a quarantined record is a memory after all: it returns to recall and keeps who released it and why.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | yes | – |
| id | string | yes | – |
| reason | – | – | – |
No output schema declared.
No examples provided.
remember ~914
Store a memory (append-only; raw text is never edited afterward). `tags` group memories into cohorts; `value` (>=1) is its importance — higher-value memories outrank merely-similar ones at recall. Recall does NOT change it: a read leaves value, last_access and the state digest as they were, so an anchor or witness pinned to the store stays valid across reads. `credit` is what moves a memory's standing after an outcome. `mtype` ∈ {episodic, semantic, procedural} sets the decay prior — episodic (events) fades fast, semantic (durable facts) slow, procedural (rules / preferences) barely; pass it when you know the kind, else it's inferred. Optional `key` is a deterministic (subject, relation) supersession key (e.g. "billing-api::auth-method"): storing a new value with the same key retires the old one so recall never returns the stale value — no similarity threshold, no extra LLM call. Use it for facts that get updated (config, prices, versions, status). Pass `object` = the asserted VALUE (e.g. "frankfurt") alongside `key`: with the echo guard on (default here), a later RE-STATEMENT of an already-retired value cannot resurrect it (a corrected fact stays corrected even if the old value is said again). Without `object` the guard still catches a verbatim restatement (text hash), but a *reworded* one needs the value in `object` to be caught. Set `reaffirm=True` to intentionally revert to a previously-retired value (an explicit change-of-mind, not an echo). `source` — WHO OR WHAT this came from ("crm/alice", "user-42", "docs.example.com/pricing"). Pass it whenever the memory is about, or came from, an identifiable person or system. It is what makes the memory reachable later by SUBJECT rather than only by id: `forget_subject("crm/alice")` erases a person's data and everything derived from it, `erasure_audit` can then say whether anything survived, and `slash` can forfeit a source's standing after a bad outcome. Without it a record is attributable to nothing, and none of tho…
| Name | Type | Req | Description |
|---|---|---|---|
| agent_id | – | – | – |
| derived_from | – | – | – |
| key | – | – | – |
| mtype | – | – | – |
| object | – | – | – |
| reaffirm | boolean | – | – |
| session_id | – | – | – |
| source | string | – | – |
| tags | – | – | – |
| text | string | yes | – |
| user_id | – | – | – |
| value | number | – | – |
No output schema declared.
No examples provided.
How do I install the inspeximus: agent memory with provenance, GDPR erasure and… MCP server?
inspeximus: agent memory with provenance, GDPR erasure and… runs locally as a PyPI package, launched with uvx inspeximus. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · inspeximus
claude mcp add dancenitra-inspeximus -- uvx inspeximus
What is the inspeximus: agent memory with provenance, GDPR erasure and… MCP server?
inspeximus: agent memory with provenance, GDPR erasure and… is an MCP server listed in the public MCP registry as io.github.DanceNitra/inspeximus. Self-correcting agent memory: recall, supersede, revert, forget, GDPR erasure, audit receipts. This page covers its PyPI package (inspeximus).
Is the inspeximus: agent memory with provenance, GDPR erasure and… MCP server safe to use?
inspeximus: agent memory with provenance, GDPR erasure and… scores 77 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 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 inspeximus: agent memory with provenance, GDPR erasure and… MCP server expose?
inspeximus: agent memory with provenance, GDPR erasure and… exposes 135 tools: remember, remember_decision, revert, route, observe, and 130 more. Their descriptions and schemas cost roughly 24,689 tokens of context every time the server is loaded.
Is the inspeximus: agent memory with provenance, GDPR erasure and… MCP server still maintained?
inspeximus: agent memory with provenance, GDPR erasure and… is still listed as active in the MCP registry. We last reached this channel on 5 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 inspeximus: agent memory with provenance, GDPR erasure and… MCP server under?
inspeximus: agent memory with provenance, GDPR erasure and… declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.