TypeScript type context for AI coding assistants. Auto-injects type signatures into file reads, provides type error feedback on writes, and offers type lookup tools.
Full plugin with automatic type injection on file reads and MCP tools:
{
"plugin": ["@nick-vi/opencode-type-inject"]
}Or MCP server only (tools only, no auto-injection):
{
"mcp": {
"type-inject": {
"type": "local",
"command": ["npx", "-y", "@nick-vi/type-inject-mcp"]
}
}
}One-liner install (adds MCP server + hooks):
curl -fsSL https://raw.githubusercontent.com/nick-vi/type-inject/main/scripts/claude-install.sh | bashManual installation
1. Add the MCP server (provides lookup_type and list_types tools):
# Global (all projects)
claude mcp add type-inject -s user -- npx -y @nick-vi/type-inject-mcp
# Or project-only
claude mcp add type-inject -- npx -y @nick-vi/type-inject-mcp2. Add the hooks (type injection on reads, type checking on writes):
Add to your ~/.claude/settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "npx -y @nick-vi/claude-type-inject-hook"
}
]
},
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "npx -y @nick-vi/claude-type-inject-hook"
}
]
}
]
}
}Add to .cursor/mcp.json:
{
"mcpServers": {
"type-inject": {
"command": "npx",
"args": ["-y", "@nick-vi/type-inject-mcp"]
}
}
}When an LLM reads a TypeScript or Svelte file, this plugin automatically:
- Extracts type signatures (functions, types, interfaces, enums, classes, constants)
- Resolves imported types from other files (up to 4 levels deep)
- Applies smart filtering (only types actually used in the code)
- Enforces a token budget with priority-based ordering
- Injects the signatures as additional context
For partial file reads (with offset/limit), only types relevant to that section are injected.
When an LLM writes a TypeScript file, the hook runs type checking and reports errors:
TypeScript errors in the file you just wrote:
<file_diagnostics>
ERROR [5:2] Type 'string' is not assignable to type 'boolean'.
</file_diagnostics>
TypeScript errors in other project files:
<project_diagnostics>
src/utils.ts
ERROR [12:5] Property 'foo' does not exist on type 'User'.
</project_diagnostics>
This gives the LLM immediate feedback to fix type errors without manual intervention.
How it works:
- Only reports errors (not warnings or hints)
- Shows errors in the written file first (
<file_diagnostics>) - Shows errors in other project files (
<project_diagnostics>) - Limits: 20 errors per file, 5 files max for project diagnostics
- Requires a
tsconfig.jsonin the project (searches up from the file)
The plugin provides three tools:
lookup_type- Look up any type by name without reading fileslist_types- List all types in the projecttype_check- Run TypeScript type checking on the project or a specific file
When reading a file, the LLM receives additional context:
Type definitions referenced in this file but defined elsewhere:
<types count="3" tokens="~85">
function getUser(id: string): User // [offset=2,limit=8]
type User = { id: string; name: string; role: Role; }
type Role = { name: string; permissions: Permission[]; } // [filePath=./lib/role.ts]
</types>
For partial reads (with offset/limit), the description changes to "Type definitions referenced in this range..."
Types are prioritized by importance:
| Tier | Contents | Priority |
|---|---|---|
| 1 | Function signatures | ALWAYS included |
| 2 | Types used in function signatures | High |
| 3 | Dependencies of tier 2 types | Medium |
| 4 | Other local types | Low |
| 5 | Imported types not yet included | Lowest |
Types are automatically resolved from imported files up to 4 levels deep.
Only types actually used in the code are included. For partial file reads (with offset/limit), only types relevant to that section are injected.
Files that only contain export * from statements are skipped.
Svelte files (.svelte) are fully supported:
- Extracts types from both
<script lang="ts">(instance) and<script module lang="ts">(module) blocks - Resolves imports between Svelte and TypeScript files in any direction (TS → Svelte, Svelte → TS)
- Calculates correct line numbers for each script block
- Requires
svelteas an optional peer dependency (only loaded if installed)
| What | Shown As | Why |
|---|---|---|
| Functions | Signature only | Implementation can be long; signature tells you how to call it |
| Classes | Public members only | Private details are internal; public API is what matters |
| Types/Interfaces | Full definition | They ARE the definition - nothing hidden |
| Arrow functions | Only if explicitly typed | const fn: Type = ... is intentional API; const fn = () => {} is often implementation detail |
Since functions and classes only show signatures, we provide location hints so you can read the implementation when needed:
function processUser(id: string): User // [offset=15,limit=28]The format matches the read tool parameters directly - no translation needed.
// Direct import - you can see the import statement above
type User = { ... }
// Transitive import (2+ levels deep) - source not obvious
type Permission = { ... } // [filePath=./lib/permission.ts]Direct imports are visible in the file's import statements. Transitive imports aren't - so we include where they live for navigation and refactoring.
| Type | Local/Direct Import | Transitive Import (depth > 1) |
|---|---|---|
| function/class | // [offset=X,limit=Y] |
// [filePath=...,offset=X,limit=Y] |
| type/interface/enum | (none - full definition shown) | // [filePath=...] |
Both tools support TypeScript and Svelte files.
Look up type definitions by name (works with .ts, .tsx, and .svelte files).
Arguments:
name(required): Type name to search forexact(optional): Exact match or contains. Default: truekind(optional): Filter by kind (function, type, interface, enum, class, const)includeUsages(optional): Include files that import this type. Default: falselimit(optional): Maximum results. Default: 5
Output includes:
## TypeName (kind)
File: ./path/to/file.ts [offset=9,limit=50]
## CounterProps (type)
File: ./components/Counter.svelte [offset=6,limit=5]
The offset and limit match the read tool parameters for easy navigation.
List all type names in the project (includes both TypeScript and Svelte files).
Arguments:
kind(optional): Filter by kindlimit(optional): Maximum results. Default: 100
Run TypeScript type checking on the project or a specific file.
Arguments:
file(optional): File path to check. If omitted, checks the entire project.
Output:
TypeScript errors in the file you just wrote:
<file_diagnostics>
ERROR [5:2] Type 'string' is not assignable to type 'boolean'.
</file_diagnostics>
Or for project-wide check:
TypeScript errors in other project files:
<project_diagnostics>
src/utils.ts
ERROR [12:5] Property 'foo' does not exist on type 'User'.
</project_diagnostics>
Returns a success message if no errors are found.
This is a monorepo with four packages:
| Package | Description |
|---|---|
@nick-vi/type-inject-core |
Shared TypeScript extraction library |
@nick-vi/type-inject-mcp |
MCP server for TypeScript type lookup |
@nick-vi/claude-type-inject-hook |
Claude Code hooks (Read + Write) |
@nick-vi/opencode-type-inject |
OpenCode plugin |
MIT