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.
Files changed (115) hide show
  1. lodesman_mcp-0.3.0/.gitignore +29 -0
  2. lodesman_mcp-0.3.0/LICENSE +21 -0
  3. lodesman_mcp-0.3.0/NOTICE.md +46 -0
  4. lodesman_mcp-0.3.0/PKG-INFO +196 -0
  5. lodesman_mcp-0.3.0/README.md +162 -0
  6. lodesman_mcp-0.3.0/pyproject.toml +62 -0
  7. lodesman_mcp-0.3.0/scripts/smoke_test.py +217 -0
  8. lodesman_mcp-0.3.0/src/lodesman/__init__.py +25 -0
  9. lodesman_mcp-0.3.0/src/lodesman/__main__.py +11 -0
  10. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/.gitignore +1 -0
  11. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/LICENSE +37 -0
  12. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/__init__.py +4 -0
  13. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/_compat.py +184 -0
  14. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/dependency_provider.py +371 -0
  15. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/initialize_params.py +84 -0
  16. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ada_language_server.py +218 -0
  17. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/al_language_server.py +1067 -0
  18. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/angular_language_server.py +692 -0
  19. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ansible_language_server.py +335 -0
  20. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/basedpyright_server.py +198 -0
  21. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/bash_language_server.py +298 -0
  22. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/bsl_language_server.py +218 -0
  23. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ccls_language_server.py +152 -0
  24. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/clangd_language_server.py +419 -0
  25. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/clojure_lsp.py +409 -0
  26. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/common.py +195 -0
  27. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/crystal_language_server.py +153 -0
  28. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/csharp_language_server.py +761 -0
  29. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/cue_language_server.py +260 -0
  30. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/dart_language_server.py +234 -0
  31. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/deno_language_server.py +153 -0
  32. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/eclipse_jdtls.py +1432 -0
  33. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/README.md +87 -0
  34. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/__init__.py +1 -0
  35. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elixir_tools/elixir_tools.py +415 -0
  36. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/elm_language_server.py +242 -0
  37. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/erlang_language_server.py +255 -0
  38. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fatou_language_server.py +120 -0
  39. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fortran_language_server.py +312 -0
  40. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/fsharp_language_server.py +441 -0
  41. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/gleam_language_server.py +231 -0
  42. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/godot_language_server.py +139 -0
  43. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/gopls.py +331 -0
  44. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/groovy_language_server.py +319 -0
  45. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/haskell_language_server.py +370 -0
  46. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/haxe_language_server.py +409 -0
  47. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/hlsl_language_server.py +251 -0
  48. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/intelephense.py +214 -0
  49. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/jedi_server.py +181 -0
  50. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/json_language_server.py +164 -0
  51. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/julia_server.py +210 -0
  52. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/kotlin_language_server.py +648 -0
  53. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/lean4_language_server.py +162 -0
  54. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/lua_ls.py +329 -0
  55. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/luau_lsp.py +375 -0
  56. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/marksman.py +261 -0
  57. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/matlab_language_server.py +534 -0
  58. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/msl_language_server.py +100 -0
  59. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/msl_lsp_server.py +440 -0
  60. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/nextflow_language_server.py +371 -0
  61. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/nixd_ls.py +434 -0
  62. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ocaml_lsp_server.py +425 -0
  63. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/initialize_params.json +631 -0
  64. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/runtime_dependencies.json +450 -0
  65. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp/workspace_did_change_configuration.json +111 -0
  66. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/omnisharp.py +414 -0
  67. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pascal_server.py +963 -0
  68. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/perl_language_server.py +233 -0
  69. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/phpactor.py +178 -0
  70. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/phpantom.py +286 -0
  71. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/powershell_language_server.py +420 -0
  72. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pyrefly_server.py +297 -0
  73. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/pyright_server.py +243 -0
  74. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/qml_language_server.py +129 -0
  75. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/r_language_server.py +148 -0
  76. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/regal_server.py +118 -0
  77. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ruby_lsp.py +499 -0
  78. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/rust_analyzer.py +786 -0
  79. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/scala_language_server.py +795 -0
  80. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solargraph.py +350 -0
  81. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solidity_homedir_preload.cjs +11 -0
  82. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/solidity_language_server.py +463 -0
  83. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/some_sass_language_server.py +227 -0
  84. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/sourcekit_lsp.py +373 -0
  85. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/svelte_language_server.py +727 -0
  86. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/systemverilog_server.py +215 -0
  87. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/taplo_server.py +284 -0
  88. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/terraform_ls.py +275 -0
  89. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/texlab_language_server.py +187 -0
  90. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/ty_server.py +136 -0
  91. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/typescript_language_server.py +593 -0
  92. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vscode_html_language_server.py +166 -0
  93. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vts_language_server.py +243 -0
  94. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/vue_language_server.py +944 -0
  95. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/wolfram_language_server.py +184 -0
  96. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/yaml_language_server.py +190 -0
  97. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/language_servers/zls.py +226 -0
  98. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls.py +3288 -0
  99. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_config.py +1158 -0
  100. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_exceptions.py +84 -0
  101. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_process.py +830 -0
  102. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_request.py +385 -0
  103. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_types.py +426 -0
  104. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/ls_utils.py +800 -0
  105. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_constants.py +70 -0
  106. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_requests.py +562 -0
  107. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/lsp_types.py +5962 -0
  108. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/lsp_protocol_handler/server.py +162 -0
  109. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/resources/downloaded_dependency_hashes.json +20 -0
  110. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/settings.py +97 -0
  111. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/cache.py +25 -0
  112. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/metals_db_utils.py +281 -0
  113. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/subprocess_util.py +439 -0
  114. lodesman_mcp-0.3.0/src/lodesman/_vendor/solidlsp/util/zip.py +130 -0
  115. 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
+ ]