Skip to main content
ClaudeWave

Find out why your TypeScript project is slow. Measured evidence from the real compiler, before/after compare, MCP server for AI agents.

MCP ServersRegistry oficial0 estrellas0 forks● JavaScriptMITActualizado today
ClaudeWave Trust Score
95/100
✓ Verified
Passed
  • ✓Open-source license (MIT)
  • ✓Actively maintained (<30d)
  • ✓Clear description
  • ✓Topics declared
  • ✓Documented (README)
Last scanned: 10/14/2026
Install in Claude Code / Claude Desktop
Method: NPX · whyts
Claude Code CLI
claude mcp add whyts -- npx -y whyts
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "whyts": {
      "command": "npx",
      "args": ["-y", "whyts"]
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
Casos de uso

Resumen de MCP Servers

# whyts

[![npm version](https://img.shields.io/npm/v/whyts)](https://www.npmjs.com/package/whyts)
[![CI](https://github.com/musatoktas/whyts/actions/workflows/ci.yml/badge.svg)](https://github.com/musatoktas/whyts/actions/workflows/ci.yml)
[![Node.js](https://img.shields.io/node/v/whyts)](https://nodejs.org)
[![License: MIT](https://img.shields.io/npm/l/whyts)](LICENSE)

**Find out why your TypeScript project is slow.**

A small CLI that turns compiler diagnostics, traces, and import relationships into evidence you can act on. It says where the check is slow, and for three known patterns it also says why and what to do. No account, API key, or LLM required.

```sh
npx whyts
```

Run it in the folder of your `tsconfig.json`. It runs the real compiler once and prints at most three actions. To prove that a type change helped, use `npx whyts compare` (see below). To give the same evidence to an AI coding agent, use `claude mcp add --transport stdio whyts -- npx -y whyts-mcp`.

Found with whyts: a 7.4 s type check that went to 0.06 s (TanStack Form) and `vue-tsc` going from 80 s to 0.56 s (Vue). See [Real cases](#real-cases).

![whyts terminal report](docs/demo.svg)

## Try it

Requires Node.js 20+ and a TypeScript project with dependencies installed.

```sh
npx whyts --project .
```

For repeatable runs, pin a version: `npx whyts@0.8.4 --project .`

To run from a checkout:

```sh
git clone https://github.com/musatoktas/whyts.git
cd whyts
npm ci --ignore-scripts
npm run demo
node src/cli.js --project /path/to/your/tsconfig.json
```

## Diagnoses and remedies

By default, whyts prints at most three actions and one summary line. Each action has a pattern, a location, a short remedy and a link. The image above is a recorded run. Use `--verbose` for the full report.

```text
whyts 0.8.4 · TypeScript 5.9.3 · repro-project/tsconfig.json

1. [measured] Recursive type instantiation: DeepKeys<Values>
   Where: k.ts:4:17
   TS2589 at this place: Type instantiation is excessively deep and possibly infinite.
   It hit the instantiation limit inside DeepKeysAndValuesImpl (../src/util-types.ts:151).
   DeepKeysAndValuesImpl refers to itself: DeepKeysAndValuesImpl -> DeepKeyAndValueArray -> DeepKeysAndValuesImpl.
   Type argument JsonData (k.ts:2): JsonData refers to itself.
   Fix: Stop the expansion of DeepKeysAndValuesImpl when it meets a type it already visited. Or add a depth limit to it. Check that the fix keeps the same results.
   Cost: 10082.6 ms, at most 98.8% of Check time (upper bound, not a saving)
   Docs: https://github.com/microsoft/TypeScript/wiki/Performance

Check 10.20s · Total 10.80s · 65 files · 1 compiler error · 2 findings in the full report. Use --verbose to see them.
```

Three patterns have a remedy. Each one was seen in a real project before it was added.

| Pattern | Trace evidence | Remedy |
| --- | --- | --- |
| `recursive-type-instantiation` | A TS2589 error and the `instantiateType_DepthLimit` events. whyts finds the type alias that owns the type parameters at the limit, a reference cycle by name between aliases, and a type argument that refers to itself | Stop the expansion on a type that was visited, or add a depth limit |
| `variance-computation` | `getVariancesWorker` events with the type id, the number of type parameters and the result. whyts reports the outermost events, the largest nested ones, and their union time | Reduce type parameters, simplify return types. An `in` or `out` annotation is not a guaranteed fix |
| `program-load` | The program is big, and the check is not. The compiler counters (Total time, Check time, Memory used, parse and bind time) and the import graph. whyts reports the files from `node_modules`, the largest packages, the file that brings most of them, and the `typeof import()` references that bring them | Use a narrower entry point, or ask the maintainers of the package to move the references to an opt-in entry point. `skipLibCheck` does not help: it skips checking, not loading |

A `program-load` action looks like this (`vuetify` 4.2.4, a project that only has `import { createVuetify } from "vuetify"`; the lines are shortened):

```text
1. [measured] Program load: 421 dependency files, vuetify has 407; Check time is 0.01s of 4.22s
   Where: ../node_modules/vuetify/lib/framework.d.ts:1:1
   The program has 480 files: 421 in node_modules (13.8 MB of source), 58 compiler library files and 1 of your own. ... Memory used 577 MB in the traced run.
   Largest packages by files: vuetify 407 (12 MB), @vuetify/v0 3 (0 MB), vue 2 (0 MB), ...
   409 of them (11.9 MB) come only through 218 typeof import() type references in ../node_modules/vuetify/lib/framework.d.ts, to ../node_modules/vuetify/lib/components/index.d.ts (192), ...
   Shortest import chain: index.ts -> ../node_modules/vuetify/lib/framework.d.ts -> ../node_modules/vuetify/lib/components/index.d.ts
   Fix: Each typeof import() reference in ... loads its target for every project that imports the package. Ask the maintainers to move them to an opt-in entry point. skipLibCheck skips checking these files, not loading them. ...
```

Rules:

- A diagnosis is `measured` when the compiler recorded it (the error or the trace events). The name-based walk over type aliases is syntax only: it can miss a cycle that runs through imports it cannot match by name, or through a type that is not a declaration of the program.
- The variance pattern needs 100 ms of union time in total, and only events of 50 ms or more count. It lists only types declared in the project. A type from a dependency gets no remedy, because the project cannot change it.
- The cost is the largest recorded interval for the place, shown as at most N% of Check time. It is an upper bound under tracing. It is not a predicted saving.
- In the compact report, a slow check without a known pattern shows only above 3% of Check time. A check that a diagnosis already explains by type name is not listed twice.
- The trace events exist in TypeScript 5.9, 6.0 and 7.0 (`instantiateType_DepthLimit`, `getVariancesWorker`). In TypeScript 7 they carry a `checkerId`, and whyts uses one checker, so the type ids stay unique.
- The `program-load` pattern needs all of these: 200 files or more from `node_modules`, a Total time of 1 s or more, a Check time of at most 1 s and at most 10% of the Total time, and one file that alone brings 100 files or more (and 25% of the dependency files). The compiler library files and your own files do not count as dependency files. A project with a normal amount of its own code has a larger Check time and does not match. The counters come from the traced run, where Memory used is higher than in a plain run.
- `program-load` is a measurement of the program, not of the check. It does not say that removing the files makes the check faster: the check time of such a program is already small. It reads `typeof import('pkg')` in declaration files as an import. A file that is also brought by a regular import is not counted as brought only by those references.
- Remedies are short instructions. They name a direction. whyts did not measure any remedy on your project.

## Real cases

whyts found the place in each case below. The fixes are open pull requests in those projects, so they are proposals until the maintainers merge them. The Vuetify row is a measurement in an issue, with no fix. Each number comes from my own measurement on the stated compiler version.

| Project | What whyts found | Result |
| --- | --- | --- |
| tRPC ([#6997](https://github.com/trpc/trpc/issues/6997)) | TS2589 in `Serialize` (`serialize.ts:35`) when the type contains a recursive JSON type such as `Prisma.JsonValue` | A fix in [PR #7660](https://github.com/trpc/trpc/pull/7660). The repro had TS2589 on main and has no error with the fix. Instantiations went from 89,700 to 78,502. The type-check time of `packages/server` did not change (within noise) |
| TanStack Form ([#1474](https://github.com/TanStack/form/issues/1474)) | TS2589 in `DeepKeys`: the type alias refers to itself through `DeepKeyAndValueArray` | A fix in [PR #2422](https://github.com/TanStack/form/pull/2422). Check time of the repro went from 7.4 s to 0.06 s (`whyts compare`, 10 runs, separated). `form-core` stayed within noise |
| TypeORM ([#8559](https://github.com/typeorm/typeorm/issues/8559)) | TS2589 in `QueryDeepPartialEntity` (`QueryPartialEntity.ts:17`) for types that contain themselves | A fix in [PR #12943](https://github.com/typeorm/typeorm/pull/12943). whyts reports the diagnosis before the change and reports none after it |
| Vue ([#14323](https://github.com/vuejs/core/issues/14323)) | `defineModel` with a `defineEmits` call signature that ends in `void` makes `OverloadUnionRecursive` (`@vue/shared`) run to the depth limit. It is 100% of the Check time | A fix in [PR #15851](https://github.com/vuejs/core/pull/15851). `vue-tsc` with 1, 2 and 3 emits went from 31.1, 55.3 and 80.0 s to 0.42, 0.49 and 0.56 s (TypeScript 5.9.3). A component with 40 overloads and a model still hits TS2589, as it did before |
| Hono ([#2399](https://github.com/honojs/hono/issues/2399)) | TS2589 in `JSONParsed` (`src/utils/types.ts:53`) with a recursive JSON type | A fix that stops at a visited type, in [issue #5543](https://github.com/honojs/hono/issues/5543). A depth limit made the `.d.ts` output 313,638 bytes; the fix keeps it at 762 bytes |
| node-redis ([#2975](https://github.com/redis/node-redis/issues/2975)) | 4.1 s of a 4.3 s check in one structural comparison of two `RedisClusterType` instantiations | Measurements from 4.7.0 to 6.3.0 in [a comment](https://github.com/redis/node-redis/issues/2975#issuecomment-6081025083) |
| Vuetify ([#23005](https://github.com/vuetifyjs/vuetify/issues/23005)) | One `import { createVuetify } from "vuetify"` makes a program of 480 files (tsc: Memory used 535,557K, Check time 0.01 s, Total time 2.56 s on 4.2.4). `program-load` names `lib/framework.d.ts`: its 218 `typeof import()` references (th
clicompilerdeveloper-toolsdiagnosticsmcpmodel-context-protocolperformancets2589tsctsconfigtsservertype-checkingtype-performancetypescript

Lo que la gente pregunta sobre whyts

¿Qué es musatoktas/whyts?

+

musatoktas/whyts es mcp servers para el ecosistema de Claude AI. Find out why your TypeScript project is slow. Measured evidence from the real compiler, before/after compare, MCP server for AI agents. Tiene 0 estrellas en GitHub y su última actualización registrada es del 2026-10-13.

¿Cómo se instala whyts?

+

Puedes instalar whyts clonando el repositorio (https://github.com/musatoktas/whyts) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.

¿Es seguro usar musatoktas/whyts?

+

Nuestro agente de seguridad ha analizado musatoktas/whyts y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.

¿Quién mantiene musatoktas/whyts?

+

musatoktas/whyts es mantenido por musatoktas. La última actividad registrada en GitHub es del 2026-10-13, con 0 issues abiertos.

¿Hay alternativas a whyts?

+

Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.

Despliega whyts en tu cloud

Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.

¿Mantienes este repo? Añade un badge a tu README

Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.

Featured on ClaudeWave: musatoktas/whyts
[![Featured on ClaudeWave](https://claudewave.com/api/badge/musatoktas-whyts)](https://claudewave.com/repo/musatoktas-whyts)
<a href="https://claudewave.com/repo/musatoktas-whyts"><img src="https://claudewave.com/api/badge/musatoktas-whyts" alt="Featured on ClaudeWave: musatoktas/whyts" width="320" height="64" /></a>

Más MCP Servers

Alternativas a whyts