Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
295 changes: 47 additions & 248 deletions CHANGELOG.md

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ members = ["crates/*"]
resolver = "2"

[workspace.package]
version = "0.6.0"
version = "0.7.0"
edition = "2024"
rust-version = "1.99"
authors = ["Andrei G. <k05h31@gmail.com>"]
Expand All @@ -30,7 +30,7 @@ hyper-util = "0.1.20"
ignore = "0.4"
libc = "0.2"
lsp-types = { package = "gen-lsp-types", version = "=0.11.0" }
mcpls-core = { path = "crates/mcpls-core", version = "0.6.0" }
mcpls-core = { path = "crates/mcpls-core", version = "0.7.0" }
nix = { version = "0.31", default-features = false, features = ["user"] }
predicates = "3.1"
process-wrap = { version = "10.0.1", default-features = false }
Expand Down
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,10 @@ Rust projects need no configuration. Other languages and clients are covered in
- **Cross-references, definitions, implementations** across the whole workspace
- **Real diagnostics** from the compiler, not guesses
- **Rename and code-action edits** returned for the client to apply
- **Call and type hierarchies**, symbol search, formatting, inlay hints
- **Several language servers at once**, with graceful degradation when one fails
- **stdio by default**, optional HTTP transport with Host and Origin allowlists
- **Call and type hierarchies**, symbol search, formatting, inlay hints, selection and folding ranges
- **Address code by symbol name** as well as by position, and restart language servers on demand
- **Several language servers at once**, started concurrently and stopped with mcpls, with graceful degradation when one fails
- **stdio by default**, optional HTTP transport with Host and Origin allowlists and resource subscriptions
- **Untrusted-workspace mode** for analyzing code you do not trust
- **Single Rust binary**, no runtime dependencies, no `unsafe` code

