Skip to main content
Glama
cflorczyk9

margins-mcp

by cflorczyk9

margins-mcp

Use your Claude Pro/Max subscription on your Obsidian vault. No API key. No per-token costs. No embedding pipelines. Claude reads your notes and proposes updates; your subscription pays for inference; your files stay on your disk.

margins-mcp is a small Node program that sits between Claude (Desktop or Code) and your Obsidian vault. When you chat with Claude, it reads your notes through margins-mcp. Your files stay local, Claude does the thinking, your existing subscription pays for it.

Which Margins are you?

Margins works for six common starting points. margins_start auto-detects your state on the first call, so you don't have to classify yourself — but knowing which row you're on helps set expectations.

You...

Persona

First conversation

Obsidian, vault organized with wikilinks

A1

Q&A on your notes. margins_start then ask anything.

Obsidian, vault is empty or new

A2

Ask Claude to scaffold daily-note + meeting templates.

Obsidian, many files but few wikilinks

A3

Run propose_wikilinks on a page to surface connections you missed.

No Obsidian, organized markdown

B1

Same as A1. Install Obsidian for the proposal-review UX.

No Obsidian, empty

B2

Use --starter-vault ~/Margins to scaffold one.

No Obsidian, messy folder

B3

Run propose_wikilinks on your busiest page. Install Obsidian to review proposals visually.

Related MCP server: Obsidian MCP Server

Requirements

  • Node.js 18 or newer

  • An Obsidian vault, or any folder with notes, PDFs, Office/OpenDocument files, email exports, EPUBs, or plain text

  • A Claude subscription: Pro ($20/mo), Max, or Claude Code

Install

Two commands:

npm install -g margins-mcp
margins-mcp install

The installer prompts for your vault path, detects Claude Desktop and Claude Code, writes the right config files, scaffolds raw/ + proposed/ + .margins/ inside your vault if missing, and runs a verification probe. Restart Claude Desktop (Cmd-Q on macOS, not just close the window), or in Claude Code run /mcp to see Margins listed.

Don't have a vault yet?

Scaffold a Margins-shaped one:

margins-mcp install --starter-vault ~/notes

Finding your Obsidian vault path

If you already use Obsidian and don't know your vault's absolute path:

  • In Obsidian: right-click the vault name in the file tree → "Reveal in Finder" (macOS) or "Show in Explorer" (Windows). The path is in the title bar.

  • macOS common paths: ~/Documents/<VaultName>, or ~/Library/CloudStorage/iCloudDrive/Obsidian/<VaultName> if iCloud-synced.

  • Linux common paths: ~/Documents/<VaultName>, or ~/.local/share/Obsidian/<VaultName>.

  • Windows common paths: %USERPROFILE%\Documents\<VaultName>.

Pass it to the installer via --vault /absolute/path or answer the prompt.

Try-without-installing

npx margins-mcp install --vault /path/to/vault

You'll see a warning that npm may garbage-collect the npx cache and your configs would break weeks later. For real use, prefer npm install -g above. The npx path is fine for kicking the tires.

Manual install

If you'd rather edit config yourself, add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS; see Anthropic docs for Windows/Linux paths):

{
  "mcpServers": {
    "margins": {
      "command": "node",
      "args": ["/absolute/path/to/margins-mcp/bin/margins-mcp.js"],
      "env": { "MARGINS_VAULT": "/absolute/path/to/your/vault" }
    }
  }
}

Try it

In a new Claude conversation, ask:

Use margins to give me a summary of my recent notes.

Or:

What pages support the claim that my project deadline is May 30th? Use margins to find them.

Or:

I just dropped a spreadsheet into raw/. Compile it into a structured source page in my wiki.

The model can read your vault, propose new pages, propose edits to existing ones, and pull raw sources into structured wiki pages. propose_compile_from_raw accepts Markdown/plain text, PDFs, Word docs, spreadsheets, decks, email exports, EPUBs, OpenDocument files, RTF, HTML, CSV/TSV, JSON, YAML, and common text-ish formats. Every write stages to proposed/ first; nothing lands without you accepting.

Tools

Context (call once per conversation)

Tool

Purpose

margins_start

Vault stats + pending proposals + uningested raw files + recent preferences + the vault's CLAUDE.md if present. Claude's grounding for the whole conversation.

recall_preferences

Read durable user preferences from .margins/preferences.md (filing conventions, naming patterns, prior corrections). Claude calls this before any propose.

Read

Tool

Purpose

search_vault

Full-text + filename search across the vault.

read_page

Read one page by relative path.

list_recent

Most recently modified pages.

get_backlinks

Pages that wikilink to a target slug.

search / fetch

ChatGPT Deep Research compatibility pair.

Propose writes (staged — nothing lands until accepted)

Tool

Purpose

propose_page

Stage a new page at proposed/<path>.

propose_edit

Stage a string-replacement edit. before must appear exactly once.

append_to

Stage an append. Creates the page if missing; stacks on pending proposals.

propose_compile_from_raw

Turn a raw transcript, note, PDF, Word doc, spreadsheet, deck, email, EPUB, or other supported document in raw/ into a structured source page.

list_proposals

List pending proposals + overwrite-risk flag per entry.

resolve_proposal

action: "accept" lands the proposal; action: "reject" discards it.

Tool

Purpose

propose_wikilinks

Scan a page for entity-shaped phrases and propose wikilinks to other vault pages that share the same slug. The model then chains propose_edit calls to apply the ones it likes.

Learn

Tool

Purpose

record_preference

