Cartographer
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CARTOGRAPHER_KB | No | KB path(s) (single, or multiple comma-separated) | |
| CARTOGRAPHER_AUTH | No | true / false / unset (auto on HTTP) | auto |
| CARTOGRAPHER_DATA | No | Directory whose subfolders are auto-discovered KBs | |
| CARTOGRAPHER_HTTP | No | HTTP address (e.g. :39273). Absent = stdio only | |
| CARTOGRAPHER_OLLAMA | No | Ollama server URL for semantic search | |
| CARTOGRAPHER_TOKENS | No | Comma-separated bearer tokens | |
| CARTOGRAPHER_GIT_SYNC | No | fetch/pull-rebase + push on origin around each write | true |
| CARTOGRAPHER_AUDIT_KEY | No | Ed25519 key for audit signing | |
| CARTOGRAPHER_AUDIT_LOG | No | Audit log file path | |
| CARTOGRAPHER_OLLAMA_MODEL | No | Ollama embedding model | nomic-embed-text |
| CARTOGRAPHER_GIT_AUTOCOMMIT | No | One git commit per write operation | true |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| artifact_deleteA | Deletes a KB-root artifact file (skills//, agents/.md, hooks/, mcp/.json, instructions.md, templates/.md, paths.yaml, glossary.yaml), and its now-empty containing artifact directory for skills/hooks. if_match (sha256 of the current content, from artifact_read/artifact_list) is required. |
| artifact_readB | Reads a KB-root artifact (skills/, agents/, hooks/, mcp/, instructions.md, templates/.md, paths.yaml, glossary.yaml). Returns content and sha256, the if_match for artifact_write/artifact_delete (present only if the KB sets allow_artifact_write). |
| artifact_writeA | Creates or updates a KB-root artifact file (skills//, agents/.md, hooks/, mcp/.json, instructions.md, templates/.md, paths.yaml, glossary.yaml). On an existing file, if_match is required (sha256 of the current content, from artifact_read/artifact_list) — fails with stale_write if it's missing or doesn't match. On a new file, omit if_match — fails with already_exists if the file is actually already there. Validates structured artifacts, including template frontmatter and variables the paths.yaml schema (paths:/repos: key -> {description, default: ~/…, remote}) and the glossary.yaml schema (terms: list of {canonical, aliases: [..], forbidden: [..]}), before writing. |
| asset_deleteA | Permanently deletes a non-Markdown asset from an expanded concept. if_match is mandatory and must be the current raw-byte sha256 returned by asset_read or asset_list. |
| asset_listA | Lists the non-Markdown assets of an expanded concept: path, size, sha256, executable. A file over 10 MiB shows oversized: true (deletable only). |
| asset_readB | Reads a non-Markdown asset of an expanded concept: content, encoding, sha256 (the if_match to change or delete it), size, executable mode. |
| asset_writeA | Creates or updates a non-Markdown asset of an expanded concept (max 10 MiB). New: omit if_match; overwrite: if_match = current sha256. Content is text or base64. executable: omit to keep the mode (new files are non-executable). |
| atlas_overviewA | Root index.md plus the Maps and Journals with concept counts. structure: true adds the most central concepts and link-graph communities: where to start reading. |
| changes_sinceA | Concept changes from git history since a timestamp or duration: each concept's newest change, authors, agent clients, operations and reasons. links: true also reports links added/removed and pages that became or stopped being orphans. |
| concept_batchA | All-or-nothing write/patch of distinct concepts: one commit and log entry; a failure leaves the KB untouched. At most 50 operations and 512 KiB of decoded content per call (a patch counts its edits). Each operation is 'write' (frontmatter, body, if_match optional = create-only) or 'patch' (if_match required; the concept_patch fields). A creating 'write' may set index_entry to add a curated index entry. Not covered: delete, move, expand, assets, other index edits. Returns id, content_hash and findings per operation. |
| concept_deleteA | Permanently removes a concept (git commit). Refuses with inbound_links (listing the linkers) unless force=true; links are never rewritten. To keep the page use supersede; to rename, concept_move. An expanded concept that owns assets also needs force=true. |
| concept_expandB | Turns .md into a directory / whose index.md keeps the same ID, so the concept can hold satellites /; links keep working. id needs exactly two segments (map/concept). No inverse. |
| concept_historyA | Commits that changed a concept, newest first, following renames: {sha, at, author, subject, reason?, path}; truncated if more exist. A sha passed as rev to concept_read shows the concept then. No git history: no revisions. |
| concept_listA | Exhaustive inventory (id, title, type, status; fields adds keys) under a scope prefix, sorted by id; empty = whole KB. where and timestamp filters apply before limit. For curated navigation use index_get. |
| concept_moveA | Moves concepts to new IDs in one commit: one source_id/target_id pair or a moves array (exclusive). All entries are validated first (source exists, target free, no traversal or duplicate source); an invalid one aborts the batch. Unless rewrite_links=false, inbound links KB-wide are rewritten. Works across maps and services/. An expanded concept moves with assets and satellites. A mid-batch filesystem failure names both IDs, no rollback. Returns findings on moved concepts and their linkers. |
| concept_newB | Creates a concept from a KB template (template_list) and records it as its shape. Refuses an existing id. index_entry adds it to the map's curated index. Returns findings. |
| concept_patchA | Edit-style patch of a concept body: old_string/new_string/replace_all, or an edits array applied atomically in order. if_match required (stale_write). frontmatter is shallow-merged and may be the only change; frontmatter_append/frontmatter_remove add or drop list items (idempotent). Returns content_hash, findings. Many concepts: concept_batch, up to 50 operations in one commit. |
| concept_readA | Reads a concept: content_hash, frontmatter (parsed) and _raw, body. with_content: true returns content (exact bytes) instead of body. section returns one section; outline: true only the headings; match greps body lines (with context). |
| concept_writeA | Creates or updates a concept from frontmatter (YAML map, type required) and a markdown body. if_match (content hash) gives optimistic concurrency: stale_write if changed. Returns content_hash and structural findings too (links, orphan, index): fix them. |
| conflicts_listA | Lists open git rebase conflicts: concept, local/remote SHAs, branch, files. Resolve with git_conflict_resolve (kb-conflict-resolve skill). |
| gate_checkA | Local gate: validate + lint + commit_gate. Use at session end over the IDs you wrote, or before fast-forwarding to main. changed_ids alone lints just those (no whole-KB structure checks); empty changed_ids: whole KB, no commit gate; scope: a path prefix. severity_min sets the lint floor (default warning); pass ignores it. |
| git_conflict_resolveA | Resolves a git conflict. strategy: ours (local), theirs (remote), edit (reconciled body), union (log.md only). Once every open conflict (conflicts_list) is resolved, Cartographer merges, commits, pushes and clears the degraded markers. |
| graph_contextC | Concepts most related to a question or set of concepts, following links both ways, with hop count and the concept each was reached through. |
| graph_neighborsA | Graph neighbors up to depth hops (default 1): out = linked from the concept, in = linking to it, both = either. |
| index_getA | Reads a folder's index.md (root if empty). with_hash: {path, content, content_hash} (if_match for index_patch). Over 60 KB: outline, unless full or with_hash; outline: true forces it. |
| index_patchA | Like concept_patch, for the root or a Map/Journal curated index.md (same edit forms; if_match required, from index_get with_hash). An expanded concept's own index.md is refused (expanded_index): use concept_patch. Returns path, content_hash, replacements, findings. |
| kb_repairA | Applies the mechanical fix a lint finding carries (fix) for one check, KB-wide in one commit. dry_run defaults to true (plan only). Concepts changed since listing are skipped. Judgement fixes: kb-doctor skill. |
| kb_reviewC | Ranked kb-doctor work list: items {kind, concepts, evidence, suggested_action}. Dismiss: lint_ignore: [kind] on a named concept. |
| kb_statusC | KB health in one call: concept counts (by type, status), stale concepts, open contradictions and gaps, git replication state, capabilities (each per-KB gate, its state and controlling key), source-ledger counts, frequent search misses, versions, and conformance: {findings by severity, fixable, last_doctor, doctor_suggested}, the drift from the current standard. When doctor_suggested is true, follow the kb-doctor skill. usage: which skills and agents the clients actually load (never used, stale, active), from their reports. Read-only. |
| link_suggestB | Existing concepts this one probably should link to: at least two shared neighbours, not yet linked, hub evidence discounted; for an unlinked concept, title matches. |
| lintC | Deterministic checks. check, severity_min, limit (max 200), offset filter and page. Counts ignore them. |
| log_appendA | Appends an entry to the root log.md (newest first). With path, the entry is prefixed '[] ' in the root log (no per-directory log); read back with log_tail(path). |
| log_tailA | Last n entries (default 20) for path; empty = root log. A path filters root-log entries prefixed '[] ' (plus any pre-existing /log.md). |
| map_createC | Creates a Map or Journal (kind: journal) with _map.md, index.md, log.md. ontology_mode: strict (enforces concept_types) or flexible. templates (slugs) make every page follow one. Contract options are lint only, not a write gate. |
| map_deleteA | Deletes a Map or Journal only if empty (just the scaffold _map.md, index.md, log.md). Otherwise nothing changes and the error lists the concepts: concept_move them first. |
| map_listB | Lists Maps and Journals with kind, ontology_mode, concept_types and expanded-concept count. |
| map_updateC | Changes a map's title or lint contract: given keys are replaced whole, an empty list, "", false or {} removes one. stale_after 0 = off, -1 = default. |
| searchB | Keyword search over concepts (SQLite FTS5, substring matching); returns IDs ranked by relevance. Glossary aliases are searched too (expanded_to). |
| snapshotC | Logs a KB snapshot entry and, with git auto-commit enabled, a git commit. |
| source_listA | Source ledger (Source concepts), oldest first: {id, title, source_kind, ingest_status, timestamp?, cited_by (count), cited_by_ids (concepts citing it in provenance)}. status defaults to pending ('*' = all). Read-only. |
| source_registerA | Records a primary source BEFORE ingesting it: a Source concept in a journal (default 'sources', map_create kind journal). Dedupes by sha256, else locator: a duplicate returns {id, duplicate: true, ingest_status}, writes nothing, adding locator_mismatch + existing_locator if the locator differs. Never fetches; body is your distillation. Cite its ID in provenance, then concept_patch ingest_status. |
| supersedeB | Marks a concept as superseded by another: sets status=superseded and records the successor. Returns findings on it. |
| template_listA | Lists KB-only concept templates: slug, type, title, variables. Read a template body with artifact_read. |
| validateC | Validates frontmatter, reserved files and strict ontology; returns the errors. |
| work_listB | Open work: concepts in an open status for their map, and unchecked - [ ] items in any concept, with section and line. where as in concept_list; fields and order_by name frontmatter keys. Read-only: change work with concept_patch. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 45 tools
Most tools have clearly distinct scopes (concept vs artifact vs asset vs map vs index), but the health/validation cluster (validate, lint, gate_check, kb_repair, kb_review, kb_status) and multiple write/patch variants (concept_write, concept_patch, concept_batch, concept_new) create some potential for misselection. Descriptions clarify boundaries, so ambiguity is limited but not absent.
Nearly all tools use consistent snake_case with an entity_action pattern (artifact_read, concept_write, map_create), but a few deviate as single verbs (validate, search, supersede, lint, snapshot) or noun_noun (atlas_overview, changes_since). The convention is still predictable and readable throughout.
45 tools is far above the typical 3-15 range and exceeds the 25+ threshold for 'too many'. The KB domain is broad, but the surface is heavy and could overwhelm an agent; many tools could be consolidated or grouped without losing capability.
Core CRUD and lifecycle for concepts, maps, artifacts, assets, index, logs, sources, and graph are well covered. Minor gaps exist (no inverse for concept_expand, no explicit map_read, no asset_move, no index_create), but agents can work around them using existing tools.