Skip to content
DocumentationGuidesv1.2.1

MCP tools

Accepted arguments, response shapes, side effects and error handling for all 13 tools in Signalint 1.2.1.

Signalint exposes 13 tools over stdio MCP. Checks do not edit source, but can write cache, session and compiler artifacts. apply_diagnostic_fix explicitly writes source files; configure your host permissions accordingly. Tool annotations are hints, not a filesystem sandbox or proof of human consent.

Every input object rejects unknown keys. File/path arrays are limited to 512 where the shared path-array schema is used; this is not a bound on every diagnostic or patch array.

ToolAccepted argumentsResult / use
ping{}Connection and canonical project root
check_projectOptional paths: string[], default ["."]Clustered project check
check_filesRequired files: string[]Configured scoped file check
get_issue_detailExactly one of clusterId / issueId; required checkIdMatching normalized records from a retained snapshot
get_loop_status{}Oscillation and file/rule churn state
get_diagnostic_snapshotRequired checkIdMetadata, clusters and bounded remaining records; not full issues
compare_diagnosticsRequired baselineCheckId, currentCheckIdIntroduced, resolved and unchanged issues; error counters
after_edit_checkRequired files; optional baselineCheckIdNew configured file check, plus optional delta
ingest_diagnosticsRequired LSP-shaped diagnostics; optional source, serverNameBatch snapshot and buffered external issues
get_live_diagnosticsOptional files, `severity: “error”“warning”`
preview_diagnostic_fixRequired nonempty patches with file, originalContent, patchedContent; optional per-patch descriptionIn-memory transaction and character-length summary
apply_diagnostic_fixRequired transactionId, confirm: boolean; optional baselineCheckIdSource writes only when confirm: true; post-check and optional delta
discard_diagnostic_fixRequired transactionId{ transactionId, discarded: boolean }; not an undo tool

The native subprocess engine set remains Oxlint, TypeScript, Biome and ESLint. External report normalization is not registration of additional native engines.

Call ping with {}. Text content is the literal string pong, not a JSON string. In both and structured mode the result also includes:

{ "pong": true, "projectRoot": "/work/my-project" }

Text mode omits that structured root. MCP initialize now advertises the installed package version through resolveSignalintVersion(); the old hardcoded 0.4.2 discrepancy is fixed in 1.2.0.

Call check_project:

{ "paths": ["."] }

Or check_files:

{ "files": ["src/main.ts", "src/util.ts"] }

The file checker filters displayed issues to those paths. TypeScript can still compile the selected program; filtered-count aliases describe diagnostics removed by the display scope. Input paths are not native engine command-line arguments, and arbitrary priority/filter arguments are rejected.

Check results use schema 1.4. Inspect both status and engines: clean, issues_found, error, and stale have different meanings. All-disabled checks produce nothing_checked, not a successful clean native check. Settled native task failures can remain in status/engine data without isError: true. Thrown provider/engine failures now become classified tool errors with isError: true, code, engine, message, retryable and nextStep; these are a different response path.

By default the server uses its launch working directory. SIGNALINT_PROJECT_ROOT can select a canonical root; an invalid override logs a warning and falls back to the launch directory. Embedders can pass an explicit cwd option. Verify the effective root with ping.

The project must have recognized JS/TS ecosystem markers. Without signalint.config.json, MCP checks are refused unless SIGNALINT_ALLOW_UNINITIALIZED=1. Even with that override, a recognized project marker is still needed. Native engine configuration remains trusted executable context, not an OS sandbox.

Cache/session/project-mode TypeScript state defaults beneath .signalint/. SIGNALINT_STATE_DIR redirects supported state paths; do not share one override directory indiscriminately between unrelated projects.

Call get_issue_detail with a known ID and, when possible, its originating check:

{ "clusterId": "cluster-id", "checkId": "check-id" }

checkId is mandatory in 1.2.1; missing it is an invalid-arguments refusal, not latest-result lookup. An issue reference can be a full hash or returned short prefix. Multiple matching records are possible because issue IDs omit engine and column. Unknown, expired or unmatched references are stale; an older retained snapshot remains queryable.

In both and structured, successful detail mirrors the { "issues": [...] } wrapper in the first JSON text block and structured object. In text, it remains a serialized array. structured adds a second user-facing summary block. Normalized messages remain bounded—not the original unabridged engine messages.

  • Snapshots & edit verification: retention, semantic matching, scope and coverage limits.
  • Live & external diagnostics: LSP input shape, accumulated buffer behavior and the full live array.
  • get_live_diagnostics can enumerate latest internal/buffered issue IDs even when the check summary omitted flat records. It is not pagination of every historical snapshot.

Read preview & apply transactions before enabling apply. Preview supplies lengths rather than a unified diff. Apply performs path revalidation and SHA-256/content drift preflight, then sequential adjacent temp-file replacements with in-process best-effort rollback. It is not an all-files atomic commit or persistent crash journal. An optional supplied baseline is validated before writes; unknown/expired baselines refuse without consuming an active preview. Without a baseline, no delta is requested. Failed post-verification does not undo successful writes.

apply_diagnostic_fix advertises readOnlyHint: false, destructiveHint: true, and idempotentHint: false. Preview is non-idempotent in-memory preparation; discard mutates in-memory state. Other read-only annotations do not eliminate check artifacts or ingestion’s buffer mutation.

  • both (default): minified JSON text plus structured data, with the literal-pong exception; successful detail is wrapped consistently in both channels.
  • text: text only; advertised output schemas are omitted.
  • structured: the same JSON text fallback and structured object, plus a second user-facing summary. It is larger than both on the audited fixtures.

See payload modes for measured wire costs and compact-key limitations. Schema 1.4 describes native check summaries; it is not a version field present on every tool result.

Unknown tool names and non-object argument containers throw JSON-RPC -32602. Missing fields, unknown keys and path refusals are handled as tool-result refusals (isError: true) where caught by the server. This distinction is narrower than “all invalid arguments are protocol errors.”

Normal engine fan-out can preserve successful peers and return status: error; inspect engines as well as isError. Thrown check-provider failures are classified as engine_timeout (retryable), output_limit_exceeded, or engine_execution_failed, with actionable next steps. The engine-failure helper sanitizes wire messages with path/env/stack patterns; stderr still logs the original detail, and input/transaction errors are not all processed by that helper. No universal secret-redaction guarantee is implied. Check-request cancellation propagates to native providers/processes; it does not imply every tool, transaction write or rollback has equivalent cancellation semantics.

Source: tools.ts, toolArguments.ts, and createServer.ts.

Inputs are parsed by strict Zod objects; output schemas are advertised in both/structured modes and exercised by upstream Ajv tests and validating clients. The server’s low-level handlers do not add a per-tool Ajv validation gate for every return. Compact aliases and thrown post-apply verification remain known schema gaps; test the specific client/path rather than treating the release prose as a universal runtime guarantee.