Append a durable rule to .margins/preferences.md. Claude calls this when the user corrects a proposal in a way that should apply next time (filing path, naming, summary length, etc.).

How the proposal flow works

Every write tool stages to proposed/<path> inside your vault. Nothing touches the live tree until you (or an MCP client acting on your behalf) call resolve_proposal with action: "accept". You can also inspect staged content (ls proposed/) and accept by moving files yourself.

Sequential edits stack: a second propose_edit on the same path reads from the pending proposal, not the vault.

Configuration

Env var

Default

Purpose

MARGINS_VAULT

(required)

Absolute path to your Obsidian vault or Markdown folder.

MARGINS_INDEX_ROOTS

auto-detected

Comma-separated subfolders to index. Auto-detection: .obsidian/ present → index root; wiki/ present → index wiki/ only; neither → index root.

MARGINS_TELEMETRY

(consent file)

Override telemetry: on or off. Default uses the consent decision made during install.

What Margins is NOT

To keep scope crisp:

  • Not an inference layer. Your Claude subscription pays for that. Margins makes zero LLM calls.

  • Not a web app. The chat surface lives in Claude Desktop / Claude Code / claude.ai. Margins is plumbing.

  • Not a cloud sync. Local-first. Your files stay on your disk.

  • Not a CRM integration. Different product.

  • Not API-key-based. Subscription-passthrough is the whole point.

Privacy

  • Vault content never leaves your machine. Margins is a Node process that reads/writes files locally and exposes structured tools over stdio.

  • Anonymous telemetry (opt-in at install time) reports tool-call counts to help me prioritize what to build next. Sample event payload: GET https://margins.goatcounter.com/count?p=/tool/search_vault. No vault content, no file paths, no user identifier beyond the standard 24-hour rolling session token GoatCounter assigns. Disable per-session with MARGINS_TELEMETRY=off. Decision stored at ~/.margins/consent.json.

Develop

git clone https://github.com/cflorczyk9/Margins.git
cd Margins
npm install
npm test
MARGINS_VAULT=/path/to/test/vault npm start

The compiler (src/compiler/) was originally vendored from an earlier Margins web app. The web app and its landing page live on the legacy-webapp branch in this repo. Re-vendor with scripts/vendor-compiler.sh if you ever need to pull updates back from there.

How Margins gets smarter over time

Two things compound:

  1. Your vault's CLAUDE.md is auto-loaded by margins_start. Drop vault-specific rules in there — filing conventions, voice, naming patterns — and Claude obeys them in every conversation. No copy-paste.

  2. .margins/preferences.md is a Margins-maintained file inside your vault. When you correct Claude ("no, that should be in projects, not personal"), Claude calls record_preference to remember the rule. Next conversation it reads them via recall_preferences before proposing writes. The file is plain Markdown — you can audit it, hand-edit it, delete sections that no longer apply.

Both files live in the vault, so they travel with it. Switch machines, switch hosts (Claude Desktop → Claude Code → ChatGPT once that lands), and your conventions follow.

Roadmap

  • v0.6: web onboarding at marginsmcp.com — pick a folder via File System Access, scaffold a vault, get the install command. Closes B2/B3 personas without requiring CLI fluency.

  • v0.6: get_citations (semantic embedding search, opt-in dep).

  • v0.6: OCR/image, legacy Office binary, and audio/video ingestion for propose_compile_from_raw.

  • v0.7: HTTP / Streamable transport for claude.ai web and ChatGPT custom connectors.

  • v0.7+: Obsidian community plugin alongside MCP, if signal supports it.

  • v0.8+: file watcher / auto-scaffold on drop into raw/.

License

MIT

Available Tools

23 tools
append_toA

Append content to the end of a page. If the page doesn't exist, it's created. If a pending proposal exists for the path, the append stacks on top of it. Result is staged at proposed/. If the user asks for final proposed content, read proposed/ after appending instead of inferring.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPage path relative to vault root.
contentYesContent to append. A newline separator is added if needed.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate write operation (readOnlyHint=false) and non-destructive (destructiveHint=false). Description adds behavioral details: auto-creation, proposal stacking, newline handling. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four concise sentences front-loaded with the main action. Every sentence adds value: core function, creation behavior, proposal interaction, output location. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, but description explains result staging at proposed/<path>. Handles all likely agent questions: what happens if page exists? if not? if proposal exists? How to get final content?

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 100% with descriptions. Description adds 'relative to vault root' for path and 'newline separator added if needed' for content, providing extra clarity beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Append content to the end of a page' with specific verb and resource. It also covers edge cases like page creation and proposal stacking, which distinguishes it from sibling tools like propose_edit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly describes when to use: append to end, create if missing, stacks on pending proposals. Also advises reading proposed/<path> for final content instead of inferring. No alternatives named but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetchB
Read-only

ChatGPT Deep Research fetch. Returns {id, title, text, url, metadata} for the given vault path.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, so the read-only nature is clear. The description adds the return shape but does not disclose error handling, authentication, or performance characteristics. It is adequate but not comprehensive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that includes purpose and return fields. It is efficient, though it could be better structured with bullet points for clarity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a simple fetch with one parameter and no output schema, the description provides basic coverage. However, it lacks details on constraints (e.g., path format, accessibility) and does not differentiate from sibling tools, leaving some gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only defines 'id' as a string. The description adds meaning by stating it is a 'vault path', which is critical for correct usage. This compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it fetches a document from a vault path and specifies the returned fields. However, it doesn't explicitly differentiate from sibling tools like read_page or search, which may also retrieve vault content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., search, read_page, search_vault). The description merely states what it does without context on selection criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_vault_contextA
Read-only

