Prompt Cleaner MCP Server
Prompt Cleaner MCP Server cleans, normalizes, and redacts sensitive information from raw user prompts using an LLM.
Core Capabilities:
Clean & Normalize Prompts - Transform raw user text into well-structured requests while preserving intent, with 'general' and 'code' modes for context-appropriate processing
Redact Sensitive Data - Automatically detect and scrub PII, API keys, tokens, and secrets from prompts, logs, and outputs
Structured Output - Returns JSON with retouched text plus
notes,openQuestions,risks, andredactionsarraysMultiple Tool Interfaces - Access via
cleaner,sanitize-text, ornormalize-promptaliasesConfigurable LLM Integration - Connect to any OpenAI-compatible API with customizable model, timeout, temperature (0-2, default 0.2), and automatic retry/exponential backoff
Health Monitoring - Check server liveness with
health-pingtoolSecurity Options - Enforce local-only API access via
ENFORCE_LOCAL_API, single-model policy for deterministic behaviorSafe by Default - Read-only, idempotent operations with no side effects and automatic output normalization for clients that don't support JSON
Integrates with OpenAI-compatible APIs to provide prompt cleaning and sanitization services, using LLM models to retouch prompts, identify risks, redact sensitive information, and provide structured feedback on prompt quality.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Prompt Cleaner MCP Server clean this prompt: 'My API key is sk-live-abc123, show user emails'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.

