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.
Files changed (48) hide show
  1. workspaces_euc_mcp_server-0.1.2/.dockerignore +32 -0
  2. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/ci.yml +7 -0
  3. workspaces_euc_mcp_server-0.1.2/.github/workflows/docker-publish.yml +40 -0
  4. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/CHANGELOG.md +11 -0
  5. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/DESIGN.md +8 -2
  6. workspaces_euc_mcp_server-0.1.2/Dockerfile +19 -0
  7. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/PKG-INFO +18 -3
  8. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/README.md +17 -2
  9. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/pyproject.toml +1 -1
  10. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/__init__.py +1 -1
  11. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.github/workflows/publish.yml +0 -0
  12. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.gitignore +0 -0
  13. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/.pre-commit-config.yaml +0 -0
  14. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/LICENSE +0 -0
  15. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/README.md +0 -0
  16. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier0-diagnostics.json +0 -0
  17. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier1-cost.json +0 -0
  18. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier2-lifecycle.json +0 -0
  19. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/iam/tier3-destructive.json +0 -0
  20. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/scripts/smoke_readonly.py +0 -0
  21. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/__init__.py +0 -0
  22. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_clients.py +0 -0
  23. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_cost.py +0 -0
  24. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_destructive.py +0 -0
  25. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_diagnostics.py +0 -0
  26. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_inventory.py +0 -0
  27. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_lifecycle.py +0 -0
  28. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_naming.py +0 -0
  29. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_no_embedded_secrets.py +0 -0
  30. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_performance.py +0 -0
  31. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_pricing.py +0 -0
  32. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_reporting.py +0 -0
  33. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/tests/test_secure_browser.py +0 -0
  34. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/clients.py +0 -0
  35. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/consts.py +0 -0
  36. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/models.py +0 -0
  37. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/server.py +0 -0
  38. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/__init__.py +0 -0
  39. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/_common.py +0 -0
  40. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/cost.py +0 -0
  41. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/destructive.py +0 -0
  42. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/diagnostics.py +0 -0
  43. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/inventory.py +0 -0
  44. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/lifecycle.py +0 -0
  45. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/performance.py +0 -0
  46. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/pricing.py +0 -0
  47. {workspaces_euc_mcp_server-0.1.1 → workspaces_euc_mcp_server-0.1.2}/workspaces_euc_mcp_server/tools/reporting.py +0 -0
  48. {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
@@ -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:** `uvx awslabs.workspaces-euc-mcp-server@latest` and a Docker image.
51
- - **Observability:** Loguru with env-controlled log level; structured tool errors via `ctx.error`.
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.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 once published):
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
- From source:
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 once published):
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
- From source:
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.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"
@@ -3,4 +3,4 @@
3
3
  # A copy of the License is located at http://www.apache.org/licenses/LICENSE-2.0
4
4
  """MCP server for administering the Amazon WorkSpaces End User Computing portfolio."""
5
5
 
6
- __version__ = "0.1.1"
6
+ __version__ = "0.1.2"