Read the vault's wikilinking context: entity slugs (people, organizations, places, tools, projects), active project/decision slugs (priority=active or recently updated), and the in-use semantic tag taxonomy. Call this BEFORE propose_compile_from_raw so the page you stage uses real entity slugs in [[wikilinks]] (not invented names) and existing tags (not new variants). Region/X and vibrance/X tags are excluded from the response — those are auto-computed by scripts/wiki_regions.py and must not be model-generated. Cached on a vault-mtime key; safe to call repeatedly.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoForce a re-scan even if the vault hasn't changed since the last call. Default false (use cache).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. Description adds valuable behavioral details: cached on vault-mtime, safe to call repeatedly, and exclusion of auto-computed tags. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: opens with main purpose, then specifics, then usage hint, then exclusion detail. Each sentence adds value, though slightly verbose in listing all three context types.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one optional parameter and no output schema, the description fully covers what the tool returns, when to use it, caching behavior, and exclusions. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter 'refresh' with boolean type; schema coverage is 100%, so schema already documents it. Description mentions force re-scan but adds no new semantic meaning beyond the schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it reads the vault's wikilinking context and lists three specific outputs: entity slugs, active slugs, and taxonomy. Differentiates from siblings by naming propose_compile_from_raw and explicitly excluding Region/X and vibrance/X tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call before propose_compile_from_raw, explaining why (real entity slugs and existing tags). Notes caching behavior and safety for repeated calls.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_proposalsA
Read-only

List pending proposals with optional filtering. Each entry has proposal path, destination path, whether accepting overwrites an existing vault file, size, and (for overwrites under default settings) a small first-diff preview. Use the pattern filter to scope to a folder or file shape when the queue is large.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum proposals to return. Response includes totalMatched + truncated flag when results are capped.
sortByNoSort order. 'path' (default) is lexical; 'age' is newest mtime first; 'size' is largest first.
patternNoGlob to filter destinationPath. Supports *, **, ?. Example: 'wiki/sources/*.md' or 'wiki/projects/briefly-**'.
includeDeltaNoInclude per-overwrite first-diff preview. Default true. Set false when scanning a large queue — saves N pairs of file reads.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals specifics about each entry (path, destination, overwrite status, size, preview) and explains the effect of setting includeDelta to false, which goes beyond the readOnlyHint annotation. This provides useful behavioral context without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words, the purpose is front-loaded. Every sentence adds necessary detail like the preview feature and pattern usage guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 4 parameters and no output schema, the description covers purpose, filtering, and parameter behaviors. The limit parameter's schema description already mentions totalMatched and truncated flag, so the description doesn't need to repeat that. It's sufficiently complete for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds value by explaining the practical effect of includeDelta (saving file reads) and the purpose of pattern (scoping to folder/file shape), improving understanding beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'list' and the resource 'pending proposals', making the purpose immediately obvious. It distinguishes from sibling tools like 'resolve_proposal' and 'propose_wikilinks' by focusing on listing, not acting on proposals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using the pattern filter when the queue is large, which is helpful context. However, it does not explicitly state when not to use this tool or mention alternatives (e.g., 'list_unprocessed' for unprocessed items), leaving some ambiguity for an AI agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_recentA
Read-only

List the most recently modified vault files. Use this to answer 'what did I just ingest / update'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoDefault 20.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the description's read-only nature is already signaled. The description adds the temporal constraint (most recently modified) but does not detail pagination or return fields, which is acceptable for a simple tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with action, no fluff. Perfectly concise for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 optional parameter, no output schema), the description is complete: it states what it lists and when to use it, leaving no ambiguity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the parameter 'limit' is fully described in the schema (min, max, default). The tool description adds no additional parameter context, so baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists recently modified vault files and gives a specific use case ('what did I just ingest / update'), distinguishing it from siblings like list_unprocessed and list_proposals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use it (to answer recent updates), providing clear context. It does not mention alternatives or when not to use, but the context is strong enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_unprocessedA
Read-only

List vault files that have not yet been compiled into a wiki source page. Files can live anywhere in the vault (raw/ is conventional but not required) — detection works on raw_file: frontmatter, not folder placement. Use this when the user asks 'what haven't I filed yet?' or before a compile pass. Each item is a vault-relative path you can pass directly to propose_compile_from_raw.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum pending files to return. Default 50.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds context about detection using frontmatter rather than folder placement. It does not describe return format details beyond 'vault-relative path', which could be improved, but overall it is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by usage context and a practical pointer to a sibling tool. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional param, no output schema), the description is complete. It explains what is listed, how detection works, when to use it, and how the output can be used.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the parameter is described in the schema. The description adds no additional meaning about how limit affects results or the default value is already in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb (list) and resource (unprocessed vault files) and clearly states the detection mechanism (raw_file frontmatter). It distinguishes itself from sibling tools like list_proposals by explaining the output can be passed to propose_compile_from_raw.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly provides when-to-use scenarios: when the user asks 'what haven't I filed yet?' or before a compile pass. Also mentions that results are directly consumable by propose_compile_from_raw, guiding the agent to the appropriate next step.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

margins_doctorA
Read-only

