Signalint
About
Compact, cached, loop-aware lint/type diagnostics for JS/TS coding agents. Wraps Oxlint, tsc, and Biome.
Details
- Author
- tranqui004
- Categories
- Developer Tools
Jump to
Setup
Install Signalint in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/tranqui004/signalint
Follow the installation instructions in the repository README, then restart your MCP client.
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.jsonlentries when the MCP server restarts; malformed or crash-truncated lines are skipped.
-
- mcpservers.org
- Official MCP Registry (API listing)
When a coding agent requests diagnostics on a project, raw compiler and linter outputs quickly flood the context window with repetitive errors across multiple files. Signalint normalizes issues and clusters them by root cause before returning a bounded, priority-ranked response:
Raw diagnostics (40 issues across 10 files · 9,151 bytes)
[ { "issueId": "ts-01", "file": "src/file01.ts", "line": 10, "col": 5, "engine": "tsc", "rule": "TS2322", "severity": "error", "message": "Type 'string' is not assignable to type 'number' in fixture assignment 01.", "fixable": false }, // ... 39 more raw normalized issues ]
Clustered response returned to agent (4 clusters · 1,233 bytes · 86.5% reduction)
{ "schemaVersion": "1.1", "status": "issues_found", "engines": { "oxlint": { "status": "ok" }, "tsc": { "status": "ok" }, "biome": { "status": "disabled" } }, "totalIssues": 40, "clusters": [ { "clusterId": "c1", "rootCauseSummary": "10 TS2322 issues across 10 files", "ruleIds": ["TS2322"], "issueCount": 10, "fileCount": 10, "priority": 1, "suggestedAction": "Review the shared cause of TS2322 across 10 files", "sampleIssueIds": ["ts-01", "ts-02"] }, { "clusterId": "c2", "rootCauseSummary": "10 no-unused-vars issues across 10 files", "ruleIds": ["no-unused-vars"], "issueCount": 10, "fileCount": 10, "priority": 2, "suggestedAction": "Review the shared cause of no-unused-vars across 10 files", "sampleIssueIds": ["unused-01", "unused-02"] }, { "clusterId": "c3", "rootCauseSummary": "10 eqeqeq issues across 10 files", "ruleIds": ["eqeqeq"], "issueCount": 10, "fileCount": 10, "priority": 5, "suggestedAction": "Apply structured fixes for eqeqeq across 10 files", "sampleIssueIds": ["eqeqeq-01", "eqeqeq-02"] }, { "clusterId": "c4", "rootCauseSummary": "10 prefer-const issues across 10 files", "ruleIds": ["prefer-const"], "issueCount": 10, "fileCount": 10, "priority": 5, "suggestedAction": "Apply structured fixes for prefer-const across 10 files", "sampleIssueIds": ["const-01", "const-02"] } ], "truncated": false, "loopWarning": null }
The agent receives a concise summary with priority-ordered clusters and sample issue IDs. When deeper detail is needed for a specific cluster or issue, the agent callsget_issue_detailwithout re-running the whole-project scan.
- Node.js 20.19 or later in the Node 20 line, or Node.js 22.12 or later
- A JavaScript or TypeScript project; TypeScript checks require atsconfig.json
- pnpm 11.9.0 for source development
Install Signalint in the project it should check:
Run the setup command from that project root. It detects TypeScript, Oxlint, and Biome configuration, writessignalint.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 roottsconfig.jsonexists; Biome is enabled when its config exists; Oxlint is the fallback when no configured linter is detected. To configure Signalint manually, createsignalint.config.json:
{ "engines": { "oxlint": true, "tsc": true, "biome": false }, "ignore": ["node_modules/", "dist/", ".signalint/"], "timeoutsMs": { "oxlint": 30000, "tsc": 120000, "biome": 30000 } }
Run this from the checked project. Project scope writes a shareable.mcp.json:
claude mcp add --scope project signalint -- npx --no-install signalint-mcp claude mcp get signalint
On native Windows, wrapnpxas required by Claude Code:
claude mcp add --scope project signalint -- cmd /c npx --no-install signalint-mcp claude mcp get signalint
Restart Claude Code if it was already open. Ask it to call Signalint'spingtool, then callcheck_projectwith{ "paths": ["."] }.
See theClaude Code MCP documentationfor scope and troubleshooting details.
Create.cursor/mcp.jsonin the checked project:
{ "mcpServers": { "signalint": { "command": "npx", "args": ["--no-install", "signalint-mcp"] } } }
On native Windows use"command": "cmd"and"args": ["/c", "npx", "--no-install", "signalint-mcp"]. Open Cursor's MCP settings, enablesignalint, and callpingfollowed bycheck_project.
See theCursor MCP documentationfor 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:
codex mcp add signalint -- npx --no-install signalint-mcp
For project-scoped configuration (trusted projects only), add to.codex/config.tomlin the project root:
[mcp_servers.signalint] command = "npx" args = ["--no-install", "signalint-mcp"]
On native Windows, usecmdand passnpxas an argument:
[mcp_servers.signalint] command = "cmd" args = ["/c", "npx", "--no-install", "signalint-mcp"]
Antigravity uses its own MCP configuration file. The path that has been verified through dogfooding on Windows is:%USERPROFILE%\.gemini\antigravity\mcp_config.json.
Theinitcommand can update this file after confirmation. The equivalent Windows configuration is:
{ "mcpServers": { "signalint": { "command": "cmd", "args": ["/c", "npx", "--no-install", "signalint-mcp"], "cwd": "<absolute-path-to-your-project>" } } }
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.jsonor a project-scoped.agents/mcp_config.json. Seeantigravity.google/docs/mcpfor the authoritative list per product.
Windows.cmdshims created bynpm linkcan expose a junction path to Node. Ifsignalint-mcpends with an initialize/EOF error orsignalint statsexits with code 0 but prints nothing, bypass the shim with the compiled entrypoint paths:
node C:\absolute\path\to\Signalint\dist\src\index.js node C:\absolute\path\to\Signalint\dist\src\cli.js stats
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, andengines.biomeare 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.
ignoreis 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 completetsconfig.jsonprogram when invoked; ignored TypeScript paths do not trigger an incrementalcheck_filesrun 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, andbiome.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.
timeoutsMssets 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" }underengines, while completed engines' diagnostics are preserved.
- Signalint supports JavaScript and TypeScript projects only.
- The built-in engines are Oxlint, TypeScript, and Biome; v1 does not support arbitrary custom engines.
- Signalint reports whether an issue has a structured fix, but v1 does not apply fixes.
- Signalint is not a SAST or security scanner.
- There is no IDE extension yet; integrations use MCP or the command-line client.
- Loop detection is deliberately limited to lint, type, and test issue signatures; it does not detect general agent-conversation loops.
- The tsc adapter requires onetsconfig.jsonat the project root. Monorepos must provide a solution-style root config using TypeScript Project References; Signalint does not auto-discover independent package configs.
- check_filestreats 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 runcheck_project; dependency-graph-based invalidation is not implemented in v1.
- pingchecks that the local server is connected and returnspong.
- check_projectaccepts optional{ "paths": ["."] }and returns clustered diagnostics.
- check_filesaccepts{ "files": ["src/file.ts"] }and uses incremental caching.
- get_issue_detailaccepts exactly oneclusterIdorissueIdfrom the latest successful check and returns its full issues, or astatus: "stale"response.
- get_loop_statusreturns 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.1backup, 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 githubprints one GitHub Actions annotation (::error file=...,line=...,col=...::messageor::warning ...) per issue instead of JSON, and--fail-on-priority <N>exits non-zero only if a cluster's priority is at or belowNinstead of on any issue found.
To exercise an actual MCPcheck_projectcall against the installed package, run:
node node_modules/signalint-mcp/examples/check-project.mjs .
action.ymlat the repository root wrapssignalint checkas a composite action for CI. It installs Node, installssignalint-mcpfrom npm, and runs the check with--format githubso issues appear as inline annotations on the pull request diff:
- uses: TranQui004/signalint@main with: fail-on-priority: "3"
fail-on-prioritydefaults to5, which fails the job on any issue found, matchingsignalint 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 (seescorePriorityinsrc/cluster/clusterEngine.ts).
pnpm 11.9.0 is the canonical package manager for source development. The repository commitspnpm-lock.yaml, declares pnpm inpackage.json, and uses pnpm in CI.
pnpm install --frozen-lockfile pnpm lint pnpm typecheck pnpm test pnpm build
If a global npm shim cannot findnpm-cli.js, build directly withnode node_modules/typescript/bin/tsc -p tsconfig.json.
Before preparing a release, usenpm pack --dry-runand verify the packed tarball in a clean project. Publishing requires explicit release approval.
- Website— overview, docs, and live examples.
- ARCHITECTURE.md— how the layers fit together and what each module does.
- CONTRIBUTING.md— development setup, verification, and pull requests.
- AGENTS.md— coding standards for this repository.
- SECURITY.md— threat model, trust boundaries, and audit status.
- CHANGELOG.md— notable changes by release.
- docs/history/— original build plan and pre-launch audit trail.
Signalint is available under theMIT License.
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
Create crafted UI components inspired by the best 21st.dev design engineers.
Bring agent evaluations, observability, and synthetic test set generation directly into your IDE for free with Galileo's new MCP server
An MCP server to help AI assistants to answer questions and generate AccelByte Extend SDK code more effectively .
MCP server for AI Diagram Maker — generate beautiful software engineering diagrams directly inside Cursor, Claude Desktop, Claude Code, or any MCP-compatible AI agent
ALAPI MCP Tools,Call hundreds of API interfaces via MCP
AI-powered SVG animation generator that transforms static files into animated SVG components using the Allyson platform
MCP server that gives AI assistants on-demand access to 1,500+ amCharts docs, ~300 code examples, and 1000+ class API references.
APIMatic MCP Server is used to validate OpenAPI specifications using APIMatic. The server processes OpenAPI files and returns validation summaries by leveraging APIMatic’s API.
One shared context layer for AI agents and humans — live API specs, DB schemas, and versioned contracts across repos so every agent and teammate works from the same source of truth.
Build and deploy full-stack Next.js apps with 98 tools for React, AWS, and MongoDB
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





