{
  "schemaVersion": 1,
  "updated": "2026-08-17",
  "name": "ScrubMyText product catalog",
  "description": "Human- and agent-readable catalog of ScrubMyText browser tools, REST operations, MCP tools, and developer resources.",
  "categories": [
    {
      "id": "clean-inspect",
      "name": "Clean & inspect",
      "description": "Normalize, inspect, compare, and rewrite text or documents.",
      "url": "/clean-inspect/"
    },
    {
      "id": "protect-content",
      "name": "Protect content",
      "description": "Find risky structure, secrets, invalid output, and unsafe context.",
      "url": "/protect-content/"
    },
    {
      "id": "agent-infrastructure",
      "name": "Agent infrastructure",
      "description": "Deterministic controls around consequential agent actions.",
      "url": "/agent-infrastructure/"
    }
  ],
  "products": [
    {
      "id": "scrub-text",
      "name": "Clean text",
      "category": "clean-inspect",
      "kind": "tool",
      "url": "/#scrubber",
      "summary": "Remove hidden and control characters and normalize copied text without rewriting its meaning.",
      "intents": ["clean copied text", "remove hidden characters", "normalize whitespace", "fix pasted text"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["scrub_text"],
      "featuredRank": 1
    },
    {
      "id": "document-scanner",
      "name": "Scan a document",
      "category": "clean-inspect",
      "kind": "tool",
      "url": "/document-scanner/",
      "summary": "Find hidden text, suspicious instructions, secrets, metadata, macros, and other machine-readable document content.",
      "intents": ["scan pdf", "inspect word document", "find hidden document text", "check document before ai"],
      "access": ["browser"],
      "agentTools": [],
      "featuredRank": 2
    },
    {
      "id": "inspect-text",
      "name": "Inspect text",
      "category": "clean-inspect",
      "kind": "tool",
      "url": "/tools/#inspect",
      "summary": "See exact Unicode, zero-width, bidirectional, normalization, and mixed-script anomalies.",
      "intents": ["inspect unicode", "find zero width characters", "show invisible characters", "analyze text"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["inspect_text"]
    },
    {
      "id": "compare-text",
      "name": "Compare text",
      "category": "clean-inspect",
      "kind": "tool",
      "url": "/compare-text/",
      "summary": "Verify exact changes and whether differences disappear after deterministic normalization.",
      "intents": ["compare two texts", "find text changes", "check normalization differences"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["compare_text"]
    },
    {
      "id": "rework-my-text",
      "name": "ReworkMyText",
      "category": "clean-inspect",
      "kind": "tool",
      "url": "/rework-my-text/",
      "summary": "Deterministically rework wording and selected sentence structures without an LLM.",
      "intents": ["rewrite text", "reword sentences", "change wording without llm", "revise document"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["rework_text"]
    },
    {
      "id": "scan-untrusted-text",
      "name": "Scan untrusted text",
      "category": "protect-content",
      "kind": "tool",
      "url": "/scan-untrusted-text/",
      "summary": "Flag structural obfuscation, suspicious instruction patterns, mixed scripts, and encoded payload signals.",
      "intents": ["scan prompt injection", "check untrusted text", "find suspicious instructions", "inspect retrieved context"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["scan_untrusted_text"]
    },
    {
      "id": "detect-secrets",
      "name": "Detect secrets",
      "category": "protect-content",
      "kind": "tool",
      "url": "/detect-secrets/",
      "summary": "Find likely API keys, private keys, JWTs, cloud credentials, and related patterns without returning their values.",
      "intents": ["find api keys", "scan for secrets", "detect credentials", "check logs for tokens"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["detect_secrets"],
      "featuredRank": 3
    },
    {
      "id": "redact-sensitive-text",
      "name": "Redact sensitive text",
      "category": "protect-content",
      "kind": "tool",
      "url": "/redact-sensitive-text/",
      "summary": "Replace common credential and personal-identifier patterns while preserving the remaining text.",
      "intents": ["redact pii", "remove credentials", "remove secrets", "mask sensitive text", "sanitize logs"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["redact_sensitive_text"]
    },
    {
      "id": "validate-ai-output",
      "name": "Validate AI output",
      "category": "protect-content",
      "kind": "tool",
      "url": "/validate-ai-output/",
      "summary": "Parse JSON and validate common JSON Schema rules before an application acts on model output.",
      "intents": ["validate json", "check ai output", "validate tool call", "enforce schema"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["validate_output"]
    },
    {
      "id": "sanitize-agent-context",
      "name": "Sanitize agent context",
      "category": "protect-content",
      "kind": "tool",
      "url": "/sanitize-agent-context/",
      "summary": "Normalize untrusted context, optionally redact sensitive patterns, and return deterministic risk indicators.",
      "intents": ["sanitize agent context", "clean retrieved content", "protect model input", "preprocess rag content"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["sanitize_agent_context"]
    },
    {
      "id": "prepare-for-agent",
      "name": "Prepare for agent",
      "category": "protect-content",
      "kind": "tool",
      "url": "/prepare-text-for-ai-agent/",
      "summary": "Run normalization, inspection, risk scanning, secret detection, and optional redaction in one call.",
      "intents": ["prepare text for ai", "agent preprocessing", "secure model context", "one call text safety"],
      "access": ["browser", "rest", "mcp"],
      "agentTools": ["prepare_for_agent"]
    },
    {
      "id": "lock-my-action",
      "name": "LockMyAction",
      "category": "agent-infrastructure",
      "kind": "product",
      "url": "/lock-my-action/",
      "summary": "Prevent retries and parallel runs from performing the same consequential action twice.",
      "intents": ["prevent duplicate actions", "agent idempotency", "exactly once action", "stop duplicate payment"],
      "access": ["rest", "mcp"],
      "agentTools": ["fingerprint_action", "lock_action_intent", "lock_action", "check_action", "complete_action", "release_action"],
      "featuredRank": 4
    },
    {
      "id": "catch-my-signal",
      "name": "CatchMySignal",
      "category": "agent-infrastructure",
      "kind": "product",
      "url": "/catch-my-signal/",
      "summary": "Create a temporary webhook inbox and retrieve asynchronous outside events when an agent is ready.",
      "intents": ["wait for webhook", "temporary webhook inbox", "receive async event", "agent callback url"],
      "access": ["rest", "mcp"],
      "agentTools": ["create_signal", "get_signal_events", "delete_signal"]
    },
    {
      "id": "approve-my-action",
      "name": "ApproveMyAction",
      "category": "agent-infrastructure",
      "kind": "product",
      "url": "/approve-my-action/",
      "summary": "Require a secure human decision before an agent performs a consequential action.",
      "intents": ["human approval", "approve agent action", "human in the loop", "require confirmation"],
      "access": ["rest", "mcp"],
      "agentTools": ["request_approval", "check_approval", "cancel_approval"]
    }
  ],
  "resources": [
    {
      "id": "rest-api",
      "name": "REST API",
      "kind": "resource",
      "url": "/developers/",
      "summary": "Integrate deterministic ScrubMyText capabilities through documented HTTP endpoints.",
      "intents": ["api documentation", "integrate scrubmytext", "rest endpoints", "developer quickstart"],
      "access": ["rest"],
      "agentTools": []
    },
    {
      "id": "remote-mcp",
      "name": "Remote MCP server",
      "kind": "resource",
      "url": "/mcp/",
      "summary": "Connect a compatible agent client to ScrubMyText's deterministic remote MCP server.",
      "intents": ["mcp server", "connect ai agent", "model context protocol", "mcp tools"],
      "access": ["mcp"],
      "agentTools": []
    },
    {
      "id": "openapi",
      "name": "OpenAPI specification",
      "kind": "resource",
      "url": "/openapi.json",
      "summary": "Machine-readable REST API contract for code generation and agent discovery.",
      "intents": ["openapi", "api schema", "machine readable api", "generate client"],
      "access": ["rest"],
      "agentTools": []
    }
  ],
  "agentDiscovery": {
    "openapi": "https://scrubmytext.com/openapi.json",
    "mcpMetadata": "https://scrubmytext.com/server.json",
    "mcpEndpoint": "https://api.scrubmytext.com/mcp",
    "llms": "https://scrubmytext.com/llms.txt",
    "fullAgentIndex": "https://scrubmytext.com/llms-full.txt"
  }
}