Diagnose the vault's health. Returns a structured report of issues: orphan source pages (raw_file points to a missing file), tracker drift (source pages without tracker rows, or tracker rows for missing sources), files with malformed frontmatter, and large raw files. Read-only — never modifies the vault. Use when the user asks 'is anything broken?', 'check my vault', or before major operations.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true, and the description reinforces 'never modifies the vault.' It adds value by listing the exact types of issues diagnosed, providing behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each serving a purpose: first describes output, second states read-only property and usage hints. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description adequately describes the output types and usage scenarios. It is complete for a diagnostic tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so schema coverage is 100%. The description doesn't need to explain parameters; baseline is 4 for no-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool diagnoses vault health and returns a structured report of specific issues: orphan source pages, tracker drift, malformed frontmatter, and large raw files. The verb 'diagnose' and resource 'vault health' are precise, and it distinguishes from siblings like margins_start and margins_reset_proposals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says when to use: when user asks about broken items, checks vault, or before major operations. It doesn't explicitly state when not to use or name alternatives, but the context with siblings implies it's the diagnostic tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

margins_reset_proposalsA
Destructive

Clear all pending proposals from proposed/. Use when proposals have accumulated from failed Claude sessions, or when the user wants a clean slate. Returns the number of files that would be deleted. Requires confirm=true to actually delete — without confirm, returns a dry-run list. Vault files are never touched; only files under proposed/.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoPass true to actually delete the pending proposals. Default false returns a dry-run preview.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark it as destructive, but description adds critical detail: never touches vault files, only proposed/. Also explains dry-run behavior with confirm parameter. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, each essential. First sentence states action, second gives usage context, third explains confirmation behavior and safety.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given single parameter and no output schema, description fully covers purpose, usage cues, parameter behavior, and safety scope. Agent can correctly decide and invoke.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers both parameter semantics already, but description adds behavioral context for confirm: dry-run vs actual deletion. Reinforces and clarifies beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool clears pending proposals from a specific directory. It uses a specific verb 'Clear' and resource 'pending proposals from proposed/', distinguishing it from sibling tools like list_proposals or resolve_proposal.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: after failed Claude sessions or when wanting a clean slate. Implicitly excludes use cases where proposals should be preserved. Does not explicitly list alternatives but context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

margins_startA
Read-only

Conversation-start primer. Always call this once at the start of every vault-relevant conversation. The response includes a 'mode' field — read it and follow the 'guidance' field tailored to that mode: (1) mode='pile' for unstructured many-file vaults — returns a time-stratified sample of vault files, filename patterns, and (importantly) a rawScan with a priorityQueue of raw/ files to compile FIRST via propose_compile_from_raw. If priorityQueue is non-empty, your best opening move is to compile those files in parallel in a single turn (read_page each to get readable text, then propose_compile_from_raw with a structured summary) — the user dropped source documents and wants wiki source pages within ~90 seconds. (2) mode='empty' for near-empty vaults — ask what the user wants and offer to scaffold. (3) mode='synthesis' for organized linked vaults — returns folder stats, pending proposals, uningested files, recent user preferences, and the vault's CLAUDE.md. Ground answers in this structure and cite file paths. All modes also return pendingProposals, uningestedRaw, recentPreferences, and vaultManual.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, which aligns with the tool's read-only nature. The description adds valuable behavioral context: explains response structure (mode, guidance, etc.) and expected follow-up actions. However, it doesn't mention idempotency or effects of re-calling, which would be useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed and well-structured, breaking down modes with clear instructions. It is slightly verbose but every section adds necessary context. Front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description covers response fields (mode, guidance, pendingProposals, etc.) adequately. It guides the agent on subsequent actions. However, it lacks details on repeated calls or fallback behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters, so schema coverage is 100%. The description correctly provides no parameter info, as none exist. Baseline score of 4 is appropriate since there is nothing to add beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states that this is a 'Conversation-start primer' and must be called once at the start of every vault-relevant conversation. It clearly identifies the tool's role and distinguishes it from sibling tools by being the mandatory first call.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance ('Always call this once at the start of every vault-relevant conversation'). Also gives mode-specific instructions for 'pile', 'empty', and 'synthesis' modes, including how to handle each and what actions to prioritize.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_compile_from_rawA

Compile a supported source file (.adoc, .asciidoc, .conf, .csv, .docx, .eml, .epub, .htm, .html, .ini, .json, .log, .markdown, .md, .mdx, .odp, .ods, .odt, .org, .ott, .pdf, .pptx, .rst, .rtf, .srt, .tex, .text, .toml, .tsv, .txt, .vtt, .xlsm, .xlsx, .xml, .yaml, .yml) into a wiki source page proposal staged at proposed/.

IMPORTANT — produce a knowledge artifact, not a topic recap. The page you stage is the substrate the user (and future Claude sessions) will retrieve from. Thin pages = thin retrieval.

Before calling, call get_vault_context to know which entity slugs and active project slugs to wikilink, and which semantic tags are already in use.

For a meeting/call/transcript: pick content-specific H2 headings that reflect what was actually discussed (e.g. 'Practice Overview', 'Service Philosophy', 'Succession Status' — NOT 'Summary' / 'Bullets' / 'Takeaways'). Quote verbatim where the exact phrasing matters. Wikilink every entity using slugs from get_vault_context. Include a relevanceCallout naming the active projects/decisions this source bears on. Surface 2-4 concrete applications.

For a synthesis page (pageType='synthesis'): pass the source URLs as sources, structure body sections around the argument, include a relevanceCallout.

For a concept page (pageType='concept'): structure as snapshot + context + source log.

