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.
- linux_mcp_server-1.3.2/.github/workflows/build-publish.yml +178 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/ci.yml +2 -2
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/ci_installation.yaml +1 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/docs.yml +1 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.gitignore +1 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/pipeline-build-multiarch.yaml +14 -42
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/push.yaml +0 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/Containerfile +1 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/Makefile +10 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/PKG-INFO +1 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/install.md +25 -7
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/pyproject.toml +2 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/scripts/publish_mcp_registry.py +1 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/connection/ssh.py +0 -1
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/formatters.py +0 -56
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/models.py +14 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/logs.py +20 -14
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_formatters.py +0 -55
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_logs.py +71 -69
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/uv.lock +34 -0
- linux_mcp_server-1.3.0/.github/workflows/build-publish.yml +0 -94
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.codecov.yml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.coderabbit.yaml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.devcontainer/Containerfile +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.devcontainer/devcontainer.json +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.github/workflows/functional-tests.yml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/pull_request.yaml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/.tekton/task-get-version.yaml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/AGENTS.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/LICENSE +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/README.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/audit.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/commands.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/config.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/connection.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/formatters.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/index.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/parsers.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/server.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/logs.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/network.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/processes.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/services.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/storage.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/api/tools/system_info.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/architecture.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/cheatsheet.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/clients.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/contributing.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/debugging.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/examples/claude_desktop_config.example.json +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/examples/example_config.sh +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/getting-started.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/index.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/troubleshooting.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/docs/usage.md +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/licenses/GPL-3.0.txt +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/mkdocs.yml +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/renovate.json +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/scripts/verify_installation.sh +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/server.json +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/__main__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/_vendor/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/audit.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/commands.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/config.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/connection/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/logging_config.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/parsers.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/server.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/network.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/processes.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/services.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/storage.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/tools/system_info.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/decorators.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/enum.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/format.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/types.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/src/linux_mcp_server/utils/validation.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/_vendor/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/_vendor/test_vendor.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/cli/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/cli/test_cli.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/conftest.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_connection_manager.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_discover_ssh_key.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_execute_command.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_get_bin_path.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_host_key_verification.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/connection/ssh/test_timeout.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_cpu_info.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_free_output.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ip_brief.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_listing.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_os_release.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_proc.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ps_output.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_service_count.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_ss.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/parsers/test_parse_system_info.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test__main__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_audit.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_commands.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_config.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_logging_config.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_server.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/test_tool_schemas.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/conftest.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_block_devices.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_directories.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_list_files.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_path_validation.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/storage/test_read_file.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_network.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_processes.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_services.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/tools/test_system_info.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/__init__.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_decorators.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_enum.py +0 -0
- {linux_mcp_server-1.3.0 → linux_mcp_server-1.3.2}/tests/utils/test_format.py +0 -0
- {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.
|
|
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.
|
|
97
|
+
uses: astral-sh/setup-uv@v7.3.0
|
|
98
98
|
with:
|
|
99
99
|
enable-cache: true
|
|
100
100
|
prune-cache: false
|
|
@@ -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.
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
@@ -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.
|
|
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
|
-
=== "
|
|
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("
|
|
98
|
+
publisher_path = Path("mcp-publisher").absolute()
|
|
99
99
|
download_publisher(download_url, publisher_path)
|
|
100
100
|
|
|
101
101
|
update_server_json(version)
|
|
@@ -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
|