MCP, MCP server
Llm Wiki Monorepo
Agent-native knowledge compiler. AI agents turn raw documents into persistent, cross-linked Markdown wikis. No database.
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 SECRETS_PATH_DOTENV SECRETS_ENV_READ OBFUSCATION_FILE_CAP_REACHED
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
_verify.py, line 11
rc = subprocess.run([PY, "skill/scripts/health_check.py", "tests/fixtures/wikis/populated", "--quiet"], - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
src/llm_wiki/providers/opencode.py, line 67
with urllib.request.urlopen(req, timeout=timeout) as resp: - SECRETS_PATH_DOTENV Low
Mentions a .env file.
.env.example, line 2
# Copy to .env and fill in your values. - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
src/llm_wiki/providers/registry.py, line 72
if os.environ.get("OPENAI_API_KEY"): - OBFUSCATION_FILE_CAP_REACHED Note
The 400 file cap was reached before every file was read.
src/llm_wiki/templates/personal-growth/SCHEMA.md, line 1
# Personal Growth Schema
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
_verify.py, line 11
rc = subprocess.run([PY, "skill/scripts/health_check.py", "tests/fixtures/wikis/populated", "--quiet"],
_verify.py, line 21
rc = subprocess.run([PY, script, "--help"], capture_output=True, text=True, timeout=15)
_verify.py, line 27
rc = subprocess.run([PY, "-c", """
Show more
_verify_modularization.py, line 57
r = subprocess.run(
_verify_modularization.py, line 79
r = subprocess.run(
_verify_modularization.py, line 87
r = subprocess.run(
_verify_modularization.py, line 115
r = subprocess.run([sys.executable, "-m", "llm_wiki", "--version"], capture_output=True, text=True, timeout=5, env=env)
mcp-server/src/review.ts, line 296
await fs.unlink(sourceFile);
mcp-server/src/storage.ts, line 49
await fs.unlink(filePath).catch(() => {});
mcp-server/src/storage.ts, line 102
await fs.unlink(fullPath);
mcp-server/src/storage.ts, line 111
await fs.unlink(fullPath);
plugins/obsidian-audit/scripts/link.mjs, line 25
fs.unlinkSync(targetDir);
scripts/curate_gold_set.py, line 272
result = subprocess.run(
skill/scripts/regenerate_fixtures.py, line 176
shutil.rmtree(wiki_root)
skill/scripts/sidecar.py, line 31
shutil.rmtree(SIDECAR_TMP)
src/llm_wiki/ops/benchmark.py, line 255
shutil.rmtree(WORKSPACE)
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.
NETWORK_NO_FIXED_HOST
src/llm_wiki/providers/opencode.py, line 67
with urllib.request.urlopen(req, timeout=timeout) as resp:
web-viewer/client/feedback.ts, line 106
const res = await fetch("/api/audit", {
web-viewer/client/main.ts, line 105
const cfg = await fetch("/api/config").then((r) => r.json());
Show more
web-viewer/client/main.ts, line 110
const tree = await fetch("/api/tree").then((r) => r.json());
web-viewer/client/main.ts, line 164
const resp = await fetch("/api/graph/derived");
web-viewer/client/main.ts, line 177
const data = (await fetch("/api/graph").then((r) => r.json())) as GraphData;
web-viewer/client/main.ts, line 324
const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`);
web-viewer/client/main.ts, line 362
const res = await fetch("/api/graph-insights");
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
src/llm_wiki/providers/registry.py, line 72
if os.environ.get("OPENAI_API_KEY"):
src/llm_wiki/providers/registry.py, line 74
if os.environ.get("ANTHROPIC_API_KEY"):
.env.example, line 2
# Copy to .env and fill in your values.
Show more
src/llm_wiki/providers/registry.py, line 76
if os.environ.get("DEEPSEEK_API_KEY"):
src/llm_wiki/providers/registry.py, line 78
if os.environ.get("TOGETHER_API_KEY"):
.gitignore, line 7
# Environment / secrets - never commit credentials (keep the template)
.gitignore, line 8
.env
.gitignore, line 10
!.env.example
AGENTS.md, line 260
Never commit `.env` or secrets into a wiki repo. See
README.md, line 321
- **Configuration (optional)** - copy [`.env.example`](.env.example) to `.env` for provider keys and agent-native overrides. `.env` is gitignored - never commit it or any secret in
SECURITY.md, line 37
- **Never commit secrets.** No `.env`, API keys, tokens, or credentials in a
SECURITY.md, line 38
wiki repo. Start from [`.env.example`](.env.example) and keep `.env`
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
the file cap was reached before every file was read.
OBFUSCATION_FILE_CAP_REACHED
src/llm_wiki/templates/personal-growth/SCHEMA.md, line 1
# Personal Growth Schema
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 bf791edf3bd3. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: bf791edf3bd38a8b9c39068436f58af189d46832
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.