Legacy callers can still pass summary + summaryBullets + takeaways and skip sections — Margins will fall back to the simple template. But the rich path is what produces a knowledge artifact.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoSemantic tags (topical, people slugs, firm slugs). DO NOT include region/X or vibrance/X — those are auto-computed by scripts/wiki_regions.py and will be overwritten.
forceNoReplace an existing source page for this raw file. Without bucket/destination_path override, the existing source page is replaced IN PLACE (same path). With override, the source moves to the new location. Default false.
quietNoOmit the full staged markdown from the response. The page still lands at proposed/<destinationPath> — set quiet=true when compiling many files in one turn so the response payload stays small. Default false.
splitNoSplit-mode trigger. When set, the raw file is segmented at the chosen boundary and Margins stages one source page per segment plus a hub page that wikilinks them. 'heading-h1' / 'heading-h2' segment by Markdown-style heading level (works for MD/HTML and any extractor that emits H markers like XLSX/PPTX). 'sheet' is alias for h2 splits, ergonomic for spreadsheets. 'auto' picks h2 for spreadsheets and h1 elsewhere. Summary is not required in split mode.
titleNoTitle for the page. Defaults to titlecased filename.
bucketNoWiki bucket folder. 'sources', 'projects', 'ideas', 'meetings', 'career'. Pick by topic, not page-type.
rawPathYesVault-relative path of the source file. Examples: 'raw/foo.pdf', 'meetings/march-7.md'. Pass list_unprocessed paths directly. Bare filename (e.g. 'foo.pdf') resolves to raw/foo.pdf unless an actual root-level foo.pdf exists and raw/foo.pdf does not.
relatedNoRelated wiki pages. Either bare slug strings or {slug, note} objects. Renders as `## Related` with `[[wikilinks]]`.
sourcesNoFor synthesis pages: list of evidence URLs. Renders as a sources frontmatter list.
summaryNoRich multi-clause summary (NOT 1-3 sentences). REQUIRED unless split mode is set — in split mode each segment is auto-titled from its heading and no summary is needed. For single-source compile this becomes the frontmatter summary used by retrieval.
keyLinksNoWikilink slugs for the frontmatter key_links field, e.g. ['ellis-rutili', 'centric-wm', 'briefly']. Use slugs from get_vault_context.
pageTypeNoPage shape. 'source' = faithful summary of one raw file (default). 'concept' = durable theme/idea. 'synthesis' = connection-point across multiple sources.
sectionsNoPrimary body — array of {heading, body} sections. Pick content-specific H2 headings that fit the source. Body is markdown; may include [[wikilinks]], tables, blockquotes, bold key terms. Quote verbatim where phrasing matters. If you provide sections, the legacy summary/bullets/takeaways template is skipped.
eventDateNoDate the source event occurred (YYYY-MM-DD). Defaults to today.
hubBucketNoBucket folder for the hub + segment pages when split mode is set. Defaults to bucket if provided, else 'sources'.
sourceUrlNoExternal URL if the source has one (YouTube, blog post, public PDF). Renders as a markdown link in the header block.
takeawaysNoLEGACY — for the simple template only. If you provide `sections`, this is unused. Either strings or {point, evidence} objects.
headerNoteNoShort paragraph under the H1 giving venue/runtime/context (e.g. 'Stanford GSB fireside chat, ~45 min, published 2026-05-04').
maxSegmentsNoCap on segments staged in a single split call. Default 50. Extra headings beyond the cap are noted in the hub but not staged.
applicationsNoConcrete questions or applications. Renders as `## Personal applications worth tracking`. 2-4 items typical.
participantsNoFor meeting/call pages: participant names. Renders as a participants frontmatter list.
sourceCaveatNoSource-quality warning — renders as a `> [!info]+ Source caveat` callout. Use when the source has limitations (e.g. 'Granola summary, no transcript available').
summaryBulletsNoLEGACY — for the simple template only. If you provide `sections`, this is unused.
destination_pathNoOverride destination path, e.g. 'wiki/career/source-2026-05-13-something.md'.
propagationNotesNoEntity/concept creation decisions made or refused (per operator-manual rule #4). Renders as `## Propagation Notes`.
relevanceCalloutNoConnor-relevance synthesis. Renders as `> [!claude-note]+ Connor-relevance — Claude synthesis`. Body is markdown. Links is an array of wikilink slugs to active projects/decisions this source bears on.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=false) are supplemented by description details: the 'force' parameter can replace existing source pages, split mode stages multiple pages, and tags are auto-computed. This adds valuable behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections for different page types and parameter guidance. While it is somewhat verbose (e.g., listing all file extensions), the length is justified by the tool's complexity and the need to disambiguate usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 26 parameters and no output schema, the description covers file types, page types, parameter usage, prerequisites, and legacy mode comprehensively. It lacks details on return values, but the complexity is high and the description is fairly complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the description further enriches parameter meanings, e.g., providing content-specific heading instructions for meetings, warning against certain tags, and clarifying legacy vs rich paths. This adds significant value beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool compiles supported source files into wiki source page proposals at 'proposed/<wiki path>', listing many file extensions. It distinguishes from sibling tools like propose_page by emphasizing knowledge artifacts vs topic recaps and providing specific page-type guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: call get_vault_context first, avoid certain tags, and follow different patterns for meetings, synthesis, and concept pages. It also explains the legacy vs rich path. However, it does not explicitly state when NOT to use this tool versus alternatives like propose_page.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_editA

