forge-cpp-mcp 0.3.0__tar.gz → 0.5.1__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.
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/PKG-INFO +217 -11
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/README.md +216 -10
- forge_cpp_mcp-0.5.1/frontend/debugger-result.html +12 -0
- forge_cpp_mcp-0.5.1/frontend/git-result.html +12 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/package-lock.json +1 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/package.json +2 -1
- forge_cpp_mcp-0.5.1/frontend/src/admin-form.js +388 -0
- forge_cpp_mcp-0.5.1/frontend/src/admin-resource.js +260 -0
- forge_cpp_mcp-0.5.1/frontend/src/admin.css +146 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/admin.js +290 -117
- forge_cpp_mcp-0.5.1/frontend/src/debugger-result.js +37 -0
- forge_cpp_mcp-0.5.1/frontend/src/git-result.js +9 -0
- forge_cpp_mcp-0.5.1/frontend/src/git-view.js +510 -0
- forge_cpp_mcp-0.5.1/frontend/src/git.css +99 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/process-details.js +3 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/app.js +3 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/result-view.js +2 -2
- forge_cpp_mcp-0.5.1/frontend/src/shared/tool-result.js +22 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/vite.config.js +4 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/hatch_build.py +1 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/pyproject.toml +1 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/__init__.py +1 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/admin/instance.py +24 -3
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/admin/service.py +10 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/errors.py +3 -1
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/service.py +107 -13
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/session.py +29 -7
- forge_cpp_mcp-0.5.1/src/forgemcp/cmake/build_tree.py +221 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/file_api.py +59 -13
- forge_cpp_mcp-0.5.1/src/forgemcp/cmake/profiles.py +298 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/service.py +304 -299
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/workspace.py +11 -11
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/__init__.py +1 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/errors.py +34 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/lldb_dap.py +1524 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/models.py +451 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/service.py +657 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/session.py +184 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/debugger/text.py +52 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/diagnostics.py +58 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/__init__.py +1 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/errors.py +9 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/models.py +199 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/parsers.py +173 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/service.py +1308 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/git/text.py +167 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/icons/debugger.svg +6 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/icons/git.svg +1 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/host.py +52 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/models.py +8 -2
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/service.py +111 -18
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/server.py +148 -10
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/service.py +36 -13
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/clangd.py +7 -3
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/cmake.py +23 -4
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/ctest.py +34 -5
- forge_cpp_mcp-0.5.1/src/forgemcp/toolchain/tools/git.py +231 -0
- forge_cpp_mcp-0.5.1/src/forgemcp/toolchain/tools/lldb_dap.py +339 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/path.py +35 -7
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/service.py +283 -61
- forge_cpp_mcp-0.3.0/frontend/src/admin.css +0 -82
- forge_cpp_mcp-0.3.0/src/forgemcp/cmake/build_tree.py +0 -67
- forge_cpp_mcp-0.3.0/src/forgemcp/cmake/profiles.py +0 -119
- forge_cpp_mcp-0.3.0/src/forgemcp/toolchain/tools/git.py +0 -65
- forge_cpp_mcp-0.3.0/src/forgemcp/toolchain/tools/lldb_dap.py +0 -28
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/.gitignore +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/LICENSE +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/admin.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/clangd-result.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/cmake-build.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/cmake-configure.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/cmake-profiles.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/cmake-run-test.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/cmake-test.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/process-details.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/process-overview.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/sandbox.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/admin-sandbox.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/admin-widget.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/clangd-navigation-view.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/clangd-result.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/clangd-view.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-build.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-configure.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-profiles.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-run-test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/cmake-view.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/process-overview.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/process-status.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/process.css +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/copy-icon.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/presentation.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/result-resources.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/shared/widget.css +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/source-view.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/toolsets.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/workspace-file.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/workspace-result.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/workspace-search.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/workspace-tree.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/src/workspace-view.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/tests/admin-widget.test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/tests/result-resources.test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/tests/result-view.test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/tests/workspace.test.js +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/toolsets.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/workspace-file.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/workspace-result.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/workspace-search.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/frontend/workspace-tree.html +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/admin/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/admin/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/admin/history.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/assets.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/models.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/clangd/text.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/models.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/cmake/text.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/completion.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/clangd.LICENSE +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/clangd.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/cmake.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/process.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/toolchain.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/workspace-edit.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/workspace-file.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/workspace-search.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/icons/workspace.svg +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/local_ipc/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/local_ipc/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/local_ipc/service.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/local_ipc/unix.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/local_ipc/windows.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/markdown.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/text.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/process/transcript.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/progress.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/text.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/discovery.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/loader.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/providers/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/providers/system.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/providers/user.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/providers/visual_studio.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/spec.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/clang.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/clang_cl.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/clangxx.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/cppvsdbg.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/gcc.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/gdb.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/gxx.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/link.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/lld.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/lld_link.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/make.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/msbuild.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/msvc.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/toolchain/tools/ninja.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/__init__.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/diff.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/errors.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/metadata.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/models.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/providers.py +0 -0
- {forge_cpp_mcp-0.3.0 → forge_cpp_mcp-0.5.1}/src/forgemcp/workspace/text.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: forge-cpp-mcp
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: A safe MCP server for structured C++ project development workflows.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hardened-steel/ForgeMCP
|
|
6
6
|
Project-URL: Repository, https://github.com/hardened-steel/ForgeMCP
|
|
@@ -32,8 +32,8 @@ Description-Content-Type: text/markdown
|
|
|
32
32
|
ForgeMCP is a Python MCP server for structured C and C++ development workflows.
|
|
33
33
|
The repository contains workspace, process, toolchain, and initial CMake services.
|
|
34
34
|
Clangd tools provide read-only analysis across CMake configurations with a shared
|
|
35
|
-
result widget. External file reads ask for confirmation through MCP elicitation.
|
|
36
|
-
debugger
|
|
35
|
+
result widget. External file reads ask for confirmation through MCP elicitation.
|
|
36
|
+
The debugger uses LLDB-DAP for native program control and dump inspection; Quality remains planned.
|
|
37
37
|
|
|
38
38
|
## Current MCP surface
|
|
39
39
|
|
|
@@ -47,6 +47,13 @@ debugger modules are planned.
|
|
|
47
47
|
definitions, references, document symbols, and workspace symbols. Empty
|
|
48
48
|
configuration selections use all available contexts.
|
|
49
49
|
- No prompts are currently registered.
|
|
50
|
+
- Debugger tools launch native programs, attach to local PIDs, and open user-mode
|
|
51
|
+
dumps through an explicitly selected LLDB-DAP toolset. They inspect threads,
|
|
52
|
+
stacks, variables, modules, exceptions, memory, and instructions with typed results.
|
|
53
|
+
- Git tools inspect and modify the repository rooted at the workspace: status,
|
|
54
|
+
diffs, history, blame, branches/tags/remotes, staging, commits, restore, stash,
|
|
55
|
+
fetch/pull/push, merge/rebase/cherry-pick/revert, and conflict stages and continuation.
|
|
56
|
+
Every tool has typed data, plain text, a shared Git App, and process provenance.
|
|
50
57
|
- CMake tools list operator profiles, configure projects, build targets, and run
|
|
51
58
|
CTest. `cmake_run_test` directly runs a project/storage test executable with
|
|
52
59
|
literal command-line arguments. Each tool has its own widget with Fields/JSON views,
|
|
@@ -80,6 +87,12 @@ without making additional tool calls. Process times are readable to seconds; JSO
|
|
|
80
87
|
copying preserve the original precision. A toolsets list shows summaries, while a
|
|
81
88
|
`toolset_get` result shows the details returned by that call.
|
|
82
89
|
|
|
90
|
+
When a host restores chat history without `structuredContent`, widgets can recover
|
|
91
|
+
the result from a single complete JSON object retained in a text content block,
|
|
92
|
+
including a fenced JSON block. This supports older JSON tool responses; current
|
|
93
|
+
plain-text responses alone cannot restore the structured result. Linked result
|
|
94
|
+
resources still disappear when the server restarts.
|
|
95
|
+
|
|
83
96
|
ForgeMCP can directly run an explicitly selected test executable inside the
|
|
84
97
|
project or storage root; it does not expose shell commands or external executable
|
|
85
98
|
paths over MCP. Feature services use
|
|
@@ -100,7 +113,7 @@ and install it in a virtual environment:
|
|
|
100
113
|
|
|
101
114
|
```powershell
|
|
102
115
|
python -m venv .venv
|
|
103
|
-
.\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.
|
|
116
|
+
.\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.5.1-py3-none-any.whl
|
|
104
117
|
.\.venv\Scripts\forgemcp.exe --help
|
|
105
118
|
```
|
|
106
119
|
|
|
@@ -113,7 +126,7 @@ The distribution name is `forge-cpp-mcp`; the Python module and server command a
|
|
|
113
126
|
After the package is published to PyPI, the install command can instead be:
|
|
114
127
|
|
|
115
128
|
```powershell
|
|
116
|
-
.\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.
|
|
129
|
+
.\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.5.1
|
|
117
130
|
```
|
|
118
131
|
|
|
119
132
|
## Setup from source
|
|
@@ -187,11 +200,16 @@ Each instance tab offers:
|
|
|
187
200
|
confirmation for commands initiated from the panel.
|
|
188
201
|
|
|
189
202
|
Settings are read-only. Command controls start hidden; select **Enable command
|
|
190
|
-
controls** to call an existing tool
|
|
191
|
-
|
|
203
|
+
controls** to call an existing tool using fields generated from its input schema.
|
|
204
|
+
JSON input remains available for complete arguments. Resource templates provide
|
|
205
|
+
parameter fields and native MCP completion suggestions, using other entered
|
|
206
|
+
parameters as context. These
|
|
192
207
|
calls pass through the same SDK handlers, validation, and feature locks as stdio
|
|
193
208
|
calls. There is no panel-wide execution queue. Existing modules decide which
|
|
194
209
|
operations may run concurrently.
|
|
210
|
+
Debugger tools are excluded from the admin command catalog and rejected by the
|
|
211
|
+
admin bridge even when their names are submitted directly. They remain available
|
|
212
|
+
to MCP clients; completed MCP results can still be reviewed in history.
|
|
195
213
|
The panel can cancel its own running commands; calls initiated by an MCP client
|
|
196
214
|
remain owned by that client.
|
|
197
215
|
|
|
@@ -399,9 +417,19 @@ no source preview because explicit external reads require confirmation.
|
|
|
399
417
|
CMake owns which configurations can supply clangd compilation contexts. After a
|
|
400
418
|
successful configure/generate, ForgeMCP reads `cmakeFiles-v1` from a new CMake
|
|
401
419
|
File API reply and records SHA-256 hashes of that build directory's configuration
|
|
402
|
-
inputs in `project/` and `storage/`. Hashes and dependency lists live in memory
|
|
403
|
-
|
|
404
|
-
|
|
420
|
+
inputs in `project/` and `storage/`. Hashes and dependency lists live in memory.
|
|
421
|
+
Each server startup configures all effective profiles once in the background after
|
|
422
|
+
toolset discovery and clangd subscription setup. MCP requests remain available;
|
|
423
|
+
clangd receives contexts as individual profiles finish. Existing File API replies
|
|
424
|
+
and `compile_commands.json` alone do not confirm current inputs.
|
|
425
|
+
|
|
426
|
+
Startup uses the same configure settings, build-directory ownership checks,
|
|
427
|
+
generator-change cleanup, and 600-second per-command timeout as `cmake_configure`.
|
|
428
|
+
One failed profile does not stop the remaining profiles or the server. The admin
|
|
429
|
+
panel's CMake monitor retains startup results, process IDs, and any batch error;
|
|
430
|
+
command transcripts remain available through `process_get`. A second client of
|
|
431
|
+
the same server does not repeat startup configuration. Server shutdown cancels
|
|
432
|
+
and awaits startup configure before closing clangd and managed processes.
|
|
405
433
|
|
|
406
434
|
Workspace writes, edits, moves, deletions, and directory creation check known
|
|
407
435
|
inputs at the operation boundary. Actual input changes withdraw affected contexts
|
|
@@ -520,6 +548,160 @@ The initial CMake slice does not yet include clean/project-inspection tools
|
|
|
520
548
|
or syntax highlighting. Unit and in-process MCP tests cover profiles,
|
|
521
549
|
command parsing, generator changes, result resources, and qualified paths.
|
|
522
550
|
|
|
551
|
+
## Debugging
|
|
552
|
+
|
|
553
|
+
Install `lldb-dap` in a discovered toolset, or supply its absolute executable path
|
|
554
|
+
with the existing `--toolset NAME lldb-dap=PATH` operator option. Use
|
|
555
|
+
`debugger_adapters` to obtain the available adapter and toolset IDs. No adapter
|
|
556
|
+
starts until `debugger_launch`, `debugger_attach`, or `debugger_open_dump` is called.
|
|
557
|
+
Debugging does not require CMake or a compilation database and does not rebuild a program.
|
|
558
|
+
|
|
559
|
+
`debugger_launch` takes a `toolset_id`, `options`, and optional `initial` breakpoint
|
|
560
|
+
plan. `options.executable` and `options.cwd` are project/storage paths;
|
|
561
|
+
`arguments` are literal strings. `stop_on_entry` defaults to true. For example:
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"toolset_id": "system",
|
|
566
|
+
"options": {
|
|
567
|
+
"executable": "storage/build/debug/app.exe",
|
|
568
|
+
"arguments": ["--example"],
|
|
569
|
+
"cwd": "project/"
|
|
570
|
+
},
|
|
571
|
+
"initial": {
|
|
572
|
+
"sources": [
|
|
573
|
+
{"source": "project/src/main.cpp", "points": [{"line": 20}]}
|
|
574
|
+
]
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
Attach supplies `options.pid`, an optional `expected_started_at` process birth
|
|
580
|
+
time, and an optional managed `executable`. Dump inspection supplies
|
|
581
|
+
`options.dump_file` and an optional matching executable. Both accept
|
|
582
|
+
`source_mappings` and `symbol_directories`. Dump and symbol inputs must stay in
|
|
583
|
+
project/storage. Source locations may name external `root/` files; the debugger
|
|
584
|
+
does not read them automatically. Source locations are marked unverified against
|
|
585
|
+
the loaded binary, so changed files are not presented as confirmed build-time source.
|
|
586
|
+
PDB, DWARF, and dump compatibility depend on the installed LLDB build and target.
|
|
587
|
+
|
|
588
|
+
Keep the returned `session_id`. `debugger_sessions` lists retained snapshots;
|
|
589
|
+
`debugger_get` reads one without contacting the adapter. Each snapshot has one
|
|
590
|
+
`status` field: null, `kind=stopped` with stop details, `kind=exited` with the
|
|
591
|
+
confirmed target exit code, or `kind=failed` with a session failure message.
|
|
592
|
+
Connection `phase` and `target_state` distinguish adapter failure, target execution,
|
|
593
|
+
partial thread stops, and dump inspection.
|
|
594
|
+
Each runtime retains at most 128 sessions, including closed sessions; restart it
|
|
595
|
+
to release that history when the limit is reached.
|
|
596
|
+
|
|
597
|
+
Launch, attach, `debugger_continue`, `debugger_step`, and `debugger_pause` return
|
|
598
|
+
an execution reference. Pass it to `debugger_wait` with the same session ID.
|
|
599
|
+
The wait returns a saved stop/terminal observation, or a timeout with the current
|
|
600
|
+
snapshot; timeout and cancellation of a wait leave the target running. Execution
|
|
601
|
+
observations are bounded and can expire. After an uncertain command outcome, read
|
|
602
|
+
state before deciding whether to repeat a control operation.
|
|
603
|
+
|
|
604
|
+
Construct a stop token from `session_id` and `inspection_generation` in a stopped
|
|
605
|
+
snapshot. Use `debugger_threads`, `debugger_stack`, `debugger_scopes`, and
|
|
606
|
+
`debugger_variables` to inspect state. Frame, variable, and memory handles belong
|
|
607
|
+
to that session and generation; continuing execution invalidates them. Stack,
|
|
608
|
+
variables, and modules accept bounded `page` windows. Memory and disassembly take
|
|
609
|
+
explicit bounded counts. `debugger_exception_info` supplies supported exception
|
|
610
|
+
details. Available operations and exception filters appear in `capabilities`.
|
|
611
|
+
|
|
612
|
+
Errors identify the affected JSON field and link retained session and adapter
|
|
613
|
+
process information. Use the suggested `debugger_get` and `process_get` calls to
|
|
614
|
+
inspect an unconfirmed command before deciding on further execution. Invalid initial
|
|
615
|
+
source paths are rejected before launching the target. Raw adapter error payloads,
|
|
616
|
+
argument text, and environment values are kept out of error messages.
|
|
617
|
+
Breakpoints are managed through `debugger_breakpoints`,
|
|
618
|
+
`debugger_function_breakpoints`, and `debugger_exception_breakpoints`.
|
|
619
|
+
Setting source or function breakpoints replaces the complete selected set.
|
|
620
|
+
|
|
621
|
+
`debugger_close` terminates a program launched by that session, detaches from an
|
|
622
|
+
attached program, or releases a dump. Its result distinguishes adapter closure
|
|
623
|
+
from the confirmed target disposition. Server shutdown closes all debugger
|
|
624
|
+
sessions before the process service. Each adapter's `adapter_process_id` identifies
|
|
625
|
+
its retained transport transcript for `process_get`; that transcript contains DAP
|
|
626
|
+
messages, including adapter output events. The module exposes no arbitrary
|
|
627
|
+
debugger console, expression execution, memory/variable writes, terminal input,
|
|
628
|
+
remote debugging, or kernel debugging.
|
|
629
|
+
|
|
630
|
+
Every debugger tool has readable text, typed structured data, progress, an icon,
|
|
631
|
+
and a result-only App. The App renders the saved invocation and performs no debugger
|
|
632
|
+
calls. Debugger commands cannot be run from the admin panel.
|
|
633
|
+
|
|
634
|
+
## Git operations
|
|
635
|
+
|
|
636
|
+
Git uses the executable and environment of `--git-toolset ID_OR_NAME` (default:
|
|
637
|
+
`system`). It must be installed in that toolset. ForgeMCP does not initialize,
|
|
638
|
+
clone, create, move, or remove worktrees. Run one instance in each desired worktree;
|
|
639
|
+
the admin panel exposes their independent tools and histories in separate tabs.
|
|
640
|
+
The configured workspace must be the repository's worktree root. Linked worktrees
|
|
641
|
+
work normally: Git itself accesses their shared repository metadata, without
|
|
642
|
+
extending Workspace access to external source files.
|
|
643
|
+
|
|
644
|
+
Read tools are `git_status`, `git_diff`, `git_log`, `git_show`, `git_blame`,
|
|
645
|
+
`git_branches`, `git_tags`, `git_remotes`, and `git_conflicts`. `git_diff` selects
|
|
646
|
+
`unstaged`, `staged`, or `revision` comparisons; revision comparisons require `base`
|
|
647
|
+
and optionally `target`. Log pages return a resolved revision and `next_skip`;
|
|
648
|
+
reuse both to keep pagination anchored. Show uses the first parent for merges.
|
|
649
|
+
Conflict results include available base/ours/theirs object IDs, modes, and UTF-8
|
|
650
|
+
text; binary or gitlink stages retain metadata without invented text.
|
|
651
|
+
|
|
652
|
+
`git_stage(paths)`, `git_unstage(paths)`, and `git_restore(paths, source=null)` use
|
|
653
|
+
explicit literal project paths. Restore discards working-file changes using the
|
|
654
|
+
index or the selected committed source. `git_commit(message, amend=false)` commits
|
|
655
|
+
the current index. `git_branch` creates/deletes local branches; force deletion is
|
|
656
|
+
explicit. `git_switch` optionally creates a branch. `git_stash` supports list,
|
|
657
|
+
save, apply, pop, and drop, returning one consistent action-result schema.
|
|
658
|
+
|
|
659
|
+
`git_fetch` selects a configured remote and optionally prunes remote-tracking
|
|
660
|
+
refs. `git_pull` defaults to fast-forward only; `strategy=merge` or `rebase` is
|
|
661
|
+
explicit. These operations never automatically stash local changes. `git_push`
|
|
662
|
+
pushes HEAD to one destination branch; replacing published history requires
|
|
663
|
+
`expected_remote_oid`, used as an explicit force-with-lease expectation. No raw
|
|
664
|
+
force-push or arbitrary Git command tool is exposed. Credentials come from the
|
|
665
|
+
operator's Git/SSH configuration; tools do not accept passwords or tokens.
|
|
666
|
+
|
|
667
|
+
`git_merge`, `git_rebase`, `git_cherry_pick`, and `git_revert` preserve unfinished
|
|
668
|
+
operations. Cherry-pick/revert accept a mainline parent for merge commits.
|
|
669
|
+
Resolve conflicts using Workspace tools, stage the resolutions, then call
|
|
670
|
+
`git_continue(action=continue|abort|skip)`. Skip applies only to operations that
|
|
671
|
+
support it. Normal installed Git hooks remain enabled. A nonzero command may
|
|
672
|
+
leave conflicts or other partial changes: mutation results report `error`, actual
|
|
673
|
+
resulting HEAD, unfinished operation, conflicts, and `process_ids`. Inspect status
|
|
674
|
+
after interruption before deciding whether to retry. A secondary synchronization
|
|
675
|
+
failure is reported separately from a successfully completed Git operation.
|
|
676
|
+
|
|
677
|
+
Mutations share Workspace serialization and coordinate with CMake and clangd.
|
|
678
|
+
CMake alone determines compilation-context eligibility and notifies clangd through
|
|
679
|
+
its existing subscription. Source notifications combine Git dirty paths and
|
|
680
|
+
committed tree changes; unknown changes use conservative invalidation. No external
|
|
681
|
+
file watcher or cross-instance execution queue is added.
|
|
682
|
+
Git snapshots the existence and types of tracked and nonignored untracked paths
|
|
683
|
+
before and after mutations, retaining previous paths and explicitly selected file
|
|
684
|
+
paths. Index/ref changes and commits, including `nothing to commit`, keep clangd
|
|
685
|
+
sessions when working-file structure and CMake inputs remain unchanged. Actual
|
|
686
|
+
path/type changes or an unknown outcome can invalidate contexts. Snapshots read no
|
|
687
|
+
source contents, include at most 100,000 distinct paths, and do not track ignored-only
|
|
688
|
+
changes or empty directories outside the catalog.
|
|
689
|
+
|
|
690
|
+
Git output is bounded to 4 MiB per command; narrow the request when the limit is
|
|
691
|
+
exceeded. Each command has a 300-second deadline and each request a 620-second
|
|
692
|
+
deadline. Machine names/metadata must be UTF-8; patches explicitly report decoding
|
|
693
|
+
replacement. Full process transcripts retain their existing ProcessService owner.
|
|
694
|
+
`forgemcp://git/status` is the last captured status, not a live scan.
|
|
695
|
+
`forgemcp://git/commits/{revision}` serves previously captured log/show metadata
|
|
696
|
+
with completion over retained revisions. These snapshots, the Git monitor, and
|
|
697
|
+
history disappear when the instance stops. The Git App displays one invocation:
|
|
698
|
+
status separates staged and working changes, history puts commit messages first,
|
|
699
|
+
and patches show file groups and line numbers with a wrap toggle. Blame keeps source
|
|
700
|
+
and attribution together; conflict views distinguish base, ours, theirs, missing
|
|
701
|
+
stages, and binary content. Errors and analysis-refresh warnings appear before
|
|
702
|
+
the current repository state. Local search, expandable details, individual copying,
|
|
703
|
+
and complete original JSON remain available; the widget never executes Git actions.
|
|
704
|
+
|
|
523
705
|
## Toolchain discovery
|
|
524
706
|
|
|
525
707
|
Before serving requests, ForgeMCP discovers one System toolset from `PATH` and, on
|
|
@@ -553,7 +735,8 @@ Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (`cl`), `link`, Clang,
|
|
|
553
735
|
`cppvsdbg`. The last adapter may be found as `OpenDebugAD7.exe` or VS Code's bundled
|
|
554
736
|
`vsdbg.exe`; it has no portable version probe. An unknown or failed version probe
|
|
555
737
|
leaves the discovered path available with a null version. Version methods for `cl`,
|
|
556
|
-
`link`,
|
|
738
|
+
`link`, and `cppvsdbg` are not implemented. LLDB-DAP has a version probe and a
|
|
739
|
+
typed framed connection used by debugger sessions.
|
|
557
740
|
|
|
558
741
|
Toolsets are discovered once per server lifetime; restart to discover changed
|
|
559
742
|
installations. Detail tools and resources query available versions on each request,
|
|
@@ -562,6 +745,29 @@ without caching them. Listing toolsets does not launch version probes. All probe
|
|
|
562
745
|
overview and retain their transcripts. Toolset resources omit environments; the
|
|
563
746
|
environment capture's stdout is retained in its ordinary process transcript.
|
|
564
747
|
|
|
748
|
+
## Understanding tool errors
|
|
749
|
+
|
|
750
|
+
Expected tool errors name the invalid argument or missing prerequisite and explain
|
|
751
|
+
how to correct it. Small catalogs list available values; larger catalogs point to
|
|
752
|
+
an existing listing tool such as `toolsets_list`, `cmake_profiles`,
|
|
753
|
+
`clangd_configurations`, `processes_overview`, or `git_remotes`. Unknown argument
|
|
754
|
+
names are rejected instead of being silently ignored, with spelling suggestions
|
|
755
|
+
when possible. Process transcript selector errors describe their valid JSON forms.
|
|
756
|
+
|
|
757
|
+
For example, an unknown profile identifies `profiles` and either lists its valid
|
|
758
|
+
names or recommends `cmake_profiles()`. A bad edit identifies `old_text` and suggests
|
|
759
|
+
reading the current file or choosing a unique fragment, without repeating source
|
|
760
|
+
text. Toolset installation and profile configuration errors explicitly require
|
|
761
|
+
operator setup; toolsets are discovered once at startup.
|
|
762
|
+
|
|
763
|
+
When a command started, use its returned process ID with `process_get` to read its
|
|
764
|
+
transcript. CMake profile failures and Git mutation failures remain in the result's
|
|
765
|
+
`error` fields even when the MCP exchange itself succeeded. A mutation may have
|
|
766
|
+
partially completed; inspect the returned state and `git_status` before repeating
|
|
767
|
+
Git operations. A synchronization warning after a completed operation does not mean
|
|
768
|
+
the commit or push should be repeated. Retained process and result-resource IDs
|
|
769
|
+
belong to the current server process and disappear when it stops.
|
|
770
|
+
|
|
565
771
|
## Tests
|
|
566
772
|
|
|
567
773
|
Tests that need a C/C++ workspace use the shared `cpp_acceptance_project` fixture from
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
ForgeMCP is a Python MCP server for structured C and C++ development workflows.
|
|
4
4
|
The repository contains workspace, process, toolchain, and initial CMake services.
|
|
5
5
|
Clangd tools provide read-only analysis across CMake configurations with a shared
|
|
6
|
-
result widget. External file reads ask for confirmation through MCP elicitation.
|
|
7
|
-
debugger
|
|
6
|
+
result widget. External file reads ask for confirmation through MCP elicitation.
|
|
7
|
+
The debugger uses LLDB-DAP for native program control and dump inspection; Quality remains planned.
|
|
8
8
|
|
|
9
9
|
## Current MCP surface
|
|
10
10
|
|
|
@@ -18,6 +18,13 @@ debugger modules are planned.
|
|
|
18
18
|
definitions, references, document symbols, and workspace symbols. Empty
|
|
19
19
|
configuration selections use all available contexts.
|
|
20
20
|
- No prompts are currently registered.
|
|
21
|
+
- Debugger tools launch native programs, attach to local PIDs, and open user-mode
|
|
22
|
+
dumps through an explicitly selected LLDB-DAP toolset. They inspect threads,
|
|
23
|
+
stacks, variables, modules, exceptions, memory, and instructions with typed results.
|
|
24
|
+
- Git tools inspect and modify the repository rooted at the workspace: status,
|
|
25
|
+
diffs, history, blame, branches/tags/remotes, staging, commits, restore, stash,
|
|
26
|
+
fetch/pull/push, merge/rebase/cherry-pick/revert, and conflict stages and continuation.
|
|
27
|
+
Every tool has typed data, plain text, a shared Git App, and process provenance.
|
|
21
28
|
- CMake tools list operator profiles, configure projects, build targets, and run
|
|
22
29
|
CTest. `cmake_run_test` directly runs a project/storage test executable with
|
|
23
30
|
literal command-line arguments. Each tool has its own widget with Fields/JSON views,
|
|
@@ -51,6 +58,12 @@ without making additional tool calls. Process times are readable to seconds; JSO
|
|
|
51
58
|
copying preserve the original precision. A toolsets list shows summaries, while a
|
|
52
59
|
`toolset_get` result shows the details returned by that call.
|
|
53
60
|
|
|
61
|
+
When a host restores chat history without `structuredContent`, widgets can recover
|
|
62
|
+
the result from a single complete JSON object retained in a text content block,
|
|
63
|
+
including a fenced JSON block. This supports older JSON tool responses; current
|
|
64
|
+
plain-text responses alone cannot restore the structured result. Linked result
|
|
65
|
+
resources still disappear when the server restarts.
|
|
66
|
+
|
|
54
67
|
ForgeMCP can directly run an explicitly selected test executable inside the
|
|
55
68
|
project or storage root; it does not expose shell commands or external executable
|
|
56
69
|
paths over MCP. Feature services use
|
|
@@ -71,7 +84,7 @@ and install it in a virtual environment:
|
|
|
71
84
|
|
|
72
85
|
```powershell
|
|
73
86
|
python -m venv .venv
|
|
74
|
-
.\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.
|
|
87
|
+
.\.venv\Scripts\python.exe -m pip install .\forge_cpp_mcp-0.5.1-py3-none-any.whl
|
|
75
88
|
.\.venv\Scripts\forgemcp.exe --help
|
|
76
89
|
```
|
|
77
90
|
|
|
@@ -84,7 +97,7 @@ The distribution name is `forge-cpp-mcp`; the Python module and server command a
|
|
|
84
97
|
After the package is published to PyPI, the install command can instead be:
|
|
85
98
|
|
|
86
99
|
```powershell
|
|
87
|
-
.\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.
|
|
100
|
+
.\.venv\Scripts\python.exe -m pip install forge-cpp-mcp==0.5.1
|
|
88
101
|
```
|
|
89
102
|
|
|
90
103
|
## Setup from source
|
|
@@ -158,11 +171,16 @@ Each instance tab offers:
|
|
|
158
171
|
confirmation for commands initiated from the panel.
|
|
159
172
|
|
|
160
173
|
Settings are read-only. Command controls start hidden; select **Enable command
|
|
161
|
-
controls** to call an existing tool
|
|
162
|
-
|
|
174
|
+
controls** to call an existing tool using fields generated from its input schema.
|
|
175
|
+
JSON input remains available for complete arguments. Resource templates provide
|
|
176
|
+
parameter fields and native MCP completion suggestions, using other entered
|
|
177
|
+
parameters as context. These
|
|
163
178
|
calls pass through the same SDK handlers, validation, and feature locks as stdio
|
|
164
179
|
calls. There is no panel-wide execution queue. Existing modules decide which
|
|
165
180
|
operations may run concurrently.
|
|
181
|
+
Debugger tools are excluded from the admin command catalog and rejected by the
|
|
182
|
+
admin bridge even when their names are submitted directly. They remain available
|
|
183
|
+
to MCP clients; completed MCP results can still be reviewed in history.
|
|
166
184
|
The panel can cancel its own running commands; calls initiated by an MCP client
|
|
167
185
|
remain owned by that client.
|
|
168
186
|
|
|
@@ -370,9 +388,19 @@ no source preview because explicit external reads require confirmation.
|
|
|
370
388
|
CMake owns which configurations can supply clangd compilation contexts. After a
|
|
371
389
|
successful configure/generate, ForgeMCP reads `cmakeFiles-v1` from a new CMake
|
|
372
390
|
File API reply and records SHA-256 hashes of that build directory's configuration
|
|
373
|
-
inputs in `project/` and `storage/`. Hashes and dependency lists live in memory
|
|
374
|
-
|
|
375
|
-
|
|
391
|
+
inputs in `project/` and `storage/`. Hashes and dependency lists live in memory.
|
|
392
|
+
Each server startup configures all effective profiles once in the background after
|
|
393
|
+
toolset discovery and clangd subscription setup. MCP requests remain available;
|
|
394
|
+
clangd receives contexts as individual profiles finish. Existing File API replies
|
|
395
|
+
and `compile_commands.json` alone do not confirm current inputs.
|
|
396
|
+
|
|
397
|
+
Startup uses the same configure settings, build-directory ownership checks,
|
|
398
|
+
generator-change cleanup, and 600-second per-command timeout as `cmake_configure`.
|
|
399
|
+
One failed profile does not stop the remaining profiles or the server. The admin
|
|
400
|
+
panel's CMake monitor retains startup results, process IDs, and any batch error;
|
|
401
|
+
command transcripts remain available through `process_get`. A second client of
|
|
402
|
+
the same server does not repeat startup configuration. Server shutdown cancels
|
|
403
|
+
and awaits startup configure before closing clangd and managed processes.
|
|
376
404
|
|
|
377
405
|
Workspace writes, edits, moves, deletions, and directory creation check known
|
|
378
406
|
inputs at the operation boundary. Actual input changes withdraw affected contexts
|
|
@@ -491,6 +519,160 @@ The initial CMake slice does not yet include clean/project-inspection tools
|
|
|
491
519
|
or syntax highlighting. Unit and in-process MCP tests cover profiles,
|
|
492
520
|
command parsing, generator changes, result resources, and qualified paths.
|
|
493
521
|
|
|
522
|
+
## Debugging
|
|
523
|
+
|
|
524
|
+
Install `lldb-dap` in a discovered toolset, or supply its absolute executable path
|
|
525
|
+
with the existing `--toolset NAME lldb-dap=PATH` operator option. Use
|
|
526
|
+
`debugger_adapters` to obtain the available adapter and toolset IDs. No adapter
|
|
527
|
+
starts until `debugger_launch`, `debugger_attach`, or `debugger_open_dump` is called.
|
|
528
|
+
Debugging does not require CMake or a compilation database and does not rebuild a program.
|
|
529
|
+
|
|
530
|
+
`debugger_launch` takes a `toolset_id`, `options`, and optional `initial` breakpoint
|
|
531
|
+
plan. `options.executable` and `options.cwd` are project/storage paths;
|
|
532
|
+
`arguments` are literal strings. `stop_on_entry` defaults to true. For example:
|
|
533
|
+
|
|
534
|
+
```json
|
|
535
|
+
{
|
|
536
|
+
"toolset_id": "system",
|
|
537
|
+
"options": {
|
|
538
|
+
"executable": "storage/build/debug/app.exe",
|
|
539
|
+
"arguments": ["--example"],
|
|
540
|
+
"cwd": "project/"
|
|
541
|
+
},
|
|
542
|
+
"initial": {
|
|
543
|
+
"sources": [
|
|
544
|
+
{"source": "project/src/main.cpp", "points": [{"line": 20}]}
|
|
545
|
+
]
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
Attach supplies `options.pid`, an optional `expected_started_at` process birth
|
|
551
|
+
time, and an optional managed `executable`. Dump inspection supplies
|
|
552
|
+
`options.dump_file` and an optional matching executable. Both accept
|
|
553
|
+
`source_mappings` and `symbol_directories`. Dump and symbol inputs must stay in
|
|
554
|
+
project/storage. Source locations may name external `root/` files; the debugger
|
|
555
|
+
does not read them automatically. Source locations are marked unverified against
|
|
556
|
+
the loaded binary, so changed files are not presented as confirmed build-time source.
|
|
557
|
+
PDB, DWARF, and dump compatibility depend on the installed LLDB build and target.
|
|
558
|
+
|
|
559
|
+
Keep the returned `session_id`. `debugger_sessions` lists retained snapshots;
|
|
560
|
+
`debugger_get` reads one without contacting the adapter. Each snapshot has one
|
|
561
|
+
`status` field: null, `kind=stopped` with stop details, `kind=exited` with the
|
|
562
|
+
confirmed target exit code, or `kind=failed` with a session failure message.
|
|
563
|
+
Connection `phase` and `target_state` distinguish adapter failure, target execution,
|
|
564
|
+
partial thread stops, and dump inspection.
|
|
565
|
+
Each runtime retains at most 128 sessions, including closed sessions; restart it
|
|
566
|
+
to release that history when the limit is reached.
|
|
567
|
+
|
|
568
|
+
Launch, attach, `debugger_continue`, `debugger_step`, and `debugger_pause` return
|
|
569
|
+
an execution reference. Pass it to `debugger_wait` with the same session ID.
|
|
570
|
+
The wait returns a saved stop/terminal observation, or a timeout with the current
|
|
571
|
+
snapshot; timeout and cancellation of a wait leave the target running. Execution
|
|
572
|
+
observations are bounded and can expire. After an uncertain command outcome, read
|
|
573
|
+
state before deciding whether to repeat a control operation.
|
|
574
|
+
|
|
575
|
+
Construct a stop token from `session_id` and `inspection_generation` in a stopped
|
|
576
|
+
snapshot. Use `debugger_threads`, `debugger_stack`, `debugger_scopes`, and
|
|
577
|
+
`debugger_variables` to inspect state. Frame, variable, and memory handles belong
|
|
578
|
+
to that session and generation; continuing execution invalidates them. Stack,
|
|
579
|
+
variables, and modules accept bounded `page` windows. Memory and disassembly take
|
|
580
|
+
explicit bounded counts. `debugger_exception_info` supplies supported exception
|
|
581
|
+
details. Available operations and exception filters appear in `capabilities`.
|
|
582
|
+
|
|
583
|
+
Errors identify the affected JSON field and link retained session and adapter
|
|
584
|
+
process information. Use the suggested `debugger_get` and `process_get` calls to
|
|
585
|
+
inspect an unconfirmed command before deciding on further execution. Invalid initial
|
|
586
|
+
source paths are rejected before launching the target. Raw adapter error payloads,
|
|
587
|
+
argument text, and environment values are kept out of error messages.
|
|
588
|
+
Breakpoints are managed through `debugger_breakpoints`,
|
|
589
|
+
`debugger_function_breakpoints`, and `debugger_exception_breakpoints`.
|
|
590
|
+
Setting source or function breakpoints replaces the complete selected set.
|
|
591
|
+
|
|
592
|
+
`debugger_close` terminates a program launched by that session, detaches from an
|
|
593
|
+
attached program, or releases a dump. Its result distinguishes adapter closure
|
|
594
|
+
from the confirmed target disposition. Server shutdown closes all debugger
|
|
595
|
+
sessions before the process service. Each adapter's `adapter_process_id` identifies
|
|
596
|
+
its retained transport transcript for `process_get`; that transcript contains DAP
|
|
597
|
+
messages, including adapter output events. The module exposes no arbitrary
|
|
598
|
+
debugger console, expression execution, memory/variable writes, terminal input,
|
|
599
|
+
remote debugging, or kernel debugging.
|
|
600
|
+
|
|
601
|
+
Every debugger tool has readable text, typed structured data, progress, an icon,
|
|
602
|
+
and a result-only App. The App renders the saved invocation and performs no debugger
|
|
603
|
+
calls. Debugger commands cannot be run from the admin panel.
|
|
604
|
+
|
|
605
|
+
## Git operations
|
|
606
|
+
|
|
607
|
+
Git uses the executable and environment of `--git-toolset ID_OR_NAME` (default:
|
|
608
|
+
`system`). It must be installed in that toolset. ForgeMCP does not initialize,
|
|
609
|
+
clone, create, move, or remove worktrees. Run one instance in each desired worktree;
|
|
610
|
+
the admin panel exposes their independent tools and histories in separate tabs.
|
|
611
|
+
The configured workspace must be the repository's worktree root. Linked worktrees
|
|
612
|
+
work normally: Git itself accesses their shared repository metadata, without
|
|
613
|
+
extending Workspace access to external source files.
|
|
614
|
+
|
|
615
|
+
Read tools are `git_status`, `git_diff`, `git_log`, `git_show`, `git_blame`,
|
|
616
|
+
`git_branches`, `git_tags`, `git_remotes`, and `git_conflicts`. `git_diff` selects
|
|
617
|
+
`unstaged`, `staged`, or `revision` comparisons; revision comparisons require `base`
|
|
618
|
+
and optionally `target`. Log pages return a resolved revision and `next_skip`;
|
|
619
|
+
reuse both to keep pagination anchored. Show uses the first parent for merges.
|
|
620
|
+
Conflict results include available base/ours/theirs object IDs, modes, and UTF-8
|
|
621
|
+
text; binary or gitlink stages retain metadata without invented text.
|
|
622
|
+
|
|
623
|
+
`git_stage(paths)`, `git_unstage(paths)`, and `git_restore(paths, source=null)` use
|
|
624
|
+
explicit literal project paths. Restore discards working-file changes using the
|
|
625
|
+
index or the selected committed source. `git_commit(message, amend=false)` commits
|
|
626
|
+
the current index. `git_branch` creates/deletes local branches; force deletion is
|
|
627
|
+
explicit. `git_switch` optionally creates a branch. `git_stash` supports list,
|
|
628
|
+
save, apply, pop, and drop, returning one consistent action-result schema.
|
|
629
|
+
|
|
630
|
+
`git_fetch` selects a configured remote and optionally prunes remote-tracking
|
|
631
|
+
refs. `git_pull` defaults to fast-forward only; `strategy=merge` or `rebase` is
|
|
632
|
+
explicit. These operations never automatically stash local changes. `git_push`
|
|
633
|
+
pushes HEAD to one destination branch; replacing published history requires
|
|
634
|
+
`expected_remote_oid`, used as an explicit force-with-lease expectation. No raw
|
|
635
|
+
force-push or arbitrary Git command tool is exposed. Credentials come from the
|
|
636
|
+
operator's Git/SSH configuration; tools do not accept passwords or tokens.
|
|
637
|
+
|
|
638
|
+
`git_merge`, `git_rebase`, `git_cherry_pick`, and `git_revert` preserve unfinished
|
|
639
|
+
operations. Cherry-pick/revert accept a mainline parent for merge commits.
|
|
640
|
+
Resolve conflicts using Workspace tools, stage the resolutions, then call
|
|
641
|
+
`git_continue(action=continue|abort|skip)`. Skip applies only to operations that
|
|
642
|
+
support it. Normal installed Git hooks remain enabled. A nonzero command may
|
|
643
|
+
leave conflicts or other partial changes: mutation results report `error`, actual
|
|
644
|
+
resulting HEAD, unfinished operation, conflicts, and `process_ids`. Inspect status
|
|
645
|
+
after interruption before deciding whether to retry. A secondary synchronization
|
|
646
|
+
failure is reported separately from a successfully completed Git operation.
|
|
647
|
+
|
|
648
|
+
Mutations share Workspace serialization and coordinate with CMake and clangd.
|
|
649
|
+
CMake alone determines compilation-context eligibility and notifies clangd through
|
|
650
|
+
its existing subscription. Source notifications combine Git dirty paths and
|
|
651
|
+
committed tree changes; unknown changes use conservative invalidation. No external
|
|
652
|
+
file watcher or cross-instance execution queue is added.
|
|
653
|
+
Git snapshots the existence and types of tracked and nonignored untracked paths
|
|
654
|
+
before and after mutations, retaining previous paths and explicitly selected file
|
|
655
|
+
paths. Index/ref changes and commits, including `nothing to commit`, keep clangd
|
|
656
|
+
sessions when working-file structure and CMake inputs remain unchanged. Actual
|
|
657
|
+
path/type changes or an unknown outcome can invalidate contexts. Snapshots read no
|
|
658
|
+
source contents, include at most 100,000 distinct paths, and do not track ignored-only
|
|
659
|
+
changes or empty directories outside the catalog.
|
|
660
|
+
|
|
661
|
+
Git output is bounded to 4 MiB per command; narrow the request when the limit is
|
|
662
|
+
exceeded. Each command has a 300-second deadline and each request a 620-second
|
|
663
|
+
deadline. Machine names/metadata must be UTF-8; patches explicitly report decoding
|
|
664
|
+
replacement. Full process transcripts retain their existing ProcessService owner.
|
|
665
|
+
`forgemcp://git/status` is the last captured status, not a live scan.
|
|
666
|
+
`forgemcp://git/commits/{revision}` serves previously captured log/show metadata
|
|
667
|
+
with completion over retained revisions. These snapshots, the Git monitor, and
|
|
668
|
+
history disappear when the instance stops. The Git App displays one invocation:
|
|
669
|
+
status separates staged and working changes, history puts commit messages first,
|
|
670
|
+
and patches show file groups and line numbers with a wrap toggle. Blame keeps source
|
|
671
|
+
and attribution together; conflict views distinguish base, ours, theirs, missing
|
|
672
|
+
stages, and binary content. Errors and analysis-refresh warnings appear before
|
|
673
|
+
the current repository state. Local search, expandable details, individual copying,
|
|
674
|
+
and complete original JSON remain available; the widget never executes Git actions.
|
|
675
|
+
|
|
494
676
|
## Toolchain discovery
|
|
495
677
|
|
|
496
678
|
Before serving requests, ForgeMCP discovers one System toolset from `PATH` and, on
|
|
@@ -524,7 +706,8 @@ Built-ins cover CMake, CTest, Ninja, Make, MSBuild, MSVC (`cl`), `link`, Clang,
|
|
|
524
706
|
`cppvsdbg`. The last adapter may be found as `OpenDebugAD7.exe` or VS Code's bundled
|
|
525
707
|
`vsdbg.exe`; it has no portable version probe. An unknown or failed version probe
|
|
526
708
|
leaves the discovered path available with a null version. Version methods for `cl`,
|
|
527
|
-
`link`,
|
|
709
|
+
`link`, and `cppvsdbg` are not implemented. LLDB-DAP has a version probe and a
|
|
710
|
+
typed framed connection used by debugger sessions.
|
|
528
711
|
|
|
529
712
|
Toolsets are discovered once per server lifetime; restart to discover changed
|
|
530
713
|
installations. Detail tools and resources query available versions on each request,
|
|
@@ -533,6 +716,29 @@ without caching them. Listing toolsets does not launch version probes. All probe
|
|
|
533
716
|
overview and retain their transcripts. Toolset resources omit environments; the
|
|
534
717
|
environment capture's stdout is retained in its ordinary process transcript.
|
|
535
718
|
|
|
719
|
+
## Understanding tool errors
|
|
720
|
+
|
|
721
|
+
Expected tool errors name the invalid argument or missing prerequisite and explain
|
|
722
|
+
how to correct it. Small catalogs list available values; larger catalogs point to
|
|
723
|
+
an existing listing tool such as `toolsets_list`, `cmake_profiles`,
|
|
724
|
+
`clangd_configurations`, `processes_overview`, or `git_remotes`. Unknown argument
|
|
725
|
+
names are rejected instead of being silently ignored, with spelling suggestions
|
|
726
|
+
when possible. Process transcript selector errors describe their valid JSON forms.
|
|
727
|
+
|
|
728
|
+
For example, an unknown profile identifies `profiles` and either lists its valid
|
|
729
|
+
names or recommends `cmake_profiles()`. A bad edit identifies `old_text` and suggests
|
|
730
|
+
reading the current file or choosing a unique fragment, without repeating source
|
|
731
|
+
text. Toolset installation and profile configuration errors explicitly require
|
|
732
|
+
operator setup; toolsets are discovered once at startup.
|
|
733
|
+
|
|
734
|
+
When a command started, use its returned process ID with `process_get` to read its
|
|
735
|
+
transcript. CMake profile failures and Git mutation failures remain in the result's
|
|
736
|
+
`error` fields even when the MCP exchange itself succeeded. A mutation may have
|
|
737
|
+
partially completed; inspect the returned state and `git_status` before repeating
|
|
738
|
+
Git operations. A synchronization warning after a completed operation does not mean
|
|
739
|
+
the commit or push should be repeated. Retained process and result-resource IDs
|
|
740
|
+
belong to the current server process and disappear when it stops.
|
|
741
|
+
|
|
536
742
|
## Tests
|
|
537
743
|
|
|
538
744
|
Tests that need a C/C++ workspace use the shared `cpp_acceptance_project` fixture from
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Debugger result</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<main id="widget" aria-label="Debugger result"></main>
|
|
10
|
+
<script type="module" src="/src/debugger-result.js"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Git result</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<main id="widget" aria-label="Git result"></main>
|
|
10
|
+
<script type="module" src="/src/git-result.js"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
"private": true,
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"build": "vite build --mode workspace && vite build --mode file && vite build --mode search && vite build --mode result && vite build --mode process && vite build --mode process-details && vite build --mode toolsets && vite build --mode cmake-profiles && vite build --mode cmake-configure && vite build --mode cmake-build && vite build --mode cmake-test && vite build --mode cmake-run-test && vite build --mode clangd && vite build --mode admin && vite build --mode sandbox",
|
|
6
|
+
"build": "vite build --mode workspace && vite build --mode file && vite build --mode search && vite build --mode result && vite build --mode process && vite build --mode process-details && vite build --mode toolsets && vite build --mode cmake-profiles && vite build --mode cmake-configure && vite build --mode cmake-build && vite build --mode cmake-test && vite build --mode cmake-run-test && vite build --mode clangd && vite build --mode git-result && vite build --mode debugger-result && vite build --mode admin && vite build --mode sandbox",
|
|
7
7
|
"test": "node --test tests/*.test.js"
|
|
8
8
|
},
|
|
9
9
|
"dependencies": {
|
|
10
10
|
"@modelcontextprotocol/ext-apps": "^1.7.5",
|
|
11
|
+
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
11
12
|
"markdown-it": "^15.0.2"
|
|
12
13
|
},
|
|
13
14
|
"devDependencies": {
|