diff --git a/AGENTS.md b/AGENTS.md index 77b0ba2..97bbe2d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,9 +52,9 @@ needs no credentials. Dashboards live in the `dashboards` repo under `MCP/`. The server boots in a compact workflow: the client sees up to 4 tools (`appwrite_get_context`, `appwrite_search_tools`, `appwrite_call_tool`, and -optionally `appwrite_search_docs`), while the full OAuth Appwrite catalog (38 +optionally `appwrite_search_docs`), while the full OAuth Appwrite catalog (41 services) stays internal and is searched at runtime. API-key stdio uses a filtered -26-service catalog. Mutating hidden tools require +27-service catalog. Mutating hidden tools require `confirm_write=true`. Large outputs are stored as MCP resources and returned as a preview + resource URI. diff --git a/docs/appwrite-mcp-flow.svg b/docs/appwrite-mcp-flow.svg index bf83bf2..836315b 100644 --- a/docs/appwrite-mcp-flow.svg +++ b/docs/appwrite-mcp-flow.svg @@ -115,7 +115,7 @@ search_docs - hosted catalog · 41 services · 1016 tools + hosted catalog · 41 services · 1029 tools writes need confirm_write: true diff --git a/docs/self-hosted.md b/docs/self-hosted.md index d2ccc8f..0f5ada6 100644 --- a/docs/self-hosted.md +++ b/docs/self-hosted.md @@ -4,7 +4,7 @@ Running your own Appwrite instance? Run the MCP server locally over `stdio` and authenticate with a project API key instead of OAuth. The local API-key catalog is intentionally smaller than the hosted OAuth catalog: -it exposes 663 project-key-compatible methods across 26 services. DocumentsDB, +it exposes 689 project-key-compatible methods across 27 services. DocumentsDB, VectorsDB, and text embeddings are available, but console control-plane services such as organizations, domains, projects, billing, migrations, dedicated databases, usage administration, VCS administration, and WAF administration are diff --git a/docs/tool-surface.md b/docs/tool-surface.md index ec930e7..8459853 100644 --- a/docs/tool-surface.md +++ b/docs/tool-surface.md @@ -20,7 +20,7 @@ flowchart LR subgraph CAT[Internal catalog — authentication-aware] direction LR - K[OAuth: 41 services / 1016 tools
API key: 26 services / 663 tools] + K[OAuth: 41 services / 1029 tools
API key: 27 services / 689 tools] end CT -->|large output| R[(MCP resource
preview + URI)] @@ -47,12 +47,12 @@ flowchart LR `context=organization`, or `context=project`. Hosted calls enforce the required top-level `organization_id` or `project_id` before making a request. - **Access** is still gated per-route by the scopes granted to the OAuth token. -- **Hosted OAuth** registers all 41 services and 1016 methods shipped by - `appwrite-console` 0.8.1. This adds console control-plane services including +- **Hosted OAuth** registers all 41 services and 1029 methods shipped by + `appwrite-console` 0.12.0. This adds console control-plane services including projects, organizations, domains, migrations, dedicated databases, usage, VCS, vectors, WAF, notifications, and regions. -- **API-key stdio** deliberately registers only the 663 project-key-compatible - methods across 26 services. It includes the new DocumentsDB, VectorsDB, and +- **API-key stdio** deliberately registers only the 689 project-key-compatible + methods across 27 services. It includes the new DocumentsDB, VectorsDB, and text-embeddings APIs, while console administration methods remain hidden. - **Registration** remains SDK-driven, with the authentication profile policy applied while the internal catalog is built. diff --git a/pyproject.toml b/pyproject.toml index df3bd65..21f8529 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ readme = "README.md" requires-python = ">=3.12" dependencies = [ "anyio>=4.0.0", - "appwrite-console>=0.10.0,<0.11", + "appwrite-console>=0.12.0,<0.13", "docstring-parser>=0.16", "mcp[cli]>=2.3,<3", "python-dotenv>=1.0.1", diff --git a/tests/unit/test_server.py b/tests/unit/test_server.py index 4e5eec8..2ff5f53 100644 --- a/tests/unit/test_server.py +++ b/tests/unit/test_server.py @@ -957,7 +957,7 @@ def test_register_services_returns_fresh_manager(self): set(SERVICE_CLASSES), ) self.assertEqual(len(manager_a.services), 41) - self.assertEqual(len(manager_a.get_all_tools()), 1016) + self.assertEqual(len(manager_a.get_all_tools()), 1029) def test_console_sdk_0_7_surface(self): manager = register_services(object(), profile=OAUTH_PROFILE) @@ -1079,7 +1079,7 @@ def test_api_key_profile_only_advertises_server_capabilities(self): tool_names = {tool.name for tool in manager.get_all_tools()} self.assertEqual(len(manager.services), 27) - self.assertEqual(len(tool_names), 676) + self.assertEqual(len(tool_names), 689) self.assertIn("waf_list_rules", tool_names) self.assertIn("waf_create_deny_rule", tool_names) self.assertIn("avatars_get_photo", tool_names) diff --git a/uv.lock b/uv.lock index 4bca6b7..92c579a 100644 --- a/uv.lock +++ b/uv.lock @@ -39,15 +39,15 @@ wheels = [ [[package]] name = "appwrite-console" -version = "0.10.0" +version = "0.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fa/70/2dc934365d5f2962e9cc14939d1d1e3a2b3e53916ad8e16d47481a607d4d/appwrite_console-0.10.0.tar.gz", hash = "sha256:11d4d70651014a99613735060f45aa3e932c53186fba7d19a55491469fccc2cc", size = 326997, upload-time = "2026-10-08T15:03:12.059Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/f5/4197f42d80391b6cef115fdb528677f79d8a5417369345d98977b1fdfb2e/appwrite_console-0.12.0.tar.gz", hash = "sha256:d6e90c3d38ac626a04a1ca40d787215c739702fdbfb109db33f5ae37a4ec132a", size = 329956, upload-time = "2026-10-12T17:06:36.173Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/6e/b7c152003f1ea4b9332023b60a1045165ee9e50ed025fada194dfc594baa/appwrite_console-0.10.0-py3-none-any.whl", hash = "sha256:21b3ccf8811561827b1b0fd05b82c651dbbf7bff2d91d9b3e9da7d0f5011b86c", size = 565247, upload-time = "2026-10-08T15:03:10.509Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ad/bd7eabeab53ff663e5fcb13330c6918ebf6fa6934e9d30ee446e60796850/appwrite_console-0.12.0-py3-none-any.whl", hash = "sha256:c237fdee8f8492ab2e42754a85585f06effae69315efea1746d90c01536d94d9", size = 569953, upload-time = "2026-10-12T17:06:34.356Z" }, ] [[package]] @@ -737,7 +737,7 @@ e2e = [ [package.metadata] requires-dist = [ { name = "anyio", specifier = ">=4.0.0" }, - { name = "appwrite-console", specifier = ">=0.10.0,<0.11" }, + { name = "appwrite-console", specifier = ">=0.12.0,<0.13" }, { name = "argon2-cffi", marker = "extra == 'integration'", specifier = ">=23.1.0" }, { name = "bcrypt", marker = "extra == 'integration'", specifier = ">=4.1.2" }, { name = "cryptography", specifier = ">=44.0.0" },