Propose an edit to an existing page via exact string replacement. 'before' must appear exactly once in the current file (or in the pending proposal if one exists); add surrounding context if it doesn't. The edit is staged at proposed/.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPage path relative to vault root.
afterYesReplacement text. Empty string deletes the match.
beforeYesExact text to replace. Must be unique in the file.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-readonly and non-destructive. The description adds that the edit is staged (not applied directly) and explains uniqueness constraint, providing valuable context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. Front-loaded purpose and mechanism, followed by essential usage hint. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with 3 parameters and no output schema, the description covers the core behavior (staging, uniqueness, deletion). A minor gap is missing what the tool returns (e.g., success indication), but not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, baseline is 3. The description adds contextual guidance: explaining what to do if 'before' is not unique, and that empty 'after' deletes. This improves the agent's ability to use parameters correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs 'exact string replacement' on an 'existing page'. This verb+resource+machine specification distinguishes it from sibling tools like append_to or propose_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on when the 'before' text must be unique and advises to add context if needed. However, it does not explicitly contrast with alternatives like propose_page or append_to, which would help the agent decide between siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_entity_stubsA

Stage stub entity pages for a list of candidate slugs (typically from scan_entity_candidates). Each stub becomes a proposed page at wiki//.md (default bucket 'entities') with frontmatter type:entity + a from_scan marker, an auto-built '## Mentioned in' block linking source files when snippets/files are provided, and a '## Next' checklist. Skips slugs whose destination page already exists in the vault — edit those directly instead of overwriting them. Closes the cold-start loop: scan finds names with no page; this stages the pages; resolve_proposal accepts the ones the user wants. Reject events on a stub (single or bulk) automatically append the slug to .margins/entity-rejections.md so it doesn't re-surface in the next scan.

ParametersJSON Schema
NameRequiredDescriptionDefault
bucketNoBucket folder for the stubs. Default 'entities'. Pick a topical bucket if the candidates share a theme ('people', 'cases', 'firms').
candidatesYesArray of candidate slugs (strings) or candidate objects (forward the scan_entity_candidates payload verbatim for the richest stub bodies). Limit 200 per call to keep the proposal queue reviewable.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description fully discloses the tool's behavior: it creates stub pages with frontmatter, auto-builds a 'Mentioned in' block, skips existing pages, and explains the rejection mechanism. Annotations declare readOnlyHint=false and destructiveHint=false, consistent with creating non-destructive stubs. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured: first sentence states core function, followed by details, then workflow context. Every sentence adds value without redundancy. It front-loads the key action and uses clear segmentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the tool and its role in a multi-tool workflow, the description covers essential context: the cold-start loop, skip behavior, and rejection handling. No output schema exists, but the description explains what the user gets. Slight gap: does not detail how to interact with stubs after creation (use resolve_proposal), but sibling tools cover that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are described. The description adds value by explaining the intent of 'bucket' (thematic grouping) and 'candidates' (forwarding scan payload for rich stubs) beyond the schema's technical descriptions. It also mentions the 200-item limit not present in schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool stages stub entity pages for candidate slugs from scan_entity_candidates, with specific details about destination path, frontmatter, and auto-built blocks. It distinguishes itself from siblings like propose_page by focusing on entity stubs and being part of a defined cold-start loop.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool: after scan_entity_candidates, and before resolve_proposal. It notes that it skips existing pages, implying not to use for edits. However, it does not explicitly compare to alternatives like propose_page or propose_edit, which slightly reduces clarity. The workflow context is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

propose_pageA

Propose a new page in the vault. Body is the full markdown (frontmatter optional). The page is staged at proposed/ until the user accepts it via resolve_proposal. Errors if a page already exists at this path in the vault — use propose_edit or append_to in that case.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyYesFull markdown body to write.
pathYesDestination path relative to vault root, e.g. 'wiki/projects/foo.md'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations (readOnlyHint=false, destructiveHint=false) indicate mutation but not destruction. The description adds that the page is staged at 'proposed/<path>' and requires user acceptance via resolve_proposal. It mentions error condition. Lacks detail on response or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with purpose. No wasted words. Every sentence adds value: purpose, behavior, error/alternative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 2 parameters and no output schema, the description covers core functionality, staging, error condition, and alternatives. Minor omission: no mention of return value or confirmation, but acceptable for this tool type.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with property descriptions. The description adds that body is 'full markdown (frontmatter optional)' and path is 'relative to vault root'. This is consistent with schema but adds minimal new meaning. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool proposes a new page, specifying the verb 'propose' and resource 'new page in vault'. It differentiates from siblings propose_edit and append_to by indicating it fails if page exists and directing to those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use for new pages and provides guidance on when not to use: 'Errors if a page already exists... use propose_edit or append_to in that case.' This gives clear context and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_pageA
Read-only

Read a single vault file by relative path (e.g. 'wiki/career/career.md' or 'raw/report.pdf'). Extracts readable text from supported document formats before returning it.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesPath relative to the vault root.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. The description adds that it extracts readable text from supported formats, which is consistent and provides context about the read operation. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, no redundancy, front-loaded with the core purpose. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is adequate for a simple read tool with one parameter and annotations. However, it lacks details on error handling, supported document formats, or behavior for unsupported files. With no output schema, some additional completeness would help.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a clear description for the single required parameter 'path'. The description adds example paths but no additional semantic meaning beyond the schema, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it reads a vault file by relative path and extracts text, specifying the verb 'read' and the resource 'vault file'. It distinguishes from siblings like 'search_vault' or 'list_recent' that handle different operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for reading a single file but does not explicitly state when to use it over alternatives or provide exclusions. No guidance on when not to use or prerequisites is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recall_preferencesA
Read-only

