MCP, MCP server
muninn
Your AI coding agent forgets everything between sessions.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
INSTALL_REMOTE_SCRIPT SECRETS_PATH_CREDENTIAL OBFUSCATION_ENCODED_BLOB
Why this grade
- INSTALL_REMOTE_SCRIPT Medium
Fetches a script from the network and runs it (a pipe to a shell, or an install hook with a URL).
install.sh, line 15
echo " curl -fsSL https://bun.sh/install | bash" - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
src/commands/infra/server.ts, line 38
* - ~/.ssh/ - OBFUSCATION_ENCODED_BLOB Medium
Contains a long base64 shaped string in a file that should be readable.
dashboard-dist/assets/index-6PKoUFgn.js, line 1
function gn(n,t){return n==null||t==null?NaN:n<t?-1:n>t?1:n>=t?0:NaN}function k0(n,t){return n==null||t==null?NaN:t<n?-1:t>n?1:t>=n?0:NaN}function _u(n){let t,e,r;n.length!==2?(t=g
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.
If you think this grade is wrong, email [email protected] with the entry link and your evidence. We aim to acknowledge within two working days and decide within seven. If we confirm an error, we aim to correct it within 24 hours of confirming it. These are aims, not guarantees.
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
Pass
No shell or command execution found, and no extra permission was declared.
Install and update
Serious
install fetches a script from the network. The docs document an installer that pipes a download into a shell.
INSTALL_REMOTE_SCRIPT INSTALL_DOCUMENTED_INSTALLER
install.sh, line 15
echo " curl -fsSL https://bun.sh/install | bash"
npm/install.mjs, line 42
if (!run("curl -fsSL https://bun.sh/install | bash")) {
scripts/setup-node.sh, line 24
curl -fsSL https://bun.sh/install | bash
Show more
package.json, line 31
prepare
cloud/web/.svelte-kit/output/client/_app/immutable/nodes/9.DJTP-6Ik.js, line 1
import{a as h,f as x}from"../chunks/BQbrFHdE.js";import"../chunks/B9drQv7w.js";import{s,q as f,l as v,$ as g,i as e,j as t,n as b}from"../chunks/DEIXV2yr.js";import{h as k}from"../
cloud/web/.svelte-kit/output/prerendered/pages/docs.html, line 39
<div style="display: contents"><!--[--><!--[--><!--[--><!--[--><!--[--><nav class="fixed top-0 w-full z-50 border-b border-zinc-800/50 bg-zinc-950/80 backdrop-blur-md"><div class="
cloud/web/.svelte-kit/output/server/entries/pages/(marketing)/docs/_page.svelte.js, line 10
CodeBlock($$renderer, { code: "curl -fsSL https://claude.ai/install.sh | bash" });
cloud/web/src/routes/(marketing)/docs/+page.svelte, line 35
<CodeBlock code="curl -fsSL https://claude.ai/install.sh | bash" />
Network
Concern
can reach a host that is not written as a fixed address. can reach api.anthropic.com. The description does not name that host. can reach api.muninn.pro. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
api/src/services/embedder.ts, line 81
const response = await fetch(VOYAGE_API_URL, {
api/src/services/embedder.ts, line 119
const response = await fetch(VOYAGE_API_URL, {
cloud/src/tenants/turso.ts, line 32
const res = await fetch(url, {
Show more
cloud/web/src/lib/api.ts, line 63
const res = await fetch(`${API_BASE}${path}`, {
dashboard-dist/assets/index-m3kNPq76.js, line 1
(i){if(i.ep)return;i.ep=!0;const a=r(i);fetch(i.href,a)}})();var Ys,Js;const $s=(Js=(Y
dashboard-dist/assets/index-m3kNPq76.js, line 23
){const t=`${xs}${e}`;let r;try{r=await fetch(t)}catch(s){throw new Error(`Network err
scripts/apply-migrations-http.ts, line 37
const resp = await fetch(PIPELINE_URL, {
scripts/apply-migrations-http.ts, line 51
const resp = await fetch(PIPELINE_URL, {
src/web-server.ts, line 142
const indexRes = await fetch(`http://localhost:${port}/`);
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
api/src/middleware/auth.ts, line 39
const raw = process.env.API_KEYS ?? "";
api/src/services/embedder.ts, line 33
return process.env.VOYAGE_API_KEY ?? null;
src/commands/infra/server.ts, line 38
* - ~/.ssh/
Show more
cloud/src/server.ts, line 118
const metricsToken = process.env.METRICS_TOKEN;
cloud/src/api/webhook-routes.ts, line 69
const secret = process.env.GITHUB_WEBHOOK_SECRET;
cloud/src/auth/routes.ts, line 31
const CSRF_SECRET = process.env.CSRF_SECRET || crypto.randomUUID();
cloud/src/auth/routes.ts, line 32
if (!process.env.CSRF_SECRET) {
cloud/src/auth/routes.ts, line 33
console.warn("[muninn-cloud] WARNING: CSRF_SECRET not set - using random value. OAuth forms will break on restart. Set CSRF_SECRET in .env.");
cloud/src/billing/stripe.ts, line 19
const key = process.env.STRIPE_SECRET_KEY;
cloud/src/billing/stripe.ts, line 114
const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET;
src/commands/analysis.ts, line 110
} else if ([".json", ".yaml", ".yml", ".toml", ".env"].includes(ext)) {
src/commands/infra/server.ts, line 57
`SSH key path must be within ~/.ssh/, /etc/ssh/, or current directory. Got: ${keyPath}`
src/commands/infra/server.ts, line 115
"Usage: context infra server add <name> --ip <ip> [--role production|homelab] [--user root] [--port 22] [--key ~/.ssh/id_ed25519]"
src/commands/infra/status.ts, line 315
context infra server add <name> --ip <ip> [--role production|homelab] [--user root] [--key ~/.ssh/id_ed25519]
cloud/.env.example, line 2
# Copy to .env and fill in values: cp .env.example .env
cloud/docs/operations.md, line 224
# Copy connection URL and token to .env
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
dashboard-dist/assets/index-6PKoUFgn.js, line 1
function gn(n,t){return n==null||t==null?NaN:n<t?-1:n>t?1:n>=t?0:NaN}function k0(n,t){return n==null||t==null?NaN:t<n?-1:t>n?1:t>=n?0:NaN}function _u(n){let t,e,r;n.length!==2?(t=g
src/team/pr-reviews.ts, line 1
/**
cloud/web/.svelte-kit/output/client/_app/immutable/chunks/6PKoUFgn.js, line 5
`)}function f(h){return h.map(c).join(n)}function c(h){return h==null?"":h instanceof Date?j2(h):t.test(h+="")?'"'+h.replace(/"/g,'""')+'"':h}return{parse:r,parseRows:i,format:a,fo
Show more
dashboard-dist/assets/index-6PKoUFgn.js, line 5
`)}function f(h){return h.map(c).join(n)}function c(h){return h==null?"":h instanceof Date?j2(h):t.test(h+="")?'"'+h.replace(/"/g,'""')+'"':h}return{parse:r,parseRows:i,format:a,fo
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 334e0bc8a5fd. install fetches a script from the network. The docs document an installer that pipes a download into a shell. can reach a host that is not written as a fixed address. can reach api.anthropic.com. The description does not name that host. can reach api.muninn.pro. The description does not name that host. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: 334e0bc8a5fd7c4cf2bf87f4cf535659bbb95d21
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.