Skip to main content
Glama

marketnow-memory

Persistent, local memory for any AI agent — one file, zero dependencies.

Works with Claude Code, Cursor, Codex CLI, Windsurf, Cline, Continue, Aider, OpenCode, Goose, Amp and any MCP-compatible client (Model Context Protocol, stdio JSON-RPC 2.0).

  • No cloud — data stays in ~/.marketnow-memory/memory.json

  • No npm install — single file, Node >= 18, standard library only

  • No API keys — search runs locally (TF-IDF cosine similarity + lexical fallback)

  • No telemetry — zero network calls

  • Tested — 29 integration checks (node test.js)

Quick start

git clone https://github.com/alicelabs-llc/marketnow-memory.git
cd marketnow-memory
node test.js          # verify: 29 checks pass
node marketnow-memory.js status
node marketnow-memory.js add "We use pnpm, never npm" --type rule --topic tooling --importance 5
node marketnow-memory.js search "package rules"
node marketnow-memory.js profile

Related MCP server: light-agent-memory-mcp-server

Register with your agent

Add to your MCP client config (see mcp-config.example.json for Claude Code, Cursor, Codex CLI, Windsurf, Cline, Continue, Aider, OpenCode, Goose, Amp):

{
  "mcpServers": {
    "marketnow-memory": {
      "command": "node",
      "args": ["/absolute/path/to/marketnow-memory/marketnow-memory.js"]
    }
  }
}

Then ask your agent:

what do you remember about me?

and it will call memory_profile.

The 8 MCP tools

Tool

What it does

memory_bootstrap

Session start: top rules/preferences + recent + optional query matches

memory_search

TF-IDF cosine similarity + lexical fallback, recency/importance boosts

memory_add

Store a decision / rule / preference / fact (importance 1-5, tags, topic)

memory_profile

Full profile grouped by topic

memory_forget

Remove by id or query (dry-run by default, confirm:true to delete)

memory_clear

Wipe everything (requires confirm:true)

memory_status

Health + storage info

memory_export

Full backup as JSON or Markdown

Memory model

{
  "id": "mem-mu5vezi6-6654ad",
  "type": "rule",                     // decision | rule | preference | fact
  "topic": "tooling",
  "tags": ["pnpm", "package-manager"],
  "content": "We use pnpm, never npm",
  "importance": 5,
  "created_at": "2026-09-17T18:36:17.221Z"
}

How search works (honest notes)

Local search = TF-IDF vectors + cosine similarity over content, topic and tags, with small recency and importance boosts, plus a lexical substring fallback when token overlap is zero. It needs no API keys and runs offline, which is the point. The trade-off is honest: it is statistical recall, not embedding-grade world knowledge — "package manager" will match "pnpm" only if the memory text mentions it. Write memories with descriptive keywords and recall stays sharp. If you need vector-database recall over millions of documents, point a real vector DB at your data instead — this tool is the lightweight, zero-dependency option.

Storage & privacy

  • Default: ~/.marketnow-memory/memory.json (override: MARKETNOW_MEMORY_HOME)

  • Atomic writes (.tmp + rename)

  • Plain JSON — inspectable, portable, memory_export-able

  • Never store credentials, tokens or private keys in agent memory

Development

node test.js                          # integration test (spawns real server)
MARKETNOW_MEMORY_HOME=/tmp/mem node marketnow-memory.js add "x"   # isolated store

marketnow-memory.js exports its operations (op_add, op_search, …) for programmatic use.

License

MIT — (c) 2026 AliceLabs LLC. Part of MarketNow.

Available Tools

8 tools
memory_addA

Store a memory: a decision, rule, preference or fact worth remembering across sessions.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoUp to 12 tags
typeNodecision | rule | preference | fact
topicNoGrouping topic, e.g. "tooling", "auth" (default general)
contentYesThe memory itself, e.g. "We use pnpm, never npm"
projectNoOptional project name
importanceNo1-5 (default 3)

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral disclosure burden. It does add the key trait that memories persist 'across sessions' and clarifies that only worthwhile information should be stored. It does not disclose duplicate handling, response shape, size limits, or how memories are later retrieved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no wasted words. It names the action, the resource, and the relevant content categories without repeating parameter mechanics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The schema fully documents all six parameters and the description establishes the persistence concept, which is enough for a basic add operation. Missing are details about the return value, potential duplicates or overwrites, and how stored memories should later be surfaced via memory_search or memory_bootstrap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description partly echoes the type enum and gives a content example, but it adds little beyond what the schema already provides for each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Store a memory'. It enumerates the exact content types (decision, rule, preference, fact) and is clearly distinct from retrieval and lifecycle siblings like memory_search, memory_clear, and memory_forget.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: whenever there is a decision, rule, preference, or fact worth persisting. However, it does not explicitly state when not to use it or mention alternatives such as memory_bootstrap or memory_profile.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_bootstrapA

