mcp-server-appwrite 1.0.2__tar.gz → 1.0.4__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.
Files changed (84) hide show
  1. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/PKG-INFO +2 -2
  2. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/appwrite-mcp-flow.svg +1 -1
  3. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/tool-surface.md +3 -3
  4. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/pyproject.toml +1 -1
  5. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/catalog_policy.py +1 -0
  6. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/data/docs_index.npz +0 -0
  7. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_server.py +36 -2
  8. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/uv.lock +4 -4
  9. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.dockerignore +0 -0
  10. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.env.example +0 -0
  11. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.github/workflows/ci.yml +0 -0
  12. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.github/workflows/production.yml +0 -0
  13. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.github/workflows/publish.yml +0 -0
  14. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.github/workflows/staging.yml +0 -0
  15. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.github/workflows/update-docs-index.yml +0 -0
  16. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.gitignore +0 -0
  17. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/.python-version +0 -0
  18. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/AGENTS.md +0 -0
  19. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/CLAUDE.md +0 -0
  20. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/Dockerfile +0 -0
  21. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/LICENSE +0 -0
  22. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/README.md +0 -0
  23. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/compose.yaml +0 -0
  24. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/appwrite-mcp-flow.png +0 -0
  25. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/authentication.md +0 -0
  26. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/development.md +0 -0
  27. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/documentation-search.md +0 -0
  28. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/flags.md +0 -0
  29. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/images/claude-desktop-local-mcp-servers.png +0 -0
  30. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/images/codex-mcp.png +0 -0
  31. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/images/cursor-mcp.png +0 -0
  32. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/docs/self-hosted.md +0 -0
  33. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/glama.json +0 -0
  34. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/scripts/build_docs_index.py +0 -0
  35. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/scripts/docs_release_notes.py +0 -0
  36. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/scripts/render_server_json.py +0 -0
  37. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/server.template.json +0 -0
  38. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/__init__.py +0 -0
  39. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/__main__.py +0 -0
  40. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/assets/__init__.py +0 -0
  41. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/assets/favicon.svg +0 -0
  42. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/auth.py +0 -0
  43. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/constants.py +0 -0
  44. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/context.py +0 -0
  45. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/docs.py +0 -0
  46. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/docs_index.py +0 -0
  47. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/docs_search.py +0 -0
  48. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/docs_source.py +0 -0
  49. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/error_classification.py +0 -0
  50. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/error_monitoring.py +0 -0
  51. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/flags.py +0 -0
  52. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/http_app.py +0 -0
  53. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/operator.py +0 -0
  54. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/server.py +0 -0
  55. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/service.py +0 -0
  56. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/telemetry.py +0 -0
  57. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/src/mcp_server_appwrite/tool_manager.py +0 -0
  58. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/support.py +0 -0
  59. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_avatars.py +0 -0
  60. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_console_sdk_oauth.py +0 -0
  61. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_docs_index.py +0 -0
  62. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_docs_source.py +0 -0
  63. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_functions.py +0 -0
  64. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_locale.py +0 -0
  65. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_messaging.py +0 -0
  66. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_oauth_discovery.py +0 -0
  67. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_operator.py +0 -0
  68. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_sites.py +0 -0
  69. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_storage.py +0 -0
  70. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_tables_db.py +0 -0
  71. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_teams.py +0 -0
  72. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/integration/test_users.py +0 -0
  73. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/test_all.py +0 -0
  74. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_auth.py +0 -0
  75. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_context.py +0 -0
  76. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_docs.py +0 -0
  77. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_docs_search.py +0 -0
  78. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_error_classification.py +0 -0
  79. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_error_monitoring.py +0 -0
  80. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_http_app.py +0 -0
  81. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_operator.py +0 -0
  82. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_release_metadata.py +0 -0
  83. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_service.py +0 -0
  84. {mcp_server_appwrite-1.0.2 → mcp_server_appwrite-1.0.4}/tests/unit/test_telemetry.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: mcp-server-appwrite
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: MCP server for Appwrite: manage projects and their databases, auth, storage, functions, messaging, and sites, and search the official Appwrite documentation
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: anyio>=4.0.0
8
- Requires-Dist: appwrite-console<0.8,>=0.7.1
8
+ Requires-Dist: appwrite-console<0.9,>=0.8.1
9
9
  Requires-Dist: docstring-parser>=0.16
10
10
  Requires-Dist: httpx>=0.27.0
11
11
  Requires-Dist: mcp[cli]<3,>=2
@@ -115,7 +115,7 @@
115
115
  <text x="916" y="437" font-size="10.5" fill="#C9C9CD" text-anchor="middle" font-family="'SF Mono', ui-monospace, Menlo, monospace">search_docs</text>
