Skip to main content
Glama
vola-trebla

tsconfig-inheritance-flattener-mcp

by vola-trebla
README.md
# 🔍 tsconfig-inheritance-flattener-mcp

[![npm](https://img.shields.io/npm/v/tsconfig-inheritance-flattener-mcp)](https://www.npmjs.com/package/tsconfig-inheritance-flattener-mcp)
[![CI](https://github.com/vola-trebla/tsconfig-inheritance-flattener-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/vola-trebla/tsconfig-inheritance-flattener-mcp/actions)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

**Your AI agent reads `tsconfig.json`. It has no idea what it actually means.**

MCP server that resolves the full TypeScript config inheritance chain and returns the **effective compiler options** that actually apply — including everything inherited from extended base configs, monorepo packages, and `node_modules` presets.

---

## 🤔 The problem

Your agent reads `tsconfig.json` and sees:

```json
{ "extends": "@tsconfig/strictest", "compilerOptions": { "paths": { "@/*": ["./src/*"] } } }
```

It has no idea that `@tsconfig/strictest` sets `strict: true`, `noUncheckedIndexedAccess: true`, `exactOptionalPropertyTypes: true`. It doesn't know that `baseUrl` is defined two levels up in your monorepo base config. So it:

- Suggests code that would fail `noUncheckedIndexedAccess`
- Gets confused about what `@/` resolves to
- Doesn't know your `target` is `ES2022`, not `ES5`
- Gives wrong answers about module resolution

The TypeScript compiler API already resolves all of this. This MCP just exposes it.

---

## 🛠️ Tools

### `get_effective_compiler_options`

Resolves the full `extends` chain and returns the merged compiler options that actually apply to a given `tsconfig.json`. Shows the inheritance chain, all merged options (with enums as readable strings, not magic numbers), and include/exclude patterns.

```
Effective TypeScript Configuration
  Config:            /project/apps/web/tsconfig.json
  Inheritance chain: /project/apps/web/tsconfig.json
                     → /project/tsconfig.base.json
                     → node_modules/@tsconfig/strictest/tsconfig.json

Compiler Options (merged):
  target: "ES2022"
  module: "NodeNext"
  moduleResolution: "NodeNext"
  strict: true
  noUncheckedIndexedAccess: true
  exactOptionalPropertyTypes: true
  baseUrl: "/project"
  paths: { "@/*": ["apps/web/src/*"] }
```

### `resolve_module_alias`

Maps a TypeScript path alias (e.g. `@/hooks/useAuth`) to its physical file location on disk, using the resolved `paths` and `baseUrl` from the tsconfig. Returns all existing candidates with extension probing.

```
Alias Resolution: @/hooks/useAuth
  Config:   /project/apps/web/tsconfig.json
  Base URL: /project

Resolved physical paths:
  /project/apps/web/src/hooks/useAuth.ts      ✓ exists
```

### `analyze_project_references`

Inspects the `references` array in a root `tsconfig.json` and validates that each referenced package has `composite: true`. Catches broken cross-package dependencies in TypeScript monorepos before they cause silent build failures.

```
Project References Analysis
  Config: /project/tsconfig.json
  References found: 2

  [✓] packages/shared → /project/packages/shared/tsconfig.json
  [✗ NOT FOUND] packages/deprecated → /project/packages/deprecated/tsconfig.json

Violations:
  ✗ packages/shared is referenced but does not have composite: true
    Fix: add "composite": true to packages/shared/tsconfig.json
```

---

## 🧪 What it looks like in practice

Agent is helping debug a TypeScript error and asks:

> "What compiler options are actually active in this project?"

Without this MCP, the agent guesses based on what it sees in `tsconfig.json`. With it:

```
get_effective_compiler_options("/project/apps/web/tsconfig.json")
→ strict: true, noUncheckedIndexedAccess: true, target: "ES2022", module: "NodeNext"
```

Now the agent knows exactly why `arr[0]` has type `string | undefined` and not just `string`. No more wrong suggestions.

---

## ⚡ Setup

```json
{
  "mcpServers": {
    "tsconfig-flattener": {
      "command": "npx",
      "args": ["-y", "tsconfig-inheritance-flattener-mcp"]
    }
  }
}
```

---

## 🚀 Usage

> "What compiler options actually apply to `/project/apps/web/tsconfig.json`? It extends a monorepo base and @tsconfig/strictest."

> "Where does `@/components/Button` resolve to on disk?"

> "Are the project references in my root tsconfig valid? Do all referenced packages have composite: true?"

Works great alongside:

- [ast-impact-mapper-mcp](https://www.npmjs.com/package/ast-impact-mapper-mcp) — for code→test correlation
- [release-readiness-triage-mcp](https://www.npmjs.com/package/release-readiness-triage-mcp) — for CI triage

---

## 📦 Links

- **npm:** [npmjs.com/package/tsconfig-inheritance-flattener-mcp](https://www.npmjs.com/package/tsconfig-inheritance-flattener-mcp)
- **GitHub:** [github.com/vola-trebla/tsconfig-inheritance-flattener-mcp](https://github.com/vola-trebla/tsconfig-inheritance-flattener-mcp)

## License

MIT

TDQS

A4.2/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct aspect of TypeScript configuration analysis, from compiler options to module resolution to emission structure. Even the two resolution-related tools are clearly differentiated: one maps path aliases, the other simulates the full resolution algorithm. No ambiguity.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (get_, resolve_, analyze_, explain_, simulate_, detect_). The verbs are all distinct and clearly describe the action, making the set highly predictable.

Tool Count5/5

With 6 tools, the server is well-scoped for its purpose—covering the essential operations for tsconfig inheritance and resolution without bloat. Each tool fills a specific need, and the count is appropriate for a utility server of this kind.

Completeness5/5

The toolset comprehensively covers the main pain points in TypeScript configuration: effective compiler options, alias resolution, project references, emission output, module resolution, and overlapping configs. There are no obvious gaps that would leave an agent stuck.

Maintenance

ActivityInactive
ResponsivenessUnresponsive