Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Whyts

by musatoktasversion 0.8.10i★ –iRuns on your computer
Registry nameio.github.musatoktas/whyts

Install

Overview

Description from the maker (original English)

Find out why a TypeScript project is slow: measured analysis and before/after comparison.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Developer tools

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

You need

  • npmNode.js installed (for the npx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "whyts": {
      "command": "npx",
      "args": [
        "-y",
        "whyts-mcp"
      ]
    }
  }
}

Run this in your terminal

claude mcp add whyts -- npx -y whyts-mcp

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "whyts": {
      "command": "npx",
      "args": [
        "-y",
        "whyts-mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "whyts": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "whyts-mcp"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account musatoktas, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Developer toolsi

  • More stars than 0% of the other 4927 servers in this category
  • Published to the registry more recently than 71% of the other 4927 servers in this category
  • Basic checks equal to or better than 100% of the other 4927 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Whyts safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.8.10) reached the registry 16 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Node.js on your computer.

What can I use instead?

In the same category: GitHub, Desktop Commander, Cloudflare MCP

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:↓ Downloads per weeki★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

GitHub

GitHub’s official server lets AI read and manage code, issues and pull requests in your account. Use GitHub’s hosted version or run it locally with Docker.

by githubWidely used★ 34.2KUpdated 5 days ago

Computer or cloud

Desktop Commander

MCP server for terminal commands, file operations, and process management

by wonderwhy-erWidely used↓ 709.6K/wk★ 10.2KUpdated 17 days ago

Runs on your computer

Cloudflare MCP

Cloudflare MCP servers

by cloudflareGrowing★ 4.4KUpdated 14 months ago

Runs in the cloud✓ mcp.cloudflare.com

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

whyts

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.

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.

Try it

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

npx whyts --project .

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

To run from a checkout:

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.

whyts 0.8.5 · TypeScript 5.9.3 · repro-project/tsconfig.json
  1. [measured] Recursive type instantiation: DeepKeys 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.

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

PatternTrace evidenceRemedy
recursive-type-instantiationA 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 itselfStop the expansion on a type that was visited, or add a depth limit
partial-constraintA TS2589 error at a type reference, and instantiateType_DepthLimit events inside a generic type. A type parameter of the referenced declaration has a constraint that gives that generic type fewer type arguments than it declares, so the omitted ones take their defaultsGive all type arguments in the constraint, for example any for each. If the constraint is in a dependency, tell its maintainers
instantiation-expressionA TS2589 error at a type reference to a type alias whose body is a conditional type, such as ReturnType or Parameters. A type argument is an instantiation expression (typeof f ), and the instantiateType_DepthLimit events are not inside that aliasWrite the conditional type in place, with the expression as the checked type. For ReturnType, the declared return type of f can be used instead
builder-chainA TS2589 error at the start of a chain of method calls, and instantiateType_DepthLimit events inside a class. The method called most often in the chain, followed back through variables, takes and returns that class, and is called at least 32 timesBuild the calls as separate values of at most 32 calls each, and join them with the same method. Cutting the chain into variables does not help
nested-declarationA TS2589 error at a type or at the name of a declaration, and instantiateType_DepthLimit events inside a generic type. Through type aliases, interfaces and typeof, the type reaches a value whose written type in a declaration file nests that generic type at least 8 levels deepWrite the data type by hand as named interfaces, and annotate the value in its source with a type that names them. If the declaration is in a dependency, tell its maintainers
callback-inferenceA check chain whose focus is a call that took 200 ms or more, and recorded type comparisons and nested checks cover at most 25% of it. The trace has no event for type argument inference. The call gives no type arguments, a generic declaration of the callee has a parameter whose type uses its type parameters, and the argument for it is a function with its own type: a name of a function, or a function whose parameters all have typesIn the declaration, wrap the whole parameter type (for a rest parameter, its element type) in NoInfer<...> (TypeScript 5.4 or later). At the call site, give the type argument, or pass an arrow function without parameter types. If the declaration is in a dependency, tell its maintainers
variance-computationgetVariancesWorker 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 timeReduce type parameters, simplify return types. An in or out annotation is not a guaranteed fix
program-loadThe 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 themUse 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):

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.
  • callback-inference is a match of the call shape and of the time that the trace does not explain. The trace has no event for inference, so whyts does not prove that inference is the cost. It reads only the syntax of the callee declarations and of the argument. It does not know which overload the compiler chose. A type parameter that is wrapped in NoInfer deep inside the parameter type still matches: in telegraf (#2016), that form did not change the time, and NoInfer around the whole element type did.
  • 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 tRPC fix is merged. The other 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.

ProjectWhat whyts foundResult
tRPC (#6997)TS2589 in Serialize (serialize.ts:35) when the type contains a recursive JSON type such as Prisma.JsonValueA fix in PR #7660, merged on 2026-10-19. 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)TS2589 in DeepKeys: the type alias refers to itself through DeepKeyAndValueArrayA fix in PR #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)TS2589 in QueryDeepPartialEntity (QueryPartialEntity.ts:17) for types that contain themselvesA fix in PR #12943. whyts reports the diagnosis before the change and reports none after it

| Vue (#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://githu

Only the beginning is shown; read the rest in the repo

Ask PopNx