Local stdio MCP server for cached, loop-aware JS/TypeScript diagnostics (Oxlint, tsc, Biome).
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Listed on:
Signalint is a local MCP server for JavaScript and TypeScript diagnostics. It runs
Oxlint, TypeScript, and optionally Biome; caches unchanged checks; clusters repeated
issues; and warns when the same diagnostic disappears and repeatedly returns.
Loop history is restored from valid .signalint/session.jsonl entries when the MCP
server restarts; malformed or crash-truncated lines are skipped.
tsconfig.jsonInstall Signalint in the project it should check:
Run the setup command from that project root. It detects TypeScript, Oxlint, and
Biome configuration, writes signalint.config.json, and offers to update a nearby
Claude Code, Cursor, Codex CLI, or Antigravity MCP configuration:
If no MCP client can be selected safely, the command prints exact configuration
snippets to copy. TypeScript is enabled only when a root tsconfig.json exists;
Biome is enabled when its config exists; Oxlint is the fallback when no configured
linter is detected. To configure Signalint manually, create signalint.config.json:
Run this from the checked project. Project scope writes a shareable .mcp.json:
On native Windows, wrap npx as required by Claude Code:
Restart Claude Code if it was already open. Ask it to call Signalint's ping tool,
then call check_project with { "paths": ["."] }.
See the Claude Code MCP documentation for scope and troubleshooting details.
Create .cursor/mcp.json in the checked project:
On native Windows use "command": "cmd" and
"args": ["/c", "npx", "--no-install", "signalint-mcp"]. Open Cursor's MCP
settings, enable signalint, and call ping followed by check_project.
See the Cursor MCP documentation for configuration locations and status controls.
The ChatGPT desktop app, Codex CLI, and IDE extension share a single
configuration file. The quick-add command writes to ~/.codex/config.toml
(global) automatically:
For project-scoped configuration (trusted projects only), add to
.codex/config.toml in the project root:
On native Windows, use cmd and pass npx as an argument:
See the Codex MCP documentation
for all configuration options including cwd, env, and per-tool approval
settings.
Antigravity uses its own MCP configuration file. The path that has been
verified through dogfooding on Windows is:
%USERPROFILE%\.gemini\antigravity\mcp_config.json.
The init command can update this file after confirmation. The equivalent
Windows configuration is:
On macOS or Linux, use "command": "npx" and
"args": ["--no-install", "signalint-mcp"]. Restart or reconnect Antigravity
after updating the configuration.
Note on Antigravity product variants: Antigravity has split into separate
products (IDE, CLI, SDK). Each variant may use a different config path β the
IDE path above is the one confirmed working; other variants may use
~/.gemini/config/mcp_config.json or a project-scoped .agents/mcp_config.json.
See antigravity.google/docs/mcp for
the authoritative list per product.
Windows .cmd shims created by npm link can expose a junction path to Node. If
signalint-mcp ends with an initialize/EOF error or signalint stats exits with
code 0 but prints nothing, bypass the shim with the compiled entrypoint paths:
Current builds canonicalize linked paths before deciding whether to start, but direct Node invocation remains the reliable fallback for older builds or unusual npm setups.
engines.oxlint, engines.tsc, and engines.biome are booleans. Defaults are
Oxlint and tsc enabled, Biome disabled. Omitted engine keys retain those defaults.
Unknown keys and incorrectly typed values fail with a configuration error.
ignore is an array of project-relative globs. Signalint supports *, **, and
?, normalizes Windows separators, and excludes matching requested paths and
diagnostics. Because tsc is a whole-program engine, it still receives the complete
tsconfig.json program when invoked; ignored TypeScript paths do not trigger an
incremental check_files run and their diagnostics are removed from the response.
Engine-native configuration remains in native files. The v1 cache hash recognizes
root .oxlintrc, .oxlintrc.json, oxlint.json, tsconfig.json, biome.json,
and biome.jsonc. Changing one invalidates the related engine cache. Other valid
sourcesβincluding .oxlintrc.jsonc, extended configs, and nested package configsβ
are not part of v1 cache hashing; clear .signalint/ after changing one of them.
timeoutsMs sets positive-integer subprocess deadlines in milliseconds. Defaults are
30 seconds for Oxlint, 120 seconds for tsc, and 30 seconds for Biome. A timed-out
engine and its child processes are terminated. In the schema 1.1 check response, that
engine has { "status": "error", "message": "tsc did not complete within 120s" }
under engines, while completed engines' diagnostics are preserved.
tsconfig.json at the project root. Monorepos must
provide a solution-style root config using TypeScript Project References;
Signalint does not auto-discover independent package configs.check_files treats only the files explicitly passed to that call as relevant to
TypeScript cache invalidation. If file A changes but is omitted while unchanged file
B is checked, and B depends on A, Signalint can reuse a stale tsc result. Include
every changed dependency file or run check_project; dependency-graph-based
invalidation is not implemented in v1.ping checks that the local server is connected and returns pong.check_project accepts optional { "paths": ["."] } and returns clustered diagnostics.check_files accepts { "files": ["src/file.ts"] } and uses incremental caching.get_issue_detail accepts exactly one clusterId or issueId from the latest
successful check and returns its full issues, or a status: "stale" response.get_loop_status returns issue signatures currently flagged as oscillating.Cache and session artifacts are written under .signalint/ and should not be committed.
Run the same project check without an MCP client:
After MCP checks have accumulated in .signalint/session.jsonl, print the Phase 6
measurement summary:
The report includes average normalized-raw-to-clustered JSON payload reduction,
engine-file cache hit rate, average and maximum check latency, and the number of
distinct issue signatures that triggered loop warnings. An engine-file lookup counts
each enabled engine separately, so one changed TypeScript file can miss once for
Oxlint and once for tsc. Latency covers handler work from MCP tool entry through
engine/cache work, clustering, and loop evaluation; it excludes the telemetry append
and stdio transport. Statistics include the active session log and its rotated .1
backup, with their retained overlap counted once. Clean checks with zero raw payload are excluded from the
reduction average, and older checks with missing metrics remain counted without
contributing to the unavailable aggregate.
The CLI exits with code 1 when issues are found. Two flags support CI use:
--format github prints one GitHub Actions annotation
(::error file=...,line=...,col=...::message or ::warning ...) per issue
instead of JSON, and --fail-on-priority <N> exits non-zero only if a
cluster's priority is at or below N instead of on any issue found.
To exercise an actual MCP check_project call against the installed package,
run:
action.yml at the repository root wraps signalint check as a composite
action for CI. It installs Node, installs signalint-mcp from npm, and runs
the check with --format github so issues appear as inline annotations on
the pull request diff:
fail-on-priority defaults to 5, which fails the job on any issue found,
matching signalint check's default behavior without the flag. Lower values
only fail the job when a cluster is at least that urgent: priority 1 is an
error with no structured fix, and priority increases toward 5 as issues
become more fixable or more systemic (see scorePriority in
src/cluster/clusterEngine.ts).
pnpm 11.9.0 is the canonical package manager for source development. The repository
commits pnpm-lock.yaml, declares pnpm in package.json, and uses pnpm in CI.
If a global npm shim cannot find npm-cli.js, build directly with node node_modules/typescript/bin/tsc -p tsconfig.json.
Before preparing a release, use npm pack --dry-run and verify the packed tarball
in a clean project. Publishing requires explicit release approval.
See SECURITY.md for the current npm audit advisory, its evaluated runtime reachability, and the conditions that require reassessment.
Signalint is available under the MIT License.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/signalint)<a href="https://allmcps.com/mcp/signalint"><img src="https://allmcps.com/api/badge/signalint?style=directory" alt="Signalint on AllMCPs" /></a>