MCP, MCP server
markupr
markupr, an MCP server listed in the PlugVet directory.
Compatibility: Not stated.
Grade C
One Medium finding. Read the findings before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit f02650b49c0b, unchanged since the check below.
INSTALL_LIFECYCLE_HOOK
Why this grade
- INSTALL_LIFECYCLE_HOOK Medium
A package install hook (preinstall, install, postinstall or prepare) runs a script.
package.json, line 14
postinstall
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/generate-icons.mjs, line 74
fs.rmSync(iconsetDir, { recursive: true });
scripts/generate-icons.mjs, line 218
fs.unlinkSync(tempSvgPath);
src/main/CrashRecovery.ts, line 591
fs.unlink(this.crashLogPath).catch(() => {
Show more
src/main/index.ts, line 884
await fs.unlink(artifact.tempPath).catch(() => {
src/main/index.ts, line 1033
await fs.unlink(artifact.tempPath).catch(() => {
src/main/index.ts, line 1404
await fs.unlink(artifact.tempPath).catch(() => {
src/main/index.ts, line 1736
await fs.unlink(artifact.tempPath).catch(() => {});
src/main/index.ts, line 1741
await fs.unlink(artifact.tempPath).catch(() => {});
.claude/commands/security.md, line 107
- Is ffmpeg invoked via `child_process.spawn` (safer) or `exec` (shell injection risk)?
Install and update
Concern
runs a script at install time.
INSTALL_LIFECYCLE_HOOK
package.json, line 14
postinstall
Network
Concern
can reach a host that is not written as a fixed address. can reach api.openai.com. The description does not name that host. can reach api.github.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
src/integrations/github/GitHubIssueCreator.ts, line 7
* Uses native fetch (Node 18+) - no external dependencies.
src/integrations/github/GitHubIssueCreator.ts, line 289
const response = await fetch(url, {
src/integrations/github/GitHubIssueCreator.ts, line 317
const checkResponse = await fetch(checkUrl, {
Show more
src/integrations/github/GitHubIssueCreator.ts, line 327
const createResponse = await fetch(url, {
src/integrations/github/GitHubIssueCreator.ts, line 351
const response = await fetch(url, {
src/integrations/linear/LinearIssueCreator.ts, line 269
const response = await fetch(LINEAR_API_URL, {
src/main/ipc/settingsHandlers.ts, line 67
const response = await fetch(requestConfig.url, {
src/main/transcription/ModelDownloadManager.ts, line 248
const redirectRequest = https.get(
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
scripts/notarize.cjs, line 79
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
src/cli/doctor.ts, line 223
const key = process.env.ANTHROPIC_API_KEY;
src/cli/doctor.ts, line 251
const key = process.env.OPENAI_API_KEY;
Show more
src/cli/index.ts, line 138
} else if (process.env.OPENAI_API_KEY) {
src/cli/index.ts, line 139
openaiKey = process.env.OPENAI_API_KEY;
src/cli/index.ts, line 250
} else if (process.env.OPENAI_API_KEY) {
src/cli/index.ts, line 251
openaiKey = process.env.OPENAI_API_KEY;
src/cli/index.ts, line 421
const apiToken = options.token || process.env.LINEAR_API_KEY;
.claude/commands/security.md, line 37
cd ~/Projects/markupr && grep -rn "ANTHROPIC_API_KEY\|OPENAI_API_KEY\|GITHUB_TOKEN" src/ .env* .github/ --include="*.ts" --include="*.tsx" --include="*.yml" --include="*.env*" 2>&1
.claude/commands/security.md, line 42
- No API keys in environment variables, config files, or committed `.env` files
.gitignore, line 10
# Environment variables
.gitignore, line 11
.env
.gitignore, line 12
.env.local
docs/DEVELOPMENT.md, line 73
Create a `.env.local` file (optional, for development):
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 f02650b49c0b. can delete files. runs a script at install time. can reach a host that is not written as a fixed address. can reach api.openai.com. The description does not name that host. 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: f02650b49c0bd41041e9646b6957466b3a1cf83b
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.