{"name":"io.github.ac12644/vayl","slug":"ac12644-vayl","title":"Vayl","description":"Reconciling memory for AI agents: a changed fact retires the old value, with history and approval.","url":"https://mcp.market/server/ac12644-vayl","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":36,"stars":2,"forks":1,"downloads_week":475,"last_push_at":"2026-10-22T10:02:29.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ac12644/vayl","website":"https://vayl.gitbook.io/vayl-docs","version":"0.10.0","remotes":[],"packages":[{"registryType":"pypi","identifier":"vayl-mcp","version":"0.10.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"OpenAI key for extraction and embeddings. Leave unset to use a local Ollama model.","isSecret":true,"name":"OPENAI_API_KEY"},{"description":"Absolute path of the SQLite memory database.","name":"VAYL_DB"}]}],"tools":[{"name":"attest","description":"Issue a signed, third-party-verifiable attestation of what memory currently holds for `subject` — 'as of now, the active value is X', anchored to the tamper-evident audit-log head. Use it to prove what was known at a point in time. Verify later with verify_receipt, or independently with export_public_key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"audit_log","description":"The accountability trail (GDPR Art. 5(2)) — recent data operations: who / what / when. Optionally filter by user_id. Not affected by memory erasure.","write_action":false,"price_micros":0,"input_schema":null},{"name":"check_before_act","description":"Ask whether it's SAFE to take an autonomous action based on what memory knows about `subject`. Returns SAFE, or BLOCKED with explicit reasons — an unresolved conflict, confidence below the bar, a value that's gone stale, or one that just changed. Call this before any irreversible action (a payment, an email, a config change) so the agent never silently acts on bad memory. Tune the policy via the p","write_action":false,"price_micros":0,"input_schema":null},{"name":"confirm_change","description":"Approve a proposed change to a confirm-required slot, applying it. Needs the `approve` capability (admin and member roles; agents lack it, so an agent can't approve its own proposal). The approver recorded is the authenticated caller; `decided_by` is an optional note.","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_principal","description":"Admin only. Create a principal (a human user, agent, or service) and issue its API key. Roles: admin, member, agent, viewer, auditor. The key is shown ONCE — store it securely; it can't be recovered (reissue by creating a new principal).","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete","description":"PERMANENTLY erase every record of a subject — including history and tombstones — for a user. Unlike `forget` (which retires but retains for audit), this is a hard delete for right-to-be-forgotten / GDPR erasure. The `subject` is the key shown by `list_memories`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_all","description":"PERMANENTLY erase memory (history included). With no agent_id/run_id, erases ALL of the user's memory across every space (account deletion / GDPR); pass them to erase just one space. Irreversible — not the same as `forget`, which retains history for audit.","write_action":true,"price_micros":0,"input_schema":null},{"name":"explain_decision","description":"Reconstruct why an agent acted: the recorded action and the exact beliefs it held at that moment — even if those facts have since been superseded, retracted, or erased. Also verifies the decision's signed receipt so you know the record itself wasn't altered.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_memory","description":"Export everything held about a user/space as machine-readable JSON — data-subject access & portability (GDPR Art. 15/20). A complete DSAR answer: statements (active + full history), PLUS what the append-only records hold about them — decision snapshots, audit entries, and receipts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"export_public_key","description":"Return Vayl's Ed25519 public key (hex). Anyone can use it to verify erasure receipts, attestations, and the signed audit chain WITHOUT the secret key or access to the database.","write_action":false,"price_micros":0,"input_schema":null},{"name":"forget","description":"Retract a fact — a removal with no replacement. Unlike additive stores, this actually retires it so it stops being returned as current (kept in history for audit). Examples: 'We dropped Sentry', 'Alice left the Platform team', 'we no longer support IE11'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_memory","description":"Fetch one memory by its id (the `#id` shown by `list_memories`) — its value, status, scope, confidence, what it supersedes, and any metadata.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_reconcile_policy","description":"Show the source-aware reconciliation policy configured for a space (default RECENCY if unset).","write_action":false,"price_micros":0,"input_schema":null},{"name":"health","description":"Check that Vayl is configured and its dependencies are reachable — database, embedder, LLM, and graph (if enabled). Run this to diagnose setup before relying on memory; it makes one small LLM/embed call, so it costs a few tokens.","write_action":false,"price_micros":0,"input_schema":null},{"name":"history","description":"The change-log for a subject — every value it has held, oldest → newest, with status. The 'what did we use first vs now' view that additive stores can't give you. The `subject` is the key shown by `list_memories`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"license_status","description":"Show the deployment's edition and entitlements — Community or a licensed edition, seats used vs allowed, expiry, and unlocked features. If a license was rejected (tampered/expired/wrong key), this says so and reports the Community fallback it's running under.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_memories","description":"List the current active facts (the reconciled current beliefs) for a user, plus a history block of what was superseded / retracted / archived. Active rows show the `#id` for get/update.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_principals","description":"Admin only. List your tenant's principals — id, name, roles, and whether disabled (the deployment operator sees every tenant's). Never shows API keys (only their hashes are stored).","write_action":false,"price_micros":0,"input_schema":null},{"name":"pending_changes","description":"List proposed changes to confirm-required slots that have NOT been applied.","write_action":false,"price_micros":0,"input_schema":null},{"name":"purge_expired","description":"Retention / storage-limitation (GDPR Art. 5(1)(e)): permanently delete records written more than `older_than_days` ago. Statements are scoped to the user/space. The optional flags extend the same window to the append-only tables — NOTE these are not per-user: `include_decisions` and `include_receipts` purge those tables for your whole tenant, and `include_audit` purges the audit log from the head","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall","description":"Answer a question from CURRENT memory — the active value ('what state library do we use?') or a multi-hop question over current facts. Returns 'I don't know' rather than guessing, and NEVER answers from a retired/retracted fact. For the timeline of a subject, use `history`.","write_action":false,"price_micros":0,"input_schema":null},{"name":"recall_related","description":"Answer a DEEP / RELATIONAL / multi-hop question using the entity graph ('who owns the company Bob works for?', 'which services depend on the auth module?'). Uses the Neo4j graph projection when configured; otherwise falls back to slot recall.","write_action":false,"price_micros":0,"input_schema":null},{"name":"record_decision","description":"Log a decision an agent is about to take, bound to the EXACT facts it consulted. Atomically recalls `question` with provenance and snapshots those beliefs (value, source, confidence, what they superseded) alongside `action_summary`. The snapshot is immutable and signed, so 'why did the agent do X?' stays answerable even after the facts later change. Returns the decision id and a verifiable receipt","write_action":false,"price_micros":0,"input_schema":null},{"name":"reject_change","description":"Discard a proposed change. The current value stands. The proposal is kept as history — that someone proposed it is itself worth being able to audit. Needs `approve`, like confirm_change: an agent quietly discarding proposals would empty the review queue just as surely as approving them. `decided_by` is an optional note beside the authenticated caller.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remember","description":"Store fact(s) from a statement. Reconciles automatically: a new value SUPERSEDES the old one (not appended), removals are RETRACTED, and multiple facts in one message are all captured. Optional `metadata` tags the facts stored in this call. `source` records WHO/WHAT asserted the fact (an agent id, a person, a connector) — belief provenance, and the basis for source-aware reconciliation in a shared","write_action":false,"price_micros":0,"input_schema":null},{"name":"revoke_principal","description":"Admin only. Disable a principal — its API key stops working immediately. Irreversible (create a new principal to restore access). With `erase=True`, the principal row is HARD-deleted (Art. 17 for team members) instead of retained as disabled. A tenant admin can only revoke its own tenant's principals; another tenant's id reads as unknown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"safe_recall","description":"Like `recall`, but for when the agent will ACT on the answer. It answers only if every current fact behind the answer passes the safety policy; otherwise it withholds the answer and returns the reasons (disputed value, low confidence, stale, or nothing current). Use this instead of `recall` on the path to an irreversible action.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_reconcile_policy","description":"Configure how a SHARED space resolves conflicts between DIFFERENT contributors (sources). A shared space is any space (e.g. user_id='org:acme') that multiple agents/people write to with a `source` on each remember. Modes: • RECENCY — newer assertion wins (default; contributors equally trusted). • AUTHORITY — a higher-ranked source wins; a lower-ranked source contradicting it is FLAGGED, not overwr","write_action":false,"price_micros":0,"input_schema":null},{"name":"stats","description":"Operational KPIs for this Vayl instance — on-device, nothing leaves the machine: per-tool call counts, average latency and error counts, plus the distribution of reconciliation actions the engine has taken (SUPERSEDE / RETRACT / FLAG / SKIP / ADD / …).","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_memory","description":"Correct a memory by id (the `#id` from `list_memories`). Audit-preserving: the old value is retired to history and the new value becomes active — so the change still shows up in `history`.","write_action":true,"price_micros":0,"input_schema":null},{"name":"verify_audit","description":"Verify the tamper-evident audit chain end-to-end. Recomputes every row's hash and (if signed) signature; reports INTACT, or the exact row where the chain breaks — so you can prove the accountability log wasn't edited, reordered, or truncated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"verify_receipt","description":"Verify a persisted erasure receipt or knowledge attestation: recompute its canonical body and check the Ed25519 signature. Confirms the artifact is authentic and unaltered — the same check a third party can run with only the public key.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-10-25T09:25:17.981Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-25T09:25:17.984Z","components":{"code":{"score":25,"max":25,"notes":["52 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 3 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"vayl-mcp","version":"0.10.0","found":true,"weeklyDownloads":475,"license":"Apache-2.0","dependencyCount":24,"publishedAt":"2026-10-22T06:28:58.303185Z","repositoryUrl":"https://github.com/ac12644/vayl"}],"repo":{"found":true,"owner":"ac12644","repo":"vayl","archived":false,"pushedAt":"2026-10-22T10:02:29Z","stars":2,"forks":1,"openIssues":15,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/43683452?v=4","ownerCreatedAt":"2018-09-28T18:13:37Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/43683452?v=4&s=128","source":"github"},"presence":{"stars":2,"forks":1,"downloadsWeek":475,"license":"Apache-2.0","lastPushAt":"2026-10-22T10:02:29.000Z","score":36}}}},"grade_history":[],"reviews":[]}