mcp-server-appwrite 2.1.1__tar.gz → 2.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.
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/PKG-INFO +1 -1
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/resource.py +22 -1
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/views.py +5 -4
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/data/docs_index.npz +1 -1
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/operator.py +1 -2
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_apps.py +19 -7
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.dockerignore +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.env.example +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/ci.yml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/production.yml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/publish.yml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/staging.yml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/update-docs-index.yml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.gitignore +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.python-version +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/AGENTS.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/CLAUDE.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/Dockerfile +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/LICENSE +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/README.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/compose.yaml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/apps.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/appwrite-mcp-flow.png +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/appwrite-mcp-flow.svg +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/authentication.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/development.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/documentation-search.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/events.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/flags.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/images/claude-desktop-local-mcp-servers.png +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/images/codex-mcp.png +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/images/cursor-mcp.png +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/self-hosted.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/docs/tool-surface.md +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/glama.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/pyproject.toml +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/scripts/build_docs_index.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/scripts/docs_release_notes.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/scripts/render_server_json.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/server.template.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/__init__.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/__main__.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/__init__.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/protocol.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/__init__.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/favicon.svg +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/instructions.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/view.html +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/auth.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/catalog_policy.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/constants.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/context.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_index.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_search.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_source.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/error_classification.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/error_monitoring.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/__init__.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/bus.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/catalog.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/delivery.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/egress.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/envelope.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/errors.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/ingress.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/projection.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/protocol.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/streams.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/subscriptions.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/webhooks.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/flags.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/http_app.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/instructions.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/legacy.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/server.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/service.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/telemetry.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/tool_manager.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/deployment_function_duplicate.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/deployment_function_failed.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/deployment_function_ready.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/deployment_site_ready.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/execution_async_failed.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/execution_async_waiting.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/execution_sync_failed.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/file_created.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/function_activation.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/row_created.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/user_created.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/support.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_events_ingress.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_events_protocol.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_events_stream.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_events_subscribe.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_stdio.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/test_tools.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/support.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_avatars.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_console_sdk_oauth.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_docs_index.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_docs_source.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_functions.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_locale.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_messaging.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_oauth_discovery.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_operator.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_sites.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_storage.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_tables_db.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_teams.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_users.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/test_all.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/fixtures/jwe-v1.json +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_auth.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_context.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_docs.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_docs_search.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_error_classification.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_error_monitoring.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_events_delivery.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_events_egress.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_events_envelope.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_events_protocol.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_http_app.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_instructions.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_operator.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_release_metadata.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_server.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_service.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_telemetry.py +0 -0
- {mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: mcp-server-appwrite
|
|
3
|
-
Version: 2.1.
|
|
3
|
+
Version: 2.1.2
|
|
4
4
|
Summary: Build and deploy application backends. Add authentication, PostgreSQL/MySQL databases, vector databases, storage, serverless functions, realtime, messaging, hosting, domains, CDN and firewall.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.12
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/resource.py
RENAMED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
One HTML document (``assets/view.html``, plain JavaScript with no build step)
|
|
4
4
|
renders every view; it picks one from the tool result's ``structuredContent``.
|
|
5
|
+
Hosts cache UI resources by URI, so the tools point at
|
|
6
|
+
``ui://appwrite/view/<hash of the HTML>``: a release that changes the view
|
|
7
|
+
changes the URI, and hosts fetch it again. The bare ``ui://appwrite/view``
|
|
8
|
+
still serves the current HTML for tool lists cached before versioning.
|
|
5
9
|
It declares no CSP domains, so hosts apply SEP-1865's restrictive default: no
|
|
6
10
|
network access and no external scripts. Every Appwrite read and write it makes
|
|
7
11
|
is a ``tools/call`` the host proxies to this server under the user's own
|
|
@@ -11,6 +15,7 @@ credentials.
|
|
|
11
15
|
from __future__ import annotations
|
|
12
16
|
|
|
13
17
|
from functools import cache
|
|
18
|
+
from hashlib import sha256
|
|
14
19
|
from importlib.resources import files
|
|
15
20
|
from typing import Any
|
|
16
21
|
|
|
@@ -23,14 +28,30 @@ from .protocol import MIME_TYPE
|
|
|
23
28
|
META: dict[str, Any] = {"ui": {"csp": {}, "prefersBorder": True}}
|
|
24
29
|
|
|
25
30
|
|
|
31
|
+
VERSION_LENGTH = 12
|
|
32
|
+
"""Hex digits of the HTML's SHA-256 in the URI: enough that two releases
|
|
33
|
+
never collide."""
|
|
34
|
+
|
|
35
|
+
|
|
26
36
|
@cache
|
|
27
37
|
def html() -> str:
|
|
28
38
|
return files("mcp_server_appwrite.assets").joinpath("view.html").read_text()
|
|
29
39
|
|
|
30
40
|
|
|
41
|
+
@cache
|
|
42
|
+
def uri() -> str:
|
|
43
|
+
"""The URI the tools point at, versioned by the HTML it serves."""
|
|
44
|
+
digest = sha256(html().encode("utf-8")).hexdigest()[:VERSION_LENGTH]
|
|
45
|
+
return f"{VIEW_URI}/{digest}"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def serves(requested: str) -> bool:
|
|
49
|
+
return requested in (uri(), VIEW_URI)
|
|
50
|
+
|
|
51
|
+
|
|
31
52
|
def resource() -> types.Resource:
|
|
32
53
|
return types.Resource(
|
|
33
|
-
uri=
|
|
54
|
+
uri=uri(),
|
|
34
55
|
name="Appwrite view",
|
|
35
56
|
description=(
|
|
36
57
|
"Interactive Appwrite view: table rows and deployment build logs."
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/views.py
RENAMED
|
@@ -27,7 +27,8 @@ from typing import Any
|
|
|
27
27
|
import mcp.types as types
|
|
28
28
|
from appwrite_console.query import Query
|
|
29
29
|
|
|
30
|
-
from ..constants import SHOW_TOOL_NAME,
|
|
30
|
+
from ..constants import SHOW_TOOL_NAME, VIEW_WRITE_TOOL_NAME
|
|
31
|
+
from . import resource
|
|
31
32
|
|
|
32
33
|
Run = Callable[[dict[str, Any], bool], list[Any]]
|
|
33
34
|
"""Runs a hidden catalog tool from raw call arguments (``tool_name``,
|
|
@@ -278,10 +279,10 @@ def _show_tool() -> types.Tool:
|
|
|
278
279
|
"additionalProperties": False,
|
|
279
280
|
},
|
|
280
281
|
_meta={
|
|
281
|
-
"ui": {"resourceUri":
|
|
282
|
+
"ui": {"resourceUri": resource.uri(), "visibility": ["model", "app"]},
|
|
282
283
|
# The flat key hosts read before ``ui.resourceUri``; SEP-1865 drops
|
|
283
284
|
# it at GA.
|
|
284
|
-
"ui/resourceUri":
|
|
285
|
+
"ui/resourceUri": resource.uri(),
|
|
285
286
|
},
|
|
286
287
|
)
|
|
287
288
|
|
|
@@ -307,7 +308,7 @@ def _write_tool() -> types.Tool:
|
|
|
307
308
|
"required": ["tool_name", "arguments", "confirm_write"],
|
|
308
309
|
"additionalProperties": False,
|
|
309
310
|
},
|
|
310
|
-
_meta={"ui": {"resourceUri":
|
|
311
|
+
_meta={"ui": {"resourceUri": resource.uri(), "visibility": ["app"]}},
|
|
311
312
|
)
|
|
312
313
|
|
|
313
314
|
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/data/docs_index.npz
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
[diffend] Oversized file quarantined before diffing.
|
|
2
|
-
name: mcp_server_appwrite-2.1.
|
|
2
|
+
name: mcp_server_appwrite-2.1.2/src/mcp_server_appwrite/data/docs_index.npz
|
|
3
3
|
size: 35543664 bytes
|
|
4
4
|
sha256: 61d266fdb9a958b272d1b351cc6ebd6e824b0d0fe294483703e0795e4b0580df
|
|
@@ -33,7 +33,6 @@ from .constants import (
|
|
|
33
33
|
SEARCH_TOOL_NAME,
|
|
34
34
|
UPDATE_HINTS,
|
|
35
35
|
VERBS,
|
|
36
|
-
VIEW_URI,
|
|
37
36
|
WRITE_TOOL_NAME,
|
|
38
37
|
)
|
|
39
38
|
from .docs_search import DocsSearch
|
|
@@ -437,7 +436,7 @@ class Operator:
|
|
|
437
436
|
if uri == CATALOG_URI:
|
|
438
437
|
return [ReadResourceContents(self._cached_catalog_json, "application/json")]
|
|
439
438
|
|
|
440
|
-
if apps and uri
|
|
439
|
+
if apps and view_resource.serves(uri):
|
|
441
440
|
return [view_resource.read()]
|
|
442
441
|
|
|
443
442
|
if (
|
|
@@ -8,7 +8,9 @@ the view pages, refreshes, follows a build and saves an edit.
|
|
|
8
8
|
checked to have reached no Appwrite write at all.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
+
import hashlib
|
|
11
12
|
import json
|
|
13
|
+
import re
|
|
12
14
|
import unittest
|
|
13
15
|
from typing import Any
|
|
14
16
|
|
|
@@ -164,15 +166,18 @@ class AppsFlow(unittest.TestCase):
|
|
|
164
166
|
|
|
165
167
|
listed = tools(self.host)
|
|
166
168
|
show = listed["appwrite_show"]
|
|
169
|
+
# Hosts cache UI resources by URI, so the URI carries the HTML's hash:
|
|
170
|
+
# a release that changes the view makes hosts fetch it again.
|
|
171
|
+
uri = show["_meta"]["ui"]["resourceUri"]
|
|
172
|
+
self.assertRegex(uri, rf"^{re.escape(VIEW_URI)}/[0-9a-f]{{12}}$")
|
|
167
173
|
self.assertEqual(
|
|
168
|
-
show["_meta"]["ui"],
|
|
169
|
-
{"resourceUri": VIEW_URI, "visibility": ["model", "app"]},
|
|
174
|
+
show["_meta"]["ui"], {"resourceUri": uri, "visibility": ["model", "app"]}
|
|
170
175
|
)
|
|
171
|
-
self.assertEqual(show["_meta"]["ui/resourceUri"],
|
|
176
|
+
self.assertEqual(show["_meta"]["ui/resourceUri"], uri)
|
|
172
177
|
self.assertTrue(show["annotations"]["readOnlyHint"])
|
|
173
178
|
write = listed["appwrite_view_write"]
|
|
174
179
|
self.assertEqual(
|
|
175
|
-
write["_meta"]["ui"], {"resourceUri":
|
|
180
|
+
write["_meta"]["ui"], {"resourceUri": uri, "visibility": ["app"]}
|
|
176
181
|
)
|
|
177
182
|
self.assertTrue(write["annotations"]["destructiveHint"])
|
|
178
183
|
# The operator tools are unchanged.
|
|
@@ -182,12 +187,13 @@ class AppsFlow(unittest.TestCase):
|
|
|
182
187
|
|
|
183
188
|
_, response = self.host.call("resources/list")
|
|
184
189
|
view = next(
|
|
185
|
-
each for each in response["result"]["resources"] if each["uri"] ==
|
|
190
|
+
each for each in response["result"]["resources"] if each["uri"] == uri
|
|
186
191
|
)
|
|
187
192
|
self.assertEqual(view["mimeType"], MIME_TYPE)
|
|
188
193
|
|
|
189
|
-
_, response = self.host.call("resources/read", {"uri":
|
|
194
|
+
_, response = self.host.call("resources/read", {"uri": uri})
|
|
190
195
|
(contents,) = response["result"]["contents"]
|
|
196
|
+
self.assertEqual(contents["uri"], uri)
|
|
191
197
|
self.assertEqual(contents["mimeType"], MIME_TYPE)
|
|
192
198
|
# No CSP domains: the host's restrictive default, no network access.
|
|
193
199
|
self.assertEqual(contents["_meta"]["ui"], {"csp": {}, "prefersBorder": True})
|
|
@@ -197,6 +203,12 @@ class AppsFlow(unittest.TestCase):
|
|
|
197
203
|
# Appwrite data reaches the DOM as text only.
|
|
198
204
|
self.assertNotIn("innerHTML", html)
|
|
199
205
|
self.assertNotIn("insertAdjacentHTML", html)
|
|
206
|
+
digest = hashlib.sha256(html.encode("utf-8")).hexdigest()[:12]
|
|
207
|
+
self.assertEqual(uri, f"{VIEW_URI}/{digest}")
|
|
208
|
+
|
|
209
|
+
# Tool lists cached before the URI was versioned still resolve.
|
|
210
|
+
_, response = self.host.call("resources/read", {"uri": VIEW_URI})
|
|
211
|
+
self.assertEqual(response["result"]["contents"][0]["text"], html)
|
|
200
212
|
|
|
201
213
|
def test_hosts_without_apps_are_not_offered_the_view(self):
|
|
202
214
|
with self.server.client() as plain:
|
|
@@ -205,7 +217,7 @@ class AppsFlow(unittest.TestCase):
|
|
|
205
217
|
self.assertNotIn("appwrite_view_write", listed)
|
|
206
218
|
_, response = plain.call("resources/list")
|
|
207
219
|
uris = {each["uri"] for each in response["result"]["resources"]}
|
|
208
|
-
self.
|
|
220
|
+
self.assertFalse(any(each.startswith(VIEW_URI) for each in uris))
|
|
209
221
|
|
|
210
222
|
# A 2025-era client on the stateless transport lists tools without a
|
|
211
223
|
# session, so its capabilities are unknown and the view is offered.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/.github/workflows/update-docs-index.yml
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
|
|
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
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/__init__.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/apps/protocol.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/__init__.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/favicon.svg
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/assets/view.html
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/catalog_policy.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/constants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_index.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_search.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/docs_source.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/error_monitoring.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/__init__.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/bus.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/catalog.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/delivery.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/egress.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/envelope.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/errors.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/ingress.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/projection.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/protocol.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/streams.py
RENAMED
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/events/webhooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/instructions.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/telemetry.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/src/mcp_server_appwrite/tool_manager.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
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/e2e/fixtures/appwrite/row_created.json
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
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_console_sdk_oauth.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_docs_index.py
RENAMED
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_docs_source.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/integration/test_oauth_discovery.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
|
{mcp_server_appwrite-2.1.1 → mcp_server_appwrite-2.1.2}/tests/unit/test_error_classification.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
|