diff --git a/.containerignore b/.containerignore new file mode 100644 index 00000000..c2061708 --- /dev/null +++ b/.containerignore @@ -0,0 +1,11 @@ +# Toplevel inclusion is controlled by ADD lines in the Containerfile +# Exclude possible nested leftover files +**/__pycache__ +**/*.pyc +**/*.bak +**/*~ +# Exclude large directories from context for performance +.git +.venv/ +dist/ +mcp-app/node_modules diff --git a/SECURITY-AUDIT-REPORT.md b/SECURITY-AUDIT-REPORT.md new file mode 100644 index 00000000..fc11e7df --- /dev/null +++ b/SECURITY-AUDIT-REPORT.md @@ -0,0 +1,213 @@ +# Security Audit Report: linux-mcp-server + +| Field | Value | +|-------|-------| +| **Date** | 2026-04-21 | +| **Tool** | skill-audit v0.1.0 | +| **Detected type** | mcp-server (python) | +| **Files scanned** | 161 | +| **Current score** | FAIL (62%) | +| **Estimated after fixes** | PASS (~90%) | + +--- + +## Summary of Findings + +| ID | Severity | Category | Title | Status | +|----|----------|----------|-------|--------| +| SEC-001 | Critical | Secrets | 257 false positives from package-lock.json | Blocks PASS | +| LIC-002 | Critical | Licensing | 96 source files missing SPDX headers | Blocks PASS | +| PRI-001 | Critical | Privacy | Real email in test file | Review needed | +| CTR-007 | Critical | Container | ENV sets sensitive-looking value in Containerfile | Review needed | +| CTR-003 | Recommended | Container | No .containerignore file | Improves score | +| LIC-005 | Recommended | Licensing | No copyright notices in source files | Improves score | +| DEP-002 | Recommended | Dependencies | 3 dependencies without upper bounds | See note | +| SBX-001 | Recommended | Sandbox | 5 test files write to absolute paths | Low risk | + +--- + +## Critical Findings (blocks PASS -- must fix) + +### SEC-001 -- 257 false positives from package-lock.json + +All 257 "secrets" findings are SHA-512 integrity hashes in `mcp-app/package-lock.json`. These are npm package integrity checksums, not secrets. Example: + +``` +"integrity": "sha512-abc123..." +``` + +**Why this matters:** The scanner flags any string matching cryptographic hash patterns. With 257 hits, this single file dominates the score and pushes the overall result to FAIL. + +**Action needed:** +- **Option A:** Add `mcp-app/package-lock.json` to `.gitignore`. The lock file is not currently ignored (checked `.gitignore`). Since the container build runs `npm install` from `package.json`, the lock file is regenerated at build time. Removing it from the repo would also reduce noise in diffs. +- **Option B:** No action from your side -- we have already excluded lock files from scanning on our end. However, Option A is still worth considering for general repo hygiene. + +--- + +### LIC-002 -- 96 source files missing SPDX license headers + +The repo is licensed Apache-2.0 but 96 `.py` and `.sh` files are missing SPDX headers. This is a gated category in the audit -- a FAIL here means an automatic overall FAIL regardless of other scores. + +**Action needed:** Add the following line to the top of every `.py` and `.sh` file (after the shebang line, if present): + +```python +# SPDX-License-Identifier: Apache-2.0 +``` + +**Find all files that need updating:** + +```bash +find . -name "*.py" -o -name "*.sh" | xargs grep -L SPDX +``` + +**Batch fix (one-liner for .py files without shebangs):** + +```bash +find . -name "*.py" -exec grep -L SPDX {} \; | while read f; do + sed -i '1i# SPDX-License-Identifier: Apache-2.0' "$f" +done +``` + +For files with shebangs (`#!/usr/bin/env python3`), insert the SPDX line on line 2 instead of line 1. + +--- + +### PRI-001 -- Real email in test file + +- **File:** `tests/connection/ssh/test_timeout.py`, line 111 +- **Value:** `testuser@myhost.example.com` + +The domain `example.com` is an IANA-reserved domain (RFC 2606), so this is likely acceptable. However, the scanner flags it because it matches the `user@host` email pattern. + +**Action needed:** Confirm this is intentional. If so, no change is required -- we can add a suppression comment for future scans. + +--- + +### CTR-007 -- ENV sets sensitive-looking value in Containerfile + +- **File:** `Containerfile`, line 67 +- **Value:** `ENV LINUX_MCP_SEARCH_FOR_SSH_KEY=True` + +The scanner flagged this because the variable name contains `SSH_KEY`, which matches patterns for sensitive configuration. On inspection, this is a boolean flag that controls whether the application searches for SSH keys at runtime -- it does not contain a key or secret itself. + +**Action needed:** This is a false positive given the actual value is just `True`. Two options: +1. **No change** -- we can add this to our suppression list. +2. **Consider renaming** to something less ambiguous, e.g., `LINUX_MCP_ENABLE_SSH_KEY_DISCOVERY=True`, to avoid triggering security scanners. This is optional. + +--- + +## Recommended Findings (improves score, not blocking) + +### CTR-003 -- No .containerignore file + +The repo has no `.containerignore` file. Without one, `podman build` / `docker build` may copy unnecessary or sensitive files into the build context. + +**Action needed:** Create `.containerignore` with: + +``` +.env +.env.* +.git +*.token +__pycache__ +*.pyc +.pytest_cache +coverage/ +.venv/ +.vscode/ +.idea/ +*.egg-info/ +``` + +--- + +### LIC-005 -- No copyright notices in source files + +Source files have no copyright headers. While SPDX identifiers (LIC-002) are the blocker, adding copyright notices is best practice for Apache-2.0 licensed projects. + +**Action needed:** Add below the SPDX header in each source file: + +```python +# SPDX-License-Identifier: Apache-2.0 +# Copyright (C) 2026 Red Hat, Inc. +``` + +Adjust the year and entity as appropriate for your project. + +--- + +### DEP-002 -- 3 dependencies without upper bounds + +Three dependencies in `pyproject.toml` use `>=` without an upper bound: + +| Dependency | Current spec | +|-----------|-------------| +| `litellm` | `>=1.80.16` | +| `pydantic-settings` | `>= 2.12.0` | +| `pydantic` | `>= 2.12.5` | + +**Note:** We see the comment in `pyproject.toml` explaining this is intentional due to your Renovate `in-range-only` strategy -- unbounded ranges ensure Renovate notifies you about all new versions, including major bumps with security fixes. This is a valid tradeoff. + +**Action needed:** None required if the Renovate strategy is working as intended. The scanner flags this as a general best practice but your documented rationale is sound. For the audit, we can suppress this finding with a note. + +--- + +### SBX-001 -- 5 test files write to absolute paths + +Several test files reference absolute paths under `/var/log/`: + +| File | Paths referenced | +|------|-----------------| +| `tests/test_config.py` | `/var/log/custom`, `/var/log/test`, `/var/log/my-app/2024` | +| `tests/utils/test_validation.py` | `/var/log/messages`, `/var/log/../../etc/hosts` | +| `tests/tools/test_logs.py` | `/var/log/test.log`, `/var/log/remote.log` | + +These are in test files and appear to be used for config validation and path traversal checks (the `../../etc/hosts` path is a security test, which is good). Risk is low. + +**Action needed:** Consider using `tmp_path` pytest fixtures or `/tmp` paths where possible. For path validation tests (like the traversal check), the current approach is fine. + +--- + +## Clean Categories (no findings) + +| Category | Grade | Notes | +|----------|-------|-------| +| Authentication patterns | A | No hardcoded credentials or auth bypasses | +| Network boundaries | A | Proper network access controls | +| Output safety | A | No injection or escape issues | + +--- + +## How to Run the Audit Yourself + +```bash +git clone git@gitlab.cee.redhat.com:afarley/ai-tool-security-check.git +cd ai-tool-security-check +python3 bin/skill-audit --fix-hints /path/to/linux-mcp-server/ +``` + +The `--fix-hints` flag provides actionable fix suggestions for each finding. + +--- + +## Score Breakdown + +| Category | Current | After fixes | +|----------|---------|-------------| +| Secrets | F (257 false positives) | A (exclude lock files) | +| Licensing (SPDX) | F (96 files) | A (add headers) | +| Licensing (copyright) | C | A (add notices) | +| Privacy | B | A (confirm example.com) | +| Container | C | A (add .containerignore, review ENV) | +| Dependencies | B | B (intentional, suppressed) | +| Sandbox | B | B (test-only, low risk) | +| Auth patterns | A | A | +| Network | A | A | +| Output safety | A | A | +| **Overall** | **FAIL (62%)** | **PASS (~90%)** | + +**The two highest-impact fixes are:** +1. Exclude `package-lock.json` from the repo or scanning (removes 257 false positives) +2. Add SPDX headers to all 96 source files (unblocks the licensing gate) + +These two changes alone should move the score from FAIL to PASS. diff --git a/eval/gatekeeper/extract-from-goose.py b/eval/gatekeeper/extract-from-goose.py index 4b491fec..87649b61 100755 --- a/eval/gatekeeper/extract-from-goose.py +++ b/eval/gatekeeper/extract-from-goose.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import json import subprocess diff --git a/eval/gatekeeper/run-eval-models-corp.sh b/eval/gatekeeper/run-eval-models-corp.sh index d369127d..b90000e2 100755 --- a/eval/gatekeeper/run-eval-models-corp.sh +++ b/eval/gatekeeper/run-eval-models-corp.sh @@ -1,4 +1,6 @@ #!/usr/bin/env bash +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 # Script: run-eval-models-corp.sh # Purpose: Executes run-eval.py using models hosted by the internal Red Hat model platform models.corp.redhat.com. diff --git a/eval/gatekeeper/run-eval.py b/eval/gatekeeper/run-eval.py index e12a4a3b..09572767 100755 --- a/eval/gatekeeper/run-eval.py +++ b/eval/gatekeeper/run-eval.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import json import os diff --git a/eval/gatekeeper/utils.py b/eval/gatekeeper/utils.py index 120aa1f1..df99d3cc 100644 --- a/eval/gatekeeper/utils.py +++ b/eval/gatekeeper/utils.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import yaml diff --git a/scripts/generate_tool_docs.py b/scripts/generate_tool_docs.py index c6a05277..ef5dba3d 100644 --- a/scripts/generate_tool_docs.py +++ b/scripts/generate_tool_docs.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Generate tools documentation from MCP server metadata. Produces one markdown file per tool category under docs/tools/ by diff --git a/scripts/mirror_github_pr.py b/scripts/mirror_github_pr.py index 76a6c5d0..89db9fe6 100755 --- a/scripts/mirror_github_pr.py +++ b/scripts/mirror_github_pr.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """ Mirror a GitHub PR to GitLab as a merge request. diff --git a/scripts/publish_mcp_registry.py b/scripts/publish_mcp_registry.py index fe7282a5..9eb40b20 100755 --- a/scripts/publish_mcp_registry.py +++ b/scripts/publish_mcp_registry.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """ Script to publish the MCP server to the Model Context Protocol registry. This script is designed to run in GitHub Actions but can be tested locally. diff --git a/scripts/verify_installation.sh b/scripts/verify_installation.sh index 4d437bfa..931b66a1 100644 --- a/scripts/verify_installation.sh +++ b/scripts/verify_installation.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 set -e # Function to verify server startup diff --git a/src/linux_mcp_server/__init__.py b/src/linux_mcp_server/__init__.py index 65dc5b45..dd22a572 100644 --- a/src/linux_mcp_server/__init__.py +++ b/src/linux_mcp_server/__init__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import importlib.metadata import linux_mcp_server._vendor # noqa: F401 diff --git a/src/linux_mcp_server/__main__.py b/src/linux_mcp_server/__main__.py index 2cf0ee2d..40b5df2f 100644 --- a/src/linux_mcp_server/__main__.py +++ b/src/linux_mcp_server/__main__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Main entry point for the Linux MCP Server.""" import logging diff --git a/src/linux_mcp_server/_vendor/__init__.py b/src/linux_mcp_server/_vendor/__init__.py index b8be8f3e..9c9c07a1 100644 --- a/src/linux_mcp_server/_vendor/__init__.py +++ b/src/linux_mcp_server/_vendor/__init__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 # (c) 2020 Ansible Project # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) diff --git a/src/linux_mcp_server/audit.py b/src/linux_mcp_server/audit.py index 65259979..5b73f77a 100644 --- a/src/linux_mcp_server/audit.py +++ b/src/linux_mcp_server/audit.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Audit logging utilities for Linux MCP Server. This module provides helper functions for consistent audit logging across diff --git a/src/linux_mcp_server/auth.py b/src/linux_mcp_server/auth.py index 375faaeb..a71bdd00 100644 --- a/src/linux_mcp_server/auth.py +++ b/src/linux_mcp_server/auth.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import logging from fastmcp.server.auth.auth import RemoteAuthProvider diff --git a/src/linux_mcp_server/auth_policy.py b/src/linux_mcp_server/auth_policy.py index c83501f5..8ce8cebb 100644 --- a/src/linux_mcp_server/auth_policy.py +++ b/src/linux_mcp_server/auth_policy.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import fnmatch import logging diff --git a/src/linux_mcp_server/commands.py b/src/linux_mcp_server/commands.py index 14823e81..c81a557e 100644 --- a/src/linux_mcp_server/commands.py +++ b/src/linux_mcp_server/commands.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Command registry for unified local and remote execution. This module provides a centralized registry of commands used by tools, diff --git a/src/linux_mcp_server/config.py b/src/linux_mcp_server/config.py index b292b7d2..6dc6473d 100644 --- a/src/linux_mcp_server/config.py +++ b/src/linux_mcp_server/config.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Settings for linux-mcp-server""" import sys @@ -124,6 +126,14 @@ class Config(BaseSettings): verify_host_keys: bool = True known_hosts_path: Path | None = None # Custom path to known_hosts file + # OBO/GSSAPI configuration (IPA OAuth2 delegation) + obo_enabled: bool = False + obo_exchange_url: str = "" + obo_agent_token_path: Path | None = None + obo_target_user: str = "" + obo_target_service: str = "" + obo_scope: str = "openid" + # What tools are available toolset: Toolset = Toolset.FIXED diff --git a/src/linux_mcp_server/connection/__init__.py b/src/linux_mcp_server/connection/__init__.py index e69de29b..454a18c6 100644 --- a/src/linux_mcp_server/connection/__init__.py +++ b/src/linux_mcp_server/connection/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/src/linux_mcp_server/connection/ssh.py b/src/linux_mcp_server/connection/ssh.py index 597bfbc1..3a635b6b 100644 --- a/src/linux_mcp_server/connection/ssh.py +++ b/src/linux_mcp_server/connection/ssh.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """SSH executor for remote command execution. This module provides functionality to execute commands on remote systems via SSH, @@ -6,12 +8,17 @@ """ import asyncio +import base64 +import json import logging import os import shlex import shutil import subprocess +import tempfile import time +import urllib.parse +import urllib.request from collections.abc import Sequence from pathlib import Path @@ -96,6 +103,55 @@ def __new__(cls): cls._instance._ssh_key = discover_ssh_key() return cls._instance + def _acquire_obo_ccache(self, target_host: str = "") -> str: + """Call OBO /kerberos endpoint and return local ccache file path. + + Reads agent JWT from CONFIG.obo_agent_token_path, POSTs to the + OBO exchange, decodes the base64 ccache contents, writes to a + temp file, and sets KRB5CCNAME. + """ + token = CONFIG.obo_agent_token_path.read_text().strip() + form_data = { + 'subject_token': token, + 'requested_subject': CONFIG.obo_target_user, + 'scope': CONFIG.obo_scope, + 'return_contents': 'true', + } + if CONFIG.obo_target_service: + form_data['target_service'] = CONFIG.obo_target_service + elif target_host: + form_data['target_service'] = f"host/{target_host}" + + encoded = urllib.parse.urlencode(form_data).encode('utf-8') + url = f"{CONFIG.obo_exchange_url.rstrip('/')}/kerberos" + req = urllib.request.Request(url, data=encoded, + method='POST') + req.add_header('Content-Type', + 'application/x-www-form-urlencoded') + + try: + with urllib.request.urlopen(req, timeout=15) as resp: + result = json.loads(resp.read().decode('utf-8')) + except Exception as e: + raise ConnectionError( + f"OBO exchange failed: {e}") from e + + if 'ccache_contents' not in result: + raise ConnectionError( + "OBO exchange did not return ccache_contents") + + ccache_bytes = base64.b64decode(result['ccache_contents']) + fd, ccache_path = tempfile.mkstemp(prefix='krb5cc_mcp_obo_') + os.write(fd, ccache_bytes) + os.close(fd) + os.environ['KRB5CCNAME'] = f'FILE:{ccache_path}' + + logger.info( + "OBO: acquired ccache for %s via rule %s", + result.get('principal', '?'), + result.get('delegation_rule', '?')) + return ccache_path + async def get_connection(self, host: str) -> asyncssh.SSHClientConnection: """ Get or create an SSH connection to a host. @@ -144,17 +200,29 @@ async def get_connection(self, host: str) -> asyncssh.SSHClientConnection: logger.warning("SSH host key verification disabled - vulnerable to MITM attacks") known_hosts = None - connect_kwargs = { - "host": host, - "known_hosts": known_hosts, - "passphrase": CONFIG.key_passphrase.get_secret_value() or None, - } + if CONFIG.obo_enabled: + # OBO/GSSAPI path: acquire Kerberos ticket, connect via GSSAPI + self._acquire_obo_ccache(target_host=host) + connect_kwargs = { + "host": host, + "known_hosts": known_hosts, + "username": CONFIG.obo_target_user, + "gss_auth": True, + "gss_kex": True, + } + else: + # Standard SSH key path (upstream behavior) + connect_kwargs = { + "host": host, + "known_hosts": known_hosts, + "passphrase": CONFIG.key_passphrase.get_secret_value() or None, + } - if self._ssh_key: - connect_kwargs["client_keys"] = [self._ssh_key] + if self._ssh_key: + connect_kwargs["client_keys"] = [self._ssh_key] - if CONFIG.user: - connect_kwargs["username"] = CONFIG.user + if CONFIG.user: + connect_kwargs["username"] = CONFIG.user conn = await asyncssh.connect(**connect_kwargs) self._connections[key] = conn @@ -165,7 +233,7 @@ async def get_connection(self, host: str) -> asyncssh.SSHClientConnection: username=conn.get_extra_info("username"), status=Status.success, reused=False, - key_path=self._ssh_key, + key_path=self._ssh_key if not CONFIG.obo_enabled else None, ) # DEBUG level: Log pool state diff --git a/src/linux_mcp_server/formatters.py b/src/linux_mcp_server/formatters.py index 2cf49090..4f91ad6a 100644 --- a/src/linux_mcp_server/formatters.py +++ b/src/linux_mcp_server/formatters.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Shared output formatters for tool results. This module provides functions to format parsed data into diff --git a/src/linux_mcp_server/gatekeeper/__init__.py b/src/linux_mcp_server/gatekeeper/__init__.py index 7d4b0fe5..490b173e 100644 --- a/src/linux_mcp_server/gatekeeper/__init__.py +++ b/src/linux_mcp_server/gatekeeper/__init__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from linux_mcp_server.gatekeeper.check_run_script import check_run_script from linux_mcp_server.gatekeeper.check_run_script import GatekeeperResult from linux_mcp_server.gatekeeper.check_run_script import GatekeeperStatus diff --git a/src/linux_mcp_server/gatekeeper/check_run_script.py b/src/linux_mcp_server/gatekeeper/check_run_script.py index 5d884943..d8e76e12 100644 --- a/src/linux_mcp_server/gatekeeper/check_run_script.py +++ b/src/linux_mcp_server/gatekeeper/check_run_script.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import json import logging diff --git a/src/linux_mcp_server/logging_config.py b/src/linux_mcp_server/logging_config.py index 535c66ba..3e1598aa 100644 --- a/src/linux_mcp_server/logging_config.py +++ b/src/linux_mcp_server/logging_config.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Centralized logging configuration for Linux MCP Server. Simplified logging setup with standard Python logging infrastructure. diff --git a/src/linux_mcp_server/mcp_app.py b/src/linux_mcp_server/mcp_app.py index ccbe428f..1efc75a7 100644 --- a/src/linux_mcp_server/mcp_app.py +++ b/src/linux_mcp_server/mcp_app.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 RUN_SCRIPT_APP_URI = "ui://run_script_readonly_with_mcp_app/run-script-app.html" ALLOWED_UI_RESOURCE_URIS = set([RUN_SCRIPT_APP_URI]) MCP_APP_MIME_TYPE = "text/html;profile=mcp-app" diff --git a/src/linux_mcp_server/models.py b/src/linux_mcp_server/models.py index ff1f3fa1..8bf86803 100644 --- a/src/linux_mcp_server/models.py +++ b/src/linux_mcp_server/models.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import typing as t from datetime import datetime diff --git a/src/linux_mcp_server/parsers.py b/src/linux_mcp_server/parsers.py index d30a7911..088ec0db 100644 --- a/src/linux_mcp_server/parsers.py +++ b/src/linux_mcp_server/parsers.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Shared output parsers for command results. This module provides functions to parse raw command output into diff --git a/src/linux_mcp_server/server.py b/src/linux_mcp_server/server.py index fccd7d41..7339791a 100644 --- a/src/linux_mcp_server/server.py +++ b/src/linux_mcp_server/server.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Core MCP server for Linux diagnostics using FastMCP.""" import logging diff --git a/src/linux_mcp_server/tools/__init__.py b/src/linux_mcp_server/tools/__init__.py index 954b167e..1b94f146 100644 --- a/src/linux_mcp_server/tools/__init__.py +++ b/src/linux_mcp_server/tools/__init__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 # Arbitrary script execution # logs from linux_mcp_server.tools.logs import get_journal_logs diff --git a/src/linux_mcp_server/tools/logs.py b/src/linux_mcp_server/tools/logs.py index 7d0afdb5..20b31457 100644 --- a/src/linux_mcp_server/tools/logs.py +++ b/src/linux_mcp_server/tools/logs.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Log and audit tools.""" import typing as t diff --git a/src/linux_mcp_server/tools/network.py b/src/linux_mcp_server/tools/network.py index fee3f424..0c7001b4 100644 --- a/src/linux_mcp_server/tools/network.py +++ b/src/linux_mcp_server/tools/network.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Network diagnostic tools.""" from mcp.types import ToolAnnotations diff --git a/src/linux_mcp_server/tools/processes.py b/src/linux_mcp_server/tools/processes.py index de40e58d..ceae8f7a 100644 --- a/src/linux_mcp_server/tools/processes.py +++ b/src/linux_mcp_server/tools/processes.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Process management tools.""" import typing as t diff --git a/src/linux_mcp_server/tools/run_script.py b/src/linux_mcp_server/tools/run_script.py index a7c6be50..54dccf02 100644 --- a/src/linux_mcp_server/tools/run_script.py +++ b/src/linux_mcp_server/tools/run_script.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import logging import secrets import shlex diff --git a/src/linux_mcp_server/tools/services.py b/src/linux_mcp_server/tools/services.py index 50b4d11a..f021e1f6 100644 --- a/src/linux_mcp_server/tools/services.py +++ b/src/linux_mcp_server/tools/services.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Service management tools.""" import typing as t diff --git a/src/linux_mcp_server/tools/storage.py b/src/linux_mcp_server/tools/storage.py index 658dad73..6ff5b638 100644 --- a/src/linux_mcp_server/tools/storage.py +++ b/src/linux_mcp_server/tools/storage.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Storage and hardware tools.""" import os diff --git a/src/linux_mcp_server/tools/system_info.py b/src/linux_mcp_server/tools/system_info.py index f6df99f9..27b16f07 100644 --- a/src/linux_mcp_server/tools/system_info.py +++ b/src/linux_mcp_server/tools/system_info.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """System information tools.""" import json diff --git a/src/linux_mcp_server/toolset.py b/src/linux_mcp_server/toolset.py index 5c0e8ff8..396043bc 100644 --- a/src/linux_mcp_server/toolset.py +++ b/src/linux_mcp_server/toolset.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 # Toolset matching for authorization policies # Maps @fixed/@run_script/@both in policy rules to tag-based tool filters. diff --git a/src/linux_mcp_server/utils/__init__.py b/src/linux_mcp_server/utils/__init__.py index 2b655e1d..20c680a6 100644 --- a/src/linux_mcp_server/utils/__init__.py +++ b/src/linux_mcp_server/utils/__init__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from linux_mcp_server.utils.enum import StrEnum as StrEnum from linux_mcp_server.utils.format import format_bytes as format_bytes from linux_mcp_server.utils.format import is_ipv6_link_local as is_ipv6_link_local diff --git a/src/linux_mcp_server/utils/decorators.py b/src/linux_mcp_server/utils/decorators.py index c1ba9af6..186241ef 100644 --- a/src/linux_mcp_server/utils/decorators.py +++ b/src/linux_mcp_server/utils/decorators.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Decorators for tool functions.""" import functools diff --git a/src/linux_mcp_server/utils/enum.py b/src/linux_mcp_server/utils/enum.py index 58a2b47f..e3678a6b 100644 --- a/src/linux_mcp_server/utils/enum.py +++ b/src/linux_mcp_server/utils/enum.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from enum import Enum diff --git a/src/linux_mcp_server/utils/format.py b/src/linux_mcp_server/utils/format.py index 48c8e1ad..149d3cd3 100644 --- a/src/linux_mcp_server/utils/format.py +++ b/src/linux_mcp_server/utils/format.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import ipaddress diff --git a/src/linux_mcp_server/utils/types.py b/src/linux_mcp_server/utils/types.py index b629c648..da8e8d45 100644 --- a/src/linux_mcp_server/utils/types.py +++ b/src/linux_mcp_server/utils/types.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import typing as t from pydantic import Field diff --git a/src/linux_mcp_server/utils/validation.py b/src/linux_mcp_server/utils/validation.py index 5e330b0a..e6195f79 100644 --- a/src/linux_mcp_server/utils/validation.py +++ b/src/linux_mcp_server/utils/validation.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from pathlib import Path diff --git a/tests/__init__.py b/tests/__init__.py index e69de29b..454a18c6 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/_vendor/__init__.py b/tests/_vendor/__init__.py index e69de29b..454a18c6 100644 --- a/tests/_vendor/__init__.py +++ b/tests/_vendor/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/_vendor/test_vendor.py b/tests/_vendor/test_vendor.py index e470ccc4..41ccf74d 100644 --- a/tests/_vendor/test_vendor.py +++ b/tests/_vendor/test_vendor.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pkgutil import sys diff --git a/tests/cli/__init__.py b/tests/cli/__init__.py index e69de29b..454a18c6 100644 --- a/tests/cli/__init__.py +++ b/tests/cli/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/cli/test_cli.py b/tests/cli/test_cli.py index 51ea33e7..6336e31e 100644 --- a/tests/cli/test_cli.py +++ b/tests/cli/test_cli.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import re import pytest diff --git a/tests/conftest.py b/tests/conftest.py index 0ebccc65..b6b918b7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import os diff --git a/tests/connection/__init__.py b/tests/connection/__init__.py index e69de29b..454a18c6 100644 --- a/tests/connection/__init__.py +++ b/tests/connection/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/connection/ssh/__init__.py b/tests/connection/ssh/__init__.py index e69de29b..454a18c6 100644 --- a/tests/connection/ssh/__init__.py +++ b/tests/connection/ssh/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/connection/ssh/test_connection_manager.py b/tests/connection/ssh/test_connection_manager.py index 35c39e7a..90d672cb 100644 --- a/tests/connection/ssh/test_connection_manager.py +++ b/tests/connection/ssh/test_connection_manager.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import asyncssh import pytest diff --git a/tests/connection/ssh/test_discover_ssh_key.py b/tests/connection/ssh/test_discover_ssh_key.py index dfb35faa..fb7711e5 100644 --- a/tests/connection/ssh/test_discover_ssh_key.py +++ b/tests/connection/ssh/test_discover_ssh_key.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.connection.ssh import discover_ssh_key diff --git a/tests/connection/ssh/test_execute_command.py b/tests/connection/ssh/test_execute_command.py index a725e2f7..46027311 100644 --- a/tests/connection/ssh/test_execute_command.py +++ b/tests/connection/ssh/test_execute_command.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.connection.ssh import execute_command diff --git a/tests/connection/ssh/test_get_bin_path.py b/tests/connection/ssh/test_get_bin_path.py index 5ee635b9..f3dae1b3 100644 --- a/tests/connection/ssh/test_get_bin_path.py +++ b/tests/connection/ssh/test_get_bin_path.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import asyncssh import pytest diff --git a/tests/connection/ssh/test_host_key_verification.py b/tests/connection/ssh/test_host_key_verification.py index d8964090..10239512 100644 --- a/tests/connection/ssh/test_host_key_verification.py +++ b/tests/connection/ssh/test_host_key_verification.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from unittest.mock import AsyncMock from unittest.mock import MagicMock from unittest.mock import Mock diff --git a/tests/connection/ssh/test_timeout.py b/tests/connection/ssh/test_timeout.py index 6e35c685..2c0432bc 100644 --- a/tests/connection/ssh/test_timeout.py +++ b/tests/connection/ssh/test_timeout.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from contextlib import nullcontext from unittest.mock import AsyncMock from unittest.mock import Mock diff --git a/tests/functional/utils/__init__.py b/tests/functional/utils/__init__.py index e69de29b..454a18c6 100644 --- a/tests/functional/utils/__init__.py +++ b/tests/functional/utils/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/gatekeeper/__init__.py b/tests/gatekeeper/__init__.py index e69de29b..454a18c6 100644 --- a/tests/gatekeeper/__init__.py +++ b/tests/gatekeeper/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/gatekeeper/test_check_run_script.py b/tests/gatekeeper/test_check_run_script.py index f27ee1cd..427b38a3 100644 --- a/tests/gatekeeper/test_check_run_script.py +++ b/tests/gatekeeper/test_check_run_script.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import importlib from unittest.mock import Mock diff --git a/tests/parsers/__init__.py b/tests/parsers/__init__.py index e69de29b..454a18c6 100644 --- a/tests/parsers/__init__.py +++ b/tests/parsers/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/parsers/test_parse_cpu_info.py b/tests/parsers/test_parse_cpu_info.py index 004cf9c8..80704202 100644 --- a/tests/parsers/test_parse_cpu_info.py +++ b/tests/parsers/test_parse_cpu_info.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.parsers import parse_cpu_info diff --git a/tests/parsers/test_parse_free_output.py b/tests/parsers/test_parse_free_output.py index f7545f54..6ca355cf 100644 --- a/tests/parsers/test_parse_free_output.py +++ b/tests/parsers/test_parse_free_output.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap from linux_mcp_server.parsers import parse_free_output diff --git a/tests/parsers/test_parse_ip_brief.py b/tests/parsers/test_parse_ip_brief.py index 2bbe6760..522c11f2 100644 --- a/tests/parsers/test_parse_ip_brief.py +++ b/tests/parsers/test_parse_ip_brief.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap from linux_mcp_server.parsers import parse_ip_brief diff --git a/tests/parsers/test_parse_listing.py b/tests/parsers/test_parse_listing.py index 5724a499..28ccd2a3 100644 --- a/tests/parsers/test_parse_listing.py +++ b/tests/parsers/test_parse_listing.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.parsers import parse_directory_listing diff --git a/tests/parsers/test_parse_os_release.py b/tests/parsers/test_parse_os_release.py index 24f7febd..3e06111d 100644 --- a/tests/parsers/test_parse_os_release.py +++ b/tests/parsers/test_parse_os_release.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap from linux_mcp_server.parsers import parse_os_release diff --git a/tests/parsers/test_parse_proc.py b/tests/parsers/test_parse_proc.py index 61758d6b..c2f0fcdb 100644 --- a/tests/parsers/test_parse_proc.py +++ b/tests/parsers/test_parse_proc.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap from linux_mcp_server.parsers import parse_proc_net_dev diff --git a/tests/parsers/test_parse_ps_output.py b/tests/parsers/test_parse_ps_output.py index 3c97751b..950d203b 100644 --- a/tests/parsers/test_parse_ps_output.py +++ b/tests/parsers/test_parse_ps_output.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap from linux_mcp_server.parsers import parse_ps_output diff --git a/tests/parsers/test_parse_service_count.py b/tests/parsers/test_parse_service_count.py index b9b80c98..86a025c6 100644 --- a/tests/parsers/test_parse_service_count.py +++ b/tests/parsers/test_parse_service_count.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap import pytest diff --git a/tests/parsers/test_parse_ss.py b/tests/parsers/test_parse_ss.py index defd4ae6..bd30190e 100644 --- a/tests/parsers/test_parse_ss.py +++ b/tests/parsers/test_parse_ss.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import textwrap import pytest diff --git a/tests/parsers/test_parse_system_info.py b/tests/parsers/test_parse_system_info.py index 5deb601b..c929d14f 100644 --- a/tests/parsers/test_parse_system_info.py +++ b/tests/parsers/test_parse_system_info.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from linux_mcp_server.parsers import parse_system_info diff --git a/tests/test__main__.py b/tests/test__main__.py index c3f30b6b..f7a63030 100644 --- a/tests/test__main__.py +++ b/tests/test__main__.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.__main__ import cli diff --git a/tests/test_audit.py b/tests/test_audit.py index 9a00674c..5ada1e69 100644 --- a/tests/test_audit.py +++ b/tests/test_audit.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for audit logging utilities.""" import logging diff --git a/tests/test_auth.py b/tests/test_auth.py index 7c71b0d3..45db2408 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from pydantic import SecretStr diff --git a/tests/test_auth_policy.py b/tests/test_auth_policy.py index f9dfbe20..5c9ffe8c 100644 --- a/tests/test_auth_policy.py +++ b/tests/test_auth_policy.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import tempfile from pathlib import Path diff --git a/tests/test_commands.py b/tests/test_commands.py index 9e24c9b3..cf06ab55 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for command registry and utilities.""" import pytest diff --git a/tests/test_config.py b/tests/test_config.py index f616be44..55a23daa 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Unit tests for linux_mcp_server.config module""" from pathlib import Path diff --git a/tests/test_formatters.py b/tests/test_formatters.py index 37de51b0..d1dca88c 100644 --- a/tests/test_formatters.py +++ b/tests/test_formatters.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for formatters module.""" from linux_mcp_server.formatters import format_disk_usage diff --git a/tests/test_logging_config.py b/tests/test_logging_config.py index 24c951ac..ad6d4f9b 100644 --- a/tests/test_logging_config.py +++ b/tests/test_logging_config.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for logging configuration.""" import importlib diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 2d0b5cd3..4e0d53ad 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import importlib import pytest diff --git a/tests/test_tool_schemas.py b/tests/test_tool_schemas.py index ea846bb4..384824db 100644 --- a/tests/test_tool_schemas.py +++ b/tests/test_tool_schemas.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Verify tool schemas contain expected metadata for LLM guidance.""" import pytest diff --git a/tests/test_toolset.py b/tests/test_toolset.py index e598b5a7..3c109211 100644 --- a/tests/test_toolset.py +++ b/tests/test_toolset.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 from linux_mcp_server.toolset import get_toolset from linux_mcp_server.toolset import Toolset diff --git a/tests/tools/__init__.py b/tests/tools/__init__.py index e69de29b..454a18c6 100644 --- a/tests/tools/__init__.py +++ b/tests/tools/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/tools/storage/__init__.py b/tests/tools/storage/__init__.py index e69de29b..454a18c6 100644 --- a/tests/tools/storage/__init__.py +++ b/tests/tools/storage/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/tools/storage/conftest.py b/tests/tools/storage/conftest.py index f3d9ad82..6c36edee 100644 --- a/tests/tools/storage/conftest.py +++ b/tests/tools/storage/conftest.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import os from collections.abc import Callable diff --git a/tests/tools/storage/test_list_block_devices.py b/tests/tools/storage/test_list_block_devices.py index 656e9daa..093d8798 100644 --- a/tests/tools/storage/test_list_block_devices.py +++ b/tests/tools/storage/test_list_block_devices.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import re from unittest.mock import AsyncMock diff --git a/tests/tools/storage/test_list_directories.py b/tests/tools/storage/test_list_directories.py index dc139a53..0aaf7a4c 100644 --- a/tests/tools/storage/test_list_directories.py +++ b/tests/tools/storage/test_list_directories.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import sys import pytest diff --git a/tests/tools/storage/test_list_files.py b/tests/tools/storage/test_list_files.py index ec0fab0f..20066963 100644 --- a/tests/tools/storage/test_list_files.py +++ b/tests/tools/storage/test_list_files.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import sys import pytest diff --git a/tests/tools/storage/test_path_validation.py b/tests/tools/storage/test_path_validation.py index 4fb8966d..d2cf88bd 100644 --- a/tests/tools/storage/test_path_validation.py +++ b/tests/tools/storage/test_path_validation.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from fastmcp.exceptions import ToolError diff --git a/tests/tools/storage/test_read_file.py b/tests/tools/storage/test_read_file.py index 8659ed8d..c202a5b9 100644 --- a/tests/tools/storage/test_read_file.py +++ b/tests/tools/storage/test_read_file.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from fastmcp.exceptions import ToolError diff --git a/tests/tools/test_logs.py b/tests/tools/test_logs.py index 11516960..d7cb9c20 100644 --- a/tests/tools/test_logs.py +++ b/tests/tools/test_logs.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for log tools.""" import pytest diff --git a/tests/tools/test_network.py b/tests/tools/test_network.py index 504fe8a2..798e8573 100644 --- a/tests/tools/test_network.py +++ b/tests/tools/test_network.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for network diagnostic tools.""" import re diff --git a/tests/tools/test_processes.py b/tests/tools/test_processes.py index 23b713a1..d428912f 100644 --- a/tests/tools/test_processes.py +++ b/tests/tools/test_processes.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for process management tools.""" import os diff --git a/tests/tools/test_run_script.py b/tests/tools/test_run_script.py index 14a33a1d..d048c0ee 100644 --- a/tests/tools/test_run_script.py +++ b/tests/tools/test_run_script.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Integration-style tests for ``run_script`` MCP tools via ``mcp_client``. Patches apply to ``linux_mcp_server.tools.run_script`` (the module object). The in-process diff --git a/tests/tools/test_services.py b/tests/tools/test_services.py index f9d49710..b9548822 100644 --- a/tests/tools/test_services.py +++ b/tests/tools/test_services.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for service management tools.""" import sys diff --git a/tests/tools/test_system_info.py b/tests/tools/test_system_info.py index dcfe7865..7a8d0c7c 100644 --- a/tests/tools/test_system_info.py +++ b/tests/tools/test_system_info.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for system information tools.""" import json diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py index e69de29b..454a18c6 100644 --- a/tests/utils/__init__.py +++ b/tests/utils/__init__.py @@ -0,0 +1,2 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 diff --git a/tests/utils/test_decorators.py b/tests/utils/test_decorators.py index 22aa5ff3..fc41ff76 100644 --- a/tests/utils/test_decorators.py +++ b/tests/utils/test_decorators.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for decorator utilities.""" import pytest diff --git a/tests/utils/test_enum.py b/tests/utils/test_enum.py index eb565c12..d014a4d9 100644 --- a/tests/utils/test_enum.py +++ b/tests/utils/test_enum.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.utils.enum import StrEnum diff --git a/tests/utils/test_format.py b/tests/utils/test_format.py index 4c74a89f..d6e49216 100644 --- a/tests/utils/test_format.py +++ b/tests/utils/test_format.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 import pytest from linux_mcp_server.utils.format import format_bytes diff --git a/tests/utils/test_validation.py b/tests/utils/test_validation.py index 1a9452ee..134d0f81 100644 --- a/tests/utils/test_validation.py +++ b/tests/utils/test_validation.py @@ -1,3 +1,5 @@ +# Copyright Contributors to the linux-mcp-server project +# SPDX-License-Identifier: Apache-2.0 """Tests for input validation utilities.""" from pathlib import Path