permissions for git workflows
This commit is contained in:
4
.github/workflows/check-maintainer-edits.yml
vendored
4
.github/workflows/check-maintainer-edits.yml
vendored
@@ -4,6 +4,10 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
types: [opened, synchronize, reopened, edited]
|
types: [opened, synchronize, reopened, edited]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: read
|
||||||
|
issues: write
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check-maintainer-edits:
|
check-maintainer-edits:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -11,6 +11,8 @@ on:
|
|||||||
- main
|
- main
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
REGISTRY: ghcr.io
|
REGISTRY: ghcr.io
|
||||||
IMAGE_NAME: ${{ github.repository }}
|
IMAGE_NAME: ${{ github.repository }}
|
||||||
|
|||||||
2
.github/workflows/publish-mcp-registry.yml
vendored
2
.github/workflows/publish-mcp-registry.yml
vendored
@@ -6,6 +6,8 @@ on:
|
|||||||
- "v*"
|
- "v*"
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -348,7 +348,7 @@ def configure_server_for_http():
|
|||||||
)
|
)
|
||||||
elif use_disk:
|
elif use_disk:
|
||||||
try:
|
try:
|
||||||
from key_value.aio.stores.disk import DiskStore
|
from key_value.aio.stores.filetree import FileTreeStore
|
||||||
|
|
||||||
disk_directory = os.getenv(
|
disk_directory = os.getenv(
|
||||||
"WORKSPACE_MCP_OAUTH_PROXY_DISK_DIRECTORY", ""
|
"WORKSPACE_MCP_OAUTH_PROXY_DISK_DIRECTORY", ""
|
||||||
@@ -363,7 +363,7 @@ def configure_server_for_http():
|
|||||||
"~/.fastmcp/oauth-proxy"
|
"~/.fastmcp/oauth-proxy"
|
||||||
)
|
)
|
||||||
|
|
||||||
client_storage = DiskStore(directory=disk_directory)
|
client_storage = FileTreeStore(data_directory=disk_directory)
|
||||||
|
|
||||||
jwt_signing_key = validate_and_derive_jwt_key(
|
jwt_signing_key = validate_and_derive_jwt_key(
|
||||||
jwt_signing_key_override, config.client_secret
|
jwt_signing_key_override, config.client_secret
|
||||||
@@ -379,7 +379,7 @@ def configure_server_for_http():
|
|||||||
fernet=Fernet(key=storage_encryption_key),
|
fernet=Fernet(key=storage_encryption_key),
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
"OAuth 2.1: Using DiskStore for FastMCP OAuth proxy client_storage (directory=%s)",
|
"OAuth 2.1: Using FileTreeStore for FastMCP OAuth proxy client_storage (directory=%s)",
|
||||||
disk_directory,
|
disk_directory,
|
||||||
)
|
)
|
||||||
except ImportError as exc:
|
except ImportError as exc:
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ workspace-mcp = "main:main"
|
|||||||
|
|
||||||
[project.optional-dependencies]
|
[project.optional-dependencies]
|
||||||
disk = [
|
disk = [
|
||||||
"py-key-value-aio[disk]>=0.3.0",
|
"py-key-value-aio[filetree]>=0.3.0",
|
||||||
]
|
]
|
||||||
valkey = [
|
valkey = [
|
||||||
"py-key-value-aio[valkey]>=0.3.0",
|
"py-key-value-aio[valkey]>=0.3.0",
|
||||||
@@ -84,7 +84,7 @@ dev = [
|
|||||||
|
|
||||||
[dependency-groups]
|
[dependency-groups]
|
||||||
disk = [
|
disk = [
|
||||||
"py-key-value-aio[disk]>=0.3.0",
|
"py-key-value-aio[filetree]>=0.3.0",
|
||||||
]
|
]
|
||||||
valkey = [
|
valkey = [
|
||||||
"py-key-value-aio[valkey]>=0.3.0",
|
"py-key-value-aio[valkey]>=0.3.0",
|
||||||
|
|||||||
@@ -3,6 +3,8 @@ Unit tests for Google Chat MCP tools — attachment support
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from unittest.mock import AsyncMock, Mock, patch
|
from unittest.mock import AsyncMock, Mock, patch
|
||||||
import sys
|
import sys
|
||||||
@@ -271,10 +273,12 @@ async def test_download_uses_api_media_endpoint():
|
|||||||
# Verify we used the API endpoint with attachmentDataRef.resourceName
|
# Verify we used the API endpoint with attachmentDataRef.resourceName
|
||||||
call_args = mock_client.get.call_args
|
call_args = mock_client.get.call_args
|
||||||
url_used = call_args.args[0]
|
url_used = call_args.args[0]
|
||||||
assert "chat.googleapis.com" in url_used
|
parsed = urlparse(url_used)
|
||||||
|
assert parsed.scheme == "https"
|
||||||
|
assert parsed.hostname == "chat.googleapis.com"
|
||||||
assert "alt=media" in url_used
|
assert "alt=media" in url_used
|
||||||
assert "spaces/S/attachments/A" in url_used
|
assert "spaces/S/attachments/A" in parsed.path
|
||||||
assert "/messages/" not in url_used
|
assert "/messages/" not in parsed.path
|
||||||
|
|
||||||
# Verify Bearer token
|
# Verify Bearer token
|
||||||
assert call_args.kwargs["headers"]["Authorization"] == "Bearer fake-access-token"
|
assert call_args.kwargs["headers"]["Authorization"] == "Bearer fake-access-token"
|
||||||
|
|||||||
30
uv.lock
generated
30
uv.lock
generated
@@ -423,15 +423,6 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 },
|
{ url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "diskcache"
|
|
||||||
version = "5.6.3"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916 }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550 },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dnspython"
|
name = "dnspython"
|
||||||
version = "2.8.0"
|
version = "2.8.0"
|
||||||
@@ -970,15 +961,6 @@ wheels = [
|
|||||||
{ url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592 },
|
{ url = "https://files.pythonhosted.org/packages/7d/eb/b6260b31b1a96386c0a880edebe26f89669098acea8e0318bff6adb378fd/pathable-0.4.4-py3-none-any.whl", hash = "sha256:5ae9e94793b6ef5a4cbe0a7ce9dbbefc1eec38df253763fd0aeeacf2762dbbc2", size = 9592 },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pathvalidate"
|
|
||||||
version = "3.3.1"
|
|
||||||
source = { registry = "https://pypi.org/simple" }
|
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", hash = "sha256:b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177", size = 63262 }
|
|
||||||
wheels = [
|
|
||||||
{ url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", hash = "sha256:5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f", size = 24305 },
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "platformdirs"
|
name = "platformdirs"
|
||||||
version = "4.5.1"
|
version = "4.5.1"
|
||||||
@@ -1038,10 +1020,6 @@ wheels = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[package.optional-dependencies]
|
[package.optional-dependencies]
|
||||||
disk = [
|
|
||||||
{ name = "diskcache" },
|
|
||||||
{ name = "pathvalidate" },
|
|
||||||
]
|
|
||||||
filetree = [
|
filetree = [
|
||||||
{ name = "aiofile" },
|
{ name = "aiofile" },
|
||||||
{ name = "anyio" },
|
{ name = "anyio" },
|
||||||
@@ -2116,7 +2094,7 @@ dev = [
|
|||||||
{ name = "twine" },
|
{ name = "twine" },
|
||||||
]
|
]
|
||||||
disk = [
|
disk = [
|
||||||
{ name = "py-key-value-aio", extra = ["disk"] },
|
{ name = "py-key-value-aio", extra = ["filetree"] },
|
||||||
]
|
]
|
||||||
release = [
|
release = [
|
||||||
{ name = "tomlkit" },
|
{ name = "tomlkit" },
|
||||||
@@ -2141,7 +2119,7 @@ dev = [
|
|||||||
{ name = "twine" },
|
{ name = "twine" },
|
||||||
]
|
]
|
||||||
disk = [
|
disk = [
|
||||||
{ name = "py-key-value-aio", extra = ["disk"] },
|
{ name = "py-key-value-aio", extra = ["filetree"] },
|
||||||
]
|
]
|
||||||
release = [
|
release = [
|
||||||
{ name = "tomlkit" },
|
{ name = "tomlkit" },
|
||||||
@@ -2167,7 +2145,7 @@ requires-dist = [
|
|||||||
{ name = "google-auth-oauthlib", specifier = ">=1.2.2" },
|
{ name = "google-auth-oauthlib", specifier = ">=1.2.2" },
|
||||||
{ name = "httpx", specifier = ">=0.28.1" },
|
{ name = "httpx", specifier = ">=0.28.1" },
|
||||||
{ name = "py-key-value-aio", specifier = ">=0.3.0" },
|
{ name = "py-key-value-aio", specifier = ">=0.3.0" },
|
||||||
{ name = "py-key-value-aio", extras = ["disk"], marker = "extra == 'disk'", specifier = ">=0.3.0" },
|
{ name = "py-key-value-aio", extras = ["filetree"], marker = "extra == 'disk'", specifier = ">=0.3.0" },
|
||||||
{ name = "py-key-value-aio", extras = ["valkey"], marker = "extra == 'valkey'", specifier = ">=0.3.0" },
|
{ name = "py-key-value-aio", extras = ["valkey"], marker = "extra == 'valkey'", specifier = ">=0.3.0" },
|
||||||
{ name = "pyjwt", specifier = ">=2.12.0" },
|
{ name = "pyjwt", specifier = ">=2.12.0" },
|
||||||
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.0" },
|
{ name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.0" },
|
||||||
@@ -2195,7 +2173,7 @@ dev = [
|
|||||||
{ name = "tomlkit", specifier = ">=0.13.3" },
|
{ name = "tomlkit", specifier = ">=0.13.3" },
|
||||||
{ name = "twine", specifier = ">=5.0.0" },
|
{ name = "twine", specifier = ">=5.0.0" },
|
||||||
]
|
]
|
||||||
disk = [{ name = "py-key-value-aio", extras = ["disk"], specifier = ">=0.3.0" }]
|
disk = [{ name = "py-key-value-aio", extras = ["filetree"], specifier = ">=0.3.0" }]
|
||||||
release = [
|
release = [
|
||||||
{ name = "tomlkit", specifier = ">=0.13.3" },
|
{ name = "tomlkit", specifier = ">=0.13.3" },
|
||||||
{ name = "twine", specifier = ">=5.0.0" },
|
{ name = "twine", specifier = ">=5.0.0" },
|
||||||
|
|||||||
Reference in New Issue
Block a user