@mokoconsulting/mcp-windows 3.0.0
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.
- package/.gitattributes +94 -0
- package/.gitmessage +9 -0
- package/.mokogitea/ISSUE_TEMPLATE/adr.md +110 -0
- package/.mokogitea/ISSUE_TEMPLATE/bug_report.md +48 -0
- package/.mokogitea/ISSUE_TEMPLATE/config.yml +18 -0
- package/.mokogitea/ISSUE_TEMPLATE/documentation.md +52 -0
- package/.mokogitea/ISSUE_TEMPLATE/feature_request.md +51 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_api_integration.md +48 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_connection_issue.md +67 -0
- package/.mokogitea/ISSUE_TEMPLATE/mcp_tool_request.md +49 -0
- package/.mokogitea/ISSUE_TEMPLATE/question.md +82 -0
- package/.mokogitea/ISSUE_TEMPLATE/rfc.md +126 -0
- package/.mokogitea/ISSUE_TEMPLATE/security.md +51 -0
- package/.mokogitea/ISSUE_TEMPLATE/version.md +24 -0
- package/.mokogitea/branch-protection.yml +251 -0
- package/.mokogitea/workflows/auto-assign.yml +76 -0
- package/.mokogitea/workflows/auto-bump.yml +66 -0
- package/.mokogitea/workflows/auto-dev-issue.yml +207 -0
- package/.mokogitea/workflows/auto-release.yml +421 -0
- package/.mokogitea/workflows/branch-cleanup.yml +48 -0
- package/.mokogitea/workflows/cascade-dev.yml +10 -0
- package/.mokogitea/workflows/changelog-validation.yml +101 -0
- package/.mokogitea/workflows/ci-generic.yml +191 -0
- package/.mokogitea/workflows/cleanup.yml +87 -0
- package/.mokogitea/workflows/codeql-analysis.yml +115 -0
- package/.mokogitea/workflows/copilot-agent.yml +44 -0
- package/.mokogitea/workflows/deploy-manual.yml +126 -0
- package/.mokogitea/workflows/enterprise-firewall-setup.yml +758 -0
- package/.mokogitea/workflows/gitleaks.yml +92 -0
- package/.mokogitea/workflows/issue-branch.yml +73 -0
- package/.mokogitea/workflows/mcp-auto-release.yml +278 -0
- package/.mokogitea/workflows/mcp-build-test.yml +65 -0
- package/.mokogitea/workflows/mcp-sdk-check.yml +109 -0
- package/.mokogitea/workflows/mcp-tool-inventory.yml +61 -0
- package/.mokogitea/workflows/notify.yml +70 -0
- package/.mokogitea/workflows/npm-publish.yml +113 -0
- package/.mokogitea/workflows/pr-check.yml +534 -0
- package/.mokogitea/workflows/pre-release.yml +252 -0
- package/.mokogitea/workflows/rc-revert.yml +66 -0
- package/.mokogitea/workflows/repo-health.yml +712 -0
- package/.mokogitea/workflows/repository-cleanup.yml +525 -0
- package/.mokogitea/workflows/security-audit.yml +82 -0
- package/.mokogitea/workflows/standards-compliance.yml +2614 -0
- package/.mokogitea/workflows/sync-version-on-merge.yml +133 -0
- package/.mokogitea/workflows/update-server.yml +312 -0
- package/.mokogitea/workflows/workflow-sync-trigger.yml +73 -0
- package/CHANGELOG.md +130 -0
- package/CLAUDE.md +49 -0
- package/CONTRIBUTING.md +161 -0
- package/ISSUES.md +601 -0
- package/Makefile +70 -0
- package/README.md +80 -0
- package/automation/ci-issue-reporter.sh +237 -0
- package/config.example.json +18 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +111 -0
- package/dist/shell.d.ts +50 -0
- package/dist/shell.js +209 -0
- package/dist/tools/apps.d.ts +3 -0
- package/dist/tools/apps.js +63 -0
- package/dist/tools/audio.d.ts +3 -0
- package/dist/tools/audio.js +142 -0
- package/dist/tools/audio_apps.d.ts +3 -0
- package/dist/tools/audio_apps.js +86 -0
- package/dist/tools/automation.d.ts +3 -0
- package/dist/tools/automation.js +261 -0
- package/dist/tools/bluetooth.d.ts +3 -0
- package/dist/tools/bluetooth.js +96 -0
- package/dist/tools/clipboard.d.ts +3 -0
- package/dist/tools/clipboard.js +118 -0
- package/dist/tools/config.d.ts +3 -0
- package/dist/tools/config.js +85 -0
- package/dist/tools/dialog.d.ts +3 -0
- package/dist/tools/dialog.js +72 -0
- package/dist/tools/display.d.ts +3 -0
- package/dist/tools/display.js +256 -0
- package/dist/tools/drives.d.ts +3 -0
- package/dist/tools/drives.js +98 -0
- package/dist/tools/environment.d.ts +3 -0
- package/dist/tools/environment.js +129 -0
- package/dist/tools/execute.d.ts +3 -0
- package/dist/tools/execute.js +28 -0
- package/dist/tools/filesystem.d.ts +3 -0
- package/dist/tools/filesystem.js +230 -0
- package/dist/tools/firewall.d.ts +3 -0
- package/dist/tools/firewall.js +108 -0
- package/dist/tools/hosts.d.ts +3 -0
- package/dist/tools/hosts.js +119 -0
- package/dist/tools/maintenance.d.ts +3 -0
- package/dist/tools/maintenance.js +236 -0
- package/dist/tools/netstat.d.ts +3 -0
- package/dist/tools/netstat.js +56 -0
- package/dist/tools/network.d.ts +3 -0
- package/dist/tools/network.js +70 -0
- package/dist/tools/notification.d.ts +3 -0
- package/dist/tools/notification.js +41 -0
- package/dist/tools/power.d.ts +3 -0
- package/dist/tools/power.js +104 -0
- package/dist/tools/printer.d.ts +3 -0
- package/dist/tools/printer.js +97 -0
- package/dist/tools/process.d.ts +3 -0
- package/dist/tools/process.js +54 -0
- package/dist/tools/process_kill.d.ts +3 -0
- package/dist/tools/process_kill.js +48 -0
- package/dist/tools/recycle_bin.d.ts +3 -0
- package/dist/tools/recycle_bin.js +108 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.js +136 -0
- package/dist/tools/scheduler.d.ts +3 -0
- package/dist/tools/scheduler.js +116 -0
- package/dist/tools/service.d.ts +3 -0
- package/dist/tools/service.js +79 -0
- package/dist/tools/startup.d.ts +3 -0
- package/dist/tools/startup.js +159 -0
- package/dist/tools/storage.d.ts +3 -0
- package/dist/tools/storage.js +129 -0
- package/dist/tools/system.d.ts +3 -0
- package/dist/tools/system.js +84 -0
- package/dist/tools/system_mgmt.d.ts +3 -0
- package/dist/tools/system_mgmt.js +174 -0
- package/dist/tools/terminal.d.ts +3 -0
- package/dist/tools/terminal.js +80 -0
- package/dist/tools/theme.d.ts +3 -0
- package/dist/tools/theme.js +165 -0
- package/dist/tools/usb.d.ts +3 -0
- package/dist/tools/usb.js +52 -0
- package/dist/tools/virtual_desktop.d.ts +3 -0
- package/dist/tools/virtual_desktop.js +112 -0
- package/dist/tools/wifi.d.ts +3 -0
- package/dist/tools/wifi.js +136 -0
- package/dist/tools/window.d.ts +3 -0
- package/dist/tools/window.js +189 -0
- package/dist/tools/winget.d.ts +3 -0
- package/dist/tools/winget.js +79 -0
- package/dist/tools/wsl.d.ts +3 -0
- package/dist/tools/wsl.js +99 -0
- package/docs/API.md +63 -0
- package/docs/ARCHITECTURE.md +73 -0
- package/docs/INSTALLATION.md +102 -0
- package/docs/index.md +12 -0
- package/package.json +35 -0
- package/scripts/setup.mjs +123 -0
- package/src/index.ts +125 -0
- package/src/shell.ts +253 -0
- package/src/tools/apps.ts +76 -0
- package/src/tools/audio.ts +161 -0
- package/src/tools/audio_apps.ts +98 -0
- package/src/tools/automation.ts +297 -0
- package/src/tools/bluetooth.ts +114 -0
- package/src/tools/clipboard.ts +138 -0
- package/src/tools/config.ts +105 -0
- package/src/tools/dialog.ts +87 -0
- package/src/tools/display.ts +285 -0
- package/src/tools/drives.ts +124 -0
- package/src/tools/environment.ts +146 -0
- package/src/tools/execute.ts +35 -0
- package/src/tools/filesystem.ts +273 -0
- package/src/tools/firewall.ts +125 -0
- package/src/tools/hosts.ts +135 -0
- package/src/tools/maintenance.ts +299 -0
- package/src/tools/netstat.ts +72 -0
- package/src/tools/network.ts +84 -0
- package/src/tools/notification.ts +50 -0
- package/src/tools/power.ts +123 -0
- package/src/tools/printer.ts +114 -0
- package/src/tools/process.ts +80 -0
- package/src/tools/process_kill.ts +57 -0
- package/src/tools/recycle_bin.ts +126 -0
- package/src/tools/registry.ts +165 -0
- package/src/tools/scheduler.ts +140 -0
- package/src/tools/service.ts +102 -0
- package/src/tools/startup.ts +180 -0
- package/src/tools/storage.ts +141 -0
- package/src/tools/system.ts +99 -0
- package/src/tools/system_mgmt.ts +190 -0
- package/src/tools/terminal.ts +117 -0
- package/src/tools/theme.ts +205 -0
- package/src/tools/usb.ts +65 -0
- package/src/tools/virtual_desktop.ts +122 -0
- package/src/tools/wifi.ts +157 -0
- package/src/tools/window.ts +211 -0
- package/src/tools/winget.ts +100 -0
- package/src/tools/wsl.ts +112 -0
- package/tsconfig.json +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Template-MCP
|
|
2
|
+
|
|
3
|
+
   
