LinkLore
PYPI · LLRE · SCANNED SEP 21
AI-native structured memory for agents (MCP). Built for agents, not humans.
Available components
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
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- License check failed: no license is declared. See how to fix → Fail
- Actively maintained (last published 45 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
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
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
claude mcp add io-linklore-llre -- uvx llre
{
"mcpServers": {
"io-linklore-llre": {
"command": "uvx",
"args": [
"llre"
]
}
}
} {
"servers": {
"io-linklore-llre": {
"command": "uvx",
"args": [
"llre"
]
}
}
} codex mcp add io-linklore-llre -- uvx llre
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"io-linklore-llre": {
"type": "local",
"command": [
"uvx",
"llre"
],
"enabled": true
}
}
} openclaw mcp add io-linklore-llre --command uvx --arg llre
mcp_servers:
io-linklore-llre:
command: "uvx"
args: ["llre"] {
"McpServers": {
"io-linklore-llre": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"llre"
]
}
}
} assistant mcp add io-linklore-llre -t stdio -c uvx -a llre
{
"mcpServers": {
"io-linklore-llre": {
"command": "uvx",
"args": [
"llre"
]
}
}
} 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.
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 →
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 →
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
| Name | Type | Req | Description |
|---|---|---|---|
| flow | boolean | – | With links= targeting a doc: create chain order (flowLink) instead of a plain mutual link. doc↔doc only. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| items | – | – | list[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,… |
| links | – | – | Link 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. |
| msg | string | – | Body text. |
| push_to | – | – | Openbox name to share the new item into immediately (a copy, not a link). |
| relates | string | – | Id of an existing lore/doc this supersedes — this new item becomes head, relates= is marked no-longer-head. |
| status | string | – | Initial status — 'open' (default), 'done', 'dropped', or 'rule' (a standing rule/regression-guard, not a one-off entry — searchable via status='rule'). |
| tags | – | – | Tag(s) to attach. |
| title | string | – | Title of the new lore/doc. |
| type | string | – | 'lore' (default) — a journal entry/decision. 'doc' — a spec/plan. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| dismiss | – | – | Nudge id(s) to turn off (they stop appearing in brief()). |
| help | boolean | – | Return this tool's full help text instead of executing. |
| undismiss | – | – | Previously dismissed nudge id(s) to restore. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
cleanup ~128
[read-only] cleanup(type='lore'|'doc') threshold(=0.85), status(=open), help - duplicate candidates.
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| status | string | – | Only consider items with this status when matching pairs. |
| threshold | number | – | Cosine-similarity floor for a duplicate candidate pair (0-1). Default 0.85 — higher = stricter. |
| type | string | – | 'lore' (default) or 'doc' — which collection to scan for duplicates. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | '' (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_search | – | – | action='option': auto-include this source's items in search results. |
| dir | string | – | action='pin': absolute path to pin this session to. |
| string | – | Identity email — bare set or action='whoami'. | |
| handle | string | – | Identity handle (unique short id) — bare set or action='whoami'. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| name | string | – | Identity display name (bare set / action='whoami'), or the source name to target for action='option'/'sync'/'forget'. |
| project_id | string | – | action='delete_project': target project id. |
| projects | boolean | – | Shortcut for action='projects' — list every LinkLore project on this machine. |
| revoke | string | – | action='sessions': session id to revoke, or 'all'. |
| show_prefix | – | – | action='option': prefix this source's results with its source name. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
doc_flow ~77
[read-only] doc_flow(id) — renders a doc's flowLink chain in order (journey view).
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | string | – | Doc id (dc-...) to render the flowLink chain for. Omit to list all chain starting points. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
doc_map ~63
[read-only] doc_map(oneline) — overview of the full doc link network.
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| oneline | boolean | – | Compact view — one line per connected cluster instead of every doc. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
doc_rollup ~68
[read-only] doc_rollup(id) — find and collect lore linked to a doc into an AI-summary draft.
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | string | – | Doc id (dc-...) to collect linked lore for. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | '' = read-only diagnostics (default). 'fix' = automatically repair issues found. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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)
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | '' 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_search | – | – | Local-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. |
| flow | boolean | – | With links= targeting a doc: create chain order (flowLink) instead of a plain mutual link. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | string | – | Id (lr-/dc-) of the item to edit. |
| items | – | – | New checklist items (doc) or a checklist-item toggle. |
| links | – | – | Link 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. |
| msg | string | – | Content — meaning depends on action= (appended text / section body / full overwritten body / supersede conclusion). |
| section | string | – | action='section': heading of the existing section to replace. |
| status | string | – | New status — 'open', 'done', 'dropped' (resolved, hidden from active views), or 'rule' (standing rule/regression-guard). |
| tags | – | – | Tag(s) — action='overwrite' replaces the full tag set; otherwise added. |
| title | string | – | New title. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | Required — which tool's warning you are executing: 'rm' | 'local_cross' | 'config' | 'openbox'. |
| delete | string | – | action='openbox' only: pid of the box to delete, from openbox()'s warning. |
| delete_project | string | – | action='config' only: the prj_id printed in config()'s delete_project warning. |
| from_dir | string | – | action='local_cross' only: source workspace path, from the warning. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | action='rm': item id(s) to permanently delete. action='local_cross': item id(s) to move/copy. |
| leave | string | – | action='openbox' only: pid of the box to leave, from openbox()'s warning. |
| mode | string | – | action='local_cross' only: 'move' or 'copy' — local_cross()'s own action= renamed here to avoid clashing with forced's own action=. |
| name | string | – | action='openbox' only: box display-name hint (optional) — re-derived from pid= if omitted. |
| pid | string | – | action='openbox' only: target box's server project id — required for transfer=/rm_member=/push= (delete=/leave= carry it themselves, no pid= needed). |
| push | – | – | action='openbox' only: item id(s) to push — pid= (and optionally name=) name the box. |
| rm_member | – | – | action='openbox' only: resolved member id(s) to remove — pid= names the box. |
| sessions_revoke_all | boolean | – | action='config' only: revoke every other account session, as printed in config()'s warning. |
| to | string | – | action='local_cross' only: target workspace path, from the warning. |
| transfer | string | – | action='openbox' only: resolved member id to transfer ownership to — pid= names the box. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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').
| Name | Type | Req | Description |
|---|---|---|---|
| blueprint | string | – | Name of a starter blueprint to seed the new project with. Omit for a bare empty setup. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| project_dir | string | – | Folder 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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'
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | – | First item — lr-/dc- id, a file path, or an existing title (auto-classified). |
| action | string | – | '' 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… |
| b | string | – | Second item — same rules as a=. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | Required — 'move' or 'copy' transfers item(s) to another local workspace; 'show' reads another workspace read-only. |
| from_dir | string | – | Source 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. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | Item id(s) (lr-/dc-) to move/copy. For action='show', an alias for query= (single-item lookup). |
| query | string | – | action='show': free-text search in the other workspace. |
| status | string | – | action='show': filter by status (open/done/dropped/rule) in the other workspace. |
| tag | string | – | action='show': filter by tag in the other workspace. |
| to | string | – | Target workspace path — required for move/copy. |
| type | string | – | action='show': filter by type ('lore'|'doc') in the other workspace. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | string | – | Item id (lr-/dc-) to show edit history for. Omit for the unified project-wide activity log. |
| max | integer | – | Cap on the number of entries returned. |
| period | – | – | Time 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). |
| sort | string | – | 'newest' (default) or 'oldest'. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | '' (default) = search/browse. 'pull' = fetch id= into this project (requires id=). |
| filter | string | – | Category filter for search (e.g. 'build', 'automation', 'personal'). |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | string | – | A catalog listing id (lr-/dc-) — direct detail lookup, or the pull target with action='pull'. |
| max | integer | – | Cap on the number of search results returned. |
| order | string | – | 'hot' (most pulled) or 'new' (most recently published). Omit for curated order. |
| query | string | – | Free-text search across the public catalog (title/tags). |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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=…
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | One 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. |
| code | string | – | action='join': invite code to join with. |
| description | string | – | action='edit': new description for the box. |
| display_name | string | – | action='new'/'join': your display nickname in the box. action='edit': change your own nickname (anyone can). |
| expires_h | integer | – | action='invite': invite code lifetime in hours. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | action='push'/'pull': item id(s) (lr-/dc-). action='rm': item id(s) to take down (exactly one of id=/member= required). |
| kind | string | – | action='invite': kind of the invited member, e.g. 'project' for a project-identity member. |
| max | integer | – | action='show': cap on the number of results returned. |
| member | – | – | action='rm': member id(s) to expel (exactly one of id=/member= required). action='role'/'transfer': target member id (single). |
| name | string | – | Target box name (server project name) — used by every action except 'join' (no box to name before joining). |
| oneline | boolean | – | action='show': compact one-line-per-item rendering. |
| project_id | string | – | action='docking': disambiguate when multiple boxes share the same name. |
| query | string | – | action='show': free-text search within the box. |
| role | string | – | action='invite': role to grant the invite. action='role': new role for member= (e.g. viewer/member/owner). |
| tag | string | – | action='show': filter by tag within the box. |
| title | string | – | action='edit': rename the box (server project name). Owner only. |
| url | string | – | action='docking': retired. Kept only so a legacy call gets a migration error instead of a silent rejection. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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())
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | Item id(s) (lr-/dc-) to restore. Omit for the whole home base. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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())
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | Item id(s) (lr-/dc-) to upload. Omit for the whole home base. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| msg | string | – | Feedback or bug report text to send to the team. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
restore ~102
restore(id) — recover trashed lore/doc. no id lists the trash.
| Name | Type | Req | Description |
|---|---|---|---|
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | Trashed item id(s) (lr-/dc-) to recover. Multiple ids restore each and return one summary. Omit to list everything in the trash. |
| max | integer | – | Cap on the number of trashed items listed (id= omitted). 0 = default cap. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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')
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | Explicit alternative to inferring the target from which argument is set (id/sent/openbox/member). |
| force | boolean | – | With id=: prints the exact forced() call needed to permanently delete instead of trashing — nothing is deleted by this call itself. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| id | – | – | Item id(s) (lr-/dc-) to trash (recoverable via restore()). With force=True, prints the forced() call for permanent delete instead — see force=. |
| member | string | – | Not supported here — member removal moved to openbox(action='rm', member=). Passing this returns a redirect notice, no-op. |
| openbox | string | – | Not supported here — cross-owner removal moved to openbox(action='rm'). Passing this returns a redirect notice, no-op. |
| sent | – | – | Item id(s) to take down from your personal server (push's inverse). Home base untouched. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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')
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | – | '' (default) or a named mode: 'graph' (corpus audit stats) or 'tags' (tag frequency list). |
| file | string | – | Filter to items linked to this code file path (substring match). |
| help | boolean | – | Return this tool's full help text instead of executing. |
| max | integer | – | Cap on the number of results returned. |
| oneline | – | – | Compact 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. |
| period | – | – | Time 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). |
| query | string | – | Free-text search, or an id (lr-/dc-) for a direct lookup. Combined with other filters, narrows to their intersection. |
| section | string | – | Read one section by heading (query= only — lr-x's '## 결정' section). Combine with no other filter. |
| sort | string | – | Result order: '' (relevance/newest default), 'oldest', 'newest', or 'alpha'. |
| source_id | string | – | Filter to items that came from a specific import/source id. |
| status | string | – | Filter by status: open/done/dropped/rule. |
| superseded | boolean | – | Include superseded/old versions of items (normally hidden). |
| tag | string | – | Filter by tag. |
| type | string | – | 'lore' or 'doc' — restrict to one collection. Omit with no other filters for a combined lore+doc overview. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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.
| Name | Type | Req | Description |
|---|---|---|---|
| ack | – | – | Doc name(s)/id(s) to acknowledge as caught-up (or 'all'). Used with action='ack' or bare. |
| action | string | – | '' (default) = report drift. 'ack' = acknowledge the doc(s) named in ack=. 'reset' = clear prior acks named in reset=. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| reset | – | – | Doc name(s)/id(s) to clear a prior ack for (or 'all'). Used with action='reset' or bare. |
| since | string | – | git rev-spec to diff from (e.g. a commit SHA or branch). Omit for the default range. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
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).
| Name | Type | Req | Description |
|---|---|---|---|
| a | string | – | First item — lr-/dc- id, a file path, or an existing title (auto-classified). |
| action | string | – | '' (default) or 'flow' — mirrors link()'s action= to target the same kind of edge to remove. |
| b | string | – | Second item — same rules as a=. |
| help | boolean | – | Return this tool's full help text instead of executing. |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | – |
No examples provided.
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.