ts-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ts-mcp-serverrename 'myVar' to 'newVar'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ts-mcp-server
A lightweight Model Context Protocol (MCP) server for TypeScript and JavaScript refactoring and code intelligence. Every tool maps directly to a tsserver protocol command — the output is the raw, unmodified response from TypeScript's compiler. Rename symbols, extract functions, move declarations between files, reorganize imports, navigate type hierarchies, explore call graphs, search symbols across your workspace, map AI-generated code into the right locations, discover which error codes have automatic fixes, and more — with every import, require, re-export, and reference updated automatically across your entire codebase.
Why
AI coding assistants can read and write code, but they struggle with structural changes that ripple across many files. Renaming a function, extracting a helper, moving a React component, or reorganizing a folder means updating every reference and import that touches it. Miss one and the build breaks.
ts-mcp-server gives any MCP-compatible client — VS Code Copilot, Claude Desktop, Cursor, Windsurf, Continue, and others — the ability to perform these refactors correctly and completely, using TypeScript's own compiler infrastructure.
Related MCP server: TypeScript Tools MCP
Features
40 tools — each a 1:1 mapping to a native
tsserverprotocol command
Refactoring (14 tools)
Rename symbols — variables, functions, classes, types, properties, interfaces, enums — all references updated across every file
Rename / move files and folders — all import paths updated automatically
Extract function — extract a code range into a new function with auto-detected parameters and return type
Extract constant — extract an expression into a named constant with inferred type
Extract type — extract an inline type annotation into a named type alias
Infer return type — add an explicit return type annotation to a function, inferred by TypeScript
Move symbol — move top-level declarations to another file, all imports rewired automatically
Inline variable — replace all references with the variable's initializer and delete the declaration
Organize imports — sort, coalesce, and remove unused imports
Format — format a range of code according to TypeScript's formatting rules
Get code fixes — retrieve available auto-fixes for specific diagnostics (missing imports, type mismatches, etc.)
Get combined code fix — apply a fix-all action for a specific error code across a file
Get diagnostics — retrieve type errors, warnings, and suggestions for any file
Find all references — locate every usage of a symbol across the project
Map code — map AI-generated code snippets into a file, replacing matching declarations by name or appending new ones
Get supported code fixes — list every error code that has an available automatic fix, optionally scoped to a project
Code Intelligence (24 tools)
Quick info — full type information, documentation, and JSDoc tags for any symbol (hover info)
Navigation tree — complete hierarchical structure of a file (all declarations and their nesting)
Go to definition — jump to where a symbol is declared
Definition and bound span — like definition, but also returns the text span of the queried symbol
Find source definition — navigate to actual TypeScript source instead of
.d.tsdeclaration filesGo to type definition — jump to the type's definition, not the variable's declaration
Go to implementation — find concrete implementations of an interface or abstract class
Navigate to symbol — workspace-wide symbol search by name
File references — find every file that imports a given file (reverse dependency graph)
Prepare call hierarchy — get call hierarchy entry point for a function/method
Incoming calls — find all callers of a function ("who calls this?")
Outgoing calls — find all callees of a function ("what does this call?")
Project info — get tsconfig.json path, file list, and language service status
Completion info — autocomplete suggestions at a position
Completion entry details — full documentation and type signature for a completion item
Signature help — function parameter info and overloads at a call site
Document highlights — all occurrences of a symbol within a file, with read/write distinction
Get applicable refactors — discover what refactorings are available at a position or selection
Selection range — get semantically meaningful selection ranges for smart expand/shrink selection
Move to refactoring suggestions — get suggested target files when moving a symbol
Doc comment template — generate JSDoc comment template for a function/method
Outlining spans — get foldable regions in a file
Inlay hints — get inlay hints (parameter names, inferred types) for a range
TODO comments — find all TODO/FIXME/HACK comments in a file
Design Principles
Pure tsserver output — every tool returns the raw, unmodified
tsserverresponse as JSONPreview mode — see exactly what would change before applying anything
Automatic project discovery —
tsconfig.jsonis detected automatically; no configuration neededMulti-project support — monorepos, project references, and composite builds work out of the box
Cross-platform — Windows, macOS, and Linux
How It Works
Under the hood, ts-mcp-server communicates with TypeScript's tsserver over Node IPC — the same protocol that VS Code uses. Every tool is a thin wrapper that:
Passes your input directly to a
tsserverprotocol commandReturns the raw response — no formatting, no grouping, no filtering
Refactoring tools:
Tool | tsserver command(s) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code intelligence tools:
Tool | tsserver command |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There is no regex, no custom path resolution, no heuristics, no output formatting. The TypeScript compiler does all the work.
Quick Start
Install
npx ts-mcp-serverConfigure Your MCP Client
Add ts-mcp-server to your client's MCP configuration.
VS Code (.vscode/mcp.json):
{
"servers": {
"ts-mcp-server": {
"command": "npx",
"args": ["ts-mcp-server"]
}
}
}Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"ts-mcp-server": {
"command": "npx",
"args": ["ts-mcp-server"]
}
}
}Cursor, Windsurf, Continue — follow each client's MCP server documentation using the same npx ts-mcp-server command.
Disabling Individual Tools
Every tool can be disabled individually by setting its name to "false" in the env block of your MCP configuration. Tools are enabled by default; only tools explicitly set to "false" are skipped at startup.
VS Code (.vscode/mcp.json):
{
"servers": {
"ts-mcp-server": {
"command": "npx",
"args": ["ts-mcp-server"],
"env": {
"todoComments": "false",
"getOutliningSpans": "false",
"docCommentTemplate": "false"
}
}
}
}Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"ts-mcp-server": {
"command": "npx",
"args": ["ts-mcp-server"],
"env": {
"todoComments": "false",
"getOutliningSpans": "false",
"docCommentTemplate": "false"
}
}
}
}The tool name in env must exactly match the tool name as listed in the Tool Reference below (e.g., "quickinfo", "getDiagnostics", "extractFunction"). Any other value — including omitting the key entirely — leaves the tool enabled.
Tool Reference
rename
Rename a TypeScript/JavaScript symbol and update all references across the project.
Parameter | Type | Required | Description |
|
| ✅ | File path containing the symbol (absolute or relative to cwd) |
|
| ✅ | 1-based line number where the symbol appears |
|
| ✅ | 1-based character offset on the line |
|
| ✅ | New name for the symbol |
|
| ✅ | If |
Examples:
rename file="src/utils/helpers.ts" line=5 offset=17 newName="formatCurrency"
rename file="src/components/Button.tsx" line=10 offset=17 newName="PrimaryButton"
rename file="src/types.ts" line=3 offset=11 newName="UserProfile"
rename file="src/utils/helpers.ts" line=5 offset=17 newName="formatCurrency" preview=truerenameFileOrDirectory
Rename or move a TypeScript/JavaScript file or directory and update all import paths across the project.
Parameter | Type | Required | Description |
|
| ✅ | Current file or directory path (absolute or relative to cwd) |
|
| ✅ | New file or directory path (absolute or relative to cwd) |
|
| ✅ | If |
Examples:
renameFileOrDirectory from="src/utils/helpers.ts" to="src/utils/string-helpers.ts"
renameFileOrDirectory from="src/Button.tsx" to="src/components/ui/Button.tsx"
renameFileOrDirectory from="src/components/primitives" to="src/components/ui"
renameFileOrDirectory from="src/old-name.ts" to="src/new-name.ts" preview=truereferences
Find all usages of a symbol across the project.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number where the symbol appears |
|
| ✅ | 1-based character offset on the line |
Examples:
references file="src/utils/helpers.ts" line=5 offset=17
references file="src/types.ts" line=3 offset=11getDiagnostics
Get all errors, warnings, and suggestions for a file. Returns semantic diagnostics and suggestion diagnostics as separate arrays.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
Examples:
getDiagnostics file="src/utils/helpers.ts"
getDiagnostics file="src/components/Button.tsx"Note: Unused-code diagnostics (unused variables, unused imports) only appear if your
tsconfig.jsonhasnoUnusedLocalsand/ornoUnusedParametersenabled.
organizeImports
Sort, coalesce, and remove unused imports in a file.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | If |
Examples:
organizeImports file="src/utils/helpers.ts"
organizeImports file="src/components/Button.tsx" preview=truegetCodeFixes
Get available code fixes for specific error codes at a range in a file. Use getDiagnostics first to discover error codes and ranges, then pass them here.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the diagnostic range |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the diagnostic range |
|
| ✅ | 1-based end character offset |
|
| ✅ | Diagnostic error codes to get fixes for |
Examples:
# Get fixes for a "Cannot find name" error (code 2304) at line 10
getCodeFixes file="src/app.ts" startLine=10 startOffset=1 endLine=10 endOffset=20 errorCodes=[2304]
# Get fixes for multiple error codes
getCodeFixes file="src/app.ts" startLine=5 startOffset=1 endLine=5 endOffset=30 errorCodes=[2304, 2552]getCombinedCodeFix
Get a combined code fix that applies all instances of a fix across a file in one action. Returns the full set of file edits as a CombinedCodeActions response. Use getCodeFixes first to discover available fixId values, then pass the fixId here to get the combined fix for the whole file.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | The fixId from a code fix (e.g., |
Examples:
# Get the combined "add all missing imports" fix for a file
getCombinedCodeFix file="src/app.ts" fixId="fixMissingImport"
# Get the combined "remove all unused variables" fix for a file
getCombinedCodeFix file="src/app.ts" fixId="unusedIdentifier"extractFunction
Extract a selected code range into a new function. TypeScript auto-detects parameters and return type. The response includes renameFilename / renameLocation so you can follow up with rename to give the function a meaningful name.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the selection |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the selection |
|
| ✅ | 1-based end character offset |
|
| ✅ | If |
Examples:
# Extract lines 10-15 into a function
extractFunction file="src/app.ts" startLine=10 startOffset=1 endLine=15 endOffset=1
# Preview the extraction
extractFunction file="src/app.ts" startLine=10 startOffset=1 endLine=15 endOffset=1 preview=trueextractConstant
Extract a selected expression into a named constant. TypeScript infers the type. The response includes renameFilename / renameLocation so you can follow up with rename to give the constant a meaningful name.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the expression |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the expression |
|
| ✅ | 1-based end character offset |
|
| ✅ | If |
Examples:
# Extract an expression into a constant
extractConstant file="src/app.ts" startLine=8 startOffset=12 endLine=8 endOffset=35
# Preview the extraction
extractConstant file="src/app.ts" startLine=8 startOffset=12 endLine=8 endOffset=35 preview=truemoveSymbol
Move top-level declarations (functions, classes, types, constants) to another file. All imports across the project are rewired automatically. If the target file doesn't exist, tsserver creates it.
Parameter | Type | Required | Description |
|
| ✅ | Source file path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the declaration |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the declaration |
|
| ✅ | 1-based end character offset |
|
| ✅ | Destination file path (absolute or relative to cwd) |
|
| ✅ | If |
Examples:
# Move a function to a utility file
moveSymbol file="src/app.ts" startLine=20 startOffset=1 endLine=35 endOffset=2 targetFile="src/utils/helpers.ts"
# Move a type to a shared types file
moveSymbol file="src/components/Button.tsx" startLine=1 startOffset=1 endLine=5 endOffset=2 targetFile="src/types.ts"
# Preview the move
moveSymbol file="src/app.ts" startLine=20 startOffset=1 endLine=35 endOffset=2 targetFile="src/utils/helpers.ts" preview=trueinlineVariable
Inline a variable — replace all references with the variable's initializer and delete the declaration. Position must be on the variable name in its declaration or any usage.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number of the variable |
|
| ✅ | 1-based character offset on the line |
|
| ✅ | If |
Examples:
# Inline a variable
inlineVariable file="src/app.ts" line=12 offset=7
# Preview the inlining
inlineVariable file="src/app.ts" line=12 offset=7 preview=trueextractType
Extract an inline type annotation into a named type alias. Select the type span to extract. The response includes renameFilename / renameLocation so you can follow up with rename to give the type a meaningful name.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the type span |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the type span |
|
| ✅ | 1-based end character offset |
|
| ✅ | If |
Examples:
# Extract an inline object type into a type alias
# Given: function process(user: { id: number; name: string }) { ... }
# Select the span "{ id: number; name: string }"
extractType file="src/app.ts" startLine=5 startOffset=26 endLine=5 endOffset=56
# Preview the extraction
extractType file="src/app.ts" startLine=5 startOffset=26 endLine=5 endOffset=56 preview=trueinferReturnType
Add an explicit return type annotation to a function, inferred by TypeScript. Position must be on the function name or declaration keyword (function, async, arrow function variable name).
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number of the function |
|
| ✅ | 1-based character offset on the line |
|
| ✅ | If |
Examples:
# Add return type to a function that currently has none
# Given: function greet(name: string) { return `Hello, ${name}!`; }
# After: function greet(name: string): string { return `Hello, ${name}!`; }
inferReturnType file="src/app.ts" line=10 offset=10
# Preview the change
inferReturnType file="src/app.ts" line=10 offset=10 preview=truequickinfo
Get the full type information, documentation, and JSDoc tags for the symbol at a given position. This is the "hover" info.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
quickinfo file="src/utils/helpers.ts" line=5 offset=17
quickinfo file="src/types.ts" line=3 offset=11navtree
Get the complete hierarchical structure of a file — all classes, functions, variables, interfaces, type aliases, enums, and their nesting.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
Examples:
navtree file="src/utils/helpers.ts"
navtree file="src/components/Button.tsx"definition
Go to the definition of a symbol. Returns the file location(s) where the symbol is declared.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
definition file="src/app.ts" line=10 offset=5
definition file="src/components/Button.tsx" line=3 offset=15typeDefinition
Navigate to the type's definition, not the variable's declaration. Given const user: UserProfile = ..., definition goes to the variable, but typeDefinition goes to the UserProfile interface.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
typeDefinition file="src/app.ts" line=10 offset=12
typeDefinition file="src/services/api.ts" line=5 offset=8implementation
Find concrete implementations of an interface or abstract class. Given an interface Serializable, returns every class that implements it.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
implementation file="src/types.ts" line=1 offset=18
implementation file="src/interfaces/repository.ts" line=3 offset=18navto
Workspace-wide symbol search by name. Takes a search string and returns matching symbols across all project files with their locations and kinds.
Parameter | Type | Required | Description |
|
| ✅ | Symbol name or prefix to search for |
|
| — | Optional file for project context (absolute or relative to cwd) |
|
| — | Maximum number of results to return |
|
| — | If |
Examples:
navto searchValue="User" file="src/app.ts"
navto searchValue="handle" file="src/app.ts" maxResultCount=10
navto searchValue="Button" file="src/components/Button.tsx" currentFileOnly=truefileReferences
Find every file that imports or references a given file. The reverse dependency graph for a single file.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
Examples:
fileReferences file="src/utils/helpers.ts"
fileReferences file="src/types.ts"prepareCallHierarchy
Get the call hierarchy item(s) at a position — the entry point for call hierarchy queries. Returns the function/method name, kind, file location, and spans.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
prepareCallHierarchy file="src/services/api.ts" line=10 offset=17
prepareCallHierarchy file="src/utils/helpers.ts" line=5 offset=17provideCallHierarchyIncomingCalls
Find all functions/methods that call the function at the given position. Answers "who calls this?"
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
provideCallHierarchyIncomingCalls file="src/services/api.ts" line=10 offset=17
provideCallHierarchyIncomingCalls file="src/utils/helpers.ts" line=5 offset=17provideCallHierarchyOutgoingCalls
Find all functions/methods that the function at the given position calls. Answers "what does this call?"
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
provideCallHierarchyOutgoingCalls file="src/services/api.ts" line=10 offset=17
provideCallHierarchyOutgoingCalls file="src/utils/helpers.ts" line=5 offset=17projectInfo
Get the tsconfig.json path, the full list of files in the project, and whether the language service is active.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| — | If |
Examples:
projectInfo file="src/app.ts"
projectInfo file="src/app.ts" needFileNameList=falsecompletionInfo
Get autocomplete suggestions at a position. Returns all possible completions with their kinds, sort text, and insert text. Useful for understanding what symbols, methods, or properties are available at a location.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
|
| — | Optional prefix to filter completions |
|
| — | Character that triggered completion (e.g., |
Examples:
completionInfo file="src/app.ts" line=10 offset=15
completionInfo file="src/app.ts" line=10 offset=15 prefix="get"
completionInfo file="src/app.ts" line=10 offset=15 triggerCharacter="."completionEntryDetails
Get full details for specific completion entries — documentation, full type signature, JSDoc tags, and code actions (like auto-imports). Use as a follow-up to completionInfo.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
|
| ✅ | Names of completion entries to get details for |
Examples:
completionEntryDetails file="src/app.ts" line=10 offset=15 entryNames=["map","filter"]
completionEntryDetails file="src/app.ts" line=5 offset=10 entryNames=["useState"]signatureHelp
Get function/method signature information at a call site. Returns parameter names, types, and documentation for each overload. Use when the cursor is inside function call parentheses.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset (inside the function call parentheses) |
|
| — | Optional: |
Examples:
signatureHelp file="src/app.ts" line=12 offset=20
signatureHelp file="src/app.ts" line=12 offset=20 triggerReason={"kind":"invoked"}documentHighlights
Find all occurrences of a symbol within a file (or set of files). Distinguishes between read and write references. More efficient than references when you only need local occurrences.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
|
| — | Optional: limit search to these files |
Examples:
documentHighlights file="src/app.ts" line=10 offset=5
documentHighlights file="src/app.ts" line=10 offset=5 filesToSearch=["src/app.ts","src/utils.ts"]getApplicableRefactors
Discover what refactorings are available at a position or selection. Use before attempting a refactor to see what's possible. Returns a list of available refactors with their action names and descriptions.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the selection |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the selection |
|
| ✅ | 1-based end character offset |
|
| — |
|
Examples:
getApplicableRefactors file="src/app.ts" startLine=10 startOffset=1 endLine=15 endOffset=1
getApplicableRefactors file="src/app.ts" startLine=8 startOffset=12 endLine=8 endOffset=35docCommentTemplate
Generate a JSDoc comment template for a function, method, or class at a position. Returns the template text with @param, @returns, etc. based on the function signature.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
docCommentTemplate file="src/utils/helpers.ts" line=10 offset=1
docCommentTemplate file="src/services/api.ts" line=25 offset=10getOutliningSpans
Get code folding regions for a file. Returns the hierarchical structure of code blocks including their kinds (comment, region, code, imports). Useful for understanding file structure and complexity.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
Examples:
getOutliningSpans file="src/app.ts"
getOutliningSpans file="src/components/Button.tsx"provideInlayHints
Get inlay hints (inline type annotations) for a range. Shows inferred types, parameter names at call sites, and return types. Useful for understanding what TypeScript infers without explicit type annotations.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | Start offset (0-based character position) |
|
| ✅ | Length of range in characters |
Examples:
# Get inlay hints for the first 1000 characters of a file
provideInlayHints file="src/app.ts" start=0 length=1000
# Get inlay hints for a specific range
provideInlayHints file="src/utils/helpers.ts" start=500 length=200todoComments
Find all TODO, FIXME, HACK, and other configured comment markers in a file. Returns the location and text of each matching comment.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | Array of comment markers to search for (e.g., TODO, FIXME) |
Examples:
# Find all TODO and FIXME comments
todoComments file="src/app.ts" descriptors=[{"text":"TODO","priority":1},{"text":"FIXME","priority":0}]
# Find TODO, FIXME, and HACK comments
todoComments file="src/app.ts" descriptors=[{"text":"TODO","priority":2},{"text":"FIXME","priority":1},{"text":"HACK","priority":0}]definitionAndBoundSpan
Like definition, but also returns the text span of the symbol being queried. Useful for understanding exactly which characters constitute the symbol.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
definitionAndBoundSpan file="src/app.ts" line=10 offset=5
definitionAndBoundSpan file="src/types.ts" line=3 offset=11findSourceDefinition
Navigate to the actual TypeScript source instead of .d.ts declaration files. Useful when working with libraries that have source maps or when you want to see the implementation rather than just the type declarations.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based line number |
|
| ✅ | 1-based character offset on the line |
Examples:
findSourceDefinition file="src/app.ts" line=10 offset=5
findSourceDefinition file="src/services/api.ts" line=3 offset=15selectionRange
Get semantically meaningful selection ranges for smart expand/shrink selection. Returns nested spans that represent progressively larger syntactic constructs (expression → statement → block → function).
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | Array of positions to get selection ranges for |
Examples:
selectionRange file="src/app.ts" locations=[{"line":10,"offset":5}]
selectionRange file="src/app.ts" locations=[{"line":10,"offset":5},{"line":20,"offset":10}]format
Format a range of code according to TypeScript's formatting rules. Applies consistent indentation, spacing, and line breaks.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the range |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the range |
|
| ✅ | 1-based end character offset |
|
| — | Formatting options (tabSize, indentSize, etc.) |
|
| ✅ | If |
Examples:
format file="src/app.ts" line=1 offset=1 endLine=50 endOffset=1
format file="src/app.ts" line=10 offset=1 endLine=20 endOffset=1 preview=true
format file="src/app.ts" line=1 offset=1 endLine=100 endOffset=1 options={"tabSize":4}getMoveToRefactoringFileSuggestions
Get suggested target files when moving a symbol to another file. Returns both a suggested new file name and existing files that would be good destinations. Use this before moveSymbol to choose the best target location.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | 1-based start line of the declaration |
|
| ✅ | 1-based start character offset |
|
| ✅ | 1-based end line of the declaration |
|
| ✅ | 1-based end character offset |
Examples:
getMoveToRefactoringFileSuggestions file="src/app.ts" startLine=20 startOffset=1 endLine=35 endOffset=2
getMoveToRefactoringFileSuggestions file="src/components/Button.tsx" startLine=1 startOffset=1 endLine=5 endOffset=2getSupportedCodeFixes
Returns the list of all error codes that have available automatic fixes. Use this as a discovery tool before calling getCodeFixes — it tells you which error codes tsserver can fix. Optionally scope the query to a specific file's project.
Parameter | Type | Required | Description |
|
| — | Optional file path (absolute or relative to cwd). If provided, scopes to the file's project. |
Examples:
# Get all fixable error codes globally
getSupportedCodeFixes
# Get fixable error codes scoped to a specific project
getSupportedCodeFixes file="src/app.ts"mapCode
Map AI-generated code snippets into a file, replacing matching declarations by name or appending new ones. Designed for AI code generation workflows where you want to merge new code into an existing file without duplicating declarations.
Parameter | Type | Required | Description |
|
| ✅ | File path (absolute or relative to cwd) |
|
| ✅ | Code snippets to map into the file. Each is parsed independently. Functions and classes are matched by name. |
|
| — | Nested arrays of |
|
| ✅ | If |
How matching works:
Without
focusLocations→ code is always appended to end of file (no matching attempted)With
focusLocations→ TypeScript searches for declarations with matching names in the pointed-to scopeMatching works for: functions, classes, methods, interfaces (nodes with a
.nameproperty)Matching does NOT work for:
const/let/vardeclarations (VariableStatementhas no.name)When a match is found, the range from first to last matching statement is replaced
When no match is found, code is appended to the end of the scope
Limitations:
Calling with multiple
contentsentries only applies the first match — call once per declaration to replace multipleconst/let/varreplacements are not supported; use standard file editing instead
Examples:
# Replace an existing function (focusLocations enables name-based matching)
mapCode file="src/utils.ts" contents=["export function add(a: number, b: number, c = 0) { return a + b + c; }"] focusLocations=[[{"start":{"line":1,"offset":1},"end":{"line":1,"offset":1}}]]
# Append a new function (no focusLocations — always appends)
mapCode file="src/utils.ts" contents=["export function multiply(a: number, b: number) { return a * b; }"]
# Preview before applying
mapCode file="src/utils.ts" contents=["export function add(a: number, b: number) { return a + b; }"] focusLocations=[[{"start":{"line":1,"offset":1},"end":{"line":1,"offset":1}}]] preview=trueSupported Languages & Frameworks
ts-mcp-server works with any project that TypeScript's language service understands:
TypeScript (
.ts,.tsx,.mts,.cts)JavaScript (
.js,.jsx,.mjs,.cjs)React / Next.js / Remix / Astro
Vue (script blocks)
Node.js / Express / Fastify / NestJS
Angular
Svelte (script blocks)
Electron
React Native
Monorepos (Turborepo, Nx, Lerna, pnpm workspaces)
If your project has a tsconfig.json (or jsconfig.json), it works.
System Requirements
Requirement | Version |
Node.js | 22 or later (current LTS) |
TypeScript | 6.x (installed automatically as a dependency) |
OS | Windows, macOS, Linux |
No additional dependencies or global tools are required. The server bundles everything it needs.
FAQ
Does it work without a tsconfig.json?
Yes. TypeScript will create an inferred project, but explicit configuration gives better results.
Does it update package.json or non-code files?
No. It updates TypeScript/JavaScript import and export statements, and path-related entries in tsconfig.json (files, include, exclude, paths).
Can I use it with JavaScript-only projects?
Yes. Add a jsconfig.json (which is equivalent to tsconfig.json with allowJs: true) and the server will discover your project.
Does it work with path aliases (@/components/...)?
Yes. tsserver resolves path aliases defined in tsconfig.json's paths and baseUrl settings.
Is the output modified or formatted?
No. Every tool returns the raw, unmodified tsserver response serialized as JSON. Nothing is truncated, simplified, grouped, or filtered.
Available Tools
40 toolscompletionEntryDetailsCompletion Entry DetailsARead-only
Get full details for specific completion entries. Follow-up to completion_info for richer information including documentation, full type signature, JSDoc tags, and code actions (like auto-imports). Can request details for multiple entries at once.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset | |
| entryNames | Yes | Names of completion entries to get details for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it as read-only; description adds specifics about returned data (documentation, types, JSDoc, code actions) without contradicting annotations. Discloses additional behavioral traits beyond the read-only hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundant information. Front-loaded with verb and resource, then details. Every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description compensates by listing return values (documentation, type signature, etc.). For a 4-param tool with 100% schema coverage, the description provides sufficient context for an agent to invoke effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 4 parameters with descriptions; description adds minimal extra meaning (confirms multiple entries via entryNames). Baseline 3 is appropriate as schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool retrieves full details for completion entries, explicitly lists included information (documentation, type signature, JSDoc, code actions), and distinguishes itself as a follow-up to completionInfo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description positions it as a follow-up to completion_info, implying sequential usage. It does not explicitly mention when not to use or list alternatives, but the context is clear enough for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
completionInfoCompletion InfoARead-only
Get autocomplete suggestions at a position. Returns all possible completions with their kinds, sort text, and insert text. Useful for understanding what symbols, methods, or properties are available at a specific location in code.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset | |
| prefix | No | Optional prefix to filter completions | |
| triggerCharacter | No | Character that triggered completion (e.g., '.', '"', "'", '`', '/', '@', '<', '#', ' ') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description's claim of returning completions adds limited behavioral context. It does not mention error handling, performance, or scope of input, making it adequate but not outstanding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no extraneous words. The first sentence front-loads the core action and resource, and the second adds useful detail about return values.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and many siblings, the description adequately explains the return content and purpose. However, it could mention the output structure (array of completions) or edge cases like no completions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds no additional meaning to the parameters. It restates the overall purpose without enriching any parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'autocomplete suggestions at a position', and lists the returned fields (kinds, sort text, insert text). This precisely distinguishes it from sibling tools like completionEntryDetails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the tool is useful for understanding available symbols at a location, but does not explicitly mention when not to use it or name alternatives (e.g., completionEntryDetails). This leaves some ambiguity for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
definitionGo to DefinitionBRead-only
Returns the file location(s) where a symbol is defined. The fundamental 'where is this thing declared?' query.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds the 'fundamental query' context but doesn't detail behavior beyond what annotations (readOnlyHint) already convey. It doesn't mention multiple definitions, error handling, or output format. With annotations covering safety, minimal extra value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise: two sentences, no redundant words. The question format in the second sentence front-loads the core query intent. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite good annotations and full schema, the description lacks completeness given the complex sibling toolset and absence of output schema. It doesn't explain the return format (e.g., array of locations) or edge cases (symbol not found). More context would improve decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the schema (100% coverage). The description adds nothing about parameters; schema already defines file, line, and offset, including their types and meanings. Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns file location(s) where a symbol is defined, using the simple question 'where is this thing declared?' This distinguishes it from siblings like definitionAndBoundSpan and findSourceDefinition, making the purpose immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool over alternatives like definitionAndBoundSpan or findSourceDefinition. In a toolset with many similar navigation tools, explicit usage context is missing, leaving the agent to guess.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
definitionAndBoundSpanDefinition and Bound SpanARead-only
Like 'definition', but also returns the span of the symbol at the cursor. Useful for understanding exactly which characters constitute the symbol being queried. Returns both the definition locations and the textSpan of the queried symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so the tool is read-only. The description adds that it returns definition locations and the textSpan, which is useful but not extensive. No contradictions exist between description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise with three short sentences. It front-loads the key comparison to 'definition', then adds usage context, and finally states the return values—all without unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description adequately explains the tool's purpose and its difference from 'definition'. However, since there is no output schema, more details about the exact structure of the returned textSpan would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for all 3 required parameters, so baseline is 3. The description does not provide any additional information about the parameters beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Like 'definition', but also returns the span of the symbol at the cursor.' It names the specific verb 'returns' and resource (definition locations and textSpan), distinguishing it from the sibling 'definition' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly references the sibling 'definition' and explains the added value ('also returns the span'), implying when to use it. It also states 'Useful for understanding exactly which characters constitute the symbol,' providing clear context. However, it does not explicitly state when not to use it or mention alternatives beyond 'definition'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
docCommentTemplateDoc Comment TemplateARead-only
Generate a JSDoc comment template for a function, method, or class at a position. Returns the template text with @param, @returns, etc. based on the function signature. The returned text can be inserted above the function declaration.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating no side effects. The description adds the detail that the returned text can be inserted above the function declaration, but does not provide further behavioral insights. Minimal additional value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loading the purpose and adding a usage hint. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with 3 required params, full schema coverage, no output schema, and read-only annotations, the description is sufficient. It communicates the core function and return value. Could mention that the function must be parseable, but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description has low burden. It mentions 'at a position' but offers no extra meaning beyond the schema definitions for file, line, and offset. Baseline score applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool generates a JSDoc comment template for a function, method, or class, specifying the verb 'Generate' and resource 'JSDoc comment template'. It also mentions the output includes @param and @returns tags based on function signature, distinguishing it from sibling tools like signatureHelp.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives. There is no mention of prerequisites or situations where this tool should not be used, leaving the agent to infer usage context from the description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
documentHighlightsDocument HighlightsARead-only
Find all occurrences of a symbol within a file (or set of files). Distinguishes between read and write references. More efficient than find_all_references when you only need local occurrences within specific files.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset | |
| filesToSearch | No | Optional: limit search to these files |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, confirming no mutation. The description adds behavioral nuance by stating it distinguishes between read and write references, which is valuable beyond annotations. No side effects or destructive behavior are present, so a score of 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long with no fluff. Critical information (purpose, differentiation, efficiency) is front-loaded. Every sentence serves a clear purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain the return format (e.g., positions with read/write kind). While the purpose is clear, the absence of output details leaves the agent partially uninformed about what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents all parameters with descriptions. The description mentions 'file (or set of files)' which aligns with the file and filesToSearch parameters, but adds no extra semantic value beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds occurrences of a symbol within files, distinguishes between read and write references, and explicitly differentiates from a similar tool (find_all_references) by noting efficiency for local occurrences.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'More efficient than find_all_references when you only need local occurrences within specific files.' It also implies when not to use (avoid for broad searches) and distinguishes read/write references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extractConstantExtract ConstantADestructive
Extract the selected expression into a named constant. TypeScript infers the type. The response includes renameFilename/renameLocation so you can follow up with rename_symbol to give the constant a meaningful name.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| preview | Yes | If true, only preview changes | |
| endOffset | Yes | 1-based end character offset | |
| startLine | Yes | 1-based start line | |
| startOffset | Yes | 1-based start character offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds some behavioral context beyond annotations: it mentions TypeScript infers the type and that the response includes rename info. However, the destructiveHint annotation already indicates modification, and the description does not elaborate on the effect on the file or other side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise and to the point, with no unnecessary words. It efficiently communicates the tool's purpose and a key follow-up detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential purpose and a crucial output detail (rename info) for follow-up. Since there is no output schema, the description compensates reasonably well. However, it could mention where the constant is placed or any default naming behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all parameters have descriptions). The description does not add additional meaning to the parameters beyond what the schema already provides, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Extract') and the resource ('selected expression into a named constant'). It distinguishes from sibling tools like extractFunction and extractType that extract into different constructs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when to use this tool (to extract an expression into a constant) and suggests a follow-up action (rename_symbol). While it does not explicitly exclude other tools, the clear purpose implicitly differentiates it from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extractFunctionExtract FunctionADestructive
Extract the selected code range into a new function. TypeScript auto-detects parameters and return type. The response includes renameFilename/renameLocation so you can follow up with rename_symbol to give the function a meaningful name.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| preview | Yes | If true, only preview changes | |
| endOffset | Yes | 1-based end character offset | |
| startLine | Yes | 1-based start line | |
| startOffset | Yes | 1-based start character offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds value by mentioning auto-detection of parameters and return type, and the response includes renameFilename/renameLocation for follow-up. This informs the agent about side effects and response structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states the primary action, second provides key follow-up information. No redundant or unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 required params and no output schema, the description covers the core action, behavioral notes, and follow-up steps. It could mention that the original code is replaced with a function call, but the destructive hint implies that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 6 parameters. The description does not add additional semantics beyond what is already in the schema; it only reiterates the purpose in general terms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Extract' and resource 'selected code range into a new function'. It distinguishes from sibling tools like extractConstant and extractType by specifying 'function'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides follow-up guidance to use rename_symbol for naming, which helps the agent understand the workflow. However, it does not explicitly contrast with other extraction tools or indicate when function extraction is preferred over constant/type extraction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extractTypeExtract TypeADestructive
Extract an inline type annotation into a named type alias. Select the type span to extract. The response includes renameFilename/renameLocation so you can follow up with rename_symbol to give the type a meaningful name.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| preview | Yes | If true, only preview changes | |
| endOffset | Yes | 1-based end character offset | |
| startLine | Yes | 1-based start line | |
| startOffset | Yes | 1-based start character offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, and the description adds that the response includes renameFilename/renameLocation, explaining the output behavior beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that efficiently convey purpose, usage, and follow-up steps with no superfluous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the core functionality and response content, and the annotation fills in the destructive nature. It is sufficiently complete for a tool with six required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description mentions selecting the type span but does not add significant extra meaning beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool extracts an inline type annotation into a named type alias, distinguishing it from sibling tools like extractConstant or extractFunction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells when to use ('Select the type span to extract') and suggests a follow-up action with rename_symbol, providing clear usage context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fileReferencesFile ReferencesARead-only
Finds every file that imports or references a given file. The reverse dependency graph for a single file.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds specific behavioral context (finding importing/referencing files). No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no filler, front-loaded with purpose. Every word is informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a simple one-parameter tool with annotations. Does not describe output format but implies a list of files. Could be more complete but sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents the 'file' parameter. Description does not add further meaning beyond what is in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'finds' and resource 'every file that imports or references a given file'. Distinguishes from sibling 'references' by specifying it is the reverse dependency graph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context ('reverse dependency graph') but does not explicitly state when to use this tool versus alternatives like 'references'. No exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
findSourceDefinitionFind Source DefinitionARead-only
Navigate to the actual TypeScript source instead of .d.ts declaration files. Useful when working with libraries that have source maps or when you want to see the implementation rather than just the type declarations.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, so no contradiction. The description adds that the tool navigates to source instead of .d.ts, which is a key behavioral detail beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the main purpose. No unnecessary words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple lookup tool with three fully documented parameters and no output schema, the description sufficiently explains purpose and usage. Could optionally mention behavior when source maps are unavailable, but not necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter (file, line, offset) has clear descriptions. The description does not add extra meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Navigate' and the resource 'actual TypeScript source instead of .d.ts declaration files', distinguishing it from sibling tools like 'definition' which target declaration files.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit context ('when working with libraries that have source maps or when you want to see the implementation rather than just the type declarations') but does not explicitly state when not to use it or name specific alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
formatFormatADestructiveIdempotent
Format a range of code according to TypeScript's formatting rules. Applies consistent indentation, spacing, and line breaks. Specify a range or use the full file length to format the entire file.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | Start line (1-based) | |
| offset | Yes | Start offset (1-based) | |
| endLine | Yes | End line (1-based) | |
| options | No | Formatting options | |
| preview | Yes | If true, return edits without applying | |
| endOffset | Yes | End offset (1-based) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true. Description adds context about applying consistent indentation/spacing/line breaks and preview mode. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences front-loading purpose and usage. No redundant information; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, nested options, destructive behavior), description is adequate but not exhaustive. Lacks details on return value (no output schema) and effects beyond format, but schema and annotations cover much.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented. Description adds some context (range vs full file, preview behavior) but does not significantly enhance understanding beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Format' and resource 'a range of code according to TypeScript's formatting rules.' It specifies the scope (range or full file) and distinguishes from sibling tools like 'organizeImports' or 'rename' by focusing on formatting behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage hint: specify a range or use full file length. Does not explicitly mention when not to use or alternatives, but the sibling list includes no other formatting tool, so omission is acceptable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getApplicableRefactorsGet Applicable RefactorsARead-only
Discover what refactorings are available at a position or selection. Use before attempting a refactor to see what's possible. Returns a list of available refactors with their actions, descriptions, and any reasons why certain actions may not apply.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| endOffset | Yes | 1-based end column | |
| startLine | Yes | 1-based start line | |
| startOffset | Yes | 1-based start column | |
| triggerReason | No | Optional trigger reason |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds behavioral context by detailing the return value: 'list of available refactors with their actions, descriptions, and reasons why certain actions may not apply'. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose, no fluff. Every sentence adds value: first states purpose, second provides usage guidance and output description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description sufficiently explains the return value. Given the sibling tools, the description provides enough context for an agent to understand this is a read-only discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description does not add any additional parameter semantics beyond what is in the schema, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Discover' and specifies 'refactorings available at a position or selection', clearly identifying the tool's purpose. It distinguishes from sibling refactoring tools like extractConstant by being the preliminary discovery step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States 'Use before attempting a refactor to see what's possible', providing clear when-to-use guidance. Does not explicitly mention alternatives, but the context of sibling tools implies this is the discovery step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getCodeFixesGet Code FixesARead-only
Get available code fixes for specific error codes at a range in a TypeScript/JavaScript file. Returns the raw list of code actions tsserver suggests for the given diagnostics. Use getDiagnostics first to discover error codes and ranges, then pass them here.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| endOffset | Yes | 1-based end character offset | |
| startLine | Yes | 1-based start line | |
| errorCodes | Yes | Diagnostic error codes to get fixes for | |
| startOffset | Yes | 1-based start character offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond readOnlyHint annotation by specifying it returns 'raw list of code actions' from tsserver and is for TypeScript/JavaScript. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. Front-loaded with the core action and immediately follows with usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, it adequately describes the return as a 'raw list of code actions'. Could mention structure or format, but sufficient for selection and invocation. Sibling differentiation is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed descriptions for all 6 parameters. The description does not add new semantic information beyond the schema, but it reinforces the context of error codes and ranges.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Get' and resource 'code fixes' for specific error codes at a range in TypeScript/JavaScript files. Distinguishes from sibling tools like getDiagnostics and getCombinedCodeFix by emphasizing it returns raw code actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to 'Use getDiagnostics first to discover error codes and ranges, then pass them here.', providing a clear prerequisite and usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getCombinedCodeFixGet Combined Code FixARead-only
Get a combined code fix that applies all instances of a fix across a file in one action. For example, "Add all missing imports" or "Remove all unused variables". Returns the full set of file edits as a CombinedCodeActions response. Use getCodeFixes first to discover available fixId values, then pass the fixId here to get the combined fix for the whole file.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| fixId | Yes | The fixId from a code fix (e.g., "fixMissingImport", "unusedIdentifier", "inferFromUsage") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true and openWorldHint=false. The description adds that the tool returns the full set of file edits as a CombinedCodeActions response, which is useful behavioral context beyond the annotations. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two short paragraphs, front-loading the core purpose, followed by examples and workflow. Every sentence adds value without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema, the description sufficiently explains the return type (CombinedCodeActions response). Context is adequate for the agent to understand the tool's role among many code fix siblings, though it could mention that the fix is not applied immediately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage for both parameters. The description mentions that fixId comes from a code fix, but this adds minimal meaning beyond the schema definitions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool gets a combined code fix applying all instances of a fix across a file. It provides concrete examples ('Add all missing imports', 'Remove all unused variables') and distinguishes itself from the sibling tool getCodeFixes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to use getCodeFixes first to discover available fixId values, then pass fixId to this tool. This provides clear guidance on when and how to use it, with an explicit workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getDiagnosticsGet DiagnosticsARead-only
Get all errors, warnings, and suggestions for a TypeScript/JavaScript file. Reports type errors, unused variables, unused imports, unreachable code, and more. Requires the file to be part of a tsconfig.json project. Unused-code diagnostics only appear if tsconfig has noUnusedLocals/noUnusedParameters enabled.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, which is consistent. Description adds behavioral details (project requirement, conditional unused diagnostics) that go beyond annotations, enhancing transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose first, then conditions. No redundant information, each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given single required param, no output schema, and simple use case, description fully covers what the tool does, what it returns, and prerequisites. Nothing missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (one param described). The description does not add additional meaning beyond the schema's description of the 'file' parameter. Baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description begins with a clear verb+resource: 'Get all errors, warnings, and suggestions for a TypeScript/JavaScript file.' It lists specific types of diagnostics, distinguishing it from sibling tools like completionInfo or getCodeFixes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides prerequisites: file must be in a tsconfig.json project, and conditions for unused-code diagnostics. Does not explicitly state when NOT to use or provide alternatives, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getEditsForFileRenameRename / Move File or FolderA
Rename or move a TypeScript/JavaScript file OR folder and automatically update all import paths across the project. Supports .ts, .tsx, .js, .jsx. tsserver auto-discovers the relevant tsconfig.json. For folders, all imports referencing files inside the folder are updated.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | New file or folder path (absolute or relative to cwd) | |
| from | Yes | Current file or folder path (absolute or relative to cwd) | |
| preview | Yes | If true, show what would change without applying anything |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description effectively discloses key behaviors: automatic import path updates across the project, support for folders, and the preview mode that shows changes without applying. It does not cover error handling or mutation details beyond the preview parameter, which is acceptable for this tool's scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise—three sentences with the main action front-loaded. Every sentence adds value, though the structure could be slightly improved by separating file and folder handling more distinctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is reasonably complete for a tool with no output schema, covering what the tool does and the preview feature. However, it does not describe the output format (e.g., applied changes vs. edit list) or potential side effects, leaving some ambiguity for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains the three parameters (from, to, preview). The description adds no additional parameter-specific meaning beyond what the schema provides, meeting the baseline for coverage but not exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool renames or moves a file/folder and updates import paths, specifying supported file types (.ts, .tsx, .js, .jsx). However, it does not explicitly differentiate from sibling tools like 'rename' or 'moveSymbol', which may have overlapping or distinct purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when renaming/moving files with import path updates needed, but lacks explicit when-to-use/when-not-to-use guidance or comparisons to alternatives (e.g., the 'rename' tool for symbol renames). The context of tsserver auto-discovery is helpful but not directive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getMoveToRefactoringFileSuggestionsGet Move To Refactoring File SuggestionsARead-only
Get suggested target files when moving a symbol to another file. Returns both a suggested new file name and existing files that would be good destinations. Use this before moveSymbol to choose the best target location.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| endOffset | Yes | 1-based end column | |
| startLine | Yes | 1-based start line | |
| startOffset | Yes | 1-based start column |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only; description adds that it returns both a suggested new file name and existing files, though more detail on response structure would be helpful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that are front-loaded and contain no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers key information but could elaborate on the return structure given no output schema; adequate for a tool with well-documented parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema provides full coverage with descriptions for all 5 parameters; description adds no extra meaning beyond what schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it retrieves suggested target files when moving a symbol, distinguishing it from sibling tools like moveSymbol.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this before moveSymbol, providing clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getOutliningSpansGet Outlining SpansARead-only
Get code folding regions for a file. Returns the hierarchical structure of code blocks including their kinds (comment, region, code, imports). Useful for understanding file structure, complexity, and navigating large files.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it's a safe read operation. The description adds that it returns hierarchical structure and kinds, which is useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: first sentence states the core purpose, second explains return value and use cases. It is concise and front-loaded with essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description covers basic functionality and use case. However, it lacks specifics about the output format (e.g., start/end positions), which would help completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with one well-described parameter (file path). The description adds no additional meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'code folding regions for a file.' It specifies the return of hierarchical structure with kinds (comment, region, code, imports), distinguishing it from sibling tools like navto or navtree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions usefulness for understanding file structure and navigating large files, but does not explicitly state when to use this tool versus alternatives or provide exclusions among the 40+ sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
getSupportedCodeFixesGet Supported Code FixesARead-only
Returns the list of all error codes that have available code fixes. Use this as a discovery tool before calling getCodeFixes — it tells you which error codes tsserver can automatically fix. A file path must be provided to establish a project context; omitting it will cause tsserver to throw 'No Project'.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | Optional file path (absolute or relative to cwd). If provided, scopes the result to the file's project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating read-only behavior. The description adds that omitting the file parameter causes an error ('No Project'), which is valuable behavioral context beyond annotations. No contradiction detected.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loading the core purpose and adding critical usage guidance. Every sentence adds value; no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (single optional param, read-only annotation), the description is complete. It covers purpose, usage guidance, and a key error. However, it does not explicitly describe the return format (e.g., array of strings), which could be helpful but is not critical for a discovery tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description doesn’t need to repeat param details, but it adds context about why the file param is needed ('to establish a project context') and the consequence of omission. This enhances understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Returns the list of all error codes that have available code fixes.' It uses a specific verb ('Returns') and resource ('list of error codes'), and distinguishes itself from sibling tools by positioning it as a discovery tool before calling getCodeFixes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use this as a discovery tool before calling getCodeFixes' and warns that omitting a file path will cause tsserver to throw an error. This provides clear context on when to use it and a prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
implementationGo to ImplementationARead-only
Finds concrete implementations of an interface or abstract class. Given an interface Serializable, returns every class that implements it.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the description does not need to reiterate safety. It adds context about the tool's purpose but does not detail return format or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. The description is concise and front-loaded with the key purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given high schema coverage and read-only annotations, the description is mostly complete. It could mention that results are file locations, but overall sufficient for a navigation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and all parameters have descriptions. The description adds no additional parameter info beyond the schema, which is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool finds concrete implementations of an interface or abstract class, with a concrete example (Serializable). This distinguishes it from sibling tools like definition, references, and typeDefinition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when you have an interface or abstract class), but it does not explicitly contrast with alternatives or mention when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inferReturnTypeInfer Return TypeBDestructive
Add an explicit return type annotation to a function, inferred by TypeScript. Position must be on the function name or declaration keyword.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line | |
| preview | Yes | If true, only preview changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, and description confirms modification. Beyond that, description adds position requirement but lacks details on error cases (e.g., un-inferrable types, existing return types) or side effects (like formatting). Minimal behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with action. No wasted words. Efficiently communicates core purpose and a key constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters (all required), no output schema, and only a destructiveHint annotation, the description is too brief. It omits important context: error conditions, handling of existing return types, exact position requirements (function name vs keyword), and what happens on preview. Incomplete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. Description does not add any extra meaning beyond the schema for parameters file, line, offset, preview. The position requirement is mentioned in the main text but not linked to the parameters explicitly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (add return type annotation), resource (function), and mechanism (inferred by TypeScript). Includes specific position constraint (on function name or declaration keyword). Differentiates from sibling tools that are other refactoring or completion tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like getCodeFixes or extractType. Only implies usage for adding inferred return types, but no exclusion criteria or context for when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inlineVariableInline VariableADestructive
Inline a variable — replace all references with the variable's initializer and delete the declaration. Position must be on the variable name in its declaration or any usage.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line | |
| preview | Yes | If true, only preview changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint: true, and the description aligns by stating 'delete the declaration.' It adds behavioral context beyond annotations by specifying the positioning constraint and the replacement of all references, which is critical for correct invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. The first sentence states the purpose and effect, and the second provides essential positioning guidance. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a well-known refactoring with a clear action and positioning requirement, the description is largely sufficient. It could be improved by noting potential failure cases or confirming that the tool directly modifies the file (implied by destructiveHint).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so parameters are already well-documented. The description does not add new semantics for individual parameters beyond implying that 'line' and 'offset' should point to the variable name, which is more of a usage guideline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Inline a variable') and explains what it does ('replace all references with the variable's initializer and delete the declaration'). This distinguishes it from sibling refactoring tools like extractConstant or extractFunction, though it does not explicitly contrast them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a specific usage condition: 'Position must be on the variable name in its declaration or any usage.' This guides where to invoke the tool but does not discuss when to use this refactoring versus alternatives (e.g., when to inline vs. extract), leaving usage context implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mapCodeMap CodeADestructiveIdempotent
Map/insert/replace code snippets into a file. Designed for AI code generation workflows.
How matching works:
Without focusLocations → code is ALWAYS appended to end of file (no matching attempted)
With focusLocations → TypeScript searches for matching declarations by NAME in the scope
Matching works for: functions, classes, methods, interfaces (nodes with a 'name' property)
Matching does NOT work for: const/let/var declarations (VariableStatement has no name)
When a match is found:
The range from first matching statement to last matching statement is REPLACED with new code
When no match is found:
Code is appended to the end of the scope (file or block)
Multiple contents limitation:
When providing multiple contents entries, only the FIRST entry's match is applied
To replace multiple named declarations, call mapCode once per declaration
Non-existent files:
tsserver opens a virtual file buffer for paths that don't exist on disk
Edits are returned and written as if the file exists, effectively creating it
Use preview=true first to verify the output before writing a new file
Usage patterns:
REPLACE a function: provide contents with same function name + focusLocations anywhere in file
ADD new code: omit focusLocations (always appends to end)
REPLACE const/var: NOT SUPPORTED by mapCode — use standard file editing instead
REPLACE multiple declarations: call mapCode separately for each one
CREATE a new file: provide the desired path and contents without focusLocations
Example - replacing function 'calculate' (focusLocations just needs to be in the file scope): contents: ["export function calculate(x: number) { return x * 2; }"] focusLocations: [[{ start: { line: 1, offset: 1 }, end: { line: 1, offset: 1 } }]]
Set preview=true to see edits without applying them.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| preview | Yes | If true, return edits without applying them | |
| contents | Yes | Code snippets to map into the file. Each is parsed independently. Functions/classes are matched by name. | |
| focusLocations | No | Required to enable name-based matching. Point anywhere in the file/block scope to search. Without this, code is always appended. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=true. The description goes far beyond by detailing the exact matching algorithm (by name, only for certain node types), the behavior when match found vs. not found, the limitations of multiple contents entries, and the handling of non-existent files via a virtual buffer. There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized with headings, bullet points, and an example. It front-loads the core purpose and then systematically covers matching, limitations, and usage patterns. While every sentence adds value, the length is slightly high for a tool description; a more streamlined version could achieve perfect conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (four parameters, intricate matching logic, multiple edge cases like non-existent files and const/var unsupported) and the absence of an output schema, the description thoroughly covers all essential aspects. It explains matching scope, replacement versus append, how to handle multiple declarations, and how to create new files, leaving no gaps for an AI agent to fill.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All four parameters are described in the input schema with 100% coverage. The description adds crucial meaning: it explains that without focusLocations, code is always appended; it clarifies that the focusLocations parameter enables name-based matching within a scope; and it provides a concrete example showing how to use contents and focusLocations together. This elevates understanding beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Map/insert/replace code snippets into a file. Designed for AI code generation workflows,' using a specific verb+resource and setting the tool apart. It also details how matching works and when to use alternatives, clearly distinguishing this tool from sibling tools like refactoring or completion services.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage patterns: REPLACE a function, ADD new code, CREATE a new file, and explicitly states what is NOT supported (matching const/let/var) and what to do instead ('use standard file editing'). It also recommends using preview=true to verify output and explains the multiple contents limitation. This leaves no ambiguity about when and how to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
moveSymbolMove SymbolADestructive
Move top-level declarations (functions, classes, types, constants) to another file. Automatically rewires all imports across the project. If the target file does not exist, tsserver creates it.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| endLine | Yes | 1-based end line | |
| preview | Yes | If true, only preview changes | |
| endOffset | Yes | 1-based end character offset | |
| startLine | Yes | 1-based start line | |
| targetFile | Yes | Destination file path (absolute or relative to cwd) | |
| startOffset | Yes | 1-based start character offset |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide destructiveHint=true. The description adds that it automatically rewires all imports across the project and creates the target file if it doesn't exist, which provides valuable behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, concise and front-loaded. It covers the main action, side effects, and edge case (target file creation). No unnecessary words, but could be more structured (e.g., bullet points).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does not explain what the tool returns (e.g., a code edit or confirmation). It mentions 'preview' parameter but doesn't clarify behavior when preview is true. Completeness is adequate but has gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters have descriptions in the schema. The description does not add additional meaning beyond what the schema already provides. It mentions 'top-level declarations' but does not clarify the selection range parameters further.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool moves top-level declarations (functions, classes, types, constants) to another file, which is a specific verb and resource. It distinguishes from siblings like extractFunction and getMoveToRefactoringFileSuggestions by specifying the scope (top-level) and automatic import rewiring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does but does not explicitly state when to use it versus alternatives like extractFunction or rename. No guidance on when not to use it or prerequisites (e.g., using getMoveToRefactoringFileSuggestions first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
organizeImportsOrganize ImportsADestructiveIdempotent
Sort, coalesce, and remove unused imports in a TypeScript/JavaScript file. Uses TypeScript's native organizeImports with mode 'All' (sorts, coalesces, and removes unused). Requires the file to be part of a tsconfig.json project.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| preview | Yes | If true, only preview changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds detail beyond annotations by specifying that it uses TypeScript's native organizeImports with mode 'All', explaining the exact behavior (sorts, coalesces, removes unused). This aligns with the idempotentHint and destructiveHint annotations without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two well-structured sentences, front-loading the main action and following with important context. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters and no output schema, the description provides sufficient information: what the tool does, how it works, and a critical prerequisite. The behavioral details (sorts, coalesces, removes unused) cover the main outcomes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and parameter descriptions are clear. The description adds context that the file must be part of a tsconfig.json project, which is useful but not a significant addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sorts, coalesces, and removes unused imports in TypeScript/JavaScript files, specifying the verb and resource. It distinguishes from sibling tools like format or getCodeFixes by focusing specifically on import organization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes a prerequisite ('Requires the file to be part of a tsconfig.json project'), which helps the user know when the tool is applicable. However, it does not explicitly mention when to use this tool versus alternatives like format, though the context implies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepareCallHierarchyPrepare Call HierarchyARead-only
Returns the call hierarchy item(s) at a position — the entry point for call hierarchy queries. Returns the function/method name, kind, file location, and spans.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with the readOnlyHint annotation by not implying any side effects. It adds value by detailing the return fields (name, kind, file location, spans), which goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that front-load the primary purpose and then list the return information. No extraneous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, read-only nature, full schema coverage, and lack of output schema, the description adequately covers behavior and return information. It is complete enough for an agent to understand usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers all three parameters with descriptions (file path, line, offset). The tool description does not add additional semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Returns') and resource ('call hierarchy item(s) at a position'), and it distinguishes itself from sibling tools by calling itself 'the entry point for call hierarchy queries', which implies a specific role in the workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates it is the entry point for call hierarchy queries, providing context for when to use this tool before other call hierarchy commands. However, it does not explicitly state when not to use it or offer alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
projectInfoProject InfoARead-only
Returns the tsconfig.json path, the full list of files in the project, and whether the language service is active.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| needFileNameList | No | If true, include the list of all files in the project |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description correctly implies no side effects. It adds that it returns three specific pieces of info but does not disclose potential behavior like file existence checks or project loading delays. The description is consistent with annotations and provides minimal extra transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence that directly states the return values. No extra words, front-loaded with the key output. Appropriate length for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description lists what is returned, it lacks context about how the 'file' parameter is used (e.g., to identify the project) or the typical usage pattern. Given no output schema, a bit more detail on the return format would help. However, for a simple read tool with good annotations and schema, it is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% coverage with descriptions for both parameters. The description does not add any information about how parameters affect the result beyond what the schema provides (e.g., it doesn't explain that 'file' determines which project to query or that needFileNameList controls the file list). Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool returns: tsconfig.json path, full file list, and language service activity. It uses specific verbs and resources, and the returned data distinguishes it from sibling tools that focus on completions, definitions, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. With 35+ sibling tools, the agent needs explicit context on when projectInfo is appropriate (e.g., 'Use this to get project metadata before performing other operations'). No when/when-not information is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provideCallHierarchyIncomingCallsIncoming CallsARead-only
Returns all functions/methods that call the function at the given position. Answers 'who calls this?'
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description does not contradict this. However, it adds no further behavioral context (e.g., whether results are exhaustive, include cross-file calls, or depth). With annotations covering the safety profile, the minimal added context is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that immediately conveys the purpose. Every word earns its place; no wasted content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity, no output schema, and read-only annotation, the description sufficiently explains what is returned (functions/methods that call the given function). It could benefit from mentioning the result format (e.g., file, line), but is generally complete enough for an agent to understand and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 100% description coverage for all three parameters (file, line, offset). The description does not add any extra meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns all functions/methods that call the function at a given position, answering 'who calls this?'. It uses specific verb 'returns' and resource, effectively distinguishing from the sibling 'provideCallHierarchyOutgoingCalls'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool ('who calls this?') but does not explicitly exclude alternative tools like 'references' or 'definition'. The context is clear for typical usage, but lacks explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provideCallHierarchyOutgoingCallsOutgoing CallsARead-only
Returns all functions/methods that the function at the given position calls. Answers 'what does this call?'
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the readOnlyHint annotation by specifying that it returns called functions/methods from a given position. It does not contradict annotations and provides useful operational detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no wasted words. The first sentence states the action and resource, the second clarifies the question it answers. Efficiently front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description hints at the return type ('returns all functions/methods') which is helpful, though a brief note on return structure would improve completeness. Overall adequate for its complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with clear descriptions (100% coverage). The description does not add new semantic meaning beyond what the schema provides, hence baseline score 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'returns' and resource 'functions/methods' and clarifies the scope by answering 'what does this call?'. It clearly distinguishes the tool from incoming calls sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to get outgoing calls from a position) but provides no explicit guidance on when not to use it, nor lists alternatives like 'provideCallHierarchyIncomingCalls' or prerequisites like needing a valid call site.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
provideInlayHintsProvide Inlay HintsARead-only
Get inlay hints (inline type annotations) for a range. Shows inferred types, parameter names at call sites, and return types. Useful for understanding what TypeScript infers without explicit type annotations.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| start | Yes | Start offset (0-based character position) | |
| length | Yes | Length of range in characters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description does not need to reiterate safety. It adds value by specifying the types of hints returned (inferred types, parameter names, return types), enriching behavioral understanding beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with three short sentences, each serving a clear purpose: what it does, what it shows, and when to use it. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately conveys what the tool returns (types, parameter names, return types). However, it could be more precise about the response structure (e.g., array of hints with positions). Still, it is fairly complete for a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully described in the input schema (100% coverage). The description adds no additional meaning, examples, or constraints beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get inlay hints (inline type annotations) for a range.' It specifies the verb, resource, and scope, and distinguishes from sibling tools by focusing on a specific kind of information (inferred types, parameter names, return types) not provided by other tools like completion or quickinfo.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only implicitly suggests usage by stating it is 'useful for understanding what TypeScript infers.' It lacks explicit guidance on when to use this tool versus alternatives (e.g., quickinfo, typeDefinition) and does not state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quickinfoQuick InfoARead-only
Get type information, documentation, and JSDoc tags for a symbol at a position. Returns the hover info — kind, display string (full type signature), documentation, and tags.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the return value (kind, display string, documentation, tags) in detail. Annotations already indicate readOnlyHint=true, so the description adds behavioral specifics beyond safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. Front-loaded with the verb and resource, then details return value. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Sufficient for a simple tool with 3 params and no output schema. Covers purpose, input, and output. Lacks explicit usage guidance but otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with good descriptions for file, line, offset. Description does not add extra meaning beyond the schema, so baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states verb 'Get', resource 'type information, documentation, and JSDoc tags', and specifies input as a symbol at a position. Distinguishes itself by returning hover info, which is distinct from sibling tools like 'definition' or 'references'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool vs alternatives like 'definition' or 'signatureHelp'. The description implies its purpose but does not provide context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
referencesFind All ReferencesARead-only
Find all usages of a symbol across the project. Provide the file path and 1-based line/offset of any occurrence of the symbol. Returns references grouped by file with line text for context.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds useful behavioral details: returns references grouped by file with line text for context. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first for purpose, second for input and output structure. No unnecessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description provides a reasonable overview of return format (grouped by file with line text). Slightly vague but sufficient for most agents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description reiterates the parameter meaning without adding new semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it finds all usages of a symbol, specifies input (file, line, offset) and output (grouped by file with line text). Distinct from sibling tools like 'definition' or 'implementation'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicitly indicates when to use (when all references are needed) but provides no explicit guidance on alternatives or when not to use this tool over similar siblings like 'fileReferences'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renameRename SymbolA
Rename a TypeScript/JavaScript symbol (variable, function, class, type, property, etc.) and update all references across the project. Provide the file path and the 1-based line/offset of any occurrence of the symbol.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line | |
| newName | Yes | New name for the symbol | |
| preview | Yes | If true, only preview changes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description fails to disclose behavioral traits like mutation side effects, reversibility, or permissions needed. It says 'update all references' but does not elaborate on the nature of updates or if it's a workspace edit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences: first states purpose, second provides usage instruction. No redundant or wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Lacks output schema; description does not explain what the tool returns (e.g., edit list, confirmation). For a refactoring tool with cross-project impact, more context on applying changes would be beneficial.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. Description adds minimal extra meaning beyond schema: restates that file/line/offset are needed but does not enrich understanding of newName or preview behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Rename a TypeScript/JavaScript symbol and update all references across the project.' It specifies the verb (rename), resource (symbol), and scope (update references), distinguishing it from sibling tools like moveSymbol or extractConstant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides basic usage instruction ('Provide the file path and the 1-based line/offset of any occurrence') but lacks explicit guidance on when to use this tool versus alternatives such as moveSymbol or inlineVariable, and no mention of prerequisites or when not to use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
selectionRangeSelection RangeARead-only
Get semantically meaningful selection ranges for smart expand/shrink selection. Returns nested spans that represent progressively larger syntactic constructs. Useful for structural code selection (e.g., select expression → statement → block → function).
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| locations | Yes | Array of positions to get selection ranges for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, so the tool is safe. The description adds behavioral context by noting that the tool 'Returns nested spans that represent progressively larger syntactic constructs,' which helps the agent understand output structure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise—two sentences that front-load the purpose and output nature without any wasted words. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, full schema coverage, and read-only annotations, the description adequately covers purpose and output. It lacks details on error handling or return format but is sufficient for use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; both parameters ('file' and 'locations') have clear descriptions. The tool's description does not add further semantic detail beyond the schema, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Get semantically meaningful selection ranges for smart expand/shrink selection.' It specifies the resource and action, distinguishing it from sibling tools like definition or references.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context: 'Useful for structural code selection (e.g., select expression → statement → block → function).' It gives an example but does not explicitly state when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
signatureHelpSignature HelpARead-only
Get function/method signature information at a call site. Returns parameter names, types, and documentation for each overload. Use when the cursor is inside function call parentheses to understand what arguments are expected.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based column offset (inside the parentheses) | |
| triggerReason | No | Optional reason for triggering signature help |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds that it returns parameter names, types, and documentation, which informs the agent about the nature of the response without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The description is front-loaded, concise, and every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description sufficiently explains the return value (parameter names, types, documentation) even without an output schema. Missing edge cases or error conditions, but adequate for a well-defined tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds context about when to use (inside parentheses) but does not explain individual parameters beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it retrieves function/method signature information at a call site, including parameter names, types, and documentation for each overload. This clearly distinguishes it from sibling tools like quickinfo or definition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use when the cursor is inside function call parentheses to understand what arguments are expected.' It does not mention when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
todoCommentsTodo CommentsARead-only
Find all TODO, FIXME, HACK, and other configured comment markers in a file. Returns the location and text of each matching comment. You must provide the descriptors array specifying which markers to search for.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| descriptors | Yes | Array of comment markers to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, indicating a safe read operation. The description adds the requirement to provide the descriptors array, but this is already present in the schema. No additional behavioral traits (e.g., side effects, authorization needs) are disclosed beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences (approximately 35 words) with the main purpose front-loaded. Every sentence contributes essential information without redundancy or unnecessary details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers the main purpose and return value (location and text), it lacks details on the output format. Since no output schema is provided, a more precise description of the return structure (e.g., fields like line, column, text) would enhance completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description only repeats the requirement for the descriptors array without adding new meaning or usage context that isn't already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Find' and clearly identifies the resource as 'TODO, FIXME, HACK, and other configured comment markers in a file'. It also states the return value (location and text), making the tool's purpose unambiguous and distinct from its siblings, which are mostly TypeScript IDE features.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when comment markers need to be found in a file, but it does not provide explicit guidance on when to use this tool versus alternatives. No when-to-use or when-not-to-use conditions are given, and no similar tools are compared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
typeDefinitionGo to Type DefinitionARead-only
Navigates to the type's definition, not the variable's declaration. Given const user: UserProfile = ..., definition goes to the variable, but typeDefinition goes to the UserProfile interface.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | File path (absolute or relative to cwd) | |
| line | Yes | 1-based line number | |
| offset | Yes | 1-based character offset on the line |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare `readOnlyHint: true`, so the bar is lower. The description adds useful behavioral context (navigates to type definition) without contradicting annotations. It doesn't disclose additional traits like performance or side effects, but it's consistent and clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the key distinction, no unnecessary words. Every sentence adds value, making it highly efficient for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (navigation, no output schema), the description is complete. It covers purpose, usage, and distinction from a sibling tool, with good annotations providing safety context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (file, line, offset). The description adds no additional parameter semantics; it focuses on the tool's function. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: navigating to a type's definition, not a variable's declaration. It provides a concrete example distinguishing it from the `definition` sibling tool, making the purpose specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts this tool with `definition`, telling the agent when to use `typeDefinition` vs. `definition`. This provides clear usage guidance and distinguishes it from alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
40 tool updates
v1.1.1- First observed
completionEntryDetails - First observed
completionInfo - First observed
definition - First observed
definitionAndBoundSpan - First observed
docCommentTemplate - First observed
documentHighlights - First observed
extractConstant - First observed
extractFunction - First observed
extractType - First observed
fileReferences - First observed
findSourceDefinition - First observed
format - First observed
getApplicableRefactors - First observed
getCodeFixes - First observed
getCombinedCodeFix - First observed
getDiagnostics - First observed
getEditsForFileRename - First observed
getMoveToRefactoringFileSuggestions - First observed
getOutliningSpans - First observed
getSupportedCodeFixes - First observed
implementation - First observed
inferReturnType - First observed
inlineVariable - First observed
mapCode - First observed
moveSymbol - First observed
navto - First observed
navtree - First observed
organizeImports - First observed
prepareCallHierarchy - First observed
projectInfo - First observed
provideCallHierarchyIncomingCalls - First observed
provideCallHierarchyOutgoingCalls - First observed
provideInlayHints - First observed
quickinfo - First observed
references - First observed
rename - First observed
selectionRange - First observed
signatureHelp - First observed
todoComments - First observed
typeDefinition
TDQS
Each tool targets a specific operation in the TypeScript language server, such as completions, diagnostics, navigation, or refactoring. Descriptions clearly differentiate closely related tools like definition vs. typeDefinition and references vs. fileReferences, minimizing confusion.
Tool names are consistently camelCase but mix verb-started (getCodeFixes, organizeImports) and noun-started (completionInfo, definition) patterns. Some verbs like 'provide' and 'get' are used for similar operations, reducing predictability.
With 40 tools, the count is high but reflects the complexity of a full TypeScript language server. Each tool serves a distinct purpose, but the number exceeds the typical 3-15 range for MCP servers, making it somewhat heavy.
The tool surface covers all major areas: autocomplete, diagnostics, formatting, navigation, refactoring, renaming, file operations, and symbol search. No obvious gaps exist for common TypeScript development workflows.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A TypeScript MCP server for Home Assistant, enabling programmatic management of entities, automati…
The official Svelte MCP server providing docs and autofixing tools for Svelte development
A MCP server built for developers enabling Git based project management with project and personal…
A simple Typescript MCP server built using the official MCP Typescript SDK and smithery/cli. This…
Related MCP Servers
- AlicenseBqualityDmaintenanceTypeScript-based MCP server designed to enhance code editing experiences by providing features such as hover information, code completion, and diagnostics.32026MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides TypeScript development tools for automated refactoring and code analysis.1-
- AlicenseAqualityDmaintenanceA TypeScript-aware MCP server that provides coding agents with repository discovery, code intelligence, and web project context for local codebases. It enables deep symbol navigation, diagnostic reporting, and structural analysis of monorepos without requiring full IDE integration.7121MIT
- AlicenseAqualityBmaintenanceA TypeScript/JavaScript refactoring MCP server that uses the TypeScript compiler to perform safe, type-aware code transformations such as renaming, extracting functions, and organizing imports across your codebase.47512MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/AndyLiner13/ts-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server