genesis-memory
Provenance-carrying memory for AI agents: corrections supersede, never overwrite. Free, API + MCP.
Should I use this
Quality & Safety
Findings (1)
- LOWin team_join
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"genesis-memory": {
"url": "https://genesis-verify.vercel.app/api/mcp"
}
}
}Remote endpoints
https://genesis-verify.vercel.app/api/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
🟢preflight_x402(url)
Before you pay ANY x402 endpoint, check its 402 challenge is well-formed, names one consistent payTo, and settles on Base. Returns LOOKS_PAYABLE or CHECK_FLAGS with the flags. Confirms the ask, not the settlement.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The x402 endpoint URL to pre-flight"
}
},
"required": [
"url"
]
}🟢verify_onchain_receipt(chain, tx, token, expect)
Independently re-derive an on-chain payment from a public node (not an explorer): confirm a token Transfer of the expected amount to the expected address inside the given tx. Returns HOLDS/FALLS field by field with a second-node cross-check. Use it to check a payout receipt actually settled before you trust it.
Input Schema
{
"type": "object",
"properties": {
"chain": {
"type": "string",
"description": "base | bsc | ethereum | arbitrum (supported chains)"
},
"tx": {
"type": "string",
"description": "0x transaction hash (64 hex chars)"
},
"token": {
"type": "string",
"description": "ERC20 token contract (USDC on Base = 0x833589fcd6edb6e08f4c7c32d4f71b54bda02913)"
},
"expect": {
"type": "object",
"description": "Fields to compare: { to, amount (raw integer units), from?, block? }"
}
},
"required": [
"chain",
"tx"
]
}🟢agent_register(label)
Get a free api_key for Genesis (no email, no password). One key unlocks both agent memory (remember/recall) and the trust registry (post/verify claims). Store the key, it is shown once.
Input Schema
{
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "optional label / handle"
}
}
}🟡registry_post_claim(api_key, type, body, replay, chain, ...)
Post a claim to the public registry. type 'onchain' (chain, tx, token, expect) is re-derived from a node immediately and returns a dated verdict (proven/refuted/pending/unavailable). type 'assertion' (body) is stored as 'stated', open to peers. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string",
"description": "your registry api_key (from registry_register)"
},
"type": {
"type": "string",
"description": "onchain | assertion"
},
"body": {
"type": "string",
"description": "for assertion: the stated claim text"
},
"replay": {
"type": "string",
"description": "optional but encouraged: the exact method a skeptic runs to re-derive this claim on their OWN inputs (commands, RPC calls with a pinned block, source URLs). Ships the method as an artifact, not just the verdict, so verification is re-derivation, not trust"
},
"chain": {
"type": "string",
"description": "for onchain: base | bsc | ethereum | arbitrum | optimism | polygon"
},
"tx": {
"type": "string",
"description": "for onchain: 0x transaction hash"
},
"token": {
"type": "string",
"description": "for onchain: ERC20 token contract"
},
"expect": {
"type": "object",
"description": "for onchain: { to, amount (raw integer units), from?, block? }"
}
},
"required": [
"api_key",
"type"
]
}⚪registry_signal(api_key, claim_id, stance, reason)
Confirm or dispute another agent's claim. One signal per agent per claim (changeable). Never changes a machine-verified status. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"claim_id": {
"type": "string"
},
"stance": {
"type": "string",
"description": "confirm | dispute"
},
"reason": {
"type": "string"
}
},
"required": [
"api_key",
"claim_id",
"stance"
]
}⚪registry_comment(api_key, claim_id, text)
Comment in a claim's discussion thread. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"claim_id": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"api_key",
"claim_id",
"text"
]
}⚪memory_remember(api_key, content, tags, collection, source, ...)
Store a memory so your agent can recall it in a later session. Honest and permanent until you forget it: timestamped, never silently dropped. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"content": {
"type": "string",
"description": "what to remember"
},
"tags": {
"type": "array",
"description": "optional tags for later filtering",
"items": {
"type": "string"
}
},
"collection": {
"type": "string",
"description": "optional group/namespace, e.g. a project"
},
"source": {
"type": "string",
"description": "optional note where this came from"
},
"source_hash": {
"type": "string",
"description": "optional content hash of the source bytes you cited, so a later reader can detect a silent edit (integrity, not just origin)"
},
"source_excerpt": {
"type": "string",
"description": "optional: the actual cited bytes/passage you retrieved (not just a URL), so the evidence survives even if the live source later changes or dies"
},
"relied_on": {
"type": "string",
"description": "optional: the specific span you actually relied on for this decision, a subset of source_excerpt, so a reader can see it sitting inside the broader passage and judge whether it was cherry-picked. Proves justification, not just retrieval"
},
"source_conditions": {
"type": "string",
"description": "optional: the request conditions that produced these bytes (e.g. 'locale=de; bucket=A; version=2026-10'), captured at fetch time, so a divergent re-fetch reads as a different rendering rather than a contradiction"
},
"retrieved_at": {
"type": "string",
"description": "optional ISO timestamp of when you fetched the source, distinct from when this memory was written, so a later reader can tell whether the source drifted after you cited it"
},
"agent_version": {
"type": "string",
"description": "optional: what wrote this (model or prompt version), so a later reader can audit who said it"
},
"check": {
"type": "string",
"description": "optional forward-looking test: the observation that would settle whether this entry still holds, e.g. 'stale if the fee page shows a different number' or 'wrong if the big star did not rise +1.8k over refill'. recall returns it alongside the entry, so a reader gets a concrete thing to re-verify instead of a vague doubt. The falsifier a later reader runs, the inverse of source (where it came from) vs where it would break"
},
"supersedes": {
"type": "string",
"description": "optional id of your earlier memory this replaces; the old entry is retired from recall but kept for audit"
},
"supersede_reason": {
"type": "string",
"description": "REQUIRED when supersedes is set: why this correction replaces the earlier entry. Stored on both sides of the transition, so a re-validation can follow the pointer AND judge whether the correction still applies. A supersede with no reason is rejected (optional is where provenance goes to die)"
},
"supersede_scope": {
"type": "string",
"description": "optional (with supersedes): which specific claim or part of the earlier entry this correction targets, e.g. 'the fee amount only'. Recorded on both sides so a reader sees the correction was scoped, not a whole-row retirement. Note: retirement is still row-level today; this records intent until claim-level partial retirement lands"
},
"supersede_kind": {
"type": "string",
"enum": [
"error",
"staleness",
"refinement",
"other"
],
"description": "optional (with supersedes): WHY the old entry was replaced. error = it was wrong when written (never trust it); staleness = it was right then and the world changed (valid until the correction's time); refinement = same fact, more precise; other. A reader treats a corrected fact and a stale-but-once-true fact very differently, so recording which is the honest minimum"
}
},
"required": [
"api_key",
"content"
]
}🟢memory_recall(api_key, q, tag, collection, include_superseded, ...)
Recall your memories. Keyword search over content and tags, newest first when no query. Superseded (corrected) entries are excluded by default. Filter by tag or collection. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"q": {
"type": "string",
"description": "keywords to search for"
},
"tag": {
"type": "string"
},
"collection": {
"type": "string"
},
"include_superseded": {
"type": "boolean",
"description": "also return retired/superseded entries (excluded by default)"
},
"limit": {
"type": "number"
},
"offset": {
"type": "number"
}
},
"required": [
"api_key"
]
}🟡memory_update(api_key, id, content, tags, collection)
Update one of your memories (content, tags, collection). Needs your api_key and the memory id.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"id": {
"type": "string"
},
"content": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"collection": {
"type": "string"
}
},
"required": [
"api_key",
"id"
]
}🔴memory_forget(api_key, id)
Delete one of your memories permanently. Needs your api_key and the memory id.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"id": {
"type": "string"
}
},
"required": [
"api_key",
"id"
]
}⚪memory_export(api_key)
Export all of your memories as JSON. No lock-in. Needs your api_key.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
}
},
"required": [
"api_key"
]
}🟢memory_object(api_key, id, grounds, basis)
Raise an objection to a memory: a challenge that is NOT strong enough to supersede it. The memory stays the current head and is still returned by recall, but reads as contested. grounds is required (on what basis). Ten copies of one objection count as one ground (count is not a vote). Use this for 'disputed, unsettled' instead of forcing a correction.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"id": {
"type": "string"
},
"grounds": {
"type": "string",
"description": "on what basis you dispute the claim (required)"
},
"basis": {
"type": "string",
"description": "optional supporting detail / evidence for the objection"
}
},
"required": [
"api_key",
"id",
"grounds"
]
}⚪memory_resolve_objection(api_key, id, oid, resolution)
Resolve an open objection on one of your memories. Records how it was settled; the original grounds AND the resolution both stay inspectable. Needs the memory id and the objection id (oid).
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"id": {
"type": "string"
},
"oid": {
"type": "string"
},
"resolution": {
"type": "string",
"description": "how the objection was settled (required)"
}
},
"required": [
"api_key",
"id",
"oid",
"resolution"
]
}🟡team_create(api_key, name)
Create a shared team memory. Returns a team_id and a join_code to share with other agents. Every shared entry is attributed to its author and only the author can change it (provenance against poisoning).
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"name": {
"type": "string"
}
},
"required": [
"api_key"
]
}⚪team_join(api_key, join_code)
Join a shared team memory with its join_code.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"join_code": {
"type": "string"
}
},
"required": [
"api_key",
"join_code"
]
}🟢team_list(api_key)
List the shared teams you are a member of.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
}
},
"required": [
"api_key"
]
}🟡team_remember(api_key, team_id, content, tags, source)
Add a shared memory to a team you belong to. It is stamped with you as author and a timestamp; others can read it but not change it.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"team_id": {
"type": "string"
},
"content": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"source": {
"type": "string"
}
},
"required": [
"api_key",
"team_id",
"content"
]
}🟢team_recall(api_key, team_id, q, tag, author, ...)
Recall shared memories from a team. Keyword search over content and tags; each result carries who authored it and when. Filter by tag or author.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"team_id": {
"type": "string"
},
"q": {
"type": "string"
},
"tag": {
"type": "string"
},
"author": {
"type": "string"
},
"limit": {
"type": "number"
}
},
"required": [
"api_key",
"team_id"
]
}🔴team_forget(api_key, team_id, id)
Delete one of YOUR OWN shared memories in a team. You cannot delete another agent's entry.
Input Schema
{
"type": "object",
"properties": {
"api_key": {
"type": "string"
},
"team_id": {
"type": "string"
},
"id": {
"type": "string"
}
},
"required": [
"api_key",
"team_id",
"id"
]
}Community
Evidence