Read the user's vault-scoped preferences file (.margins/preferences.md). Returns durable rules the user has stated or that you've recorded via record_preference. Call this before any propose_* tool so your proposals follow the user's filing conventions, naming patterns, and prior corrections.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds context beyond the readOnlyHint annotation by specifying the file path, return content (durable rules from user or record_preference), and its relation to propose tools. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three efficient sentences, no wasted words. First sentence states action and resource, second explains return, third gives usage instruction.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and no output schema, the description covers all necessary aspects: purpose, return content, and usage context. It ties into sibling tools appropriately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so the description cannot add meaning beyond schema. Baseline score of 4 applies for 0-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a specific file (.margins/preferences.md) and returns durable rules. It distinguishes from siblings by mentioning record_preference and propose_* tools, making its unique role clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs to call this before any propose_* tool, providing a clear when-to-use directive. It lacks explicit when-not-to-use but the positive guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

record_preferenceA

Append a durable user preference, convention, or correction to the vault's preferences file. Call this when the user corrects a proposal in a way that should apply next time (filing path, naming pattern, summary length, link style, etc.). Do NOT record one-off disagreements or transient feedback. Aim for one-line rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional category tag. Examples: 'filing', 'naming', 'voice', 'structure'.
observationYesOne-line rule capturing the durable preference. Example: 'Mark Loh meeting notes file under wiki/projects/ not wiki/personal/.'

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate a non-read-only, non-destructive operation, which aligns with the description 'Append' and 'durable'. The description adds context about the target (preferences file) and the nature of data (one-line rules), but doesn't elaborate on file creation or duplicate handling. Still, it sufficiently discloses behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences front-loaded with purpose, then usage guidelines, then negative guidance. Every sentence adds essential information with no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema, no enums), the description fully covers purpose, when to use, and parameter semantics. No gaps remain for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 100% coverage with descriptions for both `observation` and `category`. The description reinforces the expected format with examples ('One-line rule...', 'Optional category tag... Examples: filing, naming...') and provides a concrete example for observation, clarifying usage beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action: 'Append a durable user preference, convention, or correction to the vault's preferences file.' It also gives specific examples of when to use (user corrects a proposal on filing path, naming pattern, etc.), distinguishing it from one-off feedback.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this when the user corrects a proposal...' and provides a clear negative: 'Do NOT record one-off disagreements or transient feedback.' This helps the agent decide when to invoke this tool vs. alternative feedback mechanisms.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resolve_proposalA
Destructive

Accept or reject pending proposals. Two modes: (1) single — pass path to apply the action to exactly one proposal; (2) bulk — pass pattern (glob) to apply the action to every matching proposal. Exactly one of path/pattern is required. Accept moves proposal to its destination atomically (overwriting any existing file at the destination); reject deletes the proposal without touching the vault. Per-destination lock guarantees concurrent edits on the same path serialize. Use dryRun: true with a pattern to preview which proposals would be touched without applying anything.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDestination path of a single proposal, with or without the 'proposed/' prefix. Mutually exclusive with pattern.
actionYesWhether to apply or discard the matched proposal(s).
dryRunNoOnly meaningful with pattern. When true, return the list of paths that WOULD be affected without applying the action.
patternNoGlob to match destinationPath of multiple proposals. Supports *, **, ?. Mutually exclusive with path.
maxCountNoOnly meaningful with pattern. Cap the number of proposals processed in a single call.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only indicate destructive (destructiveHint=true) but not read-only. The description adds atomicity of accept (overwriting), reject behavior (deletes proposal without touching vault), per-destination lock for concurrency, and dryRun preview. This far exceeds annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose. Each sentence adds value: purpose, modes details, behavioral notes. No waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, 1 required, no output schema, the description fully explains tool behavior, modes, edge cases, and concurrency. DryRun output is mentioned. Complete for use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds significant meaning: explains mutually exclusive path/pattern, dryRun function, maxCount capping, and that path can include 'proposed/' prefix. Adds clarity beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states clearly 'Accept or reject pending proposals' and distinguishes two modes (single and bulk). It uses specific verbs and resource, making it distinct from sibling tools like list_proposals or propose_*.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly explains when to use single mode (pass path) vs bulk mode (pass pattern), with exactly one required. Mentions dryRun for preview. While it doesn't explicitly say when not to use it, the context is clear given sibling tools. Slight lack of explicit alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_entity_candidatesA
Read-only