Prompt Cleaner (MCP Server)
TypeScript MCP server exposing a prompt cleaning tool and health checks. All prompts route through cleaner, with secret redaction, structured schemas, and client-friendly output normalization.
Features
Tools
health-ping: liveness probe returning{ ok: true }.cleaner: clean a raw prompt; returns structured JSON with retouched string, notes, openQuestions, risks, and redactions.
Secret redaction: Sensitive patterns are scrubbed from logs and outputs in
src/redact.ts.Output normalization:
src/server.tsconverts content withtype: "json"to plain text for clients that reject JSON content types.Configurable: LLM base URL, API key, model, timeout, log level; optional local-only enforcement.
Deterministic model policy: Single model via
LLM_MODEL; no dynamic model selection/listing by default.
Related MCP server: classifinder-mcp
Requirements
Node.js >= 20
Install & Build
npm install
npm run buildRun
Dev (stdio server):
npm run devInspector (Debugging)
Use the MCP Inspector to exercise tools over stdio:
npm run inspectEnvironment
Configure via .env or environment variables:
LLM_API_BASE(string, defaulthttp://localhost:1234/v1): OpenAI-compatible base URL.LLM_API_KEY(string, optional): Bearer token for the API.LLM_MODEL(string, defaultopen/ai-gpt-oss-20b): Model identifier sent to the API.LLM_TIMEOUT_MS(number, default60000): Request timeout.LOG_LEVEL(error|warn|info|debug, defaultinfo): Log verbosity (logs JSON to stderr).ENFORCE_LOCAL_API(true|false, defaultfalse): Iftrue, only allow localhost APIs.LLM_MAX_RETRIES(number, default1): Retry count for retryable HTTP/network errors.RETOUCH_CONTENT_MAX_RETRIES(number, default1): Retries when the cleaner returns non-JSON content.LLM_BACKOFF_MS(number, default250): Initial backoff delay in milliseconds.LLM_BACKOFF_JITTER(0..1, default0.2): Jitter factor applied to backoff.
Example .env:
LLM_API_BASE=http://localhost:1234/v1
LLM_MODEL=open/ai-gpt-oss-20b
LLM_API_KEY=sk-xxxxx
LLM_TIMEOUT_MS=60000
LOG_LEVEL=info
ENFORCE_LOCAL_API=false
LLM_MAX_RETRIES=1
RETOUCH_CONTENT_MAX_RETRIES=1
LLM_BACKOFF_MS=250
LLM_BACKOFF_JITTER=0.2Tools (API Contracts)
All tools follow MCP Tool semantics. Content is returned as [{ type: "json", json: <payload> }] and normalized to type: "text" by the server for clients that require it.
health-ping
Input:
{}Output:
{ ok: true }
cleaner
Input:
{ prompt: string, mode?: "code"|"general", temperature?: number }Output:
{ retouched: string, notes?: string[], openQuestions?: string[], risks?: string[], redactions?: ["[REDACTED]"][] }Behavior: Applies a system prompt from
prompts/cleaner.md, calls the configured LLM, extracts first JSON object, validates with Zod, and redacts secrets.
sanitize-text (alias of
cleaner)Same input/output schema and behavior as
cleaner. Exposed for agents that keyword-match on “sanitize”, “PII”, or “redact”.
normalize-prompt (alias of
cleaner)Same input/output schema and behavior as
cleaner. Exposed for agents that keyword-match on “normalize”, “format”, or “preprocess”.
Per-call API key override
src/llm.ts accepts apiKey in options for per-call overrides; falls back to LLM_API_KEY.
Project Structure
src/server.ts: MCP server wiring, tool listing/calls, output normalization, logging.src/tools.ts: Tool registry and dispatch.src/cleaner.ts: Cleaner pipeline and JSON extraction/validation.src/llm.ts: LLM client with timeout, retry, and error normalization.src/redact.ts: Secret redaction utilities.src/config.ts: Environment configuration and validation.test/*.test.ts: Vitest suite covering tools, shapes, cleaner, and health.
Testing
npm testDesign decisions
Single-model policy: Uses
LLM_MODELfrom environment; no model listing/selection tool to keep behavior deterministic and reduce surface area.Output normalization:
src/server.tsconvertsjsoncontent totextfor clients that reject JSON.Secret redaction:
src/redact.tsscrubs sensitive tokens from logs and outputs.
Troubleshooting
LLM timeout: Increase
LLM_TIMEOUT_MS; check network reachability toLLM_API_BASE.Non-JSON from cleaner: Retries up to
RETOUCH_CONTENT_MAX_RETRIES. If persistent, reducetemperatureor ensure the configured model adheres to the output contract.HTTP 5xx from LLM: Automatic retries up to
LLM_MAX_RETRIESwith exponential backoff (LLM_BACKOFF_MS,LLM_BACKOFF_JITTER).Local API enforcement error: If
ENFORCE_LOCAL_API=true,LLM_API_BASEmust point to localhost.Secrets in logs/outputs: Redaction runs automatically; if you see leaked tokens, update patterns in
src/redact.ts.
Windsurf (example)
Add an MCP server in Windsurf settings, pointing to the built stdio server:
{
"mcpServers": {
"prompt-cleaner": {
"command": "node",
"args": ["/absolute/path/to/prompt-cleaner/dist/server.js"],
"env": {
"LLM_API_BASE": "http://localhost:1234/v1",
"LLM_API_KEY": "sk-xxxxx",
"LLM_MODEL": "open/ai-gpt-oss-20b",
"LLM_TIMEOUT_MS": "60000",
"LOG_LEVEL": "info",
"ENFORCE_LOCAL_API": "false",
"LLM_MAX_RETRIES": "1",
"RETOUCH_CONTENT_MAX_RETRIES": "1",
"LLM_BACKOFF_MS": "250",
"LLM_BACKOFF_JITTER": "0.2"
}
}
}
}Usage:
In a chat, ask the agent to use
cleanerwith your raw prompt.Or invoke tools from the agent UI if exposed by your setup.
LLM API compatibility
Works with OpenAI-compatible Chat Completions APIs (e.g., LM Studio local server) that expose
/v1/chat/completions.Configure via
LLM_API_BASEand optionalLLM_API_KEY. UseENFORCE_LOCAL_API=trueto restrict to localhost for development.Set
LLM_MODELto the provider-specific model identifier. This server follows a single-model policy for determinism and reproducibility.Providers must return valid JSON; the cleaner includes limited retries when content is not strictly JSON.
Links
Model Context Protocol (spec): https://modelcontextprotocol.io
Cleaner system prompt:
prompts/cleaner.md
Notes
Logs are emitted to stderr as JSON lines to avoid interfering with MCP stdio.
Some clients reject
jsoncontent types; this server normalizes them totextautomatically.
Security
Secrets are scrubbed by
src/redact.tsfrom logs and cleaner outputs.ENFORCE_LOCAL_API=truerestricts usage to local API endpoints.
Available Tools
4 toolscleanerA
Pre-reasoning prompt normalizer and PII redactor. Use when: you receive raw/free-form user text and need it cleaned before planning, tool selection, or code execution. Does: normalize tone, structure the ask, and redact secrets; preserves user intent. Safe: read-only, idempotent, no side effects (good default to run automatically). Input: { prompt, mode?, temperature? } — defaults mode='general', temperature=0.2; mode='code' only for code-related prompts. Output: JSON { retouched, notes?, openQuestions?, risks?, redactions? }. Keywords: clean, sanitize, normalize, redact, structure, preprocess, guardrails
Inputs: prompt (required), mode, temperature.
health-pingB
Liveness probe; returns { ok: true }
Inputs: no named parameters.
normalize-promptC
Alias of cleaner. Keywords: normalize, restructure, clarify, tighten, format, preflight. Same input/output schema as 'cleaner'.
Inputs: prompt (required), mode, temperature.
sanitize-textC
Alias of cleaner. Keywords: sanitize, scrub, redact, filter, pii, normalize, preprocess. Same input/output schema as 'cleaner'.
Inputs: prompt (required), mode, temperature.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
The tool set has severe ambiguity issues, with three tools (cleaner, normalize-prompt, sanitize-text) being explicit aliases of each other, performing identical functions with the same input/output schema. This creates confusion and redundancy, making it impossible for an agent to distinguish between them based on purpose or functionality.
Naming is mixed but readable, with tools using snake_case (e.g., 'health-ping') and hyphenated forms (e.g., 'normalize-prompt'), but lacks a consistent pattern. While not chaotic, the deviation from a uniform convention like verb_noun reduces predictability across the set.
With 4 tools, the count is borderline low for the server's purpose of prompt cleaning, but the real issue is that 3 of the tools are redundant aliases. This makes the effective tool count much lower, feeling thin and poorly scoped, as it doesn't justify multiple entries for the same functionality.
For the domain of prompt cleaning, the core functionality is well-covered by the cleaner tool, including normalization, PII redaction, and structured output. The health-ping adds basic liveness. However, minor gaps exist, such as lack of tools for post-cleaning analysis or configuration management, but agents can work around these with the provided tools.
Related MCP Connectors
Detect and redact PII and secrets (API keys, tokens) in text, HTML or PDF before it reaches an LLM.
Scans untrusted web pages, emails, or tool outputs for prompt injections and returns sanitized tex
Scan prompts for injection attacks, redact PII, and audit LLM SDK usage from any MCP client
Free pre-action policy checks and data cleaning for autonomous AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnhances and cleans raw prompts using AI to make them more clear, actionable, and effective. Provides quality assessment, suggestions, and supports both general and code-specific optimization modes.1MIT

classifinder-mcpofficial
AlicenseAqualityCmaintenanceEnables AI agents to scan text for leaked secrets and prompt injection markers, and redact them before reaching an LLM.21MIT- AlicenseAqualityDmaintenanceScans prompts for PII and masks or redacts sensitive data locally before sending to an LLM, supporting multiple anonymization modes.1MIT
- AlicenseBqualityBmaintenanceZero-Trust local PII & secrets masking MCP (ZTDS RFC v1.0). Zero server logs. Features: 23 zero-trust tools, 30 industry profiles, offline OCR, RAM-only masking. Run: npx -y @privacyscrubber/mcp-server. Website: https://privacyscrubber.com SDK: https://www.npmjs.com/package/@privacyscrubber/sdk423687 npm3MIT