SassyMCP
OfficialSassyMCP is an all-in-one MCP server providing 274 tools across 36 modules for file ops, shell/terminal, desktop & Android automation, GitHub, security, networking, memory, vision, and more — replacing 75+ individual MCP servers.
File & editor: read/write/search/move/copy/edit files with safe-delete interception (staging to
_DELETE_/) and protected-path enforcement.Shell & sessions: run commands in PowerShell/CMD/WSL/bash/zsh, persistent terminal sessions, delete-command interception, confirmation tokens for destructive actions.
Desktop automation: screenshots, clicking, typing, hotkeys, window management, multi-monitor info, OCR (Tesseract).
Dynamic vision: real-time screen glance/watch/diff with change detection, low-context grayscale captures.
Android phone control: ADB-based tap/swipe/type/key, UI accessibility tree reading, phone state, pause/resume with sensitive context auto-blocking (login/payment screens).
GitHub & Git: atomic file pushes via Git Data API, issues, PRs, branch protection, full GitHub API (80 tools) with response minification.
Memory & state: persistent key-value memory, cross-session reminders, milestones, handoffs, pattern learning.
Setup & configuration: guided persona wizard, GitHub token setup, SSH creds, external tool detection (nmap, adb, scrcpy, plink, tesseract), license management.
Permission engine: four modes (strict/confirm/sandbox/bypass) with allow/ask/deny rules, protected paths always enforced, control panel web UI.
Observability & meta: health checks, metrics, tool stats, context estimation, tool usage analytics, tool catalog/self-check.
Utility & network: env var management, zip/tar, HTTP requests/ping, diffs, toasts, port/WiFi/DNS scans, security audits (hash, certs, firewall), registry, event logs, Bluetooth, clipboard sync.
Remote access: SSH execution (plink), HTTP/SSE/HTTPS transports, Cloudflare Tunnel support, multiple isolated instances via
SASSYMCP_HOME.System cross-platform: works on Windows/macOS/Linux with host-appropriate commands routing.
Provides Android device interaction, including UI automation via accessibility tree, tap/swipe/type input, real-time screen monitoring with change detection, and sensitive context detection for auth/payment screens.
Provides Bluetooth management on Windows systems as part of the Windows system module, handling device discovery and connectivity.
Provides Git version control operations, including repository management, commits, and related workflows, often integrated with GitHub.
Provides comprehensive GitHub integration, including file operations (push, get), issue and pull request management, branch protection, and atomic multi-file commits via the Git Data API.
Provides SSH-based remote Linux management, allowing execution of commands and system administration on remote Linux hosts.
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., "@SassyMCPCheck my GitHub notifications and summarize what needs my attention."
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.
SassyMCP
One MCP server to replace them all.
278 tools | 39 modules | 18 tool groups | Replaces 75+ MCP servers | ~35MB standalone exe
Last updated: 2026-09-21 — v1.16.0 | all tools unlocked; optional supporter license
Compatible with Claude Desktop, Grok Desktop, Cursor, Windsurf, and any MCP client.
The official GitHub MCP server has critical SHA-handling bugs. SassyMCP's GitHub module uses correct blob SHA lookups, proper path encoding, atomic multi-file commits via Git Data API, retry logic with exponential backoff, and rate-limit awareness. It's a drop-in replacement that actually works.
Why SassyMCP?
The MCP ecosystem is fragmented. Need file operations? Install Filesystem server. Need terminal? Desktop Commander. GitHub? Another server. Android? Another. Screenshots? Another. You end up with 6-10 separate MCP servers, each consuming context window, each with its own config, bugs, and update cycle.
SassyMCP replaces 75+ individual MCP servers — including Desktop Commander (5.9k stars), Windows-MCP (5k stars), GitHub MCP Server (28.6k stars), Anthropic's official Filesystem and Memory servers, mobile-mcp (4.4k stars), and dozens more — with a single ~35MB exe.
Key differentiators:
Smart Tool Loading — Only loads tool groups you use. Reduces context window overhead from ~25K tokens to ~5K tokens by default.
Dynamic Vision — Real-time screen monitoring with change detection for both desktop and Android. No more screenshot-and-pray.
Android Interaction — Full phone control via UI accessibility tree: tap, swipe, type, with automatic sensitive context detection (auth/payment screens auto-block).
Pause/Resume — User takes over the phone for manual steps (login, 2FA, account selection), AI watches and learns, then resumes autonomously.
Usage Tracking — ML-lite scoring of tool invocations with exponential decay. Your most-used tools load first.
Context Estimation — Built-in tool to measure how much of your 200K context window tool definitions consume.
Response Minification — GitHub API responses stripped of URL metadata bloat (40-70% smaller).
Safe Delete — Delete commands (
rm,del,Remove-Item, etc.) are intercepted across all shells. Instead of destroying files, targets are moved to a_DELETE_/staging folder in the same directory for human review — protecting against AI hallucinations.Guided Setup — Wizard walks through persona, GitHub token, SSH credentials, and optional tool discovery.
Related MCP server: Auralis Commander
What It Replaces
Domain | SassyMCP Module | Replaces | Top Alternative |
File operations | FileOps, Editor | 11 filesystem/editor MCP servers | Filesystem (Anthropic official) |
Shell / terminal | Shell, Session | 5 shell MCP servers | Desktop Commander (5.9k stars) |
Desktop automation | UIAutomation, Vision | 9 desktop MCP servers | Windows-MCP (5k stars) |
GitHub / Git | GitHub Quick, GitHub Full | 5 GitHub/Git MCP servers | GitHub MCP Server (28.6k stars) |
Android / phone | ADB, PhoneScreen | 9 mobile MCP servers | mobile-mcp (4.4k stars) |
Network scanning | NetworkAudit | 8 nmap/security MCP servers | mcp-for-security (601 stars) |
Security auditing | SecurityAudit | 8 security MCP servers | mcp-security-hub (509 stars) |
SSH / remote Linux | Linux | 7 SSH MCP servers | ssh-mcp (365 stars) |
Memory / state | Memory, StateManager | 7 memory MCP servers | mcp-memory-service (1.6k stars) |
OCR / screen reading | Vision | 7 OCR/vision MCP servers | |
Web inspection | WebInspector, Utility | 7 web/fetch MCP servers | Fetch (Anthropic official) |
Windows system | Registry, ProcessManager, Clipboard, EventLog, Bluetooth | 13 Windows MCP servers | Windows-MCP (5k stars) |
Plus features with no MCP server equivalent: phone pause/resume with sensitive context detection (auto-blocks on login/payment screens), operational hooks (14 expert playbooks), safe delete interception, Windows autorun forensics, Android+Windows clipboard sync, usage-weighted smart loading.
Licensing
Every tool group ships unlocked, for everyone, with no key required. As of v1.13.0 the release model is all-or-nothing — there is no free/pro split, no gated groups, no crippled demo. The 278 tools you see in the module table below are the product, out of the box.
Supporter licenses (optional): SassyMCP can still be purchased through LemonSqueezy as a one-time supporter license (no subscriptions). Activating a key registers your machine as a seat and records a supporter tier that shows in the startup banner, control panel, and VS Code cockpit — all tools are unlocked regardless of tier. Buy once to support development; refunds revoke the label automatically.
Activation flow (supporters):
Purchase at
https://sassyconsultingllc.com/store— LemonSqueezy emails you a key (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX).Activate from your AI agent:
sassy_setup_license action=activate key=...Or from a terminal:
sassymcp.exe setupopens the interactive menu.
Offline operation: Once activated, a local HMAC-signed payload lets the supporter tier validate fully offline. A weekly re-check against LS catches refunds and cancellations; a faster startup check against the SassyMCP billing oracle cuts refund-to-revocation latency to seconds. Missing, expired, tampered, or corrupt license files just show the free label — tool availability is never affected.
Back-compat: SASSYMCP_LICENSE_BYPASS=1 (the old dev escape hatch that unlocked gated groups) is accepted and ignored — there is nothing left to bypass.
Running supervised (sassymcp supervise)
For always-on / remote deployments, run SassyMCP under its built-in supervisor instead of bare launcher scripts:
sassymcp.exe supervise start # bridge only (127.0.0.1:21001)
sassymcp.exe supervise start --tunnel-mode managed # also run the cloudflared tunnel as a child
sassymcp.exe supervise status # JSON status; exit code != 0 if unhealthy
sassymcp.exe supervise stop # graceful stopThe supervisor owns the runtime tree and makes it self-healing and orphan-proof:
No orphans, ever. A hard kill of the supervisor (crash,
kill -9,taskkill /f) takes every child with it — on Windows via a Job Object (KILL_ON_JOB_CLOSE), on Linux via process groups +PR_SET_PDEATHSIG. No leftover bridge holding a wedged SQLite/WAL lock, which is what the oldtaskkill-based scripts caused.Self-healing. Crashed children restart with exponential backoff (and give up cleanly after a crash-loop, rather than spinning).
Catches hangs. An HTTP readiness probe recycles a hung-but-alive bridge — the failure a Windows scheduled task can never detect.
Crash-survivable control. A pidfile + on-disk registry under
$SASSYMCP_HOMEmeansupervise status/stopwork even when the bridge is down, so an operator or agent can recover a wedged system.
start-supervised.bat wraps this as the recommended Windows launcher. stdio mode (Claude Desktop pipe) is client-owned and intentionally not supervised.
Modules
Module | Tools | Group | Description |
Meta | 11 | meta | Context estimation, tool usage analytics, group management |
Batch | 1 | meta | Multi-tool batch fan-out in a single call |
FileOps | 10 | core | Read, write, search, move, copy, edit, mkdir, file info, safe delete |
Shell | 2 | core | PowerShell, CMD, WSL execution with syntax normalization and delete interception |
UIAutomation | 6 | core | Desktop state, click, type, hotkeys, screenshots, screen info |
Editor | 2 | core | Surgical find/replace, multi-edit |
Audit | 4 | core | Audit log read, search, clear, false-positive tracking |
Session | 6 | core | Persistent terminal sessions (start, read, send, stop) |
GitHub Quick | 6 | github_quick | Daily-driver: push_files, get_file, issue, PR, protect |
GitHub Full | 80 | github_full | Complete GitHub API: repos, issues, PRs, actions, security, gists |
Persona | 7 | persona | Expert-mode directives, decision framework, engineering standards |
Utility | 11 | utility | Env vars, toast, zip/tar/unzip/untar, HTTP requests, file diff |
SetupWizard | 7 | setup | Setup wizard, GitHub token guide, SSH setup, tool checker, license activation |
ToolsManager | 1 | setup | External tool bootstrap and detection |
Observability | 3 | infrastructure | Health, metrics, tool stats |
StateManager | 3 | infrastructure | Persistent key-value state across sessions |
RuntimeConfig | 5 | infrastructure | Permission modes, runtime config, recent tool calls |
Offline | 3 | infrastructure | Offline fallback status and local-model handoff |
Memory | 9 | memory | Persistent cross-session memory, milestones, task handoffs, pattern learning |
Updater | 4 | updater | Version checks, changelog, self-update |
ADB | 10 | android | Android shell, packages, file transfer, logcat, screencap |
PhoneScreen | 14 | android | UI tree reader, phone glance/watch, tap/swipe/type/key, pause/resume, scrcpy |
iPhone | 6 | iphone | iOS device info, screenshot, syslog, apps, IPA install — experimental, needs libimobiledevice |
NetworkAudit | 7 | system | netstat, ARP, WiFi scan, port scan, DNS, traceroute |
ProcessManager | 5 | system | Cross-platform process list/kill, system info |
Bluetooth | 3 | system | Windows + Android BT enumeration |
EventLog | 3 | system | Windows Event Log + Android logcat |
Clipboard | 4 | system | Cross-platform clipboard sync |
SecurityAudit | 7 | forensics | Hash, permissions, certs, APK, firewall, Defender |
Registry | 4 | forensics | Read, write, export, autorun forensics (Windows) |
Vision | 8 | v020 | Screen capture, OCR, dynamic glance/watch/diff |
AppLauncher | 6 | v020 | Launch apps, focus/close/resize/snap windows |
WebInspector | 5 | v020 | Security headers, URL screenshots, tech stack detection |
Crosslink | 7 | v020 | Cross-session messaging via HTTP API + SQLite |
Coordination | 4 | v020 | Multi-agent coordination board and peer delegation |
Linux | 1 | linux | Remote SSH execution via plink/OpenSSH |
Combos | 3 | combos | Multi-step workflows in one call: PR review, phone observe, codebase grep |
Prompts | 0 | prompts | MCP slash-menu shortcuts (no tools — prompts only) |
SelfMod | 0 | — | Retired stub — self-modification removed (no tools) |
Counts generated from the registered tool set (278 tools across 39 modules, 18 groups; the prompts group exposes MCP prompts rather than tools).
Full per-tool reference (generated): docs/TOOLS.md.
iPhone support (experimental)
SassyMCP can talk to iPhones over USB via libimobiledevice. This is new in v1.16.0 and experimental — Android-over-ADB remains the mature path.
Prerequisites
Install libimobiledevice:
brew install libimobiledevice(macOS) orsudo apt install libimobiledevice-utils(Linux). Windows hosts have limited support — use WSL2 or a macOS/Linux host.Pair the device once: run
idevicepair pairand tap Trust on the iPhone. iOS 17+ requires this pairing step before any tool will see the device.If several iPhones are connected, pass the
udidparameter (fromsassy_iphone_list) to target one.
Tools: sassy_iphone_list, sassy_iphone_info, sassy_iphone_screenshot, sassy_iphone_syslog (bounded capture), sassy_iphone_apps, sassy_iphone_install (requires confirm='YES'). Every tool degrades gracefully when the binaries or a trusted device are missing — you'll get an install hint or a pairing reminder, never a traceback.
Dynamic Vision
Desktop (Vision module)
Traditional MCP screenshots are blind — you capture one frame and hope it's the right one. SassyMCP's dynamic vision changes this:
Tool | Purpose |
| Fast grayscale capture at ~3-6KB. Call repeatedly to "watch" the screen. |
| Monitor for N seconds, returns only frames where content changed (pixel diff threshold). |
| Before/after comparison — takes frame, waits, takes another, returns both + a diff image highlighting changes. |
All three use grayscale + heavy JPEG compression to keep context cost minimal. A glance is ~2KB vs ~14KB for a full-color capture.
Android (PhoneScreen module)
The phone isn't just a camera target — SassyMCP reads its UI accessibility tree:
Tool | Purpose |
| Reads every visible UI element — text, description, coordinates, clickable/focused/checked state. Structured data, not pixels. |
| Foreground app, screen on/off, battery, WiFi, notification count. |
| Low-res grayscale phone screenshot via direct pipe (~4-8KB). |
| Monitors UI tree changes over duration. Returns snapshots only when elements change. |
Phone Interaction
Full touch input via ADB — the AI can operate the phone:
Tool | Purpose |
| Tap screen coordinates |
| Swipe between two points |
| Type text into focused field |
| Send key events (HOME, BACK, ENTER, VOLUME, etc.) |
| Launch an app by package name |
Sensitive Context Detection
All interaction tools (tap, swipe, type) automatically scan the UI tree before executing. If they detect login screens, payment forms, account selectors, 2FA prompts, or permission dialogs, the tool refuses to execute and returns what it sees instead. The AI then describes the screen to you and asks what to do. Pass confirmed=True after explicit user approval.
Safe Delete (Delete Interception)
AI agents can hallucinate destructive commands. SassyMCP intercepts all delete-family commands across every shell and every tool entry point, then moves targets to a _DELETE_/ staging folder instead of destroying them. Every interception is written to the audit log with the raw command, parsed targets, and move results.
Coverage — every destructive path is gated:
Tool | Guard |
| Intercepts delete commands, stages targets to |
| Same interceptor — persistent terminals can't bypass |
| Refuses destructive commands on the remote host |
| Refuses destructive commands on Android device (override with |
| Explicit staging tool — moves symlinks as symlinks (no |
| Snapshots existing file into |
| Refuses protected paths, snapshots existing content to |
| Refuses existing destination (no silent overwrite), refuses protected src/dst |
| Refuses silent destination overwrite, refuses protected src/dst |
| Rotates the audit log instead of deleting it; requires |
Intercepted command keywords: rm, rmdir, unlink (Unix/WSL), del, erase, rd (CMD), Remove-Item, ri, rni (PowerShell aliases), sdelete / sdelete64 (Sysinternals).
Also caught (beyond bare keywords):
Shell wrappers —
powershell -c "del foo",cmd /c del foo,bash -c "rm foo",wsl -- rm foo(payload is recursively scanned)Base64 payloads —
powershell -EncodedCommand <base64>is decoded (UTF-16-LE) and recursively scanned.NETcalls —[System.IO.File]::Delete(...),[System.IO.Directory]::Delete(...)Clear-Content,Set-Content -Value ''(literal empty only — normal-Value "foo"is allowed)Out-File -Force,New-Item -Force(overwrite-style)copy /y,xcopy /y— CMD silent-overwrite flagsrobocopy /MIRandrobocopy /PURGE— mirror/purge modes delete destination filesTruncate-by-redirect —
> file.txt,type foo > bar.txt,cmd; > file.txt(append>>and stream2>/&>correctly ignored)Move-Item foo $nullAssignment prefixes —
$null = ri foois correctly unwrapped
Protected roots (refused by every guarded tool, not just the interceptor): the SassyMCP source tree itself, ~/.sassymcp/ (audit + config), and any _DELETE_/ staging folder (no staging recursion). Protection uses resolve() so path traversal (..\), symlinks, and Windows 8.3 short names all normalize correctly before the check.
Scenario | Result |
| Hard-blocked by the always-on blocklist — no move attempted |
| Blocked, file moved to |
| Blocked, all |
| Blocked, |
| Blocked — payload is unwrapped and intercepted |
| Blocked — |
| Prior content snapshotted to |
| Executes normally — not a delete command |
Name collisions in _DELETE_/ are handled automatically with counter suffixes (file.txt, file_1.txt, file_2.txt). On Windows, paths with backslashes (C:\Users\foo\bar) are preserved correctly by the parser — no shlex mangling.
Pause / Resume
For complex flows where the user needs to take over:
Tool | Purpose |
| Blocks all interaction tools. Observation tools (ui, glance, watch) still work. |
| Unblocks interaction. AI picks up where it left off, informed by everything it observed during pause. |
Workflow:
AI operates phone autonomously for routine tasks
AI hits a login screen → sensitive context auto-blocks → AI tells the user
User says "hold on" → AI calls
sassy_phone_pauseUser logs in manually. AI watches via
sassy_phone_ui/sassy_phone_glanceUser says "done" → AI calls
sassy_phone_resumeAI continues, now aware the user logged into a specific account
Permission Engine & Control Panel
SassyMCP gates the shell and file tools through one policy engine
(sassymcp.policy) with four modes, set via sassy_permission set_mode or
the Control Panel:
Mode | Behavior |
| Block destructive patterns everywhere (default) |
| Destructive patterns return a confirm token |
| Relaxed gating inside the project roots; anything resolving outside the jail is refused — run an ungated model, confined to a folder |
| Allow everything except protected paths (explicit, audited) |
A Claude-style allow / ask / deny rules layer (tool-glob + path-glob +
command-regex; first match wins) overrides the mode default. The
catastrophic block-list (format, mkfs, …) and the protected-path
invariant (the SassyMCP source tree + ~/.sassymcp) hold in every mode,
including bypass.
The Control Panel is a localhost web UI for all of the above — a live
event log, the settings/mode editor, and a classifier + rules editor. It
binds 127.0.0.1 only and needs the per-install token in
~/.sassymcp/control_panel.token. Start it with sassy_panel start (or set
panel.enabled / SASSYMCP_PANEL=1 to launch it at boot), then open the
printed http://127.0.0.1:8765/?token=… URL.
Tool profiles
Tool profiles gate which tools an MCP session can see (tools/list) and
call (tools/call) — a per-session, human-controlled subset of the
catalog, managed from the Control Panel (a Profiles tab, backed by
GET/POST /api/profile). There is deliberately no MCP tool that can
switch or widen the profile, so a session can never escalate itself out of
a restrictive profile; fan-out through sassy_batch respects the same
gate.
Profile | Tool groups |
| All 18 groups (default on every start) |
| meta, core, infrastructure, utility, github_quick, github_full, v020, memory, persona, setup, updater |
| meta, core, infrastructure, forensics, utility, system, memory |
| meta, core, infrastructure, android, iphone, utility, memory |
| meta, core, infrastructure, system, linux, utility, memory, updater |
| Every tool whose curated MCP annotation is |
| An explicit group set you tick in the dashboard |
Rules worth knowing:
Session-scoped, never persisted. A restart always comes back up on
full. Profiles are a runtime seatbelt, not access control — the panel token is the trust boundary.metastays on. Its introspection tools (sassy_tool_groups,sassy_self_check, …) are the session's only window into what it can see; hiding them would strand the session with no way to inspect the gate.Widening needs
confirm='YES'. Any switch that would expose a currently-hidden tool is an audited escalation and requires explicit confirmation (the panel UI sends it for you, mirroring the bypass-mode convention). Narrowing never does.A tool hidden from
tools/listis also uncallable viatools/call— a client cannot call what it cannot see.
Guided Setup
On first launch (no ~/.sassymcp/persona.md), the wizard tools are prominently available and the AI is given an onboarding playbook via the registered hook. The flow is conversational — the AI asks, you answer, it calls the tools.
Onboarding procedure (recommended order)
Each step is independent and skippable. Just tell the AI "set up SassyMCP" or "let's get started" and it'll walk this:
# | Step | Tool | What happens |
0 | License (optional) |
| Reports supporter tier. All tools are unlocked regardless — a key just registers your seat and supporter status. |
1 | Persona |
| Asks the questionnaire below, generates |
2 | GitHub |
| Validates an existing |
3 | SSH / Linux |
| Locates |
4 | Optional tools |
| Scans for |
✓ | Status check |
| Shows what's configured, what's still missing, and the action_required hint. Run this any time. |
⚙️ | Auth tokens |
| Generates a 32-byte URL-safe token for HTTP/tunnel mode and writes |
Skip any step with action="skip" (where supported) — config records the skip so the AI doesn't re-prompt.
The persona questionnaire
sassy_setup_wizard accepts these fields. All optional — defaults shown.
Field | Values / format | Default |
|
|
|
|
|
|
| Comma-separated areas — e.g. | empty |
| Comma-separated — e.g. | empty |
| Comma-separated — e.g. | empty |
| Newline-separated | empty |
| Newline-separated | empty |
|
|
|
|
|
|
| Which AI tools connect — e.g. | empty |
| Free-form text — anything else the AI should know about how you work | empty |
Output goes to ~/.sassymcp/persona.md (the persona module reads it on every session) and the run is recorded in ~/.sassymcp/config.json (setup_complete, setup_timestamp, setup_version). Re-run sassy_setup_wizard any time to regenerate — the persona module hot-reloads with the new profile.
Triggering the flow from your client
The onboarding hook fires on phrases like "setup", "first time", "get started", "onboard", "new user", "set up sassymcp". Anything close to those will pull the playbook into the AI's context. If you want to drive it manually, just call sassy_setup_status first to see where you are, then walk the table above.
Smart Loading
By default, SassyMCP only loads frequently-used tool groups. This keeps tool definitions under 5% of your context window.
# Default: loads core, github_quick, persona, meta, utility, setup, infrastructure
uv run sassymcp
# Load everything (~22K tokens of context)
SASSYMCP_LOAD_ALL=1 uv run sassymcp
# Load specific groups
SASSYMCP_GROUPS=core,github_quick,android,v020 uv run sassymcpAvailable Groups
Group | Modules | Default |
| fileops, shell, ui_automation, editor, audit, session | Yes |
| meta | Yes |
| observability, state_manager, runtime_config | Yes |
| github_quick (6 lean tools) | Yes |
| persona | Yes |
| utility | Yes |
| setup_wizard, tools_manager | Yes |
| memory | Yes |
| updater | Yes |
| combos (4 tools) | No |
| prompts (slash-menu shortcuts) | Yes |
| github_ops (80 tools) | No |
| adb, phone_screen | No |
| network_audit, process_manager, security_audit, registry, bluetooth, eventlog, clipboard | No |
| vision, app_launcher, web_inspector, crosslink | No |
| linux | No |
Install
Pick whichever entry point matches how you already work. All four converge on the same shared brain at ~/.sassymcp/ — your persona, memory, license, and audit log are visible to every connected MCP client.
One-click via DXT (Claude Desktop)
Download sassymcp.dxt from the latest release, double-click — Claude Desktop installs it. On first launch, sassymcp auto-detects every other MCP client on your machine (Cursor, VS Code Copilot, Windsurf, Continue, Cline, Zed, Grok Desktop) and patches each one's config so they all see SassyMCP without you editing any JSON.
VS Code extension
Install the VS Code extension from the .vsix attached to the latest release until the Visual Studio Marketplace listing is live. The extension locates sassymcp.exe (PATH or the sassymcp.exePath setting), runs the same auto-config CLI, and adds a status bar item showing supporter-tier label and brain health. Command palette: Open Sassy Brain Cockpit, Run Setup Wizard, Reinstall Client Configs, Open Audit Log, Open _DELETE_ Folder, Show Brain Status.
Manual auto-config CLI
If you have sassymcp.exe already (from the portable zip or pip install) and want to register it with every MCP client without per-client JSON editing:
sassymcp-installThat detects Claude Desktop, VS Code Copilot, Cursor, Windsurf, Continue, Cline, Zed, and Grok Desktop and patches each one's config atomically. Re-running is a noop. Take a look first with sassymcp-install --dry-run. Remove with sassymcp-install --uninstall. The CLI takes a timestamped backup of any existing config before its first edit.
Portable bundle
The portable zip (sassymcp-v*-portable.zip with bundled adb, nmap, plink, scrcpy, tesseract, cloudflared, and the start-*.bat launchers) is no longer published — the release pipeline does not build it. Use the standalone executable below (and install any helper tools you need on PATH), or pip install sassymcp for the full Python install.
Standalone executable (no tools bundled)
If you don't need the bundled nmap / adb / cloudflared (or you have them on PATH already), grab just sassymcp.exe (~35 MB) from the latest release. Drop it anywhere and point your MCP client at it.
First-run wizard: Double-click sassymcp.exe (or run it from a terminal with no flags) on a fresh machine and you'll get an interactive menu — auto-detect AI agents and register SassyMCP, activate a LemonSqueezy license key, generate / list bearer tokens, or start the HTTP server. Run sassymcp.exe setup anytime to re-open the menu. Once a persona is configured, bare invocation falls back to starting the HTTP server (the v1.5 behavior) so existing setups are unchanged.
Linux (pip only)
CI publishes no Linux binary. On Linux, install the wheel: pip install sassymcp. (The standalone executable is Windows-only; macOS ships a universal2 binary — see sassymcp-macos on the release page.)
MSI installer (manual builds only)
No MSI is published by CI — build-msi.ps1 exists for manual MSI builds (WiX 3.x) from a staged sassymcp.exe, and installer.wxs is a manual-build reference template, not a maintained installer.
Activating a supporter license (optional)
There is no separate "licensed download" and nothing to unlock — everyone runs the same fully-unlocked binary from the GitHub releases. If you want to support development, buy a license at sassyconsultingllc.com/store and activate it to register your seat and supporter tier:
# from your AI agent:
sassy_setup_license action=activate key=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
# or from a terminal — interactive menu, choose "Activate license":
sassymcp.exe setupThe license registers this machine as a LemonSqueezy instance (seat);
sassy_setup_license action=deactivate frees the seat to move to another machine.
From source
git clone https://github.com/sassyconsultingllc/SassyMCP.git
cd SassyMCP
uv sync
# Optional dependencies:
uv pip install pytesseract playwright
playwright install chromiumCloudflare Tunnel (remote access)
Want to drive SassyMCP from a remote MCP client (Claude Web, another machine)? The portable bundle ships a turnkey launcher. Full step-by-step is in docs/TUNNEL.md; the short version:
winget install Cloudflare.cloudflared # one-time
cloudflared tunnel login # authenticate against your CF account
cloudflared tunnel create sassymcp # create a named tunnel
cloudflared tunnel route dns sassymcp mcp.<your-domain>.tld
# Write ~/.cloudflared/config.yml with the ingress block (see TUNNEL.md)
[Environment]::SetEnvironmentVariable("SASSYMCP_AUTH_TOKEN", "<your token>", "User")
[Environment]::SetEnvironmentVariable(
"SASSYMCP_ALLOWED_HOSTS",
"mcp.<your-domain>.tld,localhost,127.0.0.1", "User")
cd D:\Tools\SassyMCP # wherever you extracted
.\start-tunnel.bat sassymcp # tunnel name as arg, or set SASSYMCP_TUNNEL_NAMEstart-tunnel.bat launches the HTTP bridge on 127.0.0.1:21001 and runs cloudflared tunnel run <name> in the foreground. Nothing in the script is vendor-specific — you supply the tunnel name and the hostname. Clients send Authorization: Bearer <SASSYMCP_AUTH_TOKEN> against https://mcp.<your-domain>.tld/mcp.
For hosted-Claude clients that require OAuth 2.1 DCR/PKCE instead of a static bearer, deploy the optional Worker under sassymcp-oauth/ — copy wrangler.toml.example to wrangler.toml, fill in your hostname and KV id, and wrangler deploy. See docs/TUNNEL.md for the full OAuth section.
MCP Client Config
SassyMCP speaks standard MCP. Anything that connects works — no client-side modifications required. The portable bundle ships ready-to-edit templates under deploy/*_config.template.json. Pick the row for your client, copy the template, replace REPLACE_WITH_PATH with the absolute path to sassymcp.exe, and save it where the client expects.
Client | Transport | Config file location | Template |
Claude Desktop | stdio |
|
|
Cursor | stdio |
|
|
Windsurf | stdio |
|
|
Cline (VS Code) | stdio | VS Code settings → | use |
Continue.dev | stdio |
|
|
Grok Desktop | HTTP | Grok Desktop MCP settings |
|
Any other MCP client | stdio or HTTP | client's MCP config | use the closest template; the |
Standard mcpServers shape (Claude Desktop, Cursor, Windsurf, Cline)
Using the exe:
{
"mcpServers": {
"sassymcp": {
"command": "C:\\path\\to\\sassymcp.exe",
"env": {
"SASSYMCP_LOAD_ALL": "1",
"GITHUB_TOKEN": "ghp_your_token_here"
}
}
}
}From source:
{
"mcpServers": {
"sassymcp": {
"command": "uv",
"args": ["--directory", "C:\\path\\to\\SassyMCP", "run", "sassymcp"],
"env": {
"SASSYMCP_LOAD_ALL": "1",
"GITHUB_TOKEN": "ghp_your_token_here"
}
}
}
}Continue.dev shape (different schema)
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "C:\\path\\to\\sassymcp.exe"
}
}
]
}
}HTTP / Grok Desktop / custom HTTP clients
Run the server in HTTP mode (sassymcp.exe --http, default 127.0.0.1:21001) and point your client at http://127.0.0.1:21001/mcp/. Set SASSYMCP_AUTH_TOKEN if the bind is non-loopback.
{
"mcpServers": {
"sassymcp": {
"url": "http://127.0.0.1:21001/mcp/"
}
}
}What's actually Claude-flavored (cosmetic only)
A few docstrings and the legacy .claude/skills/sassymcp-update.md slash-command target Claude Code specifically. Other clients ignore them and use sassy_update_* tools directly. No tool, transport, or auth path requires Claude — the server doesn't know which LLM is on the other end.
Transport Modes
Mode | Command | Use Case |
Stdio |
| Claude Desktop, Cursor (direct pipe) |
HTTP |
| Grok Desktop, Windsurf (localhost:21001) |
HTTP LAN |
| Multi-device (requires auth token) |
HTTPS |
| Encrypted (auto-generates self-signed cert) |
SSE |
| Legacy transport |
Running Multiple Instances (Dual Session)
Two SassyMCP processes on the same machine — for example, a local stdio instance for Claude Desktop and a remote HTTPS instance behind a Cloudflare Tunnel for Claude Web — can clobber each other's state if they share ~/.sassymcp/. The fix is one env var per instance.
Conflicts to resolve per-instance
Resource | Default | How to give each instance its own |
HTTP port |
|
|
Crosslink HTTP port |
|
|
Auth token | env | Set per-process in launcher's env |
Per-user state dir |
|
|
SSL cert/key |
| Auto-isolated when |
Example: local stdio + remote tunnel side-by-side
Instance A — local stdio for Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"sassymcp-local": {
"command": "C:\\Tools\\SassyMCP\\sassymcp.exe",
"env": {
"SASSYMCP_LOAD_ALL": "1",
"SASSYMCP_HOME": "C:\\Users\\<you>\\.sassymcp-local"
}
}
}
}Instance B — remote HTTPS via Cloudflare Tunnel (start-tunnel.bat + a wrapper that sets the env):
set SASSYMCP_HOME=C:\Users\<you>\.sassymcp-remote
set SASSYMCP_AUTH_TOKEN=<token-for-remote>
set PORT=21002
"%~dp0sassymcp.exe" --http --host 127.0.0.1 --port %PORT%Then cloudflared tunnel run <name> forwards https://<your-tunnel>/mcp to 127.0.0.1:21002.
What's isolated when SASSYMCP_HOME differs
Each instance gets its own:
persona.md— different profiles per sessionconfig.json— different runtime config (allowed dirs, blocked commands, etc.)tokens.json— different scoped auth tokenslicense.json— separate license activationaudit.log/audit.jsonl— no interleaved writescrosslink.db— separate cross-session message queuesmemory.db— separate persistent memoriestool_state.db/tool_usage.json— separate per-tool state and usage analyticsserver.crt/server.key— separate self-signed certsThe
_securityprotected-paths check honorsSASSYMCP_HOMEtoo — neither instance cansassy_safe_deleteinto the other's home
What's still shared between instances
The repo source tree (always protected from delete/overwrite by
_security)%LOCALAPPDATA%\SassyMCP\updates\— the updater download stage (harmless; tagged by version under it)The bundled tools in the portable zip (
adb,nmap,cloudflared, etc.) — read-only from both instances
Putting it in the OS (so both start at boot)
The legacy personal/autostart-bridge.bat + personal/register-autostart.ps1 template is gitignored — copy it, tweak the paths and the SASSYMCP_HOME for each instance, then Register-ScheduledTask once per instance.
Environment Variables
Variable | Purpose |
| Load every tool group |
| Load specific groups |
| Bearer token for HTTP auth |
| Enable live reload (dev mode) |
| Disable the startup update check (no GitHub API call) |
| Override the per-user state dir (default |
| Override the auto-detected repo root in |
| GitHub API access |
| Remote Linux hostname/IP |
| Remote Linux username |
| Remote Linux password |
External Tools
All bundled in the beta zip package. Install separately only if using the standalone exe.
Tool | Used By | Bundled | Install (if needed) |
ADB | All | Yes | |
nmap |
| Yes | |
plink |
| Yes | |
scrcpy |
| Yes | |
Tesseract |
| Yes | |
Chrome |
| No |
Run sassy_setup_check_tools to verify all tools are detected.
Requirements
Windows 10/11, macOS 12+, or Linux — one source, routed at the head (
sassymcp._platform) to the right command per host. See Cross-platform below.Python 3.11+ (only if running from source; the standalone binary is self-contained — built per OS, since PyInstaller can't cross-compile)
Cross-platform
The same SassyMCP source runs on Windows, macOS, and Linux. The host OS is
resolved once at import; every tool then routes to the host-appropriate
command — shells (PowerShell / zsh|bash), clipboard (Get-Clipboard / pbpaste),
event log (Get-WinEvent / log show / journald), firewall (netsh /
socketfilterfw / ufw), Wi-Fi, Bluetooth, window control (pywinauto /
AppleScript System Events / wmctrl), SSH (plink / native ssh), package
installs (winget / brew / apt), and more.
Build:
build.bat(Windows) orbuild.sh(macOS/Linux). Build each binary on its own OS.macOS permissions: window-control and screenshot tools need Accessibility and Screen Recording permission for the app running SassyMCP (System Settings → Privacy & Security).
A handful of concepts are Windows-only by nature (raw Registry read/write/export); those report a clear message and point to the native equivalent (
defaults, launchd). Forensic persistence (sassy_autorun_entries) IS cross-platform (Run keys / LaunchAgents / systemd+cron).
License
Proprietary - Copyright (c) 2026 Sassy Consulting LLC. All rights reserved.
Available Tools
101 toolssassy_audit_clearA
Mutating but non-destructive: rotates the active audit logs rather than deleting anything. Requires confirm='YES'; anything else is refused. Renames $SASSYMCP_HOME/audit.log and audit.jsonl (default ~/.sassymcp) to audit.cleared..log/.jsonl, then logs the rotation itself into the fresh log. Nothing is ever unlinked, so forensic history is preserved in the archives. Use when you want a fresh log tail while keeping history; prefer sassy_audit_log or sassy_audit_search for reading entries.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false. The description adds critical behavior: it is mutating yet non-destructive, requires confirm='YES', renames specific files with a timestamped pattern, logs the rotation into the fresh log, and preserves forensic history. This is substantial context beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries operative information: state mutation, safety, required confirmation, exact file paths and naming, self-logging behavior, and usage guidance. There is no filler, and the key safety and usage constraints are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation tool, this description is complete: it covers prerequisites, behavior, effect on files, safety, and when to choose alternatives. The output schema exists, so return-value detail is not required. Nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a 'confirm' string with an empty default and no description. The description fully compensates by stating that confirm must equal 'YES' and that anything else is refused, making the parameter's role and validation unambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (rotates active audit logs) and a specific resource, explicitly contrasting with deletion. It is clearly distinguished from sibling tools like sassy_audit_log and sassy_audit_search by naming what it is not meant for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'Use when you want a fresh log tail while keeping history.' It also names the alternatives, sassy_audit_log and sassy_audit_search, and tells the agent to prefer them for reading. No usage ambiguity remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_audit_false_positivesARead-onlyIdempotent
Read-only. Surfaces recent shell-interceptor pattern events from the local JSONL audit log (~/.sassymcp/audit.jsonl) as rows of timestamp | event | pattern | command (truncated to 120 chars). count caps rows (default 20), newest last. include_bypasses defaults to True, showing both pattern_block entries (commands refused) and pattern_bypass entries (allowed via sassy_shell's allow_pattern); set it False to see only refused commands. Use it to diagnose why a sassy_shell command was blocked and to pick the exact allow_pattern label for a retry. For general log history use sassy_audit_log.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| include_bypasses | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as read-only, idempotent, and non-destructive, and the description reinforces that with 'Read-only.' It adds meaningful behavioral detail beyond the annotations: the exact log file path, truncation to 120 characters, newest-last ordering, row format, and the meaning of the two event types. This gives the agent a clear picture of what executing the tool will and won't do.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose and format first, then parameter semantics, then explicit usage guidance and sibling routing. It front-loads the read-only nature and the core function before going into details, and avoids repetition of schema field names without adding context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a complete, self-sufficient description for a two-parameter read-only tool. It includes the data source, row format, ordering, truncation, defaults, event types, and explicit use cases. Since an output schema exists, the description need not detail return structure, and it still provides enough context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates for both parameters. It explains count as capping rows with a default of 20, and include_bypasses as controlling whether pattern_bypass entries are included, with defaults and the effect of setting it to False. This is exactly the semantic content the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it 'surfaces recent shell-interceptor pattern events from the local JSONL audit log' and even gives the file path. It clearly distinguishes itself from the sibling sassy_audit_log by saying 'For general log history use sassy_audit_log.' The purpose is further sharpened with the diagnostic use cases: explaining blocked commands and picking an allow_pattern label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool: 'Use it to diagnose why a sassy_shell command was blocked and to pick the exact allow_pattern label for a retry.' It also names the key alternative, sassy_audit_log, for general log history. Parameter guidance is embedded by explaining what include_bypasses=True vs False shows, so an agent knows how to configure the call for the two scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_audit_logARead-onlyIdempotent
Read-only. Returns the tail of the audit log (~/.sassymcp/audit.log), which records every tool call with timestamp, tool name, and sanitized (secret-redacted) arguments, plus policy and interceptor events. count sets how many of the most recent lines are returned (default 50), newest last. Use it to review what tools were called recently and with what arguments. When you need entries matching a term rather than the plain tail, use sassy_audit_search.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. The description adds specific behavioral context: log location (~/.sassymcp/audit.log), the record types, and the fact that arguments are sanitized/secret-redacted, plus the ordering and default count. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The read-only flag is front-loaded, followed by purpose, content, parameter behavior, and a sibling pointer. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with an output schema, the description covers what it returns, how the parameter behaves, and the use case. Nothing essential is missing; an agent can call it correctly without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has only 'count' with no description (coverage 0%). The description fully compensates by explaining that count sets the number of most recent lines returned, defaults to 50, and that output is newest last. This is essential for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the tail of the audit log, specifies the content (timestamp, tool name, sanitized arguments, policy/interceptor events), and explicitly contrasts with sassy_audit_search. This distinguishes it from siblings without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states 'Use it to review what tools were called recently and with what arguments' and directs the agent to sassy_audit_search when searching for a term. This provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_audit_searchARead-onlyIdempotent
Read-only. Filters the audit log (~/.sassymcp/audit.log) for a case-insensitive keyword match on each line; keyword is required. Returns up to count matching lines (default 50), newest last, or a no-match notice. Use it to trace a specific command, pattern label (e.g. 'pattern_block'), or tool name through the log. For the unfiltered recent tail use sassy_audit_log; for structured interceptor block/bypass rows use sassy_audit_false_positives.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | ||
| keyword | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false. The description adds behavioral detail beyond that: keyword matching is case-insensitive and line-based, results are newest last, count defaults to 50, and a no-match notice is returned. This gives a clear behavioral picture, though it doesn't mention edge cases like a missing log file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place. The description front-loads the read-only safety signal and core filtering behavior, then efficiently covers use cases, default behavior, and sibling differentiation without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool with annotations and an output schema, the description is complete: it specifies the target file, matching semantics, ordering, default count, no-match behavior, and intended use cases. Nothing critical is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden. It compensates well: keyword is described as required and used for case-insensitive per-line matching, and count is described as limiting the result to up to count matching lines with default 50. This adds meaningful semantics beyond the bare schema fields, though it doesn't state any maximum or validation constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it filters the audit log for a case-insensitive keyword match. It also names the log path, required keyword, and return behavior, making the tool's purpose unambiguous and distinct from siblings like sassy_audit_log and sassy_audit_false_positives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit: use it to trace a specific command, pattern label, or tool name. It also names sibling alternatives with the conditions that select them ('unfiltered recent tail' → sassy_audit_log; 'structured interceptor block/bypass rows' → sassy_audit_false_positives), providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_batchADestructive
Read-only or mutating depending on its operations: it is a scheduling primitive, not a policy bypass: every operation goes through the normal tool call path — validation, audit, security/confirmation, and per-group rate limiting. operations is a JSON array of {"tool":..., "args":...} (max 50 operations; sassy_batch cannot be nested). max_concurrent caps simultaneous runs (1-16, default 5). timeout_seconds is a per-operation ceiling (default 60.0). stop_on_error (default false) skips pending operations after the first failure. Failures never raise: results return in request order, each with index, tool, ok, elapsed_ms, result, and error. Use for independent fan-out; prefer stop_on_error for dependent pipelines and sequential calls when steps depend on prior results.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | ||
| stop_on_error | No | ||
| max_concurrent | No | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| failed | Yes | |
| results | Yes | |
| requested | Yes | |
| succeeded | Yes | |
| elapsed_ms | Yes | |
| max_concurrent | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by detailing execution behavior: operations run through the normal tool call path, failures never raise, results return in request order with specific fields, and there are hard limits on operations and concurrency. It also acknowledges the tool can be either read-only or mutating, aligning with readOnlyHint=false and destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: it covers dual-mode behavior, safety context, parameter semantics, error semantics, return format, and usage guidance. There is no filler or tautology, and critical warnings appear early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides enough detail for an agent to invoke the tool correctly: required operations structure, optional parameters with defaults, return value shape, and selection guidance. Even with an output schema present, describing the per-result fields adds completeness rather than redundancy.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, and it succeeds: it explains the operations array format and max 50 operations, max_concurrent range and default, timeout_seconds as a per-operation ceiling, and stop_on_error semantics. It even specifies that sassy_batch cannot be nested, which is critical for agents constructing valid parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies sassy_batch as a scheduling primitive for running multiple tool operations, clarifying that it can be read-only or mutating depending on the operations. It does not state a crisp one-line verb phrase like 'executes a batch of tool calls,' but the purpose is discernible from the explanation and usage guidance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use for independent fan-out; prefer stop_on_error for dependent pipelines and sequential calls when steps depend on prior results.' It also clarifies what the tool is not — a policy bypass — and explains that every operation runs through normal validation, audit, security, and rate limiting, which helps an agent decide when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_clickADestructive
Mutating: performs a real mouse click on the host desktop. Clicks at absolute screen coordinates (x, y required) with button defaulting to 'left' (also 'middle', 'right') and clicks defaulting to 1 for double-clicks and beyond. Coordinates are absolute across all monitors, so call sassy_screen_info first (or sassy_desktop_state) to find monitor positions and window locations. Works on Windows, macOS, and Linux via pyautogui. Use it for clicking GUI elements; use sassy_hotkey for keyboard shortcuts and sassy_type_text for entering text.
| Name | Required | Description | Default |
|---|---|---|---|
| x | Yes | ||
| y | Yes | ||
| button | No | left | |
| clicks | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true; the description adds that it is 'Mutating', performs a 'real mouse click', uses absolute coordinates across all monitors, and works cross-platform via pyautogui. This is meaningful context beyond the annotations, though it could have noted potential side effects like moving the cursor or focusing windows.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences deliver the essential behavior, parameter semantics, coordinate caveat, prerequisite, and sibling alternatives with no wasted words. The opening 'Mutating' immediately signals the tool's nature.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple schema, destructiveHint annotation, and presence of an output schema, the description fully covers what the tool does, how to use it correctly, and when to prefer alternatives. An agent can invoke it without external documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains x/y as required absolute screen coordinates, button options ('left' default, also 'middle', 'right'), and clicks semantics (default 1, for double-clicks and beyond). All four parameters are meaningfully described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('performs a real mouse click on the host desktop') and explicitly contrasts with sassy_hotkey and sassy_type_text, so the agent can distinguish this tool from its siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('Use it for clicking GUI elements'), identifies alternatives ('use sassy_hotkey for keyboard shortcuts and sassy_type_text for entering text'), and recommends a prerequisite call to sassy_screen_info or sassy_desktop_state for coordinates. This is complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_context_estimateARead-onlyIdempotent
Read-only. Estimates how much of the context window is consumed by currently registered MCP tool definitions, reporting total estimated tokens, percentage of a 200K window, the heaviest tools, tool count, and actionable recommendations (e.g. disable unused groups, drop github_full when tool count is high). Takes no parameters. If the tool registry cannot be read, it returns a note pointing to the SASSYMCP_LOAD_ALL / SASSYMCP_GROUPS environment settings instead of numbers. Use this first when context feels low or before enabling heavy groups; follow up with sassy_tool_groups to see what is loaded and sassy_tool_group_toggle to disable what you do not need.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces 'Read-only.' Beyond annotations, it discloses a concrete fallback behavior: if the registry cannot be read, it returns a note referencing SASSYMCP_LOAD_ALL / SASSYMCP_GROUPS instead of numbers. This is valuable non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description earns its place: what the tool does, what it reports, that it is parameterless, the fallback behavior, and when to use it. The structure front-loads the core purpose and the usage guidance comes at the end, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and an output schema, so the description does not need to describe return structure. It covers the fallback case, expected output, and follow-up actions, making the description complete for safe and correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema already reflects that, so the description does not need much. However, it explicitly states 'Takes no parameters,' which removes any ambiguity and reinforces the empty input schema. This adds slight value beyond the schema, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: it 'estimates how much of the context window is consumed by currently registered MCP tool definitions.' It also specifies the output contents (total estimated tokens, percentage, heaviest tools, tool count, recommendations), making it easy to distinguish from sibling tools. It even names follow-up tools, reinforcing its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use this first when context feels low or before enabling heavy groups.' It also tells the agent what to do next—follow up with sassy_tool_groups and sassy_tool_group_toggle—so the agent knows the intended workflow and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_copyAIdempotent
Mutating: duplicates a file or an entire directory tree. Files are copied with metadata (shutil.copy2); directories copy recursively. Parent directories of the destination are created as needed. Refuses protected sources or destinations (SassyMCP source tree, ~/.sassymcp) and refuses sources on the sensitive-read denylist (SSH keys, AWS/GPG credentials, /etc/shadow, browser login DBs, SassyMCP tokens) — copying such material is treated as read-equivalent exfiltration and refused like a content read. Also refuses to overwrite an existing destination — run sassy_safe_delete on the destination first if you really need to replace it. Use it to duplicate files or trees; use sassy_move when you want to relocate rather than duplicate.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description directly contradicts the idempotentHint annotation. It states 'refuses to overwrite an existing destination,' meaning a second call with the same destination would fail, making the operation non-idempotent. This is a clear contradiction to the annotation's idempotentHint: true. Because the description's behavior conflicts with the annotation, the transparency score is reduced to 1.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but not overly verbose. Every sentence contributes value: it states the copying behavior, metadata handling, directory recursion, parent directory creation, restrictions, overwrite refusal, and usage guidance. The opening 'Mutating:' is redundant with the annotations, but overall the structure is logical and information-dense. It earns a 4 for being comprehensive without excessive fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential aspects needed to call the tool: what it does, restrictions, overwrite behavior, and alternatives. Since an output schema exists, the description doesn't need to explain return values. It lacks explicit parameter definitions, but that is partially compensated by schema context. The main gap is the inconsistency with annotations, which affects trust but not completeness. It is nearly complete, so a 4 is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no descriptions for the 'source' and 'destination' parameters (0% coverage), so the description must compensate. It implies these parameters through context, such as 'duplicates a file or directory' and 'Parent directories of the destination are created as needed,' which gives some meaning. However, it never explicitly defines what each parameter represents, their formats, or constraints beyond inferable context. This is adequate but not fully explicit, hence a score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'duplicates a file or an entire directory tree.' It specifies the verb (duplicate) and resource (file or directory), and distinguishes it from sassy_move by explicitly naming the alternative. This is unambiguous and allows an agent to understand exactly what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use it to duplicate files or trees; use sassy_move when you want to relocate rather than duplicate.' It also mentions using sassy_safe_delete if overwrite is needed. This clearly differentiates when to use this tool versus alternatives and gives practical advice for handling the no-overwrite constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_desktop_stateARead-onlyIdempotent
Read-only. Lists visible open windows with title and absolute left/top/width/height coordinates spanning all monitors, returned as lean JSON. include_taskbar defaults to False, filtering out taskbar entries. Windows-only for window enumeration (pywinauto UIA backend); macOS enumerates via System Events and needs Accessibility permission granted to the app running SassyMCP; Linux returns an unsupported error. Requires a GUI session; headless hosts return an error. Use it with sassy_screen_info to locate UI elements before sassy_click, or for a quick sense of what is open on the desktop.
| Name | Required | Description | Default |
|---|---|---|---|
| include_taskbar | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: platform-specific behavior (Windows pywinauto UIA backend, macOS System Events with Accessibility permission, Linux unsupported error), the include_taskbar default behavior, and the requirement for a GUI session. It doesn't describe the exact JSON return shape, but the output schema exists and the description says 'lean JSON'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose, then covers the parameter, platform behavior, prerequisites, and usage context. Every sentence adds information. It's slightly long but each clause earns its place given the cross-platform complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one optional boolean parameter and an output schema, the description is nearly complete. It covers platform differences, prerequisites, and usage context. The only minor gap is that it doesn't explicitly state what happens on headless hosts beyond 'return an error' (which it does state), and it doesn't detail the exact JSON structure, but the output schema covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains the include_taskbar parameter's default (False) and its effect ('filtering out taskbar entries'). This adds meaning beyond the bare schema property definition. The description could have gone further with more detail on what 'taskbar entries' means, but it's sufficient for a single boolean parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lists') and resource ('visible open windows') with precise detail: title and absolute left/top/width/height coordinates spanning all monitors, returned as lean JSON. It clearly distinguishes itself from siblings like sassy_screen_info and sassy_click by describing its role in the UI automation workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: 'Use it with sassy_screen_info to locate UI elements before sassy_click, or for a quick sense of what is open on the desktop.' It also provides platform-specific guidance (Windows vs macOS vs Linux) and prerequisites (GUI session, Accessibility permission on macOS), which helps an agent decide when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_diffARead-onlyIdempotent
Read-only. Compares two files and returns a unified diff. Both files are read as UTF-8 (decoding errors replaced); returns an error if either path does not exist. context_lines (integer, default 3) sets how many unchanged lines surround each hunk. The response includes identical (true when files match), lines_added and lines_removed counts, and diff text truncated at 20,000 characters. It compares file contents only, not metadata like timestamps or permissions. Use it to verify exactly what changed between two file versions before copying, restoring, or reviewing them.
| Name | Required | Description | Default |
|---|---|---|---|
| path_a | Yes | ||
| path_b | Yes | ||
| context_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses substantial behavior: UTF-8 decoding with replacement, error behavior for missing paths, default and effect of context_lines, response fields (identical, lines_added, lines_removed, truncated diff text), and the fact that metadata is ignored. This goes well beyond what the annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: read-only status and core action first, then encoding, errors, parameters, output, scope, and use case. Each sentence adds distinct information without redundancy, making it efficient for an agent to parse and act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with an output schema and strong annotations, the description covers all essential operational aspects: inputs, defaults, error cases, output contents and truncation limit, scope limitations, and a recommended use case. An agent has everything it needs to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter documentation burden. It clearly explains context_lines ('sets how many unchanged lines surround each hunk') and its default of 3. path_a and path_b are referred to as 'two files' and the encoding/error behavior adds useful meaning, though the description could more explicitly define their roles as source and target for diff direction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Compares two files and returns a unified diff,' a specific verb and resource that clearly identifies the tool's function. It further distinguishes itself from siblings like read_file or file_info by emphasizing content-only comparison and diff output, leaving no ambiguity about its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a concrete use case: 'Use it to verify exactly what changed between two file versions before copying, restoring, or reviewing them.' It also clarifies that it compares file contents only and not metadata, which implicitly steers agents away from using it for metadata checks. However, it does not explicitly name alternative tools or state when not to use it, so the guidance is clear but not fully exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_edit_blockADestructive
Mutating: replaces a single exact occurrence of old_text with new_text in an existing file, and the prior contents are snapshotted into the adjacent DELETE/ staging folder before anything is written, so the change is recoverable. Refuses protected paths and refuses to run when old_text has multiple exact matches (add more context to make it unique). If there is no exact match, nothing is written: a fuzzy fallback (80% similarity) reports the closest text and a character diff instead. Reading is UTF-8 with error replacement; encoding and line endings are preserved. Returns a preview of the changed region with line numbers. Use it for one surgical edit; prefer sassy_edit_multi for batching several edits in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| new_text | Yes | ||
| old_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the destructiveHint annotation by explaining the snapshot-to-staging recovery mechanism, path protections, multi-match refusal, fuzzy fallback with similarity threshold, UTF-8 handling, encoding/line-ending preservation, and returned preview. No contradiction exists between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description opens with the core action and mutation flag, then delivers dense but purposeful behavioral details. Every sentence adds necessary information about safety, matching, encoding, return value, or sibling routing; nothing feels redundant or decorative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with sparse schema descriptions and only destructiveHint in annotations, this description is complete: it covers safety/recoverability, failure modes, fallback behavior, encoding handling, output preview, and when to use an alternative. An agent has enough context to invoke it correctly and anticipate outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates fully: old_text is the exact text to match, new_text is the replacement, and path refers to an existing file. It also explains the uniqueness requirement for old_text and the fuzzy-match behavior, adding important semantic detail not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: replacing a single exact occurrence of old_text with new_text in an existing file. It clearly distinguishes this tool from sassy_edit_multi by explicitly positioning it for one surgical edit, and the uniqueness condition differentiates it from broader file-write tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage guidance: use for one surgical edit and prefer sassy_edit_multi for batching several edits. It also states refusal conditions (protected paths, multiple exact matches, no exact match) and the fallback behavior, so an agent knows when the tool will not perform as expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_edit_multiADestructive
Mutating: applies several surgical edits to one existing file in a single call, with the prior contents snapshotted into the adjacent DELETE/ staging folder first. edits is a JSON string array of {"old", "new"} objects, applied in order against the evolving content. Any edit whose old text has zero or more than one match aborts the whole call before anything is written, so nothing is partially applied. The file must exist and protected paths are refused. Returns only a count of applied edits, no preview. Use it to batch multiple unique-match changes in one file; use sassy_edit_block when you want a single edit with a context preview.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| edits | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already flag destructiveHint=true and readOnlyHint=false, and the description adds valuable behavior beyond that: prior contents are snapshotted into a staging folder, any non-unique match aborts the entire call before writing, edits apply in order, protected paths are refused, and only a count of applied edits is returned. No contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: mutation warning, snapshot behavior, edits format and ordering, abort semantics, preconditions, return behavior, and sibling routing. The most safety-critical information is front-loaded with 'Mutating' and the all-or-nothing guarantee is stated early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating two-parameter tool, the description covers format, ordering, atomicity, side effects, constraints, return value, and alternatives. With an output schema present and annotations supplied, nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden for parameters. It clearly defines edits as a JSON string array of {'old', 'new'} objects applied in order. The path parameter is only implied through 'the file must exist' and 'one existing file', but combined with the schema's required path string this is enough to use the tool correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'applies several surgical edits to one existing file in a single call'. It also explicitly distinguishes itself from the sibling sassy_edit_block, which is framed as the single-edit alternative. An agent can tell exactly what this tool does without opening any other definitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Use it to batch multiple unique-match changes in one file; use sassy_edit_block when you want a single edit with a context preview.' It also states preconditions like 'The file must exist' and that protected paths are refused, which helps an agent avoid invalid calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_env_getARead-onlyIdempotent
Read-only. Returns the value of one environment variable from the SassyMCP server process; returns an error if the variable is not set. If the variable name contains token, key, secret, password, or api (case-insensitive), the value is masked: values longer than 12 characters show the first 4 and last 4 characters, shorter ones show as ****. Non-sensitive values are returned in full. Use it to check a single variable; use sassy_env_list when you need to browse the environment or do not know the exact name.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses critical behavior: it returns an error when the variable is unset and masks sensitive values based on the variable name, including the exact masking rule. This is rich behavioral context that annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately detailed but every sentence earns its place: read-only note, core behavior, error case, masking rule, and sibling routing. It is front-loaded with the most important information and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only getter with an output schema and safety annotations, the description covers everything an agent needs: what it returns, when it errors, how masking works, and when to choose a sibling tool. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero schema description coverage for the only parameter 'name', the description compensates fully by indicating that the parameter is an exact environment variable name. It also adds parameter-dependent semantics: whether the returned value is masked depends on substrings in the variable name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Returns the value of one environment variable' from a specific process (SassyMCP server), giving a precise verb, resource, and scope. It also differentiates itself from sibling sassy_env_list by emphasizing it handles a single, known variable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('check a single variable') and when to use sassy_env_list instead ('browse the environment or do not know the exact name'). This gives an agent unambiguous routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_env_listARead-onlyIdempotent
Read-only. Lists environment variables of the SassyMCP server process, sorted by name, with their count. filter_str (string, default empty) limits results to variable names containing that case-insensitive substring. Values that look sensitive (names containing token, key, secret, password, api, or credential) are masked to the first 4 and last 4 characters (or **** if short); other values are truncated at 200 characters. Use it to discover available variables before calling sassy_env_get, and use sassy_env_set to change one.
| Name | Required | Description | Default |
|---|---|---|---|
| filter_str | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint=false, idempotentHint, and destructiveHint=false. The description adds substantial behavioral context beyond that: the output is sorted with a count, sensitive values are masked with a specific rule, non-sensitive values are truncated at 200 characters, and filtering is case-insensitive. This fully discloses behavior without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: read-only marker, output format, filter behavior, masking rule, truncation rule, and usage routing. The structure is logical and efficient with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single optional parameter and an output schema (which handles return-shape documentation), the description covers all necessary call-time knowledge: what is listed, ordering, counting, masking, truncation, and how to use the filter. Nothing essential is missing for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full burden for the filter_str parameter. It does so by specifying the type, default, and precise semantics: limits results to variable names containing the case-insensitive substring. This is complete and adds meaning the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Lists') and resource ('environment variables of the SassyMCP server process'), along with formatting details (sorted by name, with count). It explicitly differentiates from sibling tools by naming sassy_env_get and sassy_env_set as related but distinct actions, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description explicitly says to use this tool to discover available variables before calling sassy_env_get, and directs that changes go through sassy_env_set. This provides clear when-to-use guidance and routes to the correct alternatives without requiring the agent to infer from names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_env_setAIdempotent
Mutating: changes the process environment of the running SassyMCP server. Sets one variable immediately for the server process and anything it spawns from this point on. It does NOT modify system or user environment settings, and the change is lost when the server restarts. Returns the variable name, scope process, and an expiry note. Use it only for values needed during the current session; for permanent configuration change the OS or shell profile instead of calling this.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: it is ephemeral ('lost when the server restarts'), scoped to the process only, returns 'the variable name, scope process, and an expiry note,' and explicitly disclaims system/user modification. These are non-obvious traits the agent could not infer from readOnlyHint=false or idempotentHint=true, and there is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core mutating behavior, followed by scope, exclusions, return value, and usage guidance. Every sentence adds distinct information with no redundancy or filler, making it efficient and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with two simple string parameters, an output schema, and annotations that already cover read-only/destructive/idempotent traits, the description supplies everything needed to invoke it correctly: what it does, its ephemeral scope, return value, and an explicit alternative. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It frames the two parameters as a variable name and value within the server process scope, giving them meaning beyond the bare titles 'Name' and 'Value.' It stops short of describing edge cases like value formatting or validation, but the core semantics are clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: changes the process environment of the running SassyMCP server' and states it 'Sets one variable immediately for the server process and anything it spawns from this point on.' This gives a specific verb, resource, and scope, and clearly distinguishes the tool from sassy_env_get/list and permanent-config tools by noting it does NOT touch system or user environment settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use it only for values needed during the current session; for permanent configuration change the OS or shell profile instead of calling this.' This states the when-to-use condition and names the concrete alternative, leaving no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_file_infoARead-onlyIdempotent
Read-only. Returns JSON metadata for a path: resolved absolute path, type (file or directory), size in bytes, and modified/created epoch timestamps. For files it adds a line count (and last line index); Excel files (.xlsx, .xls, .xlsm) also get sheet names with row and column counts via openpyxl. For directories it adds item, file, and directory counts of the immediate children. Use it to inspect a path before reading or editing it; use sassy_list_dir to browse a directory's entries and sassy_read_file for contents.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the core safety profile is covered. The description reinforces read-only behavior and adds useful state disclosure (e.g., Excel files handled via openpyxl, directory counts of immediate children). It doesn't disclose any hidden side effects or permissions, but given the strong annotation coverage, the added detail is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly long but well-structured, front-loading the purpose and read-only nature, then detailing type-specific behaviors, and ending with usage guidance. Each sentence contributes unique information; no filler. It could be tightened (e.g., splitting into bullet points), but the density is appropriate for a tool with this much conditional output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description need not enumerate return types, but it goes further by describing edge cases (Excel files, directory counts) and usage context. It covers when to use, what to expect, and routes to alternatives, making it complete for an agent to invoke correctly without further lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single 'path' parameter with zero description coverage, so the description must compensate. It explains that 'path' refers to a file or directory path and details what metadata will be returned for that path, giving the parameter meaning beyond its bare type. It doesn't specify path format constraints (e.g., absolute vs relative), but it still adds substantial semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it is a read-only tool that returns JSON metadata for a path, enumerating the specific data (absolute path, type, size, timestamps, line counts, Excel sheet info, directory counts). It also explicitly distinguishes itself from sibling tools sassy_list_dir and sassy_read_file, so an agent can easily tell it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use it to inspect a path before reading or editing it', and names two alternatives with their distinct purposes (sassy_list_dir for browsing directory entries, sassy_read_file for contents). This leaves no ambiguity about when to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_get_configARead-onlyIdempotent
Read-only. Returns the full SassyMCP configuration plus a live system snapshot: the config dict (default shell, file read/write line limits, allowed directories, blocked commands, interceptor and permission-engine settings, panel port/enabled), OS and Python details, process and system memory, disk usage, PID, uptime seconds, CPU count, loaded tool groups, and tool-usage stats from the audit log. Takes no parameters. Use to inspect current server settings before calling sassy_set_config, or to diagnose performance and environment issues. Prefer over guessing config values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description reinforces this with "Read-only." It adds useful behavioral context by specifying that it returns a live snapshot including system, process, and audit-derived stats, which goes beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but well-organized with a colon-introduced list of returned fields. It is somewhat long, but every component—contents, no-params note, usage context, and preference guidance—serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only configuration tool, the description covers what it returns, when to use it, why it is useful, and that no arguments are needed. The presence of an output schema further reduces the burden of describing return structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and 100% coverage, so there is little to add. The description still explicitly states "Takes no parameters," removing any ambiguity for the agent, which is appropriate at the baseline for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: "Returns the full SassyMCP configuration plus a live system snapshot," then enumerates the contents in detail. It clearly differentiates from sibling sassy_set_config by framing this as the inspection counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: "Use to inspect current server settings before calling sassy_set_config, or to diagnose performance and environment issues." It also advises "Prefer over guessing config values," which tells the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_getARead-onlyIdempotent
Read-only. Fetches one file from a repo and returns its contents plus SHA. Required: owner, repo, path (repo-relative file path). Optional ref (branch, tag, or commit SHA; default empty means the repo default branch). The API returns base64 content, but this tool decodes it for you and replaces the content field with decoded_content (UTF-8, errors replaced). Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). Use to read a file before pushing an updated copy with sassy_ghq_push; use sassy_ghq_get for directory paths only if you want the raw directory listing object. For the fuller variant (explicit tree traversal options) use the github_full tool sassy_gh_get_file_contents.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | No | ||
| path | Yes | ||
| repo | Yes | ||
| owner | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavioral detail: base64 decoding with UTF-8 replacement, the content field being replaced by decoded_content, GitHub token requirements, and default ref behavior. This is context beyond the structured fields and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and then methodically adds auth, parameter semantics, decoding behavior, and sibling routing. Every sentence earns its place, with no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only file fetch, the description covers prerequisites (token), parameter semantics, behavior (decoding), and how it relates to sibling tools. An output schema is present, so return structure does not need restating. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full semantic burden. It explains required owner, repo, path (repo-relative), and optional ref with allowed values and default behavior, covering every parameter meaningfully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Fetches one file from a repo and returns its contents plus SHA.' It also distinguishes itself from related tools by naming sassy_ghq_push as the paired write operation and sassy_gh_get_file_contents as the fuller alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: read a file before pushing an updated copy, use directory-path retrieval only when a raw directory listing is desired, and use a fuller variant for explicit tree traversal options. Names the exact alternatives and the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_issueA
Mutating: creates a GitHub issue in the given repo. Required: owner, repo, title. Optional body (default empty string) and labels as a comma-separated string, e.g. labels bug,docs becomes a label array. Returns the created issue as JSON. Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). This is the lean daily-driver create path; for assignees, milestones, or other fields use the github_full tool sassy_gh_create_issue. To find existing issues first, call sassy_ghq_issues; to add a comment to an existing issue, use the github_full tool sassy_gh_add_issue_comment.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| repo | Yes | ||
| owner | Yes | ||
| title | Yes | ||
| labels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish mutation and non-idempotency. The description adds valuable context beyond annotations: it requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN) and returns the created issue as JSON. This is useful behavioral disclosure for a mutating tool, though it doesn't cover failure modes or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: core behavior first, then required/optional parameters with an example, then token requirement, then routing to alternatives. Every sentence earns its place and no information is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter create tool with an output schema, the description is complete: all parameters explained, defaults given, label encoding clarified, auth requirement stated, return value mentioned, and alternative tools named. An agent can call this tool correctly with the information provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It explicitly identifies required owner/repo/title, documents body's empty-string default, and explains that labels is a comma-separated string converted to a label array with a concrete example. Every parameter is meaningfully covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'creates a GitHub issue in the given repo'. It also differentiates itself from the sibling 'github_full sassy_gh_create_issue' by framing itself as the 'lean daily-driver create path'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: use the github_full tool for assignees/milestones/other fields, use sassy_ghq_issues to find existing issues first, and use sassy_gh_add_issue_comment for comments. It also states required fields, leaving no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_issuesARead-onlyIdempotent
Read-only. Lists issues in a repo, 30 per page. Required: owner, repo. Optional state (open is default; closed or all are valid) and page (default 1; GitHub pages are 1-indexed). Returns the issue list as JSON. Note the GitHub issues endpoint includes pull requests in its results, so some entries may be PRs. Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). Use for a quick daily-driver listing; for label filters, sorting, direction, or custom page sizes use the github_full tool sassy_gh_list_issues. To create an issue use sassy_ghq_issue.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| repo | Yes | ||
| owner | Yes | ||
| state | No | open |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description goes well beyond this by disclosing the pagination behavior (30 per page), the auth requirement (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN), and the significant gotcha that the GitHub issues endpoint includes pull requests in results. These are exactly the behavioral traits an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose ('Read-only. Lists issues in a repo, 30 per page.') and every subsequent sentence earns its place: parameter requirements, return format, the PR gotcha, auth, and alternative routing. It is on the longer side at eight sentences, but the density of non-redundant, decision-relevant information justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, all parameters, return format, auth prerequisites, a behavioral gotcha, and alternative tool routing. An output schema exists for return values, and annotations cover the safety profile. Nothing an agent needs to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter semantics. It compensates well: it marks owner and repo as required, documents state's valid values (open default; closed or all), and explains page's default and 1-indexed convention. Owner and repo are self-evident from their names, so the description covers all non-obvious parameter behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Lists issues in a repo, 30 per page.' It clearly states the read-only nature and distinguishes itself from siblings by naming sassy_ghq_issue (create) and sassy_gh_list_issues (full-featured alternative). An agent can immediately understand what this tool does and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is provided: 'Use for a quick daily-driver listing; for label filters, sorting, direction, or custom page sizes use the github_full tool sassy_gh_list_issues. To create an issue use sassy_ghq_issue.' This names concrete alternatives and the exact conditions that select them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_prA
Mutating: creates a pull request. Required: owner, repo, title, head (source branch containing your commits), base (target branch the PR merges into, e.g. main). Optional body (default empty string). Returns the created PR as JSON. Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). The tool itself creates immediately with no draft mode; for draft PRs or more control use the github_full tool sassy_gh_create_pr. To review an existing PR end-to-end (metadata, diff, comments, CI status) in one call, use sassy_combo_pr_review instead of fetching pieces manually.
| Name | Required | Description | Default |
|---|---|---|---|
| base | Yes | ||
| body | No | ||
| head | Yes | ||
| repo | Yes | ||
| owner | Yes | ||
| title | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the tool is mutating, creates immediately, has no draft mode, returns the created PR as JSON, and requires a GitHub token. The annotations already mark readOnlyHint=false, and the description adds meaningful behavioral context that an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then covers required parameters, optional body, token requirement, immediate creation behavior, and alternatives in a compact, organized way. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a pull request creation tool, this description covers the action, required and optional parameters, output format, authentication, behavioral caveats, and when to choose sibling tools. With annotations and an output schema also present, the description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does clarify head as 'source branch containing your commits,' base as 'target branch the PR merges into,' and body's default empty string. Owner, repo, and title are not elaborately described, but their standard meaning is reasonably inferable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'creates a pull request.' It also differentiates this tool from related alternatives like sassy_gh_create_pr and sassy_combo_pr_review, so an agent can clearly identify which tool is which.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool versus alternatives: 'The tool itself creates immediately with no draft mode; for draft PRs or more control use ... sassy_gh_create_pr' and 'To review an existing PR end-to-end ... use sassy_combo_pr_review.' It also lists required inputs and the token requirement, leaving little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_protectAIdempotent
Mutating: applies a fixed branch-protection preset to branch (default main) in owner/repo. The preset blocks force pushes and deletions and enforces the rules on admins, but sets no required status checks and no required PR reviews. Returns the protection result as JSON. Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). Use for the quick standard lock-down of main; for custom rules (required reviews, approval counts, status checks, allowing force pushes) use the github_full tool sassy_gh_protect_branch instead, and to inspect or remove protection use sassy_gh_get_branch_protection or sassy_gh_remove_branch_protection.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| owner | Yes | ||
| branch | No | main |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool as mutating, non-destructive, and idempotent, and the description adds valuable context: it blocks force pushes and deletions, enforces rules on admins, sets no required status checks or reviews, returns JSON, and requires a GitHub token. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the key action and preset details, then gives auth requirements and routing guidance. Every sentence adds necessary information with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the return structure does not need to be re-explained. The description covers auth prerequisites, exact preset behavior, branch default, and alternatives, making it complete for correct invocation of this three-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the parameter-semantics burden. It clarifies that branch defaults to main and references owner/repo context. Since owner and repo are conventional GitHub identifiers and the branch behavior is explicitly described, this is sufficient, though the description could be slightly more explicit about the expected forms of owner and repo.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: it applies a fixed branch-protection preset to a branch in owner/repo. It further differentiates itself from sassy_gh_protect_branch, sassy_gh_get_branch_protection, and sassy_gh_remove_branch_protection by naming what this tool does and does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance is present: use this for the quick standard lock-down of main, use sassy_gh_protect_branch for custom rules, and use the get/remove tools to inspect or remove protection. An agent knows exactly when to choose this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_ghq_pushADestructive
Mutating: creates or updates multiple files in one atomic commit via the Git Data API, avoiding the SHA/ETag problems of single-file writes. Required: owner, repo, branch (must be the target branch name, e.g. main or a feature branch), message (commit message), files as a JSON string: an array of {path, content} objects. Malformed files JSON returns an error instead of pushing. Each file write overwrites the existing content at that path, so get the current content with sassy_ghq_get first when editing existing files. Requires a GitHub token (GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN). For single-file operations, branches, or repos the github_full tool sassy_gh_push_files is the fuller equivalent.
| Name | Required | Description | Default |
|---|---|---|---|
| repo | Yes | ||
| files | Yes | ||
| owner | Yes | ||
| branch | Yes | ||
| message | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and non-idempotent. The description adds context consistent with those hints: atomic commit, overwriting of file contents, error on malformed JSON, and the requirement of a GitHub token. This goes well beyond the annotation data and prepares the agent for side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value: core purpose, required parameters, format notes, error behavior, overwrite warning, auth requirement, and an alternative tool. The description is front-loaded with the most important information and stays focused without verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with no parameter descriptions and a destructive annotation, this description covers purpose, usage, side effects, authentication, and alternatives. The output schema exists to handle return values, so nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so comprehensively: branch must be the target branch name (with examples), message is the commit message, and files must be a JSON string array of {path, content} objects. This adds meaning the schema cannot convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'creates or updates multiple files in one atomic commit via the Git Data API'. It also explains the benefit of avoiding SHA/ETag problems, and explicitly differentiates from a single-file equivalent, making it easy for an agent to distinguish this tool from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: when editing existing files, the agent should first get content with sassy_ghq_get; for single-file operations, branches, or repos, the tool sassy_gh_push_files is named as the fuller alternative. This gives clear when-to-use and when-not-to-use instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_hooks_activateAIdempotent
Mutating session state: appends the named hook to the in-memory active hook list (hooks can be stacked). Read the playbook carefully afterward. hook_name is the exact hook ID; if not found, the tool returns an error plus the available hook names and substring-based suggestions. On success it returns the full expert playbook: name, owning module, description, and step-by-step instructions covering which tools to use, in what order, what to look for, and what not to do. Use sassy_hooks_list first to discover valid hook names. Activate a hook when a task matches a known domain and you want structured expert guidance; use sassy_hooks_deactivate to unload it.
| Name | Required | Description | Default |
|---|---|---|---|
| hook_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining that hooks can be stacked, that the hook list is in-memory, and what happens on both success and failure. It also tells the agent to read the returned playbook carefully. The only slight tension is 'appends' vs the idempotentHint, but stacking is described as possible rather than guaranteed, so no contradiction is evident.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value: the mutating effect is front-loaded, followed by the prerequisite, error behavior, success return, and when to use alternatives. It is detailed but not bloated, and no sentence is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema, the description covers the essential context: what the hook is, how to find it, what to expect on failure, what is returned on success, and how to undo the action. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates: it defines hook_name as 'the exact hook ID,' describes lookup-failure behavior, and points to sassy_hooks_list for discovering valid names. This adds meaning well beyond the bare property name in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: it 'appends the named hook to the in-memory active hook list.' It also clarifies the mutating nature and distinguishes itself from related hook tools like sassy_hooks_list and sassy_hooks_deactivate, so an agent can tell it apart at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is explicitly conditioned: 'Activate a hook when a task matches a known domain and you want structured expert guidance.' It also tells the agent to use sassy_hooks_list first and sassy_hooks_deactivate to unload, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_hooks_deactivateAIdempotent
Mutating: removes hooks from the in-memory active list for this session. hook_name is optional; pass a specific active hook name to deactivate just it, or pass nothing to clear all active hooks at once. Returns {"deactivated": name} on success or {"status": "all hooks deactivated"} when clearing; attempting to deactivate a hook that is not active returns an error. Use it when a playbook no longer applies to the task or you want a clean slate before activating a different one; use sassy_hooks_list to see which hooks are currently active.
| Name | Required | Description | Default |
|---|---|---|---|
| hook_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and idempotentHint=true, and the description aligns with that. It adds valuable context beyond annotations: the session-scoped nature, the optional behavior (specific hook vs. clearing all), and the error case for non-active hooks. It does not over-explain but covers the key behavioral nuances.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose ('removes hooks'). Every sentence adds value: behavior, return formats, error case, and usage context. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, the description covers all necessary context: what the tool does, when to use it, how to use it, expected returns, and error behavior. The presence of an output schema is not needed because return shapes are described explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one optional parameter with no description (coverage 0%), but the description fully compensates. It explains that hook_name is optional, that passing a name deactivates that specific hook, and that omitting it clears all hooks. This is complete parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (removing hooks from the in-memory active list) and the resource (hooks). It distinguishes this tool from siblings like sassy_hooks_activate and sassy_hooks_list by naming the specific scope (session) and the contrast with listing active hooks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: when a playbook no longer applies or you want a clean slate before activating a different hook. It also names the alternative sassy_hooks_list for inspecting active hooks, providing a clear decision path for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_hooks_listARead-onlyIdempotent
Read-only. Lists every registered operational hook with metadata only (no full instructions): name, owning module, one-line description, and trigger phrases, plus a count and the names of currently active hooks. Takes no parameters. Use this to discover which playbooks exist before calling sassy_hooks_activate; if you know the user's request but not the right hook, use sassy_hooks_suggest to rank matches against the request text first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive safety, so the bar is lower. The description adds valuable behavioral context beyond annotations by stating it returns 'metadata only (no full instructions)' and includes a count plus names of currently active hooks. This clarifies a significant limitation an agent would otherwise discover only after calling the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly-written sentences front-load the essential listing behavior, then state the lack of parameters, then give usage routing. Every sentence earns its place, with no filler or repeated annotation details beyond a single-word 'Read-only.'
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only listing tool with rich annotations and an output schema, the description is complete: it states scope, output composition, what is excluded, and how to route to alternatives. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, for which the baseline is 4. The description redundantly states 'Takes no parameters,' which is already obvious from the empty schema but removes any ambiguity. No additional parameter semantics are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Lists' with a precise resource ('every registered operational hook') and clearly defines the scope and output ('metadata only: name, owning module, one-line description, trigger phrases, count, active hooks'). This makes it immediately distinguishable from sibling tools like sassy_hooks_activate, sassy_hooks_suggest, and sassy_hooks_deactivate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use this tool to discover playbooks before calling sassy_hooks_activate, and use sassy_hooks_suggest instead when the request is known but the right hook is not. This names both when and when-not to use the tool, fully meeting the criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_hooks_suggestARead-onlyIdempotent
Read-only. user_text is the user's request in free text (required); the tool scores it against each hook's trigger phrases and returns ranked matching hooks, the top_match name, and a hint naming the hook to consider activating. Returns an empty suggestion list with a note to proceed without a playbook when nothing matches. Use when you are unsure which hook applies or proactively when a request sounds like a known domain; then call sassy_hooks_activate with the top match.
| Name | Required | Description | Default |
|---|---|---|---|
| user_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral context: it returns ranked hooks, a top_match, and a hint, and specifies the empty-list behavior with a note to proceed without a playbook. This enriches what the annotations alone convey without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the read-only nature, then covers the core behavior, output, edge case, and usage guidance in three sentences. No filler; every sentence earns its place. Structure is logical and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter, an output schema (implicitly providing return structure), and clear annotations, the description fully covers what an agent needs: input semantics, output composition, empty-result handling, and when to use it. The reference to the sibling activation tool ties it into the workflow. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden for the single parameter. It explains user_text as 'the user's request in free text (required)' – sufficient to convey the meaning and that it's free-form. While it doesn't give format examples, the description compensates for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (scores), resource (hooks), and outcome (returns ranked matching hooks, top_match, hint). It clearly distinguishes from sassy_hooks_activate by describing its role as a precursor. It also covers the empty-result edge case, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'Use when you are unsure which hook applies or proactively when a request sounds like a known domain.' It then directs the agent to call sassy_hooks_activate with the top match, naming the next step. This is direct and actionable, with no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_hotkeyADestructive
Mutating: sends a real keyboard shortcut to the host. keys is a '+'-separated combination, e.g. 'ctrl+c', 'alt+tab', 'ctrl+shift+s', split and passed to pyautogui. Works on Windows, macOS, and Linux. There is no output validation beyond the confirmation echo, so verify the effect with sassy_screenshot if it matters. Use it for shortcuts like save, copy, or window switching; use sassy_type_text to type actual text into a field and sassy_click for mouse actions.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description proactively labels the tool as 'Mutating,' matching the destructiveHint annotation, and discloses that it sends a real keyboard shortcut via pyautogui. It adds important caveats beyond annotations: there is no output validation beyond a confirmation echo, so the agent should verify effects with sassy_screenshot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the mutation warning, then follows a logical structure: purpose, key syntax, platform support, verification caveat, and sibling routing. Every sentence carries useful information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, mutating tool, this description is complete. It covers what the tool does, how to format the parameter, which platforms it supports, what the output reliability is, and when to use alternatives. The presence of an output schema means the return format does not need to be detailed in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only provides a bare 'keys' string with no description, so the description fully compensates by explaining that keys are '+'-separated and by providing multiple valid examples. It also reveals the implementation detail that the string is split and passed to pyautogui, which helps the agent format the input correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact action—'sends a real keyboard shortcut to the host'—and clarifies the resource being manipulated. Concrete examples like 'ctrl+c' and 'ctrl+shift+s' make the purpose unambiguous and distinguish it from sibling text and mouse tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool: 'Use it for shortcuts like save, copy, or window switching.' It also names the alternatives—sassy_type_text for typing text and sassy_click for mouse actions—and even recommends sassy_screenshot for verification when the effect matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_httpADestructive
Can mutate or read depending on method. GET, HEAD, and OPTIONS run freely; POST, PUT, PATCH, and DELETE require allow_mutating=True (default False). Only http and https URLs are accepted, and SSRF validation blocks private IPs, link-local addresses, and cloud metadata endpoints. headers is a JSON object string, body is a UTF-8 string, timeout_seconds defaults to 15, and redirects are followed automatically. Returns status code, headers dict, method, url, and body, which is JSON-parsed when possible and otherwise plain text truncated at 10,000 characters. Use it for quick API calls; prefer web_inspector for deep page inspection.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | ||
| body | No | ||
| method | No | GET | |
| headers | No | ||
| allow_mutating | No | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=true) are general, but the description adds crucial behavioral detail: method-specific safety, SSRF protection (private IPs, link-local, cloud metadata), redirect following, JSON parsing, and 10,000-character truncation. It also clarifies the exact mutation gate, exceeding what annotations convey. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value: safety model, URL restrictions, parameter formats, response handling, and usage guidance. It is well-ordered, front-loads the mutation gate, and avoids redundancy despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple methods, security constraints, response parsing) and the existence of an output schema, the description covers all agent-relevant aspects: allowed methods, safety checks, parameter semantics, defaults, response structure, and usage routing. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the description compensates fully by explaining every parameter: headers as JSON object string, body as UTF-8 string, timeout_seconds default 15, method default GET, allow_mutating default False, and url as the target. It adds formats, defaults, and behavior beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool makes HTTP requests with read or mutate semantics depending on method, and explicitly distinguishes itself from web_inspector for deep page inspection. It names specific verbs (GET, HEAD, OPTIONS vs POST, PUT, PATCH, DELETE) and resource scope (HTTP/HTTPS URLs), leaving no ambiguity about purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('quick API calls') and when to prefer an alternative ('prefer web_inspector for deep page inspection'). Also provides conditional usage rules: mutating methods require allow_mutating=True, and only http/https URLs are allowed. No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_http_pingARead-onlyIdempotent
Read-only. Health-checks one or more URLs with a HEAD request each and reports status code plus round-trip time. urls is a single comma-separated string. Each URL gets a 5-second timeout, redirects are followed, and the response lists per-URL results (status code and ms), with status blocked when SSRF validation rejects a URL or error when the request fails. SSRF protection blocks private IPs, link-local addresses, cloud metadata, and non-http(s) schemes. Use it for quick up/down and latency checks; prefer sassy_http when you need the response body or anything beyond HEAD.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavioral details beyond the annotations: 5-second timeout per URL, redirect following, per-URL result structure (status code and ms), status values for blocked/error, and SSRF protections (private IPs, link-local, cloud metadata, non-http(s)). This far exceeds the readOnlyHint and idempotentHint already provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured with the core purpose first, followed by technical details and usage guidance. Every sentence adds value—no filler—and it remains compact despite covering timeout, redirects, SSRF, and response format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple health-check tool, the description is comprehensive: it covers input format, behavioral constraints, error/block handling, and selection criteria versus the sibling. Combined with the readOnlyHint and idempotentHint, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'urls' as a string with no description (0% coverage). The description compensates by specifying that it is 'a single comma-separated string,' which is essential for correct invocation. This fully clarifies the parameter format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool health-checks URLs with HEAD requests and reports status code and round-trip time. It explicitly distinguishes from the sibling sassy_http (which is for response bodies), making its purpose unambiguous and unique.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('quick up/down and latency checks') and when not to ('when you need the response body or anything beyond HEAD'), naming the alternative sassy_http. This provides clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_list_dirARead-onlyIdempotent
Read-only. Lists directory entries with [FILE] and [DIR] prefixes, directories sorted before files alphabetically. depth controls recursion (default 2, clamped to 1-10). Below the top level, dotfiles and node_modules/pycache/.git are skipped, and per-level caps apply (500 entries at top, 100 deeper, 1000 lines total) with warnings naming how many items were hidden. Use it to explore a directory tree; use sassy_file_info for metadata about one path and sassy_read_file to read a file's contents.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| depth | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses important behavioral quirks: dotfiles and common directories are skipped below the top level, per-level entry caps apply, depth is clamped, and warnings name how many items were hidden. This is exactly the kind of non-obvious behavior an agent needs to anticipate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The most important information (read-only, listing behavior) is front-loaded, followed by non-obvious limits and sibling routing. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter directory listing tool, the description covers ordering, recursion, hidden entries, caps, warnings, and usage guidance. The output schema already explains return shape, so no additional output documentation is needed. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, but the description compensates well for `depth` by explaining recursion, default value, and clamping to 1-10. The `path` parameter is not explicitly described, but its meaning is strongly implied by 'directory entries' and 'directory tree', so the slight gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read-only. Lists directory entries' and immediately specifies the exact resource and behavior: directory listing with [FILE]/[DIR] prefixes and sorted output. It clearly distinguishes itself from siblings by stating that metadata queries belong to sassy_file_info and content reads belong to sassy_read_file.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use it to explore a directory tree' and names the sibling tools for other needs, making the when-to-use and when-not-to-use boundary explicit. This is textbook-level routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_contextARead-onlyIdempotent
Read-only: loads the standard session-start context bundle in one call. Call this at the START of every session. project (default "") is an optional substring filter that adds a project_memories section. Returns a dict with eight sections: critical (up to 10 priority-critical records), high_priority (up to 10), active_tasks (up to 10 tagged task-active), blockers (up to 10 tagged blocker), recent_memories (up to 10 most recently updated), project_memories (up to 15, only when project is given), patterns (up to 10 tagged pattern), and milestones (up to 5 newest). Use instead of issuing many separate searches at startup; use sassy_memory_search for targeted follow-up queries and sassy_memory_recall for one exact record.
| Name | Required | Description | Default |
|---|---|---|---|
| project | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| blockers | Yes | |
| critical | Yes | |
| patterns | Yes | |
| milestones | Yes | |
| active_tasks | Yes | |
| high_priority | Yes | |
| recent_memories | Yes | |
| project_memories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, but the description adds valuable context: it is a bulk loader, limits counts per section, and includes optional project filtering. It confirms the read-only nature and explains output structure, going beyond the bare annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loads the purpose and usage instruction, then details the output sections efficiently. Every sentence adds value, though it is slightly long due to enumerating sections, but that is essential for clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single optional parameter, comprehensive annotations, and presence of an output schema, the description covers everything needed: when to call, what it returns, and alternatives. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It explains the 'project' parameter as an optional substring filter that adds a project_memories section, providing critical meaning that the schema lacks. This fully clarifies the parameter's role.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool loads a standard session-start context bundle in one call, specifies it is read-only, and enumerates the exact sections returned. It differentiates from siblings by naming sassy_memory_search and sassy_memory_recall as alternatives for different needs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call at the START of every session, and provides clear when-not-to-use guidance by pointing to sassy_memory_search for targeted follow-ups and sassy_memory_recall for one exact record. This leaves no ambiguity about when to invoke this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_forgetADestructive
Mutating and destructive: permanently deletes the single memory record whose key exactly matches. key (required) must match exactly — only that one record is removed, and there is no undo, trash, or recovery. Returns {"forgotten": true|false, "key", "error"}; forgotten is false with an error message if no record matches. Use only when stored information is obsolete, wrong, or should not persist across sessions. Milestones written by sassy_memory_log live in a separate append-only table and cannot be deleted by this tool. Never use to clear state at session end — that is what sassy_memory_handoff is for.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| error | Yes | |
| forgotten | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description layers on substantial additional context: irreversibility ('no undo, trash, or recovery'), exact-match semantics, the forgotten:false error path when no record matches, and the exclusion of sassy_memory_log milestones. All statements are consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, each carrying a distinct fact: core action, match/irreversibility, return contract, usage condition, milestone exclusion, and handoff routing. It is front-loaded with the destructive action and contains zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive delete with annotations and an output schema, nothing an agent needs to invoke it correctly is missing: purpose, safety profile, return semantics, exclusion of milestones, and the routing alternative are all present. No open questions remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains the single parameter meaningfully: 'key (required) must match exactly — only that one record is removed,' plus the no-match error behavior. The '(required)' hint slightly duplicates the schema's required array, but the exact-match and single-record semantics are genuine added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'permanently deletes the single memory record whose key exactly matches' — with precise single-record scope. This differentiates it from siblings like sassy_memory_search, sassy_memory_remember, and sassy_memory_log without opening any of their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('Use only when stored information is obsolete, wrong, or should not persist across sessions') and an explicit when-not-to-use with a named alternative ('Never use to clear state at session end — that is what sassy_memory_handoff is for'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_handoffA
Mutating: runs the session-end handoff protocol — three writes at once. task (required) names the work. status defaults to "in-progress" (also: blocked, needs-review, paused, completed). completed, next_steps, blockers, files_touched are comma-separated lists; project scopes the entry; context_notes holds anything the next session must know. It (1) upserts memory record task___state (task lowercased, spaces to underscores, first 40 chars) tagged task-active,handoff with high priority — repeat calls for the same task and project overwrite the previous handoff; (2) posts the payload to the crosslink channel "task-handoff"; (3) logs a milestone. Returns {"handoff_saved", "memory_key", "crosslink_channel", "next_session", "crosslink_posted"} — crosslink_posted is false when the crosslink post failed and the handoff is local-only. The next session resumes with sassy_memory_context plus sassy_crosslink_recv on "task-handoff". Use at session end or when context runs low — not as a substitute for sassy_memory_remember.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | ||
| status | No | in-progress | |
| project | No | ||
| blockers | No | ||
| completed | No | ||
| next_steps | No | ||
| context_notes | No | ||
| files_touched | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| memory_key | Yes | |
| next_session | Yes | |
| handoff_saved | Yes | |
| crosslink_posted | Yes | |
| crosslink_channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the three side effects (upsert memory record, post to crosslink channel, log milestone), the overwrite behavior on repeat calls, the failure mode (crosslink_posted false, local-only handoff), and the exact memory key format. This goes well beyond the annotations, which only say readOnlyHint=false, openWorldHint=false, idempotentHint=false, destructiveHint=false. The description adds critical behavioral context about mutation and failure handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the mutating nature and the three writes, then details parameters, then behavior, then return value, then usage guidance. It is long but every sentence earns its place given the complexity of the tool. Slight deduction for density that could be split into clearer sections.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, parameters, side effects, return value, failure mode, and usage context. It even explains how the next session resumes. With an output schema present and this level of detail, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains the required 'task' parameter, the status enum values, the comma-separated list format for several fields, the project scoping, and the context_notes purpose. It also explains how the task slug is derived (lowercased, spaces to underscores, first 40 chars), which is not in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: runs the session-end handoff protocol — three writes at once,' which states a specific verb, resource, and behavior. It clearly distinguishes this from memory tools like sassy_memory_remember and sassy_memory_forget by naming the handoff protocol and the three writes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use at session end or when context runs low — not as a substitute for sassy_memory_remember.' This gives clear when-to-use and when-not-to-use guidance, and names the alternative tool. It also explains the next-session resume flow, which helps an agent decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_logA
Mutating: appends a milestone event to the separate milestones table (not the memories table). event (required) is the free-text description of what happened (e.g. "deployed v1.0"); project and tags (comma-separated) are optional. Milestones are append-only — they cannot be edited or deleted, so phrase entries as finished facts. Returns {"logged", "project"}. Use for significant completions, decisions, or changes worth a durable timeline; use sassy_memory_remember for ongoing state you will later update, and sassy_memory_milestones to read the milestone history back.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| event | Yes | ||
| project | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| logged | Yes | |
| project | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint=false), the description discloses crucial behavioral constraints: the operation is append-only, entries cannot be edited or deleted, and the return value is {'logged', 'project'}. This gives the agent a clear model of side effects and persistence semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence serves a purpose: mutation flag, target table, parameter semantics, append-only constraint, return value, and usage alternatives. It is front-loaded with the most critical facts and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only 3 simple parameters and an output schema present, the description still goes beyond the minimum by covering mutation behavior, storage target, immutability, return shape, parameter details, and sibling routing. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates: it explains event is a required free-text description with an example, and that project and tags are optional with tags being comma-separated. Every parameter is given semantic meaning beyond raw schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('appends'), a specific resource ('milestones table'), and explicitly distinguishes it from the 'memories table'. It also names the intended use case ('significant completions, decisions, or changes'), leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when-to-use guidance ('Use for significant completions, decisions, or changes worth a durable timeline') and names exact alternative tools for different scenarios (sassy_memory_remember for ongoing state, sassy_memory_milestones for reading history). This routes the agent to the correct sibling without extra inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_milestonesARead-onlyIdempotent
Read-only: reads back milestone events written by sassy_memory_log, newest first. project (default "") is an optional substring filter on the project field. limit (default 20, hard-capped at 100) controls how many of the newest entries are returned. Returns {"count", "milestones"} with each entry carrying id, event, project, tags, and timestamp. Use to review the timeline of completions and decisions for a project or overall; use sassy_memory_search to find arbitrary memory records, which live in a different table.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| project | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| milestones | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds behavioral context beyond that: the hard cap of 100 on limit, the 'newest first' ordering, and the return format with specific fields. It also notes the data lives in a different table than search, which is useful operational context. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most important fact ('Read-only') and packs each sentence with purpose. It covers behavior, parameters, return format, and usage in three sentences with zero fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only tool with an output schema, the description covers all necessary aspects: what it does, how to filter and limit, the return structure, and when to use an alternative. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only types and defaults with no descriptions (coverage 0%), so the description must fully compensate. It does: project is explained as an optional substring filter with default '', and limit is explained as controlling count of newest entries, with default 20 and a hard cap at 100. This adds significant meaning beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('reads back'), a specific resource ('milestone events written by sassy_memory_log'), and an ordering ('newest first'). It explicitly distinguishes from sassy_memory_search by noting they operate on different tables, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use to review the timeline of completions and decisions' and then gives the alternative: 'use sassy_memory_search to find arbitrary memory records, which live in a different table.' This provides clear when-to-use and when-not-to-use guidance, naming the sibling directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_recallARead-onlyIdempotent
Read-only: fetches one memory record by exact key match (fetching also bumps the record's access counter). key (required) must match exactly — if you do not know the key, use sassy_memory_search instead. Returns {"found", "memory", "error"} where memory is the full record (key, value, tags, priority, project, created_at, updated_at, access_count); when no record matches, found is false and error names the key. Use when you know precisely which record you need, e.g. a task state key from sassy_memory_handoff or sassy_memory_context. It does not search text: for keyword discovery use sassy_memory_search, and for the whole session-start bundle use sassy_memory_context.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | Yes | |
| found | Yes | |
| memory | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the access-counter bump as a side effect beyond the annotations (which only state readOnlyHint, idempotentHint, destructiveHint). It also clarifies the return structure and the 'found: false' error behavior, and states it does not search text. This adds meaningful context that the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but every sentence contributes value—core function, return shape, side effect, and usage alternatives are all covered. It is front-loaded with the primary purpose and the exact-match requirement, and it avoids filler. Slightly long for a single-parameter tool, but efficient in content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (one required parameter), the presence of an output schema, and annotations that cover safety, the description is exceptionally complete. It explains the exact-match requirement, the return fields, the side effect, and when to use alternatives, leaving no gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries the full burden for the 'key' parameter. It explains that the key must match exactly and points to alternatives if the key is unknown. It does not specify format or length constraints, but the essential semantics are clearly conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('fetches') and resource ('one memory record') with the exact matching criterion ('exact key match'), and explicitly distinguishes from the sibling sassy_memory_search by noting it does not search text. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'if you do not know the key, use sassy_memory_search instead' and 'Use when you know precisely which record you need, e.g. a task state key from sassy_memory_handoff or sassy_memory_context.' It also names alternatives for keyword discovery and session-start bundles, covering when to use and when not to.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_rememberAIdempotent
Mutating: writes a persistent memory record (SQLite, survives server restarts). Upserts by key: if the key already exists the record is fully overwritten (value, tags, priority, project) and updated_at refreshed; otherwise a new record is created. key (required) is the unique identifier — use the naming conventions task_state, pattern, blocker, decision so later lookups work. value (required) is the content. tags is a comma-separated string (e.g. "task-active,tls"). priority defaults to "normal" (critical|high|normal|low); high-priority items appear in the session-start bundle. project scopes the record. Returns {"key", "action": "created"|"updated"}. Use whenever you learn something worth keeping across sessions; use sassy_memory_forget to remove a stale entry.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| tags | No | ||
| value | Yes | ||
| project | No | ||
| priority | No | normal |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | Yes | |
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the full overwrite semantics, persistence across server restarts, refreshed updated_at field, priority behavior for session-start bundles, and the return shape. It enriches the idempotentHint with concrete upsert-idempotency details and does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence earns its place: mutation first, then upsert semantics, then parameter guidance, then return shape, then usage guidance. Key behavioral facts are front-loaded before parameter details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity normal for a persistent memory write, the description covers parameters, defaults, return values, persistence, naming conventions, and sibling alternatives. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full parameter burden and succeeds: it provides naming conventions for key, comma-separated format for tags, allowed values and default for priority, and scope semantics for project. This is far more useful than the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: writes a persistent memory record' and then explains the upsert behavior, distinguishing it clearly from read/search/delete sibling memory tools. The verb is specific ('writes'/'upserts') and the resource is named ('persistent memory record, SQLite').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use whenever you learn something worth keeping across sessions' and names the alternative for cleanup: 'use sassy_memory_forget to remove a stale entry.' This gives the agent clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_searchARead-onlyIdempotent
Read-only keyword search over all memories using substring matching (not semantic: the query must appear literally in the key or value). query (default "") is free text matched against keys and values; tags is a comma-separated list where each tag must appear in the record's tags; project is a substring match on the project field; priority is an exact match (critical|high|normal|low). All filters combine with AND. Results are ordered by most recently updated first and capped at 50 (limit defaults to 20; an empty query returns everything). Returns {"count", "results"} as full records. Use when you know what to find but not its key; use sassy_memory_recall for an exact key and sassy_memory_context for the standard session-start bundle.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| limit | No | ||
| query | No | ||
| project | No | ||
| priority | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds valuable behavior beyond that: substring semantics, AND-combination of filters, ordering by most recent, the 50-result cap, empty-query behavior, and the return shape. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds operational information. It front-loads the core read-only substring behavior, then systematically walks through the parameters, then gives routing guidance. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five optional parameters, no required parameters, and an output schema, the description fully covers filter semantics, combination logic, ordering, result cap, defaults, and empty-query behavior. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden and succeeds. It explains query matching against keys and values, tags as comma-separated AND-matching, project as substring, priority as exact match, and limit's default and cap. Every parameter's semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation ('Read-only keyword search over all memories') and clarifies that matching is literal substring, not semantic. It also explicitly distinguishes itself from sassy_memory_recall and sassy_memory_context at the end, making the tool's identity unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states exactly when to use this tool ('when you know what to find but not its key') and names the alternatives for other cases: sassy_memory_recall for exact key lookup and sassy_memory_context for the session-start bundle. This is explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_memory_statsARead-onlyIdempotent
Read-only: reports aggregate health of the memory system. Takes no parameters. Returns {"total_memories", "by_priority" (counts keyed by priority level), "milestones" (total milestone count), "projects" (sorted list of distinct non-empty project names)}. Use to get an overview of how much is stored and how it is organized before deciding how to query; use sassy_memory_context to load the actionable session-start bundle.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| projects | Yes | |
| milestones | Yes | |
| by_priority | Yes | |
| total_memories | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly/idempotent/non-destructive hints, and the description adds meaningful behavioral detail: exact returned keys and their semantics, including counts keyed by priority and a sorted list of distinct non-empty project names. This goes beyond what annotations convey, though it does not discuss error behavior or scalability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: read-only status and purpose come first, followed by return shape and usage guidance. Every sentence contributes, with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only stats tool with an output schema and complete annotations, the description covers the return contract, the organization of results, and when to choose an alternative. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is little to document; the description explicitly confirms 'Takes no parameters' and the schema is empty. This satisfies the baseline for parameter-less tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a precise verb ('reports') and resource ('aggregate health of the memory system'), then names the sibling it is not called for (sassy_memory_context). It clearly distinguishes itself from other memory tools by stating exactly what it returns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('before deciding how to query') and names the alternative sassy_memory_context for a session-start bundle. This gives direct routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_minify_testARead-onlyIdempotent
Read-only diagnostic. sample_json is a JSON string containing a sample GitHub API response; nothing is sent anywhere. The tool parses it, runs it through the same minifier applied to GitHub tool responses, and reports original_chars, minified_chars, savings_percent, original/minified estimated tokens (chars divided by 4), tokens_saved, and the minified_data itself. Invalid JSON returns an error instead of results. Use it to gauge how much the GitHub response shrinker will reduce a heavy github_full response before you commit to a large call; it is a test harness, not a live API caller.
| Name | Required | Description | Default |
|---|---|---|---|
| sample_json | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive. The description adds important behavioral context beyond that: nothing is sent anywhere, invalid JSON returns an error instead of results, and it lists the exact computed metrics returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Read-only diagnostic' and then gives complete, actionable detail. Some phrasing is slightly redundant (e.g., referencing the minifier twice), but every sentence contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, one parameter, existing annotations, and output schema, the description covers everything needed to call it correctly: input meaning, local processing, output fields, invalid-input behavior, and recommended usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the meaning of sample_json. It does so by stating that it is a JSON string containing a sample GitHub API response. It could include an example or more structure, but for a single parameter this is adequate guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it parses a sample JSON string, runs it through the GitHub response minifier, and reports size/token metrics. It also distinguishes itself as a diagnostic/test harness rather than a live API caller, which separates it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: before committing to a heavy github_full call, to gauge how much the response shrinker will reduce size. It also explicitly says what it is not ('a test harness, not a live API caller'), giving clear exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_mkdirAIdempotent
Mutating: creates a directory, including any missing parents, and succeeds silently if the path already exists. Refuses paths that fail the read-path policy (blocked or protected locations). Returns the resolved path. sassy_write_file already creates missing parent directories, so call this mainly when you need an empty directory or an explicit container for later steps.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide idempotentHint=true, destructiveHint=false, and readOnlyHint=false; the description complements rather than repeats them. It adds genuine behavioral context: explicit 'Mutating:' declaration, silent-success idempotency confirmation, refusal of paths violating the read-path policy, and the resolved-path return value. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero wasted words. The mutation flag and core action are front-loaded, followed by policy/return behavior, then usage routing. Every sentence adds information that is not available in the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, output schema present, no nested objects), the description covers everything needed to invoke it correctly: behavior, idempotency, policy constraints, return value, and decision boundary against a sibling. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single 'path' parameter, so the description must carry the semantic burden. It does so meaningfully: path is a directory path that may have missing parents, is subject to policy checks, and gets resolved. It stops short of specifying format details (relative vs absolute, trailing slashes), but for a one-parameter mkdir tool the meaning is adequately conveyed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('creates a directory'), adds precise behavioral detail ('including any missing parents', 'succeeds silently if the path already exists'), and implicitly distinguishes itself from file-writing siblings by framing what mkdir does that other tools do not. The agent can tell exactly what this tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (sassy_write_file) and states the condition that selects this tool instead: 'sassy_write_file already creates missing parent directories, so call this mainly when you need an empty directory or an explicit container for later steps.' This is textbook when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_moveA
Mutating: moves or renames a file or directory to the destination path. Refuses protected sources and destinations, and refuses sources on the sensitive-read denylist (SSH keys, AWS/GPG credentials, /etc/shadow, browser login DBs, SassyMCP tokens) — moving such material is treated as read-equivalent exfiltration and refused like a content read. Also refuses to overwrite an existing destination — sassy_safe_delete the destination first if you genuinely need to replace it. Use it to relocate or rename; use sassy_copy to duplicate without removing the original, and sassy_safe_delete to remove instead.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses mutation, refusal of protected sources/destinations, the sensitive-read denylist with concrete examples, the read-equivalent exfiltration stance, and the no-overwrite behavior. This adds substantial context beyond the annotations, which only signal non-read-only and non-idempotent; there is no contradiction with destructiveHint=false because the tool preserves data and refuses overwrites.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but somewhat long; however, every sentence carries operational or safety information, and the mutating behavior is front-loaded. The safety list and sibling routing are justified, though 'relocate or rename' is repeated near the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no parameter descriptions in the schema, the description covers argument semantics, refusal conditions, overwrite prevention, and sibling alternatives. Since an output schema exists, the description does not need to explain return values; nothing an agent needs to call or avoid this tool is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by identifying 'source' as a file or directory and 'destination' as the target path, and by explaining protected sources/destinations. It does not provide per-parameter path-format details, but the two string parameters are simple enough that the semantics are sufficiently clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: moves or renames a file or directory to the destination path,' giving a specific verb, resource, and action. It also explicitly distinguishes itself from sassy_copy and sassy_safe_delete, so an agent can tell siblings apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use it to relocate or rename; use sassy_copy to duplicate without removing the original, and sassy_safe_delete to remove instead.' It also gives concrete refusal conditions, such as protected paths and existing destinations, making invocation decisions unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_observability_healthARead-onlyIdempotent
Read-only health check for monitoring. Returns a small dict: status (always "healthy" when reachable), uptime_seconds, tool_calls_total, error_count, and whether dev live-reload is enabled. Counters accumulate in memory since server start and reset on restart. Takes no parameters. Use for liveness probes, load balancers, or a quick sanity check that the server is up. For CPU/memory/disk figures use sassy_observability_metrics instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/non-destructive annotations, the description discloses return semantics (status is always 'healthy' when reachable), memory-accumulating counters, reset-on-restart behavior, and that it takes no inputs. This gives an agent a full behavioral model without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence earns its place: what it is, what it returns, counter lifecycle, use cases, and the routing to the metrics sibling. It is front-loaded and has no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless health-check tool with no output schema, the description is complete: it covers the return dict, counter semantics, and typical use cases, and points to the alternative for other monitoring data. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With zero parameters, the schema already covers the interface fully. The description's explicit 'Takes no parameters' confirms this, but there is no additional parameter meaning to add; baseline 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Read-only health check for monitoring,' then enumerates the exact fields returned. It explicitly names the sibling alternative, sassy_observability_metrics, for CPU/memory/disk figures, so an agent can distinguish this tool from the nearby observability tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit conditions: use for liveness probes, load balancers, or a quick server sanity check, and directs CPU/memory/disk needs to sassy_observability_metrics instead. No ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_observability_metricsARead-onlyIdempotent
Read-only. Returns real-time server metrics: uptime_seconds, tool_calls_total, error_rate (percent, rounded to two decimals), timestamp, version, and live_reload_enabled. Also includes cpu_percent, memory_percent, and disk_percent when psutil is installed (optional dependency). Takes no parameters; counters are in-memory since server start. Use for performance monitoring, capacity questions, and error-rate checks. For a simple up/down probe use sassy_observability_health.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable context beyond that: counters are in-memory since server start, and cpu/memory/disk fields are conditional on the optional psutil dependency. Minor gaps remain, such as whether counters reset on restart being slightly implicit, but the added context is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Read-only' and the core metric summary, and each sentence earns its place: field list, optional dependency note, parameter clarification, use cases, and sibling alternative. There is no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining return values and does so well by listing all fields and explaining conditional presence of the psutil-dependent metrics. It also covers use cases and the sibling alternative. Minor omissions like timestamp format/version scope and an explicit statement of JSON structure prevent a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the schema already fully covers this dimension; the description's explicit 'Takes no parameters' is clear and prevents an agent from inventing arguments. No additional parameter semantics are possible or needed, so the baseline 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns'), names the resource (real-time server metrics), and enumerates the exact fields returned. It also distinguishes itself from the sibling sassy_observability_health by indicating that tool is for a simple up/down probe.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly lists when to use: performance monitoring, capacity questions, and error-rate checks. It also names the alternative for a different need (sassy_observability_health for up/down probes), leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_observability_tool_statsARead-onlyIdempotent
Read-only. Returns the in-memory tool usage tracker's stats (per-tool call counts, success/error tallies, recency scores) plus pruning_suggestions: tool names whose usage score falls below a 0.05 threshold, i.e. candidates for disabling to slim the tool surface. Takes no parameters. Use to see which tools are actually used and which can be pruned. Differs from sassy_observability_metrics (aggregate server counters) by reporting per-tool usage. For raw recent call records use sassy_recent_tool_calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: it is in-memory (implying ephemeral state), reports recency scores, and includes pruning_suggestions with an explicit 0.05 threshold. This discloses content and semantics that annotations do not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Read-only' and the core return statement, then efficiently covers contents, threshold, usage, and sibling differentiation. Every sentence adds distinct information without fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only stats tool, the description fully explains what will be returned (per-tool stats plus pruning suggestions), the threshold logic, and how it differs from adjacent tools. With no output schema present, the description carries the burden of return-value disclosure and does so completely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, and the schema is empty, so the baseline is 4. The description explicitly states 'Takes no parameters,' which confirms the empty schema. There is no parameter ambiguity to resolve.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns the in-memory tool usage tracker's stats' with concrete contents (call counts, success/error tallies, recency scores, pruning suggestions). It also differentiates from sassy_observability_metrics and sassy_recent_tool_calls, so an agent can distinguish it from siblings without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('Use to see which tools are actually used and which can be pruned') and names alternatives with their distinguishing conditions: sassy_observability_metrics for aggregate server counters, sassy_recent_tool_calls for raw recent call records. This gives the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_offline_commandsARead-onlyIdempotent
Read-only. Returns the offline-safe command listing built live from the tool registry, grouped by tool group with usage counts. Optional group filters to one group (see sassy_tool_groups for group names). Optional verbose=false returns names only (about a quarter of the tokens); true adds one-line purposes. LAN tools (SSH, wifi, adb wifi) are included since they need a network but not the internet. The response also lists tools unavailable offline and a system_prompt_snippet for pasting into a local model's prompt. Use before sassy_offline_handoff to build the local model's tool menu; never paste the full catalog into a small local model.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| verbose | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavior beyond the annotations: it clarifies that LAN tools are included (since they need a network but not the internet), that the response lists tools unavailable offline, and that verbose=false cuts token usage to about a quarter. These details are not present in the annotations or schema, and nothing contradicts the readOnlyHint/idempotentHint/destructiveHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient, opening with 'Read-only.' and then delivering purpose, parameters, inclusion rules, and usage guidance in a logical order. No sentence is filler; it is slightly long but each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's output structure (grouped, usage counts, unavailable tools, system_prompt_snippet), parameter semantics, token considerations, network scope (LAN vs internet), and sequencing with sassy_offline_handoff. With an output schema present, this is a complete and self-sufficient definition for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates. It explains that 'group' filters to one group and directs to sassy_tool_groups for valid names, and that 'verbose' controls whether names only or names plus one-line purposes are returned, along with token impact. Both parameters are clearly and usefully described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns') and a specific resource ('offline-safe command listing built live from the tool registry, grouped by tool group with usage counts'). It clearly distinguishes this tool from siblings like sassy_tool_catalog or sassy_tool_groups by emphasizing the offline-safe filtering and live registry construction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use before sassy_offline_handoff to build the local model's tool menu' and warns 'never paste the full catalog into a small local model.' It also explains the optional group filter via reference to sassy_tool_groups, but does not mention when to prefer other sibling tools like sassy_tool_catalog, so it stops short of a full when/where-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_offline_handoffA
Mutating. Writes a structured offline handoff and optionally starts the local Hermes node. Required parameter task describes what was being worked on. Optional channel (default "joint") is the crosslink channel Hermes polls; next_steps is a newline- or semicolon-separated list of ordered steps; start_node=false, when true, launches hermes_node.py in a persistent session. The tool writes key task_offline__state to memory, mirrors it to the crosslink channel, and returns the exact env line and launch command plus the node session name. Errors are returned inline if hermes_node.py is missing or no fallback model is ready. Use after sassy_offline_status confirms the link is down, when handing ongoing work to a local model; read Hermes replies with sassy_crosslink_recv.
| Name | Required | Description | Default |
|---|---|---|---|
| task | Yes | ||
| channel | No | joint | |
| next_steps | No | ||
| start_node | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses mutation, memory writes, channel mirroring, optional node launch, returned env/launch/session info, and inline errors for missing hermes_node.py or missing fallback model. This is rich behavioral context and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: purpose, parameter semantics, side effects, errors, and usage. Each sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the four-parameter tool with no schema parameter descriptions and minimal annotations, the description fully covers prerequisites, side effects, failure modes, and return values. The presence of an output schema also reduces the need to detail return shape, and the description still summarizes it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden and succeeds: it explains task, channel (with default 'joint'), next_steps (newline/semicolon-separated ordered steps), and start_node (launches hermes_node.py when true). Every parameter receives meaningful semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Writes a structured offline handoff and optionally starts the local Hermes node.' It also names related siblings (sassy_offline_status, sassy_crosslink_recv) to place the tool in a clear workflow, so an agent can distinguish it from other sassy_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool: 'Use after sassy_offline_status confirms the link is down, when handing ongoing work to a local model.' It also tells the agent how to continue the workflow with sassy_crosslink_recv, providing a clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_offline_statusARead-onlyIdempotent
Read-only. Runs the real network-state check and reports the full offline picture: link state (online, offline, or DNS-dead), DNS resolving, probe anchors, check age, gate mode and whether it is active, local loopback inference backends with available models and the chosen fallback, the hermes_node.py script path, counts of offline-safe vs LAN vs internet tools, and, when degraded, each unavailable tool with a named substitute. Optional probe=true (default) runs a fresh ~1-2 second probe; false reads the cached verdict instantly. Use as the first step when connectivity is suspect or before any offline workflow.
| Name | Required | Description | Default |
|---|---|---|---|
| probe | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description discloses the probe behavior: it runs a fresh ~1-2 second probe by default, or reads a cached verdict instantly when probe=false. It also details what the output includes, which is not required but adds transparency about the tool's side effects and latency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but efficient; it front-loads the purpose and then packs a dense list of output items. Each clause adds useful information, and the parameter explanation is concise. It is not as short as ideal but avoids redundancy and is well-structured, though the long enumeration could be seen as slightly over-specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema, the description need not detail return types, yet it still lists the content areas, which is helpful. It covers when to use it, the parameter behavior, and the read-only nature. It lacks explicit error scenarios or prerequisites, but for a read-only status tool this is acceptable; the description is sufficiently complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines a boolean 'probe' with default true and no description. The tool description fully explains the parameter: 'probe=true (default) runs a fresh ~1-2 second probe; false reads the cached verdict instantly.' This adds meaningful semantics beyond the raw schema, which is essential given the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Runs the real network-state check' and reports the full offline picture. It enumerates concrete output categories (link state, DNS, probe anchors, gate mode, tool counts, substitutes), making the tool's scope unmistakable and distinguishing it from generic status or ping tools. The opening 'Read-only' reinforces its nature.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use as the first step when connectivity is suspect or before any offline workflow,' which gives a clear trigger condition. It does not name alternative tools or explicitly say when not to use it, but the context is strong enough for an agent to select it appropriately among siblings like sassy_http_ping or sassy_offline_commands.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_panelAIdempotent
Mutating (start/stop/rotate change state). Controls the Control Panel, the loopback-only web UI for the permission engine, settings, event log, and classifiers. Optional action (default "status"): status returns running state, the startup-enabled flag, and a tokenless URL — the bearer token is never revealed here; start launches the panel and enables auto-start at future startups (flips panel.enabled in config) and returns a tokenless URL plus a hint to call action="url"; stop shuts it down and disables auto-start; url prints the tokenized URL without starting (this is the explicit token-reveal action); rotate regenerates the panel bearer token, persists it to the token file, audit-logs the rotation, and returns the new token (the old token stops working immediately, no restart needed). Binds 127.0.0.1 on the configured port (default 8765, auto-increments if taken). Send the token in the X-Panel-Token header (the ?token= query form is deprecated but still accepted). Use for interactive inspection and tuning of permissions/settings rather than doing it by hand with sassy_set_config.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | status |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true, but the description's rotate action 'regenerates the panel bearer token... old token stops working immediately' — repeated calls produce different tokens and effects, clearly non-idempotent. This contradicts the annotation, and the rule requires a score of 1 for contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense; each sentence earns its place. It front-loads the mutating nature, then systematically covers actions, network binding, token transport, and alternative tools. The semicolon-separated action list improves scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five actions, security implications (token reveal), and network details, the description covers everything: action outcomes, token handling, header vs deprecated query form, port behavior, and autostart config changes. Despite the annotation contradiction, the description itself is complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the lone `action` parameter, but the description fully documents every possible value (status, start, stop, url, rotate) with detailed behavior and outcomes. This adds critical semantics absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Controls') and resource ('Control Panel, the loopback-only web UI...'), and distinguishes the tool from sibling sassy_set_config by explaining it is for interactive tuning rather than manual config. This makes the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use for interactive inspection and tuning of permissions/settings rather than doing it by hand with sassy_set_config,' naming the alternative and the condition. It also enumerates each action's effect (status, start, stop, url, rotate), leaving no ambiguity about when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_permissionAIdempotent
Read-only by default, mutating on change actions. Front door to the four-mode safety system gating shell and file tools. action="status" (default) reports the effective mode, derivation, sandbox roots, and active rules. set_mode sets permission.mode to strict (block destructive patterns), confirm (return a confirm token), sandbox (relaxed inside sandbox roots, anything outside is refused), or bypass (allow all except protected paths); mode="" clears the override so it derives from the legacy interceptor.destructiveAction setting. Switching to bypass requires confirm='YES' (exact, case-sensitive); the privilege mutations add_root (widens the sandbox jail), add_rule, and clear_rules also require confirm='YES', while remove_root (shrinks the jail) needs no confirmation. add_rule appends a JSON rule like {"action":"deny","tool":"sassy_shell","command":"rm"} (first match wins, before the mode default); clear_rules empties the list. Invalid modes and rules are rejected. Use to inspect or change safety gating; pair with sassy_shell_confirm in confirm mode.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| path | No | ||
| rule | No | ||
| action | No | status | |
| confirm | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: 'Read-only by default, mutating on change actions' clarifies the readOnlyHint=false nuance; it discloses that switching to bypass requires exact case-sensitive confirm='YES', that add_root/add_rule/clear_rules also require confirmation while remove_root does not, that invalid modes/rules are rejected, and that mode='' derives from a legacy setting. This far exceeds the annotation baseline and contains no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but dense and front-loaded with the core purpose before diving into mode details and confirm requirements. For a tool with 4 modes, a rule system, and confirmation gates, the length is justified — nearly every clause carries new information. It could be slightly tightened but is well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Very complete for a complex safety-governance tool: covers all modes, confirmation requirements, rule precedence (first match wins), invalid input rejection, and legacy derivation. An output schema exists so return values need not be described. The only notable gap is the path parameter's role being implicit rather than explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 0% schema coverage the description must compensate, and it does for most parameters: action='status' default, mode values (strict/confirm/sandbox/bypass, '' clears override), confirm='YES' requirement, and the rule JSON syntax for add_rule. However, the path parameter is only implied through the add_root/remove_root actions and is never explicitly mapped, leaving a small semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: the tool is the 'front door to the four-mode safety system gating shell and file tools.' It clearly distinguishes itself from siblings like sassy_shell and sassy_shell_confirm by positioning itself as the permission/governance layer, and it names the pairing with sassy_shell_confirm. An agent can immediately tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use to inspect or change safety gating' and pairs with sassy_shell_confirm in confirm mode. It explains when each mode (strict/confirm/sandbox/bypass) is appropriate via their semantics. However, it does not state explicit exclusions or name alternative tools to prefer in other cases, so there's a small gap in when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_capabilitiesARead-onlyIdempotent
Read-only. Returns the SassyMCP capabilities guide, the instruction manual for advanced features: dynamic desktop vision (sassy_screen_glance for cheap repeated watches, sassy_screen_watch for change-triggered frames, sassy_screen_diff for before/after verification, sassy_screen_capture for full-res), Android phone vision (sassy_phone_ui for the structured accessibility tree with coordinates, sassy_phone_state, sassy_phone_watch, sassy_phone_glance) and interaction (tap, swipe, type, key, open), sensitive context detection (interaction tools refuse on login, payment, account, 2FA, or permission screens unless confirmed=True after explicit user confirmation), pause/resume for user handoff, the setup wizard steps, and the hook playbook system (sassy_hooks_suggest/activate/deactivate with categories like web_audit, security_scan, code_review, phone_autonomous). Takes no parameters, returns plain text. Use before any vision, phone, or hook workflow to learn the tool roles and safety rules.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations (readOnlyHint, idempotentHint, destructiveHint) by detailing the guide's contents: it lists the specific tools covered, the sensitive context detection safety behavior, and that it 'returns plain text.' This gives the agent a rich understanding of what to expect without needing to invoke the tool. The description is consistent with all annotations, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that front-loads the core purpose and then enumerates the guide's contents. While relatively long, every clause conveys essential information about the tool's scope and use. The structure is effective, though it could be slightly more concise by moving some tool lists to an appendix; overall it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only guide tool, the description covers everything an agent needs: what it returns, when to use it, the specific content it covers, and the safety-relevant behaviors. The output schema exists, so the return format is already specified. No critical information is missing; an agent can confidently decide to call this tool based solely on the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so the baseline is 4. The description redundantly states 'Takes no parameters,' which adds no new information beyond the schema. Since there are no parameters to document, the description correctly does not attempt to add parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool returns the SassyMCP capabilities guide, an instruction manual for advanced features. It enumerates the specific tool categories (desktop vision, phone vision, interaction, sensitive context detection, pause/resume, setup wizard, hook playbook) which distinguishes it from any sibling tool. The verb 'returns' with the resource 'capabilities guide' is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs 'Use before any vision, phone, or hook workflow to learn the tool roles and safety rules.' This provides clear when-to-use guidance and implies it is a prerequisite for those workflows. It also notes the tool takes no parameters, which is helpful context, and implicitly contrasts with the many sibling tools that perform actual actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_contextARead-onlyIdempotent
Read-only. Returns the current user context loaded at startup from the persona file at $SASSYMCP_HOME/persona.md (default ~/.sassymcp/persona.md): role, expertise, managed systems, active projects, and communication preferences. If no file exists it returns a template telling you how to create one. Takes no parameters, returns plain text. This is personal user configuration, not server state. Use when you need who-you-are-working-for context; to get it bundled with all persona documents in one call, use sassy_persona_full instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and non-open-world, and the description does not contradict them. It adds valuable behavioral detail beyond annotations: the exact file path, that context is loaded at startup, that a missing file returns a creation template, and that the result is plain text and personal configuration rather than server state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the key trait ('Read-only'), states the core purpose immediately, and layers supporting details (file location, fallback behavior, return format) in a logical order. Every sentence adds useful information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple no-parameter tool with an output schema already present, the description covers the source location, content scope, missing-file behavior, return type, personal-vs-server distinction, and the relevant sibling alternative. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description explicitly states 'Takes no parameters,' leaving no ambiguity about argument handling. With an empty schema, this explicit statement fully covers the parameter dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns') and a clear resource ('current user context loaded at startup from the persona file'), and enumerates the content fields (role, expertise, managed systems, active projects, communication preferences). It also distinguishes itself from the sibling sassy_persona_full by noting the difference in scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to use the tool ('Use when you need who-you-are-working-for context') and names the alternative for a broader need ('to get it bundled with all persona documents in one call, use sassy_persona_full instead'). This is direct guidance with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_decisionsARead-onlyIdempotent
Read-only. Returns the decision framework defining when to act without discussion versus when to slow down: execute immediately for file ops, code changes, git, builds, and diagnostics; state approach then execute for architectural changes, schema changes, or breaking API changes; require explicit confirmation for production data destruction without backup, credential rotation on live systems, security posture reduction, or financial transactions; hard stop and refuse for SQLi/XSS/command-injection introduction, hardcoded secrets, or disabled auth. Takes no parameters, returns plain text. Use to calibrate caution on risky operations; pair with sassy_persona_full for the complete bundle.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds 'returns plain text' and 'Takes no parameters,' but most of the content describes the framework's substance rather than revealing additional side effects or constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but efficiently structured: front-loaded read-only status, then semicolon-separated categories, then usage guidance. Every sentence contributes value without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, comprehensive safety annotations, and an output schema, the description covers all needed invocation details: no arguments, plain-text output, purpose, and relationship to a sibling tool. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the rubric baseline is 4. The description reinforces this with 'Takes no parameters,' eliminating any ambiguity even before consulting the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource ('decision framework') and clearly enumerates its content categories: execute immediately, state approach then execute, require explicit confirmation, and hard stop. The focus on caution calibration distinguishes it from siblings like sassy_persona_full.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs agents to use it to calibrate caution on risky operations and to pair with sassy_persona_full for the complete bundle. It does not list explicit exclusions, but the intended context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_fullARead-onlyIdempotent
Read-only. Loads the complete operating bundle in one call and returns a JSON object with six keys: style, decisions, practices, observability, capabilities, and context (each the same plain text document returned by the corresponding narrow tool). Takes no parameters. Call this on first connection to a SassyMCP session so the session starts with operating parameters, decision rules, engineering standards, the observability guide, the capabilities manual, and user context all at once. It is the heaviest of the persona tools in context cost; if you only need one section, call the narrow tool (sassy_persona_style, sassy_persona_decisions, sassy_persona_practices, sassy_persona_observability, sassy_persona_capabilities, or sassy_persona_context) instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive. The description adds valuable behavioral context beyond annotations, notably the warning that it is the heaviest persona tool in context cost, and that it returns the same documents as the narrow tools. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat long but each sentence contributes: purpose, return structure, usage guidance, and cost warning. It is front-loaded with 'Read-only' and 'Loads the complete operating bundle.' Slight redundancy in stating 'Takes no parameters' could be trimmed, but overall it is well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters) and the presence of an output schema, the description fully covers what an agent needs: what it returns, when to use it, and the trade-off with narrow tools. The cost warning and explicit alternative names make it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description redundantly states 'Takes no parameters' which is already evident from the empty schema, but no additional parameter semantics are needed. The score reflects the baseline for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (loads), a clear resource (complete operating bundle), and enumerates the six returned keys. It explicitly differentiates from the narrow persona siblings by naming them, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: call on first connection to a session, and if only one section is needed, use the corresponding narrow tool instead. Names all six alternatives, giving clear when-to and when-not-to usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_observabilityARead-onlyIdempotent
Read-only. Returns the cross-system observability guide: which introspection tools exist and what each returns — sassy_get_config (system info, uptime, loaded modules), tool analytics (invocation counts, frequency scores), sassy_context_estimate (token use by tool definitions, critical for 100+ tool sessions), audit trail (every invocation with timestamp, sanitized args, elapsed ms), health metrics, cross-session status, and the capability map (sassy_self_check reconciles the module manifest against the live registry and flags BROKEN modules; sassy_tool_catalog lists every registered tool). Also prescribes the recommended first-call sequence: sassy_self_check, then sassy_tool_catalog, then sassy_persona_full, then sassy_hooks_suggest. Takes no parameters, returns plain text. Use when starting a session or debugging what the server can do.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the output format ('returns plain text'), the fact that it takes no parameters, and prescriptive behavior: the recommended first-call sequence. It also adds details like sanitized args and elapsed ms in audit trail entries. The annotations already cover read-only and idempotence, and the description reinforces this without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, and the key facts are front-loaded: 'Read-only. Returns the cross-system observability guide.' Every sentence adds value, though the long list of internal capabilities could arguably be trimmed without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's role as an observability guide, the description fully covers what it returns, its output format, its no-parameter contract, and when to use it. The output schema exists, so return details are already structured. The recommended first-call sequence adds practical operational context beyond the basics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the baseline is 4. The description explicitly confirms 'Takes no parameters,' which is consistent with the empty input schema. No further parameter explanation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Returns the cross-system observability guide' and enumerates the exact contents, such as sassy_get_config, tool analytics, audit trail, and the capability map. This makes it clearly distinct from the many sibling observability tools, which return actual metrics rather than a guide to those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use when starting a session or debugging what the server can do.' It does not explicitly list when-not-to-use scenarios or contrast directly with observability siblings, but the use context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_practicesARead-onlyIdempotent
Read-only. Returns the engineering standards document: security defaults applied to every project (input validation, output escaping, parameterized queries, CSRF, auth best practices, security headers, rate limiting, upload validation, secrets handling, dependency audits, TLS, structured logging), code quality rules (types, tests, comments explain why, error handling), architecture patterns (env config, health checks, graceful shutdown, idempotency, circuit breakers, feature flags), platform-specific guidelines (Cloudflare, Rust, Python, TypeScript, Go, Docker, Git), and MCP GitHub tool patterns (use sassy_gh_push_files rather than create_or_update_file for existing files). Takes no parameters, returns plain text. Use before writing or reviewing code to know the expected standards.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds 'Read-only' (consistent) and 'returns plain text,' which discloses the return format beyond what annotations provide. It also summarizes the document's scope, giving behavioral context without contradicting any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Read-only. Returns the engineering standards document,' which is good. However, the exhaustive listing of security, code quality, architecture, and platform topics makes it long and somewhat dense. A shorter summary of the document's coverage would have been equally effective while remaining concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only document retrieval tool, the description covers what the tool returns, the return type (plain text), the content areas, and when to use it. Combined with the output schema, no essential context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description confirms 'Takes no parameters.' Per the 0-param baseline, no further parameter documentation is needed; the description fully satisfies the requirement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the engineering standards document and enumerates its major sections, making the resource and verb specific. However, it does not explicitly contrast with sibling persona tools such as sassy_persona_decisions or sassy_persona_full, so differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context: 'Use before writing or reviewing code to know the expected standards.' It does not include exclusions or name alternatives, so it falls short of full when/when-not guidance, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_persona_styleARead-onlyIdempotent
Read-only. Returns the expert-mode operating parameters injected into the AI session: execution priority (act first, explain later), communication style (declarative, no preambles, no safety disclaimers on standard operations), autonomy level (never ask permission for reversible operations, complete full scope), and precision standards (exact tool names, paths, line numbers, quantified results). Takes no parameters and returns a plain text document. Use when you want the session's behavior directives alone; for the whole bundle (style + decisions + practices + observability + capabilities + user context) in one call, use sassy_persona_full instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description agrees ('Read-only'), so there is no contradiction. The description adds value beyond annotations by disclosing the return format ('plain text document') and the specific categories of content the agent will receive, which helps set expectations about the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: content enumeration with clarifying parentheticals, return format confirmation, and usage guidance with the sibling pointer. The description is information-dense without fluff and front-loads the key facts (read-only, returns parameters) before routing to the alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only tool with an output schema and strong annotations, the description covers everything an agent needs: what is returned, in what format, and when to choose this tool over the full-bundle sibling. No critical gap remains given the simplicity of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema coverage, so the schema has nothing left to document. Per the baseline for 0-param tools, a 4 is appropriate; the description confirms 'Takes no parameters', which reinforces the schema rather than merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Returns the expert-mode operating parameters injected into the AI session') and enumerates the exact content domains (execution priority, communication style, autonomy level, precision standards). It also explicitly differentiates from the sibling tool sassy_persona_full by noting it returns only the style subset, so an agent can distinguish them without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Use when you want the session's behavior directives alone', and names the exact alternative (sassy_persona_full) plus what it adds (decisions, practices, observability, capabilities, user context). Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_read_fileARead-onlyIdempotent
Read-only. Reads a text file with line-based pagination and returns numbered lines under a header showing how many lines were selected, the start line, the total line count, and how many remain. offset is 0-based and defaults to 0; a negative offset reads the last N lines (tail mode, where length is ignored); length caps lines returned (default 1000). Directories are refused with a pointer to sassy_list_dir. Use it for large files by paging; prefer sassy_read_multiple when you need several files in one call, and sassy_search_files to find text across a tree.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| length | No | ||
| offset | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds substantial behavioral detail beyond that: line-based pagination, header contents, 0-based offset, negative offset tail mode, length capping behavior, and directory refusal. This gives the agent a clear model of how the tool behaves at call time.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: purpose, return shape, parameter semantics, edge-case behavior, and sibling routing. It is front-loaded with the read-only nature and primary action before diving into details, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover safety, the description covers everything else needed to invoke the tool correctly: pagination semantics, defaults, tail mode, directory error behavior, and alternatives. Nothing essential is missing for an agent to select and call this tool properly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter semantics, and it does thoroughly. It explains offset semantics including 0-based indexing and negative tail mode, length's role and default, and that length is ignored in tail mode. The path parameter is clearly implied as the file to read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Reads a text file with line-based pagination' and details the exact output format (numbered lines under a header). It also distinguishes itself from siblings by naming what it is not for directories and by pointing to sassy_list_dir, sassy_read_multiple, and sassy_search_files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use it for large files by paging, prefer sassy_read_multiple when several files are needed, and prefer sassy_search_files for searching text across a tree. It also states that directories are refused and routes the agent to sassy_list_dir, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_read_multipleARead-onlyIdempotent
Read-only. Reads several files at once and concatenates them, each under a header like '--- path (N lines) ---'. paths is a JSON array of file paths (falls back to a comma-separated string if it is not valid JSON). A missing or unreadable file produces an inline error for that file without aborting the others. Use it to pull a handful of small files in one call; use sassy_read_file with offset/length for paging through a large file.
| Name | Required | Description | Default |
|---|---|---|---|
| paths | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations: the exact header format, the JSON-array-with-comma-separated-fallback behavior for paths, and the per-file error handling that does not abort the batch. This is meaningful additional disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines behavior and output format, the second clarifies the parameter format and error semantics, the third gives usage guidance and the sibling alternative. The most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a single parameter, an output schema, and annotations covering safety and idempotency. The description covers the parameter format, error behavior, and usage boundaries. The only minor gap is that it doesn't explicitly state the return type beyond the header format, but the output schema exists and the description's header example is enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains that paths is a JSON array of file paths and that it falls back to a comma-separated string if not valid JSON. This adds real meaning beyond the bare schema property name 'paths' and its string type. It doesn't give examples, but for a single parameter this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('reads'), a resource ('several files at once'), and the output format (concatenated under headers). It also distinguishes itself from sassy_read_file by noting the offset/length paging alternative, so an agent can tell them apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool ('pull a handful of small files in one call') and when to use the alternative ('use sassy_read_file with offset/length for paging through a large file'). This is clear routing guidance with no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_recent_tool_callsARead-onlyIdempotent
Read-only. Returns recent tool call records parsed from the structured JSONL audit log (the same store the audit module writes; sassy_audit_log reads the plain-text audit.log variant). Optional max_results=50 (docstring caps at 1-1000; the code takes the newest N entries), tool_name="" filters to one tool name, since_minutes=0 means all time or only calls within the last N minutes. Output includes the call entries newest-last, the returned count, and total_in_log (all lines in the file, including skipped/malformed). Returns an empty list with a note if no audit log exists. Use for session history, debugging what ran, and usage review; for raw log text use sassy_audit_log, for keyword search use sassy_audit_search. Overlap note: sassy_audit_log covers the same recent-call history as plain text — prefer this tool when you want structured, filterable records.
| Name | Required | Description | Default |
|---|---|---|---|
| tool_name | No | ||
| max_results | No | ||
| since_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already declare readOnlyHint and idempotentHint, the description adds meaningful behavioral detail: it returns newest-last ordering, reports returned count plus total_in_log (including malformed lines), and returns an empty list with a note if no audit log exists. It also flags the docstring cap of 1-1000 and clarifies the code takes the newest N entries, which is valuable operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is tightly organized and every sentence adds distinct value (behavior, parameters, output shape, edge case, alternatives). It could be tightened slightly, but the density justifies its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description fills all remaining gaps: parameter semantics, ordering, output fields, missing-log behavior, and sibling routing. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 0% description coverage, so the description carries the full burden and succeeds: max_results is explained as 'newest N entries' with the 1-1000 docstring cap, tool_name is described as filtering to one tool name, and since_minutes semantics are spelled out ('0 means all time or only calls within the last N minutes'). Every parameter's meaning and edge behavior is covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') and resource ('recent tool call records parsed from the structured JSONL audit log'), and explicitly differentiates from sassy_audit_log and sassy_audit_search by naming them. The read-only framing and structured/filterable positioning make the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description provides explicit when-to-use: 'Use for session history, debugging what ran, and usage review', then names alternatives for raw text and keyword search. The overlap note further tells the agent to prefer this tool for structured, filterable records, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_safe_deleteAIdempotent
Mutating but non-destructive: instead of deleting, it moves the file or directory into a DELETE/ staging folder in the same parent directory, renaming with _1, _2 suffixes on collisions so nothing is silently lost. It moves the symlink itself, not its target. Refuses protected paths (SassyMCP source tree, ~/.sassymcp, existing DELETE folders) and audits the interception. This is the required replacement for rm/del-style deletion: shell delete keywords are intercepted, and sassy_copy/sassy_move refuse to overwrite an existing destination until it is staged here first. Use it for any removal; review or restore items from the DELETE folder later.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining collision renaming, symlink handling, protected paths, and audit behavior. It is consistent with the readOnlyHint=false and destructiveHint=false annotations, and it does not contradict idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core mutating-but-non-destructive behavior, then adds collision handling, symlink behavior, protections, and integration context. Every sentence adds useful information and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single-parameter schema, existing annotations, and presence of an output schema, the description is highly complete. It covers what happens to the item, where it goes, how collisions are handled, what is refused, why this tool is required, and how to restore items later.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must carry parameter meaning. It does so by explaining that the path refers to a file or directory, that symlinks are moved rather than their targets, and that protected paths are refused. It could be more explicit about path format or existence requirements, but for a single 'path' parameter this is strong compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it moves a file or directory into a _DELETE_/ staging folder rather than deleting it. It also clearly distinguishes this tool from plain deletion and from sassy_copy/sassy_move, so an agent can identify its unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use it for any removal' and calls it 'the required replacement for rm/del-style deletion'. It also explains how it relates to sassy_copy/sassy_move: they refuse to overwrite an existing destination until it is staged here first, giving the agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_screen_infoARead-onlyIdempotent
Read-only, takes no parameters. Returns the display configuration as JSON: every monitor with left/top/right/bottom/width/height, DPI scale_percent, and which is primary, plus a count. Uses native APIs on Windows (DPI-aware) and macOS (AppKit), falling back to a single-monitor pyautogui report elsewhere. Essential setup call for multi-monitor machines: run it before sassy_click or sassy_screenshot to translate absolute coordinates onto the right monitor.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds value by detailing platform-specific behavior: 'Uses native APIs on Windows (DPI-aware) and macOS (AppKit), falling back to a single-monitor pyautogui report elsewhere.' This goes beyond the annotations, though it doesn't mention potential errors or edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, front-loading the read-only and no-parameters info, then output details, then platform and usage. It is concise but informative, with no wasted words, though it could be slightly tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a no-parameter read-only tool. It specifies the output format, platform differences, and usage context. The output schema exists, so return format is fully defined. Annotations cover safety and idempotency, and the description adds the essential setup context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description confirms 'takes no parameters,' which aligns with the schema. Since there are no parameters, there is nothing more to explain, and the description appropriately states the absence without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Returns the display configuration as JSON' with specific fields. It distinguishes itself from siblings by noting it is a 'setup call' for multi-monitor machines before sassy_click or sassy_screenshot, which is distinct from other tools like sassy_desktop_state or sassy_shell.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Essential setup call for multi-monitor machines: run it before sassy_click or sassy_screenshot.' It also explains the reason (translate absolute coordinates), giving clear context for when this tool is needed over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_screenshotA
Read-only with respect to the desktop; writes an image file. Saves a PNG screenshot of the screen and returns its path and pixel dimensions. path defaults to ~/sassymcp_screenshot.png; region is an 'x,y,w,h' string that takes precedence over monitor (a malformed region returns an explicit error instead of falling back to a full screenshot); monitor defaults to -1 (all monitors), 0 for primary, 1+ for others. The save path must pass validation and must not be a protected location. Use it to see the current screen state, especially before or after sassy_click/sassy_type_text; pair with sassy_screen_info for multi-monitor region math. Requires a GUI session; on headless hosts it returns an error.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| region | No | ||
| monitor | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the sparse annotations by disclosing key behaviors: malformed regions return explicit errors rather than falling back, path must pass validation and avoid protected locations, monitor and path defaults, and a GUI session is required with an error on headless hosts. This gives the agent strong expectations about side effects and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose, then covers parameters, validation, usage context, and runtime requirements. Each sentence contributes distinct information without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter tool with an output schema, the description covers prerequisites, defaults, validation constraints, error behavior, and relationships to sibling tools. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates: it explains path defaulting, region format as 'x,y,w,h', region precedence over monitor, error behavior for malformed regions, and monitor semantics (-1 all, 0 primary, 1+ others). All three parameters receive meaningful semantic context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Saves a PNG screenshot of the screen and returns its path and pixel dimensions.' It also clarifies the nuanced read/write nature and ties usage to related siblings like sassy_click, sassy_type_text, and sassy_screen_info, making it easy to distinguish from other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context for when to use the tool: 'Use it to see the current screen state, especially before or after sassy_click/sassy_type_text.' It mentions pairing with sassy_screen_info for multi-monitor math, but it does not provide explicit when-not-to-use guidance or enumerate alternatives beyond those mentions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_search_filesARead-onlyIdempotent
Read-only. Searches recursively under path. search_type 'files' (default) matches pattern as a regex against filenames via a recursive glob filtered by file_pattern (e.g. '*.py'); 'content' matches pattern as a regex against file contents, skipping files over 5MB and emitting path:line: text (200 chars, optional context_lines of before/after context). ignore_case defaults to True; max_results defaults to 50 and is clamped to 1-500. Use it to locate files by name or find text across a tree; use sassy_read_file to read a specific hit and sassy_list_dir to browse instead.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| pattern | Yes | ||
| ignore_case | No | ||
| max_results | No | ||
| search_type | No | files | |
| file_pattern | No | ||
| context_lines | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals concrete behaviors: recursive traversal, regex semantics for both search types, file-size skipping (>5MB) for content search, output format (path:line: text with 200 chars), and clamping of max_results to 1-500. This is far richer than what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause carries essential information. It front-loads the read-only safety cueadian, then explains modes, defaults, limits, and alternatives in four sentences with zero fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with a bare schemaaine, the description gives exactly what an agent needs to invoke it correctly: defaults, clamping behavior, output format, and sibling routing. The presence of an output schema further reduces the need to describe return values, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, every parameter is explained in the description: path, pattern, search_type (with exact value meanings), file_pattern (with example), ignore_case (default True), max_results (default and clamp), and context_lines (optional before/after context). The description fully compensates for the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair: 'Searches recursively under path' and explicitly distinguishes between the two search modes. It names sibling tools (sassy_read_file, sassy_list_dir) to prevent confusion, making the tool's niche immediately obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('to locate files by name or find text across a tree') and points to alternatives ('use sassy_read_file to read a specific hit and sassy_list_dir to browse instead'). This fully replaces any guesswork about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_self_checkARead-onlyIdempotent
Read-only diagnostic. Reconciles the declared module manifest against the live tool registry and reports verdict "whole" or "DEGRADED", package version, runtime (frozen for packaged builds, source for checkouts), pid, live_tool_count, and a per-module import report. It distinguishes real problems from expected absences: BROKEN modules (expected in the default load but fail to import, logged at ERROR) versus dormant_by_design (on-demand groups not yet toggled on, absent by design) versus pruned_low_usage (dropped by usage scoring) versus unsupported (optional modules failing on this platform, non-fatal). Takes no parameters. Use it to verify server health or to diagnose missing tools without confusing intentional lazy-loading with real failures.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is established. The description adds meaningful behavioral context beyond those annotations: it explains the category taxonomy (BROKEN vs dormant_by_design vs pruned_low_usage vs unsupported), the ERROR logging level for BROKEN modules, and the runtime distinction (frozen vs source). This enriches the agent's understanding of what the tool reveals without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core identity ('Read-only diagnostic') followed by the reconciliation action and output fields. The longer tail about category distinctions is dense and earns its place—it directly prevents the common misinterpretation of expected absences as failures. Every sentence adds information; no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters, a full annotation set, and an output schema present, the description's burden is modest. It nevertheless covers the tool's output fields, its diagnostic categories, and its intended use cases. Nothing an agent needs to decide whether to invoke this tool or to interpret its verdict is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and an empty schema, so the baseline for this dimension is 4. The description explicitly confirms 'Takes no parameters,' which removes any doubt an agent might have about optional arguments. Nothing more is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read-only diagnostic' and immediately states the specific action: 'Reconciles the declared module manifest against the live tool registry and reports verdict...' This names the exact resource and operation, and the detailed output fields make it unmistakable what the tool does. It is clearly distinct from diagnostic siblings like sassy_observability_health or sassy_setup_status by focusing on manifest-to-registry reconciliation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description ends with an explicit usage directive: 'Use it to verify server health or to diagnose missing tools without confusing intentional lazy-loading with real failures.' This gives clear when-to-use context, but it stops short of naming alternatives or stating when *not* to use it, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_listARead-onlyIdempotent
Read-only. Lists all persistent terminal sessions as JSON: name, shell, pid, alive flag, uptime in seconds, output buffer size, exit code, plus a total count. Dead sessions remain listed until stopped. Use it to see what is running before sassy_session_read, sassy_session_send, or sassy_session_stop; auto-detached sassy_shell calls also appear here.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds materially useful behavioral context beyond annotations: dead sessions remain listed until stopped, and auto-detached sassy_shell calls appear in this list. These are behavioral traits an agent needs to interpret the list correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and efficiently front-loaded: 'Read-only. Lists all persistent terminal sessions as JSON' immediately conveys scope and format. The remaining sentences add field detail, dead-session behavior, and usage guidance without a single wasted clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with an output schema and rich annotations, the description covers everything needed to call it correctly: what it lists, the exact fields returned, when to use it, and the edge case of auto-detached sassy_shell calls. Nothing relevant is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema covers all inputs trivially. Baseline for zero-parameter tools is 4, and the description appropriately focuses on output and behavior rather than input semantics, since there are no parameters to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lists'), a clear resource ('all persistent terminal sessions'), and the output format ('as JSON'), then enumerates the returned fields. It further distinguishes itself from sibling session operations by noting auto-detached sassy_shell calls also appear here, so an agent can tell it apart without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Use it to see what is running before sassy_session_read, sassy_session_send, or sassy_session_stop.' It also clarifies the scope edge case of auto-detached sassy_shell calls, giving the agent clear context for when this listing tool is relevant versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_readARead-only
Read-only. Returns output from a named persistent session that arrived since the last read (the cursor advances, so each call yields only new text), truncated to the last 10000 characters, plus an alive flag and the total buffer size. Fails if the session name does not exist. Use it to poll long-running sessions created by sassy_session_start or auto-detached from sassy_shell (timeout over 120s) without sending input; use sassy_session_send to interact.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing that the cursor advances on each read, output is truncated to 10000 characters, an alive flag and buffer size are returned, and the call fails for nonexistent session names. These behavioral details are not visible in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries distinct information: the core read behavior, cursor/truncation/return details, and the usage boundary with alternatives. It is front-loaded with 'Read-only' and the main purpose, and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations cover the read-only safety profile, the description adds the missing behavioral contract: cursor semantics, truncation, return fields, failure mode, and when to use it versus sassy_session_send. Nothing needed for correct invocation is omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by identifying 'name' as the persistent session name and explaining that nonexistent names cause failure. It does not specify naming rules or how to enumerate valid names, but for a single required parameter this is sufficient context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns output') and resource ('named persistent session'), and immediately distinguishes itself from related session tools by noting it does not send input. It clearly conveys that this is the read/poll operation among the sassy_session_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: to poll long-running sessions created by sassy_session_start or auto-detached from sassy_shell. It also names the alternative, sassy_session_send, for interaction, making the selection decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_sendADestructive
Mutating: types into a live persistent session like a terminal, with a newline appended automatically, and returns the last 5000 characters of new output after a brief pause. The input is scanned by the same gates as sassy_shell: blocklist matches and delete keywords (rm, del, Remove-Item) are refused here, because session input cannot be safely staged — use sassy_safe_delete for removals instead. Fails if the session does not exist or has exited. Use it to interact with REPLs, prompts, and dev servers running in a session; use sassy_shell for one-shot commands.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| input_text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses mutation, the newline append, the 5000-character return limit, the pause, the blocklist/delete-keyword refusal, and the failure condition (session does not exist or exited). This goes well beyond the annotations, which only say destructiveHint=true. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: behavior first, then safety constraints, then usage guidance. Every sentence adds value, and it's not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating session tool with an output schema, the description covers behavior, failure modes, safety gates, and alternatives. Nothing critical is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains what input_text does (typed into session) and what name refers to (the session), but doesn't add format details like whether name is a session ID or label. Still, the description gives enough context for the two obvious parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('types into a live persistent session like a terminal'), the resource (a session), and the key behavior (appends newline, returns last 5000 chars after a pause). It also distinguishes itself from sassy_shell and sassy_safe_delete, making it clear what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('interact with REPLs, prompts, and dev servers running in a session') and when not to ('use sassy_shell for one-shot commands', 'use sassy_safe_delete for removals'). This is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_startADestructive
Mutating: spawns a persistent terminal session under a unique name and returns its status, shell, and pid. shell defaults to the host native shell (powershell/cmd/wsl on Windows; bash/zsh/sh on macOS/Linux); command optionally runs immediately after startup. Reuse of a live name and initial commands tripping the delete interceptor are refused. stderr is merged into stdout and the per-session buffer keeps the last 50000 characters (tail). Use it for long-running work like dev servers or builds that you poll with sassy_session_read; use sassy_shell for one-shot commands and stop sessions with sassy_session_stop when done.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| shell | No | ||
| command | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and non-idempotent, and the description goes well beyond them: it discloses persistence, return fields, shell default behavior, refusal of live-name reuse and delete-interceptor commands, stderr merging, and the 50000-character tail buffer. This gives the agent a strong behavioral model before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: mutation flag, returns, defaults, refusal conditions, buffer behavior, and usage routing. No filler or repetition of schema data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover the mutation profile, the description supplies the remaining operational context: persistence, defaults, safety refusals, buffer limits, and relationships to sibling tools. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It explains name (unique live name, reuse refused), shell (defaults to host native shell with platform-specific options), and command (optionally runs immediately and can be intercepted if destructive).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'spawns a persistent terminal session under a unique name and returns its status, shell, and pid.' It clearly distinguishes this tool from sibling session tools like sassy_session_read, sassy_session_stop, and sassy_shell.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use this for long-running work such as dev servers or builds, use sassy_shell for one-shot commands, and stop sessions with sassy_session_stop when done. It also names the polling complement sassy_session_read, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_stopADestructiveIdempotent
Mutating: terminates a named persistent session's process (graceful terminate, force kill after 5s), removes the session, and returns the name, exit code, and the last 3000 characters of unread output. Fails if the session does not exist. Use it to clean up a session you started; use sassy_session_stop_all to kill everything at once.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true and readOnlyHint=false, but the description adds valuable behavioral details: the graceful terminate/force kill after 5s, removal of the session, return values, and failure condition. It also notes it's mutating, which aligns with annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, dense paragraph front-loads the most critical information (mutating, termination behavior, removal, return values) before the usage guidance. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (single parameter, no nested objects, no enums) and the presence of an output schema (which likely details return values), the description covers all necessary aspects: behavior, failure mode, and usage. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the 'name' parameter. It does by referring to 'named persistent session', implying the name identifies which session to stop. This is adequate given only one parameter and no enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('terminates... removes... returns'), the specific resource ('named persistent session'), and its behavior (graceful terminate, force kill after 5s). It is easily distinguished from siblings like sassy_session_stop_all and other session tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use it to clean up a session you started' and contrasts with sassy_session_stop_all for killing everything at once. This provides clear when-to-use guidance and distinguishes from the sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_session_stop_allADestructiveIdempotent
Mutating: terminates every active persistent terminal session (each process is terminated and cleaned up) and returns a list of stopped names with exit codes plus a total count. Use it at the end of a task to clean up leftover dev servers, builds, and watchers; use sassy_session_stop when you only want to end one session.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true, and the description adds context beyond them: it states what gets destroyed ('each process is terminated and cleaned up') and what is returned (list of stopped names with exit codes plus a total count). The description is consistent with all annotations, including the idempotent state effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The mutating/destructive nature is front-loaded, followed by the action, output, usage guidance, and the sibling alternative. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive bulk operation with no parameters and an existing output schema, the description is complete: it covers what is terminated, cleanup semantics, return value, when to use it, and when to use the alternative. The existing annotations carry the safety profile, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially 100% covered and the description needs no parameter explanations. Baseline 4 applies for 0-parameter tools; the description does not need to compensate for missing schema detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('terminates') with a precise resource ('every active persistent terminal session') and explicitly notes the cleanup behavior and return value. It distinguishes itself from sassy_session_stop by naming that sibling as the single-session alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context: 'Use it at the end of a task to clean up leftover dev servers, builds, and watchers.' It also names the alternative and the condition that triggers it: 'use sassy_session_stop when you only want to end one session.' No inference is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_set_configAIdempotent
Mutating. Overwrites a server configuration value and persists it to the SassyMCP home directory config.json immediately (the change affects current and future server runs). Required: key must be one of the supported config keys (defaultShell, fileReadLineLimit, fileWriteLineLimit, allowedDirectories, blockedCommands, interceptor.destructiveAction, interceptor.scanStringLiterals, permission.mode, permission.sandboxRoots, permission.rules, panel.enabled, panel.port) — unknown keys are rejected and the valid list is returned. Required: value is a JSON-encoded string that is parsed before storing (so pass '1000' for a number, '["x"]' for a list, '"powershell"' for a string); if parsing fails the raw string is stored. Returns the key with old and new values. Use to tune limits, the default shell, blocked commands, safety modes, or panel settings; inspect current values first with sassy_get_config.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description significantly enriches the annotations. It discloses immediate persistence affecting current and future runs, rejection of unknown keys with a returned valid list, JSON-encoded value parsing with fallback to raw storage, and the return of old/new values. This goes well beyond what readOnlyHint, idempotentHint, and destructiveHint provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place. It front-loads the core mutation semantics, then logically walks through key constraints, value format, return value, and usage. Given the 0% schema coverage, the length is justified and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a config-mutation tool with two undocumented string parameters and an output schema, the description covers all needed context: persistence behavior, validation, parsing rules, error handling, return shape, and a pointer to the read companion. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the entire burden. It compensates fully by listing every supported config key, explaining that value must be a JSON-encoded string, providing concrete examples ('1000', '["x"]', '"powershell"'), and documenting fallback behavior if parsing fails. An agent can construct correct calls without any additional information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Overwrites a server configuration value and persists it to the SassyMCP home directory config.json.' It clearly differentiates itself from the sibling read tool sassy_get_config by explicitly naming it as the companion for inspecting current values. This is a precise, unambiguous purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use clause ('Use to tune limits, the default shell, blocked commands, safety modes, or panel settings') and names the relevant alternative sassy_get_config for prior inspection. It stops short of explicitly stating when not to use this tool relative to similar setters like sassy_env_set, but the context is strong enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_check_toolsARead-onlyIdempotent
Read-only scan of external tool availability. Checks six system binaries (nmap, tesseract, adb, scrcpy, plink, chrome) by searching PATH plus known install locations, and three Python packages (pytesseract, playwright, watchdog). For each tool it reports installed true/false, the resolved path, whether it is required, which sassy_* tools use it, and an install URL when missing. Only tesseract is marked required, since OCR/vision tools need it unconditionally. The returned summary lists installed, missing_required, and missing_optional. Takes no parameters and writes nothing. Use this first when diagnosing missing dependencies; when you are ready to install them, use sassy_setup_tools instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool read-only, idempotent, and non-destructive, and the description goes further by stating it 'writes nothing' and detailing the exact output fields: installed status, resolved path, required flag, dependent sassy_* tools, and install URL. It also reveals that only tesseract is required, which is behavior not derivable from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
While the description is substantial, every sentence adds essential information: scope, exact checks, output shape, required-tool policy, and routing to the install sibling. The key purpose is front-loaded in the first sentence, and the structure flows naturally from what the tool scans to what it reports to when to use it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is fully self-contained for invocation: it lists exactly what is checked, what is returned, that it takes no parameters, and that it has no side effects. Since an output schema is present, the description is not even required to explain return values, but it does so anyway, making the tool easy to use correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the description explicitly confirms 'Takes no parameters.' With an empty input schema and 100% schema coverage, there is no parameter ambiguity, and the description removes any doubt by stating this directly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: a 'Read-only scan of external tool availability' that checks six system binaries and three Python packages. It clearly distinguishes itself from the installation-focused sibling by stating that the tool only checks and reports, and explicitly references sassy_setup_tools for installation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage direction: 'Use this first when diagnosing missing dependencies; when you are ready to install them, use sassy_setup_tools instead.' It also explains what the tool does not do ('writes nothing'), giving agents a clear decision boundary between checking and installing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_generate_tokenADestructive
Mutating: creates a cryptographically secure auth token (secrets.token_urlsafe(32)) and saves it to ~/.sassymcp/tokens.json, replacing any existing entry for the same client_id, then locks the file to owner-only (chmod 0600 on POSIX, ACL lockdown on Windows). The client_id parameter defaults to "default" and identifies the MCP client (e.g. claude-desktop, cursor). The scopes parameter is a comma-separated string defaulting to "read,write"; valid scopes are read, write, and admin. The returned token is shown once only, with usage instructions for the SASSYMCP_AUTH_TOKEN environment variable, the Authorization: Bearer header, and the ?token= query form. Use this when onboarding a new MCP client that needs to authenticate. Trust assumption (deliberate): this tool is intentionally not gated by a confirmation — any MCP client that can call tools can mint bearer tokens, equivalent to the generate-token CLI subcommand, so local automation can bootstrap client auth. Treat every minted token like a password and review ~/.sassymcp/tokens.json if a session behaves unexpectedly. For a read-only view of existing token state, call sassy_setup_status first.
| Name | Required | Description | Default |
|---|---|---|---|
| scopes | No | read,write | |
| client_id | No | default |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint=true and readOnlyHint=false, but the description adds substantial context beyond that: the exact file path, permission changes (chmod 0600, ACL on Windows), the one-time display of the token, the deliberate lack of confirmation, and the security heuristic 'treat every minted token like a password.' This is far more than annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but every clause earns its place given the security sensitivity. It is front-loaded with the key action ('Mutating: creates...'), then layers details. It could be slightly tighter, but it avoids fluff and is well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (auth token lifecycle, file permissions, one-time display, trust assumptions) and the fact that an output schema exists but isn't shown, the description is remarkably complete. It covers side effects, security implications, parameter semantics, and alternatives, leaving no critical gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate. It does: it explains that client_id defaults to 'default' and identifies the MCP client, and clarifies that scopes is a comma-separated string defaulting to 'read,write' with valid values read, write, and admin. Both parameters are enriched beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('creates'), resource ('cryptographically secure auth token'), and destination ('~/.sassymcp/tokens.json'), and even notes that it replaces existing entries. It distinguishes the tool from siblings by naming sassy_setup_status as the read-only alternative, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: 'Use this when onboarding a new MCP client that needs to authenticate.' It also gives an explicit alternative ('For a read-only view of existing token state, call sassy_setup_status first') and implicitly says when not to use it (when only a read-only view is needed). This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_githubAIdempotent
Mutating when saving; read-only for check and open_browser. The action parameter (default "check") selects the step. action=check validates the GITHUB_TOKEN or GITHUB_PERSONAL_ACCESS_TOKEN environment variable against the GitHub API and reports the login and scopes, or that no token exists. action=open_browser opens the GitHub token creation page locally and returns instructions with the recommended scopes (Contents, Issues, Pull Requests, Metadata). action=save_token validates the supplied token parameter (must start with ghp_ or github_pat_) against api.github.com/user; on success it stores the token in the process environment and records github_configured plus the GitHub username in config. The token lasts only for this session unless also set in system env or MCP client config. action=skip records the skip. Use this to enable the sassy_github_* tools.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | ||
| action | No | check |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations indicate idempotentHint=true, which is consistent with the description's note that save_token stores a token. The description adds critical behavioral context: it explicitly warns that save_token is 'Mutating when saving; read-only for check and open_browser' and that 'The token lasts only for this session unless also set in system env or MCP client config.' It also explains what happens on success (stores in process env, records config) and the validation steps. This goes beyond annotations, which only indicate readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but each sentence provides necessary information about the actions and session behavior. The overall purpose is front-loaded ('Mutating when saving; read-only for check and open_browser'), and the actions are explained in logical order. It could be slightly more concise, but every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema (not detailed here), the description doesn't need to explain return values. The tool is moderately complex with multiple actions and side effects (validating API, storing token, config changes). The description covers the key aspects: action behavior, token validation requirements, session persistence, and configuration updates. It could detail error scenarios or alternative setup methods, but for an agent to call it correctly, it's adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides no descriptions for the two parameters (coverage 0%), so the description must compensate. It does explain 'action' parameter in detail: default 'check', and each action's behavior. It also explains the 'token' parameter's requirements (must start with ghp_ or github_pat_) and its role in save_token. This adds meaning beyond the schema's minimal property definitions, so a score of 3 is appropriate given that the schema coverage is zero and the description does provide some parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it configures GitHub authentication for enabling sassy_github_* tools. It identifies the three actions (check, open_browser, save_token, skip) and what each does, distinguishing it from sibling setup tools like sassy_setup_ssh and sassy_setup_license. The specific verb (setup) and resource (GitHub) are explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'Use this to enable the sassy_github_* tools.' It also explains the action parameter, which guides selection among the tool's own modes. However, it doesn't explicitly mention when NOT to use it or mention alternatives (e.g., sassy_setup_generate_token might be an alternative for token generation), but the 'use this to enable' phrasing is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_licenseADestructive
Manages the optional SassyMCP supporter license against LemonSqueezy. The action parameter (default "status") accepts status, activate, deactivate, validate; the key parameter is required only for activate and must look like XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. All tool groups are unlocked for everyone with no key, so activating registers your seat and tier label but unlocks nothing. action=status is read-only and reports tier, addons, validity, email, expiry, the license file path, and any LemonSqueezy instance identifiers. action=activate registers this machine and mints a local HMAC payload for offline use. action=deactivate frees the machine's seat and deletes the local file. action=validate forces an immediate LemonSqueezy re-check (normally weekly). Use status to inspect the current tier; only activate with a key purchased from sassyconsultingllc.com/store.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| action | No | status |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already flag destructiveHint=true, the description goes far beyond that by detailing exactly what each action does: status is read-only and reports specific fields; activate registers the machine and mints an HMAC payload; deactivate frees the seat and deletes the local file; validate forces a re-check instead of the normal weekly cycle. It also discloses the surprising fact that activating unlocks nothing, which is critical behavioral context an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence adds distinct value: overview, parameter rules, unlock revelation, per-action behavior, and usage guidance. It is front-loaded with the core purpose and then systematically details each action. The only minor inefficiency is some redundancy in repeating action names and behaviors, but it remains tight and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the description covers all four action semantics, key format, side effects, and the 'no unlock' reality, an agent has what it needs to call the tool correctly. Minor gaps like error handling for invalid keys or absence of a license are not mentioned, but these are edge cases rather than essential call context for a well-behaved tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of explaining both parameters. It thoroughly covers the 'action' parameter by listing all accepted values and their defaults, and the 'key' parameter by specifying when it is required and giving its exact format (XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX). This is more than enough to compensate for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Manages the optional SassyMCP supporter license against LemonSqueezy') and then enumerates distinct actions, making it unmistakably different from sibling setup tools like sassy_setup_status or sassy_setup_wizard. It clearly positions the tool as a license manager rather than a general setup utility.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage advice: 'Use status to inspect the current tier; only activate with a key purchased from sassyconsultingllc.com/store.' It also clarifies that activation is not necessary because all groups are unlocked, which prevents unnecessary activation. However, it does not explicitly compare against sibling tools or exclude them, relying on the obvious domain difference rather than named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_sshAIdempotent
Mutating: saves SSH credentials to the process environment and config, and can open a real test connection. The action parameter (default "check") accepts check, save, test, skip. action=check is read-only: reports whether plink (Windows) or native ssh (macOS/Linux) was found, plus which of SSH_HOST, SSH_USER, SSH_PASS, SSH_KEY, SSH_SESSION are set. action=save requires host and user plus at least one auth source: key (a .ppk path, preferred), session (a saved PuTTY session name), or password (fed via stdin, never in the process list); missing pieces return status=incomplete. action=test runs the actual ssh command with a 15 second timeout and reports connected, failed, or error. Credentials last only for this session unless also set in system env or MCP client config.
| Name | Required | Description | Default |
|---|---|---|---|
| key | No | ||
| host | No | ||
| user | No | ||
| action | No | check | |
| session | No | ||
| password | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint=false, destructiveHint=false, but the description goes beyond by detailing that action=check is read-only, save mutates environment/config, test opens a real connection with timeout, and credentials are session-scoped. It also mentions password is via stdin for security. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the mutating nature and default action. It packs useful information per sentence without redundancy, though it is on the longer side. Good structure keeps key details up front.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 6 parameters, no required ones, and no enums, the description provides a detailed action breakdown and security notes. It mentions output statuses (incomplete, connected, failed, error) and session scoping, but does not mention the output schema details, which is acceptable since output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the role of key, session, password, and action, but does not detail host/user beyond action=save requirements. The description adds significant meaning to action and auth source parameters, though host and user remain generic.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool saves SSH credentials and can open a test connection, with specific actions. It distinguishes itself from setup_check_tools and setup_status by focusing on SSH setup, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to use each action (check, save, test) and prerequisites (e.g., action=save requires host/user and auth source). It does not explicitly list alternatives or exclusions, but the action breakdown implies usage scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_statusARead-onlyIdempotent
Read-only aggregated setup report with no parameters. Reports setup_complete, persona file existence/size/path, auth state (whether SASSYMCP_AUTH_TOKEN is set in the environment, whether ~/.sassymcp/tokens.json exists, and overall auth_active), integrations (GitHub token configured plus the saved GitHub username, SSH configured plus the saved SSH host), the config file path with its key names, the SassyMCP data directory, and the files currently in it. If setup is not complete it includes an action_required field pointing at the next steps. This is the best first call when diagnosing an unknown machine or confirming what first-run steps remain. It never modifies anything. To fix what it reports as missing, call sassy_setup_wizard for the persona, sassy_setup_github or sassy_setup_ssh for integrations, or sassy_setup_tools for dependencies.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=fals. The description adds meaningful behavioral context: 'It never modifies anything,' the conditional presence of action_required, and the details of what is reported (e.g., 'whether SASSYMCP_AUTH_TOKEN is set' rather than its value). It fully discloses the tool's reporting scope and non-mutating nature beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose, and every sentence contributes either report contents, usage guidance, or sibling routing. The 'never modifies anything' sentence is redundant with annotations, and the field list is dense, but the structure is clear and each section earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, an output schema, and strong annotations, the description covers all the agent needs: what the report contains, the conditional action_required field, when to call it, and which sibling tools to use next to remediate issues. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100% (empty properties object), so the baseline is 4. The description correctly states 'with no parameters,' and since there are no parameters to document, it cannot add more meaning. No gaps exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Read-only aggregated setup report,' a specific verb and resource, and enumerates the exact fields reported (setup_complete, persona file, auth state, integrations, config path, data directory). It distinguishes itself from sibling setup tools by declaring it 'the best first call' for diagnosing an unknown machine, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'best first call when diagnosing an unknown machine or confirming what first-run steps remain.' It also names the precise alternatives for fixing issues: 'call sassy_setup_wizard for the persona, sassy_setup_github or sassy_setup_ssh for integrations, or sassy_setup_tools for dependencies.' This is explicit routing with no inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_toolsADestructive
Mutating installer for external tool dependencies; use action=check for the read-only report. The action parameter (default "check") accepts check, install, install_required, add_to_path. The tool_name parameter is required only for action=install and must be one of tesseract, adb, scrcpy, nmap, plink, cloudflared. action=check reports each tool as found with its path and required flag; only tesseract is required (OCR/vision need it unconditionally), while adb/scrcpy serve Android tools and plink serves SSH/Linux tools. action=install_required installs every missing required tool; action=install installs the named tool, both via the host package manager (winget, brew, or sudo apt-get) with a 180 second per-package timeout, so installs take minutes. Run action=add_to_path (or restart) afterward. For a read-only scan also covering Chrome and Python packages, use sassy_setup_check_tools.
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | check | |
| tool_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive and non-read-only; the description adds substantial behavioral context: package-manager use (winget, brew, sudo apt-get), a 180-second per-package timeout, minute-scale installs, required-tool semantics, and the post-install add_to_path step. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: mutating identity, action enum, tool_name constraints, required-tool mapping, install mechanics and timeout, follow-up step, and sibling differentiation. It front-loads the critical mutating/read-only distinction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-action installer with destructive side effects and external package-manager behavior, this description covers supported actions, target tools, platform-specific package managers, timeout expectations, and the required follow-up step. Since an output schema exists to document return shape, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has bare unconstrained strings with 0% description coverage and no enums. The description fully compensates by enumerating the legal action values and default, defining exactly when tool_name is required, and listing its allowed values: tesseract, adb, scrcpy, nmap, plink, cloudflared.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating installer for external tool dependencies,' a specific verb/resource pairing, then enumerates four actions with distinct outcomes. It explicitly distinguishes itself from sibling sassy_setup_check_tools for read-only scans, so an agent can tell them apart without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says explicitly to use action=check for the read-only report and routes deeper read-only scanning to sassy_setup_check_tools. It also specifies when tool_name is required, which actions perform installs, and that add_to_path should be run afterward. This gives clear when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_setup_wizardADestructive
Mutating: first-run questionnaire that writes the user profile to ~/.sassymcp/persona.md (keeping a one-deep persona.md.bak backup of any existing file before overwriting) and marks setup_complete in config. All parameters are optional: role (developer, sysadmin, security, devops, data, designer, manager, other; default developer), expertise_level (junior, mid, senior, principal, staff; default senior), communication_style (terse, balanced, verbose; default terse), security_posture (standard, hardened, paranoid; default standard), plus comma-separated specializations, languages, frameworks, newline-separated systems and projects, mcp_clients, and notes. The has_android and has_linux booleans (default false) drive the returned tools_to_install list: tesseract always included, adb and scrcpy when has_android is true, plink when has_linux is true. The wizard installs nothing itself; the response includes next_steps and a hint to run sassy_setup_tools(action=install_required), and reloads the persona module in-process. Re-run anytime to update the profile. The result includes a persona_backup field with the backup path (null on first run).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | developer | |
| notes | No | ||
| systems | No | ||
| projects | No | ||
| has_linux | No | ||
| languages | No | ||
| frameworks | No | ||
| has_android | No | ||
| mcp_clients | No | ||
| expertise_level | No | senior | |
| specializations | No | ||
| security_posture | No | standard | |
| communication_style | No | terse |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses the exact file path, the one-deep .bak backup behavior, overwrite semantics, in-process persona module reload, and the fact that no external tools are installed. It also reveals state changes such as marking setup_complete and the persona_backup field, which is far more transparent than annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but high-signal, front-loading the mutation and file target. Some default values are repeated from the schema, and the long parameter list would be easier to scan as bullets, but every sentence adds meaningful information and none is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no schema descriptions, a destructive mutation, and a rich output schema, the description covers the essential contextual ground: backup behavior, rerun safety, no-install semantics, and key return fields. The existing output schema handles return-value details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden of explaining 13 parameters. It enumerates enum choices and defaults for role, expertise_level, communication_style, and security_posture; specifies comma-separated vs newline-separated input formats; and explains how has_android and has_linux conditionally drive the tools_to_install list. This is exactly the semantic depth an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: it 'writes the user profile to ~/.sassymcp/persona.md' and marks setup_complete in config. It also distinguishes itself from installation/setup siblings by explicitly stating the wizard installs nothing itself and that sassy_setup_tools should be run for installs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly identifies this as a first-run questionnaire and says it can be re-run anytime to update the profile. It also states what it does not do ('installs nothing itself') and points to the specific alternative, sassy_setup_tools(action=install_required), giving the agent an explicit when/when-not guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_shellADestructive
Mutating: executes an arbitrary shell command in the host shell — it can do anything the shell can. shell defaults to powershell on Windows or the login shell on macOS/Linux; POSIX shells run the command verbatim while PowerShell syntax is normalized. timeout_seconds defaults to 30 (clamped 1-300); over 120 the call auto-promotes to a background session, returning a JSON handle to poll with sassy_session_read. Safety gates always run: catastrophic blocklist entries hard-block, delete keywords auto-stage targets to DELETE/ when identifiable, and other destructive patterns block or return a confirmation_required token (when interceptor.destructiveAction is 'confirm'; redeem via sassy_shell_confirm). allow_pattern bypasses one named pattern only. Output shows [exit: N] plus stdout and stderr. Use for one-shot commands; prefer sassy_session_start for long-running work.
| Name | Required | Description | Default |
|---|---|---|---|
| shell | No | ||
| command | Yes | ||
| allow_pattern | No | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes far beyond that: it discloses safety gates (catastrophic blocklist hard-blocks, delete keywords auto-stage to _DELETE_/, destructive patterns block or return confirmation_required), the confirmation flow via sassy_shell_confirm, allow_pattern bypass semantics, shell normalization differences, timeout clamping, auto-promotion to background sessions, and output format ([exit: N] plus stdout/stderr). This is rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: safety gates, shell behavior, timeout behavior, output format, and usage guidance are all packed into a compact paragraph. It is front-loaded with the most important fact ('Mutating... can do anything the shell can') and ends with the usage recommendation. Slightly long, but justified given the tool's power and safety complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-risk, arbitrary-command execution tool with 4 parameters and no schema descriptions, the description covers everything an agent needs: what it does, safety gates, confirmation flow, timeout behavior, background promotion, output format, and when to use an alternative. The output schema exists, so return values need not be spelled out. This is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It explains shell defaults and normalization, timeout_seconds default and clamping, and allow_pattern's single-pattern bypass semantics. The command parameter is self-evident from the tool's purpose. It doesn't explicitly describe the exact JSON shape of the background-session handle, but it names the polling tool, which is sufficient for an agent to proceed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('executes') and resource ('arbitrary shell command in the host shell'), and immediately clarifies scope ('can do anything the shell can'). It also distinguishes itself from siblings by naming sassy_session_start for long-running work and sassy_session_read for polling, so an agent can tell it apart from the session tools without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for one-shot commands; prefer sassy_session_start for long-running work,' which is direct when-to-use guidance with a named alternative. It also explains when auto-promotion to a background session happens (timeout over 120), which is a clear behavioral condition for choosing this tool vs. polling with sassy_session_read.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_shell_confirmADestructive
Mutating: executes a sassy_shell command that was returned as confirmation_required instead of hard-blocked, because interceptor.destructiveAction is set to 'confirm'. Tokens are single-use and expire after 60 seconds; each is bound to the exact command, shell, and working directory that produced it, so replay against anything different is rejected. HIGH-tier commands also require confirm_phrase to match the phrase shown in the original confirmation_required response. Execution is audit-logged as pattern_confirm_executed. Use it only as the second step of the confirm flow; it cannot start a command on its own.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | ||
| confirm_phrase | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false; the description's 'Mutating:' prefix aligns with those. Beyond annotations it adds rich behavioral context: single-use tokens, 60-second expiry, binding to exact command/shell/cwd with replay rejection, the HIGH-tier confirm_phrase requirement, and audit logging as pattern_confirm_executed. This materially exceeds what the annotations alone convey, with no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every sentence carries essential security-relevant information: mutation nature, flow position, token expiry, binding, replay rejection, phrase requirement, and audit logging. It is front-loaded with the purpose ('Mutating: executes...') before diving into constraints. The length is justified for a security-critical mutation tool; little is waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, security-sensitive tool, the description covers purpose, mutation behavior, token lifecycle, binding, replay protection, phrase rules, audit trail, and usage constraints. An output schema exists, so return-value documentation is handled elsewhere. The only minor gap is not explicitly naming the sibling first-step tool, but the flow is clear enough that an agent can execute correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantic load — and it does. It explains that token is single-use, expires after 60 seconds, and is bound to the originating command/shell/cwd (hence replay-safe), and that confirm_phrase is required only for HIGH-tier commands and must match the phrase from the original response. Both parameters get meaningful semantics the bare schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise verb+resource combination — 'executes a sassy_shell command that was returned as confirmation_required' — and situates it as the second step of a two-phase confirm flow. This clearly distinguishes it from the sibling sassy_shell tool that initiates commands, so an agent can differentiate them without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly constrains usage: 'Use it only as the second step of the confirm flow; it cannot start a command on its own.' This is a clear when-to-use/when-not-to-use directive. It names the trigger condition (commands returned as confirmation_required because interceptor.destructiveAction='confirm') though it does not explicitly name the sibling tool for the first step, leaving the alternative slightly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_state_clearADestructiveIdempotent
Destructive and mutating: permanently deletes stored state from the persistent per-tool SQLite state store (tool_state.db in the SassyMCP home directory). Optional tool_name="": when given, deletes every key saved under that tool name; when empty, deletes ALL state for ALL tools across the server with no way to recover. Requires confirm='YES' (exact, case-sensitive) on every call, matching the sassy_permission privilege mutations and sassy_audit_clear. Use to reset a misbehaving tool's remembered state or to wipe the whole state store clean; read first with sassy_state_get and back up values with sassy_state_set if they matter.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| tool_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds crucial context: 'permanently deletes', 'no way to recover', the exact confirm='YES' requirement, and that an empty tool_name wipes ALL state for ALL tools. This goes well beyond the structured annotations and fully discloses the dangerous behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value: hazard first, then resource, parameter semantics, safety gate, and usage guidance. It is dense but efficient, and the most critical information (destructive, permanent) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's destructive nature and optional parameters, the description covers all necessary aspects: what is deleted, how deletion scope changes, the confirmation requirement, and how to preserve data before calling. An output schema exists, so return-value documentation is not required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, yet the description fully explains both parameters: tool_name's behavior when given vs. empty, and confirm's exact-case requirement. It compensates perfectly for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb-resource pair ('permanently deletes stored state') and clearly identifies the underlying store (per-tool SQLite state store), distinguishing it from sibling tools like sassy_state_get and sassy_state_set. It is absolutely clear what the tool does and how it differs from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases ('reset a misbehaving tool's remembered state or to wipe the whole state store clean') and advises reading with sassy_state_get and backing up with sassy_state_set first. It does not explicitly state when not to use it vs. alternatives, but the context is strong enough for an agent to decide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_state_getARead-onlyIdempotent
Read-only. Retrieves one value from the persistent per-tool SQLite state store (tool_state.db in the SassyMCP home directory), surviving server restarts. Required: tool_name namespaces the key under a tool; required: key is the stored key. Returns the JSON-decoded value (whatever was saved with sassy_state_set) or null if the tool/key was never set. Use to read remembered state such as checkpoints, cursors, or preferences; use sassy_state_clear to delete and sassy_state_set to write. This is separate from the memory system — it is for tool operational state, not semantic memories.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| tool_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering readOnlyHint, idempotentHint, and destructiveHint, the description adds meaningful behavioral context: persistence across server restarts, JSON-decoded return value, and null return for unset keys. This adds value beyond the structured annotations and fully discloses observable behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the read-only nature and core retrieval action, then covers requirements, return behavior, and usage guidance in a logical flow. No filler or redundancy—every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple getter tool with an output schema, the description explains the return value (JSON-decoded or null) and the persistence semantics. It addresses both required parameters and distinguishes this state store from the memory system. No critical information an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden. It explains that tool_name 'namespaces the key under a tool' and key is 'the stored key', giving semantic meaning beyond the bare schema property names. It lacks format examples or constraints, but for simple string params this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb ('Retrieves'), resource ('persistent per-tool SQLite state store'), and explicitly differentiates from siblings by naming sassy_state_set and sassy_state_clear, plus distinguishing from the memory system. An agent can determine exactly what this tool does and what it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Use to read remembered state such as checkpoints, cursors, or preferences' and routes to alternatives: 'use sassy_state_clear to delete and sassy_state_set to write.' Also clarifies it is separate from the memory system, preventing misuse. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_state_setAIdempotent
Mutating. Persists a value into the per-tool SQLite state store (tool_state.db in the SassyMCP home directory), surviving server restarts. Required: tool_name namespaces the entry (any tool name can be used); required: key is the storage key; required: value is a string that is stored verbatim (the tool does not JSON-encode it — pass already-encoded JSON if you want structured values). Overwrites any existing value for the same tool/key pair. Returns a confirmation string. Use to checkpoint progress, save cursors, or persist preferences between sessions; read with sassy_state_get and delete with sassy_state_clear. Not a substitute for the memory system, which stores semantic facts.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| value | Yes | ||
| tool_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses persistence across restarts, overwrite behavior, verbatim string storage without JSON encoding, and the confirmation return value. This adds substantial context beyond the annotations, which already indicate mutation and idempotence. No contradiction with annotations is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, front-loading the core mutation behavior and storage location before parameter details and usage guidance. The one-word 'Mutating.' opener is an efficient behavioral cue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the three parameters, all are explained, the output schema exists, and annotations cover safety and idempotence, the description leaves no important gap for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates by explaining all three parameters: tool_name namespaces the entry, key is the storage key, and value is stored verbatim with guidance about passing encoded JSON. Every required parameter receives meaningful semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Persists a value into the per-tool SQLite state store,' naming the exact file and location. It is clearly distinct from siblings like sassy_state_get and sassy_state_clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'checkpoint progress, save cursors, or persist preferences between sessions.' It also names related tools for reading and deleting, and warns that it is 'Not a substitute for the memory system,' giving clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_tarAIdempotent
Mutating: writes a new tar archive to disk. Creates a tar from a file or directory path in source; directory contents are stored under the top-level directory name. compress (default gz) accepts gz, bz2, xz, or none, and any other value returns an error. output defaults to the source path plus .tar.gz, .tar.bz2, .tar.xz, or .tar according to compress. Sensitive members are not blocked (full-directory backups must keep working): if any archived file matches the sensitive-read denylist (SSH keys, credential stores, ...), the archive is still created but the result carries a 'warning' field listing them and the event is audit-logged. Returns the created path, a file count, and the archive size in bytes. There is no password option, unlike sassy_unzip. Use it to bundle directories for transport or backup; use sassy_untar to extract what it creates.
| Name | Required | Description | Default |
|---|---|---|---|
| output | No | ||
| source | Yes | ||
| compress | No | gz |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, but the description adds critical context: it confirms mutation, explains the sensitive-member behavior (archive still created, warning field, audit log), and details output naming conventions and error conditions for invalid compress values. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence serves a purpose: purpose, parameter behavior, sensitive-file handling, return values, and usage guidance. It is front-loaded with the core action and then expands on details. Slightly long but not wasteful; a 4 reflects the balance between completeness and brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters, an output schema, and annotations, the description covers all necessary aspects: exact inputs, output path logic, return fields (path, count, size), error handling, sensitive-file policy, and how it relates to siblings. An agent can invoke it correctly without any additional inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description fully compensates by explaining each parameter: source (file or directory path), compress (accepted values gz, bz2, xz, none, with default gz and error on other values), and output (default path construction based on compress). This goes beyond schema field names to give meaningful usage semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (creates/writes), resource (tar archive), and behavior (from file or directory path). It distinguishes itself from siblings like sassy_untar and sassy_zip by describing its role as bundling for transport/backup and explicitly noting it is not sassy_unzip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('Use it to bundle directories for transport or backup') and provides the alternative ('use sassy_untar to extract what it creates'). Also mentions a key difference from sassy_unzip (no password option), which helps agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_toastA
Shows a desktop notification on the machine running SassyMCP; no files or data are changed. Routed per platform: Windows tries BurntToast, then .NET toast, then msg.exe; macOS uses osascript; Linux uses notify-send and fails if libnotify is not installed. title and message are required; duration accepts short or long (default short) and anything else is treated as short, mapping to normal or critical urgency on Linux. Returns sent or failed plus the method used, with a 10-second per-method timeout. Use it to alert on completion of a long-running task the user is watching for.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| message | Yes | ||
| duration | No | short |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations. It discloses that the tool is non-destructive ('no files or data are changed'), explains the per-platform fallback chain (BurntToast → .NET toast → msg.exe on Windows, osascript on macOS, notify-send on Linux), describes the duration mapping ('short or long... anything else is treated as short, mapping to normal or critical urgency on Linux'), and reveals the 10-second per-method timeout. It also states the return value ('sent or failed plus the method used'). This is rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose and non-destructive nature, then details platform routing, parameters, return value, and use case. Every sentence adds information. It is slightly long, but the complexity of the platform-specific behavior justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 params, platform-specific behavior, output schema present), the description covers all essential aspects: what it does, what it doesn't do, platform requirements, parameter semantics, timeout behavior, return value, and a concrete use case. The output schema exists, so the description needn't detail the return structure further. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter semantics. It explains that title and message are required, and it defines the duration parameter's allowed values and their behavior ('short or long (default short) and anything else is treated as short, mapping to normal or critical urgency on Linux'). This adds meaning beyond the bare schema, though it doesn't describe title/message content constraints (e.g., length limits), which is a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Shows a desktop notification on the machine running SassyMCP'. It also clarifies that no files or data are changed, which distinguishes it from file-manipulation siblings like sassy_write_file, sassy_edit_block, and sassy_safe_delete. The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use it to alert on completion of a long-running task the user is watching for,' which gives a clear when-to-use scenario. It also explains platform-specific routing and failure conditions (e.g., Linux fails if libnotify is not installed), which helps an agent decide whether this tool is appropriate in the current environment. No alternative tool is named, but the use case is specific enough that an agent can distinguish it from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_tool_catalogARead-onlyIdempotent
Read-only. Enumerates every currently registered tool derived live from the tool registry (so it never drifts from reality), returning total count, per-group counts, the applied filters, and tools grouped by group as name plus one-line purpose, sorted by group then name. group (default empty = all) filters to one tool group; use sassy_tool_groups to learn valid group names. query (default empty) is a case-insensitive substring match against the tool name or its purpose line. Use this as the client-agnostic capability map to see what the server can actually do; prefer it over sassy_tool_groups when you need tool-level detail rather than group metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| query | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false. The description adds the key behavior that it is derived live from the registry, so it never drifts from reality, which is extra context beyond the annotations. No contradictions found. The only missing detail is that it doesn't mention pagination or limits, but for a read-only enumeration this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph but front-loaded with the key purpose and live registry detail. It packs a lot of information (return format, sorting, filters, sibling guidance) with minimal waste. It is somewhat long but every sentence earns its place, and the structure is logical: what, how, parameters, and when to use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 optional params, no required), the description covers everything an agent needs: what it returns (counts, grouped tools, filters), how to filter (group, query), how to get valid group names (sassy_tool_groups), and when to use it (capability map). The output schema exists, so return format is covered. No critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain the parameters. It does: 'group (default empty = all) filters to one tool group; use sassy_tool_groups to learn valid group names' and 'query (default empty) is a case-insensitive substring match against the tool name or its purpose line'. This adds meaning beyond the bare schema, compensating for the zero coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool enumerates registered tools with live registry data, returning counts and grouped details. It distinguishes itself from sassy_tool_groups by emphasizing tool-level detail vs group metadata, and from other tools by focusing on capability mapping. The verb 'enumerates' and resource 'tool registry' are specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'as the client-agnostic capability map to see what the server can actually do' and when to prefer alternatives: 'prefer it over sassy_tool_groups when you need tool-level detail rather than group metadata'. This provides clear routing to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_tool_groupsARead-onlyIdempotent
Read-only. Lists all available tool groups with their load status and metadata: member modules, one-line description, always_load flag, tool counts, network requirements, and per-group rate limits. Takes no parameters. Use this to see which groups are loaded before enabling more or diagnosing missing tools (missing tools are usually in a dormant on-demand group); use sassy_tool_group_toggle to change load state and sassy_tool_catalog to list the tools inside a group.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description reinforces this with 'Read-only' rather than contradicting it. The description adds useful behavioral context by detailing the returned metadata (load status, rate limits, network requirements) and explaining what missing tools usually indicate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the read-only nature and primary action, then lists the returned fields, then gives usage guidance in one additional sentence. Every sentence adds value; there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with a rich output schema, the description is complete: it tells the agent what the tool returns, when to use it, and which siblings to use for related actions. The presence of an output schema means return-value structure does not need to be repeated in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema already fully covers this dimension. The description correctly states 'Takes no parameters', and no additional parameter semantics are needed beyond the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Lists all available tool groups with their load status and metadata', and enumerates the exact metadata fields returned. It also distinguishes itself from sibling tools sassy_tool_group_toggle and sassy_tool_catalog, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'before enabling more or diagnosing missing tools'. It also names the alternatives and their purposes: sassy_tool_group_toggle for changing load state and sassy_tool_catalog for listing tools inside a group. This fully routes the agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_tool_group_toggleAIdempotent
Mutating: flips a tool group's always_load flag in the running server process, enabling (enable=true, default) or disabling (enable=false) its modules, and attempts a tools/list_changed notification so capable clients (Claude Code, Cursor) refresh automatically. Clients that do not handle it (Claude Desktop today) need a manual server restart. group must be an exact group name (core, infrastructure, android, system, forensics, linux, github_quick, github_full, persona, utility, setup, memory, updater, combos, prompts); an unknown name returns an error listing the valid groups. Returns status, the group's modules, and whether the notification was sent. Use it to trim context by disabling heavy unused groups like github_full, or to load dormant capability on demand; check sassy_tool_groups first for current load status.
| Name | Required | Description | Default |
|---|---|---|---|
| group | Yes | ||
| enable | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations by detailing the live-server mutation, the attempted tools/list_changed notification, client-specific behavior requiring restart, unknown-group error behavior, and return contents. This gives the agent a complete behavioral picture with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and well-structured, opening with the mutating nature and action before covering notification, acceptable values, return values, and use cases. The long list of group names is justified because the schema lacks enums or descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating toggle with two parameters Games, the description covers inputs, valid values, side effects, client behavior, return summary Games, and usage rationale. The output schema covers the return structure, while the description fills all other contextual gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description fully compensates: it defines 'enable=true, default' and 'enable=false', requires an exact group name, lists all valid group names, and explains the error for unknown names. This adds meaning far beyond the bare schema properties.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'flips a tool group's always_load flag' and explains enabling/disabling modules. This clearly distinguishes it from sibling tools like sassy_tool_groups by focusing on mutation rather than inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit use cases: 'trim context by disabling heavy unused groups like github_full' or 'load dormant capability on demand.' It also directs the agent to check sassy_tool_groups first for current load status, providing clear context, though it does not explicitly list when-not-to-use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_tool_usageARead-onlyIdempotent
Read-only. Returns tool usage analytics tracked by the server and persisted across sessions in ~/.sassymcp/tool_usage.json (last 90 days, capped at 500 invocations per tool): unique_tools_ever, total_invocations, invocations_today, invocations_this_week, and a top_10 list of tool names with recency-weighted scores (0.0-1.0 via exponential decay, so recent calls count more). Takes no parameters. Use it to see which tools are actually exercised, to inform which groups are safe to disable, or to understand usage patterns; pair with sassy_tool_groups when deciding what to prune for context savings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, non-destructive), the description reveals persistence across sessions, the file location (~/.sassymcp/tool_usage.json), retention window (last 90 days), per-tool cap (500 invocations), and the exponential decay weighting of the top_10 scores. These are meaningful behavioral details an agent would not infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with 'Read-only' and a clear statement of what it returns, then packs retention details and usage guidance into three dense sentences. Every clause carries information—file path, cap, decay formula, and decision use cases—with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless tool with an output schema, the description is fully self-contained: it explains persistence, data scope, the decay scoring model, and how to use the results for pruning. It even cross-references sassy_tool_groups, covering the decision workflow.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema coverage is 100% (vacuously). No parameter documentation is needed, which matches the baseline of 4 for parameterless tools; the description adds no parameter-specific meaning because none exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Returns tool usage analytics tracked by the server' and enumerates the exact statistics returned. It distinguishes itself from lookalike siblings by focusing on persisted usage metrics (invocations, recency-weighted top 10) rather than observability health or audit logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases: 'to see which tools are actually exercised, to inform which groups are safe to disable, or to understand usage patterns' and recommends pairing with sassy_tool_groups for pruning decisions. It does not mention when not to use it or explicit alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_type_textADestructive
Mutating: sends keystrokes to the focused field. It always clears the field first with ctrl-a + backspace, so it never appends — if you need to preserve existing content, this is the wrong tool. If target_x and target_y are both nonzero it clicks there first; text is then typed with interval seconds between keystrokes (default 0.02). Works on Windows, macOS, and Linux via pyautogui. Returns the character count typed. Use it to fill GUI fields; use sassy_hotkey for shortcuts like ctrl+s and sassy_click for mouse actions.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| interval | No | ||
| target_x | No | ||
| target_y | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the destructiveHint annotation by disclosing the exact destructive mechanism: it 'always clears the field first with ctrl-a + backspace, so it never appends'. It also reveals the conditional click on target_x/target_y, per-keystroke interval, platform support, and return value, all consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Six sentences, each earning its place: purpose, destructive behavior, coordinate/interval behavior, platform, return value, and sibling routing. It is front-loaded with the most important facts and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, destructive behavior, parameter conditions, platform, return value, and alternatives. Given that an output schema exists and annotations capture the safety profile, nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description carries the full burden, and it succeeds: text is the typed content, interval is the seconds between keystrokes with a default, and target_x/target_y jointly trigger a preliminary click only when both are nonzero. This adds actionable meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'sends keystrokes to the focused field' and 'fill GUI fields'. It also distinguishes itself from siblings by naming sassy_hotkey for shortcuts and sassy_click for mouse actions, so an agent can select correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance ('Use it to fill GUI fields') and explicit when-not guidance ('if you need to preserve existing content, this is the wrong tool'). It also names concrete alternatives, sassy_hotkey and sassy_click, reducing ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_untarAIdempotent
Mutating: writes extracted files to disk. Extracts tar, tar.gz, tar.bz2, or tar.xz archives using a data-only extraction filter. destination defaults to the archive's parent directory under the archive name with the .tar extension removed. Existing files at the destination are silently overwritten. There is no password option, unlike sassy_unzip. Returns the extraction path, the file count, and a sample of the first 20 member names. Use it to open archives created by sassy_tar or downloaded from the web.
| Name | Required | Description | Default |
|---|---|---|---|
| archive | Yes | ||
| destination | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=false, yet the description says existing files at the destination are silently overwritten, which is a destructive side effect. This is an annotation contradiction, so the description's otherwise strong behavioral disclosure cannot be credited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences, each carrying a distinct fact: mutating behavior, formats, destination default, overwrite semantics, return summary, and usage guidance. Front-loaded with the mutating warning; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema covers return values, the description provides all needed operational context: formats, default destination, overwrite behavior, and the password limitation. An agent has enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema coverage, the description compensates by explaining the destination default and the accepted archive formats. It could be clearer that 'archive' is a filesystem path, but it adds substantial meaning beyond the bare parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Extracts') with the supported formats (tar, tar.gz, tar.bz2, tar.xz) and names the sibling it differs from (sassy_unzip). An agent can immediately understand what this tool does and how it relates to nearby tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it for archives created by sassy_tar or downloaded from the web, and points out the absence of a password option compared with sassy_unzip. It gives clear context but does not exhaustively state when not to use it beyond that contrast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_unzipAIdempotent
Mutating: writes extracted files to disk. Extracts a .zip archive to destination, defaulting to the archive's parent directory under the archive's stem name. password (default empty) unlocks encrypted zips. Zip-slip protection rejects the whole archive with an error if any entry path escapes the destination. Existing files at the destination are silently overwritten. Returns the extraction path, the file count, and a sample of the first 20 entry names. Use it to open zips from any source; use sassy_zip to create archives for extraction with this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| archive | Yes | ||
| password | No | ||
| destination | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations by describing side effects (files written to disk, existing files silently overwritten), safety behavior (zip-slip protection rejects the whole archive), and return contents (path, file count, first 20 entry names). These details are consistent with readOnlyHint=false and add meaningful behavioral context the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences pack the mutation warning, default destination behavior, password handling, zip-slip protection, overwrite semantics, returns, and sibling routing with no wasted words. The mutation warning is front-loaded, which is useful for an agent deciding whether to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Everything needed to call the tool correctly is present: required archive, optional destination default, optional password, overwrite behavior, security handling, and usage routing. Since an output schema exists, the description does not need to enumerate return values, and nothing else is missing for a correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, so the description carries the full burden of explaining parameters. It covers the archive to extract, the destination defaulting to the archive's parent under its stem name, and the password parameter defaulting to empty for encrypted archives, giving meaning to all three parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Begins with 'Mutating: writes extracted files to disk,' then clearly states it extracts a .zip archive to a destination with a defined default. The final sentence names sassy_zip as the archive-creation counterpart, so an agent can distinguish extraction from creation without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use it to open zips from any source; use sassy_zip to create archives for extraction with this tool,' giving both a usage context and a pointer to the relevant sibling. It does not explicitly contrast with the tar-extraction sibling sassy_untar, which is a minor gap in when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_update_applyAIdempotent
Mutating (writes a downloaded file to disk; does NOT execute anything). Downloads one release asset to staging and returns the local path plus a run command the user executes manually. Required: asset_name (exact filename; get valid names from sassy_update_list). Optional tag (default latest) and dest_dir (default LOCALAPPDATA/SassyMCP/updates on Windows, ~/SassyMCP/updates otherwise). If the release publishes a SHA-256 sidecar, the download is verified: on mismatch the file is deleted and the tool errors; with no sidecar it warns but proceeds. The run command is per asset type AND host OS: msiexec /i for .msi on Windows (.msi is Windows-only and refused with guidance on POSIX), Expand-Archive for .zip on Windows vs unzip -o plus chmod +x on POSIX, tar -xzf for .tar.gz/.tgz, direct path otherwise. Disabled in packaged/frozen builds: returns an error telling you to install a new release artifact instead. Requires network access.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | ||
| dest_dir | No | ||
| asset_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds critical behavioral detail beyond that: it clarifies that it does NOT execute anything, describes the SHA-256 verification process (deleting file on mismatch and erroring, or warning and proceeding without a sidecar), and notes platform-specific behaviors like refusing .msi on POSIX. It also mentions the disabled condition for packaged builds. This is rich, non-contradictory transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is long, every sentence carries essential information and is logically ordered: starting with the core mutation/execution distinction, then requirements, then verification, then platform specifics, then disabled/build conditions and network requirement. There is no filler or redundancy; the structure front-loads the most critical safety information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and 0% parameter coverage, the description delivers everything an agent needs: the return value (local path plus run command), the required input and its source, optional parameters with defaults, verification behavior, platform-specific command generation, and operational constraints (network, disabled in frozen builds). No critical information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only provides types and defaults, with zero description coverage. The description goes far beyond that: it explains that asset_name is required and must be an exact filename (and how to obtain valid names), that tag defaults to 'latest', and that dest_dir has OS-specific defaults (LOCALAPPDATA on Windows, ~/SassyMCP/updates otherwise). It also clarifies the meaning of optional parameters in practice. This fully compensates for the schema's lack of explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement of what the tool does and what it does NOT do: 'Mutating (writes a downloaded file to disk; does NOT execute anything)'. It clearly specifies the resource (release asset) and the action (download, write to disk, return path and command). This distinguishes it from sibling tools like sassy_update_list (which lists assets) and sassy_update_check (which checks for updates). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent to get valid asset_name values from the sibling tool sassy_update_list, and clearly explains the optional parameters (tag, dest_dir) with their defaults and OS-specific behavior. It also states that it is disabled in packaged/frozen builds and requires network access. This fully orients the agent on when and how to use the tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_update_changelogARead-onlyIdempotent
Read-only. Returns the release notes for one release as JSON with tag, release name, published_at, the notes body, and the release URL. Optional tag; defaults to the latest release when omitted. If the tag is not found among recent releases it returns an error. Requires network access to the GitHub releases endpoint. Use to see what changed before deciding to upgrade; for the downloadable assets of that release use sassy_update_list, and to stage the download use sassy_update_apply. Does not check whether you are behind; for that use sassy_update_check.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, openWorldHint, idempotentHint, destructiveHint), the description adds concrete behavioral details: network access requirement, error behavior when tag not found, default to latest release, and the specific fields returned. This is substantial and directly aids correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense, starting with the core purpose and then layering in usage guidance and exclusions. Every sentence adds value; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single optional param, no output schema), the description covers all required invocation details: output format, default behavior, error case, network dependency, and when to use it relative to siblings. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is only one optional parameter. The description fully compensates by explaining that 'tag' is optional, defaults to latest release, and returns an error if not found. This is exactly the semantic information needed beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Returns') and resource ('release notes for one release') and explicitly defines the output shape (tag, release name, published_at, notes body, URL). It also distinguishes itself from siblings by naming what it does not do (checking if behind) and listing alternative tools for related tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('Use to see what changed before deciding to upgrade') and when not, with clear alternatives: 'for the downloadable assets of that release use sassy_update_list' and 'to stage the download use sassy_update_apply' and 'Does not check whether you are behind; for that use sassy_update_check.' No ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_update_checkARead-onlyIdempotent
Read-only (fetches remote release state; changes nothing). The apt-update equivalent: contacts the GitHub releases endpoint and reports current version versus latest version as JSON with an upgradable boolean and a one-line summary. Results are cached for 5 minutes; pass force=true to bypass the cache and hit the network again. If GitHub is unreachable it returns an error instead of guessing. Takes no other parameters and requires network access. Use as the first update step to learn whether an upgrade exists; then use sassy_update_changelog to read the notes, sassy_update_list to see the assets, and sassy_update_apply to download.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: it is read-only, caches results for 5 minutes, force=true bypasses the cache, it returns an error if GitHub is unreachable instead of guessing, and it requires network access. The annotations align with the description, and the description enriches the safety profile with concrete runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it leads with the read-only guarantee, then explains purpose, output, caching behavior, error behavior, parameter scope, and sibling tool routing. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description tells the agent exactly what the response contains (JSON with upgradable boolean and one-line summary). It covers input, side effects, caching, network requirements, failure mode, and how the tool fits into the broader update workflow. An agent can invoke it correctly with no missing context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries full responsibility for parameter meaning. It explicitly explains that force=true bypasses the cache and hits the network again, and it states that no other parameters exist. This fully compensates for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: fetch remote release state from GitHub and report current versus latest version. It also explicitly positions itself as the 'apt-update equivalent' and distinguishes its role from sibling tools like sassy_update_changelog, sassy_update_list, and sassy_update_apply.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: use this as the first update step to learn whether an upgrade exists, then use the named siblings for changelog, assets, and applying the update. This clearly routes the agent to the correct tool and its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_update_listARead-onlyIdempotent
Read-only. Lists the downloadable assets for one release as JSON: tag, current version, asset_count, and per-asset name, size_bytes, download_url, content_type, and download count. Optional tag; defaults to the latest release. Lookup is limited to the five newest published releases (older tags return a not-found error) and drafts are excluded. Requires network access to the GitHub releases endpoint. Use after sassy_update_check to pick the right asset_name for sassy_update_apply; use sassy_update_changelog for the release notes. Nothing here downloads or installs anything.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint=false), the description discloses meaningful behavior: lookup limited to five newest releases, drafts excluded, older tags return not-found, tag defaults to latest, and nothing downloads or installs anything. None of this contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the read-only nature and core purpose, then methodically covers output shape, parameter behavior, constraints, network requirement, and related tools. Every sentence adds either selection guidance or call-critical detail; nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description supplies the return shape and field list. It also covers the optional parameter, default behavior, lookup limits, draft exclusion, network dependency, and sibling tool routing. For a simple one-parameter read-only lookup, nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the burden for the sole 'tag' parameter. It compensates well: 'Optional tag; defaults to the latest release,' plus the behavioral constraint that older tags return a not-found error and drafts are excluded. This gives an agent enough to invoke the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Lists') and resource ('downloadable assets for one release'), and enumerates the exact returned fields (tag, version, asset_count, per-asset metadata). It also distinguishes itself from siblings by naming sassy_update_apply, sassy_update_changelog, and sassy_update_check in context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit sequencing guidance: 'Use after sassy_update_check to pick the right asset_name for sassy_update_apply; use sassy_update_changelog for the release notes.' It also states a prerequisite (network access to the GitHub releases endpoint) and a hard constraint (only five newest published releases).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_write_fileADestructive
Mutating: creates or overwrites files. mode defaults to 'rewrite' (full replace); on an existing file the prior contents are first snapshotted into the adjacent DELETE/ staging folder as stem.overwrite..ext, so overwrites are recoverable. mode 'append' adds bytes to the end. Missing parent directories are created. encoding defaults to utf-8 (any Python codec name); line_endings defaults to 'preserve' (verbatim), with 'lf' and 'crlf' normalizing all line breaks (crlf is useful for Windows .bat/.ps1 files). It bypasses the shell-keyword interceptor entirely, but protected paths (SassyMCP source tree, ~/.sassymcp, ~/.ssh, ~/.aws, etc.) are refused. Use it to create files or full rewrites; prefer sassy_edit_block or sassy_edit_multi for small changes to existing files.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | rewrite | |
| path | Yes | ||
| content | Yes | ||
| encoding | No | utf-8 | |
| line_endings | No | preserve |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description discloses overwrite snapshot recovery into _DELETE_, append behavior, parent-directory creation, default encoding and line-ending normalization, and refusal of protected paths. It also notes that the shell-keyword interceptor is bypassed. This is substantial behavioral context consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but it is front-loaded with the core purpose and every subsequent clause adds operational information needed to call the tool correctly. It is long due to the number of behavioral nuances, not verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five parameters, the primary behavioral modes, safety constraints, and the recommended alternative tools are covered. An output schema exists, so the lack of explicit return-value description is acceptable; nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates by explaining mode values ('rewrite' vs 'append'), encoding default and accepted codec names, and line_endings behavior ('preserve', 'lf', 'crlf'). It also clarifies path-related behavior by mentioning missing parent directories and protected paths.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: creates or overwrites files'—a specific verb and resource—then distinguishes the two write modes. It also names sassy_edit_block/sassy_edit_multi as the tools for small edits, so it is clear what this tool is not for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for file creation or full rewrites and to prefer sassy_edit_block or sassy_edit_multi for small changes to existing files. Mode-level guidance (append vs rewrite) and the 'prefer' rule give an agent concrete decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sassy_zipAIdempotent
Mutating: writes a new zip archive to disk. Creates a zip from a file or directory in source; directories are walked recursively and files are stored with paths relative to the source root, while a single file is stored under its basename. compression (default deflated) accepts deflated, stored, bzip2, or lzma, and unrecognized values fall back to deflated. output defaults to source plus .zip, replacing the extension for files. Sensitive members are not blocked (full-directory backups must keep working): if any archived file matches the sensitive-read denylist (SSH keys, credential stores, ...), the archive is still created but the result carries a 'warning' field listing them and the event is audit-logged. Returns the created path, file count, original and zip byte sizes, and a compression ratio percentage. Use it to package files for sharing; use sassy_unzip to extract what it creates.
| Name | Required | Description | Default |
|---|---|---|---|
| output | No | ||
| source | Yes | ||
| compression | No | deflated |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing side effects: it writes to disk, walks directories recursively, stores paths relative to source root, falls back to deflated for unrecognized compression values, and does not block sensitive members while still logging them. It also enumerates the return fields. This is rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although long, the description is dense and every sentence earns its place. The mutating side effect is front-loaded, followed by input handling, output behavior, security implications, return value, and usage guidance. There is no redundant restatement of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the sparse schema and available annotations, the description is remarkably complete. It covers input semantics, defaults, edge-case compression behavior, security-sensitive handling, audit logging, and the returned summary fields. The only minor omissions, such as overwrite behavior for an existing output file, do not materially impair an agent's ability to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully document parameters, and it does. It explains the meaning of 'source' (file or directory), 'output' (defaults to source plus .zip, replacing extension for files), and 'compression' (valid values plus fallback behavior). Every parameter receives useful semantic detail beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Mutating: writes a new zip archive to disk' and then specifies exactly what it does: 'Creates a zip from a file or directory in source.' It distinguishes itself from the sibling sassy_unzip by saying 'use sassy_unzip to extract what it creates,' so an agent can tell this tool apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Use it to package files for sharing; use sassy_unzip to extract what it creates.' It clearly names the companion alternative. However, it does not differentiate sassy_zip from the sibling sassy_tar/sassy_untar archive tools, so an agent choosing between zip and tar formats has no explicit decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.16.0- Changed
sassy_memory_handoff2 fields changed- added
Output schema / properties / crosslink_postedAdded value: +{ + "title": "Crosslink Posted", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "handoff_saved", - "memory_key", - "crosslink_channel", - "next_session" -]New value: +[ + "handoff_saved", + "memory_key", + "crosslink_channel", + "next_session", + "crosslink_posted" +]
- Changed
sassy_permission1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": "", + "title": "Confirm", + "type": "string" +}
- Changed
sassy_state_clear1 field changed- added
Input schema / properties / confirmAdded value: +{ + "default": "", + "title": "Confirm", + "type": "string" +}
55 tool updates
v1.15.1- Added
sassy_batch - Changed
sassy_context_estimate4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_context_estimateOutput"New value: +"sassy_context_estimateDictOutput"
- Changed
sassy_diff4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_diffOutput"New value: +"sassy_diffDictOutput"
- Changed
sassy_env_get4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_env_getOutput"New value: +"sassy_env_getDictOutput"
- Changed
sassy_env_list4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_env_listOutput"New value: +"sassy_env_listDictOutput"
- Changed
sassy_env_set4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_env_setOutput"New value: +"sassy_env_setDictOutput"
- Changed
sassy_get_config4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_get_configOutput"New value: +"sassy_get_configDictOutput"
- Changed
sassy_hooks_activate4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_hooks_activateOutput"New value: +"sassy_hooks_activateDictOutput"
- Changed
sassy_hooks_deactivate4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_hooks_deactivateOutput"New value: +"sassy_hooks_deactivateDictOutput"
- Changed
sassy_hooks_list4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_hooks_listOutput"New value: +"sassy_hooks_listDictOutput"
- Changed
sassy_hooks_suggest4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_hooks_suggestOutput"New value: +"sassy_hooks_suggestDictOutput"
- Changed
sassy_http4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_httpOutput"New value: +"sassy_httpDictOutput"
- Changed
sassy_http_ping4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_http_pingOutput"New value: +"sassy_http_pingDictOutput"
- Changed
sassy_memory_context12 fields changed- added
Output schema / $defsAdded value: +{ + "MemoryRecord": { + "properties": { + "access_count": { + "title": "Access Count", + "type": "integer" + }, + "created_at": { + "title": "Created At", + "type": "number" + }, + "key": { + "title": "Key", + "type": "string" + }, + "priority": { + "title": "Priority", + "type": "string" + }, + "project": { + "title": "Project", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "string" + }, + "updated_at": { + "title": "Updated At", + "type": "number" + }, + "value": { + "title": "Value", + "type": "string" + } + }, + "required": [ + "key", + "value", + "tags", + "priority", + "project", + "created_at", + "updated_at", + "access_count" + ], + "title": "MemoryRecord", + "type": "object" + }, + "Milestone": { + "properties": { + "event": { + "title": "Event", + "type": "string" + }, + "id": { + "title": "Id", + "type": "integer" + }, + "project": { + "title": "Project", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "string" + }, + "timestamp": { + "title": "Timestamp", + "type": "number" + } + }, + "required": [ + "id", + "event", + "project", + "tags", + "timestamp" + ], + "title": "Milestone", + "type": "object" + } +} - added
Output schema / properties / active_tasksAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Active Tasks", + "type": "array" +} - added
Output schema / properties / blockersAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Blockers", + "type": "array" +} - added
Output schema / properties / criticalAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Critical", + "type": "array" +} - added
Output schema / properties / high_priorityAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "High Priority", + "type": "array" +} - added
Output schema / properties / milestonesAdded value: +{ + "items": { + "$ref": "#/$defs/Milestone" + }, + "title": "Milestones", + "type": "array" +} - added
Output schema / properties / patternsAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Patterns", + "type": "array" +} - added
Output schema / properties / project_memoriesAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Project Memories", + "type": "array" +} - added
Output schema / properties / recent_memoriesAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Recent Memories", + "type": "array" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "critical", + "high_priority", + "active_tasks", + "blockers", + "recent_memories", + "project_memories", + "patterns", + "milestones" +] - changed
Output schema / titlePrevious value: -"sassy_memory_contextOutput"New value: +"ContextResult"
- Changed
sassy_memory_forget6 fields changed- added
Output schema / properties / errorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" +} - added
Output schema / properties / forgottenAdded value: +{ + "title": "Forgotten", + "type": "boolean" +} - added
Output schema / properties / keyAdded value: +{ + "title": "Key", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "forgotten", + "key", + "error" +] - changed
Output schema / titlePrevious value: -"sassy_memory_forgetOutput"New value: +"ForgetResult"
- Changed
sassy_memory_handoff7 fields changed- added
Output schema / properties / crosslink_channelAdded value: +{ + "title": "Crosslink Channel", + "type": "string" +} - added
Output schema / properties / handoff_savedAdded value: +{ + "title": "Handoff Saved", + "type": "boolean" +} - added
Output schema / properties / memory_keyAdded value: +{ + "title": "Memory Key", + "type": "string" +} - added
Output schema / properties / next_sessionAdded value: +{ + "title": "Next Session", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "handoff_saved", + "memory_key", + "crosslink_channel", + "next_session" +] - changed
Output schema / titlePrevious value: -"sassy_memory_handoffOutput"New value: +"HandoffResult"
- Changed
sassy_memory_log5 fields changed- added
Output schema / properties / loggedAdded value: +{ + "title": "Logged", + "type": "string" +} - added
Output schema / properties / projectAdded value: +{ + "title": "Project", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "logged", + "project" +] - changed
Output schema / titlePrevious value: -"sassy_memory_logOutput"New value: +"LogResult"
- Changed
sassy_memory_milestones6 fields changed- added
Output schema / $defsAdded value: +{ + "Milestone": { + "properties": { + "event": { + "title": "Event", + "type": "string" + }, + "id": { + "title": "Id", + "type": "integer" + }, + "project": { + "title": "Project", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "string" + }, + "timestamp": { + "title": "Timestamp", + "type": "number" + } + }, + "required": [ + "id", + "event", + "project", + "tags", + "timestamp" + ], + "title": "Milestone", + "type": "object" + } +} - added
Output schema / properties / countAdded value: +{ + "title": "Count", + "type": "integer" +} - added
Output schema / properties / milestonesAdded value: +{ + "items": { + "$ref": "#/$defs/Milestone" + }, + "title": "Milestones", + "type": "array" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "count", + "milestones" +] - changed
Output schema / titlePrevious value: -"sassy_memory_milestonesOutput"New value: +"MilestonesResult"
- Changed
sassy_memory_recall7 fields changed- added
Output schema / $defsAdded value: +{ + "MemoryRecord": { + "properties": { + "access_count": { + "title": "Access Count", + "type": "integer" + }, + "created_at": { + "title": "Created At", + "type": "number" + }, + "key": { + "title": "Key", + "type": "string" + }, + "priority": { + "title": "Priority", + "type": "string" + }, + "project": { + "title": "Project", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "string" + }, + "updated_at": { + "title": "Updated At", + "type": "number" + }, + "value": { + "title": "Value", + "type": "string" + } + }, + "required": [ + "key", + "value", + "tags", + "priority", + "project", + "created_at", + "updated_at", + "access_count" + ], + "title": "MemoryRecord", + "type": "object" + } +} - added
Output schema / properties / errorAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Error" +} - added
Output schema / properties / foundAdded value: +{ + "title": "Found", + "type": "boolean" +} - added
Output schema / properties / memoryAdded value: +{ + "anyOf": [ + { + "$ref": "#/$defs/MemoryRecord" + }, + { + "type": "null" + } + ] +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "found", + "memory", + "error" +] - changed
Output schema / titlePrevious value: -"sassy_memory_recallOutput"New value: +"RecallResult"
- Changed
sassy_memory_remember5 fields changed- added
Output schema / properties / actionAdded value: +{ + "title": "Action", + "type": "string" +} - added
Output schema / properties / keyAdded value: +{ + "title": "Key", + "type": "string" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "key", + "action" +] - changed
Output schema / titlePrevious value: -"sassy_memory_rememberOutput"New value: +"RememberResult"
- Changed
sassy_memory_search6 fields changed- added
Output schema / $defsAdded value: +{ + "MemoryRecord": { + "properties": { + "access_count": { + "title": "Access Count", + "type": "integer" + }, + "created_at": { + "title": "Created At", + "type": "number" + }, + "key": { + "title": "Key", + "type": "string" + }, + "priority": { + "title": "Priority", + "type": "string" + }, + "project": { + "title": "Project", + "type": "string" + }, + "tags": { + "title": "Tags", + "type": "string" + }, + "updated_at": { + "title": "Updated At", + "type": "number" + }, + "value": { + "title": "Value", + "type": "string" + } + }, + "required": [ + "key", + "value", + "tags", + "priority", + "project", + "created_at", + "updated_at", + "access_count" + ], + "title": "MemoryRecord", + "type": "object" + } +} - added
Output schema / properties / countAdded value: +{ + "title": "Count", + "type": "integer" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - added
Output schema / properties / resultsAdded value: +{ + "items": { + "$ref": "#/$defs/MemoryRecord" + }, + "title": "Results", + "type": "array" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "count", + "results" +] - changed
Output schema / titlePrevious value: -"sassy_memory_searchOutput"New value: +"SearchResult"
- Changed
sassy_memory_stats7 fields changed- added
Output schema / properties / by_priorityAdded value: +{ + "additionalProperties": { + "type": "integer" + }, + "title": "By Priority", + "type": "object" +} - added
Output schema / properties / milestonesAdded value: +{ + "title": "Milestones", + "type": "integer" +} - added
Output schema / properties / projectsAdded value: +{ + "items": { + "type": "string" + }, + "title": "Projects", + "type": "array" +} - removed
Output schema / properties / resultRemoved value: -{ - "title": "Result", - "type": "string" -} - added
Output schema / properties / total_memoriesAdded value: +{ + "title": "Total Memories", + "type": "integer" +} - changed
Output schema / requiredPrevious value: -[ - "result" -]New value: +[ + "total_memories", + "by_priority", + "milestones", + "projects" +] - changed
Output schema / titlePrevious value: -"sassy_memory_statsOutput"New value: +"StatsResult"
- Changed
sassy_minify_test4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_minify_testOutput"New value: +"sassy_minify_testDictOutput"
- Added
sassy_offline_commands - Added
sassy_offline_handoff - Added
sassy_offline_status - Changed
sassy_panel4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_panelOutput"New value: +"sassy_panelDictOutput"
- Changed
sassy_persona_full4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_persona_fullOutput"New value: +"sassy_persona_fullDictOutput"
- Changed
sassy_recent_tool_calls4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_recent_tool_callsOutput"New value: +"sassy_recent_tool_callsDictOutput"
- Changed
sassy_screen_info4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_screen_infoOutput"New value: +"sassy_screen_infoDictOutput"
- Changed
sassy_self_check4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_self_checkOutput"New value: +"sassy_self_checkDictOutput"
- Changed
sassy_session_list4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_listOutput"New value: +"sassy_session_listDictOutput"
- Changed
sassy_session_read4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_readOutput"New value: +"sassy_session_readDictOutput"
- Changed
sassy_session_send4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_sendOutput"New value: +"sassy_session_sendDictOutput"
- Changed
sassy_session_start4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_startOutput"New value: +"sassy_session_startDictOutput"
- Changed
sassy_session_stop4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_stopOutput"New value: +"sassy_session_stopDictOutput"
- Changed
sassy_session_stop_all4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_session_stop_allOutput"New value: +"sassy_session_stop_allDictOutput"
- Changed
sassy_setup_check_tools4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_check_toolsOutput"New value: +"sassy_setup_check_toolsDictOutput"
- Changed
sassy_setup_generate_token4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_generate_tokenOutput"New value: +"sassy_setup_generate_tokenDictOutput"
- Changed
sassy_setup_github4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_githubOutput"New value: +"sassy_setup_githubDictOutput"
- Changed
sassy_setup_license4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_licenseOutput"New value: +"sassy_setup_licenseDictOutput"
- Changed
sassy_setup_ssh4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_sshOutput"New value: +"sassy_setup_sshDictOutput"
- Changed
sassy_setup_status4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_statusOutput"New value: +"sassy_setup_statusDictOutput"
- Changed
sassy_setup_tools4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_toolsOutput"New value: +"sassy_setup_toolsDictOutput"
- Changed
sassy_setup_wizard4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_setup_wizardOutput"New value: +"sassy_setup_wizardDictOutput"
- Changed
sassy_state_get4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_state_getOutput"New value: +"sassy_state_getDictOutput"
- Changed
sassy_tar4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_tarOutput"New value: +"sassy_tarDictOutput"
- Changed
sassy_toast4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_toastOutput"New value: +"sassy_toastDictOutput"
- Changed
sassy_tool_catalog4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_tool_catalogOutput"New value: +"sassy_tool_catalogDictOutput"
- Changed
sassy_tool_group_toggle4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_tool_group_toggleOutput"New value: +"sassy_tool_group_toggleDictOutput"
- Changed
sassy_tool_groups4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_tool_groupsOutput"New value: +"sassy_tool_groupsDictOutput"
- Changed
sassy_tool_usage4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_tool_usageOutput"New value: +"sassy_tool_usageDictOutput"
- Changed
sassy_untar4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_untarOutput"New value: +"sassy_untarDictOutput"
- Changed
sassy_unzip4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_unzipOutput"New value: +"sassy_unzipDictOutput"
- Changed
sassy_zip4 fields changed- added
Output schema / additionalPropertiesAdded value: +true - removed
Output schema / propertiesRemoved value: -{ - "result": { - "title": "Result", - "type": "string" - } -} - removed
Output schema / requiredRemoved value: -[ - "result" -] - changed
Output schema / titlePrevious value: -"sassy_zipOutput"New value: +"sassy_zipDictOutput"
97 tool updates
v0.1.0- First observed
sassy_audit_clear - First observed
sassy_audit_false_positives - First observed
sassy_audit_log - First observed
sassy_audit_search - First observed
sassy_click - First observed
sassy_context_estimate - First observed
sassy_copy - First observed
sassy_desktop_state - First observed
sassy_diff - First observed
sassy_edit_block - First observed
sassy_edit_multi - First observed
sassy_env_get - First observed
sassy_env_list - First observed
sassy_env_set - First observed
sassy_file_info - First observed
sassy_get_config - First observed
sassy_ghq_get - First observed
sassy_ghq_issue - First observed
sassy_ghq_issues - First observed
sassy_ghq_pr - First observed
sassy_ghq_protect - First observed
sassy_ghq_push - First observed
sassy_hooks_activate - First observed
sassy_hooks_deactivate - First observed
sassy_hooks_list - First observed
sassy_hooks_suggest - First observed
sassy_hotkey - First observed
sassy_http - First observed
sassy_http_ping - First observed
sassy_list_dir - First observed
sassy_memory_context - First observed
sassy_memory_forget - First observed
sassy_memory_handoff - First observed
sassy_memory_log - First observed
sassy_memory_milestones - First observed
sassy_memory_recall - First observed
sassy_memory_remember - First observed
sassy_memory_search - First observed
sassy_memory_stats - First observed
sassy_minify_test - First observed
sassy_mkdir - First observed
sassy_move - First observed
sassy_observability_health - First observed
sassy_observability_metrics - First observed
sassy_observability_tool_stats - First observed
sassy_panel - First observed
sassy_permission - First observed
sassy_persona_capabilities - First observed
sassy_persona_context - First observed
sassy_persona_decisions - First observed
sassy_persona_full - First observed
sassy_persona_observability - First observed
sassy_persona_practices - First observed
sassy_persona_style - First observed
sassy_read_file - First observed
sassy_read_multiple - First observed
sassy_recent_tool_calls - First observed
sassy_safe_delete - First observed
sassy_screen_info - First observed
sassy_screenshot - First observed
sassy_search_files - First observed
sassy_self_check - First observed
sassy_session_list - First observed
sassy_session_read - First observed
sassy_session_send - First observed
sassy_session_start - First observed
sassy_session_stop - First observed
sassy_session_stop_all - First observed
sassy_set_config - First observed
sassy_setup_check_tools - First observed
sassy_setup_generate_token - First observed
sassy_setup_github - First observed
sassy_setup_license - First observed
sassy_setup_ssh - First observed
sassy_setup_status - First observed
sassy_setup_tools - First observed
sassy_setup_wizard - First observed
sassy_shell - First observed
sassy_shell_confirm - First observed
sassy_state_clear - First observed
sassy_state_get - First observed
sassy_state_set - First observed
sassy_tar - First observed
sassy_toast - First observed
sassy_tool_catalog - First observed
sassy_tool_group_toggle - First observed
sassy_tool_groups - First observed
sassy_tool_usage - First observed
sassy_type_text - First observed
sassy_untar - First observed
sassy_unzip - First observed
sassy_update_apply - First observed
sassy_update_changelog - First observed
sassy_update_check - First observed
sassy_update_list - First observed
sassy_write_file - First observed
sassy_zip
TDQS
Scored across 101 tools
Many tools are clearly distinct, but there is heavy overlap among observability/audit/meta tools (sassy_audit_log vs sassy_recent_tool_calls vs sassy_observability_health/metrics/tool_stats vs sassy_tool_usage) and between the ghq_* quick GitHub tools and the referenced gh_* full variants. An agent would struggle to pick the right one without reading deep into descriptions, and several pairs intentionally duplicate each other.
All tools share the sassy_ prefix and snake_case, and most follow a domain_verb pattern (sassy_memory_remember, sassy_session_stop). A few bare-noun tools (sassy_shell, sassy_http, sassy_toast) and inconsistent verb placement (sassy_self_check vs sassy_setup_check_tools) break the pattern slightly, but overall it is predictable.
101 tools is far beyond the well-scoped range and at the extreme end even for a general-purpose assistant server. The set tries to cover file ops, shell, desktop, GitHub, memory, persona, observability, setup, updates, and networking, but the sheer count forces heavy context consumption and makes pruning a recurring concern.
Within each domain there are basic lifecycles (file read/write/edit/delete, memory write/read/search/forget), but obvious gaps remain: the GitHub quick set has no update/delete/comment or PR listing/merging, and many descriptions point to tools that are not in the registered set (sassy_gh_*, sassy_screen_*, sassy_phone_*, sassy_crosslink_recv). Agents following those references will hit dead ends, so coverage is not self-contained.
Maintenance
Related MCP Connectors
8 MCP servers, 104+ tools: memory, social, PDF, email, images, calendar, scheduler, files.
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Self-hosted MCP server: 26 deterministic dev, security, and EVM tools.
Related MCP Servers
- FlicenseNot gradedqualityNot gradedmaintenanceA feature-rich Model Context Protocol server built with FastMCP that provides various tools including basic utilities, network services, file operations, encryption tools, and system information functions.1-
- AlicenseNot gradedqualityDmaintenanceA lightweight Windows-native MCP server providing a consolidated suite of 14 tools for shell execution, file operations, and interactive process management. It optimizes efficiency through batch file operations and smart process handling to minimize context window overhead.9 npm5MIT
- FlicenseNot gradedqualityCmaintenanceA production-ready, modular MCP server with 40+ tools across 8 categories, featuring dynamic auto-loading and sandboxed security for file system, database, and network operations.-
- FlicenseNot gradedqualityDmaintenanceA powerful filesystem MCP server for AI agents with extensive system access, including filesystem operations, shell execution, Windows tools, reverse engineering, code intelligence, and agent orchestration.1-