Load relevant memories to bootstrap a new session: top rules and preferences by importance, plus recent memories and optional query matches. Call at session start.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoOptional focus for semantic matches (e.g. current project)
match_limitNoMax query matches to return (default 5)
rules_limitNoMax rules/preferences to return (default 10)
recent_limitNoMax recent memories to return (default 10)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden, and it delivers: it discloses the aggregation behavior (rules + preferences + recent + optional query matches), the ordering ('by importance'), and the optionality of semantic matching. It does not confirm side-effect-freeness or describe edge cases like an empty memory store, but 'load' clearly implies a non-mutating read, and the result composition is well conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste: the first front-loads verb, resource, purpose, and result composition; the second is a terse call-to-action. Every clause earns its place, and no information is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a moderately complex aggregation tool with no output schema and no annotations, the description covers the essentials an agent needs to invoke it correctly: what it returns (result categories and ordering), when to call it (session start), and parameter control (schema-provided defaults). Minor gaps remain—return format is unspecified and edge behavior (empty store, overlap between recent and matches) is unaddressed—but the description compensates well for the missing structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters with defaults inline. The description adds only marginal mapping value by tying the limit parameters to the result categories (rules/preferences, recent, query matches), which is helpful but not substantive new semantics. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Load relevant memories') and a clear purpose ('to bootstrap a new session'), then enumerates exactly what comes back: top rules/preferences by importance, recent memories, and optional query matches. This composition distinguishes it from sibling memory_search (targeted retrieval) and the mutation/state tools (add/clear/forget), so an agent can tell them apart without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call at session start' is explicit, crisp usage guidance that anchors when this tool applies. However, it does not mention exclusions or route to alternatives (e.g., 'for targeted lookups mid-session, use memory_search instead'), stopping one step short of the full when/when-not/alternatives standard.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_clearA

Wipe ALL memories. DANGER ZONE: requires confirm:true. Suggest memory_export first.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to wipe

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It warns 'DANGER ZONE' and requires explicit confirmation, which is strong disclosure for a destructive action. It could more explicitly state irreversibility or lack of undo, but 'Wipe ALL' implies permanence. The description adds substantial context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with zero waste. The purpose is stated first, followed by the critical safety requirement, then the alternative action. Information is front-loaded and each sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one boolean parameter and no output schema, the description covers what, when, and safety. It lacks explicit mention of irreversibility or that all memory content is permanently destroyed, but the warning and 'Wipe ALL' cover the essential risks. A 4 reflects good completeness for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single boolean parameter, which already states 'Must be true to wipe.' The description reinforces this with 'requires confirm:true' but adds no new semantic detail beyond what the schema provides. Baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Wipe ALL memories') with a specific verb and resource, distinguishing it from siblings like memory_search, memory_add, and memory_export. The scope 'ALL' makes the destructive nature obvious and separates it from more selective operations like memory_forget.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use guidance by mandating 'confirm:true' and suggesting 'memory_export first' as a safety alternative. This tells the agent exactly what is required before invoking and routes to a safer sibling when appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_exportA

Export all memories as JSON or Markdown for backup or portability.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNoExport format (default json)

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses scope ('all memories') and formats, and the verb 'export' implies a read-only operation. It does not state whether the exported data is returned directly, whether files are created, or any side effects/limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. Every word contributes: the verb, the scope, the formats, and the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple export tool with one optional parameter and no output schema, the description covers what is exported, the formats, and the intended use case. It does not explicitly describe the return shape, but the behavior is predictable enough from the name and description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description's mention of JSON or Markdown mirrors the schema enum and adds no new parameter-level meaning. The default value 'json' is only documented in the schema, not reinforced here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Export'), a clear resource ('all memories'), and specifies the output formats ('JSON or Markdown') and purpose ('backup or portability'). This clearly distinguishes it from sibling tools like memory_search, memory_add, and memory_clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'for backup or portability' gives clear context for when this tool is the right choice. However, it does not explicitly state when not to use it or name alternatives, so the agent must infer the decision from the tool names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_forgetA

