SignalGrid MCP
Click on "Install 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., "@SignalGrid MCPrun a full posture report"
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.
SignalGrid MCP
An MCP (Model Context Protocol) server that exposes macOS-native device trust signals — the facts about a Mac that cannot be gathered from a Linux container or a cloud runner. Every tool is strictly read-only: nothing on the device is ever mutated.
What it answers
Signal | Tool |
Who is this machine? (serial, UUID, chip, activation lock) |
|
What OS build is it on? |
|
Are SIP / FileVault / Gatekeeper / firewall on? |
|
What remote access is exposed? (SSH, Screen Sharing, SMB, ARD) |
|
Is it MDM/DEP enrolled? What profiles are installed? |
|
Is it patched? Are auto-updates on? |
|
Are XProtect / MRT malware definitions current? |
|
What got installed, and when? |
|
DNS, proxies, VPNs, interfaces |
|
What's listening on the network? |
|
What persists across reboots? (launchd items) |
|
Any third-party kernel extensions? |
|
Any stranded/conflicting system extensions? |
|
Who has accounts? Who is admin? |
|
What apps are installed, and who signed them? |
|
What's running right now? |
|
Is removable storage (a data-egress channel) connected? |
|
Does the device auto-lock when left idle? (walk-up risk) |
|
Is this app properly signed & notarized? |
|
Everything above the fold, in one call |
|
The SignalGrid decision for this Mac (allow / step-up / restrict / deny) |
|
The aggregate report is also exposed as an MCP resource at signalgrid://posture.
Call signalgrid_posture_report with include_verdict: true to get the raw facts
and the folded allow/step-up/restrict/deny decision in one round-trip (the same
fail-safe computation as signalgrid_trust_verdict).
Related MCP server: apple-log-mcp
Design principles
Read-only, always. Every tool carries
readOnlyHint: true,destructiveHint: false. No command mutates state.Unknown ≠ off. Posture checks distinguish "the check ran and said X" from "the check could not run" (missing binary, timeout, needs elevation).
enabled: nullalways means unknown — investigate, don't grade.No shell, no injection. Every command is an argv list executed without a shell; user input is never interpolated into a command line.
Context-efficient. Large inventories (apps, processes, launch items, install history, listeners) are paginated (
limit/offset, standardtotal/has_more/next_offsetenvelope), filterable (name_contains), and render as a compact markdown table by default or JSON on request.Degrades gracefully. On a non-macOS host, or when a probe needs elevation, tools return structured error/unknown text — they never crash.
How these signals reach the Grid (sourcing)
SignalGrid's decision fabric classifies every signal by how it is obtained —
api (a vendor read API), native (a first-party integration), grid_collected
(SignalGrid does the lifting itself), or unavailable (a real gap). This
server is the grid_collected path for macOS: SIP, FileVault, Gatekeeper, MDM
enrollment, XProtect currency and the rest are facts no cloud API hands you
faithfully in real time — you read them on the device.
Every signal here is therefore classified grid_collected at medium
fidelity — deliberately not high. The reads are authoritative, but the fabric
never over-trusts a signal it had to collect itself, and some probes degrade to
unknown without elevation.
The server publishes this mapping so a connecting fabric can discover each signal's provenance, as the MCP resource:
signalgrid://sourcingIt lists every posture-report section → the fabric signal it feeds → its
acquisition method and fidelity. tests/test_sourcing.py pins the manifest as a
bijection with the report sections, so no section can go un-sourced and no
stale entry can linger. (The per-signal descriptions are prose, not checked
against collector output.)
Install
Requires Python ≥ 3.10 on the Mac being assessed.
cd signalgrid-mcp
pip install -e . # or: uv pip install -e .Run
stdio transport (the server must run on the Mac it is assessing, as a subprocess of the MCP client):
signalgrid-mcp # console script
# or
python -m signalgrid_mcp.server
# or (back-compat)
python server.pyClaude Desktop / Claude Code config
{
"mcpServers": {
"signalgrid": {
"command": "python3",
"args": ["/Users/<you>/signalgrid-mcp/server.py"]
}
}
}Inspect interactively
npx @modelcontextprotocol/inspector python3 server.pyPermissions & elevation
The server intentionally runs unelevated. Some probes therefore report
null/unknown rather than an answer:
profiles list,systemsetup, and somelaunchctl print system/...targets want root.tmutil latestbackupand the Time Machine preference need Full Disk Access.Unelevated
lsofonly sees the current user's listeners.
This is by design: an unattended trust agent should not hold root. Treat
null as "unresolved signal" and escalate out-of-band if it matters.
Verify (turnkey, on the Mac)
One command sets up, tests, and inspects the live server end to end:
./verify.shIt creates a venv, installs, runs pytest, then inspects the server over MCP
stdio — listing and calling every tool. See RUNBOOK.md for the
step-by-step Mac verification, including how to chase down any signal that reads
unknown against real macOS output.
Testing
pip install -e ".[dev]"
pytestThe smoke tests run on any OS (they exercise the graceful-degradation paths on
Linux CI); the meaningful signal values obviously require macOS. For a Node-free
protocol inspection (no browser, no npx):
python tools/inspect_stdio.py # human-readable
python tools/inspect_stdio.py --json # machine-readable summaryLayout
signalgrid-mcp/
├── server.py # back-compat stdio entry point
├── verify.sh # one-command turnkey verify (install + test + inspect)
├── RUNBOOK.md # step-by-step Mac verification runbook
├── src/signalgrid_mcp/
│ ├── app.py # FastMCP instance + shared annotations
│ ├── runner.py # subprocess plumbing (run/text/probe/run_json)
│ ├── formatting.py # pagination, filtering, markdown/JSON rendering
│ ├── sourcing.py # grid_collected sourcing manifest (signalgrid://sourcing)
│ ├── server.py # entry point (main)
│ └── tools/ # one module per signal domain
├── tools/inspect_stdio.py # Node-free MCP inspector (protocol/read-only/honesty)
├── tests/test_smoke.py
├── tests/test_parsers.py # parser fixtures pinned against captured output
└── evaluation.xml # MCP eval suite (read-only Q&A pairs)Available Tools
22 toolssignalgrid_codesign_inspectARead-onlyIdempotent
Inspect the code signature, signature validity, and Gatekeeper assessment of a bundle or binary on this Mac.
Use to answer "is this app properly signed and notarized, and by whom?". Reads only; never executes the target.
Args: path: Absolute path to the .app or binary to inspect.
Returns:
dict with keys:
- path: the inspected path
- signature: codesign -dv --verbose=4 output (authority chain,
team identifier, hashes)
- verify: codesign --verify --deep --strict result ("valid on disk"
style output, or the specific failure)
- assessment: spctl --assess --verbose=4 Gatekeeper verdict
(accepted/rejected and the source, e.g. "Notarized Developer ID")
A missing path yields codesign/spctl error text in those fields rather
than an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to an .app bundle or Mach-O binary, e.g. '/Applications/Safari.app' or '/usr/local/bin/some-tool' |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description reveals concrete behaviors: it runs specific commands (`codesign -dv --verbose=4`, `codesign --verify --deep --strict`, `spctl --assess --verbose=4`), returns a structured dict, and handles missing paths by embedding error text in fields rather than throwing an exception. This is rich, annotational over-delivery.
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 with a one-line summary, an explicit use-case, a safety note, and clearly separated Args/Returns sections. Every sentence contributes value, and the markdown formatting enhances readability without being padded.
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 is contextually complete: it covers purpose, usage, parameter semantics, return structure, behavior (including error handling), and safety. Despite having an output schema, the description redundantly documents the return keys, which is helpful and makes the tool self-contained.
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 100%, so the baseline is 3. The description's 'Args' section repeats the path parameter but adds no new semantic meaning beyond what the schema already provides (absolute path, .app or Mach-O, examples).
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: 'Inspect the code signature, signature validity, and Gatekeeper assessment of a bundle or binary on this Mac.' It also states the concrete question it answers ('is this app properly signed and notarized, and by whom?'), which clearly distinguishes it from the sibling signalgrid_* 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 'Use to answer...' which gives a clear when-to-use context. It also notes 'Reads only; never executes the target,' implying safe read-only usage. However, it does not explicitly mention when not to use it or name alternative tools, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_device_identityARead-onlyIdempotent
Hardware identity: serial number, model, hardware UUID, chip, activation lock.
The stable anchor for a device trust record. Serial number + hardware UUID uniquely identify the physical machine across OS reinstalls.
Returns: dict with keys: model_name, model_identifier, chip, serial_number, hardware_uuid, provisioning_udid, memory, activation_lock — or {"error": str} if system_profiler could not run.
| 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=false, so the safety profile is covered. The description adds value by specifying exact return keys and the error behavior when system_profiler fails, which is behavioral context beyond what the annotations 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 structured with a short title line, a sentence about usage context, and a clear return specification. It is concise and every sentence contributes either to purpose, usage, or return behavior, though the 'Returns' section duplicates what an output schema would typically provide.
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 no-parameter tool with an output schema and rich annotations, the description covers the tool's purpose, the semantic meaning of the identity, and error handling. It does not address explicit alternatives, but that's a usage guideline matter, and overall this is sufficient for a simple read-only 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, so the baseline is 4. The description correctly omits parameter details, and the schema has 100% coverage with no parameters to document.
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 identifies the tool's function: providing hardware identity details (serial number, model, hardware UUID, chip, activation lock). The phrase 'stable anchor for a device trust record' adds context and distinguishes it from sibling system-info tools, though it lacks an explicit action verb like 'get' or 'list'.
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 usage context by positioning the data as a stable anchor across OS reinstalls, but it does not explicitly state when to use this tool over alternative siblings, nor does it mention any exclusions or alternatives. It provides a rationale for why to use it but no explicit comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_installed_appsARead-onlyIdempotent
Inventory of installed applications with version, source, and signer
(via system_profiler SPApplicationsDataType; first call can take ~30s).
Use for software-inventory questions and to shortlist risky installs: obtained_from='Unknown' plus no signer is the classic sideloaded-app signal. For a deep verdict on one app, follow up with signalgrid_codesign_inspect on its path.
Args: name_contains: substring filter on the application name. unsigned_only: only apps lacking signing info. limit/offset: pagination (default 30 per page; inventories often have hundreds of entries). response_format: markdown table (default) or JSON envelope; items have name, version, obtained_from, signed_by (first authority), last_modified, path.
Returns: str: rendered table or JSON string; "Error: ..." if system_profiler failed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| offset | No | Results to skip for pagination | |
| name_contains | No | Case-insensitive substring filter on app name, e.g. 'chrome' | |
| unsigned_only | No | If true, return only apps with no valid signing info -- the high-risk shortlist. | |
| response_format | No | 'markdown' for a human-readable table, 'json' for machine-readable data | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior. The description adds valuable context: potential ~30s latency on first call, the fact that system_profiler is the data source, and the error return format ('Error: ...' if system_profiler failed). This goes beyond safety traits to performance and failure 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 well-structured with clear sections for purpose, usage, args, and returns. It's fairly dense but every sentence contributes meaning, such as the latency warning and the sideloaded-app signal. Slightly verbose but not wasteful.
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 thorough: it covers when to use, what it returns, how to interpret results, error conditions, performance characteristics, and relationship to sibling tools. Combined with full schema coverage and annotations, this is nearly complete for a list-style inventory 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 coverage is 100%, so baseline is 3. The description adds marginal context for limit/offset by noting 'inventories often have hundreds of entries', which justifies pagination. However, for name_contains and unsigned_only, the description largely restates what the schema already says.
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 as an inventory of installed applications with version, source, and signer. It distinguishes itself from sibling tools by explicitly mentioning software-inventory questions and contrasting with signalgrid_codesign_inspect for deep one-app verdicts.
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 for software-inventory questions and to shortlist risky installs, with a concrete signal (obtained_from='Unknown' plus no signer). It also recommends signalgrid_codesign_inspect for deep verdicts, offering a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_install_historyARead-onlyIdempotent
Software install history (OS updates, security content, packages), newest first — the audit trail of what changed on this Mac and when.
Use to verify security updates actually landed (e.g. filter name_contains='XProtect') or to spot unexpected installs.
Args: name_contains: substring filter on the package name. limit/offset: pagination (default 25 per page). response_format: markdown table (default) or JSON envelope {total, count, offset, items, has_more, next_offset}; items have name, version, source, install_date.
Returns: str: rendered table or JSON string; "Error: ..." if the underlying system_profiler query failed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| offset | No | Results to skip for pagination | |
| name_contains | No | Case-insensitive substring filter on package name, e.g. 'XProtect' or 'macOS' | |
| response_format | No | 'markdown' for a human-readable table, 'json' for machine-readable data | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint), and the description adds valuable behavioral context: pagination defaults, response envelope structure (total, count, offset, items, has_more, next_offset), and error handling for system_profiler failures. It also clarifies that results are ordered newest first.
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: a concise purpose statement, a practical use-case sentence, then an Args/Returns breakdown. It includes all necessary details without redundancy, making it easy to scan and understand.
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 moderate complexity (4 optional params, no output schema provided), but the description fully covers input filtering, pagination, response formats, and error behavior. It even specifies the exact structure of the JSON response, so an agent knows what to expect. Combined with the annotations, this is a complete package.
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 100%, so the parameters are already well-documented. The description adds meaning by explaining the JSON envelope fields and item attributes (name, version, source, install_date), which are not present in the schema. It also ties name_contains to the XProtect use case, providing extra context beyond the schema's description.
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 provides 'Software install history (OS updates, security content, packages), newest first' and frames it as 'the audit trail of what changed on this Mac and when.' This specific verb-resource pairing distinguishes it from siblings like signalgrid_installed_apps or signalgrid_software_updates.
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: 'Use to verify security updates actually landed (e.g. filter name_contains='XProtect') or to spot unexpected installs.' This provides clear context for when to use the tool, but it doesn't explicitly mention when not to use it or name alternative sibling tools, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_kernel_extensionsARead-onlyIdempotent
Loaded kernel extensions, with third-party (non-Apple) kexts singled out.
Modern macOS strongly discourages kexts; any third-party kext is a
significant trust signal (legacy security tools, virtualization, or
something worse). Tries kmutil showloaded first, falls back to kextstat.
Returns: dict with keys: third_party (list[str] of loaded non-Apple kext lines, ideally empty), raw (full loader output), source ('kmutil' or 'kextstat'), or {"error": str} if neither tool ran.
| 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 read-only/idempotent annotations, the description discloses fallback behavior (tries kmutil, falls back to kextstat) and defines the exact return structure including error cases. This adds meaningful transparency about how the tool behaves in practice.
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 and well-structured: a clear first sentence, relevant security context, fallback detail, and a formatted Returns section. Every sentence serves a distinct purpose without unnecessary 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?
Given the tool's simplicity (no parameters) and the presence of an output schema, the description fully covers the behavior, return format, and error handling. It provides all necessary context for an agent to invoke the tool and interpret results confidently.
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 description cannot add parameter-level meaning. The baseline for 0 params is 4; the description appropriately focuses on the output contract instead, even though it's not explicitly about 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 clearly states the tool's purpose: retrieving loaded kernel extensions and singling out third-party kexts. It uses a specific verb ('Loaded') and resource ('kernel extensions'), and the emphasis on third-party kexts distinguishes it from siblings like signalgrid_system_extensions.
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 strong context for when this tool is relevant: checking for third-party kexts as a trust signal in macOS security assessments. It does not explicitly name alternatives or state when not to use it, but the 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.
signalgrid_launch_itemsARead-onlyIdempotent
Third-party launchd persistence: plists installed in /Library/LaunchDaemons, /Library/LaunchAgents, and ~/Library/LaunchAgents.
These are the standard macOS persistence mechanisms -- anything here runs automatically at boot or login. Apple's own sealed /System items are excluded, so every row is software someone installed. A recently-modified, oddly-named plist is a prime malware-persistence signal.
Args: name_contains: substring filter on the launchd label (filename). limit/offset: pagination (default 50 per page). response_format: markdown table (default) or JSON envelope; items have label, scope (system_daemon | system_agent | user_agent | user_daemon_nonstandard), path, modified (ISO timestamp).
Returns: str: rendered table or JSON string.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| offset | No | Results to skip for pagination | |
| name_contains | No | Case-insensitive substring filter on the launchd label, e.g. 'docker' | |
| response_format | No | 'markdown' for a human-readable table, 'json' for machine-readable data | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent behavior. The description adds value by explaining that Apple's sealed /System items are excluded, that items run at boot/login, and that a recently-modified oddly-named plist is suspicious. 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 compact, front-loaded with the core purpose, and organized with a brief context explanation followed by parameter and return details. Every sentence contributes useful context without rambling.
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 list tool with no explicit output schema, the description covers the return format (markdown or JSON), item fields (label, scope, path, modified), scope enum values, and filter semantics. Combined with annotations, this gives the agent enough to understand behavior and output.
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 100% and each parameter is well-described in the schema. The description largely restates the same parameter details (e.g., name_contains as substring filter, pagination defaults) without adding significant new meaning.
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 lists third-party launchd plists in standard persistence directories, excluding Apple's sealed items. It distinguishes this from sibling tools by focusing on launchd persistence and malware signals.
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 strong contextual guidance (standard persistence, malware signal) but does not explicitly mention when to avoid using it or name alternative tools. This falls short of a 5 but is clear enough for typical use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_listening_servicesARead-onlyIdempotent
Processes listening on TCP ports (via lsof -iTCP -sTCP:LISTEN).
The live map of this Mac's inbound network exposure. Note: without elevation, lsof only sees processes owned by the current user; system daemons may be missing from the list -- absence of a listener here is weaker evidence than presence.
Args: name_contains: substring filter on the listening process's command. limit/offset: pagination (default 50 per page). response_format: markdown table (default) or JSON envelope; items have command, pid, user, address (e.g. '*:22', '127.0.0.1:8021').
Returns: str: rendered table or JSON string; "Error: ..." if lsof could not run.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| offset | No | Results to skip for pagination | |
| name_contains | No | Case-insensitive substring filter on process command name, e.g. 'ssh' | |
| response_format | No | 'markdown' for a human-readable table, 'json' for machine-readable data | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (read-only, idempotent), the description reveals that lsof may miss system daemons without elevation and that errors return 'Error: ...' strings. This gives the agent important context about false negatives 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 compact, front-loaded with the main verb, and contains only relevant details. Each sentence adds information—purpose, caveat, parameter summary, and return format—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?
For a read-only info tool with 4 parameters and an output schema, the description covers the tool's scope, limitations, parameter behavior, and return envelope. It is complete enough 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 100%, so the baseline is 3. The description adds value by providing example address formats ('*:22', '127.0.0.1:8021') and clarifying that JSON items include command, pid, user, and address, which enriches the schema's terse 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 clearly states the tool processes TCP listening ports via lsof, and frames it as a 'live map of this Mac's inbound network exposure.' This specific verb-resource combination distinguishes it from sibling signals like installed_apps or process_snapshot.
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 explains when the tool is useful (inspecting inbound network exposure) and provides a key caveat about elevation and missing system daemons. It doesn't explicitly compare to alternatives, but the context is clear enough that the agent can decide when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_local_usersARead-onlyIdempotent
Local user accounts, admin-group membership, and the current console user.
Unexpected accounts -- especially unexpected admins -- are a core device trust signal. Cross-check admin_group against your expected owner list.
Args: include_system: include uid < 500 daemon accounts (default false).
Returns: dict with keys: users (list of {username, uid, is_admin}), admin_group (list[str] of admin usernames), console_user (str), _note — or {"error": str} if directory services could not be queried.
| Name | Required | Description | Default |
|---|---|---|---|
| include_system | No | Include system/daemon accounts (uid < 500). Default false: real login accounts only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the exact return structure including the error case when directory services fail, and the meaning of the include_system flag. This adds behavioral context not present in 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?
Structured with purpose, rationale, args, and returns. Every sentence adds value; no 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 read-only tool with one parameter, the description covers purpose, return format, error behavior, and usage context. The output schema is also described inline, making it 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?
Schema coverage is 100% for the single parameter. The description repeats the schema's explanation of include_system but doesn't add new semantic details beyond what the schema already provides, so baseline 3 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 the tool's output: local user accounts, admin-group membership, and current console user. This distinguishes it from sibling tools like signalgrid_installed_apps or signalgrid_os_info, which focus on other device aspects.
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 a clear use case for device trust: unexpected accounts/admins as a trust signal, and advises cross-checking admin_group against expected owner list. However, it doesn't explicitly contrast with alternatives or state when not to use it, though the sibling tools are clearly different.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_mdm_statusARead-onlyIdempotent
MDM enrollment state (including DEP/Automated Device Enrollment) and installed configuration profiles.
Key managed-device signal: an unenrolled corporate Mac is a trust gap. Profile listing may require elevation; the raw output is returned either way.
Returns: dict with keys: enrollment_raw (str), mdm_enrolled (bool | None), dep_enrolled (bool | None), profiles_raw (str), _note. null booleans mean the state could not be determined.
| 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 description adds important behavioral details beyond the annotations: it discloses that profile listing may require elevation but raw output is returned either way, and explains that null booleans mean the state could not be determined. This transparency complements the readOnly and idempotent hints 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 concise and well-structured: it starts with the primary purpose, adds a brief relevance note, then presents the return format in a clear bullet-like list. Each sentence earns its place with no 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?
Given the output schema is included, the description goes beyond by explaining the semantic meaning of the booleans and the elevation note. It provides enough context for the agent to interpret results and understand the tool's role in trust assessment, making it complete for a read-only inspection 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?
There are no parameters, so the description appropriately does not need to explain parameter semantics. The baseline of 4 applies because with zero parameters, the description cannot add more than the schema, and it already includes the return format which is the main needed semantic.
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 identifies the tool's function: reporting MDM enrollment state (including DEP) and installed configuration profiles. It distinguishes itself from sibling tools by focusing specifically on MDM status, contrasting with other signalgrid tools like installed_apps or network_posture.
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 clear context by labeling this as a 'key managed-device signal' and explicitly noting that an unenrolled corporate Mac is a trust gap, implying it should be consulted for security assessments. However, it does not explicitly mention alternatives or when not to use this tool, which would earn a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_network_postureARead-onlyIdempotent
Network configuration snapshot: hardware ports, active interface state, DNS nameservers, proxy settings, and configured VPNs.
Use to spot rogue DNS, unexpected proxies, or missing corporate VPN -- all classic device-trust red flags.
Returns:
dict with keys: hardware_ports (str), active_state (str, from
scutil --nwi), dns_nameservers (list[str]), proxies (str),
vpn_configurations (str), _note.
| 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, so the description doesn't need to restate safety. It adds valuable behavioral context by detailing the exact return structure ('dict with keys: hardware_ports, active_state, dns_nameservers, proxies, vpn_configurations, _note') and indicates the data source (e.g., 'scutil --nwi'). This goes beyond the 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?
The description is compact and well-organized: a one-sentence summary, a one-sentence use-case statement, and a structured return block. Every sentence adds value—no fluff. The use of a 'Returns' block is clean and informative.
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 no-parameter tool, the description is complete: it states what the tool does, when to use it, and what it returns. The output schema is present but the description still explains the meaning of the return values (_note, active_state from 'scutil --nwi'). It fully stands alone for an agent to select and use 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 tool has zero parameters, so the baseline is 4. The description focuses on the output content rather than parameters, but since there are no params to explain, no additional parameter semantics are needed. It does describe the return structure clearly, which is relevant for output interpretation.
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 provides a 'Network configuration snapshot' and enumerates specific contents (hardware ports, active interface state, DNS nameservers, proxy settings, VPNs). This is a specific verb+resource that distinguishes it from sibling tools like 'signalgrid_security_posture' or 'signalgrid_trust_verdict' by focusing on network configuration.
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: 'Use to spot rogue DNS, unexpected proxies, or missing corporate VPN -- all classic device-trust red flags.' It does not mention alternatives or explicit when-not-to-use, but the use case is clear and distinct from other device-trust tools like 'signalgrid_security_posture' or 'signalgrid_trust_verdict'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_os_infoARead-onlyIdempotent
macOS product/build version, kernel, hostnames, uptime, and current users.
Use to establish OS patch level (compare product_version against Apple's latest release) and which user is on the console.
Returns: dict with keys: product_name, product_version, build_version, kernel, computer_name, local_hostname, uptime, console_user, process_user. Individual values read "unavailable"/error text when a probe fails.
| 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 the tool as read-only and idempotent. The description adds valuable details beyond those annotations: it returns a structured dict and that individual values read 'unavailable'/error text when a probe fails, which is important for handling failures gracefully.
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 three short paragraphs, front-loaded with the core information (what data is returned), followed by a concise use case and return/failure semantics. Every sentence adds value with no 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 zero-parameter read-only tool with an output schema, the description covers all necessary context: the exact output keys, failure behavior, and a primary use case. It is sufficiently complete for an agent to invoke and interpret results 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?
There are zero parameters, so the baseline is 4. The schema is empty, and the description does not need to explain parameters. It adds no parameter-specific meaning, but with no parameters, no further clarification 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 clearly states the tool provides macOS product/build version, kernel, hostnames, uptime, and current users. It lists the exact dictionary keys, making the scope unambiguous and distinguishing it from siblings like signalgrid_software_updates or signalgrid_device_identity.
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: establishing OS patch level and determining the console user. It does not mention alternatives or when not to use it, but the context is clear and specific 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.
signalgrid_posture_reportARead-onlyIdempotent
Full device trust snapshot in a single round-trip: identity + OS + security + MDM + patch state by default, with optional extra sections.
Use this first. One call instead of six, which matters when every tool call is a network round-trip. Drill into the focused tools afterward for anything that looks off. A failed section reports {"error": ...} instead of sinking the whole snapshot.
Set include_verdict=True to also get the on-device SignalGrid decision as a 'verdict' summary alongside the raw facts — the same fail-safe fold as signalgrid_trust_verdict (unknown is never 'allow'). The verdict is a derived summary, never a collected signal, so it is absent unless explicitly asked for.
Args: sections: optional list from {identity, os, security, sharing, mdm, updates, xprotect, network, persistence, time_machine, system_extensions, screen_lock}. include_verdict: attach the folded allow/step_up/restrict/deny verdict.
Returns: dict keyed by section name; each value is that section's collector output (same shapes as the corresponding focused tools). With include_verdict, an extra 'verdict' key holds the folded decision.
| Name | Required | Description | Default |
|---|---|---|---|
| sections | No | Which sections to include. Default: identity, os, security, mdm, updates, xprotect. Also available: sharing, network, persistence, time_machine, system_extensions, screen_lock. Pass an explicit list to customize. | |
| include_verdict | No | Also fold the posture into the fail-safe SignalGrid verdict (allow / step_up / restrict / deny) under a 'verdict' key. Default False (the report stays purely factual). When True, the sections the verdict needs (security, mdm, updates, xprotect, system_extensions) are collected even if not in `sections`. |
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, non-destructive. The description adds valuable behavioral context: failed sections return an error dict without sinking the whole snapshot, the verdict is a derived summary (absent unless requested), and include_verdict auto-collects required sections. 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 well-structured with a strong opening summary, usage guidance, and an Args/Returns section. It is a bit longer than strictly necessary, but every part serves a purpose—no filler or repetition of 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 moderate complexity (two optional params, many section choices), the description fully explains return shapes, error behavior, and verdict derivation. Combined with rich schema and annotations, the agent has all needed context to 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 already covers both parameters at 100%. The description adds meaning by explaining the fail-safe verdict semantics and the 'unknown is never allow' policy, which is beyond the schema's field descriptions. Slightly redundant Args block but still adds 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 clearly states what the tool does: it returns a full device trust snapshot combining identity, OS, security, MDM, and patch state in one call. It distinguishes itself from siblings by positioning as the 'use this first' aggregate tool, with focused tools as follow-ups.
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 advises 'Use this first' and explains the advantage of a single call versus six. It also directs users to drill into focused tools afterward and describes when to set include_verdict, giving clear contextual guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_process_snapshotARead-onlyIdempotent
Point-in-time snapshot of running processes (pid, parent, user, %CPU, %MEM, command path).
Use to confirm an agent/daemon is actually running (filter by name) or to spot suspicious processes. Full executable paths are included -- feed a suspicious one to signalgrid_codesign_inspect.
Args: name_contains: substring filter on the command path. sort_by: cpu (default) | memory | pid. limit/offset: pagination (default 25 per page). response_format: markdown table (default) or JSON envelope; items have pid, ppid, user, cpu_pct, mem_pct, command.
Returns: str: rendered table or JSON string; "Error: ..." if ps failed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return | |
| offset | No | Results to skip for pagination | |
| sort_by | No | Sort order: 'cpu' (default), 'memory', or 'pid' | cpu |
| name_contains | No | Case-insensitive substring filter on the command path, e.g. 'python' | |
| response_format | No | 'markdown' for a human-readable table, 'json' for machine-readable data | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, the description adds valuable behavioral context: includes full executable paths, returns either a markdown table or JSON envelope, and outputs 'Error: ...' if ps fails. This goes beyond the annotations and helps set 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?
The description is front-loaded with a purpose summary, followed by usage guidance and an Args block. Every sentence earns its place; there is no redundancies or fluff. It is long enough to be useful but tightly 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 read-only, non-destructive tool with full schema coverage and an output schema (Has output schema: true), the description covers purpose, usage, behavior, and return format. It even handles error cases and suggests integration with a sibling tool. The description is complete 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 description coverage is 100%, and each parameter already has a clear description (e.g., name_contains is a 'Case-insensitive substring filter'). The tool description repeats the parameter meanings but adds no new semantic depth beyond the schema. Baseline 3 is appropriate given the schema's completeness.
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 begins with 'Point-in-time snapshot of running processes' and lists the exact fields (pid, parent, user, %CPU, %MEM, command path). This specific verb+resource clearly distinguishes it from sibling tools like signalgrid_installed_apps or signalgrid_listening_services.
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 to confirm an agent/daemon is actually running' and 'spot suspicious processes.' It even suggests pairing with signalgrid_codesign_inspect for suspicious paths, giving a clear when-to-use and complementary alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_removable_mediaARead-onlyIdempotent
Connected USB / removable-media devices, flagging MASS-STORAGE — the data-egress channel a shared or plant-floor device manager cares about. Read-only; needs no elevation.
mass_storage_connected: true means removable storage is physically present.
available: false means the USB tree could not be read (never "nothing
connected"). SignalGrid reports this; it does not block the device.
Returns: dict with available (bool), device_count, mass_storage_count, mass_storage_connected (bool | None), and devices[] each with name, vendor, serial, kind (mass_storage | other), volumes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max devices to return. | |
| offset | No | Pagination offset. | |
| name_contains | No | Case-insensitive filter on device name/vendor. | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive. The description adds value by stating 'needs no elevation', explaining that 'available: false' means the USB tree could not be read (never 'nothing connected'), and emphasizing that SignalGrid does not block the device. These nuances go beyond annotation defaults.
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 concise: a one-sentence purpose, key behavioral flags, and a return format. Every sentence contributes value, using code formatting for clarity 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?
Given no output schema, the description includes a detailed return dictionary, covering edge cases like available: false and mass_storage_connected: true. It lacks nothing critical for a simple read-only listing tool; pagination and filters are self-explanatory from the schema.
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 75% with all parameters (limit, offset, name_contains, response_format) having descriptions. The tool description does not add extra parameter semantics beyond the schema, but it does specify the return shape, which helps compensate. Baseline 3 is appropriate since schema covers most parameter meaning.
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 reports connected USB/removable-media devices with a focus on MASS-STORAGE as a data-egress channel. The verb 'flagging' and the explicit resource (removable media) distinguish it from other signalgrid sibling tools focused on apps, processes, or network posture.
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 context for when to use the tool: it is relevant for shared or plant-floor device managers concerned about data egress. It also clarifies that the tool only reports and does not block devices. It does not explicitly contrast with alternatives, but the uniqueness of the resource makes the use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_screen_lockARead-onlyIdempotent
Screen-lock / auto-lock hygiene: does this Mac lock itself when left idle? The walk-up risk on a shared or plant-floor device. Read-only; no elevation.
Composes three facts — password required on wake, the grace delay before it,
and whether the display ever sleeps — into a fail-safe locks_when_idle
verdict. true only when all three read healthy; false on a real gap;
null when it could not be confirmed (unknown is never graded as locking).
Returns: dict with locks_when_idle (bool | None), password_on_wake (bool | None), password_delay_seconds (int | None), display_sleep_minutes (int | None), concerns (list), unknowns (list), and a _note.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and non-destructive safety, but the description adds significant behavioral context: it composes three facts, uses a fail-safe logic, returns `null` when confirmation is impossible, and explicitly states 'unknown is never graded as locking.' This goes beyond what annotations provide and gives the agent a deep understanding of the tool's 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 and well-structured, front-loading the core purpose and then elaborating on the verdict logic and return fields. It uses several short sentences that each add value, but it is longer than strictly necessary for a one-parameter tool. The structure is clear, with section labels like 'Returns:'.
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?
There is no output schema, so the description correctly takes on the burden of explaining return values. It lists all dict keys (`locks_when_idle`, `password_on_wake`, etc.), explains the `null` edge case, and provides enough context about the composed facts to make the tool's behavior fully understandable without ambiguity.
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 single parameter `response_format` is fully documented in the input schema with enum and default, but the description does not mention it at all. With 0% coverage, the description fails to compensate or add any semantic meaning beyond the schema. However, the parameter is trivial and the schema suffices, so the minimum viable score 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 'Screen-lock / auto-lock hygiene: does this Mac lock itself when left idle?' which clearly identifies the tool's purpose and resource. It also explains the fail-safe `locks_when_idle` verdict, distinguishing it from sibling info-gathering tools like `signalgrid_installed_apps` and `signalgrid_os_info`.
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 context for when to use the tool: 'The walk-up risk on a shared or plant-floor device.' It also mentions 'Read-only; no elevation,' which helps the agent understand it's safe for assessment. However, it does not explicitly name alternative tools or when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_security_postureARead-onlyIdempotent
Core security posture: SIP, FileVault, Gatekeeper, and application firewall (global state, stealth mode, block-all).
Each control reports {raw, enabled}. enabled is null when the check could
not be completed -- null means UNKNOWN, never "off". Treat null as a signal
to investigate (often the check needs elevation), not as a grade.
Returns: dict mapping control name -> {"raw": str, "enabled": bool | None}, plus "_unknown" (list of controls that could not be evaluated) and "_note" explaining the null semantics.
| 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, so no restatement is needed. The description adds crucial behavior: null enabled means UNKNOWN, never 'off'; null indicates a check that often requires elevation; and the response includes _unknown and _note 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?
The description is tightly structured: one line for scope, a focused paragraph on null semantics, and a terse return-type spec. Every sentence earns its place with no repetition of 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 no-argument read-only tool, this description is comprehensive. It defines the domain, the return mapping, the subtle null semantics, and the auxiliary _unknown and _note fields, making the tool usable without further investigation.
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 no parameter semantics to clarify. The description adds value by documenting the return structure, and the baseline for zero-parameter tools is 4.
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 'Core security posture' and names exactly four controls: SIP, FileVault, Gatekeeper, and application firewall. This clearly identifies the resource and scope and distinguishes it from sibling tools like signalgrid_network_posture and signalgrid_xprotect_status.
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 scope statement tells the agent when this tool is relevant: when checking these specific core security controls. It does not explicitly name alternatives or provide exclusions, but the control list is a clear context for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_sharing_servicesARead-onlyIdempotent
Remote-access exposure: SSH remote login, remote Apple events, Screen Sharing, SMB file sharing, and Apple Remote Desktop.
An enabled sharing service widens the device's attack surface; on a managed endpoint most of these should be off. Same null-means-unknown semantics as signalgrid_security_posture (systemsetup checks in particular often need elevation and will report null without it).
Returns: dict mapping service name -> {"raw": str, "enabled": bool | None}, plus "_unknown" and "_note".
| 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 (readOnlyHint=true, destructiveHint=false), the description discloses important behavioral details: null-means-unknown semantics, and that systemsetup checks often require elevation and will return null without it. These nuances are not inferable from annotations alone and are critical for interpreting 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 compact and front-loaded with the purpose. It includes a security rationale, a reference to a sibling tool, and a precise return specification. While each sentence adds value, the text could arguably be trimmed slightly without loss, hence not a perfect 5.
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 read-only tool with an output schema, the description is complete: it states what the tool reports, how to interpret nulls, potential elevation issues, and the exact return structure. Since the output schema already exists, the description does not need to re-explain return values but goes further by providing context and semantics.
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 nothing to document. Per the baseline for 0-param tools, a score of 4 is appropriate; the description adds no parameter-specific meaning because there are none, but the schema is fully covered by the absence of any 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 clearly defines the tool's purpose: it checks remote-access exposure via SSH, remote Apple events, Screen Sharing, SMB file sharing, and Apple Remote Desktop. The explicit return format (dict mapping service names to enabled states) leaves no doubt about what the tool does, and the focus on sharing services distinguishes it from sibling tools like network_posture or listening_services.
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 context for when this tool is relevant, noting that on managed endpoints most sharing services should be off. It also references signalgrid_security_posture for null semantics, which helps an agent understand the tool's role in a broader security assessment. However, it does not explicitly compare against alternative tools or state when NOT to use it, so it stops short of full usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_software_updatesARead-onlyIdempotent
Software update posture: auto-update settings, last successful check, cached count of available updates, and optionally a live check.
LastUpdatesAvailable > 0 or a stale LastSuccessfulDate is a patch-hygiene red flag. Values are null when a preference is unset or unreadable.
Args:
check_online: run a live softwareupdate -l (slow) in addition to the
cached state.
Returns: dict with keys: settings (dict of SoftwareUpdate preferences incl. AutomaticCheckEnabled, AutomaticallyInstallMacOSUpdates, CriticalUpdateInstall, LastSuccessfulDate, LastUpdatesAvailable, AppStoreAutoUpdate), and live_check (str, only when check_online=true).
| Name | Required | Description | Default |
|---|---|---|---|
| check_online | No | If true, also query Apple's update servers live via `softwareupdate -l` (slow: 30-120s). If false (default), report only cached preference state, which is instant. |
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 behavior. The description adds valuable context: values are null when unreadable, the difference between cached and live state, and the performance implication of the live check. This goes beyond the annotation flags.
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 with a summary, a usage note, args, and returns. While somewhat verbose, every sentence carries useful information, including the return keys and the red-flag interpretation. It is front-loaded with the core 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?
Given one parameter, a rich output schema, and read-only annotations, the description is complete. It covers return values, null semantics, performance, and decision-making context (patch-hygiene red flag). No significant gaps 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?
The schema description for check_online is thorough, covering default behavior and timing (30-120s). The description's Args section only repeats this information without adding additional meaning, so the baseline of 3 applies since schema coverage is 100%.
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 identifies the tool's resource: software update posture, including auto-update settings, last check, and available updates. It distinguishes from sibling posture tools by focusing specifically on software updates, though it lacks an explicit verb like 'get' or 'query'.
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 clear context for when to use the tool, such as checking for patch-hygiene red flags (LastUpdatesAvailable > 0 or stale LastSuccessfulDate). It also explains the trade-off between cached (instant) and live (slow) checks, guiding parameter selection. It does not explicitly name alternative tools, 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.
signalgrid_system_extensionsARead-onlyIdempotent
Installed system extensions (endpoint-security / network) and whether any
is STRANDED — still registered after its app is gone (state activated enabled (removed) or terminated waiting to uninstall), which blocks its own
reinstall. Read-only; needs no elevation.
Fail-safe: available: false means the state could not be read (never "none
installed"); reliable: false means the parsed list may be incomplete (a
residual one could be missing — raise the assurance bar); an unrecognized
state is unknown, never active.
Returns: dict with available (bool), reliable (bool), count, declared_count, residual_count, active_count, unparsed_rows, and extensions[] each with teamID, bundleID, version, name, enabled, active, state, status (active | pending | residual | unknown).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max extensions to return. | |
| offset | No | Pagination offset. | |
| name_contains | No | Case-insensitive filter on extension name/bundleID. | |
| response_format | No | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds substantial context beyond annotations: it explains fail-safe flags (available, reliable), how to interpret edge cases (unknown states), and the meaning of statuses. It also explicitly confirms read-only behavior consistent with annotations, without 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 but well-structured with clear sections ('Fail-safe', 'Returns'). Every sentence adds value, covering purpose, edge cases, and output format. It is slightly verbose but not wasteful, earning a 4.
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 no output schema, the description thoroughly documents the return dictionary fields and their semantics, along with failure modes and status categories. This makes it complete enough for an agent to understand the tool's behavior and outputs 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?
Schema coverage is 75%, with descriptions for limit, offset, name_contains, and response_format. The description does not add extra parameter semantics; it only explains outputs. The schema descriptions are sufficiently clear, so the baseline 3 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?
The description precisely states the tool reports installed system extensions (endpoint-security/network) and highlights stranded extensions, a specific resource and condition. It differentiates from siblings like signalgrid_kernel_extensions by focusing on system extensions, and the return structure clarifies it lists them.
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 mentions it is read-only and needs no elevation, providing some operational guidance. However, it does not explicitly compare with alternatives (e.g., signalgrid_kernel_extensions) or state when not to use this tool. Usage timing is implied by the resource type rather than explicitly stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_time_machineARead-onlyIdempotent
Time Machine posture: automatic backups on/off, configured destinations, and the most recent completed backup.
A device with no recent backup carries higher data-loss risk; a stale latest_backup date on a machine that should back up daily is a drift signal.
Returns: dict with keys: auto_backup (bool | None; null = could not read), destinations (str), latest_backup (str; a snapshot path on success or error text), _note.
| 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 (read-only, idempotent, non-destructive), the description discloses edge cases: auto_backup can be null if unreadable, and latest_backup may be a snapshot path or error text. It also explains the meaning of a stale backup, adding behavioral context that helps the agent interpret results. 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 concise and well-structured: a one-sentence purpose, a brief motivational context, and a clear list of return keys. Every sentence earns its place without redundancy or 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 zero-parameter read-only tool, the description is complete. It explains the return keys, the meaning of null/error values, and the practical significance of the data. The existence of an output schema supplements the return structure, and the description covers the rest.
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 schema coverage is trivially 100%. The baseline for zero parameters is 4. The description does not need to explain parameters but instead explains the output structure, which is useful.
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: reporting Time Machine posture including backup on/off state, destinations, and latest backup. It uses specific terminology and distinguishes itself from sibling tools by focusing on Time Machine specifically. The return structure is outlined, 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?
The description provides context for when this tool is useful: identifying data-loss risk and drift signals from stale backups. It does not explicitly name alternative tools or exclusion criteria, but the specific domain and the drift signal context make usage scenarios clear. For a zero-parameter read-only tool, this level of guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_trust_verdictARead-onlyIdempotent
The SignalGrid decision for THIS Mac, computed on-device: one fail-safe verdict — allow / step_up / restrict / deny — plus the reasons.
Read-only. Composes security posture, MDM enrollment, update settings, XProtect currency, and stranded system extensions. Unknown is never 'allow': a control that could not be read raises the bar to step_up; a disabled hardening control or a stranded security extension restricts (two or more deny).
Returns: dict with verdict (str), reasons (list), criticals, unknowns, controls, mdm_enrolled, and a _note. This is a single-device verdict; the fabric fuses it with other signals for the final decision.
| 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 and idempotentHint, and the description reinforces this with 'Read-only.' More importantly, it adds rich behavioral detail about fail-safe logic: 'Unknown is never allow,' the bar rises to step_up on unreadable controls, and restrictions/denials occur under specific conditions. This goes well beyond the structured metadata.
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 yet information-dense, with a clear two-paragraph structure plus a return list. The first sentence immediately states the core purpose; the second explains fail-safe behavior; the third lists return fields. 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?
Given the tool's complexity (composing multiple security signals into a verdict) and the presence of an output schema, the description adequately covers the verdict values, the fail-safe policy, and the return structure. It also clarifies the scope ('single-device verdict') and the fusion with other signals, leaving no major 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?
The tool has zero parameters, so the input schema is trivially complete. According to the scoring rule, 0 params earns a baseline of 4. No parameter explanation is needed, and the description instead focuses on the output 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 what the tool does: computes a fail-safe trust verdict (allow/step_up/restrict/deny) for the current Mac. It distinguishes itself from sibling tools that collect individual data (e.g., signalgrid_mdm_status, signalgrid_xprotect_status) by producing a composed verdict with reasons.
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 useful context: it 'composes security posture, MDM enrollment, update settings, XProtect currency, and stranded system extensions,' implying it is the aggregation tool rather than a per-signal data source. It also cautions that the verdict is single-device and the final decision is fused elsewhere. However, it doesn't explicitly name alternatives or state when to prefer this over individual sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signalgrid_xprotect_statusARead-onlyIdempotent
Versions of Apple's built-in anti-malware: XProtect definitions, XProtect Remediator, and MRT (Malware Removal Tool).
Stale definitions indicate the Mac is not receiving Apple security content updates (often caused by ConfigDataInstall being disabled).
Returns: dict with keys: xprotect_definitions, xprotect_remediator, mrt. Each is a version string, or "unavailable: " text.
| 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 indicate read-only, idempotent, non-destructive behavior. The description adds value by specifying the exact return structure (dict with three keys), the format of version strings, and the 'unavailable: <reason>' fallback. This goes beyond what annotations 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 reasonably concise and well-structured: purpose first, then diagnostic context, then return format. The return section is slightly verbose but informative. No filler sentences.
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, the description is complete: it states what is returned, the meaning of stale definitions, and potential root cause. The output schema further supports completeness, and the description aligns with sibling tool scope.
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 input schema already fully defines usage. Baseline for 0 params is 4; no further parameter explanation is necessary.
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 identifies the tool's purpose: reporting versions of Apple's anti-malware components (XProtect definitions, Remediator, MRT). It names specific resources and is distinct from sibling tools like signalgrid_installed_apps or signalgrid_software_updates.
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 clear context on when this tool is relevant, noting that stale definitions indicate missing security updates and points to a likely cause (ConfigDataInstall disabled). It does not explicitly exclude alternatives, but the resource-specificity makes the intended use obvious among siblings.
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. Dates show when Glama detected each change.
22 tool updates
v1.0.2- First observed
signalgrid_codesign_inspect - First observed
signalgrid_device_identity - First observed
signalgrid_install_history - First observed
signalgrid_installed_apps - First observed
signalgrid_kernel_extensions - First observed
signalgrid_launch_items - First observed
signalgrid_listening_services - First observed
signalgrid_local_users - First observed
signalgrid_mdm_status - First observed
signalgrid_network_posture - First observed
signalgrid_os_info - First observed
signalgrid_posture_report - First observed
signalgrid_process_snapshot - First observed
signalgrid_removable_media - First observed
signalgrid_screen_lock - First observed
signalgrid_security_posture - First observed
signalgrid_sharing_services - First observed
signalgrid_software_updates - First observed
signalgrid_system_extensions - First observed
signalgrid_time_machine - First observed
signalgrid_trust_verdict - First observed
signalgrid_xprotect_status
TDQS
Every tool targets a distinct macOS subsystem or data source (installed apps, install history, processes, listening services, MDM, etc.), with no two tools doing the same thing. The only aggregate tool, posture_report, explicitly composes the others, and trust_verdict is a derived decision, not a raw collection.
All 22 tools share the signalgrid_ prefix and use lowercase underscore-separated names. The pattern is consistent throughout, with no mix of camelCase or differing verb styles.
At 22 tools, this is in the 16-25 range that feels heavy, but each tool serves a specific security-assessment function and earns its place. The count is borderline and could be seen as slightly over the typical sweet spot.
The tool set provides comprehensive read-only coverage of device trust: identity, OS, security controls, updates, MDM, persistence, network, processes, and aggregate views. Every signal has a follow-up path (e.g., process snapshot to codesign inspect), and the posture_report/trust_verdict tools provide a cohesive summary.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only MCP server for turva.dev, an agent-readiness audit and advisory service.
Guarded MCP server for agent-readable business truth, provenance, readiness, and discovery.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
111Trust checks for MCP servers: trust scores, tool-drift detection, signed diligence receipts. Free.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceAn MCP server that runs on a Mac and exposes a small, sharp set of tools (shell, file transfer, binary execution, screenshots) over a token-protected network port.-
- FlicenseAqualityCmaintenanceLocal MCP server for Apple platform console, unified, and diagnostic logs. Enables listing devices and capturing live logs from simulators and real devices.5-
- AlicenseAqualityBmaintenanceA local MCP server that exposes macOS automation actions (AppleScript + CLIs) as tools, enabling MCP clients on your Mac to control apps, system settings, and more.39MIT
- AlicenseBqualityAmaintenanceEnables AI agents to directly access native macOS services, media, system health, and administration tools through a local MCP server.4039MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DanFashauer/signalgrid-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server