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

Margins

NPM · MARGINS-MCP · SCANNED AUG 3

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

Available components

+34 this week 76 Trust /100
Trust breakdown (6 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 →

Supply Chain Security88
  • No malware found by supply-chain analysis.Pass
  • Only part of the dependency tree could be resolved (137 of 141), so this covers what we could see, not the whole tree.Partial
  • No install/post-install scripts declared.Pass
  • Only part of the dependency tree could be resolved (137 of 141), so this covers what we could see, not the whole tree. 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 73 days ago).Pass
  • Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability55
  • AI-judged instruction clarity (good).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 Management27
  • Stability observed for 8 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
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Install

Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.

npm · margins-mcp

# add to Claude Code
claude mcp add cflorczyk9-margins -- npx -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"]
// 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.

  • 3 Aug 26 +1

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

  • 2 Aug 26 +52
    • Provenance: unverified → pass security
    • Known CVEs: unverified → partial security
    • Install scripts: unverified → pass security
    • Malware scan: unverified → pass security
    • Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet. security
    • The attested source repository moved: cflorczyk9/Margins security
    • Capabilities: pass → unverified functional
    • License: unverified → pass functional
    • Stability: unverified → 0.23 functional
    • Dependency health: unverified → partial functional
    • Maintenance: unverified → pass functional
    • Schema quality: unverified → good functional
    • Licence: MIT functional
  • 1 Aug 26 +5
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • MCP protocol: unverified → pass functional
  • 31 Jul 26 −24
    • We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
  • 27 Jul 26 42

    First indexed and scored.

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 3 Aug 2026 · Analysed npm/[email protected]

Provenance verified

Ecosystem: npm · Outcome: verified

Reason: verified

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
Discovery method:
attestation_endpoint
Dependencies 137 packages

137 packages in the resolved dependency tree · 122 deprecated · 47 stale.

The dependency tree was only partially resolved, so these counts may be incomplete.

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.

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.