Bilinc
This server gives AI agents hosted memory: save, recall, correct, audit, checkpoint, and restore project knowledge through MCP tools.
Write memories with
commit_mem, including key/value, source, metadata, type, importance, TTL, and idempotency keys; returns a version for concurrency control.Recall memories with
recall, using query, limits, memory-type filters, explain mode, and retrieval profiles such as fast, balanced, verified, or deep.Correct existing memories with
revise, preserving revision history and failing rather than creating if the key does not exist.Remove memories with
forget, requiring a reason; optionalpurgeremoves stored content from history and checkpoints.Check workspace capabilities with
status, including plan, limits, usage, and available profiles.Create or list checkpoints with
snapshotbefore risky work.Compare changes with
diff, either checkpoint-to-checkpoint or checkpoint-to-current state.Restore checkpoints with
rollback: a free preview returns a confirmation token, then a destructive execute restores the project.Browse stored memories with
list_memories, filtering by key prefix, type, source, update time, pagination, and value previews.Inspect memory history with
history, showing creates, updates, confirms, forgets, and rollback-linked changes.Confirm accuracy with
confirm, recording that an existing memory is still valid without changing its value.
Bilinc
Hosted memory for AI agents. Save what your agents learn, recall it before they act, see who wrote each memory and what changed, and roll back when a run goes wrong.
The bilinc package on PyPI is the Python SDK, the bilinc CLI and the stdio MCP adapter for Bilinc Cloud. Its source is ReARCLabs/bilinc; the hosted service is not part of the package.
Start in 60 seconds
Claude, ChatGPT or Codex, without Python. In Claude, open Customize → Connectors → Add custom connector, name it Bilinc and paste https://mcp.bilinc.space/mcp. Sign in and choose read-only or read and write. In Claude Code:
claude mcp add --transport http --scope user bilinc https://mcp.bilinc.space/mcpThe same address works in ChatGPT and Codex: remote MCP guide.
Python, the CLI or any MCP client.
pip install -U bilinc
bilinc login # browser sign-in, free, no card required
bilinc quicktest # one hosted commit, one recall and a status checkbilinc login saves an API key for this computer with owner-only permissions; the key never appears in a URL or your terminal. Without a browser, use bilinc login --device. For CI and scripts, set BILINC_API_KEY.
Related MCP server: mnemo
Where Bilinc sits
Every write records where it came from and returns a version you can pass back, so a change is refused if the memory moved since you read it. Forget requires a reason and revise accepts one. In the remote connector, recall shows when each memory was last confirmed and marks entries past their review window as possibly outdated; nothing is hidden or deleted by that check.
Similar is not the same as current
Use Bilinc when:
a long-running agent (coding, support, research, a personal assistant) needs earlier decisions before a risky action;
you need to know which run, tool or person wrote a piece of agent state;
a bad run wrote wrong state and you need a way back, not a manual cleanup;
several agents or teammates share one memory and you want per-key access and visible usage.
Reach for something else when you only need semantic search over documents (a vector database is the simpler tool), when you need an Apache-2.0, fully self-hosted runtime (this package is cloud-only and BUSL-1.1), or when you want the memory layer to also be your agent framework.
Python SDK
from bilinc import CloudClient
client = CloudClient() # reads BILINC_API_KEY or the key saved by `bilinc login`
# Write, and keep the version for optimistic concurrency.
written = client.commit("agent.goal", {"ship": "reliable memory"}, memory_type="semantic")
results = client.recall("agent goal", limit=5)
# Correct something you already know. Fails if the key does not exist.
client.revise("agent.goal", {"ship": "verifiable memory"},
reason="scope corrected", expected_version=written["entryVersion"])
# Checkpoint before risky work, then see what changed.
snapshot = client.create_snapshot(label="before-autonomous-run")["snapshot"]
client.diff(snapshot["id"])
# Recover. The preview is free; executing needs its token.
preview = client.rollback_preview(snapshot["id"], reason="undo bad agent run")
client.rollback(snapshot["id"], confirmation_token=preview["confirmationToken"],
reason="undo bad agent run")
# Review what is stored. Listing, history and export are free reads.
for entry in client.iter_memories(prefix="agent."):
print(entry["key"], entry["updatedAt"])
client.history("agent.goal")
client.confirm("agent.goal") # still accurate; costs one write
# Take a memory out of use. A reason is required and recorded.
client.forget("agent.goal", reason="superseded by the planner service")CLI
bilinc status # plan, capabilities, limits, usage
bilinc commit --key agent.goal --value '{"ship":"reliable memory"}'
bilinc recall --query "agent goal"
bilinc revise --key agent.goal --value '{"ship":"verifiable memory"}' --reason "scope corrected"
bilinc list --prefix agent. # keys, types, update times, value previews
bilinc history agent.goal # recorded changes, newest first
bilinc snapshot create --label before-autonomous-run
bilinc diff --from-snapshot snap_...
bilinc export -o bilinc-export.json # full values; the file is readable only by you
bilinc forget --key agent.goal --reason "superseded by the planner service"Rollback is two steps, and execute never prompts, so it is safe in automation:
bilinc rollback preview --snapshot snap_... --reason "undo bad agent run"
bilinc rollback execute --snapshot snap_... --reason "undo bad agent run" \
--confirmation-token <token-from-preview>MCP adapter
The stdio adapter works with any MCP client: Claude Code, Codex, Cursor, Hermes Agent, opencode and others. After bilinc login, let the CLI write the setup:
bilinc mcp install --client claude-code # prints a ready `claude mcp add ...` command
bilinc mcp install --client claude-desktop # prints the config and where Claude Desktop keeps it
bilinc mcp install # plain mcpServers JSON for any other clientThe config carries no key; the adapter reads the one bilinc login saved. On a machine without one, add "env": { "BILINC_API_KEY": "..." }.
Tool | What it does |
| Save durable state with its source; returns a version. |
| Find earlier context and decisions before acting. |
| Correct an existing memory. It never creates one. |
| Take a memory out of use. Destructive; a reason is required. |
| Workspace, plan, capabilities, limits and usage. Never billed. |
| Save a checkpoint before risky work, or list checkpoints. |
| Compare a checkpoint with another one or with now. |
| Restore a checkpoint: a free preview, then a confirmed execute. |
| Browse what is stored. Free. |
| One memory's changes, newest first. Free. |
| Record that a memory is still accurate. One write. |
The remote connector at https://mcp.bilinc.space/mcp has ten tools; a read-only connection lists only the four read tools. Client guides: Claude Code · Codex · Cursor · any MCP client.
Forget and purge
Since 2.5.0: client.forget(key, reason=..., purge=True), bilinc forget --key ... --reason ... --purge, or "purge": true in the REST API also removes the memory's stored content from storage and history. It works on a memory you forgot earlier and cannot be undone. See the privacy policy for what is kept and for how long.
Hosted API
All endpoints live under https://bilinc.space. Memory operations need an API key and an active Bilinc Cloud plan; the free plan needs no card.
Endpoint | Notes |
| Public service health. No key, never billed. |
| What one key can do. Never billed. |
| Write, read, correct. |
| Destructive. Reason required; |
| List (free) or create checkpoints. |
| Compare checkpoints. Free. |
| Free. Returns a confirmation token. |
| Destructive. Requires that token. |
Send an Idempotency-Key header on any write you might retry: the same key with the same payload replays the original result and is billed once; a different payload is refused with 409 idempotency_conflict. Saves that contain a credential, such as an API key, token or private key, are refused with secret_detected and the value is never echoed back.
What's new in 2.6.2
"What changed today?": recall answers time questions in English and Turkish ("since Monday", "dünkü kararlar", "son 3 günde") with the memories written in that window, newest first, in the project's time zone.
Less noise in time questions: sources such as raw chat transcripts can be left out of time answers unless you ask for chats.
Nothing else moves: queries without a time phrase are answered exactly as before.
Every release: changelog.
Links
bilinc.space · Docs · Install guide · Pricing (free plan, no card) · Changelog · Trust
Compare: vector memory · Mem0 · Zep · Letta
Guides: What is AI agent memory? · Rolling back an agent memory write · Auditing what an agent remembered
For machines: llms.txt · ai-index.json
Feedback and security
Questions, bugs and ideas: GitHub Issues. Report security issues privately to bilincsupport@rearclabs.com (see security.txt). Please keep memory values, API keys and production logs out of issues and screenshots.
License
Business Source License 1.1, licensed by ReARC Labs Inc. See LICENSE.
Available Tools
11 toolscommit_memA
Write a memory entry to hosted Bilinc Cloud.
Creates the entry if it is new and revises it if the key already
exists. Returns an opaque entry version you can pass to `revise` or
`forget` as `expected_version` for optimistic concurrency.
Pass `idempotency_key` when retrying: the same key with the same
payload returns the original result instead of writing twice.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| ttl | No | ||
| value | Yes | ||
| source | No | ||
| metadata | No | ||
| priority | No | ||
| canonical | No | ||
| importance | No | ||
| session_id | No | ||
| memory_type | No | semantic | |
| idempotency_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behaviors: upsert semantics, returning an opaque version for optimistic concurrency, and idempotent behavior via `idempotency_key`. These are important beyond what annotations would provide. It doesn't mention failure modes or limitations, but the disclosed traits are significant and clearly described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded, with the main purpose stated first. It uses three short paragraphs that each add value: purpose, upsert/version behavior, and idempotency. It is not overly verbose, though it could be slightly tighter by merging related thoughts. Overall, it is well-structured and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters, 0% schema coverage, no annotations), the description is incomplete. It covers the core upsert and idempotency behavior but leaves many parameters unexplained, which could lead an agent to misuse the tool. The presence of an output schema helps with return values, but the input side is under-documented. A more comprehensive description should at least summarize the role of key parameters like `memory_type`, `priority`, and `ttl`.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains `idempotency_key` in detail; the other 10 parameters (e.g., `key`, `value`, `ttl`, `priority`, `metadata`, `memory_type`) are not elaborated. The description does not clarify what `value` should be, how `memory_type` affects behavior, or the meaning of fields like `canonical` and `importance`. This is a significant gap for a tool with 11 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Write a memory entry to hosted Bilinc Cloud.' It further explains the upsert behavior ('Creates the entry if it is new and revises it if the key already exists'), which distinguishes it from siblings like `revise` and `recall`. This is a specific verb+resource with differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives context by explaining that the returned version can be passed to `revise` or `forget`, implying when those tools are appropriate. It also explains idempotency usage for retries. However, it does not explicitly state when NOT to use this tool or name alternatives for read/delete scenarios, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirmConfirm a memory is still accurateA
Record that an existing memory is still accurate.
The stored value is not changed; the memory's updated time moves to now
and its history gains a confirm entry. Costs one write operation.
Fails with `memory_not_found` when the key does not exist, and with
`version_conflict` when `expected_version` no longer matches.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| reason | No | ||
| idempotency_key | No | ||
| expected_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, destructive=false, idempotent=false); the description goes well beyond that by stating exactly what mutates (updated time, history entry), what does not (stored value), the write cost, and two concrete error codes with their trigger conditions. That is precisely the extra behavioral context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action in the first sentence, followed by only the details an agent needs: mutation semantics, cost, and failure modes. No repetition of the title or schema, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema present, the description covers behavior, side effects, and error conditions thoroughly enough to call it safely. The remaining gap is the unexplained reason and idempotency_key parameters, which neither the schema nor the description defines.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 4 parameters, so the description must carry the burden. It explains expected_version well (an optimistic-concurrency check that yields version_conflict), but says nothing about key, reason, or idempotency_key — notably that idempotency_key is the dedupe mechanism even though annotations declare idempotentHint=false. Partial compensation only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (record that a memory is still accurate) and immediately clarifies the key distinction from a value-changing edit: 'The stored value is not changed.' That implicitly separates it from siblings like revise and rollback. It never names a sibling explicitly, so it falls just short of the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Record that an existing memory is still accurate,' and the failure modes give implicit preconditions (the key must exist, and expected_version must match). However, there is no explicit when-to-use/when-not guidance or named alternative (e.g., revise when the value actually changed), leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diffA
Compare a checkpoint against another checkpoint or current state.
Read-only and free. Leave `to_snapshot_id` empty to see what has
changed since the checkpoint was taken. Values are redacted unless
`include_values` is set; a value-bearing diff that would be too large
is refused rather than silently truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| include_values | No | ||
| to_snapshot_id | No | ||
| from_snapshot_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the operation is read-only and free, values are redacted unless include_values is set, and overly large diffs are refused rather than silently truncated. This gives the agent important behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the main purpose in the first line and additional key behaviors following. Every sentence adds value, and it is not padded with fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers essential behavioral context: read-only, free, redaction behavior, and refusal of large diffs. The output schema exists, so return format need not be detailed. However, it does not mention the limit parameter or edge cases, which would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the semantics of to_snapshot_id (optional, defaults to current state) and include_values (controls value redaction), but does not explain limit or from_snapshot_id in detail. This partial coverage earns a 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the primary action: 'Compare a checkpoint against another checkpoint or current state.' This uses a specific verb ('Compare') and resource ('checkpoint'), and the mention of 'current state' distinguishes it from sibling tools like snapshot or rollback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use the tool: to compare checkpoints or see changes since a checkpoint. It also explains the key behavior of leaving to_snapshot_id empty. However, it does not explicitly mention alternatives or when not to use it, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Remove a memory from active recall. DESTRUCTIVE.
This is a destructive operation: the entry stops influencing every
future recall in this project. `reason` is required and is written to
the audit trail. The deleted value is never returned.
With `purge=true` the memory's stored values are also removed from the
audit trail and every checkpoint of the project (removal from storage
and history; key names and value hashes remain). It also works on a
memory forgotten earlier and cannot be undone. Only purge when the user
asks for the content to be gone, not just out of recall.
Use this for state that is genuinely obsolete. To correct a memory
rather than remove it, use `revise`.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| purge | No | ||
| reason | Yes | ||
| idempotency_key | No | ||
| expected_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With zero annotations the description carries the full burden and does so well: it discloses the audit-trail write, that the deleted value is never returned, that purge additionally strips stored values from history and all checkpoints (leaving key names and hashes), that purge works on already-forgotten entries, and that it cannot be undone. This is exactly the context annotations would otherwise supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive warning, then organized into purpose, behavior, purge semantics, and alternative routing. Slight redundancy between the standalone "DESTRUCTIVE." line and "This is a destructive operation:", and the prose is a bit long, but nearly every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still usefully notes the deleted value is never returned. For a destructive mutation with no annotations the coverage is strong, but the two control parameters (idempotency and version pinning) are unaddressed, which matters for an irreversible operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain all five parameters; it covers `key`, `reason` (required, written to audit trail) and `purge` (with detailed storage/history semantics) well. It says nothing about `idempotency_key` or `expected_version`, leaving retry and optimistic-concurrency behavior undocumented in both schema and description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Remove a memory from active recall") and immediately disambiguates from the closest sibling by naming `revise` as the corrective alternative. The DESTRUCTIVE flag up front makes the operation class unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ("state that is genuinely obsolete"), when-not-to-use and the alternative ("To correct a memory rather than remove it, use `revise`"), plus a separate rule for the purge flag ("Only purge when the user asks for the content to be gone, not just out of recall"). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
historyShow a memory's historyARead-onlyIdempotent
Show the recorded changes to one memory key, newest first.
Read-only and free. Each entry has the operation (create, update,
confirm, forget or delete), its time, the recorded reason and source,
and the value before and after unless `values` is "none". A change
made by a rollback keeps its create, update or delete operation and
also carries `rollbackSnapshotId`.
Values recorded before a memory was forgotten are not returned.
`exists` is false when the key is not currently stored.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| limit | No | ||
| values | No | full |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description goes far beyond by describing entry structure (operation, time, reason, source, before/after values), the rollbackSnapshotId behavior, the 'values: none' suppression, and that forgotten values are withheld. This is substantial behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and ordering, then structured detail. It is a bit list-like but every sentence conveys useful semantics; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained, but the description still enriches it with field-level semantics and edge cases (rollback operations, forgotten values, exists=false). Complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter burden. It explains the `values` parameter's semantics ("none" suppresses before/after values) and the `key` parameter's scope, compensating for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Show the recorded changes to one memory key, newest first', a precise verb+resource+ordering statement. It is clearly distinguishable from siblings like diff or snapshot by specifying the auditable change log of a single key.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implicitly tells when to use the tool (auditing past changes to a key) but never names or contrasts with alternatives such as diff or snapshot. No explicit 'use this instead of X when Y' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_memoriesList stored memoriesARead-onlyIdempotent
List the memories stored in this Bilinc Cloud project.
Read-only and free. Filters: key `prefix`, `memory_type`, ISO-8601
`updated_after` / `updated_before`, and `sources` (exact "saved by"
values). `order` is "key" (default), "newest" (most recently updated
first) or "oldest"; pass the same order with a `cursor`. Returns up to `limit` entries
(1-100) with key, type, importance, source, created and updated times,
entry version, and a value whose size follows `values` ("preview" by
default, "full", or "none"). `total` counts all matches; `nextCursor`
is the `cursor` for the next page and is null on the last page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| order | No | ||
| cursor | No | ||
| prefix | No | ||
| values | No | preview | |
| sources | No | ||
| memory_type | No | ||
| updated_after | No | ||
| updated_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds 'free', the paging contract (same `order` with a `cursor`, `nextCursor` null on the last page), and the `values` size modes ('preview' default, 'full', 'none'). That is real behavioral context beyond the structured fields, though it does not quantify result size or say whether paging under concurrent writes is stable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then cost, then filters, then return/paging shape — a logical order with no filler sentences. It is dense and slightly run-on ('Returns up to `limit` entries ... and a value whose size follows `values`'), but every clause carries parameter or paging information that is otherwise undocumented.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter tool with 0% schema descriptions, the definition documents every parameter, the default for `order` and `values`, the limit range, and the full cursor loop. An output schema exists, yet the description still names the returned fields and the `total`/`nextCursor` semantics, which is exactly what an agent needs to page correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% — only titles and defaults — so the description carries the full burden, and it does: it explains `prefix`, `memory_type`, ISO-8601 `updated_after`/`updated_before`, `sources` as exact 'saved by' values, `order` values with 'key' default, `cursor` reuse rule, `limit` (1-100), and `values` modes. The only gap is that valid `memory_type` values are never enumerated (no enums in schema).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the memories stored in this Bilinc Cloud project'), so an agent immediately knows this is an enumeration tool. However, it never distinguishes itself from the sibling `recall` (presumably retrieval/search) or `history`, so the boundary is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied through the enumerated filters and the 'Read-only and free' note, which tells an agent this is the cheap path for browsing. There is no explicit when-to-use/when-not statement and no routing advice to `recall` or `history` for search-style lookups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recallA
Retrieve memories from hosted Bilinc Cloud.
`profile` selects retrieval quality and cost: fast, balanced,
verified, or deep. Higher profiles do more reflection and return more
provenance, and are gated by the workspace plan — call `status` to see
which profiles this key may use. Smart retrieval is this argument, not
a separate tool.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| explain | No | ||
| profile | No | balanced | |
| memory_types | No | ||
| query_timestamp | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description takes on the burden of explaining behavior. It discloses that higher profiles 'do more reflection and return more provenance' and are 'gated by the workspace plan,' which is valuable context. It also mentions cost implications. However, it does not explicitly state whether recall is read-only or describe other side effects, leaving some ambiguity for a no-annotation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose. Each sentence earns its place: the first states the core action, and the second explains the profile parameter's nuances and its relationship to the status tool. There is no redundant fluff or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (6 parameters, one required), the description covers only the retrieval purpose and profile specifics. The output schema exists and can explain return values, but the description does not clarify other parameters or edge cases. It is adequate for a basic retrieval tool but feels incomplete for an agent needing to use memory_types, query_timestamp, or explain effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It only explains the 'profile' parameter in detail, covering just one of six parameters. The description does not address query, limit, explain, memory_types, or query_timestamp, leaving the agent without sufficient guidance for these parameters despite their self-explanatory names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Retrieve memories from hosted Bilinc Cloud.' It clearly distinguishes from siblings like commit_mem, revise, and forget by focusing on retrieval. The additional note that 'Smart retrieval is this argument, not a separate tool' further disambiguates from potential alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides practical guidance: 'call `status` to see which profiles this key may use' indicates a prerequisite for using higher profiles. It also clarifies that profile-based retrieval is not a separate tool. However, it does not explicitly state when to use recall vs. other memory operations or list exclusions, so it misses some explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reviseA
Deliberately replace an existing memory, preserving belief revision.
Use this instead of `commit_mem` when you intend to correct or
supersede something you already know, so the change is recorded as a
revision rather than an accidental overwrite.
Fails with `memory_not_found` if the key does not exist: revise never
creates. Pass `expected_version` from a previous write to fail with
`version_conflict` instead of clobbering a concurrent change.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| reason | No | ||
| strategy | No | entrenchment | |
| importance | No | ||
| idempotency_key | No | ||
| expected_version | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the disclosure burden. It reveals important behaviors: never creates, fails with memory_not_found, supports expected_version for concurrency (version_conflict). It does not mention auth or reversibility, but for a memory tool these are less critical. Slightly incomplete but strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each adding substantive value: purpose, alternative differentiation, failure mode, concurrency behavior. No filler or repetition, well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 7 parameters and zero schema descriptions, the description is too thin. It covers core use cases and error scenarios, but omits guidance on the optional parameters and does not describe the response shape (though an output schema exists). It is minimally adequate but has clear gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It only explains `expected_version` and implies `key` must exist, but does not clarify the meaning or usage of `value`, `reason`, `strategy`, `importance`, or `idempotency_key`. This leaves most parameters under-specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Deliberately replace an existing memory.' It clearly distinguishes the tool from siblings by stating it is for corrections/superseding rather than creating, which aligns with the sibling context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this instead of `commit_mem` when correcting or superseding existing knowledge, and notes that it never creates (fails with memory_not_found). This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rollbackA
Restore the project to a checkpoint. DESTRUCTIVE in execute mode.
Two stages, and you must run them in order:
1. `mode="preview"` is free and changes nothing. It reports what would
be created, updated, and removed, and returns a short-lived
`confirmation_token`.
2. `mode="execute"` requires that token and permanently discards every
memory created or changed since the checkpoint.
Execute fails with `state_changed_since_preview` if the project
changed after the preview, so review the preview and act on it
promptly rather than reusing an old one. `reason` is required in both
modes and is written to the audit trail. `limit` (1-500) caps the
preview list; ignored in execute mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | preview | |
| limit | No | ||
| reason | Yes | ||
| snapshot_id | Yes | ||
| idempotency_key | No | ||
| confirmation_token | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations supplied, the description carries the entire behavioral burden and does so: it flags the operation as DESTRUCTIVE in execute mode, spells out that execute permanently discards every memory created or changed since the checkpoint, and documents the short-lived confirmation_token lifecycle. It also names the exact failure condition and states that reason is written to an audit trail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive warning is front-loaded, then the two stages are enumerated in execution order with per-mode notes attached to the relevant stage. Every sentence carries operational information; nothing is restated from the schema or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive state-mutating tool with six parameters and no annotations, this is close to complete: safety profile, sequencing, token dependency, failure mode, and audit behavior are all covered, and an output schema exists so return values needn't be described. The gap is the undocumented idempotency_key and the lack of any note on what snapshot_id refers to or how it is obtained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it explains mode semantics, the required reason and its audit purpose, limit's 1-500 range and its irrelevance in execute, and confirmation_token's requirement in execute. Two parameters are left unaddressed: snapshot_id is only obliquely implied by "checkpoint," and idempotency_key is never mentioned at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Restore the project to a checkpoint" is a specific verb+resource statement, and the two-stage preview/execute framing makes the operation unambiguous. It doesn't explicitly contrast itself with siblings like snapshot, diff, or confirm, so an agent must infer the routing rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the mandatory ordering (preview before execute), what each mode is for, and the operational rule to act on a preview promptly instead of reusing an old one. The exclusions are explicit: limit is ignored in execute, and execute fails with state_changed_since_preview if the project moved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snapshotA
Create or list project checkpoints.
Take a checkpoint with `action="create"` before risky work so you can
inspect or restore it later; `action="list"` returns existing
checkpoints newest first and is free. Neither returns the checkpoint's
contents.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | ||
| limit | No | ||
| action | No | create | |
| metadata | No | ||
| idempotency_key | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, but the description discloses key behavior: list is free, ordering is newest-first, and neither action returns checkpoint contents. This adds meaningful context beyond the schema, though it does not cover side effects of creation or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences cover purpose, usage advice, and a behavioral caveat with no redundancy. Information is front-loaded and the description is appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and a moderate parameter count; the description covers the main workflows. It lacks detail on parameter meanings and restore mechanics, but overall is sufficient for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description explains the action parameter values (create/list) but does not clarify label, limit, metadata, or idempotency_key. Schema coverage is 0%, so these parameters remain ambiguous despite self-explanatory titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool creates or lists project checkpoints, with specific action values. Differentiates from sibling tools by focusing on checkpoint capture/list rather than memory/commit/rollback operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using create before risky work, and notes list is free and returns newest first. Does not name alternative tools but provides context for when each action is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
Report the authenticated Bilinc Cloud workspace, plan, and capabilities.
Read-only and never billed. Use this to discover which lifecycle operations and recall profiles the current API key may use before attempting them. Secrets are never returned.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool is 'Read-only and never billed' and that 'Secrets are never returned,' which are important safety traits. It does not elaborate on caveats like rate limits, but the disclosed traits are strong for a status tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences and every sentence earns its place: the first states the purpose, the second conveys safety and usage, and the third reassures about secrecy. It is front-loaded with the most important information and contains no redundant words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, an output schema is present, and the tool is simple (status report), the description fully covers what an agent needs to know. It states what the tool returns (workspace, plan, capabilities), when to use it, and that it is safe and read-only. The existence of the output schema eliminates the need to describe return formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema provides no parameter semantics. Per the rubric, a baseline of 4 is appropriate for 0-parameter tools. The description adds no parameter information because there is nothing to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Report the authenticated Bilinc Cloud workspace, plan, and capabilities,' which uses a specific verb and clearly identifies the resource and scope. This distinguishes it from sibling lifecycle tools like commit_mem and forget, which perform mutations. The purpose is unambiguous and immediately understood.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use this to discover which lifecycle operations and recall profiles the current API key may use before attempting them.' This makes the intended use case clear. It does not explicitly exclude other uses or name alternatives, but the context is sufficient for an agent to know when to call this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v2.6.1- Changed
rollback1 field changed- added
Input schema / properties / limitAdded value: +{ + "default": 100, + "title": "Limit", + "type": "integer" +}
2 tool updates
v2.6.0- Changed
forget1 field changed- added
Input schema / properties / purgeAdded value: +{ + "default": false, + "title": "Purge", + "type": "boolean" +}
- Changed
list_memories2 fields changed- added
Input schema / properties / orderAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Order" +} - added
Input schema / properties / sourcesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Sources" +}
3 tool updates
v2.3.11- Added
confirm - Added
history - Added
list_memories
1 tool update
v2.1.9- Changed
recall1 field changed- added
Input schema / properties / query_timestampAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Query Timestamp" +}
7 tool updates
v2.1.6- Changed
commit_mem6 fields changed- added
Input schema / properties / canonicalAdded value: +{ + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Canonical" +} - added
Input schema / properties / idempotency_keyAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Idempotency Key" +} - added
Input schema / properties / priorityAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Priority" +} - added
Input schema / properties / session_idAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Session Id" +} - added
Input schema / properties / sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Source" +} - added
Input schema / properties / ttlAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Ttl" +}
- Added
diff - Added
forget - Changed
recall2 fields changed- added
Input schema / properties / explainAdded value: +{ + "default": false, + "title": "Explain", + "type": "boolean" +} - added
Input schema / properties / memory_typesAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Memory Types" +}
- Added
revise - Added
rollback - Added
snapshot
3 tool updates
v1.0.0- First observed
commit_mem - First observed
recall - First observed
status
TDQS
Scored across 11 tools
Each tool has a clearly stated role, and the descriptions actively disambiguate the risky pairs (commit_mem vs revise, forget vs revise, recall vs list_memories). A few boundaries still blur — recall vs list_memories are both reads over stored memories, and diff vs history both inspect change — but the docs give explicit guidance on when to use which.
All names are snake_case and readable, but the convention is mixed: some are bare verbs (commit_mem, recall, revise, forget, confirm), some are bare nouns (status, snapshot, history, diff), and one uses a verb_noun form (list_memories). Not chaotic, but no single predictable pattern an agent can rely on.
Eleven tools is well within the sweet spot and every one earns its place: write, read, revise, forget, confirm, inspect, checkpoint, restore, and capability discovery. No filler or near-duplicate tools.
The memory lifecycle is essentially fully covered — create, retrieve, list, revise, confirm, forget/purge, audit history, plus checkpoint/diff/rollback and status discovery. Minor gaps remain: no bulk/batch operations, no tag or source management, and no export path for migrating memories out.
Maintenance
Related MCP Connectors
Hosted agent memory with provenance, contradiction surfacing, and snapshot rollback.
Persistent memory, hybrid search and a goal graph for AI agents, over stdio or remote HTTP.
Persistent, inspectable memory for AI agents with lineage, correction, and a hosted MCP endpoint.
Shared memory for coding agents. Stop re-explaining your codebase every session.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to persist project memory across sessions by compiling decisions, progress, and pitfalls into git-linked, evidence-backed entries. It lets clients add, query, inject, scan for stale, check assertions on, and compute ROI of those memories over stdio.17 npmMIT
- AlicenseNot gradedqualityCmaintenanceServes local-first project memory over stdio, exposing tools to inspect project state, search and retrieve context, report memory, and create Git-aware checkpoints for coding agents.1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceExposes repo-native, self-verifying memory to coding agents over stdio MCP, letting them recall ranked past decisions, record new claims with verifiable receipts, and check the health and stats of stored memory. Keeps agent context honest by surfacing memories whose evidence no longer holds.6 npmMIT
- AlicenseNot gradedqualityAmaintenanceProvides a local stdio MCP server that gives AI coding agents a typed, temporal, evidence-backed memory on embedded SQLite, letting them record decisions and constraints, ask why something happened, navigate memory by time, trace proof paths between refs, and export or supersede stored state without rewriting it. It also exposes read-only ChronoLoom view tools so a person and their agent can steer the same multidimensional memory view by semantic intent rather than raw coordinates.Apache 2.0