Mazarbul
MCPB · MAZARBUL_V0.2.3_LINUX_AMD64.MCPB · 4 COMPONENTS
Local-first memory for AI agents: entities, facts, relations and documents with semantic recall.
Last scanned (11 hours ago)
Scores higher than 73% of MCPB servers
Category Memory and Knowledge
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 Security0
- No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
- Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
- Install-script risk not yet assessed.Unverified
- Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency48
- 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
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 4 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability77
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 17073 tokens (~254/item across 67 items; 64 tools + 3 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 Management17
- Stability observed for 5 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 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "deleteEntity" implies "delete" 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 66 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
Unverified: 1 category
A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.
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.
- 4 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Oct 26 40
First indexed and scored.
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 5 Nov 2026 · Analysed mcpb/https://github.com/mo-cmyk/mazarbul/releases/download/v0.2.3/mazarbul_v0.2.3_linux_amd64.mcpb
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | mcpb |
| Reason | No attestation published |
Background: How many MCP packages publish verified provenance →
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 →
recall ~1,236
Search long-term memory for facts matching a query — about the user OR any person, place, organization, or event in the graph. CALL THIS before answering anything that depends on stored context (names, roles, projects, history, people, places, decisions); Mazarbul persists across sessions and clients, your conversation context does not. It is a SEED-FINDER: ground answers on each hit's `text` and `entities[]` — feed an entity name into get/neighbors/relations for the authoritative structured facts — not on the raw rank. `fusedScore` is a blended relevance score where rank ORDER is the signal, not absolute magnitude (normalized to [0,1] under the default weighted fusion, or a small reciprocal-rank value under rrf), so read each hit's `text` rather than blindly taking hit[0]. A miss is cheap; a confident hallucination is not. Recall ALWAYS returns its best-ranked candidates even when nothing strongly matches, so low, flat scores across unrelated hits usually mean the subject is NOT in memory — confirm a name with `entities`/`get` before treating a hit as fact, and use `relations`/`neighbors` (not recall) for the AUTHORITATIVE list of what mentions or links a known entity. Pass `compact: true`, `maxTokens`, or both to shrink the returned payload when you only need seeds to traverse. Returns ranked hits with citable ULIDs.
| Name | Type | Req | Description |
|---|---|---|---|
| anchor | string | – | Entity ULID. When set, restricts candidates to episodes that cite entities within anchorDepth hops of this anchor (default depth 1, max 6). Useful when you already hold an entity anchor and want topi… |
| anchorDepth | integer | – | Hop radius around the anchor entity (1..6). Defaults to 1 (immediate neighbourhood). Ignored when anchor is absent. |
| asOf | string | – | RFC 3339 UTC instant. Hides any event whose transaction time is later than this anchor, answering 'what did we know on X?'. Bi-temporal transaction-time anchor. Optional. |
| asOfEventUID | string | – | Event ULID. Resolves to that event's createTime and uses it as the asOf anchor. Mutually exclusive with 'asOf' and 'at'; supply at most one of the three. |
| at | string | – | RFC 3339 UTC instant to scope the query. Bi-temporal valid-time anchor. Optional. |
| compact | boolean | – | Return a reduced per-hit envelope — {name, kind, snippet, fusedScore, entities} plus source for document hits — dropping the full text, the per-lane score components, confidence, citations, and creat… |
| currentDate | string | – | Caller's "now" anchor (RFC 3339 UTC or YYYY-MM-DD) the rewriter uses to resolve relative phrases like "two months ago" into an absolute timestamp. Folded into 'at' only when 'at' is unset. Requires r… |
| embedDeadlineMs | integer | – | Per-call deadline in milliseconds for the query-embedding step. When the embedder does not respond within this window the call degrades to FTS-only and surfaces MAZ-RECALL-001. Absent means no per-ca… |
| explain | boolean | – | When true, attach per-lane candidate counts and total wall-clock time under the optional '_meta' key in the response. Off by default. |
| hasPrimarySource | boolean | – | Keep only hits grounded in a primary source: the hit (or one of its entity anchors) is the subject of a recorded source_ref or of an active has_primary_source edge (#207/#208). Filtered AFTER ranking… |
| kinds | array | – | Restrict hits to these record kinds (set semantics). Omit for the default mix of episodes + vault documents. Pass ["documentRevision"] for document-only recall, ["episode"] to exclude documents. |
| limit | integer | – | Maximum number of hits to return. Defaults to 10. |
| maxTokens | integer | – | Soft cap on the total estimated tokens across all returned hits (estimated at ~4 bytes/token). Hits are dropped lowest-fusedScore-first until the payload fits; the single top-ranked hit is always ret… |
| minConfidence | number | – | Filter out hits whose writer confidence is below this value. Defaults to 0. |
| near | object | – | Restrict results to episodes citing entities within a geographic radius of a named place. Both fields required when present. |
| noGraph | boolean | – | Skip the graph traversal lane when true (vector + FTS only). Off by default. |
| query | string | yes | Natural-language question or keyword phrase to search the event log for. |
| rewriteQuery | boolean | – | Expand the query via the query-rewrite-v1 LLM prompt before retrieval. Off by default. |
| scopes | array | – | Scopes to read from: project, personal, team. Defaults to project+personal. Unknown values are rejected. |
| source | array | – | Constrain hits to these origin sources (set semantics, OR across values). Matches a hit's eventSource — the originating event's source tag, e.g. "remember", "extractor/v1", or a connector tag like "c… |
| Name | Type | Req | Description |
|---|---|---|---|
| degraded | boolean | yes | True when recall ran BELOW full hybrid because the embedder was unavailable: FTS(+graph)-only, no dense-vector lane. Semantic matching did not run, so treat low, flat scores cautiously and lean on th… |
| hits | array | yes | Ranked hits. In compact mode (compact=true) each hit carries only {name, kind, snippet, fusedScore, entities} plus source for document hits; the verbose-only fields (hitType, text, confidence, compon… |
| lanes | array | yes | The retrieval lanes that actually contributed to this result: ["vector","fts","graph","nameEmb"] for full hybrid, or a subset like ["fts"] when degraded. Always present. |
No examples provided.
recordSourceRef ~363
Record where a memory came from: append an external-source provenance reference (SourceRef, W3C PROV wasDerivedFrom) for a subject record. Give the subject's uid, a sourceType (open taxonomy), and a dedupKey for idempotency; optionally a connector, stream, externalId, externalUrl, and contentHash. Returns the new SourceRef's resource name. Provenance is self-asserted and UNVERIFIED. Does not fetch the source.
| Name | Type | Req | Description |
|---|---|---|---|
| connector | string | – | Connector that produced the reference, e.g. gmail, slack. Optional. |
| contentHash | string | – | SHA-256 hex of the fetched content. Optional; supplied by the caller (fetch is out of scope). |
| dedupKey | string | yes | Idempotency key. Recording the same external item twice (same dedupKey) collapses to one SourceRef. Required. |
| externalId | string | – | Source-system opaque identifier for the item, e.g. a message id. Optional. |
| externalUrl | string | – | Dereferenceable location of the source item. Optional. |
| fetchTime | string | – | When the source content was fetched (RFC 3339 UTC). Defaults to now. |
| scope | string | – | Scope to record into. Defaults to personal. |
| sourceType | string | yes | Kind of external source, drawn from an open taxonomy: email, slack_message, notion_page, web_page, etc. Required. |
| stream | string | – | Sub-channel within the connector, e.g. a mailbox label or channel id. Optional. |
| subjectUid | string | yes | ULID of the record this source was derived from (PROV wasDerivedFrom): an entity, episode, or fact uid. Required. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | AIP resource name of the recorded SourceRef; pass to getSourceRef. |
| status | string | yes | Always "recorded" on success. |
No examples provided.
reference ~296
Mint-or-return an external_ref entity for a URI: a first-class local pointer to information held in another system (a GitHub issue, a Drive doc, a Granola transcript, a repo file). Returns the external_ref's resource name so you can relate(localEntity, has_primary_source, name) to record that a local record is grounded in it. Idempotent: the same URI in the same scope returns the same entity. Defaults to personal scope (local, not rendered to the shared project git tree); pass scope=project to share. Mazarbul does NOT fetch the URI — to make the referenced content searchable, fetch it with your own tools, remember() it, then reference() the URI and relate the two. Returns E_VALIDATION on a URI with no scheme or an unknown scope.
| Name | Type | Req | Description |
|---|---|---|---|
| label | string | – | Optional human-readable display name. Defaults to the URI. Keep third-party identity metadata out of project (git-rendered) scope. |
| scope | string | – | Scope to write into. Defaults to personal (local, not rendered to the shared project git tree). Pass "project" to share. Dedup is WITHIN scope: the same URI in two scopes yields two entities. |
| uri | string | yes | Absolute URI of the external thing, e.g. https://github.com/org/repo/issues/42, mailto:a@b.com, or a connector URL. Must carry a scheme. |
| Name | Type | Req | Description |
|---|---|---|---|
| created | boolean | yes | true if a new external_ref was minted, false if an existing one was returned (mint-or-return). |
| name | string | yes | AIP resource name of the external_ref; pass to relate(localEntity, has_primary_source, name) or get(name). |
| scope | string | yes | The resolved scope the external_ref lives in. |
| uid | string | yes | Bare ULID of the external_ref, derived deterministically from (scope, uri). |
| uri | string | yes | The canonical URI, echoed back. |
No examples provided.
relate ~415
Assert a structured (subject, predicate, object) relation directly. You are the extractor: when you see a relationship, record it here rather than relying on server-side extraction (off unless a chat model is configured). Pass source for provenance. Returns the new relation's resource name.
| Name | Type | Req | Description |
|---|---|---|---|
| attributes | object | – | Qualifying key/value pairs, e.g. {"role":"CEO"}. Optional. |
| confidence | number | – | Writer confidence in the edge. Defaults to 1.0. |
| object | string | yes | Object entity: entities/{uid}, a bare ULID, the literal "self", or a human display name (resolved case-insensitively, like maz get). |
| predicate | string | yes | Relationship type, e.g. works_at, reports_to, knows. See introspect for registered predicates. |
| provenance | string | – | Free-text rationale for the edge. Optional. |
| scope | string | – | Scope to write into — pick by who should see it. Defaults to personal (private to the user, syncs to their devices). Use "project" for edges tied to the current repo/codebase (shared with anyone who… |
| source | string | – | Provenance label for the appended event, e.g. "cli:relate". Optional; defaults to "mcp:relate". |
| subject | string | yes | Subject entity: entities/{uid}, a bare ULID, the literal "self", or a human display name (resolved case-insensitively, like maz get). |
| validFrom | string | – | Inclusive lower bound of the relation's valid-time (RFC 3339 UTC). Optional. |
| validUntil | string | – | Exclusive upper bound of the relation's valid-time (RFC 3339 UTC). Optional. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | AIP resource name of the asserted Relation; pass to get(relations/{uid}). |
| status | string | yes | Always "asserted" on success. |
No examples provided.
relateBatch ~122
Assert multiple (subject, predicate, object) relations in ONE atomic event-log append. All edges are validated before any write: a single invalid endpoint aborts the entire batch. Use this to seed a graph in one call instead of N sequential relate() calls. Returns the new relation resource names in input order.
| Name | Type | Req | Description |
|---|---|---|---|
| relations | array | yes | Array of relation assertions to append atomically. |
| source | string | – | Provenance label for all appended events, e.g. "mcp:relateBatch". Optional; defaults to "mcp:relateBatch". |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | Number of relations appended. |
| names | array | yes | AIP resource names of the asserted Relations, in input order. |
| status | string | yes | Always "asserted" on success. |
No examples provided.
relations ~353
List an entity's typed relations (incoming + outgoing), each row tagged direction=outgoing|incoming relative to the queried entity so directional predicates (reports_to, manages) read unambiguously. Endpoint names are hydrated. LLM-free. The DEFAULT view is point-in-time NOW: only edges valid now and not superseded; pass includeInactive=true for expired/superseded history, or time-travel with at/asOf. Filter by predicate. Role/title is often carried as an attributes.role string on a works_at/founded edge rather than a separate has_role edge; each row's sourceEventUid links back to the originating episode. Pair with neighbors to walk further.
| Name | Type | Req | Description |
|---|---|---|---|
| asOf | string | – | Transaction-time anchor (RFC 3339 UTC). Hides relations recorded after this instant. |
| at | string | – | Valid-time anchor (RFC 3339 UTC). Returns relations live at this instant. Defaults to now. |
| entity | string | yes | Entity whose relations to list: an entities/{uid} ref (as returned in a recall hit's entities[]), a bare uid, or a display name (resolved case-insensitively; an unknown or ambiguous name returns an e… |
| includeInactive | boolean | – | Return superseded / expired relations too (full history). Off by default. |
| limit | integer | – | Maximum relations to return. Defaults to 50. |
| predicates | array | – | Restrict to these predicates, e.g. ["works_at","reports_to"]. Omit to return all. |
| scopes | array | – | Scopes to read from: project, personal, team. Defaults to project+personal. Unknown values are rejected. |
| Name | Type | Req | Description |
|---|---|---|---|
| relations | array | yes | – |
No examples provided.
remember ~452
Persist a fact to the user's long-term memory. CALL THIS whenever the user tells you something about themselves, their work, their preferences, decisions, plans, or corrects a prior fact, even if you think you'll remember it within the current conversation. Mazarbul is the durable store; your own context is not. Pass the original sentence verbatim. remember stores and indexes the text for recall; entities and relations are extracted server-side only when a chat model is configured (usually not), so write the structure you see yourself with createEntity, relate, and fact.
| Name | Type | Req | Description |
|---|---|---|---|
| actor | string | – | Who said it. "user" (the human), "assistant" (the AI agent), or "system". Defaults to "user" when omitted. Assistant-actor episodes are routed through a different extractor branch so AI-generated fac… |
| confidence | number | – | Writer's confidence in the Episode. Range 0..1 inclusive. Defaults to 1.0 when omitted. |
| coordinates | object | – | Optional geographic coordinates (WGS84) associated with this Episode. When present, the resolver forwards them onto any matched or created place Entity. |
| coordinatesProvenance | string | – | Origin of the coordinates, e.g. user_provided or geocoded:nominatim. Required when coordinates is set; rejected when coordinates is absent. |
| scope | string | – | Sync / encryption boundary for the Episode. "personal" (default) is local-only; "project" is in-repo; "team" is shared under the team key; "draft" is private staging — invisible to recall until promo… |
| source | string | – | Optional. Where the Episode originated (free-form, e.g. "cli:remember", "providers/anthropic"). Defaults to "mcp:remember" when omitted — just call remember({text}) for an ordinary fact. |
| text | string | yes | Natural-language record to remember. Stored verbatim as the Episode text. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | AIP resource name of the created Episode: "episodes/{uid}". |
No examples provided.
retractFact ~291
Close the current value of a fact slot — the scalar counterpart to unrelate. Records that a fact STOPPED being true (a status that no longer holds, a preference that changed with no replacement) by retracting it: it drops out of current reads but its history is PRESERVED (unlike forget, which deletes the row). The slot then reads as EMPTY — retraction does NOT fall back to an earlier value. Identify the value by its facts/{uid} or by the (subject, stateKey) pair (which closes the slot's single open value). To set a different value instead, just write it with fact() — a later write supersedes the prior.
| Name | Type | Req | Description |
|---|---|---|---|
| fact | string | – | The fact to retract: facts/{uid} or a bare ULID (as returned by fact() or get). Use THIS or a (subject, stateKey) pair, not both. |
| scopes | array | – | Scopes to search when identifying the slot by (subject, stateKey): project, personal, team. Defaults to project+personal. |
| stateKey | string | – | Slot address to close, e.g. state.task.status, preference.coffee.milk. Provide with subject. |
| subject | string | – | Subject entity whose slot to close: entities/{uid}, a bare ULID, "self", or a display name. Provide with stateKey as an alternative to fact. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Resource name of the retracted fact. |
| retractedAt | string | yes | The instant the fact was retracted (RFC 3339 UTC). |
| status | string | yes | Always "retracted" on success: the value is closed but its history is preserved. |
No examples provided.
shareToTeam ~287
Re-publish a personal-scope record (entity, fact, or relation) to the team scope so all admitted team members can read it. The personal original is unchanged — both copies coexist as separate scope lenses. Requires admitted team membership (else E_PERMISSION). Entities are deduplicated against the team scope by exact name before minting; an existing match returns status=reused. Facts and relations remap their endpoint UIDs to the team-scope counterparts: for a bare fact/relation share, all referenced entities must already be in team scope (else E_VALIDATION); for a subtree share (withFacts/withRelations), relations whose object has no team counterpart are skipped (status=skipped, reason set) rather than appended with dangling references. Use withFacts/withRelations to share an entity subtree in one call.
| Name | Type | Req | Description |
|---|---|---|---|
| ref | string | yes | The record to share. Accepts an AIP resource name (entities/{uid}, facts/{uid}, relations/{uid}) or a bare ULID (treated as entity). Entity names are resolved case-insensitively when not a uid. |
| withFacts | boolean | – | Also share the entity's currently-open facts. Only meaningful when ref resolves to an entity. Defaults to false. |
| withRelations | boolean | – | Also share the entity's active relations. Only meaningful when ref resolves to an entity. Defaults to false. |
| Name | Type | Req | Description |
|---|---|---|---|
| shared | array | yes | Per-item share outcomes. |
| status | string | yes | Always "shared" on success. |
No examples provided.
team_create ~86
Create the team scope (genesis): mints a fresh per-team data-encryption key, admits this device's principal as the genesis owner, and switches the team scope to encrypted envelope mode. Fails if a team already exists.
| Name | Type | Req | Description |
|---|---|---|---|
| remote | string | – | Optional git remote URL to pin for the team scope (e.g. git@github.com:org/team-brain.git). |
| Name | Type | Req | Description |
|---|---|---|---|
| dekEpoch | integer | yes | Epoch of the freshly-minted data-encryption key (always 0 at genesis). |
| genesisPrincipalUid | string | yes | Principal UID admitted as the team's genesis owner (this device's bound principal). |
| status | string | yes | Always "created" on success. |
No examples provided.
team_device_list ~51
List all devices enrolled under the local principal's identity, including revocation status. Each device entry shows its signing-key fingerprint (sigKeyId), optional label, create time, and whether it has been revoked.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| devices | array | yes | – |
No examples provided.
team_device_revoke ~117
Revoke an enrolled device by its ULID. Appends a deviceRevoked event to the team scope. After revocation, any event authored by this device with a UID greater than the revocation event's UID is dropped on all peers (convergent fold). The revoker must be the device's own principal, or a team admin/owner.
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | ULID of the device to revoke. Required. |
| reason | string | – | Optional free-form reason for the revocation (audit trail). |
| Name | Type | Req | Description |
|---|---|---|---|
| deviceId | string | yes | ULID of the revoked device. |
| eventUid | string | yes | UID of the appended deviceRevoked event. |
| principalUid | string | yes | ULID of the device's owning principal. |
| status | string | yes | Always "revoked" on success. |
No examples provided.
team_grant ~168
Admit a principal to the team by wrapping the current team data-encryption key to their pasted x25519 public key. The grantee unwraps it on their next sync pull. Requires the caller to hold at least admin role. The optional role parameter sets the grantee's access level (default: member).
| Name | Type | Req | Description |
|---|---|---|---|
| joinKey | string | yes | The grantee's join-key blob (the opaque token from team_key / 'maz team key'). It carries their principal UID, wrap public key, and signing identity — this is the trust input; obtain it out of band. |
| label | string | – | Optional human label for local logging; never serialized into the synced recipients.jsonl. |
| role | string | – | Access role to assign the grantee. Defaults to "member" when absent. |
| Name | Type | Req | Description |
|---|---|---|---|
| dekEpoch | integer | yes | Highest (current) DEK epoch wrapped to the grantee. |
| grantedEpochs | array | yes | Every DEK epoch wrapped to the grantee (ascending). A full-history grant covers 0..dekEpoch; it is a subset only when this device lacks a prior epoch's DEK. |
| granteePrincipalUid | string | yes | Principal UID that was admitted. |
| role | string | yes | Effective access role assigned to the grantee. |
| status | string | yes | Always "granted" on success. |
No examples provided.
team_join ~103
Point this device at an existing team's encrypted remote so it can sync the shared brain, WITHOUT creating a new team. Use this (not team_create) to join a team someone else created. After joining, run team_key and send the blob to an admitted member to be granted, then sync pull to bootstrap the team key.
| Name | Type | Req | Description |
|---|---|---|---|
| remote | string | yes | The team's shared git remote URL to sync through (e.g. git@github.com:org/team-brain.git). |
| Name | Type | Req | Description |
|---|---|---|---|
| nextSteps | array | – | What to do next to finish joining. |
| remoteUrl | string | yes | The team remote this device is now configured to sync with. |
| status | string | yes | Always "joined" on success. |
No examples provided.
team_key ~67
Show this device's team join request: its bound principal UID and base64 x25519 wrap public key. Send both to an admitted team member so they can grant you (maz team grant --principal <uid> --wrap-pubkey <key>). Read-only; neither value is secret.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| joinKey | string | yes | Opaque join-key blob to hand an admitted member (maz team grant --join-key <blob>). Carries the principal UID, wrap public key, and signing identity; nothing in it is secret. |
| principalUid | string | yes | This device's bound principal UID. |
| wrapPublicKey | string | yes | This device's base64 x25519 wrap public key. |
No examples provided.
team_members ~50
List the admitted team members (the derived ACL): opaque principal UID, DEK epoch, wrap public key, and whether each is the genesis owner. Read-only and contains no display names or other PII.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| members | array | yes | – |
No examples provided.
team_revoke ~105
Revoke a team member and forward re-key the team: appends the revocation, mints a fresh data-encryption key at the next epoch, and re-wraps it to every remaining member. Returns a checklist — you must separately remove the principal's git-host access, which Mazarbul cannot do.
| Name | Type | Req | Description |
|---|---|---|---|
| principalUid | string | yes | ULID of the principal to revoke. |
| reason | string | – | Optional human-readable revocation reason recorded in the audit trail. |
| Name | Type | Req | Description |
|---|---|---|---|
| checklist | array | yes | Post-revoke operator checklist: what Mazarbul did and what you must still do. |
| newDekEpoch | integer | yes | Epoch of the fresh DEK the remaining members were re-keyed to; the revoked principal has no grant here. |
| revokedPrincipalUid | string | yes | Principal UID that was revoked. |
| rewrappedTo | array | – | Principal UIDs the new DEK was re-wrapped to (the remaining members). |
No examples provided.
team_role_set ~113
Change an admitted team member's access role (owner | admin | member | reader) without re-wrapping key material. Requires the caller to hold at least admin role; assigning admin or owner requires owner. The change is recorded as a teamRoleChanged event and converges identically on every peer.
| Name | Type | Req | Description |
|---|---|---|---|
| principalUid | string | yes | ULID of the admitted team member whose role is being changed. |
| role | string | yes | New access role. Assigning admin or owner requires the caller to hold owner role. |
| Name | Type | Req | Description |
|---|---|---|---|
| eventUid | string | yes | UID of the appended teamRoleChanged event. |
| role | string | yes | New effective role. |
| status | string | yes | Always "role_set" on success. |
| subjectPrincipalUid | string | yes | Principal whose role was changed. |
No examples provided.
unrelate ~353
End a relation as of a date — the temporal counterpart to relate. Records that a relationship STOPPED being true (someone left a job, a project ended) by closing the edge with a valid_until: it drops out of current reads but its history is PRESERVED (unlike forget, which deletes the edge). Identify the edge by its relations/{uid} or by the (subject, predicate, object) triple (which closes the single open match). Pass endedAt for when it ended (defaults to now); pass supersededBy when a newer relation replaces it.
| Name | Type | Req | Description |
|---|---|---|---|
| endedAt | string | – | When the relationship ended (RFC 3339 UTC); becomes the edge's valid_until. Defaults to now. |
| object | string | – | Object of the relation to close: entities/{uid}, a bare ULID, "self", or a display name. |
| predicate | string | – | Predicate of the relation to close, e.g. works_at. |
| relation | string | – | The relation to close: relations/{uid} or a bare ULID (as returned by relations() or recall). Use THIS or a (subject, predicate, object) triple, not both. |
| scopes | array | – | Scopes to search when identifying the edge by triple: project, personal, team. Defaults to project+personal. |
| subject | string | – | Subject of the relation to close: entities/{uid}, a bare ULID, "self", or a display name. Provide with predicate+object as an alternative to relation. |
| supersededBy | string | – | Optional relations/{uid} of a newer relation that replaces this one (a correction). Omit for a pure close — the relationship simply ended. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Resource name of the closed relation. |
| status | string | yes | Always "retracted" on success: the edge is closed (valid_until set) but its history is preserved. |
| validUntil | string | yes | The valid_until the relation was closed at (RFC 3339 UTC). |
No examples provided.
updateEntity ~126
Relabel an entity's kind and/or displayName by appending an entityUpdated event. Supply at least one of kind or displayName; omitting both is E_VALIDATION. Returns E_NOT_FOUND when the uid does not resolve. Only the supplied fields change; confidence, properties, identifiers, and coordinates are untouched.
| Name | Type | Req | Description |
|---|---|---|---|
| displayName | string | – | New human-readable label. Omit to leave unchanged. |
| entityUid | string | yes | ULID of the entity to update. Required. |
| kind | string | – | New entity kind in snake_case. Omit to leave unchanged. |
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | AIP resource name of the updated entity. |
| status | string | yes | Always "updated" on success. |
No examples provided.
waitForIdle ~96
Block until the kernel finishes all background extraction, resolution, and embedding work (or the timeout expires). Use between a burst of remember() calls and a benchmark recall() so the recall measures retrieval latency only, not the tail of ingestion. Cheap when the kernel is already idle.
| Name | Type | Req | Description |
|---|---|---|---|
| timeoutSeconds | integer | – | Maximum seconds to wait. Defaults to 300. The tool returns timedOut:true rather than erroring when the budget expires. |
| Name | Type | Req | Description |
|---|---|---|---|
| elapsedMs | integer | yes | Wall-clock spent waiting, in milliseconds. |
| enrichmentInflight | integer | yes | Enrichment depth observed at return time (0 unless timedOut). |
| isIdle | boolean | yes | True when both enrichment and vec drained within the budget; false if timedOut. |
| timedOut | boolean | yes | True when the timeoutSeconds budget expired before the kernel went idle. |
| vecInflight | integer | yes | Vec depth observed at return time (0 unless timedOut). |
No examples provided.
writeDocument ~500
Create or replace a markdown document at `path` with `body` (stored verbatim, event-sourced — full history is kept). [[Wikilinks]] in the body resolve to canonical entities and other documents as graph edges; dangling links reconcile automatically when their target appears. Optional `title`/`pinned`/`tags`/`frontmatter` synthesize a YAML frontmatter block when the body has none. Frontmatter `about: <name|entities/{uid}>` records the document's primary subject as a high-confidence `describes` edge (distinct from body [[wikilinks]], which are `mentions`); resolve it by uid where you can, since a renamed subject keeps the link. Frontmatter `canonical: true` lets this document win name resolution over a same-named non-document entity, so a later-created entity cannot silently steal the name. The document materializes as an editable file in the vault. Idempotent: rewriting identical content is a no-op. `scope` picks who sees the document (personal by default; team requires membership, else E_PERMISSION) and is fixed at creation — the same path in a different scope is a separate document. Result counts (`edges`, `unresolved`, `reconciled`) are whole-document snapshots after the write, not deltas. A non-fatal `warnings` field appears when the title shadows a same-named non-document entity.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The full markdown body, stored verbatim. May include its own YAML frontmatter block. |
| frontmatter | object | – | Additional frontmatter keys (JSON object), synthesized into a YAML block. Only when body has no frontmatter of its own. |
| path | string | yes | Vault-relative path, e.g. notes/project-alpha.md (.md appended when no extension). |
| pinned | boolean | – | Pin the document (synthesized into frontmatter). Pinned documents surface first in context packs. |
| scope | string | – | Storage scope, fixed at creation. personal (default) = only you; project = a shared project; team = every team member (requires membership, else E_PERMISSION); draft = private staging. The same path… |
| tags | array | – | Tags, synthesized into frontmatter. |
| title | string | – | Optional title, synthesized into frontmatter. Only when body has no frontmatter of its own. |
| Name | Type | Req | Description |
|---|---|---|---|
| changed | boolean | yes | False when the content matched the latest revision (no-op). |
| documentUid | string | yes | – |
| edges | integer | – | Total resolved wikilink and frontmatter edges the whole document holds after this write (snapshot, not a delta — counts all [[links]] in the current body that resolved, regardless of how many were al… |
| file | string | – | Absolute path of the materialized vault file. |
| name | string | yes | entities/{uid} resource name of the document-as-entity. |
| path | string | yes | – |
| pendingEdit | boolean | – | True when the vault file holds an un-ingested manual edit and was left untouched. |
| reconciled | integer | – | Count of wikilinks in OTHER vault documents that this write newly made resolvable (cross-document reconcile pass; separate from the document's own edge snapshot above). |
| revisionUid | string | – | – |
| unresolved | integer | – | Count of [[wikilinks]] left dangling in the whole document after this write (snapshot, not a delta). |
| unresolvedTargets | array | – | The dangling wikilink targets by name (text inside [[…]] that matched nothing) — fix a typo or create the target. Omitted when none dangle. |
| warnings | array | – | Non-fatal advisory messages — e.g. a title-collision warning when the document's display name shadows a non-document entity. Does not affect the written content; the document body is stored byte-for-… |
No examples provided.
How do I install the Mazarbul MCP server?
Mazarbul ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 45c720f7a2179be5914ab90ad4cc64416b8fbe5da47e6a5f7080fca3ed68be67; the commands to do that are on this page. If it does not match, do not open it.
mcpb · mazarbul_v0.2.3_linux_amd64.mcpb
Download bundleCheck the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.
SHA-256
45c720f7a2179be5914ab90ad4cc64416b8fbe5da47e6a5f7080fca3ed68be67
macOS / Linux
echo "45c720f7a2179be5914ab90ad4cc64416b8fbe5da47e6a5f7080fca3ed68be67 mazarbul_v0.2.3_linux_amd64.mcpb" | shasum -a 256 -c
Windows (PowerShell)
(Get-FileHash -Algorithm SHA256 .\mazarbul_v0.2.3_linux_amd64.mcpb).Hash -eq "45c720f7a2179be5914ab90ad4cc64416b8fbe5da47e6a5f7080fca3ed68be67"
Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.
What is the Mazarbul MCP server?
Mazarbul is an MCP server listed in the public MCP registry as io.github.mo-cmyk/mazarbul. Local-first memory for AI agents: entities, facts, relations and documents with semantic recall. This page covers its MCPB bundle (https://github.com/mo-cmyk/mazarbul/releases/download/v0.2.3/mazarbul_v0.2.3_linux_amd64.mcpb).
Is the Mazarbul MCP server safe to use?
Mazarbul scores 42 out of 100 on VerifyMCP. 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 Mazarbul MCP server expose?
Mazarbul exposes 64 tools: addIdentifier, agentFeedback, cancelJob, captureExternal, connectSource, and 59 more. Their descriptions and schemas cost roughly 16,172 tokens of context every time the server is loaded.
What licence is the Mazarbul MCP server under?
Mazarbul declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.