Skip to content

profile operations

The exact fields each profile.* operation takes and returns.

Every op is POST /v1/<op> over HTTP and the MCP tool loom_<op>. The identity fields (org, namespace, agent, user_id, session_id) are filled from the token and the MCP session when a transport can; for an HTTP call with no token on a single-user server, the install's org on every op but code.* and tracker.* (which keep their plane's), and on some ops its namespace and agent; see identities and namespaces. The operations index explains role, kind and the MCP all listing. Unknown input fields are served and named in ignored_args.

profile.activity

Recent profile reads per agent — "which AI client read my profile, when?".

POST /v1/profile.activity · MCP loom_profile_activity · role viewer · read

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
lookback_days int 7 capped at 30 server-side to bound the partition scan
Output field Type Meaning
entries list[ProfileActivityEntry] Agents that read the profile in the window (at most 20), most recent first; the dashboard's own reads are left out.

profile.append

WHAT: Atomic append to an existing profile section.

POST /v1/profile.append · MCP loom_profile_append · role writer · write · not listed under the MCP all toolset

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
label str required The section to append to; a missing section is created with the default size cap.
addition str required Text added at the end of the section.
separator str '\n' Put between the existing text and addition; unused when the section is new.
Output field Type Meaning
version int Version of the memory row this write created.
memory_id str Id of the memory row the section is stored in.
content_sha256 str Content hash of the section after the write; pass it as if_match_sha256 next time.
namespace str The namespace the op reads or writes.
label str The section that was written.
char_limit int \| None The section's size cap after the write.
value_length int Length of the JSON-encoded value after the write, the size char_limit caps; the gap is the headroom left.

profile.render

Render every section in (org, namespace) into one prompt fragment.

POST /v1/profile.render · MCP loom_profile_render · role viewer · read

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
format str 'xml' "xml" | "markdown"
labels list[str] \| None None if set, render only these labels in this order
scope str 'namespace' "namespace" (default; fan-out) | "this_agent"
read_scope Literal['namespace', 'own_user', 'own_session'] 'namespace' How far the render reaches across USERS (same grammar as memory.search.read_scope, the token's claim is the ceiling).
Output field Type Meaning
rendered str The sections as one prompt fragment in the chosen format; empty when there are none.
section_count int How many sections were rendered.
total_chars int Length of rendered in characters, markup included.
labels list[str] The rendered sections' labels, in render order.

profile.replace

WHAT: Substring rewrite within a profile section.

POST /v1/profile.replace · MCP loom_profile_replace · role writer · idempotent · not listed under the MCP all toolset

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
label str required The section to edit; a missing section is a 404.
old str required Text to find; every occurrence is replaced, and absent text is a 422.
new str required Replacement text; empty deletes the occurrences of old.
Output field Type Meaning
version int Version of the memory row this write created.
memory_id str Id of the memory row the section is stored in.
content_sha256 str Content hash of the section after the write; pass it as if_match_sha256 next time.
namespace str The namespace the op reads or writes.
label str The section that was written.
char_limit int \| None The section's size cap after the write.
value_length int Length of the JSON-encoded value after the write, the size char_limit caps; the gap is the headroom left.

profile.set

WHAT: Create or replace a profile section at label.

POST /v1/profile.set · MCP loom_profile_set · role writer · idempotent · not listed under the MCP all toolset

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
label str required The section's name (its memory key), e.g. persona; setting it again replaces its text.
value str required The section's whole new text.
char_limit int 8192 The section's size cap, measured on the JSON-encoded value; a longer value is a 422.
source_trace str '' Where the section came from; a trace starting with memory.delete_version: is refused (that op's tombstone marker).
if_match_sha256 str '' Write only if the section's current content hash equals this (409 otherwise); empty = no check.
Output field Type Meaning
version int Version of the memory row this write created.
memory_id str Id of the memory row the section is stored in.
content_sha256 str Content hash of the section after the write; pass it as if_match_sha256 next time.
namespace str The namespace the op reads or writes.
label str The section that was written.
char_limit int \| None The section's size cap after the write.
value_length int Length of the JSON-encoded value after the write, the size char_limit caps; the gap is the headroom left.

profile.structured

The user's structured profile and whether it is current.

POST /v1/profile.structured · MCP loom_profile_structured · role viewer · read · not listed under the MCP all toolset

Input field Type Default Meaning
org str required The tenant (first element of the identity tuple).
namespace str required The namespace the op reads or writes.
agent str required The writing or reading agent; '-' or '*' means any agent where the op allows it.
user_id str '-' The end user the row belongs to; '-' for none.
session_id str '-' The session or conversation the row belongs to; '-' for none.
run_id str '-' The agent run (task scope) the call belongs to; '-' for none.
read_scope Literal['namespace', 'own_user'] 'namespace' The token's read_scope is the ceiling; the op always reads the one user_id named (or pinned), and own_session is refused.
Output field Type Meaning
status Literal['ready', 'stale', 'pending', 'no_schema'] ready: current, or all null with no facts; stale: memories or schema changed, or a fact was not served at the build; pending: no live profile (unbuilt, expired, redacted or high); no_schema: none set or it no longer parses.
profile dict[str, Any] Every property of the schema, null where the memories do not settle it ({} under no_schema).
built_at datetime \| None When the build read the profile's sources (a lock or unlock of the key keeps it); None when no row holds it (pending, or ready for a user with no facts).
memory_id str The memory row that holds the profile, whose history is the profile's history; empty when no row holds it (pending, or ready for a user with no facts).
version int The row's version, higher for each rebuild; 0 when no row holds it (pending, or ready for a user with no facts).
version_text str The same version as a decimal string, exact for a JavaScript caller (the number is above 2^53, which JSON.parse rounds): send this one to memory.delete_version.
schema_sha256 str The hash of the schema the namespace has now.