MCP, MCP server
Scrivener Mcp
Scrivener Mcp, an MCP server listed in the PlugVet directory.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit 230a3bbffecc.
INSTALL_REMOTE_SCRIPT SECRETS_PATH_CREDENTIAL
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).
scripts/bootstrap-mac.sh, line 8
# Usage: curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh - SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
src/handlers/database/auto-installer.ts, line 771
const configPath = path.join(configDir, 'credentials.json');
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
scripts/check-output-conformance.mjs, line 185
fs.rmSync(tmp, { recursive: true, force: true });
scripts/check-save-roundtrip.mjs, line 20
await fs.rm(path.join(projectPath, 'Files/user.lock'), { force: true });
src/memory-manager.ts, line 271
await fs.unlink(buildPath(this.memoryPath, backup));
Show more
src/core/response-formatter.ts, line 151
if (stat.mtimeMs < cutoff) fs.unlinkSync(filepath);
src/handlers/database/auto-installer.ts, line 592
fs.unlink(destination).catch((err) =>
src/services/project-loader.ts, line 353
await fs.unlink(backup.path);
src/utils/project-utils.ts, line 128
await fs.unlink(lockPath).catch(() => {});
src/utils/project-utils.ts, line 150
await fs.unlink(lockPath).catch(() => {});
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
scripts/bootstrap-mac.sh, line 8
# Usage: curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh
src/cli/setup.ts, line 121
curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh`;
package.json, line 53
postinstall
Show more
package.json, line 52
prepare
docs/CLIENT_SETUP.md, line 27
curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh
docs/install-mac.md, line 26
curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh
docs/install-mac.md, line 55
curl -fsSL https://raw.githubusercontent.com/writerslogic/scrivener-mcp/main/scripts/bootstrap-mac.sh | sh -s -- --check
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
install.sh, line 119
PREREQ="curl wget unzip tar"
install.sh, line 199
RDLATEST=$(curl https://api.github.com/repos/rustdesk/rustdesk-server/releases/latest -s | grep "tag_name" | awk -F'"' '{print $4}')
install.sh, line 307
wget https://raw.githubusercontent.com/dinger1986/rustdeskinstall/master/WindowsAgentAIOInstall.ps1
Show more
install.sh, line 311
wget https://raw.githubusercontent.com/dinger1986/rustdeskinstall/master/linuxclientinstall.sh
install.sh, line 323
GOHTTPLATEST=$(curl https://api.github.com/repos/codeskyblue/gohttpserver/releases/latest -s | grep "tag_name"| awk '{print substr($2, 2, length($2)-3) }')
apps/mac/scripts/stage-bundle.sh, line 31
curl -fsSL --proto '=https' --tlsv1.2 "$BASE/SHASUMS256.txt" -o "$BUILD/cache/SHASUMS256.txt"
apps/mac/scripts/stage-bundle.sh, line 36
curl -fsSL --proto '=https' --tlsv1.2 "$BASE/$FILE" -o "$BUILD/cache/$FILE"
scripts/bootstrap-mac.sh, line 88
curl -fsSL --proto '=https' --tlsv1.2 "$base/SHASUMS256.txt" -o "$tmp/SHASUMS256.txt" \
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
scripts/check-output-conformance.mjs, line 101
delete process.env.ANTHROPIC_API_KEY;
scripts/check-output-conformance.mjs, line 102
delete process.env.OPENAI_API_KEY;
src/handlers/database/auto-installer.ts, line 771
const configPath = path.join(configDir, 'credentials.json');
Show more
src/index.ts, line 193
openaiApiKey: process.env.OPENAI_API_KEY,
src/scrivener-project.ts, line 227
openaiApiKey: process.env.OPENAI_API_KEY,
src/handlers/database/config.ts, line 32
password: process.env.NEO4J_PASSWORD || 'scrivener-mcp',
src/services/ai/ai-client.ts, line 86
anthropic: options.anthropicApiKey ?? process.env.ANTHROPIC_API_KEY,
src/services/ai/ai-client.ts, line 87
openai: options.openaiApiKey ?? process.env.OPENAI_API_KEY,
src/services/ai/ai-client.ts, line 88
openrouter: options.openrouterApiKey ?? process.env.OPENROUTER_API_KEY,
src/core/config-manager.ts, line 434
path.join(baseDir, '.env'),
src/core/config-manager.ts, line 502
} else if (configPath.includes('.env')) {
src/handlers/database/auto-installer.ts, line 778
// Also create .env file if it doesn't exist
src/handlers/database/auto-installer.ts, line 779
const envPath = path.join(projectPath, '.env');
src/handlers/database/database-service.ts, line 167
'To enable automatic Neo4j installation: Set NEO4J_AUTO_INSTALL=true in your .env file or run: NEO4J_AUTO_INSTALL=true npm start'
src/handlers/database/database-setup.ts, line 109
// Check for .env file in project
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read.
OBFUSCATION_FILE_OVER_READ_CAP
package-lock.json, line 1
{
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 230a3bbffecc. can delete files. install fetches a script from the network. 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. a file was over the read cap and was not fully read.
Date and source
Date checked:
github.com
Commit graded: 230a3bbffecccdf0a0c050a70c788352d704d8ba
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.