Releases: pioner92/symbolpeek-mcp
Release list
v0.4.3
Added
rename_symbol(.ts,.tsx,.js,.jsx) — the first write-capable
tool. Resolves the symbol likefind_references, then applies TypeScript's own
findRenameLocationsacross every project file and writes the edits to disk in
one call, returning the rewritten locations as a diff for review. Refuses the
whole rename — no partial write — when any location falls outside the project
(a.d.tsornode_modulesdeclaration), and rejects an invalid or reserved
new_namebefore the worker round trip.check_safe_to_delete(.ts,.tsx,.js,.jsx) — read-only. Answers
"is any top-level declaration in this file referenced from another file?" in a
single call, replacing afind_referencessweep over every export. Returns
safe: trueonly when nothing is used elsewhere, otherwise the blocking
cross-file references.
Changed
- Agent-facing text (tool descriptions, the
tool_handlerinstructions string,
the packaged skill) is now held to a minimum-token bar, formalized as design
constraint #4 inARCHITECTURE.mdand a repo-rootCLAUDE.mdfor future
contributors: this text is injected into a model's context on every call, so
compact rows beat prose.
Install
curl -fsSL https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.sh | shirm https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.ps1 | iexThen connect the server to your client — the installer prints the exact command.
See the README for requirements and troubleshooting.
Full Changelog: v0.4.2...v0.4.3
v0.4.2
Added
- Markdown support (
.md,.markdown). Headings are the symbols, nested by
level, and a symbol spans its whole section rather than the heading line, so
read_symbolwithQuick start.Connect your clientreturns that section —
839 bytes instead of this project's 20 KB README. Both#and underline
(setext) headings are indexed, a#inside a fenced code block is not, and
repeated headings receive@line:columnselectors.read_symbol,
list_symbols,search_symbols, andget_document_outlineare supported;
the semantic operations do not apply to prose and report as unsupported.
Fixed
- A registered language could be rejected by the filesystem boundary. The
set of supported extensions was written out twice — once by the provider
registry and once as a literal list inload_source— so a newly registered
language was accepted through the MCP entry point and refused through the
public API. The boundary now derives its list from the registry, and a test
asserts the two agree. - The
[.ts/.tsx/...]marker on each tool description — the only place an agent
learns which files a tool accepts — is hand-written and was a third copy of
the same set. It now has a test that derives the expectation from the
registry, which immediately caught.markdownbeing supported but never
advertised. - Python definitions guarded by control flow were missing entirely. A
function or class insideif,try,with, or a loop was absent from
get_document_outlineand unreachable byread_symbol, so the standard
try: from _fast import loads / except ImportError: def loads(...)fallback
had no addressable symbol. Python has no block scope, so these are indexed in
their enclosing module or class. - Duplicate names were unreachable outside TypeScript too. Java overloads,
repeated Goinitfunctions, and#[cfg]-gated Rust twins were listed by the
outline whileread_symbolanswered with candidates likeE.a at line 2—
a label, not a name that could be sent back. They now receive the same
@line:columnoccurrence selectors TypeScript uses, and every reported
candidate reads back. - Composing a path from an outline now resolves for Rust impl blocks:
impl Client.sendreaches the declaration whose canonical name is
Client.send. - The occurrence selector was not always unique, so some names the outline
reported still could not be read back. Running the indexer over the Go and
Python standard libraries surfaced three cases the earlier disambiguation
missed: declarations sharing one source position (var _, _ = …, both blanks
anchored to the spec), a property getter/setter pair stranded when their
enclosing class was itself disambiguated, and a top-level name whose leaf
display collided with another declaration (a Go method shown asfoobeside a
top-levelconst foo). A final uniqueness pass now closes the invariant
unconditionally — everynamedistinct, every siblingdisplay_namedistinct,
with a#ordinalwhen declarations genuinely share a position — and the Go and
Python standard libraries are exercised as real-world corpora in the test
suite.
Changed
- Tree-sitter languages (Rust, Python, Java, Go) no longer map byte offsets to
line/column by scanning from the start of the file for every declaration,
which was quadratic in file size. A 16k-declaration file went from 5.2s to
0.2s, and outline time is now linear in file size. - The embedded Tree-sitter runtime moved from 0.25 to 0.26. The bundled grammars
are unaffected — they bind throughtree-sitter-languagerather than the core
crate — and no provider behaviour changed. - Outline snapshots now cover every Tree-sitter language. They previously
covered only TypeScript, so a change in the shared Tree-sitter backend could
drop a declaration for the other providers without failing a test.
Install
curl -fsSL https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.sh | shirm https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.ps1 | iexThen connect the server to your client — the installer prints the exact command.
See the README for requirements and troubleshooting.
Full Changelog: v0.4.1...v0.4.2
v0.4.1
Fixed
- Symbols that no name could reach. When two distinct declarations produced
the same qualified name,read_symbolanswered with an ambiguity error whose
only candidate was the name just asked for — a dead end with no way to reach
either declaration. ReadingObject,Array,String,Math, orJSON
from the bundledlib.es5.d.tsfailed this way, as did any file combining
interface Xwithdeclare var X. Such declarations now receive
@line:columnoccurrence selectors, and the ambiguity error lists them in
source order. - Callbacks inside destructured calls lost their container. Only the
react-querymutatealias produced a qualified container; SWR'strigger,
Apollo's tuple form, and arbitrary property names collapsed sibling callbacks
onto one unreachable name. The container is now selected structurally, so
EventCreation.onCreateEvent.onSuccessresolves across all of these shapes. search_symbolsranges cover the full declaration instead of just the name,
and now agree withread_symbolandget_document_outline.- Function-valued object properties report
arrow_functionor
react_componentrather thanobject_method, matching the other tools. get/setaccessor pairs merge into one property; unrelated declarations
that happen to share a name no longer merge into one span.
Changed
- Large files are dramatically faster: converting UTF-16 positions to byte
offsets rescanned the file from the start on every call, which made every
operation quadratic in file size.read_symbolon a 1.8 MB.d.tswent from
9.7s to 0.2s. - Ambiguity candidates are ordered by source position rather than
lexicographically, so@line:columnselectors no longer sort4562before
544. - GitHub Release notes are now composed from the matching
CHANGELOG.md
section plus install instructions, instead of the commit-derived
--generate-notesoutput.
Install
curl -fsSL https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.sh | shirm https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.ps1 | iexThen connect the server to your client — the installer prints the exact command.
See the README for requirements and troubleshooting.
Full Changelog: v0.4.0...v0.4.1
v0.4.0
Changed
- The installers no longer install the agent skill automatically. Previously
install.shandinstall.ps1raninstall-skills all, creating
~/.codex/skills/symbolpeekand~/.claude/skills/symbolpeekeven for
clients that were not installed. Installation now touches only its own
directory and prints the optionalsymbolpeek install-skills codex|claude|all
step, so you configure just the client you use.
Documentation
- Rewrote the README around installation, a language support matrix, real
measured output, troubleshooting, and uninstall instructions. - Restructured
MCP_TOOLS.md: contents, shared conventions (paths, pagination,
compact rows, errors), per-tool language markers, and a response example for
every tool. - Added
LICENSE(MIT),CHANGELOG.md,SECURITY.md, and issue templates.
Fixed
- The bundled agent skill referenced a non-existent
get_type_infotool; it now
namesget_typeand states which operations each language supports. - Release archives now include
LICENSE.
Install
curl -fsSL https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.sh | shirm https://raw.githubusercontent.com/pioner92/symbolpeek-mcp/main/scripts/install.ps1 | iexThen connect the server to your client — the installer prints the exact command.
See the README for requirements and troubleshooting.
Full Changelog: v0.3.1...v0.4.0
v0.3.1
Added
- One-line installers for macOS, Linux, and Windows that verify the release
checksum and print ready-to-run client registration commands. symbolpeek install-skills [codex|claude|all]installs the bundled agent
guidance; the installers run it automatically.
Full Changelog: v0.3.0...v0.3.1
v0.3.0
v0.2.0
Highlights
SymbolPeek v0.2.0 expands symbol-level code intelligence beyond TypeScript and JavaScript with fast, syntax-aware support for:
- Rust
- Python
- Java
- Go
These languages use embedded Tree-sitter parsers and require no Node.js runtime.
New language capabilities
Rust, Python, Java, and Go now support:
read_symbollist_symbolssearch_symbolsget_document_outlinefind_dependenciesfor same-file dependenciesread_symbol_context
Rust additionally supports syntax-based find_implementations for explicit impl blocks.
Performance and architecture
- Added a shared workspace walk for Tree-sitter providers.
- Removed redundant per-language filesystem scans.
- Added safe text prefiltering before AST parsing.
- Node.js now starts only when TS/JS files are present.
- Preserved full
tsconfig-aware discovery for TypeScript and JavaScript. - Added an extensible
FileDiscoverycontract for future language providers. - Added a reusable latency benchmark covering cold and warm request batches.
Tree-sitter searches complete in a few milliseconds in the included benchmark, while warm TypeScript requests reuse the long-lived worker.
Compact LLM responses
- Added trust metadata to language results:
backendanalysis_levelcomplete
- Added
get_capabilitiesfor compact language and operation discovery. - Reduced tool descriptions while preserving response contracts.
- Continued using interned file tables and tuple rows to minimize repeated keys and token usage.
Reliability
- Added extensive edge-case coverage for Rust, Python, Java, and Go.
- Covered malformed syntax recovery, shadowing, overload ambiguity, decorators, annotations, receivers, grouped declarations, nested outlines, pagination, ignored directories, and external references.
- 114 automated tests passing.
- Strict Clippy checks passing with all targets and features.
- Release MCP smoke test passing.
Notes for adapter authors
The public LanguageAdapter workspace-search contract now distinguishes between:
Delegateddiscovery for providers with project-aware configuration, such as TypeScript.SharedWalkdiscovery for Tree-sitter providers.
Custom language adapters may need to implement the updated discovery contract.
Full changelog: v0.1.2...v0.2.0