π Scan PDFs. βοΈ Transcribe handwriting. π€ Ask Claude anything. π Zero personal data leaves your Mac.
Obsidian users have built elaborate second brains β journals, medical notes, financial records, scanned contracts, handwritten meeting notes. The vault becomes deeply personal. Then AI arrives, and the promise is irresistible: βAsk your entire knowledge base a question.β
But thereβs a catch.
Every plugin that connects your vault to a cloud LLM (Claude, GPT-4, Gemini) sends your raw notes upstream. Social Security Numbers, credit card numbers, medical diagnoses, client names β all of it lands on a third-party server. For anyone who takes their vault seriously, this is a dealbreaker.
The alternatives are bleak: run a weak local LLM and accept lower quality, or redact manually before every query. Neither is sustainable.
β This guide introduces a third path.
Two open-source MCP servers, both by the same author, designed to work together:
| Package | What it does | Key technology |
|---|---|---|
macos-vision-mcp |
πΈ Extracts text from PDFs, images, and handwritten notes | Apple Vision framework β fully offline |
pseudonym-mcp |
π΅οΈ Replaces PII with opaque tokens before any cloud call | Regex NER + local Ollama β fully offline |
Both run on your Mac. Neither sends data anywhere. Together, they form a complete local privacy pipeline between your vault and any cloud LLM.
ποΈ Your Obsidian Vault
β
βββ π Markdown notes (.md)
β β
β ββββΊ pseudonym-mcp
β mask_text()
β β
βββ π Scanned files (.pdf, .jpg, .png)
β
ββββΊ macos-vision-mcp
extract_text()
β
ββββΊ pseudonym-mcp
mask_text()
β
βΌ
[PERSON:1], [SSN:1],
[CREDIT_CARD:1], [EMAIL:1]...
β
βΌ
βοΈ Cloud LLM API
(Claude / GPT-4 / Gemini)
β
response with
tokens only
β
βΌ
π pseudonym-mcp
unmask_text()
β
βΌ
β
You see real names & data
At no point does any personal data leave your machine. The cloud LLM reasons about structure and content β never about identities.
Step 1 β Add both servers to Claude Desktop:
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"macos-vision-mcp": {
"command": "npx",
"args": ["-y", "macos-vision-mcp"]
},
"pseudonym-mcp": {
"command": "npx",
"args": ["-y", "pseudonym-mcp", "--engines", "hybrid"]
}
}
}
Restart Claude Desktop. Both tool sets appear automatically. β¨
Step 2 β Pull an Ollama model (optional, for full NER including names and organisations):
ollama pull llama3
π‘ Skip this if you only need regex-based masking (SSN, credit cards, email, phone).
Step 3 β For Claude Code:
claude mcp add macos-vision-mcp -- npx -y macos-vision-mcp
claude mcp add pseudonym-mcp -- npx -y pseudonym-mcp --engines hybrid
You have a PDF scan of a lease agreement in your vault:
vault/legal/lease_agreement_2026.pdf
In Claude Desktop or Claude Code:
Extract text from vault/legal/lease_agreement_2026.pdf using macos-vision-mcp,
then mask all PII with pseudonym-mcp (save the session_id),
then summarise the key obligations, deadlines, and termination conditions.
Finally, restore the response using the session_id.
π What happens:
You photograph a page from your notebook and drop it into the vault:
vault/journal/2026-04-12.jpg
Transcribe my handwritten note at vault/journal/2026-04-12.jpg
and save it as vault/journal/2026-04-12.md
Apple Vision handles handwriting recognition natively. The resulting Markdown note is fully searchable inside Obsidian. π
You keep iPhone camera scans of receipts in your vault:
vault/finance/receipts/april/
Extract text from all images in vault/finance/receipts/april/,
mask PII with pseudonym-mcp (single session for all files),
then create a categorised expense summary for April 2026
and save it as vault/finance/2026-04-summary.md
Credit card numbers, account holders, and names are tokenised before Claude sees them. π
This is the most powerful use case β a session that spans multiple notes:
# Step 1: mask vault notes, save the session_id
Use mask_text on all notes in vault/work/ β remember the session_id
# Step 2: ask anything
Which clients did I meet most frequently in Q1 2026?
What were the main topics across my meetings with [PERSON:1]?
# Step 3: restore when done
Use unmask_text with the saved session_id on the response
π‘
[PERSON:1]always refers to the same person across all notes in the session β Claude can reason about relationships and patterns without ever knowing real identities.
vault/health/2026-03-cardiology-visit.md
Mask this note with pseudonym-mcp, then explain the diagnosis in plain language
and suggest questions I should ask at my next appointment.
Your doctorβs name, SSN, and diagnosis are tokenised locally. The cloud provider never processes your Protected Health Information (PHI). No Business Associate Agreement (BAA) required. β
Instead of typing the full pipeline every time, pseudonym-mcp ships two built-in prompt templates that chain masking, the LLM task, and unmasking automatically.
pseudonymize_task β inline text/pseudonymize_task text="Meeting with Jan Kowalski (PESEL: 90010112318). Contract: 45 000 zΕ." task="Extract action items"
What happens:
[PERSON:1], [PESEL:1]Optional lang argument: en (default) or pl.
privacy_scan_file β file or PDFRequires macos-vision-mcp to be installed alongside pseudonym-mcp.
/privacy_scan_file filePath="/Users/me/vault/contracts/nda.pdf" task="Summarize obligations and deadlines"
What happens:
Optional arguments: task (default: summarize the key points), lang (en or pl).
--lang en, default)| Token | Covers |
|---|---|
[PERSON:1] |
π€ Full names (via Ollama NER) |
[SSN:1] |
πͺͺ Social Security Numbers β with area-number validation |
[CREDIT_CARD:1] |
π³ 13β19 digit card numbers β with Luhn checksum |
[EMAIL:1] |
π§ Email addresses |
[PHONE:1] |
π± US phone formats |
[ORG:1] |
π’ Organisation names (via Ollama NER) |
π International users:
--lang pladds support for PESEL (national ID), Polish IBAN, and Polish phone formats.
| Regulation | Who it affects | How the pipeline helps |
|---|---|---|
| πΊπΈ HIPAA | Healthcare providers, patients | PHI never reaches a non-BAA cloud provider |
| π³ PCI DSS 3.4 | Anyone storing card data | Card numbers masked before LLM transit |
| πΊπΈ CCPA / CPRA | California residents & businesses | Minimises personal data sent to third-party processors |
| π’ SOC 2 | SaaS & enterprise | Demonstrates PII leaves no trust boundary |
| πͺπΊ GDPR Art. 44 | EU users & businesses | If no personal data is transferred, cross-border restrictions do not apply |
β οΈ Note: Pseudonymisation does not equal anonymisation β the data remains personal data in your local system. However, it substantially reduces risk and demonstrates compliance with accountability principles.
Obsidianβs core philosophy is local-first: your data lives on your device, in plain text, under your control. Every file is yours.
Cloud AI plugins break this contract the moment they send vault content upstream. macos-vision-mcp + pseudonym-mcp extend the local-first principle to AI: βοΈ cloud model quality, π local data sovereignty.
Your second brain stays yours. π§ π
// Claude Desktop β ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"macos-vision-mcp": {
"command": "npx",
"args": ["-y", "macos-vision-mcp"]
},
"pseudonym-mcp": {
"command": "npx",
"args": ["-y", "pseudonym-mcp", "--engines", "hybrid"]
}
}
}
# Claude Code
claude mcp add macos-vision-mcp -- npx -y macos-vision-mcp
claude mcp add pseudonym-mcp -- npx -y pseudonym-mcp --engines hybrid
# Optional: full NER (names + organisations)
ollama pull llama3