116
116
 
117
117
  <rect x="664" y="462" width="332" height="60" rx="10" fill="none" stroke="#3A3A40" stroke-dasharray="5 4"/>
118
- <text x="682" y="488" font-size="11.5" fill="#A5A5AA">hosted catalog · 40 services · 1007 tools</text>
118
+ <text x="682" y="488" font-size="11.5" fill="#A5A5AA">hosted catalog · 41 services · 1016 tools</text>
119
119
  <text x="682" y="506" font-size="11.5" fill="#A5A5AA">writes need <tspan fill="#EDEDF0" font-size="11" font-family="'SF Mono', ui-monospace, Menlo, monospace">confirm_write: true</tspan></text>
120
120
 
121
121
  <!-- arrow 6 -->
@@ -20,7 +20,7 @@ flowchart LR
20
20
 
21
21
  subgraph CAT[Internal catalog — authentication-aware]
22
22
  direction LR
23
- K[OAuth: 40 services / 1007 tools<br/>API key: 26 services / 663 tools]
23
+ K[OAuth: 41 services / 1016 tools<br/>API key: 26 services / 663 tools]
24
24
  end
25
25
 
26
26
  CT -->|large output| R[(MCP resource<br/>preview + URI)]
@@ -47,8 +47,8 @@ flowchart LR
47
47
  `context=organization`, or `context=project`. Hosted calls enforce the required
48
48
  top-level `organization_id` or `project_id` before making a request.
49
49
  - **Access** is still gated per-route by the scopes granted to the OAuth token.
50
- - **Hosted OAuth** registers all 40 services and 1007 methods shipped by
51
- `appwrite-console` 0.7.0. This adds console control-plane services including
50
+ - **Hosted OAuth** registers all 41 services and 1016 methods shipped by
51
+ `appwrite-console` 0.8.1. This adds console control-plane services including
52
52
  projects, organizations, domains, migrations, dedicated databases, usage, VCS,
53
53
  vectors, WAF, notifications, and regions.
54
54
  - **API-key stdio** deliberately registers only the 663 project-key-compatible
@@ -6,7 +6,7 @@ readme = "README.md"
6
6
  requires-python = ">=3.12"
7
7
  dependencies = [
8
8
  "anyio>=4.0.0",
9
- "appwrite-console>=0.7.1,<0.8",
9
+ "appwrite-console>=0.8.1,<0.9",
10
10
  "docstring-parser>=0.16",
11
11
  "mcp[cli]>=2,<3",
12
12
  "python-dotenv>=1.0.1",
@@ -83,6 +83,7 @@ API_KEY_EXCLUDED_METHODS: dict[str, frozenset[str]] = {
83
83
  }
84
84
  ),
85
85
  "apps": frozenset({"delete_installation"}),
