Dialtone Watcher
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., "@Dialtone Watcherwhat's running at startup that I didn't install?"
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.
Dialtone Watcher
Local, offline computer-activity inspection through a stdio MCP server. Python 3.11+ · macOS / Windows / Linux · version 0.1.0 · MIT
1. What it is and is not
Dialtone Watcher helps answer “What is my computer doing that I did not ask for?” It collects visible process, connection and automatic-launch metadata, then lets an MCP client explain local rule matches and sourced process context.
It is read-only toward processes and system settings, and advice-only: it never stops processes, disables services, changes startup settings or removes software. It creates its own local storage at server startup, and an explicit snapshot request appends metadata. It is not an antivirus, endpoint protection product or forensic guarantee. No findings is NOT a safety verdict. Results are heuristics, can be wrong, and cannot detect all malware. Read assessment gaps and visibility notes alongside any finding.
Related MCP server: windows-debug-mcp
2. Install
Use Python 3.11 or newer. CI exercises 3.11 and 3.12 on macOS, Windows and
Ubuntu; the local verification record below separately identifies the Mac's
Python version. Runtime dependencies are the official mcp>=1.30,<2 SDK
(FastMCP API), psutil and PyYAML. No administrator access is needed to function.
From source
macOS or Linux, in a terminal with Git and Python 3.11+:
git clone https://github.com/Abhisheksinha1506/MCP.git dialtone-watcher
cd dialtone-watcher
python3 -m venv .venv
.venv/bin/python -m pip install .
.venv/bin/python -c "import sys; print(sys.executable)"Windows PowerShell, with Git and Python 3.11+ on PATH:
git clone https://github.com/Abhisheksinha1506/MCP.git dialtone-watcher
Set-Location dialtone-watcher
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install .
.\.venv\Scripts\python.exe -c "import sys; print(sys.executable)"The final command prints the absolute interpreter path to paste into the client configuration. Keep the installation/venv at a stable location. No shell activation is required. The Windows shell commands are not executed on this Mac; CI verifies the underlying installation and executable on Windows.
Via pip or pipx from a local wheel
This milestone does not publish to PyPI or create a release tag. Do not
assume an index package with this name is this project's release. Build a local
wheel using section 10, or obtain a wheel from a source you have reviewed.
The expected filename is dialtone_watcher-0.1.0-py3-none-any.whl.
With the venv created above, macOS/Linux:
.venv/bin/python -m pip install ./dist/dialtone_watcher-0.1.0-py3-none-any.whlWindows PowerShell:
.\.venv\Scripts\python.exe -m pip install .\dist\dialtone_watcher-0.1.0-py3-none-any.whlOr, if pipx is installed, on any OS:
pipx install ./dist/dialtone_watcher-0.1.0-py3-none-any.whl
pipx environment --value PIPX_BIN_DIRUse the absolute dialtone-watcher executable in that printed directory
(dialtone-watcher.exe on Windows) with no arguments. pipx itself is a separate
installation tool, not a project dependency. macOS pip/pipx verification and
any unverified command paths are recorded in section 10. Package installation
and dependency downloads may use the internet; server operation stays offline.
3. Connect to a client
Claude Desktop
Open Settings → Developer → Edit Config in the installed app, merge the
mcpServers entry below into its JSON, then fully quit and reopen the client.
Preserve other server entries. Use a real absolute path; ~, %VARIABLE% and
relative paths in the command string are not shell-expanded by this server.
OS | Config file location |
macOS |
|
Windows |
|
Linux | Use Edit Config to locate the actual file. |
macOS/Windows locations follow the MCP Desktop quickstart. Anthropic now lists a Linux beta; its installed GUI/config location has not been tested here. Desktop host support and its own OS requirements are separate from this server's collector tests.
Replace these example installation paths with the interpreter printed during installation. The module and arguments are checked against the actual entry point and exercised by the installed-wheel test on each CI OS.
macOS:
{
"mcpServers": {
"dialtone-watcher": {
"command": "/Applications/dialtone-watcher/.venv/bin/python",
"args": ["-m", "dialtone_watcher.server"]
}
}
}Windows:
{
"mcpServers": {
"dialtone-watcher": {
"command": "C:\\Tools\\dialtone-watcher\\.venv\\Scripts\\python.exe",
"args": ["-m", "dialtone_watcher.server"]
}
}
}Linux:
{
"mcpServers": {
"dialtone-watcher": {
"command": "/opt/dialtone-watcher/.venv/bin/python",
"args": ["-m", "dialtone_watcher.server"]
}
}
}For pipx, replace command with its absolute console executable and use
"args": []. dialtone-watcher and python -m dialtone_watcher.server both
start the same stdio server. There are no server command-line flags, port or
API key. A terminal launch waits for MCP protocol input; it is not an interactive
command and does not print a banner or respond to --help.
Claude Code
From the project where you want the client configuration, replace the absolute interpreter placeholder. This writes Claude Code project configuration, not system settings or a server snapshot:
claude mcp add --scope project --transport stdio dialtone-watcher -- "/absolute/path/to/.venv/bin/python" -m dialtone_watcher.server
claude mcp get dialtone-watcherThe syntax follows Claude Code's local stdio documentation
and is checked with the installed CLI in a temporary project; see verification
status below. On Windows substitute the absolute Scripts\python.exe path.
Project-scoped configurations need client approval. If get reports Pending
approval, open Claude Code and review/approve that project configuration before
use; the verification did not grant that approval automatically.
For a first conversation, ask the client to check permissions, take a snapshot,
then explain its findings and assessment gaps. Tool invocation/approval UI is
controlled by the client; it may transmit returned data to its AI provider.
4. Tools and resources
Responses contain a static data_notice, labeled untrusted_data, and a
budget truncated flag. Machine strings and configuration text are data, never
instructions. Paged fields contain total_count, truncated, and items.
Limits accept integers 1–100. Strings are capped at 512 characters; the response
has a shared string/node budget and a 64 KiB JSON payload cap. Inspect truncation
flags: large results may omit records or later fields. Nothing is inferred from
omission. Unknown snapshot IDs return a fixed error, not a stack trace.
Tool | Parameters | Returns | Writes? |
| None | Snapshot ID; process, connection and startup counts; visibility notes. Collection runs in a worker with a 60-second timeout. | Appends one local snapshot; no system changes. |
|
| Ranked findings, suppressions, allowlist decisions, assessment gaps and visibility caveats. Severity: info, low or medium. | No |
|
| Explicit possible-telemetry matches or connections associated by name with unusual findings; attribution caveats and gaps. | No |
|
| Recorded startup items, sources, enabled/unknown status and visibility notes. | No |
|
| Up to 50 ranked reversible review suggestions, reasons and caveats. Nothing is actually removed. | No |
|
| Observed facts, rule matches, sourced known_info or null, consistency checks and caveats. Defaults to latest snapshot. Detailed collections return up to five items, ten caveats; conflicts withhold generic descriptions. | No |
|
| status not_available; reason peer dataset not enabled. | No |
| None | Current privilege level, known coverage limits and OS-specific guidance. Per-process failures are measured during collection. | No |
All tools are non-destructive and local; only take_snapshot is annotated as
writing. Server startup itself creates the storage directory/table if needed.
A timed-out snapshot is not saved. Python cannot forcibly stop the worker; it
may finish existing read operations afterward, and another collection is refused
until it finishes. Other tools remain available; shutdown can wait for it.
Resource | Returns | Writes? |
| Latest stored snapshot as bounded, redacted JSON, with total counts. | No |
| The rules file loaded when the server started, represented as bounded, redacted JSON. | No |
explain_process performs exact name matching, ignoring case on macOS/Windows
and preserving it on Linux. It compares documented location/signer expectations
against recorded facts. matches is metadata consistency, not proof of identity;
missing evidence is not_checkable, and any conflicting instance makes the
summary mismatch. With neither knowledge nor rule matches, it returns
“no information available” plus observed facts and a vendor/signature-check
suggestion. Knowledge never changes finding severity or core allowlist logic.
5. Permissions guide
The server never needs elevated privileges to function. It returns partial
results with limits and guidance. Understand the implications before elevating:
you give the interpreter, dependencies and client-started server greater access.
Use only a trusted installation, start without elevation, and inspect
check_permissions and snapshot visibility notes first. The server never grants
permissions, elevates itself or changes OS policy. Elevation cannot recover
exited processes or bypass every protection.
OS | Ordinary-account visibility and limits | Optional broader access |
macOS | Visible process metadata and selected startup plists; protected processes and many per-process connections can deny access. Login items and /System startup definitions are not inspected. | Manually launch a trusted local environment with sudo only if you understand the wider access. Full Disk Access for the actual host/interpreter may help protected startup-file reads, not guarantee connection visibility. Review System Settings → Privacy & Security → Full Disk Access; this tool does not request it automatically. |
Windows | Visible processes, Run/RunOnce keys, Startup folder entries, selected scheduled tasks and automatic services; protected processes/keys/tasks may be hidden. | Manually launch a trusted terminal/client with Run as administrator. Some protected processes remain inaccessible. PowerShell execution policy is never bypassed. |
Linux | Visible /proc process/connection metadata, local package ownership, current-user/system startup configuration; other accounts can be hidden. | Manually launch a trusted environment with sudo for broader visibility. Root can still be limited by namespaces, security policy or /proc hidepid. Ask an administrator to review hidepid policy; the server never remounts /proc. Run inside the desktop login session for user systemd visibility. |
A client already running without elevation does not become elevated because an unrelated terminal was elevated. These optional manual procedures are not executed by verification, and elevated launches are not recommended as a routine client configuration. Missing OS tools must be installed separately.
6. Privacy and storage
What is collected
The tables below are generated from dialtone_watcher/schema.py and checked in
CI. Snapshot, Process, Connection and StartupItem are stored metadata; Finding is
derived analysis returned by tools, not a separately stored table. Process CPU
values are nonblocking first samples and may be zero. Memory is in MiB (bytes
per 1024²), executable hashes are SHA-256, and timestamps are UTC strings.
Connections are attributed by process name, not a durable process-instance ID.
Startup metadata describes configuration, not proof of current execution.
Snapshot
Field | Python type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Process
Field | Python type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Connection
Field | Python type |
|
|
|
|
|
|
|
|
|
|
StartupItem
Field | Python type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Finding
Field | Python type |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Where it is stored
SQLite stores redacted snapshot JSON in snapshots(id, created_at, payload).
The hostname is stored only as a stable SHA-256 hash (pseudonymization, not
anonymity). Startup initializes storage, and each successful explicit
take_snapshot appends one row. No update, replace, per-snapshot deletion or
automatic retention API exists. Findings are computed from stored snapshots;
the plain Python collector alone does not persist them.
OS | Default database |
macOS |
|
Windows |
|
Linux |
|
DIALTONE_WATCHER_DB overrides this with a local file path. Keep it in a private
directory. Stderr logs can contain private exception diagnostics and are kept
by the host/client according to its settings; redact them before sharing.
Redaction, exclusions and network behavior
Home prefixes /Users/<account>, /home/<account>, /root, and case-insensitive
Windows drive/Users paths become ~. UNC paths become [network path]. The
current account name is masked in text (the public root privilege value is
preserved). Sensitive account/argument/content field keys are dropped. Unknown
input fields are removed by normalization. Tool/resource outputs also strip
controls and apply size limits. Redaction cannot identify every arbitrary
account name in free text; collectors avoid collecting account fields. Paths
outside home directories, executable names, destination IPs/domains and the
pseudonymous hostname hash remain potentially identifying metadata.
Never collected or returned as snapshot fields: usernames/UIDs/GIDs, full home prefixes, raw hostname, command-line arguments, file contents, packet payloads, browsing history or environment-variable dumps. Hashing reads executable bytes in chunks but stores only a digest, with a 200 MiB per-file bound and snapshot inspection budgets. Startup configuration and signature/package metadata are read only to extract permitted fields; their raw contents/diagnostics are not stored in snapshots. Local rules and knowledge files are explicit configuration data.
The v1 server makes no external network calls: no DNS resolution, HTTP requests, uploads, telemetry submission or peer lookup. It reads locally available destination names only; many connections therefore have no domain. OS trust checks are constrained for offline use as described below. Package installation, build dependency downloads and CI can use networks. The MCP/AI client has its own storage/network policy and may send the returned metadata to its configured provider; review that policy before connecting.
How to delete stored snapshots (manual; destructive)
There is no deletion tool. To intentionally clear all stored history, first
stop every server using that database by quitting/disconnecting its MCP clients.
Confirm the configured path, including any DIALTONE_WATCHER_DB override. Using
Finder/File Explorer or your local file manager, remove that snapshots.sqlite3
file and any same-database -journal, -wal or -shm sidecars after all
connections are closed. Do not remove unrelated files. The server creates an
empty database next time it starts. Moving the database aside is a reversible
alternative; removing it is destructive. Backups, client chat histories and
client logs are separate copies. Verification never deletes a user database.
7. Limitations
Unknown trust is neutral. Publisher strings and expected locations do not establish executable identity. Unsigned alone produces no finding; explicit matches and defined combinations of signals can still be false positives.
Permissions, exited processes, /proc hidepid, namespaces, tool failures, timeouts, file-size limits and inspection budgets leave gaps. Completely invisible processes cannot be counted. Multiple instances sharing a name make connection attribution uncertain. No output establishes complete coverage.
Starter data is small: 43 rules (including core/context entries) and 41 knowledge entries; the bloatware and ignore sections start empty. Entries need human review. Missing a process/domain is not an endorsement.
macOS uses codesign plus Gatekeeper inside a network/service-denying sandbox-exec wrapper. Gatekeeper can fail under that offline restriction; missing tools or unavailable checks remain unknown. A publisher alone is not verified trust. Only explicit unsigned output becomes unsigned.
Windows Authenticode uses batched PowerShell JSON with timeouts. Checks are skipped as OfflineRequired unless all non-loopback adapters are down, avoiding certificate network retrieval. The server never disables adapters for you; ordinary connected machines often retain unknown trust.
Linux has no standard signing check here: local dpkg/rpm/pacman package ownership supplies package_owned provenance. Unowned executables remain unknown and get a visibility note, not a finding merely for being unowned.
Startup coverage is selective: macOS excludes login items and /System startup definitions; Windows does not resolve shortcut targets or inspect StartupApproved overrides/other accounts; Linux covers enabled system/user units, XDG autostart and selected cron configuration, including recurring jobs.
There is no peer dataset, remote reputation service, automatic remediation or ability to detect all malware. See the threat model.
8. Rules and knowledge files
Both starter datasets need human review before relying on them. Sources are recorded below and in source_note; they are not fetched at runtime. Source check date for rules: 2026-10-26; knowledge: 2026-10-27.
The checkout keeps data/rules.yaml and data/knowledge.yaml. Wheels install
them under <venv>/share/dialtone-watcher/; distribution file metadata also
identifies the actual installed paths. There is no CLI flag, environment variable
or MCP tool to select alternate files. For an editable development install edit the checkout's files. A normal
pip install . from source is also a non-editable wheel installation: edit its
installed data files, as with wheel/pipx installs, after making a local copy. Upgrades may replace them. Restart the server
after editing rules; knowledge is loaded and validated on each explain call.
Rules have five sections: known_telemetry_domains, known_bloatware,
trusted_publishers, core_os_allowlist and ignore_list. Each rule requires id,
match, reason, confidence (high/medium/low), and platforms (OS list or all).
Optional fields: severity (info/low/medium) and source_note. Add a unique ID and
reviewed provenance, an exact/glob/restricted-regex process name, publisher or
path predicate; startup label/name/path; exact/suffix domain; or a finding
rule_id/subject suppression. Predicates within a rule combine with AND. Destination rules may also require
process_name: {exact: Code} or process_name: {one_of: [Code, code, Code.exe]}.
one_of accepts 1–16 exact process names; names are case-sensitive on Linux and
case-insensitive on Windows/macOS. Both the domain and process must match.
A process name is only a scope restriction, not proof of application identity.
The existing Firefox rule now also requires a Firefox process name.
known_bloatware is empty. No preinstalled-software classifications were added.
This expansion adds 30 entries: 29 exact Windows-only community domains and one
VS Code crash-reporting endpoint across all three platforms. Community entries
are low confidence and informational, including potential false positives;
listing is not vendor confirmation. Vendor crash reporting also stays informational.
The WindowsSpyBlocker source is pinned to its 2022 list and may be stale.
Homebrew was reviewed but omitted because its connector is generic curl, which
this snapshot cannot attribute reliably. No new Win32 entries were justified.
Steven Black's list was not used. The 13 retained baseline entries keep their
original provenance; no new claims were drawn from their sources in this pass.
THIRD_PARTY_NOTICES includes Microsoft documentation's CC BY 3.0 US notice and complete license text, and WindowsSpyBlocker's MIT text. Both are redistributed with the wheel and source archive. Endpoint mappings were selected and adapted into local rules; no source is fetched at runtime. All starter entries need human review before relying on them.
For example, this documentation-only fragment illustrates a user opt-out under ignore_list; it is not added to the shipped rules:
- id: local.ignore-reviewed-entry
match:
target: finding
rule_id: {exact: mozilla.firefox.telemetry}
reason: I reviewed this app setting and prefer to suppress this rule.
confidence: high
platforms: all
source_note: Local user decision; review again if the app configuration changes.Suppressions remain visible. The core allowlist requires a name AND expected location or publisher and wins before findings. Known core names in unexpected locations can produce unusual identity-review findings. Low confidence caps severity at info; medium caps it at low; high can reach medium. Unknown trust is neutral and never raises severity. Trusted publishers are context only.
Knowledge uses an entries list. Required fields: id, names, platforms, description (plain-language purpose), publisher (nullable exact signer text), category, usually_safe_to_ignore (boolean or depends), confidence, source_note and last_reviewed (ISO date). Optional expected_locations contain whole-path patterns. Categories are os_core, driver, updater, browser, cloud_sync, security, developer_tool and other. A name can have different entries per platform; same- platform ambiguity, missing/unknown fields, invalid dates/categories and empty descriptions are rejected. Restricted security wording requires a security-tool entry; descriptions cannot give a safe verdict. Conflicts with observed metadata withhold descriptions; below-high confidence is explicitly stated in output.
Paths/names ignore case on macOS/Windows and preserve it on Linux. Windows path separators normalize; domains normalize case/IDNA and suffixes respect label boundaries. Rule regexes use a restricted, precompiled subset: no groups, alternation, backreferences, lookarounds or brace repetition, and at most one quantified atom. Matching length limits apply. Use redacted home paths in patterns. Adding configuration cannot establish file identity. Validate custom files locally before use:
.venv/bin/python -c "from dialtone_watcher.rules import load_rules; from dialtone_watcher.knowledge import load_knowledge; print(len(load_rules('data/rules.yaml').rules), len(load_knowledge('data/knowledge.yaml').entries))"On Windows use .\.venv\Scripts\python.exe for that interpreter; the Python
expression is identical and platform-independent. Full matcher behavior and
validation examples are covered by the unit tests.
Rule ID | Source and justification | Review status |
mozilla.firefox.telemetry | Mozilla explicitly lists incoming.telemetry.mozilla.org under Telemetry. Applies to all three Firefox desktop platforms; consent remains unknown. | needs human review |
core.macos.launchd | Apple's launchd manual source identifies the daemon manager; local read-only codesign inspection verified the /sbin/launchd path. | needs human review |
core.macos.kernel-task | Apple identifies kernel_task as a system process. The blank executable is a limited kernel-context representation. | needs human review |
core.linux.systemd-usr | The upstream systemd manual names /usr/lib/systemd/systemd. | needs human review |
core.linux.systemd-lib | Debian bookworm's systemd file list documents /lib/systemd/systemd. | needs human review |
core.linux.init | The upstream systemd manual describes /sbin/init as the boot entry point. | needs human review |
core.windows.system | Microsoft includes System among its critical system services. Blank executable metadata does not verify identity. | needs human review |
core.windows.svchost-system32 | Microsoft's service-host discussion identifies system32 and SysWOW64 locations. The rule covers standard Windows installation directories. | needs human review |
core.windows.svchost-wow64 | The same Microsoft source documents the SysWOW64 variant. | needs human review |
core.windows.csrss | Microsoft's protocol exclusion example supplies the system32/csrss.exe path. | needs human review |
core.windows.explorer | Microsoft's Sysinternals reference sample uses c:/windows/explorer.exe. This is a standard-layout policy. | needs human review |
publisher.microsoft-windows | The same Sysinternals sample documents the Microsoft Windows signer CN; used only as context. | needs human review |
publisher.systemd-package | Debian's systemd package description identifies the system/service manager package; used only as provenance context. | needs human review |
| wsb.alpha.telemetry.microsoft.com | Community Hosts spy rules, exact alpha.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.ca.telemetry.microsoft.com | Community Hosts spy rules, exact ca.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.df.telemetry.microsoft.com | Community Hosts spy rules, exact df.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.oca.telemetry.microsoft.com | Community Hosts spy rules, exact oca.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.oca.telemetry.microsoft.us | Community Hosts spy rules, exact oca.telemetry.microsoft.us row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.reports.wes.df.telemetry.microsoft.com | Community Hosts spy rules, exact reports.wes.df.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.services.wes.df.telemetry.microsoft.com | Community Hosts spy rules, exact services.wes.df.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.sqm.df.telemetry.microsoft.com | Community Hosts spy rules, exact sqm.df.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.sqm.telemetry.microsoft.com | Community Hosts spy rules, exact sqm.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.sqm.telemetry.microsoft.com.nsatc.net | Community Hosts spy rules, exact sqm.telemetry.microsoft.com.nsatc.net row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.telecommand.telemetry.microsoft.com | Community Hosts spy rules, exact telecommand.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.telemetry.appex.bing.net | Community Hosts spy rules, exact telemetry.appex.bing.net row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.telemetry.microsoft.com | Community Hosts spy rules, exact telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.telemetry.remoteapp.windowsazure.com | Community Hosts spy rules, exact telemetry.remoteapp.windowsazure.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.telemetry.urs.microsoft.com | Community Hosts spy rules, exact telemetry.urs.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.umwatsonc.telemetry.microsoft.us | Community Hosts spy rules, exact umwatsonc.telemetry.microsoft.us row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.watson.ppe.telemetry.microsoft.com | Community Hosts spy rules, exact watson.ppe.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.watson.telemetry.microsoft.com | Community Hosts spy rules, exact watson.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.wes.df.telemetry.microsoft.com | Community Hosts spy rules, exact wes.df.telemetry.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.kmwatson.events.data.microsoft.com | Community Hosts spy rules, exact kmwatson.events.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.kmwatsonc.events.data.microsoft.com | Community Hosts spy rules, exact kmwatsonc.events.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.nw-umwatson.events.data.microsoft.com | Community Hosts spy rules, exact nw-umwatson.events.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.umwatson.events.data.microsoft.com | Community Hosts spy rules, exact umwatson.events.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.umwatsonc.events.data.microsoft.com | Community Hosts spy rules, exact umwatsonc.events.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.v10.vortex-win.data.microsoft.com | Community Hosts spy rules, exact v10.vortex-win.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.v20.vortex-win.data.microsoft.com | Community Hosts spy rules, exact v20.vortex-win.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.vortex.data.microsoft.com | Community Hosts spy rules, exact vortex.data.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.browser.pipe.aria.microsoft.com | Community Hosts spy rules, exact browser.pipe.aria.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| wsb.mobile.pipe.aria.microsoft.com | Community Hosts spy rules, exact mobile.pipe.aria.microsoft.com row; MIT; low confidence, info; Windows only. | needs human review |
| vscode.crash-reporting | Vendor Network Connections in Visual Studio Code, Common hostnames / rink.hockeyapp.net crash-reporting row; CC BY 3.0 US; medium confidence, info; process-scoped. | needs human review |
9. Troubleshooting
Symptom | Check |
Server not appearing | Use an absolute executable path from the correct venv/pipx installation, valid JSON and the correct Edit Config file. Fully restart the client. Read its local stderr logs; do not share them unredacted. |
Stdio/protocol errors | stdout is protocol-only. Do not wrap the server with shell banners, print debugging or a command that expects interactive input. Application logs go to stderr. Both console and module launches are exercised through a real SDK client. |
Empty network results | Inspect visibility notes and assessment gaps. Per-process access often requires broader privileges; no rows does not imply no activity. Missing locally known domains also limit domain rules; no DNS is attempted. |
Slow first snapshot | Hashing, signature/package queries and startup enumeration can take seconds. Executable caching/budgets reduce repeated work. Collection has a 60-second deadline; no late result is saved, but a timed-out worker may still be finishing. Retry after it finishes. |
Unknown trust / no description | Offline signature constraints, missing tools and small datasets are normal limits. No information available is deliberate; consult the vendor or file signature/package provenance. |
10. Development and verification
From a Git checkout, macOS/Linux:
.venv/bin/python -m pip install -e ".[test]"
.venv/bin/python -m pytest -q
.venv/bin/python scripts/document_schema.py --check
.venv/bin/python scripts/check_release.py --output-dir distWindows PowerShell uses .\.venv\Scripts\python.exe in place of
.venv/bin/python; the test/generator/build-check arguments are identical.
Regenerate the field tables after a schema change, then review the diff:
.venv/bin/python scripts/document_schema.pyThe release check needs Git and intentionally tracked/staged source files. It uses the existing setuptools build backend, creates an sdist and wheel, rebuilds the wheel from that sdist, installs into a clean venv, and runs both stdio entry points outside the checkout. It verifies imports come from that venv, both bundled YAML files, the license, eight tools, two resources and synthetic explain/findings calls. It does not collect a real snapshot, publish packages, tag a release or delete databases. It retains temporary workspaces/synthetic databases and writes only the two verified artifacts to dist. Select a new --output-dir if distributions already exist there. New release files must be tracked/staged first; private/untracked files are excluded from the build copy. Dependency provisioning may use the network. CI calls this same check on all three OSes and both Python versions; see the verification record for status.
CI has a full pytest matrix on ubuntu-latest, macos-latest and windows-latest, Python 3.11/3.12, plus the wheel-install matrix above. A separate Ubuntu job runs Linux integration in Debian/dpkg, Fedora/rpm and Arch/pacman containers with runtime networking disabled. All three distro families passed the milestone 7 CI run, including Fedora and Arch; they were not run locally on this Mac. Container checks have few processes and no full desktop/systemd session and do not demonstrate full-desktop coverage. Earlier milestone failures are not current support evidence. The new release-check status appears below.
Contribute small, reviewable changes and fixture-based tests; preserve offline operation, untrusted-data labels, redaction and protocol-only stdout. Update schema documentation and tool tables with API changes. Add no unsupported rule or knowledge claims. See SECURITY.md for sensitive reports, CHANGELOG.md for 0.1.0 scope and LICENSE for MIT terms. Runtime logic, tools, rules and knowledge entries are unchanged in this milestone.
Command and platform verification record
Checked on 2026-10-27, using Python 3.13 on this Mac, in temporary candidate checkouts/venvs. Source and original-wheel installs used separate fresh venvs; pipx used a separate temporary pipx installation/home. The source clone was updated with the candidate working files before testing. Personal client configuration and user databases were not changed.
Command or example | Observed result |
Git clone and source-directory selection | Passed; public repository cloned in a temporary directory. |
python3 venv creation; pip install .; print interpreter path | Passed on Mac; non-editable source installation. |
pip install local 0.1.0 wheel | Passed in a separate clean venv; installed imports/resources checked outside the checkout. |
pipx install local wheel; pipx environment --value PIPX_BIN_DIR | Passed on Mac; installed console/module, bundled data and MCP calls passed. |
pip install -e .[test]; pytest -q | 335 passed, 2 platform skips, fresh candidate checkout; no plugin flags. |
document_schema.py and --check; explicit rules/knowledge validation expression | Passed; schema and both datasets validate. |
check_release.py --output-dir dist | Passed: wheel + sdist, sdist rebuild, clean install, two entry points, two YAML files, eight tools and two resources. An initial helper argument-state error was fixed before the successful rerun. |
Claude Desktop JSON templates | Parsed and checked against the real module entry point; substituted actual installed paths launched through the SDK. Native Desktop GUI loading was not verified on any OS. |
claude mcp add / claude mcp get | Both exit 0 in an isolated project/config directory. Get reports Pending approval; Claude Code tool execution remains unverified until the user approves. |
Windows PowerShell / Linux shell snippets | Not executed natively on this Mac. CI verifies Python packaging/entry points on these OSes; it does not prove their native Desktop GUI setup or PowerShell copy/paste flow. |
Linux Desktop config file location | Unverified for the official beta; use the app's Edit Config. Community convention is labeled in section 3. |
sudo, Administrator, Full Disk Access, database deletion | Manual guidance only; deliberately not performed. No destructive cleanup command is offered or tested. |
The milestone 7 CI run proved the prior pytest matrix and Debian/Fedora/Arch checks. The milestone 8 candidate CI run passed all 13 jobs: six pytest jobs, six wheel/sdist clean-install jobs (macOS, Windows and Ubuntu on Python 3.11/3.12), and the Debian/Fedora/Arch container integration job. The final commit has the same code and tests; this verification link was recorded after the candidate completed. No PyPI publication or release tag was created.
Available Tools
8 toolscheck_permissionsARead-onlyIdempotent
Check current privilege level and collector coverage without collecting a snapshot. Includes OS-specific guidance; elevation never guarantees complete visibility.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely new context: it reports OS-specific guidance and warns that elevation never guarantees complete visibility, setting expectations for the result.
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 tight sentences with the primary action front-loaded and the caveat trailing. No filler, though 'Includes OS-specific guidance' is a slightly vague add-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?
With no parameters and no output schema, the description carries the burden of describing what comes back, and it does so at a high level (privilege level, collector coverage, OS-specific guidance). It stops short of describing the shape of the response, which is a minor gap for a zero-arg 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 takes zero parameters and the schema is empty, so there is nothing for the description to disambiguate. Baseline of 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 and two concrete resources: current privilege level and collector coverage. The phrase 'without collecting a snapshot' implicitly separates it from take_snapshot, though 'collector coverage' itself is left undefined.
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 negation 'without collecting a snapshot' hints that this is the lightweight pre-check before take_snapshot, but the usage relationship is only implied, with no explicit when-to-use or when-not-to-use statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_to_peersARead-onlyIdempotent
Report that peer comparison is unavailable. No peer dataset or remote service is enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds the key fact the annotations cannot convey: the tool is a stub that will always report unavailability because no peer dataset or remote service exists, which prevents the agent from expecting results. It stops short of stating the exact response shape.
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 short sentences, both load-bearing, with the unavailable outcome front-loaded. Nothing is padded or repeated from structured fields.
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 stub with read-only annotations and no output schema, the description gives enough for an agent to know the call is a no-op reporting unavailability. The only gap is the undocumented snapshot_id, which is minor given the tool returns nothing useful.
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 is one parameter (snapshot_id) and schema description coverage is 0%, so the description carries the full burden — yet it never mentions the parameter at all. The agent must infer that snapshot_id comes from take_snapshot and what an invalid or missing value would do.
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 reports that peer comparison is unavailable, which is an unusual but unambiguous purpose. No sibling in the list performs peer comparison, so the agent can differentiate it from take_snapshot, list_findings, and the rest without opening any 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 clause 'No peer dataset or remote service is enabled' implies the tool should not be relied on for actual data, which is useful implied guidance. However, it never states when an agent should call this versus simply skipping peer analysis, and no alternative tool or condition is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_processARead-onlyIdempotent
Explain an exact process name using saved facts, local rule matches and sourced offline context. Omit snapshot_id for the latest snapshot. Compare documented location and publisher expectations; name matches alone never establish identity.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| snapshot_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/offline, so the safety profile is covered. The description adds genuine behavioral value the annotations don't: the data sources it reasons over, the default-to-latest-snapshot behavior, and the important caveat that 'name matches alone never establish identity' — warning the agent against over-trusting the output.
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 tight sentences: purpose first, then snapshot usage, then the identity caveat. Nothing is wasted, though the third sentence is somewhat dense and could be split for readability.
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, two-parameter tool with no output schema, the description supplies the key missing context: where the data comes from, how snapshot selection works, and how to interpret name-based results. It doesn't describe return shape, but as an 'explain' tool the content is largely implied.
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 load, and it does: 'name' is qualified as an *exact* process name (with the identity caveat), and snapshot_id's default semantics ('omit for latest') are spelled out. Coverage is nearly complete for a 2-param 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?
States a specific verb ('Explain') and a precise resource ('an exact process name'), and enumerates the evidence sources it draws on (saved facts, local rule matches, sourced offline context). This clearly separates it from the list_*/scan siblings, though it never names an alternative tool explicitly.
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?
'Omit snapshot_id for the latest snapshot' gives concrete usage for one parameter, and 'Compare documented location and publisher expectations' hints at the intended analysis. However, it never states when to prefer this over compare_to_peers or list_findings, so selection guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_findingsBRead-onlyIdempotent
Assess a saved snapshot with local rules. Returns findings, visible suppressions, assessment gaps and visibility caveats. Empty findings do not establish safety. limit is 1–100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| snapshot_id | Yes | ||
| min_severity | No | info |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's value-added content is the return surface (findings, suppressions, assessment gaps, visibility caveats) and the key caveat that empty results are not proof of safety — meaningful context with no output schema. It stops short of 5 by not explaining what suppressions or gaps actually represent.
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 short sentences, front-loaded with purpose and packed with non-redundant information; the safety caveat and limit range both earn their place. Slightly dense jargon ('visibility caveats', 'assessment gaps') is the only minor cost.
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, annotation-covered tool with no output schema, the description covers the return surface and a critical interpretation caveat. It remains incomplete on min_severity semantics and on result handling (no mention of pagination or what ordering the limit applies to), which an agent needs to call 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 carry parameter meaning. It only adds the 'limit is 1–100' constraint; snapshot_id's role is merely implied and min_severity — its default, allowed values, and filtering effect — is completely undocumented anywhere.
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 concrete verb and resource ('Assess a saved snapshot with local rules') and names the outputs (findings, suppressions, gaps, caveats). It implicitly distinguishes itself from take_snapshot (this operates on an already-saved snapshot) but never names a sibling explicitly, so it stops short of a 5.
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 phrase 'saved snapshot' implies this runs after take_snapshot, and 'Empty findings do not establish safety' is useful interpretive guidance. But there is no explicit when-to-use/when-not-to-use statement and no routing to alternatives like compare_to_peers or suggest_removals, leaving usage inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_startup_itemsBRead-onlyIdempotent
List recorded automatic-launch metadata from a saved snapshot, including enabled status and source. Unknown status is preserved. limit is 1–100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| snapshot_id | Yes |
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, so the safety profile is covered. The description adds useful behavioral context by noting that unknown status is preserved and that limit is bounded to 1–100. It does not describe ordering, pagination, or return shape, so it adds some value but not rich behavioral detail.
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 short, front-loaded with the core purpose, and avoids unnecessary repetition. The added notes about unknown status and the limit range are relevant, though the phrasing is terse rather than fully polished.
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 list tool with no output schema, the description gives enough context: what is listed, what fields are included, how unknown status is handled, and the limit range. It could be more complete by mentioning snapshot acquisition or pagination, but the essential invocation context is present.
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 adds the important constraint that limit is 1–100 and gives context that snapshot_id refers to a saved snapshot, but it still does not fully explain snapshot_id format or other parameter expectations.
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: listing recorded automatic-launch metadata from a saved snapshot. It also specifies included fields, enabled status and source, making the purpose clear. It does not explicitly distinguish this tool from sibling list tools such as list_findings or list_unusual_destinations, so it stops short of a 5.
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 implies the tool operates on a saved snapshot but gives no explicit guidance on when to use it versus alternatives like list_findings, list_unusual_destinations, or take_snapshot. There are no stated prerequisites or exclusions beyond the snapshot reference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unusual_destinationsBRead-onlyIdempotent
List destinations with explicit possible-telemetry rule matches or connections associated by name with unusual process findings. Missing domains are not assessed; no DNS queries. limit is 1–100.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| snapshot_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: no DNS lookups are performed and unlisted/missing domains are deliberately not assessed, which tells the agent the result set is bounded by static telemetry rules. Return format/pagination is still unstated, keeping it below 5.
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 short sentences with no filler; the selection criteria are front-loaded and the scoping caveats follow. The limit note at the end is compact, though the first sentence is syntactically dense enough to slow parsing.
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 should say more about what each destination entry contains (matched rule, associated process, domain). It also omits the default limit and how snapshot_id is sourced, so while the safety profile is covered by annotations, the agent is left guessing about the shape of results.
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, and it only partially does: it documents the limit range (1–100) but not its default or ordering behavior, and says nothing about what snapshot_id identifies or how to obtain one. That is only half the compensation a 0%-coverage two-parameter schema 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 verb-and-resource pair ("List destinations") and defines the selection criteria: explicit possible-telemetry rule matches or connections associated by name with unusual process findings. It is dense with domain jargon, but an agent can tell what is being returned and that it differs from siblings like list_findings or explain_process.
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 never says when to reach for this tool instead of a sibling such as list_findings or compare_to_peers, and gives no prerequisites beyond the implicit snapshot. The "no DNS queries" and "missing domains are not assessed" lines scope the results but are not usage routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_removalsARead-onlyIdempotent
Return up to 50 severity-ranked review suggestions from findings. Advice is reversible and OS-specific; this tool never removes files, stops processes or changes settings.
| Name | Required | Description | Default |
|---|---|---|---|
| snapshot_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds concrete behavioral context beyond annotations: advice is reversible and OS-specific, and the tool explicitly never removes files, stops processes, or changes settings. This reinforces the non-destructive safety profile and sets clear expectations.
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 tightly written sentences. The purpose is front-loaded, followed immediately by the most important safety caveat, with no wasted text.
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 usefully states the output is up to 50 severity-ranked suggestions and clarifies non-destructive behavior. The main gap is the unexplained snapshot_id parameter.
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 never explains snapshot_id. It says suggestions come 'from findings' but does not clarify that snapshot_id selects the snapshot whose findings are used, leaving the only parameter semantically underspecified.
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 output: return up to 50 severity-ranked review suggestions from findings. It clearly conveys a suggestion-generation tool, though it does not explicitly contrast itself with sibling list_findings.
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 phrase 'from findings' implies this is used after findings exist, but there is no explicit when-to-use guidance or named alternative such as list_findings. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
take_snapshotA
Collect visible processes, connections and startup metadata, then append a local snapshot. May take up to 60 seconds; reports partial visibility. Does not change system settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond the annotations: an up-to-60-second latency, the possibility of partial visibility, and an explicit scope limit ('does not change system settings') that reinforces destructiveHint=false while explaining the append behavior behind readOnlyHint=false. It still doesn't say where the snapshot is stored or whether repeated calls accumulate snapshots, which matters given idempotentHint=false.
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 tight sentences: the first front-loads what is collected and what is produced, the second carries the cost and safety caveats. Nothing is redundant with the annotations 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?
With no output schema and no parameters, the description carries most of the burden and covers duration, partial results, and side-effect scope. It leaves a small gap around what the caller gets back (snapshot identifier? summary counts?) and how repeated invocations behave.
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 baseline is 4; there is no parameter semantics to clarify and the description correctly spends no words on inputs.
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 (collect) plus the exact resources gathered (processes, connections, startup metadata) and the persistence action (append a local snapshot), which separates it from read-only siblings like list_startup_items. It does not name a sibling alternative, so it stops short of a 5.
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 only implied: the agent can infer this is the capture step that precedes analysis tools (list_findings, compare_to_peers), but the description never says when to take a snapshot versus querying the existing lists, nor whether repeated calls are needed. The 60-second cost note is a useful decision signal but not explicit 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.
8 tool updates
v0.1.0- First observed
check_permissions - First observed
compare_to_peers - First observed
explain_process - First observed
list_findings - First observed
list_startup_items - First observed
list_unusual_destinations - First observed
suggest_removals - First observed
take_snapshot
TDQS
Scored across 8 tools
Each tool targets a clearly distinct action or data slice: snapshot collection, findings assessment, unusual destinations, startup items, process explanation, removal suggestions, permission checks, and an explicit peer-comparison stub. list_findings and suggest_removals both derive from findings, but their descriptions clearly separate raw assessment from ranked review advice.
All eight names use snake_case with an imperative verb first (take_, list_, compare_, suggest_, explain_, check_), and the noun phrases clearly identify the target. 'compare_to_peers' is the only verb-preposition-noun form, but it remains predictable and readable.
Eight tools is a reasonable size for a read-only watcher and each name maps to a distinct workflow. compare_to_peers is essentially a nonfunctional stub, so the set is not perfectly lean, but the overall count is well-scoped.
Core read-only workflows are covered: collect a snapshot, assess findings, inspect unusual destinations and startup items, explain a process, suggest removals, and check permissions. Gaps remain around listing saved snapshots or enumerating all visible processes/connections, and peer comparison is explicitly unavailable, which limits the surface.
Maintenance
Related MCP Connectors
Read-only local AI advice, shared reports and website audits. No PC scan or local actions.
Read-only MCP access to a documented IT fleet: state, changes, posture. 15 tools.
Read-only MCP access to authorized Vocci sessions, notes, files, and memory search.
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
Related MCP Servers
- AlicenseCqualityDmaintenanceA local MCP server for the LimaCharlie security platform that provides investigation, administration, and content-review workflows via a broad read-only tool surface with explicit organization scoping and audit logging.100MIT
- AlicenseAqualityDmaintenanceRead-only MCP server for diagnosing Windows crashes, stability, and gaming performance by reading event logs, crash dumps, hardware inventory, performance counters, and registry settings.35MIT
- FlicenseAqualityCmaintenanceEnables observation-only system inspection through MCP, exposing system identity, resources, process summary, and network summary without any mutation or command execution.4-
- AlicenseCqualityCmaintenanceEnables agents to query a local macOS archive of Knowledge and browser history through read-only stdio MCP tools for status, timelines, search, original records/blobs, schemas, bounded SQL, and usage or domain summaries.143MIT