@hanna84/mcp-writing
npm
v3.29.3
Source verified
Published by hannasdev — publish provenance cryptographically ties this package to that repository. That is proof of origin, not an official vendor package.
MCP service for AI-assisted reasoning and editing on long-form fiction projects
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 0 = 100. What the published surface and source actually contain:
The deterministic scan raised no scored threat in the surface it inspected — the threat score stayed at 100. Capability observations and advisory notes are recorded but never lower it.
2. Client adoption risk — 100 − 6 = 94. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −6 | capability blast radius (high) — client exposure if the model is manipulated |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`bin/mcp-writing.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; import path from "node:path"; import { fileURLToPath, pathToFileURL } from "node
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server bin/mcp-writing.js
In the server's implementation (`src/core/git.js:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: , execSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; /** * Check if a direc
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/core/git.js
In the server's implementation (`src/runtime/async-jobs.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; import { randomUUID } from "node:crypto"; import { ASYNC_PROGRESS_PREFIX } from
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/runtime/async-jobs.js
In a packaging/dev/install script (shipped, but not the server runtime) (`src/scripts/manual-validation.mjs:4`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { SSE
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scripts/manual-validation.mjs
In a packaging/dev/install script (shipped, but not the server runtime) (`src/scripts/mcp-debug-client.mjs:1`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: rt { spawn } from "node:child_process"; import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { SSE
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scripts/mcp-debug-client.mjs
Each tool and what it can reach — statically extracted from the published source.
to the matching no sensitive capabilityassign_scene_to_chapterno sensitive capabilityattach_epigraphno sensitive capabilityaudit_relationship_metadatano sensitive capabilitybootstrap_prose_styleguide_configno sensitive capabilitycancel_async_jobno sensitive capabilitycheck_prose_styleguide_driftno sensitive capabilitycommit_editno sensitive capabilityconnect_character_place_evidenceno sensitive capabilityconnect_scene_character_evidenceno sensitive capabilityconnect_scene_place_evidenceno sensitive capabilitycreate_chapterno sensitive capabilitycreate_character_sheetno sensitive capabilitycreate_place_sheetno sensitive capabilitycreate_review_bundleno sensitive capabilitydescribe_workflowsno sensitive capabilitydiagnose_project_backupsno sensitive capabilitydiagnose_structureno sensitive capabilitydiscard_editno sensitive capabilityenrich_sceneno sensitive capabilityenrich_scene_characters_batchno sensitive capabilityexport_project_backupno sensitive capabilityexport_structure_snapshotno sensitive capabilityfind_epigraphsno sensitive capabilityfind_scenesno sensitive capabilityflag_sceneno sensitive capabilityget_arcno sensitive capabilityget_async_job_statusno sensitive capabilityget_chapter_proseno sensitive capabilityget_character_sheetno sensitive capabilityget_place_sheetno sensitive capabilityget_prose_styleguide_configno sensitive capabilityget_reference_docno sensitive capabilityget_relationship_arcno sensitive capabilityget_runtime_configno sensitive capabilityget_scene_proseno sensitive capabilityget_thread_arcno sensitive capabilityimport_scrivener_syncno sensitive capabilityimport_scrivener_sync_asyncno sensitive capabilitylink_reference_evidenceno sensitive capabilitylist_async_jobsno sensitive capabilitylist_chaptersno sensitive capabilitylist_charactersno sensitive capabilitylist_placesno sensitive capabilitylist_scene_referencesno sensitive capabilitylist_snapshotsno sensitive capabilitylist_threadsno sensitive capabilitymerge_scrivener_project_betano sensitive capabilitymove_sceneno sensitive capabilitypreview_prose_styleguide_config_updateno sensitive capabilitypreview_review_bundleno sensitive capabilitypropose_editno sensitive capabilityrecord_character_relationship_beatno sensitive capabilityrename_chapterno sensitive capabilityreorder_chapterno sensitive capabilityrestore_project_from_backupno sensitive capabilityrestore_structure_from_exportno sensitive capabilitysearch_metadatano sensitive capabilitysearch_referenceno sensitive capabilitysetup_prose_styleguide_configno sensitive capabilitysetup_prose_styleguide_skillno sensitive capabilitysnapshot_sceneno sensitive capabilitysuggest_scene_referencesno sensitive capabilitysummarize_prose_styleguide_configno sensitive capabilitysyncno sensitive capabilitytrack_thread_arcno sensitive capabilityupdate_character_sheetno sensitive capabilityupdate_place_sheetno sensitive capabilityupdate_prose_styleguide_configno sensitive capabilityupdate_scene_metadatano sensitive capabilityupsert_reference_linkno sensitive capabilityupsert_thread_linkno sensitive capabilityScan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v3.29.3 latest |
A 94/100 | 5 | 1.13.0 | 2026-09-07 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan @hanna84/mcp-writing --online
Security scan results for the A5sql MCP server.
Expose AgentsKit tools as an MCP server — use them from Claude Desktop, Cursor, Windsurf, or any MCP host.
MCP server for Aiven cloud data platform - manage PostgreSQL, Kafka, and other services
MCP Server for All-Inkl.com hosting via KAS API
Structured aquarium, marine, terrarium and paludarium data for AI agents.
MCP server that gives your AI agent real vehicle data — specs, representative images, federal recalls, owner complaints, service bulletins, defect investigations, and OBD-II DTC reference — from the CarVector API.