|
|
4
|
+
|
|
5
|
+
Template repository for creating MokoCLI-compliant Model Context Protocol (MCP) API servers. Provides the scaffolding, configuration patterns, and architecture conventions used by all Moko Consulting MCP servers, enabling AI assistants like Claude to interact with REST APIs through a standardized tool interface.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **MCP server scaffolding** -- pre-configured TypeScript project structure with entry point, tool registration, and stdio transport ready to go
|
|
10
|
+
- **Multi-connection support** -- built-in `config.json` pattern for managing multiple named API connections with a default fallback; all tools accept an optional `connection` parameter
|
|
11
|
+
- **REST API bridge architecture** -- standardized pattern for bridging any REST API as MCP tools, with typed request/response handling
|
|
12
|
+
- **TypeScript-first** -- full TypeScript setup with `tsconfig.json`, strict mode, and ES module output
|
|
13
|
+
- **Build tooling** -- Makefile with `build`, `dev`, `clean`, and `lint` targets; npm scripts for compilation and development
|
|
14
|
+
- **MokoCLI compliant** -- follows all Moko Consulting governance conventions: file headers, commit messages, `.gitattributes`, `.gitmessage`, PR/issue templates
|
|
15
|
+
- **Example configuration** -- `config.example.json` demonstrates the connection configuration schema
|
|
16
|
+
- **Documentation templates** -- wiki pages for API reference, architecture overview, and installation pre-generated
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
1. Create a new repository from this template (or clone directly):
|
|
21
|
+
```bash
|
|
22
|
+
git clone https://git.mokoconsulting.tech/MokoConsulting/Template-MCP.git my-mcp-server
|
|
23
|
+
cd my-mcp-server
|
|
24
|
+
```
|
|
25
|
+
2. Install dependencies:
|
|
26
|
+
```bash
|
|
27
|
+
npm install
|
|
28
|
+
```
|
|
29
|
+
3. Copy and configure the connection file:
|
|
30
|
+
```bash
|
|
31
|
+
cp config.example.json config.json
|
|
32
|
+
# Edit config.json with your API credentials
|
|
33
|
+
```
|
|
34
|
+
4. Build the project:
|
|
35
|
+
```bash
|
|
36
|
+
npm run build
|
|
37
|
+
```
|
|
38
|
+
5. Run the server:
|
|
39
|
+
```bash
|
|
40
|
+
node build/index.js
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Configuration
|
|
44
|
+
|
|
45
|
+
| Path | Purpose |
|
|
46
|
+
|---|---|
|
|
47
|
+
| `src/` | TypeScript source files (server entry, tool definitions, API client) |
|
|
48
|
+
| `config.example.json` | Example multi-connection configuration schema |
|
|
49
|
+
| `config.json` | Local connection configuration (gitignored) |
|
|
50
|
+
| `package.json` | npm dependencies and scripts |
|
|
51
|
+
| `tsconfig.json` | TypeScript compiler configuration |
|
|
52
|
+
| `scripts/` | Build and development utility scripts |
|
|
53
|
+
| `docs/` | Developer documentation |
|
|
54
|
+
| `Makefile` | Build, dev, clean, and lint targets |
|
|
55
|
+
|
|
56
|
+
## Requirements
|
|
57
|
+
|
|
58
|
+
- Node.js 20.0.0 or later
|
|
59
|
+
- npm 9+
|
|
60
|
+
- TypeScript 5+ (installed via npm)
|
|
61
|
+
|
|
62
|
+
## Documentation
|
|
63
|
+
|
|
64
|
+
Full documentation is available on the [Wiki](https://git.mokoconsulting.tech/MokoConsulting/Template-MCP/wiki), including:
|
|
65
|
+
|
|
66
|
+
- [API](https://git.mokoconsulting.tech/MokoConsulting/Template-MCP/wiki/API) -- tool reference and connection parameter documentation
|
|
67
|
+
- [ARCHITECTURE](https://git.mokoconsulting.tech/MokoConsulting/Template-MCP/wiki/ARCHITECTURE) -- MCP server design and REST API bridge pattern
|
|
68
|
+
- [INSTALLATION](https://git.mokoconsulting.tech/MokoConsulting/Template-MCP/wiki/INSTALLATION) -- setup prerequisites and configuration guide
|
|
69
|
+
|
|
70
|
+
## Contributing
|
|
71
|
+
|
|
72
|
+
See the wiki for development guidelines and contribution instructions.
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
This project is licensed under the GNU General Public License v3.0 or later -- see the [LICENSE](LICENSE) file.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
*[Moko Consulting](https://mokoconsulting.tech) -- [MokoCLI](https://git.mokoconsulting.tech/MokoConsulting/mokocli)*
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ============================================================================
|
|
3
|
+
# Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
4
|
+
#
|
|
5
|
+
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
6
|
+
#
|
|
7
|
+
# FILE INFORMATION
|
|
8
|
+
# DEFGROUP: Automation.CI
|
|
9
|
+
# INGROUP: moko-platform.Automation
|
|
10
|
+
# REPO: https://git.mokoconsulting.tech/MokoConsulting/moko-platform
|
|
11
|
+
# PATH: /automation/ci-issue-reporter.sh
|
|
12
|
+
# VERSION: 09.23.00
|
|
13
|
+
# BRIEF: Creates or updates a Gitea issue when a CI gate fails.
|
|
14
|
+
# Deduplicates by searching open issues with the "ci-auto" label
|
|
15
|
+
# whose title matches the gate. If a matching issue exists, a comment
|
|
16
|
+
# is appended instead of opening a duplicate.
|
|
17
|
+
# ============================================================================
|
|
18
|
+
|
|
19
|
+
set -euo pipefail
|
|
20
|
+
|
|
21
|
+
# ── Defaults ────────────────────────────────────────────────────────────────
|
|
22
|
+
GITEA_URL="${GITEA_URL:-https://git.mokoconsulting.tech}"
|
|
23
|
+
GITEA_TOKEN="${GITEA_TOKEN:-}"
|
|
24
|
+
REPO="${GITHUB_REPOSITORY:-}"
|
|
25
|
+
RUN_URL="${GITHUB_SERVER_URL:-${GITEA_URL}}/${REPO}/actions/runs/${GITHUB_RUN_ID:-0}"
|
|
26
|
+
LABEL_NAME="ci-auto"
|
|
27
|
+
LABEL_COLOR="#e11d48"
|
|
28
|
+
|
|
29
|
+
GATE=""
|
|
30
|
+
DETAILS=""
|
|
31
|
+
SEVERITY="error"
|
|
32
|
+
WORKFLOW=""
|
|
33
|
+
|
|
34
|
+
# ── Parse arguments ─────────────────────────────────────────────────────────
|
|
35
|
+
usage() {
|
|
36
|
+
cat <<EOF
|
|
37
|
+
Usage: ci-issue-reporter.sh --gate NAME --details TEXT [OPTIONS]
|
|
38
|
+
|
|
39
|
+
Required:
|
|
40
|
+
--gate CI gate name (e.g. "Code Quality", "Self-Health")
|
|
41
|
+
--details Human-readable failure description
|
|
42
|
+
|
|
43
|
+
Optional:
|
|
44
|
+
--severity "error" (default) or "warning"
|
|
45
|
+
--workflow Workflow name for the issue title
|
|
46
|
+
--repo owner/repo (default: \$GITHUB_REPOSITORY)
|
|
47
|
+
--run-url URL to the CI run (auto-detected from env)
|
|
48
|
+
--token Gitea API token (default: \$GITEA_TOKEN)
|
|
49
|
+
--url Gitea base URL (default: \$GITEA_URL)
|
|
50
|
+
EOF
|
|
51
|
+
exit 1
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
while [[ $# -gt 0 ]]; do
|
|
55
|
+
case "$1" in
|
|
56
|
+
--gate) GATE="$2"; shift 2 ;;
|
|
57
|
+
--details) DETAILS="$2"; shift 2 ;;
|
|
58
|
+
--severity) SEVERITY="$2"; shift 2 ;;
|
|
59
|
+
--workflow) WORKFLOW="$2"; shift 2 ;;
|
|
60
|
+
--repo) REPO="$2"; shift 2 ;;
|
|
61
|
+
--run-url) RUN_URL="$2"; shift 2 ;;
|
|
62
|
+
--token) GITEA_TOKEN="$2"; shift 2 ;;
|
|
63
|
+
--url) GITEA_URL="$2"; shift 2 ;;
|
|
64
|
+
-h|--help) usage ;;
|
|
65
|
+
*) echo "Unknown option: $1"; usage ;;
|
|
66
|
+
esac
|
|
67
|
+
done
|
|
68
|
+
|
|
69
|
+
[[ -z "$GATE" ]] && { echo "ERROR: --gate is required"; usage; }
|
|
70
|
+
[[ -z "$DETAILS" ]] && { echo "ERROR: --details is required"; usage; }
|
|
71
|
+
[[ -z "$GITEA_TOKEN" ]] && { echo "ERROR: GITEA_TOKEN not set"; exit 1; }
|
|
72
|
+
[[ -z "$REPO" ]] && { echo "ERROR: GITHUB_REPOSITORY not set"; exit 1; }
|
|
73
|
+
|
|
74
|
+
API="${GITEA_URL}/api/v1/repos/${REPO}"
|
|
75
|
+
|
|
76
|
+
# ── Build title ─────────────────────────────────────────────────────────────
|
|
77
|
+
if [[ -n "$WORKFLOW" ]]; then
|
|
78
|
+
TITLE="[CI] ${WORKFLOW}: ${GATE} failed"
|
|
79
|
+
else
|
|
80
|
+
TITLE="[CI] ${GATE} failed"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# ── Ensure label exists ─────────────────────────────────────────────────────
|
|
84
|
+
ensure_label() {
|
|
85
|
+
local exists
|
|
86
|
+
exists=$(curl -sf -o /dev/null -w '%{http_code}' \
|
|
87
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
88
|
+
"${API}/labels" 2>/dev/null || echo "000")
|
|
89
|
+
|
|
90
|
+
if [[ "$exists" == "200" ]]; then
|
|
91
|
+
# Check if label already exists
|
|
92
|
+
local found
|
|
93
|
+
found=$(curl -sf \
|
|
94
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
95
|
+
"${API}/labels" 2>/dev/null \
|
|
96
|
+
| grep -o "\"name\":\"${LABEL_NAME}\"" || true)
|
|
97
|
+
|
|
98
|
+
if [[ -z "$found" ]]; then
|
|
99
|
+
curl -sf -X POST \
|
|
100
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
101
|
+
-H "Content-Type: application/json" \
|
|
102
|
+
"${API}/labels" \
|
|
103
|
+
-d "{\"name\":\"${LABEL_NAME}\",\"color\":\"${LABEL_COLOR}\",\"description\":\"Auto-created by CI issue reporter\"}" \
|
|
104
|
+
> /dev/null 2>&1 || true
|
|
105
|
+
fi
|
|
106
|
+
fi
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
# ── Search for existing open issue ──────────────────────────────────────────
|
|
110
|
+
find_existing_issue() {
|
|
111
|
+
# URL-encode the gate name for the query
|
|
112
|
+
local query
|
|
113
|
+
query=$(printf '%s' "[CI] ${GATE}" | sed 's/ /%20/g; s/\[/%5B/g; s/\]/%5D/g')
|
|
114
|
+
|
|
115
|
+
local response
|
|
116
|
+
response=$(curl -sf \
|
|
117
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
118
|
+
"${API}/issues?type=issues&state=open&labels=${LABEL_NAME}&q=${query}&limit=5" \
|
|
119
|
+
2>/dev/null || echo "[]")
|
|
120
|
+
|
|
121
|
+
# Extract the first matching issue number
|
|
122
|
+
echo "$response" \
|
|
123
|
+
| grep -oP '"number":\s*\K[0-9]+' \
|
|
124
|
+
| head -1
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# ── Build issue body ────────────────────────────────────────────────────────
|
|
128
|
+
build_body() {
|
|
129
|
+
local severity_badge
|
|
130
|
+
if [[ "$SEVERITY" == "error" ]]; then
|
|
131
|
+
severity_badge="**Severity:** Error"
|
|
132
|
+
else
|
|
133
|
+
severity_badge="**Severity:** Warning"
|
|
134
|
+
fi
|
|
135
|
+
|
|
136
|
+
cat <<BODY
|
|
137
|
+
## CI Gate Failure: ${GATE}
|
|
138
|
+
|
|
139
|
+
${severity_badge}
|
|
140
|
+
**Workflow:** ${WORKFLOW:-unknown}
|
|
141
|
+
**Branch:** ${GITHUB_REF_NAME:-unknown}
|
|
142
|
+
**Commit:** \`${GITHUB_SHA:0:8}\`
|
|
143
|
+
**Run:** [View CI run](${RUN_URL})
|
|
144
|
+
|
|
145
|
+
### Details
|
|
146
|
+
|
|
147
|
+
${DETAILS}
|
|
148
|
+
|
|
149
|
+
### Resolution
|
|
150
|
+
|
|
151
|
+
Fix the issue described above and push a new commit. This issue will be closed automatically when the gate passes, or can be closed manually.
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
*Auto-created by [ci-issue-reporter](${GITEA_URL}/${REPO}/src/branch/main/automation/ci-issue-reporter.sh)*
|
|
155
|
+
BODY
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# ── Build comment body (for existing issues) ────────────────────────────────
|
|
159
|
+
build_comment() {
|
|
160
|
+
cat <<COMMENT
|
|
161
|
+
### CI failure recurrence
|
|
162
|
+
|
|
163
|
+
**Branch:** ${GITHUB_REF_NAME:-unknown}
|
|
164
|
+
**Commit:** \`${GITHUB_SHA:0:8}\`
|
|
165
|
+
**Run:** [View CI run](${RUN_URL})
|
|
166
|
+
|
|
167
|
+
${DETAILS}
|
|
168
|
+
COMMENT
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
# ── Main ────────────────────────────────────────────────────────────────────
|
|
172
|
+
ensure_label
|
|
173
|
+
|
|
174
|
+
EXISTING=$(find_existing_issue)
|
|
175
|
+
|
|
176
|
+
if [[ -n "$EXISTING" ]]; then
|
|
177
|
+
# Append comment to existing issue
|
|
178
|
+
COMMENT_BODY=$(build_comment)
|
|
179
|
+
COMMENT_JSON=$(printf '%s' "$COMMENT_BODY" | python3 -c "
|
|
180
|
+
import sys, json
|
|
181
|
+
print(json.dumps({'body': sys.stdin.read()}))" 2>/dev/null)
|
|
182
|
+
|
|
183
|
+
HTTP=$(curl -sf -o /dev/null -w '%{http_code}' -X POST \
|
|
184
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
185
|
+
-H "Content-Type: application/json" \
|
|
186
|
+
"${API}/issues/${EXISTING}/comments" \
|
|
187
|
+
-d "${COMMENT_JSON}" 2>/dev/null || echo "000")
|
|
188
|
+
|
|
189
|
+
if [[ "$HTTP" == "201" ]]; then
|
|
190
|
+
echo "Commented on existing issue #${EXISTING}"
|
|
191
|
+
else
|
|
192
|
+
echo "WARNING: Failed to comment on issue #${EXISTING} (HTTP ${HTTP})"
|
|
193
|
+
fi
|
|
194
|
+
else
|
|
195
|
+
# Create new issue
|
|
196
|
+
ISSUE_BODY=$(build_body)
|
|
197
|
+
ISSUE_JSON=$(python3 -c "
|
|
198
|
+
import sys, json
|
|
199
|
+
body = sys.stdin.read()
|
|
200
|
+
print(json.dumps({
|
|
201
|
+
'title': sys.argv[1],
|
|
202
|
+
'body': body,
|
|
203
|
+
'labels': []
|
|
204
|
+
}))" "$TITLE" <<< "$ISSUE_BODY" 2>/dev/null)
|
|
205
|
+
|
|
206
|
+
# Create the issue
|
|
207
|
+
RESPONSE=$(curl -sf -X POST \
|
|
208
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
209
|
+
-H "Content-Type: application/json" \
|
|
210
|
+
"${API}/issues" \
|
|
211
|
+
-d "${ISSUE_JSON}" 2>/dev/null || echo "{}")
|
|
212
|
+
|
|
213
|
+
ISSUE_NUM=$(echo "$RESPONSE" | grep -oP '"number":\s*\K[0-9]+' | head -1)
|
|
214
|
+
|
|
215
|
+
if [[ -n "$ISSUE_NUM" ]]; then
|
|
216
|
+
# Apply label (separate call — more reliable across Gitea versions)
|
|
217
|
+
LABEL_ID=$(curl -sf \
|
|
218
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
219
|
+
"${API}/labels" 2>/dev/null \
|
|
220
|
+
| grep -oP "\"id\":\s*\K[0-9]+(?=[^}]*\"name\":\s*\"${LABEL_NAME}\")" \
|
|
221
|
+
| head -1 || true)
|
|
222
|
+
|
|
223
|
+
if [[ -n "$LABEL_ID" ]]; then
|
|
224
|
+
curl -sf -X POST \
|
|
225
|
+
-H "Authorization: token ${GITEA_TOKEN}" \
|
|
226
|
+
-H "Content-Type: application/json" \
|
|
227
|
+
"${API}/issues/${ISSUE_NUM}/labels" \
|
|
228
|
+
-d "{\"labels\":[${LABEL_ID}]}" \
|
|
229
|
+
> /dev/null 2>&1 || true
|
|
230
|
+
fi
|
|
231
|
+
|
|
232
|
+
echo "Created issue #${ISSUE_NUM}: ${TITLE}"
|
|
233
|
+
else
|
|
234
|
+
echo "WARNING: Failed to create issue"
|
|
235
|
+
echo "Response: ${RESPONSE}"
|
|
236
|
+
fi
|
|
237
|
+
fi
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"defaultConnection": "production",
|
|
3
|
+
"connections": {
|
|
4
|
+
"local-dev": {
|
|
5
|
+
"baseUrl": "https://localhost:8080",
|
|
6
|
+
"apiKey": "your-api-key-here",
|
|
7
|
+
"insecure": true
|
|
8
|
+
},
|
|
9
|
+
"production": {
|
|
10
|
+
"baseUrl": "https://api.example.com",
|
|
11
|
+
"apiKey": "your-production-api-key"
|
|
12
|
+
},
|
|
13
|
+
"staging": {
|
|
14
|
+
"baseUrl": "https://api-staging.example.com",
|
|
15
|
+
"apiKey": "your-staging-api-key"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* Copyright (C) 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
3
|
+
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
4
|
+
*
|
|
5
|
+
* mcp_windows — MCP server for Windows desktop system operations
|
|
6
|
+
*/
|
|
7
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
8
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
9
|
+
import { registerExecuteTools } from './tools/execute.js';
|
|
10
|
+
import { registerProcessTools } from './tools/process.js';
|
|
11
|
+
import { registerAudioTools } from './tools/audio.js';
|
|
12
|
+
import { registerSystemTools } from './tools/system.js';
|
|
13
|
+
import { registerTerminalTools } from './tools/terminal.js';
|
|
14
|
+
import { registerFilesystemTools } from './tools/filesystem.js';
|
|
15
|
+
import { registerProcessKillTools } from './tools/process_kill.js';
|
|
16
|
+
import { registerServiceTools } from './tools/service.js';
|
|
17
|
+
import { registerAudioAppTools } from './tools/audio_apps.js';
|
|
18
|
+
import { registerPowerTools } from './tools/power.js';
|
|
19
|
+
import { registerNetworkTools } from './tools/network.js';
|
|
20
|
+
import { registerDriveTools } from './tools/drives.js';
|
|
21
|
+
import { registerDisplayTools } from './tools/display.js';
|
|
22
|
+
import { registerWindowTools } from './tools/window.js';
|
|
23
|
+
import { registerClipboardTools } from './tools/clipboard.js';
|
|
24
|
+
import { registerNotificationTools } from './tools/notification.js';
|
|
25
|
+
import { registerSchedulerTools } from './tools/scheduler.js';
|
|
26
|
+
import { registerRegistryTools } from './tools/registry.js';
|
|
27
|
+
import { registerEnvironmentTools } from './tools/environment.js';
|
|
28
|
+
import { registerStartupTools } from './tools/startup.js';
|
|
29
|
+
import { registerConfigTools } from './tools/config.js';
|
|
30
|
+
import { registerAppsTools } from './tools/apps.js';
|
|
31
|
+
import { registerDialogTools } from './tools/dialog.js';
|
|
32
|
+
import { registerNetstatTools } from './tools/netstat.js';
|
|
33
|
+
import { registerRecycleBinTools } from './tools/recycle_bin.js';
|
|
34
|
+
import { registerBluetoothTools } from './tools/bluetooth.js';
|
|
35
|
+
import { registerWifiTools } from './tools/wifi.js';
|
|
36
|
+
import { registerUsbTools } from './tools/usb.js';
|
|
37
|
+
import { registerPrinterTools } from './tools/printer.js';
|
|
38
|
+
import { registerHostsTools } from './tools/hosts.js';
|
|
39
|
+
import { registerThemeTools } from './tools/theme.js';
|
|
40
|
+
import { registerVirtualDesktopTools } from './tools/virtual_desktop.js';
|
|
41
|
+
import { registerFirewallTools } from './tools/firewall.js';
|
|
42
|
+
import { registerMaintenanceTools } from './tools/maintenance.js';
|
|
43
|
+
import { registerWslTools } from './tools/wsl.js';
|
|
44
|
+
import { registerWingetTools } from './tools/winget.js';
|
|
45
|
+
import { registerStorageTools } from './tools/storage.js';
|
|
46
|
+
import { registerSystemMgmtTools } from './tools/system_mgmt.js';
|
|
47
|
+
import { registerAutomationTools } from './tools/automation.js';
|
|
48
|
+
const server = new McpServer({
|
|
49
|
+
name: 'mcp_windows',
|
|
50
|
+
version: '3.0.0',
|
|
51
|
+
});
|
|
52
|
+
// v1.0 — Core
|
|
53
|
+
registerExecuteTools(server);
|
|
54
|
+
registerProcessTools(server);
|
|
55
|
+
registerAudioTools(server);
|
|
56
|
+
registerSystemTools(server);
|
|
57
|
+
registerTerminalTools(server);
|
|
58
|
+
registerFilesystemTools(server);
|
|
59
|
+
// v1.1 — System Control
|
|
60
|
+
registerProcessKillTools(server);
|
|
61
|
+
registerServiceTools(server);
|
|
62
|
+
registerAudioAppTools(server);
|
|
63
|
+
registerPowerTools(server);
|
|
64
|
+
registerNetworkTools(server);
|
|
65
|
+
registerDriveTools(server);
|
|
66
|
+
// v1.2 — Desktop Automation
|
|
67
|
+
registerDisplayTools(server);
|
|
68
|
+
registerWindowTools(server);
|
|
69
|
+
registerClipboardTools(server);
|
|
70
|
+
registerNotificationTools(server);
|
|
71
|
+
// v1.3 — Admin Tools
|
|
72
|
+
registerSchedulerTools(server);
|
|
73
|
+
registerRegistryTools(server);
|
|
74
|
+
registerEnvironmentTools(server);
|
|
75
|
+
registerStartupTools(server);
|
|
76
|
+
registerConfigTools(server);
|
|
77
|
+
// v1.4 — Advanced
|
|
78
|
+
registerAppsTools(server);
|
|
79
|
+
registerDialogTools(server);
|
|
80
|
+
registerNetstatTools(server);
|
|
81
|
+
registerRecycleBinTools(server);
|
|
82
|
+
// v2.0 — Connectivity & Hardware
|
|
83
|
+
registerBluetoothTools(server);
|
|
84
|
+
registerWifiTools(server);
|
|
85
|
+
registerUsbTools(server);
|
|
86
|
+
registerPrinterTools(server);
|
|
87
|
+
registerHostsTools(server);
|
|
88
|
+
// v2.1 — Appearance & Desktop
|
|
89
|
+
registerThemeTools(server);
|
|
90
|
+
registerVirtualDesktopTools(server);
|
|
91
|
+
// v2.2 — Security & Maintenance
|
|
92
|
+
registerFirewallTools(server);
|
|
93
|
+
registerMaintenanceTools(server);
|
|
94
|
+
// v3.0 — WSL & Package Management
|
|
95
|
+
registerWslTools(server);
|
|
96
|
+
registerWingetTools(server);
|
|
97
|
+
// v3.1 — Storage & System Management
|
|
98
|
+
registerStorageTools(server);
|
|
99
|
+
registerSystemMgmtTools(server);
|
|
100
|
+
// v3.2 — Automation & Advanced
|
|
101
|
+
registerAutomationTools(server);
|
|
102
|
+
async function main() {
|
|
103
|
+
const transport = new StdioServerTransport();
|
|
104
|
+
await server.connect(transport);
|
|
105
|
+
process.stderr.write('mcp_windows: server started\n');
|
|
106
|
+
}
|
|
107
|
+
main().catch((err) => {
|
|
108
|
+
process.stderr.write(`mcp_windows: fatal error: ${err}\n`);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
package/dist/shell.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ChildProcess } from 'node:child_process';
|
|
3
|
+
export interface ShellResult {
|
|
4
|
+
stdout: string;
|
|
5
|
+
stderr: string;
|
|
6
|
+
exitCode: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Run a PowerShell command and return stdout/stderr/exitCode.
|
|
10
|
+
* Commands are wrapped with -NoProfile -NonInteractive for speed and safety.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runPowerShell(command: string, options?: {
|
|
13
|
+
timeout?: number;
|
|
14
|
+
cwd?: string;
|
|
15
|
+
}): Promise<ShellResult>;
|
|
16
|
+
/**
|
|
17
|
+
* Run a PowerShell command that returns JSON. Wraps output with ConvertTo-Json
|
|
18
|
+
* and parses the result.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runPowerShellJson<T = unknown>(command: string, options?: {
|
|
21
|
+
timeout?: number;
|
|
22
|
+
cwd?: string;
|
|
23
|
+
}): Promise<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Run a generic shell command (cmd, bash, pwsh).
|
|
26
|
+
*/
|
|
27
|
+
export declare function runShell(command: string, options?: {
|
|
28
|
+
shell?: 'pwsh' | 'cmd' | 'bash';
|
|
29
|
+
timeout?: number;
|
|
30
|
+
cwd?: string;
|
|
31
|
+
}): Promise<ShellResult>;
|
|
32
|
+
export interface TerminalSession {
|
|
33
|
+
pid: number;
|
|
34
|
+
shell: string;
|
|
35
|
+
process: ChildProcess;
|
|
36
|
+
output: string[];
|
|
37
|
+
startedAt: Date;
|
|
38
|
+
}
|
|
39
|
+
export declare function startSession(shell?: 'pwsh' | 'cmd' | 'bash' | 'python' | 'node' | 'wsl'): TerminalSession;
|
|
40
|
+
export declare function sendToSession(pid: number, input: string): void;
|
|
41
|
+
export declare function readSessionOutput(pid: number, offset?: number, length?: number): string[];
|
|
42
|
+
export declare function listSessions(): Array<{
|
|
43
|
+
pid: number;
|
|
44
|
+
shell: string;
|
|
45
|
+
running: boolean;
|
|
46
|
+
lines: number;
|
|
47
|
+
startedAt: string;
|
|
48
|
+
}>;
|
|
49
|
+
export declare function terminateSession(pid: number): boolean;
|
|
50
|
+
//# sourceMappingURL=shell.d.ts.map
|