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" },