Remove specific memories by id, or by semantic query (dry-run by default; pass confirm:true to delete).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoExact memory id to remove
queryNoSemantic query; matched memories are removed when confirm:true
confirmNoActually delete (without it: dry-run preview)
min_similarityNoSimilarity threshold for query removal (default 0.15)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses a critical behavioral trait: dry-run by default, requiring confirm:true to actually delete. This is valuable safety-relevant context beyond the schema. It also clarifies that query-based removal uses semantic matching. However, it doesn't mention what happens to related data, whether deletion is reversible, or what the dry-run output looks like, but the core safety behavior is well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the primary action, and the safety-critical dry-run behavior is included compactly. Every word earns its place; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a deletion tool with no annotations and no output schema, the description covers the essential safety behavior (dry-run default, confirm flag) and the two deletion modes. It could be more complete by describing the dry-run output format or clarifying that id and query are mutually exclusive, but the core information an agent needs to avoid accidental deletion is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters. The description adds the crucial semantic that confirm gates actual deletion and that query removal is semantic, but it doesn't add detail beyond the schema for min_similarity or id. Baseline 3 is appropriate since the schema carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Remove') and resource ('specific memories'), and distinguishes two modes: by id or by semantic query. It also clearly signals the dry-run default, which differentiates it from sibling tools like memory_clear (which likely removes all memories) and memory_search (which only retrieves).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool: when you need to delete specific memories by id or by semantic query. It doesn't explicitly name alternatives or exclusions, but the dry-run default and confirm flag provide clear operational guidance. Sibling names like memory_clear and memory_search make the context understandable, though explicit when-not-to-use guidance would be stronger.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_profileA

Show the full memory profile grouped by topics, with counts by type and topic. Use when the user asks "what do you remember about me?".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. The 'Show' verb implies a read-only, presentational operationositories, and the description adds what output is included. However, it does not explicitly state side-effect freedom, performance considerations, or output limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two terse sentences: the first describes behavior and output content, the second gives a direct trigger. There is no filler, repetition, or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, no-output-schema tool, the description gives the essential information: what the profile contains, how it is grouped, and when to use it. It could be slightly more explicit about the exact output format, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the syntax and meaning of arguments are a non-issue. The empty schema already provides complete structural coverage, and the description adds no unnecessary param explanation; baseline 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Show') and resource ('full memory profile'), adding grouping by topics and counts by type and topic. It clearly differentiates from siblings like memory_search (targeted lookup) and memory_status by emphasizing the full, topic-grouped profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly maps to the user question 'what do you remember about me?', giving an agent a clear trigger condition. It does not list when-not-to-use it or name sibling alternatives explicitly, so routing to alternatives remains slightly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

memory_statusA

Service health: storage path, counts, search backend, version. No parameters.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral burden, and 'Service health' implicitly conveys a read-only, non-mutating operation plus what the report covers. However, it does not explicitly state that no state is modified, whether authentication is required, or any failure/error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single compact sentence that front-loads the core purpose ('Service health') and packs the key report contents into a tight list. Every word earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema, the description does well by naming what the health report includes, effectively substituting for return-value documentation. The only real gap is ambiguity in 'counts' (counts of what?), but overall an agent can call this tool correctly with no further information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4 per the rubric. The description confirms this with 'No parameters,' which matches the empty input schema exactly; there is nothing more to add.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports service health and enumerates its scope (storage path, counts, search backend, version). The purpose is distinct from its operation-oriented siblings like memory_add and memory_clear, though it never names them or explicitly positions itself against them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to call this tool versus alternatives, no prerequisites, and no indication of ordering (e.g., checking health before other memory operations). The phrase 'No parameters' merely restates schema information rather than providing use-case guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv1.0.0
    • First observedmemory_add
    • First observedmemory_bootstrap
    • First observedmemory_clear
    • First observedmemory_export
    • First observedmemory_forget
    • First observedmemory_profile
    • First observedmemory_search
    • First observedmemory_status

TDQS

A4.2/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct memory operation: bootstrap, search, add, profile, clear, forget, status, and export. Even memory_bootstrap and memory_search are clearly separated by purpose and description.

Naming Consistency5/5

All tools follow a consistent memory_<action> pattern, making the tool set predictable and easy to navigate. The two noun-like names (profile, status) still read as actions in context and do not break the pattern.

Tool Count5/5

Eight tools is well-scoped for a memory service, covering retrieval, storage, deletion, inspection, export, and health checks without redundancy. Each tool earns its place.

Completeness4/5

The core memory lifecycle is covered: add, search, forget, clear, profile, export, and bootstrap. Minor gaps exist around updating an existing memory in place and importing memories back after export, but these can be worked around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides persistent memory for AI coding agents via MCP, enabling agents to store and semantically recall facts, events, and lessons across sessions, all running locally without cloud dependencies.
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Provides persistent, searchable memory for AI agents across any MCP-compatible client, storing project context, user preferences, and session learnings locally in SQLite with tools to save, retrieve, search, and manage them.
    12
    12 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides local-first persistent memory with a typed knowledge graph and bounded multi-hop retrieval via MCP, letting coding agents and local LLM systems store, search, and recall facts across sessions without hosted services or model dependencies.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides a local-first, provenance-aware memory layer that enables MCP-capable AIs to store, recall, validate, and reason over facts with contradiction detection, trust weighting, deduplication, and encryption, supporting offline private operation without GPUs or API keys.
    9
    Apache 2.0