linux-mcp-server 1.3.0__tar.gz → 1.3.2__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 (132) hide show
  1. linux_mcp_server-1.3.2/.github/workflows/build-publish.yml +178 -0
  2. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/ci.yml +2 -2
  3. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/ci_installation.yaml +1 -1
  4. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/docs.yml +1 -1
  5. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.gitignore +1 -0
  6. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/pipeline-build-multiarch.yaml +14 -42
  7. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/push.yaml +0 -1
  8. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/Containerfile +1 -1
  9. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/Makefile +10 -1
  10. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/PKG-INFO +1 -1
  11. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/install.md +25 -7
  12. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/pyproject.toml +2 -0
  13. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/scripts/publish_mcp_registry.py +1 -1
  14. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/connection/ssh.py +0 -1
  15. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/formatters.py +0 -56
  16. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/models.py +14 -0
  17. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/logs.py +20 -14
  18. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_formatters.py +0 -55
  19. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_logs.py +71 -69
  20. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/uv.lock +34 -0
  21. linux_mcp_server-1.3.0/.github/workflows/build-publish.yml +0 -94
  22. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.codecov.yml +0 -0
  23. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.coderabbit.yaml +0 -0
  24. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.devcontainer/Containerfile +0 -0
  25. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.devcontainer/devcontainer.json +0 -0
  26. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/functional-tests.yml +0 -0
  27. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/pull_request.yaml +0 -0
  28. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/task-get-version.yaml +0 -0
  29. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/AGENTS.md +0 -0
  30. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/LICENSE +0 -0
  31. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/README.md +0 -0
  32. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/audit.md +0 -0
  33. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/commands.md +0 -0
  34. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/config.md +0 -0
  35. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/connection.md +0 -0
  36. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/formatters.md +0 -0
  37. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/index.md +0 -0
  38. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/parsers.md +0 -0
  39. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/server.md +0 -0
  40. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/logs.md +0 -0
  41. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/network.md +0 -0
  42. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/processes.md +0 -0
  43. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/services.md +0 -0
  44. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/storage.md +0 -0
  45. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/system_info.md +0 -0
  46. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/architecture.md +0 -0
  47. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/cheatsheet.md +0 -0
  48. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/clients.md +0 -0
  49. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/contributing.md +0 -0
  50. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/debugging.md +0 -0
  51. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/examples/claude_desktop_config.example.json +0 -0
  52. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/examples/example_config.sh +0 -0
  53. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/getting-started.md +0 -0
  54. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/index.md +0 -0
  55. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/troubleshooting.md +0 -0
  56. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/usage.md +0 -0
  57. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/licenses/GPL-3.0.txt +0 -0
  58. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/mkdocs.yml +0 -0
  59. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/renovate.json +0 -0
  60. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/scripts/verify_installation.sh +0 -0
  61. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/server.json +0 -0
  62. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/__init__.py +0 -0
  63. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/__main__.py +0 -0
  64. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/_vendor/__init__.py +0 -0
  65. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/audit.py +0 -0
  66. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/commands.py +0 -0
  67. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/config.py +0 -0
  68. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/connection/__init__.py +0 -0
  69. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/logging_config.py +0 -0
  70. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/parsers.py +0 -0
  71. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/server.py +0 -0
  72. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/__init__.py +0 -0
  73. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/network.py +0 -0
  74. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/processes.py +0 -0
  75. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/services.py +0 -0
  76. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/storage.py +0 -0
  77. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/system_info.py +0 -0
  78. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/__init__.py +0 -0
  79. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/decorators.py +0 -0
  80. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/enum.py +0 -0
  81. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/format.py +0 -0
  82. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/types.py +0 -0
  83. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/validation.py +0 -0
  84. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/__init__.py +0 -0
  85. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/_vendor/__init__.py +0 -0
  86. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/_vendor/test_vendor.py +0 -0
  87. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/cli/__init__.py +0 -0
  88. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/cli/test_cli.py +0 -0
  89. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/conftest.py +0 -0
  90. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/__init__.py +0 -0
  91. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/__init__.py +0 -0
  92. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_connection_manager.py +0 -0
  93. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_discover_ssh_key.py +0 -0
  94. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_execute_command.py +0 -0
  95. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_get_bin_path.py +0 -0
  96. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_host_key_verification.py +0 -0
  97. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_timeout.py +0 -0
  98. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/__init__.py +0 -0
  99. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_cpu_info.py +0 -0
  100. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_free_output.py +0 -0
  101. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ip_brief.py +0 -0
  102. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_listing.py +0 -0
  103. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_os_release.py +0 -0
  104. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_proc.py +0 -0
  105. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ps_output.py +0 -0
  106. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_service_count.py +0 -0
  107. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ss.py +0 -0
  108. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_system_info.py +0 -0
  109. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test__main__.py +0 -0
  110. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_audit.py +0 -0
  111. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_commands.py +0 -0
  112. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_config.py +0 -0
  113. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_logging_config.py +0 -0
  114. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_server.py +0 -0
  115. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_tool_schemas.py +0 -0
  116. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/__init__.py +0 -0
  117. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/__init__.py +0 -0
  118. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/conftest.py +0 -0
  119. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_block_devices.py +0 -0
  120. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_directories.py +0 -0
  121. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_files.py +0 -0
  122. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_path_validation.py +0 -0
  123. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_read_file.py +0 -0
  124. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_network.py +0 -0
  125. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_processes.py +0 -0
  126. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_services.py +0 -0
  127. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_system_info.py +0 -0
  128. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/__init__.py +0 -0
  129. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_decorators.py +0 -0
  130. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_enum.py +0 -0
  131. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_format.py +0 -0
  132. {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_validation.py +0 -0
@@ -0,0 +1,178 @@
1
+ name: Build and publish
2
+ on:
3
+ push:
4
+ tags:
5
+ - '*'
6
+
7
+ permissions:
8
+ contents: read
9
+
10
+ jobs:
11
+ build:
12
+ name: Build sdist and wheel
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v6.0.2
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Show environment
22
+ run: |
23
+ set -x
24
+ python -VV
25
+ python -m site
26
+ ls -ld $(python -c "import site; print(site.getsitepackages()[0])")
27
+ git tag --list --sort=-refname --format='%(refname:short) %(objectname:short)'
28
+ whoami
29
+
30
+ - name: Install build tools
31
+ run: |
32
+ python -m pip install --upgrade pip
33
+ python -m pip install build
34
+
35
+ - name: Build
36
+ run: python -m build --sdist --wheel
37
+
38
+ - name: Upload artifacts
39
+ uses: actions/upload-artifact@v6.0.0
40
+ with:
41
+ name: artifacts
42
+ path: dist
43
+ if-no-files-found: error
44
+
45
+ publish-pypi:
46
+ name: Publish to PyPI
47
+ runs-on: ubuntu-latest
48
+ needs:
49
+ - build
50
+
51
+ environment:
52
+ name: pypi
53
+ url: https://pypi.org/p/linux-mcp-server
54
+
55
+ permissions:
56
+ id-token: write
57
+
58
+ steps:
59
+ - name: Download artifacts
60
+ uses: actions/download-artifact@v7.0.0
61
+ with:
62
+ name: artifacts
63
+ path: dist
64
+
65
+ - name: Show environment
66
+ run: |
67
+ set -x
68
+ python -VV
69
+ python -m site
70
+ ls -ld $(python -c "import site; print(site.getsitepackages()[0])")
71
+ ls -l dist/
72
+ whoami
73
+
74
+ - name: Publish to PyPI
75
+ uses: pypa/gh-action-pypi-publish@v1.13.0
76
+
77
+ publish-mcp:
78
+ name: Publish to MCP registry
79
+ runs-on: ubuntu-latest
80
+ needs:
81
+ - publish-pypi
82
+
83
+ environment:
84
+ name: mcp
85
+
86
+ permissions:
87
+ id-token: write
88
+
89
+ steps:
90
+ - name: Checkout
91
+ uses: actions/checkout@v6.0.2
92
+
93
+ - name: Publish to MCP Registry
94
+ run: ./scripts/publish_mcp_registry.py
95
+
96
+ create-release:
97
+ name: Create GitHub Release
98
+ runs-on: ubuntu-latest
99
+
100
+ permissions:
101
+ contents: write
102
+
103
+ steps:
104
+ - name: Create GitHub Release
105
+ uses: softprops/action-gh-release@v2.5.0
106
+ with:
107
+ tag_name: ${{ github.ref_name }}
108
+ generate_release_notes: true
109
+
110
+ zipapp:
111
+ name: Zipapp - ${{ matrix.python-version }} ${{ matrix.image.family }} ${{ matrix.image.arch }}
112
+ runs-on: ${{ matrix.image.name }}
113
+ needs:
114
+ - create-release
115
+
116
+ strategy:
117
+ fail-fast: false
118
+ matrix:
119
+ python-version:
120
+ - "3.10"
121
+ - "3.11"
122
+ - "3.12"
123
+ - "3.13"
124
+ - "3.14"
125
+ - "3.14t"
126
+
127
+ image:
128
+ - name: ubuntu-24.04
129
+ family: linux
130
+ arch: amd64
131
+
132
+ - name: ubuntu-24.04-arm
133
+ family: linux
134
+ arch: arm64
135
+
136
+ - name: macos-15-intel
137
+ family: macos
138
+ arch: amd64
139
+
140
+ - name: macos-26
141
+ family: macos
142
+ arch: arm64
143
+
144
+ - name: windows-2025
145
+ family: windows
146
+ arch: amd64
147
+
148
+ exclude:
149
+ - python-version: "3.14t"
150
+ image:
151
+ name: windows-2025
152
+
153
+ permissions:
154
+ contents: write
155
+
156
+ steps:
157
+ - name: Checkout
158
+ uses: actions/checkout@v6.0.2
159
+ with:
160
+ ref: ${{ github.ref_name }}
161
+ fetch-depth: 0
162
+
163
+ - name: Install Python
164
+ uses: actions/setup-python@v6.2.0
165
+ with:
166
+ python-version: ${{ matrix.python-version }}
167
+
168
+ - name: Install uv
169
+ uses: astral-sh/setup-uv@v7.3.0
170
+
171
+ - name: Build zipapp
172
+ run: make zipapp ZIPAPP_OUTPUT=linux-mcp-server-py${{ matrix.python-version }}-${{ matrix.image.family }}-${{ matrix.image.arch }}.pyz
173
+
174
+ - name: Upload to GitHub Release
175
+ uses: softprops/action-gh-release@v2.5.0
176
+ with:
177
+ files: linux-mcp-server-py${{ matrix.python-version }}-${{ matrix.image.family }}-${{ matrix.image.arch }}.pyz
178
+ tag_name: ${{ github.ref_name }}
@@ -49,7 +49,7 @@ jobs:
49
49
  python-version-file: pyproject.toml
50
50
 
51
51
  - name: Install uv
52
- uses: astral-sh/setup-uv@v7.2.1
52
+ uses: astral-sh/setup-uv@v7.3.0
53
53
  with:
54
54
  enable-cache: true
55
55
  prune-cache: false
@@ -94,7 +94,7 @@ jobs:
94
94
  python-version-file: pyproject.toml
95
95
 
96
96
  - name: Install uv
97
- uses: astral-sh/setup-uv@v7.2.1
97
+ uses: astral-sh/setup-uv@v7.3.0
98
98
  with:
99
99
  enable-cache: true
100
100
  prune-cache: false
@@ -52,7 +52,7 @@ jobs:
52
52
  python-version: ${{ matrix.python-version }}
53
53
 
54
54
  - name: Install uv
55
- uses: astral-sh/setup-uv@v7.2.1
55
+ uses: astral-sh/setup-uv@v7.3.0
56
56
  with:
57
57
  enable-cache: true
58
58
  prune-cache: false
@@ -34,7 +34,7 @@ jobs:
34
34
  python-version-file: pyproject.toml
35
35
 
36
36
  - name: Install uv
37
- uses: astral-sh/setup-uv@v7.2.1
37
+ uses: astral-sh/setup-uv@v7.3.0
38
38
  with:
39
39
  enable-cache: true
40
40
  prune-cache: false
@@ -19,6 +19,7 @@ wheels/
19
19
  *.egg-info/
20
20
  .installed.cfg
21
21
  *.egg
22
+ *.pyz
22
23
 
23
24
  # Vendored packages
24
25
  src/linux_mcp_server/_vendor/*
@@ -112,16 +112,6 @@ spec:
112
112
 
113
113
  tasks:
114
114
  - name: init
115
- params:
116
- - name: image-url
117
- value: $(params.output-image)
118
-
119
- - name: rebuild
120
- value: $(params.rebuild)
121
-
122
- - name: skip-checks
123
- value: $(params.skip-checks)
124
-
125
115
  taskRef:
126
116
  resolver: bundles
127
117
  params:
@@ -129,7 +119,7 @@ spec:
129
119
  value: init
130
120
 
131
121
  - name: bundle
132
- value: quay.io/konflux-ci/tekton-catalog/task-init:0.2@sha256:ebf06778aeacbbeb081f9231eafbdfdb8e380ad04e211d7ed80ae9101e37fd82
122
+ value: quay.io/konflux-ci/tekton-catalog/task-init:0.3@sha256:aa6f8632cc23d605c5942505ff1d00280db16a6fda5c4c56c4ed9ae936b5fbc6
133
123
 
134
124
  - name: kind
135
125
  value: task
@@ -169,12 +159,6 @@ spec:
169
159
  - name: kind
170
160
  value: task
171
161
 
172
- when:
173
- - input: $(tasks.init.results.build)
174
- operator: in
175
- values:
176
- - "true"
177
-
178
162
  workspaces:
179
163
  - name: basic-auth
180
164
  workspace: git-auth
@@ -203,7 +187,7 @@ spec:
203
187
  value: prefetch-dependencies-oci-ta
204
188
 
205
189
  - name: bundle
206
- value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies-oci-ta:0.2@sha256:c664a6df6514b59c3ce53570b0994b45af66ecc89ba2a8e41834eae0622addf6
190
+ value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies-oci-ta:0.2@sha256:c07551efbd7fc414ae1245ddd93579b00317fee0734980f539fd8aea3cfcb945
207
191
 
208
192
  - name: kind
209
193
  value: task
@@ -291,19 +275,13 @@ spec:
291
275
  value: buildah-remote-oci-ta
292
276
 
293
277
  - name: bundle
294
- value: quay.io/konflux-ci/tekton-catalog/task-buildah-remote-oci-ta:0.8@sha256:da99fce12bf72da86f6a86a5370d826c16ea8db001d27181dcaf087af9ab60cb
278
+ value: quay.io/konflux-ci/tekton-catalog/task-buildah-remote-oci-ta:0.8@sha256:4c6e3e4c3fe8a289161dfbc38a162d28a0289eb4d51f835e847f8c3677a211f3
295
279
 
296
280
  - name: kind
297
281
  value: task
298
282
 
299
283
  resolver: bundles
300
284
 
301
- when:
302
- - input: $(tasks.init.results.build)
303
- operator: in
304
- values:
305
- - "true"
306
-
307
285
  - name: build-image-index
308
286
  params:
309
287
  - name: IMAGE
@@ -335,17 +313,11 @@ spec:
335
313
  value: build-image-index
336
314
 
337
315
  - name: bundle
338
- value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.2@sha256:05d3d8a5ded44c51b074a56a408ddf5d65c56b4c15e110abb1a99e3aff269d49
316
+ value: quay.io/konflux-ci/tekton-catalog/task-build-image-index:0.2@sha256:30989fa1f475bb8f6bda811b26bd4ddf7187288ed5815ce634ba399341852c75
339
317
 
340
318
  - name: kind
341
319
  value: task
342
320
 
343
- when:
344
- - input: $(tasks.init.results.build)
345
- operator: in
346
- values:
347
- - "true"
348
-
349
321
  - name: deprecated-base-image-check
350
322
  params:
351
323
  - name: IMAGE_URL
@@ -393,7 +365,7 @@ spec:
393
365
  value: clair-scan
394
366
 
395
367
  - name: bundle
396
- value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.3@sha256:dadfea7633d82e4303ba73d5e9c7e2bc16834bde0fd7688880453b26452067eb
368
+ value: quay.io/konflux-ci/tekton-catalog/task-clair-scan:0.3@sha256:b01d8e2c58eb407ac23fa07b8e44c4631f0cf7257e87507c829fa2486aff9804
397
369
 
398
370
  - name: kind
399
371
  value: task
@@ -418,7 +390,7 @@ spec:
418
390
  value: ecosystem-cert-preflight-checks
419
391
 
420
392
  - name: bundle
421
- value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:0c3f9d4707bf742a5209f2e2186211433c83d5fcc538c728e4c7df178b5eafb7
393
+ value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:40bc4bcc1c52c114139daee60ec2ddeb59921ecef8a68f241d5593c79b2a21d6
422
394
 
423
395
  - name: kind
424
396
  value: task
@@ -455,7 +427,7 @@ spec:
455
427
  value: sast-snyk-check-oci-ta
456
428
 
457
429
  - name: bundle
458
- value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check-oci-ta:0.4@sha256:a70272ae12f6d7f0da2902158e1bcee756877aa8f71fd1a22ef9afd8b177fb41
430
+ value: quay.io/konflux-ci/tekton-catalog/task-sast-snyk-check-oci-ta:0.4@sha256:0c2ab8ce6d419400b63dd67d061052ac51de7b1ebe93f8ae86ed07ac638d756d
459
431
 
460
432
  - name: kind
461
433
  value: task
@@ -484,7 +456,7 @@ spec:
484
456
  value: clamav-scan
485
457
 
486
458
  - name: bundle
487
- value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.3@sha256:bcf08c20d35988bce353d36b915070a9ab7497e436e8c9d5db27ae9274e3c383
459
+ value: quay.io/konflux-ci/tekton-catalog/task-clamav-scan:0.3@sha256:5b5b31eae9063a00b91acc049b536e548d87c730068e439eefe33ab5238ee118
488
460
 
489
461
  - name: kind
490
462
  value: task
@@ -506,7 +478,7 @@ spec:
506
478
  value: coverity-availability-check
507
479
 
508
480
  - name: bundle
509
- value: quay.io/konflux-ci/tekton-catalog/task-coverity-availability-check:0.2@sha256:267d5bc069a0323f41e24732ddfd1057e5c639e853d1e620c67505fab78f1301
481
+ value: quay.io/konflux-ci/tekton-catalog/task-coverity-availability-check:0.2@sha256:a24d8f3cd01ccc54fa6fb73aa57a78f5559a0e58eddfe0583fc9cb97d59b4efc
510
482
 
511
483
  - name: kind
512
484
  value: task
@@ -570,7 +542,7 @@ spec:
570
542
  value: sast-coverity-check-oci-ta
571
543
 
572
544
  - name: bundle
573
- value: quay.io/konflux-ci/tekton-catalog/task-sast-coverity-check-oci-ta:0.3@sha256:9d0bc704bca6b6faad37b2ce8106b96e0cef35e1f647d037a878bf416589de9d
545
+ value: quay.io/konflux-ci/tekton-catalog/task-sast-coverity-check-oci-ta:0.3@sha256:e8c63570f1d01d70b2a21b22a2a4aad9ca7d5c0327d8b2a4058a6e616cce17ca
574
546
 
575
547
  - name: kind
576
548
  value: task
@@ -610,7 +582,7 @@ spec:
610
582
  value: sast-shell-check-oci-ta
611
583
 
612
584
  - name: bundle
613
- value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check-oci-ta:0.1@sha256:e7a51575f9188a1461d4520da25aaa4efdd3b896c97dc750941fa22840e55c13
585
+ value: quay.io/konflux-ci/tekton-catalog/task-sast-shell-check-oci-ta:0.1@sha256:f475b4b6b0c1687fa1aafa5ba38813e04f080b185af2975e12b457742d9dd857
614
586
 
615
587
  - name: kind
616
588
  value: task
@@ -645,7 +617,7 @@ spec:
645
617
  value: sast-unicode-check-oci-ta
646
618
 
647
619
  - name: bundle
648
- value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check-oci-ta:0.4@sha256:1818a5b3e4fa86c838ae71226a157241967d1f19c5ed377e4b2fddad7a3ceefe
620
+ value: quay.io/konflux-ci/tekton-catalog/task-sast-unicode-check-oci-ta:0.4@sha256:b38140b2f0b2163def80e28a792b2702245d38a5610a504f2e56c198f3b8f70b
649
621
 
650
622
  - name: kind
651
623
  value: task
@@ -711,7 +683,7 @@ spec:
711
683
  value: push-dockerfile-oci-ta
712
684
 
713
685
  - name: bundle
714
- value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile-oci-ta:0.1@sha256:08bba4a659ecd48f871bef00b80af58954e5a09fcbb28a1783ddd640c4f6535e
686
+ value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile-oci-ta:0.1@sha256:2623be4a9bad87ade614b4b24a8f98a4e100042a845e8f162b8237168697294c
715
687
 
716
688
  - name: kind
717
689
  value: task
@@ -734,7 +706,7 @@ spec:
734
706
  value: rpms-signature-scan
735
707
 
736
708
  - name: bundle
737
- value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:2f3015ac7a642ea7f104d2194a8cb45921570f9539c6604ddcb5f62796f22a53
709
+ value: quay.io/konflux-ci/tekton-catalog/task-rpms-signature-scan:0.2@sha256:23f133f47d13e6fd35ad6a65138f5b48bd2e6c4e66a2512991ff9f7d90cd7e0e
738
710
 
739
711
  - name: kind
740
712
  value: task
@@ -41,7 +41,6 @@ spec:
41
41
  - name: additional-tags
42
42
  value:
43
43
  - latest
44
- - '{{ target_branch }}'
45
44
 
46
45
  pipelineRef:
47
46
  name: pipeline-build-multiarch
@@ -1,4 +1,4 @@
1
- FROM registry.access.redhat.com/ubi10-minimal:10.1-1769521234 as base
1
+ FROM registry.access.redhat.com/ubi10-minimal:10.1-1770180557 as base
2
2
 
3
3
  FROM base as build
4
4
 
@@ -1,4 +1,4 @@
1
- .PHONY: help sync lint format types test ci verify fix clean docs docs-serve
1
+ .PHONY: help sync lint format types test ci verify fix clean docs docs-serve zipapp
2
2
 
3
3
  # Default target
4
4
  help:
@@ -15,6 +15,9 @@ help:
15
15
  @echo " make fix - Auto-fix lint and format issues"
16
16
  @echo " make clean - Remove build artifacts and caches"
17
17
  @echo ""
18
+ @echo "📦 Build Targets:"
19
+ @echo " make zipapp - Build a zipapp using shiv"
20
+ @echo ""
18
21
  @echo "📚 Documentation Targets:"
19
22
  @echo " make docs - Build documentation"
20
23
  @echo " make docs-serve - Serve docs locally with live reload"
@@ -47,8 +50,14 @@ fix:
47
50
  clean:
48
51
  rm -rf .pytest_cache .ruff_cache .pyright coverage dist build site
49
52
  rm -rf src/*.egg-info
53
+ rm -f *.pyz
50
54
  find . -type d -name __pycache__ -exec rm -rf {} + 2>/dev/null || true
51
55
 
56
+ ZIPAPP_OUTPUT ?= linux-mcp-server.pyz
57
+
58
+ zipapp:
59
+ uv run --locked shiv . -c linux-mcp-server -o $(ZIPAPP_OUTPUT) -p "/usr/bin/env python3"
60
+
52
61
  docs:
53
62
  uv run --locked --group docs mkdocs build
54
63
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linux-mcp-server
3
- Version: 1.3.0
3
+ Version: 1.3.2
4
4
  Summary: MCP server for read-only Linux system administration, diagnostics, and troubleshooting
5
5
  Project-URL: Source code, https://github.com/rhel-lightspeed/linux-mcp-server
6
6
  Project-URL: Bug Tracker, https://github.com/rhel-lightspeed/linux-mcp-server/issues
@@ -253,6 +253,17 @@ sudo pacman -S python python-pip
253
253
 
254
254
  #### Installing Python
255
255
 
256
+ Installing Python is not needed if you are using uv (recommended) -
257
+ it will automatically install Python versions as needed.
258
+
259
+ To check your installed version of Python:
260
+
261
+ ```bash
262
+ python3 --version
263
+ ```
264
+
265
+ linux-mcp-server requires Python 3.10 or newer.
266
+
256
267
  === "Official Python Installer (Recommended)"
257
268
 
258
269
  Download from [python.org/downloads/macos](https://www.python.org/downloads/macos/) and run the installer.
@@ -272,13 +283,7 @@ sudo pacman -S python python-pip
272
283
 
273
284
  #### Installing linux-mcp-server
274
285
 
275
- === "pip"
276
-
277
- ```bash
278
- pip3 install --user linux-mcp-server
279
- ```
280
-
281
- === "uv"
286
+ === "uv (Recommended)"
282
287
 
283
288
  Install [uv](https://docs.astral.sh/uv/#installation).
284
289
 
@@ -288,6 +293,12 @@ sudo pacman -S python python-pip
288
293
  uv tool install linux-mcp-server
289
294
  ```
290
295
 
296
+ === "pip"
297
+
298
+ ```bash
299
+ pip3 install --user linux-mcp-server
300
+ ```
301
+
291
302
  ??? failure "Command not found after installation?"
292
303
 
293
304
  On macOS (which uses `zsh` by default), add the install location to your `PATH`:
@@ -302,6 +313,13 @@ sudo pacman -S python python-pip
302
313
  uv tool update-shell
303
314
  ```
304
315
 
316
+ ??? failure "No matching distribution found for linux-mcp-server"
317
+
318
+ If pip3 claims to be unable to find linux-mcp-server,
319
+ that probably means you have a too-old version
320
+ of Python. Check your python version
321
+ with `python3 --version` - it should be 3.10 or newer.
322
+
305
323
  #### SSH Setup on macOS
306
324
 
307
325
  macOS includes OpenSSH by default. To set up key-based authentication:
@@ -52,6 +52,7 @@ linux-mcp-server = "linux_mcp_server.__main__:cli"
52
52
  dev = [
53
53
  "ipdb",
54
54
  "ipython",
55
+ "shiv",
55
56
  {include-group = "lint"},
56
57
  {include-group = "test"},
57
58
  ]
@@ -142,6 +143,7 @@ tag-only = [
142
143
  "astral-sh/setup-uv",
143
144
  "codecov/codecov-action",
144
145
  "pypa/gh-action-pypi-publish",
146
+ "softprops/action-gh-release",
145
147
  ]
146
148
 
147
149
  [tool.pyright]
@@ -95,7 +95,7 @@ def main():
95
95
  system, arch = get_platform_info()
96
96
  download_url = f"https://github.com/modelcontextprotocol/registry/releases/download/{mcp_publisher_version}/mcp-publisher_{system}_{arch}.tar.gz"
97
97
 
98
- publisher_path = Path("./mcp-publisher")
98
+ publisher_path = Path("mcp-publisher").absolute()
99
99
  download_publisher(download_url, publisher_path)
100
100
 
101
101
  update_server_json(version)
@@ -354,7 +354,6 @@ async def execute_command(
354
354
  Raises:
355
355
  ValueError: If host is provided without username
356
356
  ConnectionError: If remote connection fails
357
- ToolError: If the command is missing
358
357
 
359
358
  Examples:
360
359
  # Local execution
@@ -4,8 +4,6 @@ This module provides functions to format parsed data into
4
4
  human-readable strings for tool output.
5
5
  """
6
6
 
7
- from pathlib import Path
8
-
9
7
  from linux_mcp_server.models import ListeningPort
10
8
  from linux_mcp_server.models import NetworkConnection
11
9
  from linux_mcp_server.models import NetworkInterface
@@ -222,60 +220,6 @@ def format_service_logs(stdout: str, service_name: str, lines_count: int) -> str
222
220
  return "\n".join(lines)
223
221
 
224
222
 
225
- def format_journal_logs(
226
- stdout: str,
227
- lines_count: int,
228
- unit: str | None = None,
229
- priority: str | None = None,
230
- since: str | None = None,
231
- transport: str | None = None,
232
- ) -> str:
233
- """Format journal logs output.
234
-
235
- Args:
236
- stdout: Raw output from journalctl.
237
- lines_count: Number of log lines.
238
- unit: Optional unit filter.
239
- priority: Optional priority filter.
240
- since: Optional time filter.
241
- transport: Optional transport filter (e.g., 'audit', 'kernel').
242
-
243
- Returns:
244
- Formatted string representation.
245
- """
246
- filters = []
247
- if unit:
248
- filters.append(f"unit={unit}")
249
- if priority:
250
- filters.append(f"priority={priority}")
251
- if since:
252
- filters.append(f"since={since}")
253
-
254
- log_type = f"{transport.title()} Logs" if transport else "Journal Logs"
255
- filter_str = f", {', '.join(filters)}" if filters else (", no filters" if not transport else "")
256
- header = f"=== {log_type} (last {lines_count} entries{filter_str}) ===\n"
257
-
258
- lines = [header]
259
- lines.append(stdout)
260
- return "\n".join(lines)
261
-
262
-
263
- def format_log_file(stdout: str, log_path: Path, lines_count: int) -> str:
264
- """Format log file output.
265
-
266
- Args:
267
- stdout: Raw content from log file.
268
- log_path: Path to the log file.
269
- lines_count: Number of lines read.
270
-
271
- Returns:
272
- Formatted string representation.
273
- """
274
- lines = [f"=== Log File: {log_path} (last {lines_count} lines) ===\n"]
275
- lines.append(stdout)
276
- return "\n".join(lines)
277
-
278
-
279
223
  def format_disk_usage(stdout: str, disk_io: str | None = None) -> str:
280
224
  """Format disk usage output.
281
225
 
@@ -1,9 +1,11 @@
1
1
  import typing as t
2
2
 
3
3
  from datetime import datetime
4
+ from pathlib import Path
4
5
 
5
6
  from pydantic import BaseModel
6
7
  from pydantic import Field
8
+ from pydantic import field_serializer
7
9
  from pydantic import model_validator
8
10
 
9
11
  from linux_mcp_server.utils.format import format_bytes
@@ -184,3 +186,15 @@ class NodeEntry(BaseModel):
184
186
  class StorageNodes(BaseModel):
185
187
  nodes: list[NodeEntry]
186
188
  total: int = Field(default_factory=field_length("nodes"))
189
+
190
+
191
+ ### Log models ###
192
+ class LogEntries(BaseModel):
193
+ entries: list[str]
194
+ unit: str = ""
195
+ path: Path | None = None
196
+ lines_count: int = Field(default_factory=field_length("entries"))
197
+
198
+ @field_serializer("unit", "path")
199
+ def serialize_empty_as_null(self, value: str | Path | None) -> str | Path | None:
200
+ return value or None