workspaces-euc-mcp-server 0.1.1__tar.gz → 0.1.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.
- workspaces_euc_mcp_server-0.1.2/.dockerignore +32 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/ci.yml +7 -0
- workspaces_euc_mcp_server-0.1.2/.github/workflows/docker-publish.yml +40 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/CHANGELOG.md +11 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/DESIGN.md +8 -2
- workspaces_euc_mcp_server-0.1.2/Dockerfile +19 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/PKG-INFO +18 -3
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/README.md +17 -2
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/pyproject.toml +1 -1
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/__init__.py +1 -1
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/publish.yml +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.gitignore +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.pre-commit-config.yaml +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/LICENSE +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/README.md +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier0-diagnostics.json +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier1-cost.json +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier2-lifecycle.json +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier3-destructive.json +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/scripts/smoke_readonly.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/__init__.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_clients.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_cost.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_destructive.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_diagnostics.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_inventory.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_lifecycle.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_naming.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_no_embedded_secrets.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_performance.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_pricing.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_reporting.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_secure_browser.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/clients.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/consts.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/models.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/server.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/__init__.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/_common.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/cost.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/destructive.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/diagnostics.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/inventory.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/lifecycle.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/performance.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/pricing.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/reporting.py +0 -0
- {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/secure_browser.py +0 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Keep the build context small and free of local/secret artifacts.
|
|
2
|
+
.git
|
|
3
|
+
.github
|
|
4
|
+
.venv
|
|
5
|
+
venv
|
|
6
|
+
env
|
|
7
|
+
dist
|
|
8
|
+
build
|
|
9
|
+
*.egg-info
|
|
10
|
+
tests
|
|
11
|
+
scripts
|
|
12
|
+
iam
|
|
13
|
+
docs
|
|
14
|
+
|
|
15
|
+
# Markdown (except the README, which pyproject references)
|
|
16
|
+
*.md
|
|
17
|
+
!README.md
|
|
18
|
+
|
|
19
|
+
# Never ship local credentials / tenant data
|
|
20
|
+
.aws
|
|
21
|
+
*.pem
|
|
22
|
+
.env
|
|
23
|
+
*-perf.html
|
|
24
|
+
ws-*.html
|
|
25
|
+
|
|
26
|
+
# Caches
|
|
27
|
+
__pycache__
|
|
28
|
+
*.py[cod]
|
|
29
|
+
.pytest_cache
|
|
30
|
+
.ruff_cache
|
|
31
|
+
.pyright
|
|
32
|
+
.mypy_cache
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/ci.yml
RENAMED
|
@@ -32,3 +32,10 @@ jobs:
|
|
|
32
32
|
run: . .venv/bin/activate && bandit -c pyproject.toml -r workspaces_euc_mcp_server
|
|
33
33
|
- name: Test (includes no-embedded-secrets guardrail)
|
|
34
34
|
run: . .venv/bin/activate && pytest -q
|
|
35
|
+
|
|
36
|
+
docker-build:
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
steps:
|
|
39
|
+
- uses: actions/checkout@v4
|
|
40
|
+
- name: Build image (validation only, no push)
|
|
41
|
+
run: docker build -t workspaces-euc-mcp-server:ci .
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
name: Publish Docker image
|
|
2
|
+
|
|
3
|
+
# Builds and pushes a container image to GitHub Container Registry (GHCR) on each release.
|
|
4
|
+
# Uses the built-in GITHUB_TOKEN (no extra secrets). Image: ghcr.io/<owner>/<repo>.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
release:
|
|
8
|
+
types: [published]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
docker:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
permissions:
|
|
15
|
+
contents: read
|
|
16
|
+
packages: write
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
- uses: docker/setup-buildx-action@v3
|
|
20
|
+
- name: Log in to GHCR
|
|
21
|
+
uses: docker/login-action@v3
|
|
22
|
+
with:
|
|
23
|
+
registry: ghcr.io
|
|
24
|
+
username: ${{ github.actor }}
|
|
25
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
26
|
+
- name: Image metadata (tags + labels)
|
|
27
|
+
id: meta
|
|
28
|
+
uses: docker/metadata-action@v5
|
|
29
|
+
with:
|
|
30
|
+
images: ghcr.io/${{ github.repository }}
|
|
31
|
+
tags: |
|
|
32
|
+
type=semver,pattern={{version}}
|
|
33
|
+
type=raw,value=latest
|
|
34
|
+
- name: Build and push
|
|
35
|
+
uses: docker/build-push-action@v6
|
|
36
|
+
with:
|
|
37
|
+
context: .
|
|
38
|
+
push: true
|
|
39
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
40
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
@@ -5,6 +5,17 @@ All notable changes to this project are documented here. The format is based on
|
|
|
5
5
|
|
|
6
6
|
## [Unreleased]
|
|
7
7
|
|
|
8
|
+
## [0.1.2] - 2026-06-01
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Docker support: a `Dockerfile` (slim, non-root) and a GHCR publish workflow
|
|
12
|
+
(`ghcr.io/bengroeneveldsg/aws-workspaces-euc-mcp`, pushed on release). CI validates the image
|
|
13
|
+
builds. Matches the awslabs MCP distribution pattern (PyPI/uvx + container).
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Corrected a stale distribution note in `DESIGN.md` that referenced an unused `awslabs.`
|
|
17
|
+
namespace; documented the actual channels (PyPI via OIDC trusted publishing + GHCR).
|
|
18
|
+
|
|
8
19
|
## [0.1.1] - 2026-06-01
|
|
9
20
|
|
|
10
21
|
Best-practice alignment pass (audited against the awslabs MCP design guidelines and the MCP
|
|
@@ -47,8 +47,14 @@
|
|
|
47
47
|
factory designed to add cross-account `sts:AssumeRole` later without touching tool code.
|
|
48
48
|
- **Transport:** local `uvx`/stdio first; tool logic kept transport-agnostic so a remote
|
|
49
49
|
(AgentCore Runtime) deployment can be added later.
|
|
50
|
-
- **Distribution:** `
|
|
51
|
-
-
|
|
50
|
+
- **Distribution (shipped):** published to PyPI as `workspaces-euc-mcp-server` (run via
|
|
51
|
+
`uvx workspaces-euc-mcp-server@latest` or `pip`), and a container image on GHCR
|
|
52
|
+
(`ghcr.io/bengroeneveldsg/aws-workspaces-euc-mcp`). Independent — not under the `awslabs.`
|
|
53
|
+
namespace. Both publish from GitHub Releases via OIDC trusted publishing (PyPI) and `GITHUB_TOKEN`
|
|
54
|
+
(GHCR).
|
|
55
|
+
- **Observability:** Loguru with env-controlled log level (`FASTMCP_LOG_LEVEL`). Per-signal errors
|
|
56
|
+
are returned in the structured result payload (deliberate: each tool makes many AWS calls and
|
|
57
|
+
synthesizes one result), rather than `ctx.error`.
|
|
52
58
|
- **Repo layout:**
|
|
53
59
|
```
|
|
54
60
|
awslabs/workspaces_euc_mcp_server/
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Build a wheel, then install it into a slim, non-root runtime image.
|
|
2
|
+
FROM python:3.12-slim AS build
|
|
3
|
+
WORKDIR /src
|
|
4
|
+
COPY pyproject.toml README.md LICENSE ./
|
|
5
|
+
COPY workspaces_euc_mcp_server ./workspaces_euc_mcp_server
|
|
6
|
+
RUN pip install --no-cache-dir build && python -m build --wheel --outdir /dist
|
|
7
|
+
|
|
8
|
+
FROM python:3.12-slim
|
|
9
|
+
LABEL org.opencontainers.image.source="https://github.com/bengroeneveldsg/aws-workspaces-euc-mcp"
|
|
10
|
+
LABEL org.opencontainers.image.description="Admin MCP server for the Amazon WorkSpaces EUC portfolio"
|
|
11
|
+
LABEL org.opencontainers.image.licenses="Apache-2.0"
|
|
12
|
+
|
|
13
|
+
RUN useradd --create-home --uid 1000 mcp
|
|
14
|
+
COPY --from=build /dist/*.whl /tmp/
|
|
15
|
+
RUN pip install --no-cache-dir /tmp/*.whl && rm -f /tmp/*.whl
|
|
16
|
+
|
|
17
|
+
USER mcp
|
|
18
|
+
# The server speaks MCP over stdio; run with `docker run -i`.
|
|
19
|
+
ENTRYPOINT ["workspaces-euc-mcp-server"]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: workspaces-euc-mcp-server
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: MCP server for administering the Amazon WorkSpaces family of End User Computing services (Personal, Pools, Applications, Secure Browser, Core).
|
|
5
5
|
Project-URL: Homepage, https://github.com/bengroeneveldsg/aws-workspaces-euc-mcp
|
|
6
6
|
Project-URL: Repository, https://github.com/bengroeneveldsg/aws-workspaces-euc-mcp
|
|
@@ -141,13 +141,28 @@ Bring your own credentials and region; the server holds nothing.
|
|
|
141
141
|
|
|
142
142
|
## Install
|
|
143
143
|
|
|
144
|
-
With [`uv`](https://docs.astral.sh/uv/) (recommended
|
|
144
|
+
With [`uv`](https://docs.astral.sh/uv/) (recommended):
|
|
145
145
|
|
|
146
146
|
```bash
|
|
147
147
|
uvx workspaces-euc-mcp-server@latest
|
|
148
148
|
```
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
Or with pip:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
pip install workspaces-euc-mcp-server
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Or with Docker (published to GHCR; the server speaks MCP over stdio, so run with `-i`):
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
docker run -i --rm \
|
|
160
|
+
-e AWS_PROFILE=your-euc-admin-profile -e AWS_REGION=us-east-1 \
|
|
161
|
+
-v "$HOME/.aws:/home/mcp/.aws:ro" \
|
|
162
|
+
ghcr.io/bengroeneveldsg/aws-workspaces-euc-mcp:latest --region us-east-1
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
From source (for development):
|
|
151
166
|
|
|
152
167
|
```bash
|
|
153
168
|
python -m venv .venv
|
|
@@ -111,13 +111,28 @@ Bring your own credentials and region; the server holds nothing.
|
|
|
111
111
|
|
|
112
112
|
## Install
|
|
113
113
|
|
|
114
|
-
With [`uv`](https://docs.astral.sh/uv/) (recommended
|
|
114
|
+
With [`uv`](https://docs.astral.sh/uv/) (recommended):
|
|
115
115
|
|
|
116
116
|
```bash
|
|
117
117
|
uvx workspaces-euc-mcp-server@latest
|
|
118
118
|
```
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
Or with pip:
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pip install workspaces-euc-mcp-server
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Or with Docker (published to GHCR; the server speaks MCP over stdio, so run with `-i`):
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
docker run -i --rm \
|
|
130
|
+
-e AWS_PROFILE=your-euc-admin-profile -e AWS_REGION=us-east-1 \
|
|
131
|
+
-v "$HOME/.aws:/home/mcp/.aws:ro" \
|
|
132
|
+
ghcr.io/bengroeneveldsg/aws-workspaces-euc-mcp:latest --region us-east-1
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
From source (for development):
|
|
121
136
|
|
|
122
137
|
```bash
|
|
123
138
|
python -m venv .venv
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "workspaces-euc-mcp-server"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.2"
|
|
4
4
|
description = "MCP server for administering the Amazon WorkSpaces family of End User Computing services (Personal, Pools, Applications, Secure Browser, Core)."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/publish.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier0-diagnostics.json
RENAMED
|
File without changes
|
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier2-lifecycle.json
RENAMED
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier3-destructive.json
RENAMED
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/scripts/smoke_readonly.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_destructive.py
RENAMED
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_diagnostics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_performance.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_secure_browser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|