SassyMCP
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| SSH_HOST | No | Remote Linux hostname/IP for SSH. | |
| SSH_PASS | No | Remote Linux password for SSH. | |
| SSH_USER | No | Remote Linux username for SSH. | |
| GITHUB_TOKEN | No | GitHub API access token. | |
| SASSYMCP_DEV | No | Enable live reload (dev mode). Set to 1 to enable. | 0 |
| SASSYMCP_HOME | No | Override the per-user state directory (default ~/.sassymcp). Required when running multiple instances. | ~/.sassymcp |
| SASSYMCP_REPO | No | Override the auto-detected repo root (dev tool only). | |
| SASSYMCP_PANEL | No | Launch the Control Panel at boot when set to 1. | 0 |
| SASSYMCP_GROUPS | No | Comma-separated list of tool groups to load (e.g., 'core,android'). | |
| SASSYMCP_LOAD_ALL | No | Load every tool group. Set to 1 to enable. | 0 |
| SASSYMCP_AUTH_TOKEN | No | Bearer token for HTTP authentication. | |
| SASSYMCP_TUNNEL_NAME | No | Name of the Cloudflare tunnel to run. | |
| SASSYMCP_ALLOWED_HOSTS | No | Comma-separated list of allowed hosts for tunnel access (e.g., 'mcp.example.com,localhost,127.0.0.1'). | |
| SASSYMCP_LICENSE_BYPASS | No | Legacy dev escape hatch (accepted and ignored). | |
| SASSYMCP_NO_UPDATE_CHECK | No | Disable the startup update check. Set to 1 to disable. | 0 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| sassy_state_setB | Persist any value for any tool across sessions. |
| sassy_state_getC | Retrieve persistent state for a tool. Returns JSON-encoded value. |
| sassy_state_clearB | Clear state for a specific tool or all tools. |
| sassy_observability_metricsB | Return real-time server metrics and performance data. |
| sassy_observability_healthB | Simple health check for monitoring tools and load balancers. |
| sassy_observability_tool_statsC | Full usage tracker stats + pruning suggestions. |
| sassy_get_configA | Get full SassyMCP configuration and system info. Returns: config settings, system info (OS, Python, memory, disk), uptime, loaded modules, and tool usage stats. DC get_config equivalent. |
| sassy_set_configB | Set a runtime config value. Supported keys: defaultShell, fileReadLineLimit, fileWriteLineLimit, allowedDirectories, blockedCommands. value: JSON-encoded value (e.g. '"powershell"', '1000', '[]') |
| sassy_permissionA | View and control the permission engine (sassymcp.policy). Single front door for the four-mode safety system that gates the shell and file tools. The future Control Panel UI writes the same config keys this tool does. action: status (default) show effective mode, how it was derived, the sandbox roots, and the active allow/ask/deny rules. set_mode set permission.mode. mode= one of: strict — block destructive patterns everywhere confirm — destructive patterns need a confirm token sandbox — relaxed gating INSIDE the sandbox roots; anything resolving outside is refused bypass — allow all except protected paths "" — clear the override; derive from the legacy interceptor.destructiveAction setting add_root add path= to permission.sandboxRoots (the jail) remove_root remove path= from permission.sandboxRoots add_rule append rule= (JSON: {"action","tool","path","command"}) to permission.rules; first match wins, evaluated before the mode default clear_rules remove all rules |
| sassy_panelA | Control the SassyMCP Control Panel — the loopback web UI for the permission engine, settings, event log, and classifiers. action: status (default) — running state + URL (with token) if up start — launch the panel and enable it at future startups stop — shut the panel down and disable auto-start url — print the tokenized URL (does not start it) The panel binds 127.0.0.1 only and requires the per-install token (stored owner-only in ~/.sassymcp/control_panel.token). Open the printed URL in a browser on this machine. |
| sassy_recent_tool_callsA | Get recent tool call history from audit log. max_results: how many to return (1-1000) tool_name: filter to specific tool (optional) since_minutes: only calls within last N minutes (0=all) |
| sassy_context_estimateA | Estimate current context window usage from MCP tool definitions. Shows: total estimated tokens, % of 200K window, heaviest tools. Use this to understand why your context is running low. |
| sassy_tool_usageA | Show tool usage analytics: invocation counts, trends, top tools. Tracks which tools you actually use to inform smart loading. Data persists across sessions in ~/.sassymcp/tool_usage.json. |
| sassy_tool_groupsA | List available tool groups and their load status. Shows which groups are loaded, their tool counts, and descriptions. Use sassy_tool_group_toggle to enable/disable groups. |
| sassy_self_checkA | Proprioceptive self-check: reconcile the declared module manifest against the live tool registry and surface any module that FAILED to import — the silent drop _load_modules()'s try/except otherwise hides. Answers "am I whole?" with a real readout instead of phantom limbs. A tool can be legitimately absent for three reasons, all reported separately so none is mistaken for a regression:
The one real regression is:
Every BROKEN module is logged at ERROR (server log / audit substrate) so the amputation is loud, not silent. verdict='whole' == every expected module imports cleanly. |
| sassy_tool_catalogA | Catalog every registered tool: name, one-line purpose, group. Client-agnostic capability map for ANY MCP wrapper — enumerate what this server can actually do without loading each tool's schema. Derived live from the registry, so it never drifts from reality the way hand-written capability prose does (the drift that makes absent lazy-loaded tools look like missing ones). group: filter to one tool group (see sassy_tool_groups). Empty = all. query: case-insensitive substring match on tool name or purpose. |
| sassy_tool_group_toggleA | Enable or disable a tool group. Emits tools/list_changed notification. NOTE: clients vary. MCP clients that handle tools/list_changed (Claude Code, Cursor, etc.) refresh automatically; clients that don't (Claude Desktop today) require a manual server restart. group: core, android, system, github_quick, github_full, v020, persona enable: True to load, False to unload |
| sassy_minify_testA | Test the GitHub response minifier on sample JSON. Paste a GitHub API response and see how much it shrinks. Shows before/after token estimates. |
| sassy_hooks_listA | List all available operational hooks. Hooks are expert playbooks that teach the AI HOW to approach a task. When activated, the AI gets pre-loaded domain expertise — the right "lens" for the job. Use sassy_hooks_activate to load one. |
| sassy_hooks_activateA | Activate an operational hook. Returns the full expert playbook. The playbook contains step-by-step instructions for HOW to approach the task — which tools to use, in what order, what to look for, and what NOT to do. Follow it. Use sassy_hooks_list to see available hooks. |
| sassy_hooks_deactivateA | Deactivate a hook or all hooks. hook_name: specific hook to deactivate, or empty to clear all. |
| sassy_hooks_suggestA | Suggest hooks based on what the user is trying to do. Pass the user's request text. Returns matching hooks ranked by relevance. The AI should call this when it's unsure which hook to use, or proactively when the user's request matches a known domain. |
| sassy_edit_blockA | Surgical file edit: find old_text and replace with new_text.
|
| sassy_edit_multiA | Apply multiple edits to a file in one call. edits format (JSON string): [{"old": "text to find", "new": "replacement"}, ...] Edits are applied in order. Each must have exactly one match. Refuses edits on protected paths and snapshots existing content to DELETE/ before applying. |
| sassy_env_getA | Get an environment variable value. Returns error if not set. |
| sassy_env_setA | Set an environment variable for the current SassyMCP process. Persists for the lifetime of the server. Does NOT modify system env. For permanent changes, use the registry or system settings. |
| sassy_env_listA | List environment variables. Optional filter by name substring. Sensitive values (tokens, keys, secrets) are masked. |
| sassy_toastA | Show a desktop notification. duration: short or long. Useful for alerting when a long-running task completes. Routed at the head: Windows toast (BurntToast -> .NET -> msg.exe), macOS osascript notification, Linux notify-send. |
| sassy_zipA | Create a zip archive from a file or directory. source: path to file or directory to zip output: output zip path (defaults to source + .zip) compression: deflated (default), stored (no compression), bzip2, lzma |
| sassy_unzipA | Extract a zip archive. archive: path to .zip file destination: extract to this directory (defaults to archive parent) password: for encrypted zips |
| sassy_tarC | Create a tar archive. compress: gz, bz2, xz, or none. |
| sassy_untarC | Extract a tar/tar.gz/tar.bz2/tar.xz archive. |
| sassy_diffB | Compare two files and return a unified diff. context_lines: number of surrounding lines to show (default 3). Returns the diff text plus stats (added, removed, changed lines). |
| sassy_httpA | Make an HTTP request. Lightweight alternative to web_inspector for quick API calls. method: GET, HEAD, OPTIONS, POST, PUT, PATCH, DELETE headers: JSON object of headers, e.g. {"Authorization": "Bearer xxx"} body: request body (string or JSON) allow_mutating: required True for state-changing verbs (POST, PUT, PATCH, DELETE). The MCP tool surface is reachable by an LLM that may be partially adversarial; gating mutating verbs behind an explicit flag stops an "innocent fetch" prompt from being steered into a DELETE against an internal service. |
| sassy_http_pingA | Quick health check on multiple URLs. Returns status code and response time for each. urls: comma-separated list of URLs to check. |
| sassy_update_checkA | Check for a newer SassyMCP release (apt-update equivalent). Caches the result for 5 minutes; pass force=True to bypass the cache. |
| sassy_update_listB | List downloadable assets for a release (apt-list-upgradable equivalent). tag defaults to the latest release. |
| sassy_update_changelogA | Return the release notes body for a tag (defaults to latest). |
| sassy_update_applyA | Download an asset to staging. Returns the path + a run command. Does NOT execute the installer — the user runs the returned command when ready. Disabled in packaged/frozen builds so marketplace installs remain a fixed graded version; upgrade by installing a new release artifact instead. |
| sassy_memory_rememberA | Store a memory that persists across sessions. key: unique identifier (use naming convention: task_state, pattern, blocker, decision) value: the memory content (what happened, what was learned, current state) tags: comma-separated (e.g. "task-active,tls,security") priority: critical | high | normal | low project: project name (e.g. "sassymcp", "sassy-browser") |
| sassy_memory_recallC | Recall a specific memory by key. |
| sassy_memory_searchA | Search memories by text, tags, project, or priority. query: free text search across keys and values tags: comma-separated tag filter (e.g. "pattern,tls") project: filter by project name priority: filter by priority level |
| sassy_memory_forgetA | Delete a memory. Use when information is no longer relevant. |
| sassy_memory_contextA | Load full context for session startup. Returns critical memories, active tasks, blockers, recent milestones, and learned patterns. Call this at the START of every session. This is how you know what's been happening and what needs to continue. project: optional filter to focus on a specific project |
| sassy_memory_logA | Log a milestone event. Use for significant completions, decisions, or changes. event: what happened (e.g. "deployed v1.0", "fixed TLS cert chain", "merged PR #42") project: which project tags: comma-separated (e.g. "deployment,milestone") |
| sassy_memory_milestonesB | View recent milestones, optionally filtered by project. |
| sassy_memory_handoffA | Write a session handoff — saves state to BOTH memory and crosslink. The next session calls sassy_memory_context and sassy_crosslink_recv to pick up exactly where you left off. task: what you were working on status: in-progress | blocked | needs-review | paused | completed completed: comma-separated list of completed items next_steps: comma-separated ordered list of what to do next blockers: comma-separated list of blockers files_touched: comma-separated list of files modified project: project name context_notes: critical context the next session needs |
| sassy_memory_statsB | Memory system stats: total memories, priorities, projects, milestones. |
| sassy_setup_wizardA | First-run setup wizard. Generates ~/.sassymcp/persona.md from your answers. Call with your profile to personalize SassyMCP. All fields optional. role: developer | sysadmin | security | devops | data | designer | manager | other expertise_level: junior | mid | senior | principal | staff specializations: Comma-separated areas (e.g. "web security, cloud infra, mobile") languages: Comma-separated (e.g. "Python, Rust, TypeScript, Go") frameworks: Comma-separated (e.g. "React, FastAPI, Cloudflare Workers") systems: Newline-separated "hostname — OS — role" entries projects: Newline-separated "name — status — description" entries communication_style: terse | balanced | verbose security_posture: standard | hardened | paranoid mcp_clients: Which AI tools connect (e.g. "Claude Desktop, Cursor, Grok Desktop") has_android: True if the user has an Android phone to control (installs adb + scrcpy) has_linux: True if the user works with a Linux server or WSL (installs plink) notes: Anything else the AI should know about how you work |
| sassy_setup_statusA | Check setup status: is persona configured? Auth tokens? Config state? |
| sassy_setup_generate_tokenA | Generate a new auth token for MCP client authentication. Creates a secure token and saves it to ~/.sassymcp/tokens.json. Use this token in SASSYMCP_AUTH_TOKEN env var or in client config. client_id: identifier for the client (e.g. "claude-desktop", "grok", "cursor") scopes: comma-separated permissions (read, write, admin) |
| sassy_setup_githubB | Guide GitHub token setup. Opens browser, validates, saves. action: check | open_browser | save_token | skip token: the GitHub PAT to save (only for save_token action) |
| sassy_setup_sshA | Guide SSH/Linux remote setup. Checks plink, saves creds, tests connection. action: check | save | test | skip host: SSH hostname or IP (for save action) user: SSH username (for save action) password: SSH password (optional; fed via stdin at test time, not on the argv list) key: path to a .ppk private key (preferred over password) session: saved PuTTY session name (carries host+user+key) Authentication priority at test time: session > key > Pageant > password-via-stdin. Pass at least ONE auth source on save, otherwise the call returns status=incomplete (no false 'saved' on empty creds). |
| sassy_setup_check_toolsA | Scan for external tools and report availability. Tesseract is required. Checks: nmap, Tesseract OCR (REQUIRED), adb, scrcpy, plink (PuTTY), Chrome/Chromium. Also checks Python packages: pytesseract, playwright. Use sassy_setup_tools for winget-based auto-install. |
| sassy_setup_licenseA | Manage your SassyMCP supporter license against LemonSqueezy. All tool groups are unlocked for everyone — no key required. A license is an optional supporter purchase; activating one records your tier label (shown in the banner, control panel, cockpit). action: status | activate | deactivate | validate key: LemonSqueezy license key (format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX), required for activate. activate: calls LS to register this machine as an instance, then mints a local HMAC payload so offline use works. validate: forces an immediate LS re-check (normally weekly). deactivate: calls LS to free this machine's seat and removes the local file. |
| sassy_shellA | Execute a shell command in the host's native shell. shell: Windows -> powershell (default), cmd, wsl. macOS/Linux -> zsh/bash (default is the login shell), sh. Leave empty to use the host default. Automatically normalizes syntax (e.g. && to ; for PowerShell); POSIX shells run the command verbatim. timeout_seconds > 120: auto-promoted to a background session and returns a JSON handle ({"auto_detached": true, "session_name": ...}). Poll with sassy_session_read; stop with sassy_session_stop. This is because synchronous waits past the MCP client's ~240s response wall wedge the connection. For known long-running work, prefer calling sassy_session_start directly with a memorable name. allow_pattern: opt-in escape hatch for power users. When set to a specific pattern label (e.g. 'truncate-by-redirect') OR to '*', a regex-pattern match with that label is allowed to execute instead of being blocked. The bypass is recorded as a 'pattern_bypass' audit entry. Keyword matches (rm/del/remove-item) are NEVER affected by this flag — only regex patterns can be opted out, and only one pattern at a time. Tiered destructive-action handling: when
|
| sassy_shell_confirmA | Execute a sassy_shell command previously returned as confirmation_required. Tokens are single-use, expire after 60s, and are bound to the exact
command + shell + cwd that produced them. HIGH-tier tokens also
require |
| sassy_persona_styleB | Get expert-mode operating parameters. Directives for execution priority, communication style, autonomy level, and precision standards. |
| sassy_persona_decisionsA | Get the decision framework. Defines when to execute immediately vs state approach vs confirm vs hard-stop. |
| sassy_persona_practicesA | Get engineering standards. Security defaults, code quality rules, architecture patterns, platform-specific guidelines, MCP tool patterns. |
| sassy_persona_observabilityA | Get the cross-system observability guide. What introspection tools are available, what they return, and the recommended first-call sequence. |
| sassy_persona_contextA | Get current user context from ~/.sassymcp/persona.md. Returns user's role, systems, projects, and preferences. |
| sassy_persona_capabilitiesA | Get the SassyMCP capabilities guide. How to use dynamic vision, phone interaction, pause/resume, sensitive context detection, and setup wizard. This is the instruction manual for SassyMCP's advanced features. |
| sassy_persona_fullA | Load the complete operating bundle: style + decisions + practices + observability + capabilities + user context. Call this on first connection. |
| sassy_audit_logC | Read recent audit log entries. |
| sassy_audit_searchC | Search audit log for a keyword. |
| sassy_audit_false_positivesA | Show recent shell-interceptor pattern matches (blocks + bypasses). Surfaces the noisy-pattern events you'd otherwise have to grep for. Each row: timestamp | event | pattern | command (truncated). Args: count: max rows to return (newest last). include_bypasses: if False, show only blocks (commands that actually got refused). True also includes pattern_bypass entries — useful for auditing what the allow_pattern flag has been used to let through. |
| sassy_audit_clearA | Rotate the audit log to a timestamped archive. The log is NEVER unlinked — always renamed to audit.cleared..log so forensic history is preserved. Pass confirm='YES' to proceed. |
| sassy_screen_infoA | Get display configuration: all monitors with resolution, position, DPI scaling, and which is primary. Essential for multi-monitor setups. |
| sassy_desktop_stateA | Get desktop state: open windows and positions. Lean output. Coordinates are absolute across all monitors. Windows: pywinauto. macOS: System Events (needs Accessibility permission). |
| sassy_clickA | Click at absolute screen coordinates (works across multiple monitors). Use sassy_screen_info to find monitor positions first. |
| sassy_type_textA | Type text into a field. Always clears field first with ctrl-a + backspace. If target_x/target_y provided, clicks the field first. |
| sassy_hotkeyB | Press keyboard shortcut. Keys separated by +, e.g. ctrl+c. |
| sassy_screenshotB | Take screenshot. Optional region as x,y,w,h. monitor=-1 for all, 0 for primary, 1+ for others. |
| sassy_ghq_pushA | Push files atomically (create or update). THE daily-driver tool. files: JSON array of {"path": "...", "content": "..."} objects. Uses Git Data API — no SHA bugs, no ETag nonsense. |
| sassy_ghq_getC | Get file contents + SHA from a repo. |
| sassy_ghq_issueC | Create an issue. labels: comma-separated. |
| sassy_ghq_issuesC | List issues. |
| sassy_ghq_prC | Create a pull request. |
| sassy_ghq_protectB | Protect a branch (no force push, no delete, enforce on admins). |
| sassy_setup_toolsA | Manage external tool dependencies (tesseract, adb, nmap, plink, scrcpy, cloudflared). action: check | install | install_required | add_to_path tool_name: which tool to install (only for action=install) check -- report all tools: found, path, required flag install -- winget-install a specific tool by name install_required -- winget-install any missing required tools (always: tesseract) add_to_path -- re-run PATH bootstrap (after placing tools in tools/ dir) tesseract is always required -- OCR/vision tools need it unconditionally. adb + scrcpy are needed for Android tools. plink for SSH/Linux tools. |
| sassy_session_startA | Start a persistent terminal session. name: unique session identifier (e.g. 'build', 'dev-server') shell: Windows -> powershell/cmd/wsl; macOS/Linux -> bash/zsh/sh. Leave empty for the host's native shell. command: optional initial command to run immediately |
| sassy_session_sendA | Send input to a running session. Like typing in a terminal. Newline is appended automatically. Input is scanned by the delete interceptor — delete keywords are refused here (use sassy_shell or sassy_safe_delete instead, where targets are safely staged to DELETE/). |
| sassy_session_readA | Read new output from a session without sending input. Returns only text that arrived since the last read. |
| sassy_session_listA | List all active terminal sessions. |
| sassy_session_stopC | Stop and clean up a terminal session. |
| sassy_session_stop_allA | Stop all active terminal sessions. |
| sassy_safe_deleteA | Move a file or directory to a DELETE staging folder for review. Instead of permanent deletion, items are moved to a DELETE folder in the same parent directory. This minimises data loss from AI hallucinations or accidental deletions. |
| sassy_read_fileA | Read file contents with line-based pagination. offset >= 0 : start from that line (0-based) offset < 0 : read last N lines (tail) length : max lines to return (ignored when offset < 0) |
| sassy_read_multipleA | Read multiple files at once. paths = JSON array of file paths. |
| sassy_write_fileA | Write or append to a file. mode: rewrite | append. encoding: any Python codec name (utf-8, utf-16, ascii, latin-1, ...). line_endings: 'preserve' (default — write content verbatim), 'lf' (normalize all CRLF/CR to LF before writing), 'crlf' (normalize all to CRLF — useful for Windows .bat / .ps1 files generated from a model that emits LF). Rewrite mode on an existing file first snapshots the prior contents into the adjacent DELETE/ staging folder so destructive overwrites can always be undone. Protected paths (SassyMCP source tree, ~/.sassymcp) are refused. Bypasses the shell-keyword interceptor entirely — content with
words like 'format' or 'rm -rf' as data inside scripts is fine.
Path validation runs |
| sassy_list_dirA | List directory contents. [FILE]/[DIR] prefixes. depth controls recursion. |
| sassy_search_filesB | Search for files by name or content. search_type: files | content file_pattern: glob filter e.g. '.py', '.js' context_lines: lines of context around content matches |
| sassy_moveA | Move or rename a file/directory. Blocks moves from/to protected paths and refuses to overwrite an existing destination without an explicit sassy_safe_delete first. |
| sassy_copyA | Copy a file or directory tree. Refuses protected src/dst and refuses to silently overwrite an existing destination (use sassy_safe_delete on the destination first if you really need to replace it). |
| sassy_file_infoA | Get detailed file/directory metadata. Includes: size, timestamps, line count (text), sheet info (Excel). |
| sassy_mkdirA | Create a directory (and any missing parents). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| pr-review | Run a SassyMCP PR review on a GitHub pull request. Calls the combo tool to fetch metadata + diff + comments + check runs in one shot, then summarises the change, flags concerns, and states a merge recommendation. |
| phone-status | Snapshot the current state of the connected Android device — foreground app, battery, WiFi, notifications, low-res screenshot, and parsed UI accessibility tree — in one combo call. |
| resume | Pick up where the prior session left off. Loads MadameClaude memory context AND any cross-platform task-handoff messages, then executes the next_steps from the handoff immediately. |
| codebase-grep | Search the codebase for a pattern with surrounding context — ranked top-5 files with 5 lines of context around each hit. Replaces the search-then-read-N-files dance for 'where is X used'. |
| brain-status | Report SassyMCP's current state — license tier, loaded tool groups, context window cost, top tools by usage score, recent audit activity, and pruning candidates. |
| setup-sassy | Walk the first-run setup wizard for SassyMCP — persona, GitHub token, optional Linux/Android, optional Pro license activation. |
| discover | Orient in the SassyMCP toolset before acting: confirm the server is whole and which runtime it is, list what it can actually do, and match the task to a domain playbook. Run at the start of any task on an unfamiliar or just-connected server. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sassyconsultingllc/SassyMCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server