MCP, MCP server
Obsidian Mcp Brain
Agent skills and agents for working with an Obsidian vault through the obsidian-mcp-brain MCP server: reading PDFs and other binary files, and uploading local files.
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV SECRETS_ENV_READ
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1353
await fs.unlink(dest).catch(() => {}); - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
docker/healthcheck.mjs, line 33
const res = await fetch(url, { signal: AbortSignal.timeout(4000) }); - NETWORK_UNNAMED_HOST Low
Calls a fixed host that the description does not name.
docker/healthcheck.mjs, line 33
const res = await fetch(url, { signal: AbortSignal.timeout(4000) }); - SECRETS_PATH_DOTENV Low
Mentions a .env file.
docs/install/install-docker.md, line 92
put both in a `.env` file next to the compose file: - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
mcp-shim/mcp-shim.mjs, line 31
const TOKEN = process.env.MCP_TOKEN ?? null;
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1353
await fs.unlink(dest).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1359
await fs.unlink(tmp).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1429
await fs.unlink(candidate).catch(() => {});
Show more
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1436
await fs.unlink(trash).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1443
await fs.unlink(trash).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1449
await fs.unlink(trash).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1457
await fs.unlink(tmp).catch(() => {});
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 1506
const discard = () => fs.unlink(stagePath).catch(() => {});
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Concern
can reach a host that is not written as a fixed address. can reach api.github.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
docker/healthcheck.mjs, line 33
const res = await fetch(url, { signal: AbortSignal.timeout(4000) });
docker/smoke-test.mjs, line 57
const res = await fetch(`http://127.0.0.1:${PORT}/mcp`, {
docker/smoke-test.mjs, line 118
const discovery = await fetch(`http://127.0.0.1:${PORT}/.well-known/oauth-protected-resource`);
Show more
mcp-shim/mcp-shim.mjs, line 103
const req = https.request(
mcp-shim/mcp-shim.mjs, line 115
const n = https.request({ hostname, port: port || 443, path: pathname, method: "POST",
mcp-shim/mcp-shim.mjs, line 143
const req = https.request(
mcp-shim/mcp-shim.mjs, line 200
const req = https.request({
mcp-shim/mcp-shim.mjs, line 224
const req = https.request(
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 709
+ 'The result is a URL and a ready-to-run command: `curl --fail-with-body -sS -T <file> <url>`. '
obsidian-mcp-brain/obsidian-mcp-brain.mjs, line 714
+ 'If the upload-file skill is installed, use its upload-file.sh script, which does the hashing and the curl call for you; get-setup-status says how to install it. '
docs/install/install-cloudflare-oauth.md, line 274
const tokenResponse = await fetch('https://github.com/login/oauth/access_token', {
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
mcp-shim/mcp-shim.mjs, line 31
const TOKEN = process.env.MCP_TOKEN ?? null;
docs/install/install-docker.md, line 92
put both in a `.env` file next to the compose file:
docs/install/install-docker.md, line 95
printf 'UID=%s\nGID=%s\n' "$(id -u)" "$(id -g)" > .env
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Pass
No encoded or minified payload found.
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit 031669a1a7e3. can delete files. can reach a host that is not written as a fixed address. can reach api.github.com. The description does not name that host. reads a credential or environment file.
Date and source
Date checked:
github.com
Commit graded: 031669a1a7e3ab2f7910ef2a1f52a5c517b8c96c
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.