Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

LinkLore

PYPI · LLRE · SCANNED SEP 21

AI-native structured memory for agents (MCP). Built for agents, not humans.

Available components

+15 this week 72 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security88
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • Install-script risk not yet assessed.Unverified
  • 0 of 34 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency32
Schema Quality & AI Usability63
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 7817 tokens (~325/item across 24 items; 24 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management80
  • Stability observed for 24 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 100% of tool parameters carry a description.Pass
  • Structured output schemas are declared (100% 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 3 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "unlink" implies "unlink" 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 25 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
Install

How do I install the LinkLore MCP server?

LinkLore runs locally as a PyPI package, launched with uvx llre. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

pypi · llre

# add to Claude Code
claude mcp add io-linklore-llre -- uvx llre
// .cursor/mcp.json
{
  "mcpServers": {
    "io-linklore-llre": {
      "command": "uvx",
      "args": [
        "llre"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "io-linklore-llre": {
      "command": "uvx",
      "args": [
        "llre"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add io-linklore-llre -- uvx llre
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "io-linklore-llre": {
      "type": "local",
      "command": [
        "uvx",
        "llre"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add io-linklore-llre --command uvx --arg llre
# ~/.hermes/config.yaml
mcp_servers:
  io-linklore-llre:
    command: "uvx"
    args: ["llre"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "io-linklore-llre": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "llre"
      ]
    }
  }
}
# add to Vellum
assistant mcp add io-linklore-llre -t stdio -c uvx -a llre
// mcp.json
{
  "mcpServers": {
    "io-linklore-llre": {
      "command": "uvx",
      "args": [
        "llre"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 21 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 20 Sept 26 +1
    • Stability: 0.97 → pass security
  • 18 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

  • 16 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 83 to 87. That category is still filling its 30-day observation window: 25 days of observed history at the previous scan, 26 at this one. The score rises as the window fills, whether or not the server changes.

  • 15 Sept 26 +15
    • Malware scan: unverified → pass security
  • 14 Sept 26 −18
    • Malware scan: pass → unverified security
    • Stability: pass → 0.80 functional
  • 13 Sept 26 +1
    • Stability: 0.97 → pass security
  • 11 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 21 Sept 2026 · Analysed pypi/llre@0.2.2

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem pypi

Background: How many MCP packages publish verified provenance →

Dependencies 34 packages
Packages resolved 34
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 24 exposed · ~7,567 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
add ~525

add(type='lore'|'doc', title, msg=) — lore=journal entry/decision, doc=spec/plan. 2 linking args: links=unified (code files·dc/lr id·title auto-classified, flow=True for a doc chain) · push_to=send to a box (not a link). items=['a','b']→checklist(0/N, doc only) · items=[{...}]→batch creation(both lore·doc — use this for bulk, quieter nudges than N single calls, with status='rule' as the same reserved value in each dict; each dict may set its own 'type' to mix lore·doc in one call — omitted entries inherit the top-level type=). details help=True

NameTypeReqDescription
flowbooleanWith links= targeting a doc: create chain order (flowLink) instead of a plain mutual link. doc↔doc only.
helpbooleanReturn this tool's full help text instead of executing.
itemslist[str] = a checklist (doc only, 0/N progress). list[dict] = batch-create multiple lore/doc in one call — quieter than N separate add() calls. Batch dicts accept the same fields as top-level args,…
linksLink target(s) — code file path(s), a lore/doc id, or an existing title (auto-classified). File paths attach as code links (files[]); ids/titles become knowledge-graph links.
msgstringBody text.
push_toOpenbox name to share the new item into immediately (a copy, not a link).
relatesstringId of an existing lore/doc this supersedes — this new item becomes head, relates= is marked no-longer-head.
statusstringInitial status — 'open' (default), 'done', 'dropped', or 'rule' (a standing rule/regression-guard, not a one-off entry — searchable via status='rule').
tagsTag(s) to attach.
titlestringTitle of the new lore/doc.
typestring'lore' (default) — a journal entry/decision. 'doc' — a spec/plan.
NameTypeReqDescription
resultstringyes

No examples provided.

brief ~107

project dashboard — call at the start of every session. external source 🔔 = a new push has arrived. receive it with openbox(action='show'). options: dismiss(turn off a nudge), undismiss(restore it), help.

NameTypeReqDescription
dismissNudge id(s) to turn off (they stop appearing in brief()).
helpbooleanReturn this tool's full help text instead of executing.
undismissPreviously dismissed nudge id(s) to restore.
NameTypeReqDescription
resultstringyes

No examples provided.

cleanup ~128

[read-only] cleanup(type='lore'|'doc') threshold(=0.85), status(=open), help - duplicate candidates.

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
statusstringOnly consider items with this status when matching pairs.
thresholdnumberCosine-similarity floor for a duplicate candidate pair (0-1). Default 0.85 — higher = stricter.
typestring'lore' (default) or 'doc' — which collection to scan for duplicates.
NameTypeReqDescription
resultstringyes

No examples provided.

config ~494

Project settings (openbox source options) + iam + session pin. WARNING: handle/name/email apply machine-wide, not per-project. Sharing lives in a separate tool: openbox (openbox sharing/members). 11 actions: - action='whoami' → your identity (handle/name/email) - action='version' → server code version (git commit) - action='sources' → list registered external sources (openboxes) - action='option' → change an external source's settings (auto_search=/show_prefix=) - action='sync' → force-refresh an external source's cache - action='forget' → deregister an external source - action='pin' → pin this session to a specific project - action='unpin' → unpin the session - action='sessions' → list/revoke your account sessions (revoke=) - action='projects' → list every LinkLore project on this machine - action='delete_project' → permanently delete your personal-server copy of this project (returns guidance, no execution — use the forced() command it prints) help=true for details.

NameTypeReqDescription
actionstring'' (default) = show current settings, or set identity if name/handle/email is given. Otherwise one of: whoami, version, sources, option, sync, forget, pin, unpin, sessions, delete_project, projects.
auto_searchaction='option': auto-include this source's items in search results.
dirstringaction='pin': absolute path to pin this session to.
emailstringIdentity email — bare set or action='whoami'.
handlestringIdentity handle (unique short id) — bare set or action='whoami'.
helpbooleanReturn this tool's full help text instead of executing.
namestringIdentity display name (bare set / action='whoami'), or the source name to target for action='option'/'sync'/'forget'.
project_idstringaction='delete_project': target project id.
projectsbooleanShortcut for action='projects' — list every LinkLore project on this machine.
revokestringaction='sessions': session id to revoke, or 'all'.
show_prefixaction='option': prefix this source's results with its source name.
NameTypeReqDescription
resultstringyes

No examples provided.

doc_flow ~77

[read-only] doc_flow(id) — renders a doc's flowLink chain in order (journey view).

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idstringDoc id (dc-...) to render the flowLink chain for. Omit to list all chain starting points.
NameTypeReqDescription
resultstringyes

No examples provided.

doc_map ~63

[read-only] doc_map(oneline) — overview of the full doc link network.

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
onelinebooleanCompact view — one line per connected cluster instead of every doc.
NameTypeReqDescription
resultstringyes

No examples provided.

doc_rollup ~68

[read-only] doc_rollup(id) — find and collect lore linked to a doc into an AI-summary draft.

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idstringDoc id (dc-...) to collect linked lore for.
NameTypeReqDescription
resultstringyes

No examples provided.

doctor ~87

doctor() - checks project data integrity (oldId/newId, files[] paths, link targets). doctor() read-only diagnostics (default) doctor(action='fix') automatically repairs any issues found

NameTypeReqDescription
actionstring'' = read-only diagnostics (default). 'fix' = automatically repair issues found.
helpbooleanReturn this tool's full help text instead of executing.
NameTypeReqDescription
resultstringyes

No examples provided.

edit ~791

edit(id, action=, ...) — 4 write modes (action). If action is omitted, defaults to append (msg alone works too). Write modes (action, tool option = behavior match): - **append (default, non-destructive)** → edit(id, action='append', msg='new content') # or omit action, msg alone — appends to the end of body, keeps the rest - **section (partial edit)** → edit(id, action='section', section='heading', msg='new section content') # replaces just that section (existing heading only — errors if missing; to add a new section use append), keeps the rest - **overwrite (full body)** → edit(id, action='overwrite', msg='new body' [, tags=[...], ...]) # old body kept in history(recoverable via log). tags/items(doc only) and links= file-paths are overwritten too; links= ids (lr-/dc-) are always additive, never removed by overwrite - **supersede (follow-up publish)** → edit(id, action='supersede', msg='new conclusion') # creates a new id, old one head=False (action= is one of append|section|overwrite|supersede|remove. Unspecified('') means append.) Other: - remove a checklist item(doc only) → edit(id, action='remove', items=[N]) # 1-based, multiple: items=[N,M] - mark as dropped → edit(id, status='dropped') (still shown in search) - supersede chain (keep old + new head) → edit(id, action='supersede', ...) (or add(type='lore'|'doc', relates=old_id, ...)) - supersede by an existing item (reconcile a contradiction) → link(a=X, b='lr-Y'|'dc-Y', action='supersede') (X→head=False) - permanent delete → rm(id)

NameTypeReqDescription
actionstring'' or 'append' (default) = add to the end of the body. 'section' = replace one existing section (by heading). 'overwrite' = replace the whole body immediately (old body stays recoverable via log(id=)…
auto_searchLocal-only: exclude (False) or re-include (True) this item from automatic search/brief collection. Direct id= lookup is unaffected. Pass alone — no other edit fields in the same call.
flowbooleanWith links= targeting a doc: create chain order (flowLink) instead of a plain mutual link.
helpbooleanReturn this tool's full help text instead of executing.
idstringId (lr-/dc-) of the item to edit.
itemsNew checklist items (doc) or a checklist-item toggle.
linksLink target(s) to add — code file path(s), a lore/doc id, or an existing title (auto-classified). File paths attach as code links (files[]); ids/titles become knowledge-graph links.
msgstringContent — meaning depends on action= (appended text / section body / full overwritten body / supersede conclusion).
sectionstringaction='section': heading of the existing section to replace.
statusstringNew status — 'open', 'done', 'dropped' (resolved, hidden from active views), or 'rule' (standing rule/regression-guard).
tagsTag(s) — action='overwrite' replaces the full tag set; otherwise added.
titlestringNew title.
NameTypeReqDescription
resultstringyes

No examples provided.

forced ~499

Executes the exact destructive action described in a warning printed by rm(), local_cross(), config(), or openbox() — copy the values from that warning verbatim. Do not call this on your own initiative; only call it after seeing a warning that names it and tells you exactly what to pass.

NameTypeReqDescription
actionstringRequired — which tool's warning you are executing: 'rm' | 'local_cross' | 'config' | 'openbox'.
deletestringaction='openbox' only: pid of the box to delete, from openbox()'s warning.
delete_projectstringaction='config' only: the prj_id printed in config()'s delete_project warning.
from_dirstringaction='local_cross' only: source workspace path, from the warning.
helpbooleanReturn this tool's full help text instead of executing.
idaction='rm': item id(s) to permanently delete. action='local_cross': item id(s) to move/copy.
leavestringaction='openbox' only: pid of the box to leave, from openbox()'s warning.
modestringaction='local_cross' only: 'move' or 'copy' — local_cross()'s own action= renamed here to avoid clashing with forced's own action=.
namestringaction='openbox' only: box display-name hint (optional) — re-derived from pid= if omitted.
pidstringaction='openbox' only: target box's server project id — required for transfer=/rm_member=/push= (delete=/leave= carry it themselves, no pid= needed).
pushaction='openbox' only: item id(s) to push — pid= (and optionally name=) name the box.
rm_memberaction='openbox' only: resolved member id(s) to remove — pid= names the box.
sessions_revoke_allbooleanaction='config' only: revoke every other account session, as printed in config()'s warning.
tostringaction='local_cross' only: target workspace path, from the warning.
transferstringaction='openbox' only: resolved member id to transfer ownership to — pid= names the box.
NameTypeReqDescription
resultstringyes

No examples provided.

init ~177

init(blueprint='') — set up .linklore in this directory (starts local footprint memory). - init() basic setup - init(blueprint='X') apply a blueprint project_dir: set up .linklore in another folder (creating a boundary is init-only). setting up there doesn't change this session's base project — to keep working there, config(action='pin').

NameTypeReqDescription
blueprintstringName of a starter blueprint to seed the new project with. Omit for a bare empty setup.
helpbooleanReturn this tool's full help text instead of executing.
project_dirstringFolder to create the new .linklore in (defaults to the current directory). Setting up here doesn't switch this session's active project — use config(action='pin') for that.
NameTypeReqDescription
resultstringyes

No examples provided.

link ~471

link(a, b, action=) — connect two items (dc↔dc / lr↔lr / dc↔lr auto-detected, prefix matching OK). a/b may also be a file path or an existing title — non-id-shaped values are auto-classified (same as links= in add/edit). Undo (inverse) = unlink(a, b) — same arguments. action has 5 modes (extends the member/config(action=) convention): - action='related' (default, same if omitted) → mutual link (symmetric). Same as link(a, b) — dc↔dc/lr↔lr/dc↔lr - action='flow' → not a mutual link but **document order** (a→b direction, doc↔doc only): read a, then b. - action='supersede' → "a is replaced by b" — a=old (dropped, head=False/dropped), b=target (alive, must be an existing item — none is created). lore↔lore or doc↔doc only. - action='unrelated' → verdict: not related — this pair stops appearing as related candidates or duplicate alerts (not a link, a stored verdict). - action='distinct' → verdict: not a duplicate (confirmed separate) — only duplicate alerts are silenced, it still appears as a related candidate. The 4 suggestion verdicts: related-yes=link(a,b) · duplicate-yes=action='supersede' · related-no=action='unrelated' · duplicate-no=action='distinct'

NameTypeReqDescription
astringFirst item — lr-/dc- id, a file path, or an existing title (auto-classified).
actionstring'' or 'related' (default) = mutual link. 'flow' = document order a→b (doc↔doc only). 'supersede' = a is replaced by b (a dropped, same kind only). 'unrelated'/'distinct' = record a not-linked verdict…
bstringSecond item — same rules as a=.
helpbooleanReturn this tool's full help text instead of executing.
NameTypeReqDescription
resultstringyes

No examples provided.

local_cross ~588

Use this when you want to view, move, or copy lore/doc items that live in a different project or folder (workspace) — cross-project / workspace access. local_cross(action, id, to='workspace-path', from_dir='') — directly operate on another LinkLore project on the same disk (works on both lore and doc). action='move' move to another workspace (source deleted, id preserved; createdAt/files/tags/level/status/body/items preserved; provenance recorded) action='copy' copy to another workspace (source kept, a new id is issued + provenance recorded — re-copying the same original is an idempotent skip) action='show' view another workspace's content (read-only — query/tag/type/status passed through) from_dir= applies to all three actions — for move/copy it sets the source workspace (default: cwd); for show it is the lookup target, hence required. ⚠️ move always previews first, regardless of item count (it deletes the source, so there's no low-risk single-item case) — confirm and run it via the forced(...) call the preview prints, no stored slot. copy is reversible (source kept), so a single item still runs immediately; only 2+ items preview first, confirmed the same way. cf. sharing across a server/team goes through openbox(), not local_cross() — this tool never talks to a backend, it only works within your own disk. ⚠️ only between projects you own — if the target is genuinely someone else's/another team's, don't use local_cross() just because you have filesystem access; go through openbox('push') (the recipient must openbox('pull') — a review gate).

NameTypeReqDescription
actionstringRequired — 'move' or 'copy' transfers item(s) to another local workspace; 'show' reads another workspace read-only.
from_dirstringSource workspace path. Required for action='show' (no fallback — use show() to query your own workspace). For move/copy, defaults to the current session's project if omitted.
helpbooleanReturn this tool's full help text instead of executing.
idItem id(s) (lr-/dc-) to move/copy. For action='show', an alias for query= (single-item lookup).
querystringaction='show': free-text search in the other workspace.
statusstringaction='show': filter by status (open/done/dropped/rule) in the other workspace.
tagstringaction='show': filter by tag in the other workspace.
tostringTarget workspace path — required for move/copy.
typestringaction='show': filter by type ('lore'|'doc') in the other workspace.
NameTypeReqDescription
resultstringyes

No examples provided.

log ~214

[read-only] log(id) — shows the edit-history timeline (who changed what, when). No id = project-wide history. For current content use show(); for code<->doc drift use status(). period('Nh' hours|'Nd' days|'YYYY-MM-DD' UTC|'YYYY-MM-DD..YYYY-MM-DD' range), sort=oldest, max, plumbing: help

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idstringItem id (lr-/dc-) to show edit history for. Omit for the unified project-wide activity log.
maxintegerCap on the number of entries returned.
periodTime window — 'Nh' (last N hours), 'Nd' (last N days), 'YYYY-MM-DD' (since that UTC date), or 'YYYY-MM-DD..YYYY-MM-DD' (a UTC date range).
sortstring'newest' (default) or 'oldest'.
NameTypeReqDescription
resultstringyes

No examples provided.

market ~259

Browse and pull free lore/doc from LinkLore's public curated catalog — no account needed. market(query=, id=, filter=, order=, max=) — default (no action=) searches/browses: id= alone shows a single listing's detail, query=/filter=/order=/max= search the catalog. action='pull' with id= fetches that listing into this project. Buy lore. Pull it into your project.

NameTypeReqDescription
actionstring'' (default) = search/browse. 'pull' = fetch id= into this project (requires id=).
filterstringCategory filter for search (e.g. 'build', 'automation', 'personal').
helpbooleanReturn this tool's full help text instead of executing.
idstringA catalog listing id (lr-/dc-) — direct detail lookup, or the pull target with action='pull'.
maxintegerCap on the number of search results returned.
orderstring'hot' (most pulled) or 'new' (most recently published). Omit for curated order.
querystringFree-text search across the public catalog (title/tags).
NameTypeReqDescription
resultstringyes

No examples provided.

openbox ~1,079

openbox(name, action) — the owner wall: every exchange with other owners (share, absorb, membership) goes through this single gate. An openbox is an invite-only shared box. Your own server backup is push()/pull() (no target argument — never crosses the wall). Moving or copying into another LOCAL project you also own (same disk, no server round-trip) goes through local_cross(), not openbox — lighter and faster when ownership isn't in question. transport: - openbox(name='team-prj', action='push', id='lr-x') share footprints to the box — sends copies, your project unchanged. 2+ ids: preview first, re-call with forced(action='openbox', push=...) - openbox(name='team-prj', action='pull', id='lr-x') absorb the box's footprints into your project — new id + provenance - openbox(name='team-prj', action='rm', id='lr-x') remove what I shared from the box (your project unchanged) browse: - openbox(name='team-prj', action='show', query='auth') browse the box — cache auto-refreshes on call (filters: query·tag·max·oneline) governance: - openbox(name='team-prj', action='new', display_name='me') create a box (you = owner) - openbox(name='team-prj', action='edit', description='...') update the box description (owner/member) · title=box name(owner only) · display_name=your nickname(anyone) - openbox(name='team-prj', action='invite', role='member') invite code (owner). kind='project' = project member, member='<nickname>' = reissue - openbox(action='join', code='X', display_name='me') join with an invite code (box name = backend project name, no local alias) - openbox(name='team-prj', action='docking') dock a membership to this project by name — 2+ boxes with the name: candidates + project_id='prj-...' confirm. project-kind cannot dock - openbox(name='team-prj', action='undocking') remove only this project's wiring — server membership unchanged (leaving is leave) - 'list' members · 'role' member=…

NameTypeReqDescription
actionstringOne of: push, pull, rm, show, new, edit, invite, join, docking, undocking, list, role, transfer, leave, delete. Omit with no name= to list your registered boxes.
codestringaction='join': invite code to join with.
descriptionstringaction='edit': new description for the box.
display_namestringaction='new'/'join': your display nickname in the box. action='edit': change your own nickname (anyone can).
expires_hintegeraction='invite': invite code lifetime in hours.
helpbooleanReturn this tool's full help text instead of executing.
idaction='push'/'pull': item id(s) (lr-/dc-). action='rm': item id(s) to take down (exactly one of id=/member= required).
kindstringaction='invite': kind of the invited member, e.g. 'project' for a project-identity member.
maxintegeraction='show': cap on the number of results returned.
memberaction='rm': member id(s) to expel (exactly one of id=/member= required). action='role'/'transfer': target member id (single).
namestringTarget box name (server project name) — used by every action except 'join' (no box to name before joining).
onelinebooleanaction='show': compact one-line-per-item rendering.
project_idstringaction='docking': disambiguate when multiple boxes share the same name.
querystringaction='show': free-text search within the box.
rolestringaction='invite': role to grant the invite. action='role': new role for member= (e.g. viewer/member/owner).
tagstringaction='show': filter by tag within the box.
titlestringaction='edit': rename the box (server project name). Owner only.
urlstringaction='docking': retired. Kept only so a legacy call gets a migration error instead of a silent rejection.
NameTypeReqDescription
resultstringyes

No examples provided.

pull ~166

[my server] pull(id) — restore the home base from my server (works across devices too). Like git pull: server → local. Bringing things from an openbox is openbox(action='pull'), not pull — pull is for my server only. If local is newer/same it's skipped; a real conflict (both sides changed) is shown separately (local kept). - pull() my whole server → home base - pull(id='lr-x'|'dc-x') restore a selection (moving items between local workspaces is local_cross(), not pull())

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idItem id(s) (lr-/dc-) to restore. Omit for the whole home base.
NameTypeReqDescription
resultstringyes

No examples provided.

push ~195

[my server] push(id) — upload the home base to **my server** (visible to me only). Like git push: local → server. Not for sharing — sharing to others (an openbox) is openbox(action='push'), not push (push has no target argument by design, so it cannot share). - push() the whole home base → server - push(id='lr-x'|'dc-x') a single item - push(id=['lr-x','dc-y']) a batch Take down (inverse): rm(sent='lr-x'|'dc-x') — removes my server copy only, home base untouched. (moving items between local workspaces is local_cross(), not push())

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idItem id(s) (lr-/dc-) to upload. Omit for the whole home base.
NameTypeReqDescription
resultstringyes

No examples provided.

report ~77

report(msg) — send feedback/a bug straight to the LinkLore team. Works whether or not you're logged in (if logged in, your iam is attached automatically — never forced).

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
msgstringFeedback or bug report text to send to the team.
NameTypeReqDescription
resultstringyes

No examples provided.

restore ~102

restore(id) — recover trashed lore/doc. no id lists the trash.

NameTypeReqDescription
helpbooleanReturn this tool's full help text instead of executing.
idTrashed item id(s) (lr-/dc-) to recover. Multiple ids restore each and return one summary. Omit to list everything in the trash.
maxintegerCap on the number of trashed items listed (id= omitted). 0 = default cap.
NameTypeReqDescription
resultstringyes

No examples provided.

rm ~534

rm — unified delete for my own project. Target is chosen by argument (action= is an explicit alternative, auto-detected by which argument is present when omitted). show/rm stay inside my own project — openbox (shared) cleanup lives in the openbox tool. ## Deleting items (lore/doc) — id is a single value or a list (batch) - **trash (recoverable, default)** → `rm(id)` → restore(id) to recover - **permanent delete (unrecoverable)** → `rm(id, force=True)` prints the exact `forced(action='rm', id=...)` call to run — this call itself deletes nothing - **batch delete** → `rm(id=['lr-x','dc-y'], force=True)` - **mark as dropped (stays in search)** → `edit(id, status='dropped')` - **supersede (keep old + new head)** → `add(type='lore'|'doc', relates=old_id, ...)` ## Taking down something you sent — my server only (reverse of push, doesn't touch the source of truth) - `rm(sent='lr-x'|'dc-x')` take down from my server (or action='sent' explicitly) ## Openbox things don't live here (moved behind the openbox gate) - remove a shared entry from the box: openbox(action='rm', id=...) · expel a member: openbox(action='rm', member=...) · delete an openbox: openbox(action='delete')

NameTypeReqDescription
actionstringExplicit alternative to inferring the target from which argument is set (id/sent/openbox/member).
forcebooleanWith id=: prints the exact forced() call needed to permanently delete instead of trashing — nothing is deleted by this call itself.
helpbooleanReturn this tool's full help text instead of executing.
idItem id(s) (lr-/dc-) to trash (recoverable via restore()). With force=True, prints the forced() call for permanent delete instead — see force=.
memberstringNot supported here — member removal moved to openbox(action='rm', member=). Passing this returns a redirect notice, no-op.
openboxstringNot supported here — cross-owner removal moved to openbox(action='rm'). Passing this returns a redirect notice, no-op.
sentItem id(s) to take down from your personal server (push's inverse). Home base untouched.
NameTypeReqDescription
resultstringyes

No examples provided.

show ~523

[read-only] show() — search or find lore/doc. target/scope: query·type / filters: tag·status·file·period('Nh' hours|'Nd' days|'YYYY-MM-DD' UTC|'YYYY-MM-DD..YYYY-MM-DD' range)·source_id / result shape: sort·max·oneline·superseded / mode: action / plumbing: help. Before editing code, check file=path for related lore/doc — a direct Edit/Write auto-surfaces this via a PreToolUse hook, but check it yourself before delegating. show/rm stay inside my own project — to browse an openbox, use openbox(action='show')

NameTypeReqDescription
actionstring'' (default) or a named mode: 'graph' (corpus audit stats) or 'tags' (tag frequency list).
filestringFilter to items linked to this code file path (substring match).
helpbooleanReturn this tool's full help text instead of executing.
maxintegerCap on the number of results returned.
onelineCompact one-line-per-item rendering for listing views (ignored for a single-id detail lookup). Omit for automatic (compact for unfiltered lists or 20+ results); pass true/false to force it either way.
periodTime window — 'Nh' (last N hours), 'Nd' (last N days), 'YYYY-MM-DD' (since that UTC date), or 'YYYY-MM-DD..YYYY-MM-DD' (a UTC date range).
querystringFree-text search, or an id (lr-/dc-) for a direct lookup. Combined with other filters, narrows to their intersection.
sectionstringRead one section by heading (query= only — lr-x's '## 결정' section). Combine with no other filter.
sortstringResult order: '' (relevance/newest default), 'oldest', 'newest', or 'alpha'.
source_idstringFilter to items that came from a specific import/source id.
statusstringFilter by status: open/done/dropped/rule.
supersededbooleanInclude superseded/old versions of items (normally hidden).
tagstringFilter by tag.
typestring'lore' or 'doc' — restrict to one collection. Omit with no other filters for a combined lore+doc overview.
NameTypeReqDescription
resultstringyes

No examples provided.

status ~200

status() — detects code↔doc sync drift (git-diff based). Not for reading lore/doc content → use show()/brief(). since, action(''|'ack'|'reset'), ack, reset, help.

NameTypeReqDescription
ackDoc name(s)/id(s) to acknowledge as caught-up (or 'all'). Used with action='ack' or bare.
actionstring'' (default) = report drift. 'ack' = acknowledge the doc(s) named in ack=. 'reset' = clear prior acks named in reset=.
helpbooleanReturn this tool's full help text instead of executing.
resetDoc name(s)/id(s) to clear a prior ack for (or 'all'). Used with action='reset' or bare.
sincestringgit rev-spec to diff from (e.g. a commit SHA or branch). Omit for the default range.
NameTypeReqDescription
resultstringyes

No examples provided.

unlink ~143

unlink(a, b, action=) — disconnect two items or clear a verdict. Symmetric with link() (action='' default|'flow'|'unrelated'|'distinct', also accepts file paths the same way).

NameTypeReqDescription
astringFirst item — lr-/dc- id, a file path, or an existing title (auto-classified).
actionstring'' (default) or 'flow' — mirrors link()'s action= to target the same kind of edge to remove.
bstringSecond item — same rules as a=.
helpbooleanReturn this tool's full help text instead of executing.
NameTypeReqDescription
resultstringyes

No examples provided.

Common questions

What is the LinkLore MCP server?

LinkLore is an MCP server listed in the public MCP registry as io.linklore/llre. AI-native structured memory for agents (MCP). Built for agents, not humans. This page covers its PyPI package (llre).

Is the LinkLore MCP server safe to use?

LinkLore scores 72 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. 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 LinkLore MCP server expose?

LinkLore exposes 24 tools: doc_flow, doc_map, brief, init, config, and 19 more. Their descriptions and schemas cost roughly 7,567 tokens of context every time the server is loaded.

Is the LinkLore MCP server still maintained?

LinkLore is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.