cronometer-api-mcp 0.1.2__tar.gz → 0.1.3__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.
- cronometer_api_mcp-0.1.3/.dockerignore +22 -0
- cronometer_api_mcp-0.1.3/.github/workflows/docker.yml +66 -0
- cronometer_api_mcp-0.1.3/Dockerfile +51 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/PKG-INFO +1 -1
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/pyproject.toml +1 -1
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/server.json +2 -2
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/.github/workflows/ci.yml +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/.github/workflows/publish.yml +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/.gitignore +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/.python-version +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/LICENSE +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/Procfile +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/README.md +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/src/cronometer_api_mcp/__init__.py +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/src/cronometer_api_mcp/client.py +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/src/cronometer_api_mcp/server.py +0 -0
- {cronometer_api_mcp-0.1.2 → cronometer_api_mcp-0.1.3}/uv.lock +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Exclude noise from the build context
|
|
2
|
+
.git
|
|
3
|
+
.gitignore
|
|
4
|
+
__pycache__
|
|
5
|
+
*.pyc
|
|
6
|
+
.venv
|
|
7
|
+
venv
|
|
8
|
+
.pytest_cache
|
|
9
|
+
.ruff_cache
|
|
10
|
+
dist
|
|
11
|
+
build
|
|
12
|
+
*.egg-info
|
|
13
|
+
flows
|
|
14
|
+
*.md
|
|
15
|
+
!README.md
|
|
16
|
+
Procfile
|
|
17
|
+
opencode.json
|
|
18
|
+
server.json
|
|
19
|
+
skills-lock.json
|
|
20
|
+
session-*.md
|
|
21
|
+
Dockerfile
|
|
22
|
+
.dockerignore
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
name: Build Docker image
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
release:
|
|
7
|
+
types: [published]
|
|
8
|
+
|
|
9
|
+
concurrency:
|
|
10
|
+
group: docker-${{ github.ref }}
|
|
11
|
+
cancel-in-progress: true
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
build:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
packages: write
|
|
19
|
+
# Required for build provenance attestation
|
|
20
|
+
id-token: write
|
|
21
|
+
attestations: write
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
|
|
26
|
+
- name: Set up QEMU
|
|
27
|
+
uses: docker/setup-qemu-action@v3
|
|
28
|
+
|
|
29
|
+
- name: Set up Docker Buildx
|
|
30
|
+
uses: docker/setup-buildx-action@v3
|
|
31
|
+
|
|
32
|
+
- name: Log in to GHCR
|
|
33
|
+
uses: docker/login-action@v3
|
|
34
|
+
with:
|
|
35
|
+
registry: ghcr.io
|
|
36
|
+
username: ${{ github.actor }}
|
|
37
|
+
password: ${{ secrets.GITHUB_TOKEN }}
|
|
38
|
+
|
|
39
|
+
- name: Compute image metadata
|
|
40
|
+
id: meta
|
|
41
|
+
uses: docker/metadata-action@v5
|
|
42
|
+
with:
|
|
43
|
+
images: ghcr.io/${{ github.repository }}
|
|
44
|
+
tags: |
|
|
45
|
+
type=semver,pattern={{version}}
|
|
46
|
+
type=semver,pattern={{major}}.{{minor}}
|
|
47
|
+
type=raw,value=latest,enable={{is_default_branch}}
|
|
48
|
+
|
|
49
|
+
- name: Build and push
|
|
50
|
+
id: build
|
|
51
|
+
uses: docker/build-push-action@v5
|
|
52
|
+
with:
|
|
53
|
+
context: .
|
|
54
|
+
platforms: linux/amd64,linux/arm64
|
|
55
|
+
push: true
|
|
56
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
57
|
+
labels: ${{ steps.meta.outputs.labels }}
|
|
58
|
+
cache-from: type=gha
|
|
59
|
+
cache-to: type=gha,mode=max
|
|
60
|
+
|
|
61
|
+
- name: Generate build provenance attestation
|
|
62
|
+
uses: actions/attest-build-provenance@v1
|
|
63
|
+
with:
|
|
64
|
+
subject-name: ghcr.io/${{ github.repository }}
|
|
65
|
+
subject-digest: ${{ steps.build.outputs.digest }}
|
|
66
|
+
push-to-registry: true
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Cronometer MCP image, wrapped with supergateway.
|
|
2
|
+
#
|
|
3
|
+
# Contract (same for every MCP hosted by this gateway):
|
|
4
|
+
# - Exposes MCP streamable-HTTP on 0.0.0.0:$PORT at /mcp
|
|
5
|
+
# - Health endpoint at /healthz
|
|
6
|
+
# - stdio-speaking MCP process is spawned by supergateway as a child;
|
|
7
|
+
# supergateway handles protocol translation, session binding, and
|
|
8
|
+
# server->client SSE notifications.
|
|
9
|
+
#
|
|
10
|
+
# The gateway reverse-proxies HTTP into this container. No stdio, Docker
|
|
11
|
+
# attach, or EOF games are required anywhere.
|
|
12
|
+
#
|
|
13
|
+
# Base image: supercorp/supergateway:uvx (Alpine + Node 20 + uv).
|
|
14
|
+
# We install Python 3.14 via uv (cronometer-api-mcp requires >=3.14).
|
|
15
|
+
|
|
16
|
+
FROM supercorp/supergateway:uvx
|
|
17
|
+
|
|
18
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
19
|
+
PYTHONUNBUFFERED=1 \
|
|
20
|
+
UV_LINK_MODE=copy \
|
|
21
|
+
UV_PYTHON_INSTALL_DIR=/opt/uv-python \
|
|
22
|
+
UV_TOOL_DIR=/opt/uv-tools \
|
|
23
|
+
UV_TOOL_BIN_DIR=/usr/local/bin \
|
|
24
|
+
PORT=8080
|
|
25
|
+
|
|
26
|
+
WORKDIR /app
|
|
27
|
+
|
|
28
|
+
# Copy the package source. Uses the .dockerignore alongside this file.
|
|
29
|
+
COPY pyproject.toml README.md ./
|
|
30
|
+
COPY src ./src
|
|
31
|
+
|
|
32
|
+
# Pre-install Python 3.14 into a deterministic location, then install the MCP
|
|
33
|
+
# as a uv tool so its console entry point (`cronometer-api-mcp`) lands in
|
|
34
|
+
# /usr/local/bin on $PATH.
|
|
35
|
+
RUN uv python install 3.14 \
|
|
36
|
+
&& uv tool install --python 3.14 . \
|
|
37
|
+
&& cronometer-api-mcp --help >/dev/null 2>&1 || true
|
|
38
|
+
|
|
39
|
+
# supergateway wraps the stdio MCP; Nomad (or docker run -p) remaps $PORT.
|
|
40
|
+
# --stateful enables Mcp-Session-Id semantics per the MCP streamable-HTTP spec.
|
|
41
|
+
# --sessionTimeout is unused here because gateway owns reaping via Nomad;
|
|
42
|
+
# we still set a generous value so a forgotten session eventually self-heals.
|
|
43
|
+
ENTRYPOINT ["/bin/sh", "-c", "exec supergateway \
|
|
44
|
+
--stdio 'cronometer-api-mcp' \
|
|
45
|
+
--outputTransport streamableHttp \
|
|
46
|
+
--stateful \
|
|
47
|
+
--streamableHttpPath /mcp \
|
|
48
|
+
--healthEndpoint /healthz \
|
|
49
|
+
--port \"${PORT}\" \
|
|
50
|
+
--sessionTimeout 3600000 \
|
|
51
|
+
--logLevel info"]
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/rwestergren/cronometer-api-mcp",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.3",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "pypi",
|
|
13
13
|
"identifier": "cronometer-api-mcp",
|
|
14
|
-
"version": "0.1.
|
|
14
|
+
"version": "0.1.3",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
|
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
|