Atlas / MCP servers / zhitongblog / SoloMD

SoloMDBLOCK

mcp/zhitongblog/solomd

A markdown editor — and the bridge to your LLM. Local-first, MIT, ~15 MB. Bundled MCP server lets Claude Code / Codex / Cursor drive your vault directly. 14 AI providers BYOK.

Verdict
BLOCK
Grade
F
Trust score
30 /100
Exposed tools
—
Transport
stdio · streamable-http
License
MIT
Stars
1,130
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

The editor where agents live.

[](https://github.com/zhitongblog/solomd/releases/latest) [](LICENSE) [](https://github.com/zhitongblog/solomd/releases) [](https://solomd.app)

🌐 中文 · 日本語 · 한국어 · Deutsch · Français · Español · Português · Italiano · Polski · Nederlands · Türkçe · Svenska · Українська · 🪞 [Gitee mirror →](https://gitee.com/zhitong45/solomd) (faster downloads from China)

**Download the latest release** · **Launch post** · **How we built it** · **Website** · **Security**

### 🤖 Built and maintained by Claude SoloMD is written, tested and released almost entirely by Claude Code, Anthropic's coding agent, working under a human maintainer who sets the direction and decides what ships. Issues and pull requests are triaged and answered by Claude as well — the replies you get here are written by an AI, not typed by a person. We are telling you this for two reasons. You should know what you are trusting with your notes: read the code, it is MIT and all of it is public. And when a reply is confidently wrong — it happens — say so in the thread. That correction is the mechanism.

Your notes live in a folder. **SoloMD is the editor on top — with

Read from source at commit b7c64ad6eb8fOBSERVED · 2026-09-28
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add solomd-web --env ASC_KEY_ID=${ASC_KEY_ID} --env ASC_KEY_PATH=${ASC_KEY_PATH} --env KEY=${KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "solomd-web": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "ASC_KEY_ID": "${ASC_KEY_ID}",
        "ASC_KEY_PATH": "${ASC_KEY_PATH}",
        "KEY": "${KEY}"
      }
    }
  }
}
03

Trust audit

BLOCKgrade F · trust 30/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryFAIL
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (9 observation(s))
Network
declared (12 observation(s))
Shell
declared (6 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (25)

HIGHInventory / provenance · inv.suspicious_name · CWE-1104
design-icons/dark-C2.png
dark-C2.png
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHInventory / provenance · inv.suspicious_name · CWE-1104
design-icons/dark-C2.svg
dark-C2.svg
Why it matters. member named after an attack tool
Fix. remove or justify
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
app/src/lib/frontmatter.ts:52
const parsed = yaml.load(inner);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
app/src/lib/markdown.ts:631
parsed = yaml.load(raw);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
app/src/lib/viewFile.ts:488
parsed = yaml.load(text);
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
web-clipper/scripts/test-markdown.mjs:46
new Function('module', 'exports', code)(moduleScope, moduleScope.exports);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
marketing-zh/DEV-STORY.md:196
- ``(零宽空格)、``(零宽非连接符)等不可见字符
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMInventory / provenance · inv.binary · CWE-1104
app/src-tauri/icons/file_icon.icns
file_icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
app/src-tauri/icons/icon.icns
icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
app/src-tauri/windows/banner.bmp
banner.bmp
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
app/src-tauri/windows/dialog.bmp
dialog.bmp
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMInventory / provenance · inv.binary · CWE-1104
brand/file_icon.icns
file_icon.icns
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/competitor-feedback/SKILL.md:36
`http://127.0.0.1:9399`** (a real headless Chromium: JS rendering, anti-bot,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.agents/skills/competitor-feedback/unzoo.sh:16
BASE="${UNZOO_BASE:-http://127.0.0.1:9399/api/v1}"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.claude/skills/competitor-feedback/SKILL.md:36
`http://127.0.0.1:9399`** (a real headless Chromium: JS rendering, anti-bot,
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.claude/skills/competitor-feedback/unzoo.sh:16
BASE="${UNZOO_BASE:-http://127.0.0.1:9399/api/v1}"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
.claude/skills/store-submit/SKILL.md:123
curl -s --noproxy '*' http://127.0.0.1:9399/api/v1/openapi.json
MEDIUMObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
app/src/styles/cjk-font.css:7
src: url("data:font/woff2;base64,d09GMgABAAAAAKnQAA0AAAABH1AAAKl5AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAqSACSZAqEmlCDqBkBNgIkA4MSC4MSAAQgBYMaByAXJBiDEhug47OipDcjNBIhbBwCQRjDrAg2DgAS8ori/3jcGAMK8vwLDiKyUnl
MEDIUMObfuscation / stealth · obf.homoglyph · CWE-506, CWE-94
app/src/lib/cm-live-preview.ts:202
'.tok-meta, .cm-formatting, .ͼe': {
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
app/src/composables/useInbox.ts:52
const bom = body.startsWith('') ? '' : '';
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
app/src/composables/useInbox.ts:85
const trimmed = body.startsWith('') ? body.slice(1) : body;
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
app/src/composables/useRelationships.ts:57
const bom = doc.startsWith('') ? '' : '';
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
app/src/composables/useRelationships.ts:80
const bom = doc.startsWith('') ? '' : '';
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
app/src/composables/useWritingGoals.ts:29
const FRONT_MATTER_RE = /^?---\r?\n([\s\S]*?)\r?\n---/;
LOWInventory / provenance · inv.hidden_file · CWE-1104
.agents/skills/competitor-feedback/.last-scan
.last-scan
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose

Gates applied: no_behavioural_pass.

Audited 2026-09-28 · audit v0.4.1 · source sha b7c64ad6eb8ffull audit observations/trust-audit/mcp-server/zhitongblog__solomd.json · Report an issue / request a re-scan
04

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-09-28b7c64ad6eb8fBLOCKF30first audit
05

Questions

What is the SoloMD MCP server?

A markdown editor — and the bridge to your LLM. Local-first, MIT, ~15 MB. Bundled MCP server lets Claude Code / Codex / Cursor drive your vault directly. 14 AI providers BYOK.

Is SoloMD safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (30/100) and found 7 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does SoloMD need?

It reads ASC_KEY_ID, ASC_KEY_PATH and KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does SoloMD run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as solomd-web at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (b7c64ad6eb8f), read on 2026-09-28. The repository is watched and re-audited when it changes.

Advertisement