Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault

No arguments

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": false
}
prompts
{
  "listChanged": false
}
resources
{
  "subscribe": false,
  "listChanged": false
}
experimental
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
doc_flowC

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

doc_mapC

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

briefB

[read-only] project dashboard — call at the start of every session.

external source 🔔 = a new push has arrived. receive it with import(openbox=). options: dismiss(turn off a nudge), undismiss(restore it), help.

initB

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').

configC

Project settings (openbox source options) + identity + session pin.

Sharing lives in separate tools: send/import (openbox) - member (members/subscriptions).

actions: sources/option/sync/forget/whoami/version/pin/unpin/sessions/projects/delete_project. help=true for details.

statusA

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. (2026-07-09: the dead params auto=/sync= and ack_all= were removed — ack='all' does the same job, matching the reset='all' convention)

linkA

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 3 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.

unlinkB

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

doc_rollupB

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

cleanupC

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

doctorA

doctor() - checks project data integrity (oldId/newId, files[] paths, link targets).

doctor() read-only diagnostics (default) doctor(action='fix') automatically repairs any issues found

showB

[read-only] show() — target/scope: query·type·openbox / filters: tag·level·status·file·period('Nh' hours|'Nd' days|'YYYY-MM-DD' UTC)·source_id / result shape: sort·max·oneline·superseded / mode: action / plumbing: help

logD

[read-only] log() id, period('Nh' hours|'Nd' days|'YYYY-MM-DD' UTC), sort=oldest, max, plumbing: help

localA

local(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; createdAt/files/tags/level/status/body/items preserved) action='copy' copy to another workspace (source kept, same id retained — rejected if the target already has it) action='show' view another workspace's content (read-only, from_dir required — query/tag/type/status passed through) ⚠️ For 2+ items, the default is preview only — use confirm=True to execute (a single item runs immediately). cf. sharing across a server/team is the openbox (send/import) — local() 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() just because you have filesystem access; go through send() (the recipient must import() — a review gate).

memberA

member(action) — openbox (shared space) members and permissions. An openbox is a project's shared space (invite-only, not 'public').

  • member('new', openbox=, display_name=) create an openbox (you = owner)

  • member('invite', openbox=, role=, kind=) issue an invite code (owner). kind='project' = project member

    • who= — reissue invite (targets an existing project identity, rotates the session)

  • member('join', code=, display_name=) join with an invite code (first join)

  • member('subscribe', openbox=, url=) connect an openbox you're already a member of via URL (authenticates as your identity)

  • member('list', openbox=) list members

  • member('role', openbox=, who=, role=) change a member's role (viewer↔member, owner)

  • member('transfer', openbox=, who=) transfer owner (who=member_id, double confirmation)

  • member('leave', openbox=) leave yourself (owner gets 409, transfer first) remove: rm(member='', openbox='') delete the whole openbox: rm(openbox='') — owner only, double confirmation (openbox= is an alias for name= — both work.)

pushA

push(id) — upload the home base to my server (visible to me only). Like git push: local → server. Not for sharing — to share with others use send (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 the server copy only, home base untouched. (moving items between local workspaces is local(), not push())

pullA

pull(id) — restore the home base from my server (works across devices too). Like git pull: server → local. To bring things from an openbox use import — 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(), not pull())

sendA

send(id, openbox) — share a footprint to an openbox (visible to others). Both id and openbox are required.

  • send(id='lr-x'|'dc-x', openbox='ai-team') share one item

  • send(id=['lr-x','dc-y'], openbox='ai-team') a batch Not my-server backup — that's push. The home base is untouched — this copies into the openbox. Take down (inverse): rm(sent='lr-x'|'dc-x', openbox='ai-team') — sender only, home base untouched. (space= is an alias for openbox= — both work)

importA

import(id, openbox) — bring an openbox's footprints into the home base (the receiver picks what).

  • import(openbox='ai-team') refreshes the openbox cache (remote/) only, home base untouched

  • import(id='lr-x'|'dc-x', openbox='ai-team') refreshes the cache + absorbs into the home base (new local id, provenance metadata) (space= is an alias for openbox= — both work.) ⚠️ moving items between local projects/workspaces is local(), not import()

reportB

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

addB

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). level 1~4(lore): 1=note 2=verified 3=pinned(shown in brief) 4=global(all projects). details help=True

editA

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 replace) → edit(id, action='overwrite', msg='new body' [, tags=[...], ...]) # old body kept in history(recoverable via log). tags/items(doc only)/links are also fully replaced in the same call

  • 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. Unspecified('') means append.)

Other:

  • mark as dropped → edit(id, status='dropped') (still shown in search)

  • level (lore importance) → edit(id, level=N): 1=note(default) 2=verified 3=pinned(shown in brief) 4=global(all projects)

  • 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)

rmA

rm — unified delete. Target is chosen by argument (action= is an explicit alternative, auto-detected by which argument is present when omitted).

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)

  • batch deleterm(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 (reverse of push/send, doesn't touch the source of truth)

  • rm(sent='lr-x'|'dc-x', openbox='ai-team') take down from an openbox (sender only)

  • rm(sent='lr-x'|'dc-x') take down from my server

  • (or action='sent', sent= is still required — action= is just the explicit form)

Removing a member (openbox owner only)

  • rm(member='<member_id>', openbox='ai-team') (or action='member')

Deleting an entire openbox (shared space) (owner, unrecoverable → always asks to confirm)

  • rm(openbox='ai-team') 1st call: returns a warning+question (nothing executes)

  • rm(openbox='ai-team') identical 2nd call → that itself is the confirmation, actually deletes (no confirm= param)

  • (space= is an alias for openbox=)

  • (or action='openbox', openbox= is still required)

  • ⚠️ action='openbox' cannot combine with id= (explicit rejection) — deleting an item and deleting an entire shared space are separate operations. id alone (action unspecified) goes to regular item delete.

restoreB

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

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/linklore/linklore-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server