Compare commits

..

9 Commits

Author SHA1 Message Date
Chris Coutinho 2b5bb1cc81 fix: Commitizen release process
https://commitizen-tools.github.io/commitizen/tutorials/github_actions/
2025-05-25 12:47:10 +02:00
github-actions[bot] 847a69e2ba bump: version 0.2.3 → 0.2.4 2025-05-25 10:33:45 +00:00
Chris Coutinho 186d2c1d94 Merge pull request #34 from cbcoutinho/feature/logging
fix: Configure logging
2025-05-25 12:33:20 +02:00
Chris Coutinho 96d5789200 fix: Do not update dependencies when running in Dockerfile 2025-05-25 12:26:01 +02:00
Chris Coutinho b332c54330 ci: Setup uv using action, make sure uv runs tests without updating 2025-05-25 12:02:57 +02:00
Chris Coutinho 9a05b171ae ci: Install uv using curl 2025-05-25 11:55:21 +02:00
Chris Coutinho e93eb9d302 fix: Configure logging 2025-05-25 11:46:41 +02:00
Chris Coutinho 5af7c25dab Merge branch 'master' of github.com:cbcoutinho/nextcloud-mcp-server 2025-05-25 10:59:26 +02:00
Chris Coutinho a0b9482915 build: Only build on tags 2025-05-25 10:59:14 +02:00
10 changed files with 20 additions and 32 deletions
+2 -2
View File
@@ -18,11 +18,11 @@ jobs:
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
with: with:
fetch-depth: 0 fetch-depth: 0
token: "${{ secrets.GITHUB_TOKEN }}" token: "${{ secrets.PERSONAL_ACCESS_TOKEN }}"
- name: Create bump and changelog - name: Create bump and changelog
uses: commitizen-tools/commitizen-action@5b0848cd060263e24602d1eba03710e056ef7711 # 0.24.0 uses: commitizen-tools/commitizen-action@5b0848cd060263e24602d1eba03710e056ef7711 # 0.24.0
with: with:
github_token: ${{ secrets.GITHUB_TOKEN }} github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
changelog_increment_filename: body.md changelog_increment_filename: body.md
- name: Release - name: Release
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2 uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2
@@ -2,7 +2,6 @@ name: Build and Publish Docker Image
on: on:
push: push:
branches: [ "master" ]
tags: ["*"] tags: ["*"]
jobs: jobs:
+3 -9
View File
@@ -16,14 +16,8 @@ jobs:
uses: hoverkraft-tech/compose-action@8be2d741e891ac9b8ac20825e6f3904149599925 # v2.2.0 uses: hoverkraft-tech/compose-action@8be2d741e891ac9b8ac20825e6f3904149599925 # v2.2.0
with: with:
compose-file: "./docker-compose.yml" compose-file: "./docker-compose.yml"
- name: Install the latest version of uv
- name: Install dependencies uses: astral-sh/setup-uv@v6
run: |
sudo apt update -y && sudo apt install -y pipx
pipx install uv
uv sync --locked
env:
DEBIAN_FRONTEND: "noninteractive"
- name: Wait for service to be ready - name: Wait for service to be ready
run: | run: |
@@ -48,4 +42,4 @@ jobs:
NEXTCLOUD_USERNAME: "admin" NEXTCLOUD_USERNAME: "admin"
NEXTCLOUD_PASSWORD: "admin" NEXTCLOUD_PASSWORD: "admin"
run: | run: |
uv run python -m pytest uv run --frozen python -m pytest
+7
View File
@@ -1,3 +1,10 @@
## v0.2.4 (2025-05-25)
### Fix
- Do not update dependencies when running in Dockerfile
- Configure logging
## v0.2.3 (2025-05-25) ## v0.2.3 (2025-05-25)
### Fix ### Fix
+1 -5
View File
@@ -6,8 +6,4 @@ COPY . .
RUN uv sync --locked RUN uv sync --locked
ENV VIRTUAL_ENV=/app/.venv CMD ["uv", "run", "--locked", "mcp", "run", "--transport", "sse", "nextcloud_mcp_server/server.py:mcp"]
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
ENV FASTMCP_LOG_LEVEL=DEBUG
CMD ["mcp", "run", "--transport", "sse", "nextcloud_mcp_server/server.py:mcp"]
-3
View File
@@ -1,12 +1,9 @@
import os import os
import time # Import time for sleep
import mimetypes import mimetypes
from io import BytesIO
from httpx import ( from httpx import (
Client, Client,
Auth, Auth,
BasicAuth, BasicAuth,
Headers,
Request, Request,
Response, Response,
HTTPStatusError, HTTPStatusError,
+1 -4
View File
@@ -4,11 +4,8 @@ LOGGING_CONFIG = {
"version": 1, "version": 1,
"handlers": { "handlers": {
"default": { "default": {
"class": "logging.FileHandler", "class": "logging.StreamHandler",
"formatter": "http", "formatter": "http",
# "stream": "ext://sys.stderr"
"filename": "/tmp/nextcloud-mcp-server.log",
"mode": "a",
} }
}, },
"formatters": { "formatters": {
+4 -6
View File
@@ -11,8 +11,6 @@ import asyncio # Import asyncio
setup_logging() setup_logging()
logger = logging.getLogger(__name__)
@dataclass @dataclass
class AppContext: class AppContext:
@@ -23,11 +21,9 @@ class AppContext:
async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]: async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
"""Manage application lifecycle with type-safe context""" """Manage application lifecycle with type-safe context"""
# Initialize on startup # Initialize on startup
logger.info("Creating Nextcloud client") logging.info("Creating Nextcloud client")
client = NextcloudClient.from_env() client = NextcloudClient.from_env()
# Add a small delay to allow client initialization to complete logging.info("Client initialization wait complete.")
logger.info("Waiting 2 seconds for client initialization...")
logger.info("Client initialization wait complete.")
try: try:
yield AppContext(client=client) yield AppContext(client=client)
finally: finally:
@@ -38,6 +34,8 @@ async def app_lifespan(server: FastMCP) -> AsyncIterator[AppContext]:
# Create an MCP server # Create an MCP server
mcp = FastMCP("Nextcloud MCP", lifespan=app_lifespan) mcp = FastMCP("Nextcloud MCP", lifespan=app_lifespan)
logger = logging.getLogger(__name__)
@mcp.resource("nc://capabilities") @mcp.resource("nc://capabilities")
def nc_get_capabilities(): def nc_get_capabilities():
+1 -1
View File
@@ -1,6 +1,6 @@
[project] [project]
name = "nextcloud-mcp-server" name = "nextcloud-mcp-server"
version = "0.2.3" version = "0.2.4"
description = "" description = ""
authors = [ authors = [
{name = "Chris Coutinho",email = "chris@coutinho.io"} {name = "Chris Coutinho",email = "chris@coutinho.io"}
Generated
+1 -1
View File
@@ -492,7 +492,7 @@ wheels = [
[[package]] [[package]]
name = "nextcloud-mcp-server" name = "nextcloud-mcp-server"
version = "0.2.3" version = "0.2.4"
source = { editable = "." } source = { editable = "." }
dependencies = [ dependencies = [
{ name = "httpx" }, { name = "httpx" },