Expand Down
2 changes: 1 addition & 1 deletion book/src/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ curl -fsSL https://raw.githubusercontent.com/bug-ops/mcpls/main/scripts/install.
irm https://raw.githubusercontent.com/bug-ops/mcpls/main/scripts/install.ps1 | iex
```

On Linux and macOS, `MCPLS_INSTALL_DIR` changes the target directory and `MCPLS_VERSION` selects a release tag such as `v0.6.0` instead of the latest.
On Linux and macOS, `MCPLS_INSTALL_DIR` changes the target directory and `MCPLS_VERSION` selects a release tag such as `v0.7.0` instead of the latest.

Verify the install:

Expand Down
18 changes: 18 additions & 0 deletions book/src/reference/example-config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ roots = [
# Position encoding preference (utf-8 is more efficient for Rust)
position_encodings = ["utf-8", "utf-16"]

# Limits (all optional; the values shown are the defaults)
# heuristics_max_depth = 10 # project-marker search depth, at most 64
# max_documents = 100 # open documents at once, 0 disables
# max_file_size = 10485760 # bytes, 0 disables, at most 1 GiB
# max_concurrent_server_starts = 8 # servers initializing at once
# indexing_ready_timeout_seconds = 30 # above 3 and below 60

# Language extension mappings (optional)
# mcpls recognizes 30 languages by default. Customize here to:
# - Add support for specialized file types
Expand Down Expand Up @@ -83,10 +90,18 @@ timeout_seconds = 30

# Uncomment and configure as needed:

# request_timeout_seconds = 30 # each LSP request behind a tool call
# indexing = "disabled" # opt out of indexing-readiness gating

# [lsp_servers.initialization_options]
# cargo.features = "all"
# checkOnSave.command = "clippy"

# Settings pushed after `initialized` and served on workspace/configuration
# (must not be empty)
# [lsp_servers.settings]
# "rust-analyzer.check.command" = "clippy"

# Python - pyright
# [[lsp_servers]]
# language_id = "python"
Expand All @@ -96,10 +111,13 @@ timeout_seconds = 30
# timeout_seconds = 30

# TypeScript/JavaScript - typescript-language-server
# selection = "auto" starts the native TypeScript 7 server (tsc --lsp --stdio)
# when it is installed; the command and args below are the fallback.
# [[lsp_servers]]
# language_id = "typescript"
# command = "typescript-language-server"
# args = ["--stdio"]
# selection = "auto"
# file_patterns = ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.jsx"]
# timeout_seconds = 30

Expand Down
5 changes: 3 additions & 2 deletions crates/mcpls-cli/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ Rust projects work with no configuration. For other languages, see [Minimal Conf

## Features

- 31 tools: hover, definition, references, diagnostics, rename, code actions, call and type hierarchies, and more
- Several language servers at once, with graceful degradation
- 31 tools: hover, definition, references, diagnostics, rename, code actions, call and type hierarchies, selection and folding ranges, and more
- Symbol-name addressing, `get_tool_support` discovery and `restart_server`
- Several language servers at once, started concurrently and stopped with mcpls, with graceful degradation
- stdio transport by default; optional HTTP transport behind the `transport-http` feature
- Untrusted-workspace mode (`--workspace-trust untrusted`) for code you do not trust

Expand Down
4 changes: 2 additions & 2 deletions crates/mcpls-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ User documentation: <https://bug-ops.github.io/mcpls/>. API documentation: <http

```toml
[dependencies]
mcpls-core = "0.6"
mcpls-core = "0.7"
```

Enable the `transport-http` feature to serve over Streamable HTTP:

```toml
[dependencies]
mcpls-core = { version = "0.6", features = ["transport-http"] }
mcpls-core = { version = "0.7", features = ["transport-http"] }
```

## Usage
Expand Down
2 changes: 1 addition & 1 deletion fuzz/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 7 additions & 6 deletions specs/MOC-specs.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ rather than one subsystem). Numbering restarts at 001 within each block.
|---|------|------|----------|--------|-------|
| 001 | [[config/001-config-discovery-and-heuristics/spec\|config-discovery-and-heuristics]] | enhancement | P1 | implemented (retroactive) | — |
| 002 | [[config/002-typescript-7-native-server-support/spec\|typescript-7-native-server-support]] | bug | P1 | implemented | #615, #634 |
| 003 | [[config/003-unsupported-file-pattern-forms/spec\|unsupported-file-pattern-forms]] | bug | P3 | approved (implemented, #669) | #669 |
| 003 | [[config/003-unsupported-file-pattern-forms/spec\|unsupported-file-pattern-forms]] | bug | P3 | implemented (#669) | #669 |

## lsp

Expand All @@ -38,7 +38,7 @@ rather than one subsystem). Numbering restarts at 001 within each block.
| # | Slug | Type | Priority | Status | Issue |
|---|------|------|----------|--------|-------|
| 001 | [[mcp/001-mcp-tool-surface-and-routing/spec\|mcp-tool-surface-and-routing]] | enhancement | P1 | implemented (retroactive) | — |
| 002 | [[mcp/002-mcp-resources-diagnostics/spec\|mcp-resources-diagnostics]] | enhancement | P3 | draft | #115; #468 (FR-006, FR-007); #521 (FR-008); #535 (FR-009); #544, #545 (FR-009..FR-012) |
| 002 | [[mcp/002-mcp-resources-diagnostics/spec\|mcp-resources-diagnostics]] | enhancement | P3 | implemented | #115; #468 (FR-006, FR-007); #521 (FR-008); #535 (FR-009); #544, #545 (FR-009..FR-012) |
| 003 | [[mcp/003-mcp-2026-stateless-adoption/spec\|mcp-2026-stateless-adoption]] | research | P3 | draft | #298; #493 (stateless subscriptions, closed as research); #522 (subscriptions/listen implemented); #593 (paced replay, bounded eviction record) |
| 004 | [[mcp/004-mcp-tasks-sep2663-adoption/spec\|mcp-tasks-sep2663-adoption]] | research | P4 | draft | #119 |
| 005 | [[mcp/005-tool-capability-discoverability/spec\|tool-capability-discoverability]] | research | P4 | implemented (#540) | #461 |
Expand All @@ -54,6 +54,7 @@ rather than one subsystem). Numbering restarts at 001 within each block.
| 015 | [[mcp/015-request-cancellation-propagation/spec\|request-cancellation-propagation]] | enhancement | P3 | draft | #687 |
| 016 | [[mcp/016-reject-unknown-tool-arguments/spec\|reject-unknown-tool-arguments]] | enhancement | P3 | implemented | #705 |
| 017 | [[mcp/017-bounded-client-string-echoes/spec\|bounded-client-string-echoes]] | enhancement (hardening) | P3 | draft | #749 |
| 018 | [[mcp/018-bounded-tool-inputs-and-results/spec\|bounded-tool-inputs-and-results]] | enhancement (retroactive) | P3 | implemented | #519, #606, #607, #730 |

## bridge

Expand All @@ -62,16 +63,16 @@ rather than one subsystem). Numbering restarts at 001 within each block.
| 001 | [[bridge/001-position-encoding-layer/spec\|position-encoding-layer]] | enhancement | P1 | implemented (retroactive) | — |
| 002 | [[bridge/002-document-tracker-synchronization/spec\|document-tracker-synchronization]] | enhancement | P1 | implemented (retroactive) | — |
| 003 | [[bridge/003-rwlock-translator/spec\|rwlock-translator]] | enhancement | P2 | superseded | #114 |
| 004 | [[bridge/004-get-diagnostics-flycheck-gap/spec\|get-diagnostics-flycheck-gap]] | bug | P1 | draft | — |
| 004 | [[bridge/004-get-diagnostics-flycheck-gap/spec\|get-diagnostics-flycheck-gap]] | bug | P1 | implemented | — |
| 005 | [[bridge/005-expose-document-tracker-limits/spec\|expose-document-tracker-limits]] | enhancement | P2 | implemented (#324) | — |
| 006 | [[bridge/006-lsp-indexing-readiness-gate/spec\|lsp-indexing-readiness-gate]] | bug | P1 | implemented (#421) | #420 |
| 007 | [[bridge/007-enclosing-symbol-context/spec\|enclosing-symbol-context]] | research | P4 | implemented | #565 |
| 008 | [[bridge/008-workspace-root-configured-spelling/spec\|workspace-root-configured-spelling]] | bug (regression of #533/#552) | P1 | implemented (#580); root-level system symlink aliases (#579) | #571, #579 |
| 009 | [[bridge/009-diagnostics-subscription-staleness/spec\|diagnostics-subscription-staleness]] | enhancement | P3 | implemented | #574; #648, #649 (follow-ups) |
| 010 | [[bridge/010-workspace-containment-single-predicate/spec\|workspace-containment-single-predicate]] | refactor | P2 | implemented (#580) | #558 |
| 011 | [[bridge/011-push-only-server-diagnostics/spec\|push-only-server-diagnostics]] | bug | P2 | draft (implemented, #666, #670) | #666; #670 |
| 012 | [[bridge/012-indexing-gate-after-restart/spec\|indexing-gate-after-restart]] | bug | P1 | draft (implemented, #667) | #667 |
| 013 | [[bridge/013-indexing-state-on-ungated-prepare-tools/spec\|indexing-state-on-ungated-prepare-tools]] | enhancement | P3 | draft (implemented, #668) | #668 |
| 011 | [[bridge/011-push-only-server-diagnostics/spec\|push-only-server-diagnostics]] | bug | P2 | implemented (#666, #670) | #666; #670 |
| 012 | [[bridge/012-indexing-gate-after-restart/spec\|indexing-gate-after-restart]] | bug | P1 | implemented (#667) | #667 |
| 013 | [[bridge/013-indexing-state-on-ungated-prepare-tools/spec\|indexing-state-on-ungated-prepare-tools]] | enhancement | P3 | implemented (#668) | #668 |
| 014 | [[bridge/014-stale-push-entry-merged-with-fresh-pull/spec\|stale-push-entry-merged-with-fresh-pull]] | bug | P2 | implemented (coverage-based exclusion, learned pull sources) | #703 |

## runtime
Expand Down
2 changes: 1 addition & 1 deletion specs/bridge/004-get-diagnostics-flycheck-gap/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ tags:
- bridge
- diagnostics
created: 2026-07-25
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[MOC-specs]]"
Expand Down
2 changes: 1 addition & 1 deletion specs/bridge/011-push-only-server-diagnostics/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tags:
- bridge
- diagnostics
created: 2026-10-06
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[bridge/004-get-diagnostics-flycheck-gap/spec|bridge/004-get-diagnostics-flycheck-gap]]"
Expand Down
2 changes: 1 addition & 1 deletion specs/bridge/012-indexing-gate-after-restart/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tags:
- lsp
- reliability
created: 2026-10-06
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[bridge/006-lsp-indexing-readiness-gate/spec|bridge/006-lsp-indexing-readiness-gate]]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tags:
- lsp
- reliability
created: 2026-10-06
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[bridge/006-lsp-indexing-readiness-gate/spec|bridge/006-lsp-indexing-readiness-gate]]"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tags:
- bridge
- diagnostics
created: 2026-10-06
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[MOC-specs]]"
Expand Down
2 changes: 1 addition & 1 deletion specs/config/003-unsupported-file-pattern-forms/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ tags:
- config
- diagnosability
created: 2026-10-06
status: approved
status: implemented
related:
- "[[constitution]]"
- "[[config/001-config-discovery-and-heuristics/spec|config/001-config-discovery-and-heuristics]]"
Expand Down
2 changes: 1 addition & 1 deletion specs/lsp/004-lsp-318-draft-gaps/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ Not applicable — no code changes result from this spec.
- Keep this spec's FRs marked speculative until their gating condition is met

### Ask First
- Promoting any FR from this spec into a dedicated implementation spec (new `.local/specs/NNN-*`
- Promoting any FR from this spec into a dedicated implementation spec (new `specs/<block>/NNN-*`
directory), even after a gating condition appears to be met

### Never
Expand Down
4 changes: 2 additions & 2 deletions specs/lsp/008-lsp317-method-coverage-gaps/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tags:
- lsp
- mcp
created: 2026-10-04
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[lsp/002-lsp317-missing-tools/spec|lsp317-missing-tools]]"
Expand All @@ -28,7 +28,7 @@ related:
> [!info] Metadata
> **Type**: enhancement / competitor-gap
> **Priority**: P3 (declaration), P4 (type hierarchy, prepare rename, document highlight, range formatting)
> **Implemented**: group A (declaration) with #567 as the `go_to_declaration` tool, routed through the `declaration` `handles` value, gated on `declarationProvider` and on indexing readiness like `get_definition`, taking a position only; link results are flattened like definition links. Groups B and C remain draft.
> **Implemented**: group A (declaration) with #567 as the `go_to_declaration` tool, routed through the `declaration` `handles` value, gated on `declarationProvider` and on indexing readiness like `get_definition`, taking a position only; link results are flattened like definition links. Groups B and C (type hierarchy, prepare rename, document highlight, range formatting) are implemented; see the decision below.
> **Related issues**: #567 (declaration, P3), #568 (type hierarchy, P4), #569 (minor methods: prepare rename, document highlight, range formatting, P4)

## Decision (#568, #569): Groups B and C implemented, declaration untouched
Expand Down
2 changes: 1 addition & 1 deletion specs/mcp/001-mcp-tool-surface-and-routing/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ serve.
- LSP server spawn/initialize/respawn mechanics themselves —
[[lsp/001-lsp-server-lifecycle-and-respawn/spec|spec lsp/001]].
- Position/range conversion inside each handler — [[bridge/001-position-encoding-layer/spec|spec bridge/001]].
- Adding new MCP tools — this spec documents the routing/dispatch architecture the existing 20
- Adding new MCP tools — this spec documents the routing/dispatch architecture the existing 31
tools already use, not a proposal for new tools (see
[[lsp/002-lsp317-missing-tools/spec|spec lsp/002]] for that history).

Expand Down
4 changes: 2 additions & 2 deletions specs/mcp/002-mcp-resources-diagnostics/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ tags:
- resources
- diagnostics
created: 2026-07-30
status: draft
status: implemented
related:
- "[[constitution]]"
- "[[bridge/004-get-diagnostics-flycheck-gap/spec]]"
Expand Down Expand Up @@ -78,7 +78,7 @@ SO THAT my implementation can be event-driven rather than polling-based.
| ID | Category | Requirement |
|----|----------|-------------|
| NFR-001 | Performance | Zero extra LSP round-trips: use the existing notification pump output |
| NFR-002 | Compatibility | rmcp crate must expose resource registration and `notifications/resources/updated` send API — verify before implementation (rmcp 3.2.0 currently used) |
| NFR-002 | Compatibility | rmcp crate must expose resource registration and `notifications/resources/updated` send API — verify before implementation (rmcp 3.5.1 currently used) |
| NFR-003 | Performance | Steady-state publishes for already-seen files cost no filesystem call (memo hit); a cold burst is bounded by 8 parallel canonicalizations rather than one per publish in sequence (#550) |

## 5. See Also
Expand Down
6 changes: 3 additions & 3 deletions specs/mcp/003-mcp-2026-stateless-adoption/spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ between spec versions under time pressure.

**Acceptance criteria:**
```
GIVEN this spec exists in .local/specs/mcp/003-mcp-2026-stateless-adoption/
GIVEN this spec exists in specs/mcp/003-mcp-2026-stateless-adoption/
WHEN a maintainer next reviews rmcp's release notes for a version that claims
2026-07-28 conformance
THEN this spec's Functional Requirements table gives them a checklist of the
Expand Down Expand Up @@ -158,7 +158,7 @@ this finding is P3 research, and `rmcp` conformance work is incomplete.
|----|----------|-------------|
| NFR-001 | Backward compatibility | mcpls SHALL NOT upgrade its `rmcp` dependency to a version that makes the stateless (no-`initialize`) model the *only* supported mode until `rmcp`'s own Tier rollout (per its roadmap) reaches a stage the maintainers judge stable — avoids adopting an unstable protocol surface mid-rollout |
| NFR-002 | Compatibility window | Given Roots, Sampling, and Logging carry a 12-month deprecation window in 2026-07-28, mcpls's migration timeline SHOULD align with that window rather than rushing ahead of it, since mcpls does not currently implement Sampling or Elicitation (Roots/Logging usage should be confirmed — `[NEEDS CLARIFICATION: does mcpls currently use MCP Roots or Logging features from crates/mcpls-core/src/mcp/, and if so, are they exposed to clients today?]`) |
| NFR-003 | Traceability | This spec SHALL be discoverable from `.local/specs/MOC-specs.md` and cross-linked with issues #119 and #122 so a future continuous-improvement cycle surfaces it automatically when scanning open research items |
| NFR-003 | Traceability | This spec SHALL be discoverable from `specs/MOC-specs.md` and cross-linked with issues #119 and #122 so a future continuous-improvement cycle surfaces it automatically when scanning open research items |
| NFR-004 | No premature action | No source code under `crates/` SHALL be modified as a result of this spec — it is a tracking/planning artifact only, consistent with its P3/research classification |

## 5. Data Model
Expand Down Expand Up @@ -186,7 +186,7 @@ that mcpls's MCP layer will eventually need to represent:

| ID | Metric | Target |
|----|--------|--------|
| SC-001 | Spec discoverability | Spec is linked from `.local/specs/MOC-specs.md` and readable without additional context |
| SC-001 | Spec discoverability | Spec is linked from `specs/MOC-specs.md` and readable without additional context |
| SC-002 | Issue cross-linking | Issues #119 and #122 (or their successors) reference this spec, or this spec is referenced from a future issue tracking the actual migration |
| SC-003 | No premature implementation | Zero commits to `crates/` reference this spec as their justification until `rmcp` conformance is confirmed by a maintainer |

Expand Down
Loading
Loading