lodesman-mcp 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lodesman_mcp-0.3.0/.gitignore +29 -0
- lodesman_mcp-0.3.0/LICENSE +21 -0
- lodesman_mcp-0.3.0/NOTICE.md +46 -0
- lodesman_mcp-0.3.0/PKG-INFO +196 -0
- lodesman_mcp-0.3.0/README.md +162 -0
- lodesman_mcp-0.3.0/pyproject.toml +62 -0
- lodesman_mcp-0.3.0/scripts/smoke_test.py +217 -0
- lodesman_mcp-0.3.0/src/lodesman/__init__.py +25 -0
- lodesman_mcp-0.3.0/src/lodesman/__main__.py +11 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/.gitignore +1 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/LICENSE +37 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/__init__.py +4 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/_compat.py +184 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/dependency_provider.py +371 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/initialize_params.py +84 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ada_language_server.py +218 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/al_language_server.py +1067 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/angular_language_server.py +692 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ansible_language_server.py +335 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/basedpyright_server.py +198 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/bash_language_server.py +298 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/bsl_language_server.py +218 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ccls_language_server.py +152 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/clangd_language_server.py +419 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/clojure_lsp.py +409 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/common.py +195 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/crystal_language_server.py +153 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/csharp_language_server.py +761 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/cue_language_server.py +260 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/dart_language_server.py +234 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/deno_language_server.py +153 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/eclipse_jdtls.py +1432 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/README.md +87 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/__init__.py +1 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/elixir_tools.py +415 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elm_language_server.py +242 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/erlang_language_server.py +255 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fatou_language_server.py +120 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fortran_language_server.py +312 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fsharp_language_server.py +441 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/gleam_language_server.py +231 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/godot_language_server.py +139 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/gopls.py +331 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/groovy_language_server.py +319 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/haskell_language_server.py +370 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/haxe_language_server.py +409 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/hlsl_language_server.py +251 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/intelephense.py +214 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/jedi_server.py +181 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/json_language_server.py +164 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/julia_server.py +210 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/kotlin_language_server.py +648 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/lean4_language_server.py +162 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/lua_ls.py +329 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/luau_lsp.py +375 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/marksman.py +261 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/matlab_language_server.py +534 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/msl_language_server.py +100 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/msl_lsp_server.py +440 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/nextflow_language_server.py +371 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/nixd_ls.py +434 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ocaml_lsp_server.py +425 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/initialize_params.json +631 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/runtime_dependencies.json +450 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/workspace_did_change_configuration.json +111 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp.py +414 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pascal_server.py +963 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/perl_language_server.py +233 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/phpactor.py +178 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/phpantom.py +286 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/powershell_language_server.py +420 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pyrefly_server.py +297 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pyright_server.py +243 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/qml_language_server.py +129 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/r_language_server.py +148 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/regal_server.py +118 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ruby_lsp.py +499 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/rust_analyzer.py +786 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/scala_language_server.py +795 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solargraph.py +350 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solidity_homedir_preload.cjs +11 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solidity_language_server.py +463 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/some_sass_language_server.py +227 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/sourcekit_lsp.py +373 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/svelte_language_server.py +727 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/systemverilog_server.py +215 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/taplo_server.py +284 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/terraform_ls.py +275 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/texlab_language_server.py +187 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ty_server.py +136 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/typescript_language_server.py +593 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vscode_html_language_server.py +166 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vts_language_server.py +243 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vue_language_server.py +944 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/wolfram_language_server.py +184 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/yaml_language_server.py +190 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/zls.py +226 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls.py +3288 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_config.py +1158 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_exceptions.py +84 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_process.py +830 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_request.py +385 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_types.py +426 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_utils.py +800 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_constants.py +70 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_requests.py +562 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_types.py +5962 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/server.py +162 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/resources/downloaded_dependency_hashes.json +20 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/settings.py +97 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/cache.py +25 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/metals_db_utils.py +281 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/subprocess_util.py +439 -0
- lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/zip.py +130 -0
- lodesman_mcp-0.3.0/src/lodesman/server.py +1187 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Our own working notes, probes, diagnostics and captured logs. Deliberately
|
|
2
|
+
# not published: they are handover documents and speculation, not documentation.
|
|
3
|
+
workdocs/
|
|
4
|
+
|
|
5
|
+
# Python
|
|
6
|
+
.venv/
|
|
7
|
+
__pycache__/
|
|
8
|
+
*.py[cod]
|
|
9
|
+
*.egg-info/
|
|
10
|
+
build/
|
|
11
|
+
dist/
|
|
12
|
+
|
|
13
|
+
# Downloaded language servers (Roslyn, tsserver, …) and their caches — large,
|
|
14
|
+
# regenerable, machine-specific.
|
|
15
|
+
.solidlsp/
|
|
16
|
+
|
|
17
|
+
# The Portainer MCP server writes its tool manifest into whatever directory it
|
|
18
|
+
# starts in. Not ours; it reappears after every delete.
|
|
19
|
+
tools.yaml
|
|
20
|
+
|
|
21
|
+
# Editor/OS noise
|
|
22
|
+
.vscode/
|
|
23
|
+
.idea/
|
|
24
|
+
Thumbs.db
|
|
25
|
+
.DS_Store
|
|
26
|
+
|
|
27
|
+
# Generated indexes and logs — regenerable, multi-MB, not part of the tool.
|
|
28
|
+
out/
|
|
29
|
+
*.log
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Christer Åkerlund
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
Lodesman is MIT-licensed (see `LICENSE`). It bundles the following third-party
|
|
4
|
+
code, which is also MIT-licensed.
|
|
5
|
+
|
|
6
|
+
## SolidLSP
|
|
7
|
+
|
|
8
|
+
- **Location in this distribution:** `src/lodesman/_vendor/solidlsp/`
|
|
9
|
+
- **Upstream:** https://github.com/oraios/serena
|
|
10
|
+
- **License:** MIT — full text at `src/lodesman/_vendor/solidlsp/LICENSE`
|
|
11
|
+
- **Copyright:** © 2025–2026 Jain & Panchenko IT-Berater Partnerschaft
|
|
12
|
+
(Oraios AI) and contributors
|
|
13
|
+
|
|
14
|
+
SolidLSP is the language-server client library Lodesman is built on. It is
|
|
15
|
+
vendored rather than declared as a dependency because it is not published to
|
|
16
|
+
PyPI independently of the Serena application.
|
|
17
|
+
|
|
18
|
+
The Serena repository is licensed per component: SolidLSP under MIT, the Serena
|
|
19
|
+
application under GPL-3.0-or-later. **Only SolidLSP is bundled here.** No part
|
|
20
|
+
of the Serena application is included or distributed, so no GPL obligations
|
|
21
|
+
attach to Lodesman. Upstream's own licensing overview states that the SolidLSP
|
|
22
|
+
files "remain MIT-licensed and may be obtained, extracted and used separately
|
|
23
|
+
under MIT terms."
|
|
24
|
+
|
|
25
|
+
The vendored tree is kept unmodified, with its per-file SPDX headers intact, so
|
|
26
|
+
that it can be re-synced with upstream. Lodesman's own behaviour lives entirely
|
|
27
|
+
outside it.
|
|
28
|
+
|
|
29
|
+
### OLSP
|
|
30
|
+
|
|
31
|
+
Some files under `_vendor/solidlsp/lsp_protocol_handler/` are derived from
|
|
32
|
+
[OLSP](https://github.com/predragnikolic/OLSP), © 2023 Предраг Николић, MIT.
|
|
33
|
+
The original notices are retained in those files.
|
|
34
|
+
|
|
35
|
+
## Runtime dependencies
|
|
36
|
+
|
|
37
|
+
Installed from PyPI rather than bundled; each carries its own license:
|
|
38
|
+
`pygls`, `lsprotocol`, `psutil`, `pathspec`, `overrides`, `sensai-utils`,
|
|
39
|
+
`filelock`, `requests`, `charset-normalizer`, `typing-extensions`.
|
|
40
|
+
|
|
41
|
+
## Language servers
|
|
42
|
+
|
|
43
|
+
Lodesman downloads language servers (Roslyn, typescript-language-server, and
|
|
44
|
+
others) on first use into `~/.solidlsp`. These are **not** bundled and are not
|
|
45
|
+
covered by this notice — each is obtained from its own publisher under its own
|
|
46
|
+
license.
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: lodesman-mcp
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Compiler-grade code intelligence over MCP — a language server's own answers, as agent tools
|
|
5
|
+
Project-URL: Homepage, https://github.com/florpan/lodesman
|
|
6
|
+
Project-URL: Source, https://github.com/florpan/lodesman
|
|
7
|
+
Project-URL: Issues, https://github.com/florpan/lodesman/issues
|
|
8
|
+
Author: Christer Åkerlund
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: NOTICE.md
|
|
12
|
+
License-File: src/lodesman/_vendor/solidlsp/LICENSE
|
|
13
|
+
Keywords: agent,claude,code-intelligence,language-server,lsp,mcp
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
20
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Requires-Dist: charset-normalizer>=3.4
|
|
23
|
+
Requires-Dist: filelock>=3.16
|
|
24
|
+
Requires-Dist: lsprotocol>=2025.0.0
|
|
25
|
+
Requires-Dist: oslex>=2.0
|
|
26
|
+
Requires-Dist: overrides>=7.7
|
|
27
|
+
Requires-Dist: pathspec>=1.1
|
|
28
|
+
Requires-Dist: psutil>=7.0
|
|
29
|
+
Requires-Dist: pygls>=2.1.1
|
|
30
|
+
Requires-Dist: requests>=2.32
|
|
31
|
+
Requires-Dist: sensai-utils>=1.6
|
|
32
|
+
Requires-Dist: typing-extensions>=4.12
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
# Lodesman
|
|
36
|
+
|
|
37
|
+
**Compiler-grade code intelligence over MCP.** Lodesman puts a real language
|
|
38
|
+
server behind your coding agent's tools, so "who calls this?" is answered by the
|
|
39
|
+
compiler rather than by a text search.
|
|
40
|
+
|
|
41
|
+
A lodesman is the pilot who comes aboard and steers a ship through waters the
|
|
42
|
+
captain doesn't know. That is the job: an agent dropped into an unfamiliar
|
|
43
|
+
repository, guided by something with local knowledge.
|
|
44
|
+
|
|
45
|
+
> **Status: alpha.** The tool surface is still growing and not every tool is
|
|
46
|
+
> finished. If you hit something broken, an issue is genuinely useful — see
|
|
47
|
+
> [Status](#status).
|
|
48
|
+
|
|
49
|
+
## Why
|
|
50
|
+
|
|
51
|
+
An agent's dominant cost is reading files into context, and a tool that returns
|
|
52
|
+
*coordinates* makes that worse, not better — `Program.cs — L135` forces the
|
|
53
|
+
agent to read the file anyway.
|
|
54
|
+
|
|
55
|
+
Measured on a real C# repository, answering "what uses `RagQueryService`":
|
|
56
|
+
|
|
57
|
+
| approach | cost |
|
|
58
|
+
|---|---|
|
|
59
|
+
| read the three files involved | 1745 lines, ~17.7k tokens |
|
|
60
|
+
| the 3 references, with ±6 lines of code each | ~36 lines, ~370 tokens |
|
|
61
|
+
|
|
62
|
+
**~48× cheaper**, and it is a better answer. So Lodesman's tools return code,
|
|
63
|
+
not locations. A location is a promise of future cost; the code is the answer.
|
|
64
|
+
|
|
65
|
+
The second reason is correctness. An agent cannot tell a true "no results" from
|
|
66
|
+
a broken query, so a plausible empty answer is the most dangerous thing a
|
|
67
|
+
navigation tool can produce. Lodesman gates every answer on the language server
|
|
68
|
+
actually being ready, and distinguishes "none" from "couldn't tell".
|
|
69
|
+
|
|
70
|
+
## Install
|
|
71
|
+
|
|
72
|
+
Requires Python 3.11+.
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
uvx lodesman-mcp # run without installing
|
|
76
|
+
pipx install lodesman-mcp # or install it
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Wire it into Claude Code
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
claude mcp add lodesman --scope user -- uvx lodesman-mcp
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Or, for any MCP client, in the config directly:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"mcpServers": {
|
|
90
|
+
"lodesman": {
|
|
91
|
+
"command": "uvx",
|
|
92
|
+
"args": ["lodesman-mcp"]
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
With no arguments Lodesman binds to the working directory it is launched in,
|
|
99
|
+
which is what MCP clients give it. One user-scoped entry therefore works across
|
|
100
|
+
every project — no per-project configuration.
|
|
101
|
+
|
|
102
|
+
To point it somewhere explicitly:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
lodesman-mcp /path/to/repo --language csharp
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### First run
|
|
109
|
+
|
|
110
|
+
The language server itself is downloaded on first use into `~/.solidlsp`
|
|
111
|
+
(override with `SOLIDLSP_HOME`). For C# this pulls Roslyn from NuGet and **can
|
|
112
|
+
take several minutes**. Later runs reuse it and start in seconds.
|
|
113
|
+
|
|
114
|
+
The server process starts immediately; the language server behind it starts
|
|
115
|
+
lazily on the first tool call and is then kept warm for the life of the process.
|
|
116
|
+
That is the whole design: a cold Roslyn costs minutes, a warm one answers in
|
|
117
|
+
milliseconds and tracks your edits incrementally.
|
|
118
|
+
|
|
119
|
+
## Verify your install
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
python scripts/smoke_test.py /path/to/repo --language csharp
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
This starts a real language server against a real repository and proves it
|
|
126
|
+
answers the two questions everything else is built on — what symbols are in this
|
|
127
|
+
file, and who references this symbol — with cross-file results the compiler
|
|
128
|
+
agrees with.
|
|
129
|
+
|
|
130
|
+
## Tools
|
|
131
|
+
|
|
132
|
+
| tool | what it answers |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `project_info` | which repository this server bound to, and how |
|
|
135
|
+
| `find_symbol` | find a symbol by name anywhere in the project |
|
|
136
|
+
| `find_definition` | where is this defined |
|
|
137
|
+
| `find_references` | what actually uses this, with the surrounding code |
|
|
138
|
+
| `find_implementations` | concrete implementations of an interface or abstract member |
|
|
139
|
+
| `document_symbols` | outline one file: its types, methods and fields |
|
|
140
|
+
| `get_symbol_body` | the full source of one declaration, by name |
|
|
141
|
+
| `explain_symbol` | resolved type, signature and documentation |
|
|
142
|
+
| `blast_radius` | what breaks if this symbol changes |
|
|
143
|
+
| `rename_symbol` | rename everywhere, using the compiler's understanding |
|
|
144
|
+
| `check` | compiler diagnostics for one file, from the warm server |
|
|
145
|
+
|
|
146
|
+
`blast_radius` and `check` are the two that exist specifically because agents
|
|
147
|
+
edit code they haven't read: one tells you the cost of a change before you make
|
|
148
|
+
it, the other verifies it afterwards without a full build.
|
|
149
|
+
|
|
150
|
+
## How it binds to a project
|
|
151
|
+
|
|
152
|
+
One server process serves one repository, chosen at startup: the path you pass,
|
|
153
|
+
or the working directory if you pass nothing.
|
|
154
|
+
|
|
155
|
+
The language is detected by counting source files under that root and taking the
|
|
156
|
+
majority. Pass `--language` when that guess is wrong — a repo with a TypeScript
|
|
157
|
+
frontend and a C# backend has to be told which one you mean:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
lodesman-mcp . --language typescript
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Status
|
|
164
|
+
|
|
165
|
+
Alpha. The tool surface is still growing, and not every tool is finished.
|
|
166
|
+
|
|
167
|
+
Lodesman inherits SolidLSP's language coverage, and runs wherever its language
|
|
168
|
+
servers do. Not every language and platform combination has been exercised yet,
|
|
169
|
+
so if you try one and it breaks, please
|
|
170
|
+
[open an issue](https://github.com/florpan/lodesman/issues) — a report with the
|
|
171
|
+
language, the OS and the stderr output is the most useful thing you can send.
|
|
172
|
+
Testing help is very welcome.
|
|
173
|
+
|
|
174
|
+
Known issues are listed here as they are found.
|
|
175
|
+
|
|
176
|
+
## Built on SolidLSP
|
|
177
|
+
|
|
178
|
+
The language-server client layer is [SolidLSP](https://github.com/oraios/serena),
|
|
179
|
+
MIT, vendored unmodified under `src/lodesman/_vendor/`. It is bundled rather
|
|
180
|
+
than depended on because it is not published to PyPI independently of the Serena
|
|
181
|
+
application, which is GPL and is **not** included here.
|
|
182
|
+
|
|
183
|
+
Everything Lodesman does lives outside that tree — the project anchoring, the
|
|
184
|
+
readiness gate, the cross-file indexing wait, symbol ranking, and the decision
|
|
185
|
+
to return code instead of coordinates were all solved by *calling* SolidLSP
|
|
186
|
+
differently, never by editing it. That rule is what keeps re-syncing with
|
|
187
|
+
upstream cheap.
|
|
188
|
+
|
|
189
|
+
See [NOTICE.md](NOTICE.md) for full attribution.
|
|
190
|
+
|
|
191
|
+
## License
|
|
192
|
+
|
|
193
|
+
MIT — see [LICENSE](LICENSE).
|
|
194
|
+
|
|
195
|
+
Bundled third-party code, its copyright holders and its license texts are listed
|
|
196
|
+
in [NOTICE.md](NOTICE.md). Everything bundled is MIT-licensed.
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Lodesman
|
|
2
|
+
|
|
3
|
+
**Compiler-grade code intelligence over MCP.** Lodesman puts a real language
|
|
4
|
+
server behind your coding agent's tools, so "who calls this?" is answered by the
|
|
5
|
+
compiler rather than by a text search.
|
|
6
|
+
|
|
7
|
+
A lodesman is the pilot who comes aboard and steers a ship through waters the
|
|
8
|
+
captain doesn't know. That is the job: an agent dropped into an unfamiliar
|
|
9
|
+
repository, guided by something with local knowledge.
|
|
10
|
+
|
|
11
|
+
> **Status: alpha.** The tool surface is still growing and not every tool is
|
|
12
|
+
> finished. If you hit something broken, an issue is genuinely useful — see
|
|
13
|
+
> [Status](#status).
|
|
14
|
+
|
|
15
|
+
## Why
|
|
16
|
+
|
|
17
|
+
An agent's dominant cost is reading files into context, and a tool that returns
|
|
18
|
+
*coordinates* makes that worse, not better — `Program.cs — L135` forces the
|
|
19
|
+
agent to read the file anyway.
|
|
20
|
+
|
|
21
|
+
Measured on a real C# repository, answering "what uses `RagQueryService`":
|
|
22
|
+
|
|
23
|
+
| approach | cost |
|
|
24
|
+
|---|---|
|
|
25
|
+
| read the three files involved | 1745 lines, ~17.7k tokens |
|
|
26
|
+
| the 3 references, with ±6 lines of code each | ~36 lines, ~370 tokens |
|
|
27
|
+
|
|
28
|
+
**~48× cheaper**, and it is a better answer. So Lodesman's tools return code,
|
|
29
|
+
not locations. A location is a promise of future cost; the code is the answer.
|
|
30
|
+
|
|
31
|
+
The second reason is correctness. An agent cannot tell a true "no results" from
|
|
32
|
+
a broken query, so a plausible empty answer is the most dangerous thing a
|
|
33
|
+
navigation tool can produce. Lodesman gates every answer on the language server
|
|
34
|
+
actually being ready, and distinguishes "none" from "couldn't tell".
|
|
35
|
+
|
|
36
|
+
## Install
|
|
37
|
+
|
|
38
|
+
Requires Python 3.11+.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
uvx lodesman-mcp # run without installing
|
|
42
|
+
pipx install lodesman-mcp # or install it
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Wire it into Claude Code
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
claude mcp add lodesman --scope user -- uvx lodesman-mcp
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Or, for any MCP client, in the config directly:
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"mcpServers": {
|
|
56
|
+
"lodesman": {
|
|
57
|
+
"command": "uvx",
|
|
58
|
+
"args": ["lodesman-mcp"]
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
With no arguments Lodesman binds to the working directory it is launched in,
|
|
65
|
+
which is what MCP clients give it. One user-scoped entry therefore works across
|
|
66
|
+
every project — no per-project configuration.
|
|
67
|
+
|
|
68
|
+
To point it somewhere explicitly:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
lodesman-mcp /path/to/repo --language csharp
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### First run
|
|
75
|
+
|
|
76
|
+
The language server itself is downloaded on first use into `~/.solidlsp`
|
|
77
|
+
(override with `SOLIDLSP_HOME`). For C# this pulls Roslyn from NuGet and **can
|
|
78
|
+
take several minutes**. Later runs reuse it and start in seconds.
|
|
79
|
+
|
|
80
|
+
The server process starts immediately; the language server behind it starts
|
|
81
|
+
lazily on the first tool call and is then kept warm for the life of the process.
|
|
82
|
+
That is the whole design: a cold Roslyn costs minutes, a warm one answers in
|
|
83
|
+
milliseconds and tracks your edits incrementally.
|
|
84
|
+
|
|
85
|
+
## Verify your install
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
python scripts/smoke_test.py /path/to/repo --language csharp
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This starts a real language server against a real repository and proves it
|
|
92
|
+
answers the two questions everything else is built on — what symbols are in this
|
|
93
|
+
file, and who references this symbol — with cross-file results the compiler
|
|
94
|
+
agrees with.
|
|
95
|
+
|
|
96
|
+
## Tools
|
|
97
|
+
|
|
98
|
+
| tool | what it answers |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `project_info` | which repository this server bound to, and how |
|
|
101
|
+
| `find_symbol` | find a symbol by name anywhere in the project |
|
|
102
|
+
| `find_definition` | where is this defined |
|
|
103
|
+
| `find_references` | what actually uses this, with the surrounding code |
|
|
104
|
+
| `find_implementations` | concrete implementations of an interface or abstract member |
|
|
105
|
+
| `document_symbols` | outline one file: its types, methods and fields |
|
|
106
|
+
| `get_symbol_body` | the full source of one declaration, by name |
|
|
107
|
+
| `explain_symbol` | resolved type, signature and documentation |
|
|
108
|
+
| `blast_radius` | what breaks if this symbol changes |
|
|
109
|
+
| `rename_symbol` | rename everywhere, using the compiler's understanding |
|
|
110
|
+
| `check` | compiler diagnostics for one file, from the warm server |
|
|
111
|
+
|
|
112
|
+
`blast_radius` and `check` are the two that exist specifically because agents
|
|
113
|
+
edit code they haven't read: one tells you the cost of a change before you make
|
|
114
|
+
it, the other verifies it afterwards without a full build.
|
|
115
|
+
|
|
116
|
+
## How it binds to a project
|
|
117
|
+
|
|
118
|
+
One server process serves one repository, chosen at startup: the path you pass,
|
|
119
|
+
or the working directory if you pass nothing.
|
|
120
|
+
|
|
121
|
+
The language is detected by counting source files under that root and taking the
|
|
122
|
+
majority. Pass `--language` when that guess is wrong — a repo with a TypeScript
|
|
123
|
+
frontend and a C# backend has to be told which one you mean:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
lodesman-mcp . --language typescript
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Status
|
|
130
|
+
|
|
131
|
+
Alpha. The tool surface is still growing, and not every tool is finished.
|
|
132
|
+
|
|
133
|
+
Lodesman inherits SolidLSP's language coverage, and runs wherever its language
|
|
134
|
+
servers do. Not every language and platform combination has been exercised yet,
|
|
135
|
+
so if you try one and it breaks, please
|
|
136
|
+
[open an issue](https://github.com/florpan/lodesman/issues) — a report with the
|
|
137
|
+
language, the OS and the stderr output is the most useful thing you can send.
|
|
138
|
+
Testing help is very welcome.
|
|
139
|
+
|
|
140
|
+
Known issues are listed here as they are found.
|
|
141
|
+
|
|
142
|
+
## Built on SolidLSP
|
|
143
|
+
|
|
144
|
+
The language-server client layer is [SolidLSP](https://github.com/oraios/serena),
|
|
145
|
+
MIT, vendored unmodified under `src/lodesman/_vendor/`. It is bundled rather
|
|
146
|
+
than depended on because it is not published to PyPI independently of the Serena
|
|
147
|
+
application, which is GPL and is **not** included here.
|
|
148
|
+
|
|
149
|
+
Everything Lodesman does lives outside that tree — the project anchoring, the
|
|
150
|
+
readiness gate, the cross-file indexing wait, symbol ranking, and the decision
|
|
151
|
+
to return code instead of coordinates were all solved by *calling* SolidLSP
|
|
152
|
+
differently, never by editing it. That rule is what keeps re-syncing with
|
|
153
|
+
upstream cheap.
|
|
154
|
+
|
|
155
|
+
See [NOTICE.md](NOTICE.md) for full attribution.
|
|
156
|
+
|
|
157
|
+
## License
|
|
158
|
+
|
|
159
|
+
MIT — see [LICENSE](LICENSE).
|
|
160
|
+
|
|
161
|
+
Bundled third-party code, its copyright holders and its license texts are listed
|
|
162
|
+
in [NOTICE.md](NOTICE.md). Everything bundled is MIT-licensed.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "lodesman-mcp"
|
|
7
|
+
version = "0.3.0"
|
|
8
|
+
description = "Compiler-grade code intelligence over MCP — a language server's own answers, as agent tools"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
license = "MIT"
|
|
12
|
+
license-files = ["LICENSE", "NOTICE.md", "src/lodesman/_vendor/solidlsp/LICENSE"]
|
|
13
|
+
authors = [{ name = "Christer Åkerlund" }]
|
|
14
|
+
keywords = ["mcp", "lsp", "language-server", "code-intelligence", "agent", "claude"]
|
|
15
|
+
classifiers = [
|
|
16
|
+
"Development Status :: 3 - Alpha",
|
|
17
|
+
"Intended Audience :: Developers",
|
|
18
|
+
"Programming Language :: Python :: 3.11",
|
|
19
|
+
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Topic :: Software Development :: Code Generators",
|
|
22
|
+
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
# Transitive dependencies of the vendored SolidLSP tree, which cannot declare
|
|
26
|
+
# its own since it is not a separate distribution. Lower bounds are the
|
|
27
|
+
# versions Lodesman has actually been run against, not guesses.
|
|
28
|
+
dependencies = [
|
|
29
|
+
"pygls>=2.1.1",
|
|
30
|
+
"lsprotocol>=2025.0.0",
|
|
31
|
+
"psutil>=7.0",
|
|
32
|
+
"pathspec>=1.1",
|
|
33
|
+
"overrides>=7.7",
|
|
34
|
+
"sensai-utils>=1.6",
|
|
35
|
+
"filelock>=3.16",
|
|
36
|
+
"oslex>=2.0",
|
|
37
|
+
"requests>=2.32",
|
|
38
|
+
"charset-normalizer>=3.4",
|
|
39
|
+
"typing-extensions>=4.12",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[project.urls]
|
|
43
|
+
Homepage = "https://github.com/florpan/lodesman"
|
|
44
|
+
Source = "https://github.com/florpan/lodesman"
|
|
45
|
+
Issues = "https://github.com/florpan/lodesman/issues"
|
|
46
|
+
|
|
47
|
+
[project.scripts]
|
|
48
|
+
lodesman-mcp = "lodesman.server:main"
|
|
49
|
+
|
|
50
|
+
[tool.hatch.build.targets.wheel]
|
|
51
|
+
packages = ["src/lodesman"]
|
|
52
|
+
|
|
53
|
+
[tool.hatch.build.targets.sdist]
|
|
54
|
+
include = ["src/lodesman", "scripts", "README.md", "LICENSE", "NOTICE.md", "pyproject.toml"]
|
|
55
|
+
|
|
56
|
+
# The vendored tree ships whole: its language-server manifests and the Solidity
|
|
57
|
+
# preload script are data files the code reads at runtime, not dead weight.
|
|
58
|
+
[tool.hatch.build]
|
|
59
|
+
artifacts = [
|
|
60
|
+
"src/lodesman/_vendor/solidlsp/**/*.json",
|
|
61
|
+
"src/lodesman/_vendor/solidlsp/**/*.cjs",
|
|
62
|
+
]
|