86
+ "avatars": frozenset({"delete_photo", "update_photo"}),
86
87
  "documents_db": frozenset(
87
88
  {
88
89
  "create_documents",
@@ -923,8 +923,8 @@ class ServerHelperTests(unittest.TestCase):
923
923
  {service.service_name for service in manager_a.services},
924
924
  set(SERVICE_CLASSES),
925
925
  )
926
- self.assertEqual(len(manager_a.services), 40)
927
- self.assertEqual(len(manager_a.get_all_tools()), 1007)
926
+ self.assertEqual(len(manager_a.services), 41)
927
+ self.assertEqual(len(manager_a.get_all_tools()), 1016)
928
928
 
929
929
  def test_console_sdk_0_7_surface(self):
930
930
  manager = register_services(object(), profile=OAUTH_PROFILE)
@@ -935,6 +935,8 @@ class ServerHelperTests(unittest.TestCase):
935
935
  self.assertIn("growth_create_conversation", tools)
936
936
  self.assertIn("organization_create_project_key", tools)
937
937
  self.assertIn("tables_db_create_cutover", tools)
938
+ self.assertIn("analytics_list_metrics", tools)
939
+ self.assertIn("avatars_update_photo", tools)
938
940
  for removed_tool in (
939
941
  "project_get_usage",
940
942
  "projects_list_dev_keys",
@@ -984,6 +986,35 @@ class ServerHelperTests(unittest.TestCase):
984
986
  ]
985
987
  self.assertIn("bun-1.4", build_runtime["enum"])
986
988
 
989
+ def test_console_sdk_accepts_null_billing_fields(self):
990
+ # Cloud returns null for these fields; earlier SDKs rejected the
991
+ # responses (Sentry MCP-1G/1S/1F/1P/1N/1W).
992
+ from appwrite_console.models.dedicated_database_restoration import (
993
+ DedicatedDatabaseRestoration,
994
+ )
995
+ from appwrite_console.models.invoice import Invoice
996
+ from appwrite_console.models.organization import Organization
997
+ from appwrite_console.models.payment_method import PaymentMethod
998
+ from pydantic import TypeAdapter
999
+
1000
+ cases = {
1001
+ Organization: ("paymentMethodId",),
1002
+ PaymentMethod: ("mandateId", "state", "lastError"),
1003
+ Invoice: ("clientSecret", "lastError"),
1004
+ DedicatedDatabaseRestoration: ("targetTime",),
1005
+ }
1006
+ for model, aliases in cases.items():
1007
+ fields = {
1008
+ field.alias or name: field for name, field in model.model_fields.items()
1009
+ }
1010
+ for alias in aliases:
1011
+ with self.subTest(model=model.__name__, field=alias):
1012
+ field = fields[alias]
1013
+ self.assertFalse(field.is_required())
1014
+ self.assertIsNone(
1015
+ TypeAdapter(field.annotation).validate_python(None)
1016
+ )
1017
+
987
1018
  def test_advisor_tools_are_project_scoped(self):
988
1019
  manager = register_services(object(), profile=OAUTH_PROFILE)
989
1020
  advisor_tools = {
@@ -1013,6 +1044,9 @@ class ServerHelperTests(unittest.TestCase):
1013
1044
  self.assertNotIn("organizations", service_names)
1014
1045
  self.assertNotIn("documents_db_list_operations", tool_names)
1015
1046
  self.assertNotIn("tables_db_create_cutover", tool_names)
1047
+ self.assertNotIn("avatars_update_photo", tool_names)
1048
+ self.assertNotIn("avatars_delete_photo", tool_names)
1049
+ self.assertNotIn("analytics", service_names)
1016
1050
  self.assertNotIn("growth", service_names)
1017
1051
  for method in (
1018
1052
  "create_ephemeral_project_key",
@@ -39,15 +39,15 @@ wheels = [
39
39
 
40
40
  [[package]]
41
41
  name = "appwrite-console"
42
- version = "0.7.1"
42
+ version = "0.8.1"
43
43
  source = { registry = "https://pypi.org/simple" }
44
44
  dependencies = [
45
45
  { name = "pydantic" },
46
46
  { name = "requests" },
47
47
  ]
48
- sdist = { url = "https://files.pythonhosted.org/packages/2f/0a/d1f4506b3dc54ecb55382aee503d249ebe58e9cf99b44167d5f640b3ecfd/appwrite_console-0.7.1.tar.gz", hash = "sha256:b62706c1497a47070797ecfb70fb3f8910706db9c54ad770a1eda79a962ee287", size = 320527, upload-time = "2026-10-01T19:17:01.769Z" }
48
+ sdist = { url = "https://files.pythonhosted.org/packages/02/b2/76bbf397aca3e8caaf52bd254dac54b85214fffd6d1a1d4dd40d353247dd/appwrite_console-0.8.1.tar.gz", hash = "sha256:1fbb764bb0c9e802f079019e375fe96f5a28e51553a4bce94246e7f18bf8cce5", size = 326599, upload-time = "2026-10-06T10:55:59.571Z" }
49
49
  wheels = [
50
- { url = "https://files.pythonhosted.org/packages/99/23/ae465cbc2f7a3e22a42793e4a77a52c0f2b26543fdc1eb01f81411b92fc1/appwrite_console-0.7.1-py3-none-any.whl", hash = "sha256:5b8b53a25dbc8b97080f006d5f71436738b6f312f519b8bc3c030a445e63423c", size = 554926, upload-time = "2026-10-01T19:17:00.369Z" },
50
+ { url = "https://files.pythonhosted.org/packages/65/c4/8001bfadd6f5af3fced6421a4b8651fe7b496cafd1fbe01777830d455c36/appwrite_console-0.8.1-py3-none-any.whl", hash = "sha256:c71ad412f932dffe0d244b78ed20368999be3ac6961719e8bd30069b56857768", size = 565106, upload-time = "2026-10-06T10:55:57.918Z" },
51
51
  ]
52
52
 
53
53
  [[package]]
@@ -694,7 +694,7 @@ dev = [
694
694
  [package.metadata]
695
695
  requires-dist = [
696
696
  { name = "anyio", specifier = ">=4.0.0" },
697
- { name = "appwrite-console", specifier = ">=0.7.1,<0.8" },
697
+ { name = "appwrite-console", specifier = ">=0.8.1,<0.9" },
698
698
  { name = "argon2-cffi", marker = "extra == 'integration'", specifier = ">=23.1.0" },
699
699
  { name = "bcrypt", marker = "extra == 'integration'", specifier = ">=4.1.2" },
700
700
  { name = "docstring-parser", specifier = ">=0.16" },