Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Margins

NPM · MARGINS-MCP · SCANNED SEP 20

Use your Claude Pro/Max subscription on your Obsidian vault. Reads markdown, proposes writes.

Available components

0 this week 92 Trust /100
Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 65 of 156 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency97
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Cryptographically verified build provenance (signed, bound to cflorczyk9/Margins). View diagnostics → Pass
  • Clear OSI-approved license (MIT).Pass
  • Actively maintained (last published 121 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability68
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 5783 tokens (~251/item across 23 items; 23 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management93
  • Stability observed for 28 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage99
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 97% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 23 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

How do I install the Margins MCP server?

Margins runs locally as an npm package, launched with npx -y margins-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · margins-mcp

# add to Claude Code
claude mcp add cflorczyk9-margins -- npx -y margins-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "cflorczyk9-margins": {
      "command": "npx",
      "args": [
        "-y",
        "margins-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "cflorczyk9-margins": {
      "command": "npx",
      "args": [
        "-y",
        "margins-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add cflorczyk9-margins -- npx -y margins-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cflorczyk9-margins": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "margins-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add cflorczyk9-margins --command npx --arg -y --arg margins-mcp
# ~/.hermes/config.yaml
mcp_servers:
  cflorczyk9-margins:
    command: "npx"
    args: ["-y", "margins-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "cflorczyk9-margins": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "margins-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add cflorczyk9-margins -t stdio -c npx -a -y margins-mcp
// mcp.json
{
  "mcpServers": {
    "cflorczyk9-margins": {
      "command": "npx",
      "args": [
        "-y",
        "margins-mcp"
      ]
    }
  }
}
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 19 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

  • 18 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 17 Sept 26 +1
    • Security disclosure: fail → unverified functional
  • 16 Sept 26 −3
    • Stability: pass → 0.80 functional
  • 15 Sept 26 0
    • Stability: 0.97 → pass security
  • 14 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

  • 13 Sept 26 0
    • Security disclosure: unverified → fail functional
  • 12 Sept 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 20 Sept 2026 · Analysed npm/margins-mcp@0.15.3

Provenance Verified

A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.

Result Verified
Ecosystem npm
Reason Verified
Discovered via Registry attestation endpoint
Source repo cflorczyk9/Margins
Certificate issuer https://token.actions.githubusercontent.com
Certificate SAN https://github.com/cflorczyk9/Margins/.github/workflows/release.yml@refs/tags/v0.15.3
Rekor log index 1590156203
Predicate type https://slsa.dev/provenance/v1
Subject digest sha512:89dbf72c585992868548cb29444e8b335cb481b1721795a4d7f6873736eef768ec30d65b2a23ae3bbc749ac092e3723e9ef04953253990e0271772383

Background: How many MCP packages publish verified provenance →

Dependencies 156 packages
Packages resolved 156
Deprecated 1
Stale 64
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 23 exposed · ~4,765 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
append_to ~104

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/<path>. If the user asks for final proposed content, read proposed/<path> after appending instead of inferring.

NameTypeReqDescription
contentstringyesContent to append. A newline separator is added if needed.
pathstringyesPage path relative to vault root.

No output schema declared.

No examples provided.

fetch ~38

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

NameTypeReqDescription
idstringyes

No output schema declared.

No examples provided.

get_backlinks ~56

Find vault pages that link to a target slug or filename. Matches [[wikilinks]] and relative .md links.

NameTypeReqDescription
limitintegerDefault 25.
targetstringyesSlug or filename without extension.

No output schema declared.

No examples provided.

get_vault_context ~162

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.

NameTypeReqDescription
refreshbooleanForce a re-scan even if the vault hasn't changed since the last call. Default false (use cache).

No output schema declared.

No examples provided.

list_proposals ~198

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.

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

No output schema declared.

No examples provided.

list_recent ~39

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

NameTypeReqDescription
limitintegerDefault 20.

No output schema declared.

No examples provided.

list_unprocessed ~106

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.

NameTypeReqDescription
limitintegerMaximum pending files to return. Default 50.

No output schema declared.

No examples provided.

margins_doctor ~89

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

margins_reset_proposals ~96

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/.

NameTypeReqDescription
confirmbooleanPass true to actually delete the pending proposals. Default false returns a dry-run preview.

No output schema declared.

No examples provided.

margins_start ~251

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

propose_compile_from_raw ~1,533

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/<wiki path>. 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.

NameTypeReqDescription
applicationsarrayConcrete questions or applications. Renders as `## Personal applications worth tracking`. 2-4 items typical.
bucketstringWiki bucket folder. 'sources', 'projects', 'ideas', 'meetings', 'career'. Pick by topic, not page-type.
destination_pathstringOverride destination path, e.g. 'wiki/career/source-2026-05-13-something.md'.
eventDatestringDate the source event occurred (YYYY-MM-DD). Defaults to today.
forcebooleanReplace 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 loca…
headerNotestringShort paragraph under the H1 giving venue/runtime/context (e.g. 'Stanford GSB fireside chat, ~45 min, published 2026-05-04').
hubBucketstringBucket folder for the hub + segment pages when split mode is set. Defaults to bucket if provided, else 'sources'.
keyLinksarrayWikilink slugs for the frontmatter key_links field, e.g. ['ellis-rutili', 'centric-wm', 'briefly']. Use slugs from get_vault_context.
maxSegmentsintegerCap on segments staged in a single split call. Default 50. Extra headings beyond the cap are noted in the hub but not staged.
pageTypestringPage shape. 'source' = faithful summary of one raw file (default). 'concept' = durable theme/idea. 'synthesis' = connection-point across multiple sources.
participantsarrayFor meeting/call pages: participant names. Renders as a participants frontmatter list.
propagationNotesstringEntity/concept creation decisions made or refused (per operator-manual rule #4). Renders as `## Propagation Notes`.
quietbooleanOmit 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…
rawPathstringyesVault-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 r…
relatedarrayRelated wiki pages. Either bare slug strings or {slug, note} objects. Renders as `## Related` with `[[wikilinks]]`.
relevanceCalloutobjectConnor-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.
sectionsarrayPrimary 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 verbat…
sourceCaveatstringSource-quality warning — renders as a `> [!info]+ Source caveat` callout. Use when the source has limitations (e.g. 'Granola summary, no transcript available').
sourceUrlstringExternal URL if the source has one (YouTube, blog post, public PDF). Renders as a markdown link in the header block.
sourcesarrayFor synthesis pages: list of evidence URLs. Renders as a sources frontmatter list.
splitstringSplit-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…
summarystringRich 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…
summaryBulletsarrayLEGACY — for the simple template only. If you provide `sections`, this is unused.
tagsarraySemantic 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.
takeawaysarrayLEGACY — for the simple template only. If you provide `sections`, this is unused. Either strings or {point, evidence} objects.
titlestringTitle for the page. Defaults to titlecased filename.

No output schema declared.

No examples provided.

propose_edit ~104

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/<path>.

NameTypeReqDescription
afterstringyesReplacement text. Empty string deletes the match.
beforestringyesExact text to replace. Must be unique in the file.
pathstringyesPage path relative to vault root.

No output schema declared.

No examples provided.

propose_entity_stubs ~254

Stage stub entity pages for a list of candidate slugs (typically from scan_entity_candidates). Each stub becomes a proposed page at wiki/<bucket>/<slug>.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.

NameTypeReqDescription
bucketstringBucket folder for the stubs. Default 'entities'. Pick a topical bucket if the candidates share a theme ('people', 'cases', 'firms').
candidatesarrayyesArray 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.

No output schema declared.

No examples provided.

propose_page ~103

Propose a new page in the vault. Body is the full markdown (frontmatter optional). The page is staged at proposed/<path> 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.

NameTypeReqDescription
bodystringyesFull markdown body to write.
pathstringyesDestination path relative to vault root, e.g. 'wiki/projects/foo.md'.

No output schema declared.

No examples provided.

propose_wikilinks ~340

Scan vault pages for entity-shaped phrases and propose wikilinks to other vault pages that share the same slug. Two modes: (1) single-page — pass `path`, get a ranked list of {phrase, wikilink, occurrences} for that one page. (2) scope — pass `scope` (glob/folder), scan every matching page using one shared slug index (much faster than calling repeatedly), get aggregated suggestions across pages. With `apply: true` in scope mode, Margins stages one rewritten page per scanned page (a propose_page proposal that replaces every candidate phrase with its wikilink). Apply mode preserves the proposal-review contract — nothing lands until resolve_proposal accepts. Useful for A3/B3 personas (many files, few wikilinks): scope across a folder finds entity references that already have target pages.

NameTypeReqDescription
applybooleanOnly meaningful in scope mode. When true, stage a rewritten page per scanned page with all wikilink suggestions applied (one propose_page per page, NOT per phrase). Review/accept via list_proposals +…
maxPagesintegerCap on pages scanned in scope mode. Default 50.
maxSuggestionsintegerCap on suggestions per page. Default 15.
pathstringPage path for single-page mode, e.g. 'wiki/career/career.md'. Mutually exclusive with scope.
scopestringGlob for bulk-scope mode, e.g. 'wiki/sources/**' or 'Anatomy/*.md'. Mutually exclusive with path.

No output schema declared.

No examples provided.

read_page ~59

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.

NameTypeReqDescription
pathstringyesPath relative to the vault root.

No output schema declared.

No examples provided.

recall_preferences ~62

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.

Input schema present but exposes no named parameters.

No output schema declared.

No examples provided.

record_preference ~133

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.

NameTypeReqDescription
categorystringOptional category tag. Examples: 'filing', 'naming', 'voice', 'structure'.
observationstringyesOne-line rule capturing the durable preference. Example: 'Mark Loh meeting notes file under wiki/projects/ not wiki/personal/.'

No output schema declared.

No examples provided.

record_telemetry_consent ~102

Record the user's choice on anonymous telemetry. Call this exactly once, only when the margins_start response had telemetryConsentNeeded=true AND the user has answered the in-chat opt-in question. Pass enabled=true if they said yes, enabled=false if they said no. The choice persists in ~/.margins/consent.json and applies to all future Margins sessions.

NameTypeReqDescription
enabledbooleanyesTrue if the user opted in, false if they declined.

No output schema declared.

No examples provided.

resolve_proposal ~250

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.

NameTypeReqDescription
actionstringyesWhether to apply or discard the matched proposal(s).
dryRunbooleanOnly meaningful with pattern. When true, return the list of paths that WOULD be affected without applying the action.
maxCountintegerOnly meaningful with pattern. Cap the number of proposals processed in a single call.
pathstringDestination path of a single proposal, with or without the 'proposed/' prefix. Mutually exclusive with pattern.
patternstringGlob to match destinationPath of multiple proposals. Supports *, **, ?. Mutually exclusive with path.

No output schema declared.

No examples provided.

scan_entity_candidates ~587

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.

NameTypeReqDescription
domainstringDomain 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 / Chapte…
excludeUserRejectionsarraySlugs 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.
limitintegerCap on candidates returned. Default 50. Total candidate count is in candidatesFound so callers can tell if there are more behind the cap.
minFileSpreadintegerMinimum 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.
minMentionsintegerMinimum total mentions across the scope before a candidate qualifies. Default 5. Lower to surface more (noisier); raise for high-confidence only.
minPhraseWordsintegerMinimum 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 thi…
scopestringGlob to limit the walk. Default 'wiki/**'. Pass a folder glob like 'Path/**' to scope to one subject. Supports *, **, ?.

No output schema declared.

No examples provided.

search ~42

ChatGPT Deep Research search. Returns a list of {id, title, url} where id is the vault path. Pair with fetch.

NameTypeReqDescription
querystringyes

No output schema declared.

No examples provided.

search_vault ~57

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

NameTypeReqDescription
limitintegerMax results to return. Default 10.
querystringyesSearch string. Case-insensitive substring.

No output schema declared.

No examples provided.

Common questions

What is the Margins MCP server?

Margins is an MCP server listed in the public MCP registry as io.github.cflorczyk9/margins. Use your Claude Pro/Max subscription on your Obsidian vault. Reads markdown, proposes writes. This page covers its npm package (margins-mcp).

Is the Margins MCP server safe to use?

Margins scores 92 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Margins MCP server expose?

Margins exposes 23 tools: margins_start, recall_preferences, get_vault_context, record_telemetry_consent, record_preference, and 18 more. Their descriptions and schemas cost roughly 4,765 tokens of context every time the server is loaded.

Is the Margins MCP server still maintained?

Margins is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Margins MCP server under?

Margins declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.