Find capitalized phrases that recur across vault pages but have no matching slug — i.e. entities the user keeps mentioning without having a page for them. This is the inverse query of propose_wikilinks: instead of 'where should I add a wikilink to an existing page?', it answers 'what page should exist that doesn't yet?'. Returns candidates ranked by file-spread × mention-count, with snippets and the list of files where each appears. Read-only — never stages. The companion tool propose_entity_stubs takes the slugs you choose from this list and stages stub entity pages. Layered filtering: a global English/structural stoplist, an optional domain pack ('med', 'realestate', 'law', 'generic'), and an optional excludeUserRejections list (slugs the user already rejected). Existing slugs are excluded automatically — the shared vault-slug index is the same one propose_wikilinks uses. Best used right after a fresh import or split-mode compile, when the corpus has many entity references but few entity pages.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCap on candidates returned. Default 50. Total candidate count is in candidatesFound so callers can tell if there are more behind the cap.
scopeNoGlob to limit the walk. Default 'wiki/**'. Pass a folder glob like 'Path/**' to scope to one subject. Supports *, **, ?.
domainNoDomain pack to apply on top of the global stoplist. 'med' drops Step One / Gram Positive / Stage III etc; 'realestate' drops Class A / Phase II / Due Diligence; 'law' drops Section / Article / Chapter; 'generic' (default) applies only the global list.
minMentionsNoMinimum total mentions across the scope before a candidate qualifies. Default 5. Lower to surface more (noisier); raise for high-confidence only.
minFileSpreadNoMinimum number of distinct files a candidate must appear in. Default 3. Catches phrases that recur many times in one file (often boilerplate) and treats them as low-signal.
minPhraseWordsNoMinimum word count for a candidate to qualify. Default 2 — single-word sentence-start capitals are the dominant noise source on real vaults. Acronyms (AI / MBA / MCP, all-caps 2-6 letters) bypass this filter and surface regardless. Drop to 1 to also see single-word surnames like 'Holmes' or 'Cardozo' (raises recall, raises noise).
excludeUserRejectionsNoSlugs the user has previously declined. Wired by propose_entity_stubs in v0.16+ to read rejection memory from .margins/preferences.md; you can also pass it ad-hoc.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses read-only nature ('Read-only — never stages') beyond the annotation. Explains the ranking algorithm (file-spread × mention-count), layered filtering (global stoplist, domain pack, user rejections), and that existing slugs are excluded automatically. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear paragraphs. Front-loads the main purpose and draws contrast with sibling. A bit long with multiple paragraphs, but each sentence earns its place. Could be slightly shorter but still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 7 parameters (all documented in schema) and no output schema, the description covers return values (candidates ranked with snippets and file list), companion tool, filtering layers, and best-use timing. Provides enough context for a correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline 3. The description adds value by explaining the interaction of parameters (e.g., 'layered filtering', trade-offs like 'Lower to surface more; raise for high-confidence'). Gives context for minPhraseWords (single-word noise, acronym bypass). This adds meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: finding capitalized phrases that recur without a matching slug. It distinguishes itself from the sibling propose_wikilinks by explaining the inverse query nature. The verb 'find' and resource 'entities' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Best used right after a fresh import or split-mode compile.' Contrasts with propose_wikilinks, clarifying the decision boundary. Also mentions companion tool propose_entity_stubs for next steps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_vaultA
Read-only

Full-text + filename search across the Margins vault. Returns top hits with path and snippet.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return. Default 10.
queryYesSearch string. Case-insensitive substring.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true. Description adds that results include path and snippet, but lacks details on pagination, ordering, or edge cases. With annotations covering safety, this is minimally adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence efficiently conveys purpose and return value. No redundant information, perfectly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists; description mentions 'top hits with path and snippet' but lacks detail on structure (e.g., fields per hit). For a simple search tool this is acceptable but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with clear descriptions for both parameters. The description adds no extra meaning beyond what the schema provides, baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool performs 'Full-text + filename search across the Margins vault' and specifies return of 'top hits with path and snippet.' This is a specific verb-resource pair, distinguishing it from generic siblings like 'search'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as 'search' or 'scan_entity_candidates'. The description only states what it does without context for selection.

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. Dates show when Glama detected each change.

  1. 23 tool updatesv0.15.3
    • First observedappend_to
    • First observedfetch
    • First observedget_backlinks
    • First observedget_vault_context
    • First observedlist_proposals
    • First observedlist_recent
    • First observedlist_unprocessed
    • First observedmargins_doctor
    • First observedmargins_reset_proposals
    • First observedmargins_start
    • First observedpropose_compile_from_raw
    • First observedpropose_edit
    • First observedpropose_entity_stubs
    • First observedpropose_page
    • First observedpropose_wikilinks
    • First observedread_page
    • First observedrecall_preferences
    • First observedrecord_preference
    • First observedrecord_telemetry_consent
    • First observedresolve_proposal
    • First observedscan_entity_candidates
    • First observedsearch
    • First observedsearch_vault

TDQS

A3.9/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: margins_start initializes conversations, get_vault_context provides context for proposals, propose_* tools handle different types of content creation, and management tools like list_proposals and resolve_proposal are separate from diagnostics. There is no functional overlap that would cause confusion.

Naming Consistency4/5

Tool names predominantly follow a verb_noun pattern (e.g., get_vault_context, propose_page, resolve_proposal). A few tools like 'search' and 'fetch' are single verbs, and 'append_to' uses a different structure, but these are minor deviations from the otherwise consistent convention.

Tool Count4/5

With 23 tools, the server covers a comprehensive set of operations for vault management, including context retrieval, content proposal, preference recording, diagnostics, and proposal lifecycle. While the count is on the higher side, each tool serves a specific need without redundancy.

Completeness4/5

The tool surface covers the full lifecycle of a vault: initialization (margins_start), context (get_vault_context), search, reading, proposing new content (propose_page, propose_compile_from_raw), editing (propose_edit, append_to), and proposal management (list_proposals, resolve_proposal, margins_reset_proposals). Missing a direct deletion tool for existing pages is a minor gap, but the set otherwise feels complete.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Connects Claude.ai to your local Obsidian vault for full CRUD access, search, and daily note creation via the Model Context Protocol.
    15
    14
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Lets Claude save conversations, notes, and structured summaries directly to your Obsidian vault. Supports YAML frontmatter, auto-backlinks, daily notes, and vault search.
    -

Latest Blog Posts

MCP directory API

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

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

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