├── .python-version ├── .env.example ├── images ├── appwrite-logo-darkbg.png ├── cursor-integration.png ├── vs-code-integration.png ├── windsurf-integration.png ├── appwrite-logo-lightbg.png └── claude-desktop-integration.png ├── src └── mcp_server_appwrite │ ├── __main__.py │ ├── __init__.py │ ├── tool_manager.py │ ├── service.py │ └── server.py ├── .gitignore ├── pyproject.toml ├── server.json ├── LICENSE ├── .github └── workflows │ └── publish.yml ├── README.md └── uv.lock /.python-version: -------------------------------------------------------------------------------- 1 | 3.13 2 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APPWRITE_API_KEY= 2 | APPWRITE_PROJECT_ID= 3 | APPWRITE_ENDPOINT= -------------------------------------------------------------------------------- /images/appwrite-logo-darkbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/appwrite-logo-darkbg.png -------------------------------------------------------------------------------- /images/cursor-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/cursor-integration.png -------------------------------------------------------------------------------- /images/vs-code-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/vs-code-integration.png -------------------------------------------------------------------------------- /images/windsurf-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/windsurf-integration.png -------------------------------------------------------------------------------- /images/appwrite-logo-lightbg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/appwrite-logo-lightbg.png -------------------------------------------------------------------------------- /src/mcp_server_appwrite/__main__.py: -------------------------------------------------------------------------------- 1 | from mcp_server_appwrite import main 2 | 3 | if __name__ == "__main__": 4 | main() -------------------------------------------------------------------------------- /images/claude-desktop-integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwrite/mcp-for-api/HEAD/images/claude-desktop-integration.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Python-generated files 2 | __pycache__/ 3 | *.py[oc] 4 | build/ 5 | dist/ 6 | wheels/ 7 | *.egg-info 8 | 9 | # Virtual environments 10 | .venv 11 | 12 | # VSCode 13 | .vscode 14 | 15 | .env -------------------------------------------------------------------------------- /src/mcp_server_appwrite/__init__.py: -------------------------------------------------------------------------------- 1 | from . import server 2 | import asyncio 3 | 4 | 5 | def main(): 6 | """Main entry point for the package.""" 7 | asyncio.run(server._run()) 8 | 9 | 10 | # Optionally expose other important items at package level 11 | __all__ = ["main", "server"] -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "mcp-server-appwrite" 3 | version = "0.2.8" 4 | description = "MCP (Model Context Protocol) server for Appwrite" 5 | readme = "README.md" 6 | requires-python = ">=3.12" 7 | dependencies = [ 8 | "appwrite>=13.4.1", 9 | "docstring-parser>=0.16", 10 | "mcp[cli]>=1.3.0", 11 | ] 12 | 13 | [project.scripts] 14 | mcp-server-appwrite = "mcp_server_appwrite.__main__:main" 15 | 16 | [build-system] 17 | requires = ["hatchling"] 18 | build-backend = "hatchling.build" 19 | -------------------------------------------------------------------------------- /server.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-16/server.schema.json", 3 | "name": "io.github.appwrite/mcp-for-api", 4 | "description": "MCP (Model Context Protocol) server for Appwrite", 5 | "version": "0.2.8", 6 | "repository": { 7 | "url": "https://github.com/appwrite/mcp-for-api", 8 | "source": "github" 9 | }, 10 | "packages": [ 11 | { 12 | "version": "0.2.8", 13 | "registryType": "pypi", 14 | "identifier": "mcp-server-appwrite", 15 | "transport": { 16 | "type": "stdio" 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/mcp_server_appwrite/tool_manager.py: -------------------------------------------------------------------------------- 1 | from typing import List, Dict 2 | from mcp.types import Tool 3 | from .service import Service 4 | 5 | class ToolManager: 6 | def __init__(self): 7 | self.services: List[Service] = [] 8 | self.tools_registry = {} 9 | 10 | def register_service(self, service: Service): 11 | """Register a new service and its tools""" 12 | self.services.append(service) 13 | self.tools_registry.update(service.list_tools()) 14 | 15 | def get_all_tools(self) -> List[Tool]: 16 | """Get all tool definitions""" 17 | return [tool_info["definition"] for tool_info in self.tools_registry.values()] 18 | 19 | def get_tool(self, name: str) -> Dict: 20 | """Get a specific tool by name""" 21 | return self.tools_registry.get(name) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Christy Jacob 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | 1. The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | 2. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish to PyPI 2 | on: 3 | release: 4 | types: [published] 5 | 6 | jobs: 7 | publish: 8 | name: Release build and publish 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Check out code 12 | uses: actions/checkout@v4 13 | 14 | - name: Set up Python 15 | uses: actions/setup-python@v5 16 | with: 17 | python-version: '3.12' 18 | 19 | - name: Install build dependencies 20 | run: | 21 | python -m pip install --upgrade pip 22 | pip install build twine 23 | 24 | - name: Build package 25 | run: python -m build 26 | 27 | - name: Publish to PyPI 28 | env: 29 | TWINE_USERNAME: __token__ 30 | TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} 31 | run: twine upload dist/* 32 | 33 | publish-mcp: 34 | name: Publish to MCP Registry 35 | runs-on: ubuntu-latest 36 | needs: publish 37 | permissions: 38 | id-token: write 39 | contents: read 40 | steps: 41 | - name: Check out code 42 | uses: actions/checkout@v4 43 | 44 | - name: Wait for PyPI propagation 45 | run: sleep 10 46 | 47 | - name: Install MCP Publisher 48 | run: | 49 | curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.1.0/mcp-publisher_1.1.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher 50 | chmod +x mcp-publisher 51 | 52 | - name: Login to MCP Registry 53 | run: ./mcp-publisher login github-oidc 54 | 55 | - name: Publish to MCP Registry 56 | run: ./mcp-publisher publish 57 | -------------------------------------------------------------------------------- /src/mcp_server_appwrite/service.py: -------------------------------------------------------------------------------- 1 | from typing import Any, get_type_hints, Dict, List, Optional, Union 2 | import inspect 3 | from mcp.types import Tool 4 | from docstring_parser import parse 5 | 6 | class Service(): 7 | """Base class for all Appwrite services""" 8 | 9 | def __init__(self, service_instance, service_name: str): 10 | self.service = service_instance 11 | self.service_name = service_name 12 | self._method_name_overrides = self.get_method_name_overrides() 13 | 14 | def get_method_name_overrides(self) -> Dict[str, str]: 15 | """ 16 | Override this method to provide method name mappings. 17 | Returns a dictionary where: 18 | - key: original method name 19 | - value: new method name to be used 20 | """ 21 | return {} 22 | 23 | def python_type_to_json_schema(self, py_type: Any) -> dict: 24 | """Converts Python type hints to JSON Schema types.""" 25 | type_mapping = { 26 | str: "string", 27 | int: "integer", 28 | float: "number", 29 | bool: "boolean", 30 | list: "array", 31 | dict: "object" 32 | } 33 | 34 | # Handle basic types 35 | if py_type in type_mapping: 36 | return {"type": type_mapping[py_type]} 37 | 38 | # Handle Optional types (Union[type, None]) 39 | if hasattr(py_type, "__origin__") and py_type.__origin__ is Union: 40 | args = getattr(py_type, "__args__", ()) 41 | if len(args) == 2 and args[1] is type(None): 42 | schema = self.python_type_to_json_schema(args[0]) 43 | return schema 44 | 45 | # Handle List, Dict, and other generic types 46 | if hasattr(py_type, "__origin__"): 47 | origin = py_type.__origin__ 48 | args = getattr(py_type, "__args__", ()) 49 | 50 | # Handle List[T] 51 | if origin is list or origin is List: 52 | if args: 53 | item_schema = self.python_type_to_json_schema(args[0]) 54 | return { 55 | "type": "array", 56 | "items": item_schema 57 | } 58 | return {"type": "array"} 59 | 60 | # Handle Dict[K, V] 61 | if origin is dict or origin is Dict: 62 | if len(args) >= 2: 63 | value_schema = self.python_type_to_json_schema(args[1]) 64 | return { 65 | "type": "object", 66 | "additionalProperties": value_schema 67 | } 68 | return {"type": "object"} 69 | 70 | # Default to string for unknown types 71 | return {"type": "string"} 72 | 73 | def list_tools(self) -> Dict[str, Dict]: 74 | """Lists all available tools for this service""" 75 | tools = {} 76 | 77 | for name, func in inspect.getmembers(self.service, predicate=inspect.ismethod): 78 | if name.startswith('_'): # Skip private methods 79 | continue 80 | 81 | original_func = func.__func__ 82 | 83 | # Skip if not from the service's module 84 | if original_func.__module__ != self.service.__class__.__module__: 85 | continue 86 | 87 | # Get the overridden name if it exists 88 | tool_name = self._method_name_overrides.get(name, f"{self.service_name}_{name}") 89 | 90 | docstring = parse(original_func.__doc__) 91 | signature = inspect.signature(original_func) 92 | type_hints = get_type_hints(original_func) 93 | 94 | properties = {} 95 | required = [] 96 | 97 | for param_name, param in signature.parameters.items(): 98 | if param_name == 'self': 99 | continue 100 | 101 | param_type = type_hints.get(param_name, str) 102 | properties[param_name] = self.python_type_to_json_schema(param_type) 103 | properties[param_name]["description"] = f"Parameter '{param_name}'" 104 | 105 | for doc_param in docstring.params: 106 | if doc_param.arg_name == param_name: 107 | properties[param_name]["description"] = doc_param.description 108 | 109 | if param.default is param.empty: 110 | required.append(param_name) 111 | 112 | tool_definition = Tool( 113 | name=tool_name, 114 | description=f"{docstring.short_description or "No description available"}", 115 | inputSchema={ 116 | "type": "object", 117 | "properties": properties, 118 | "required": required 119 | } 120 | ) 121 | 122 | tools[tool_name] = { 123 | "definition": tool_definition, 124 | "function": func 125 | } 126 | 127 | return tools -------------------------------------------------------------------------------- /src/mcp_server_appwrite/server.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | import asyncio 3 | import os 4 | import argparse 5 | import mcp.server.stdio 6 | import mcp.types as types 7 | from mcp.server import NotificationOptions, Server 8 | from mcp.server.models import InitializationOptions 9 | from mcp.shared.exceptions import McpError 10 | from dotenv import load_dotenv 11 | from appwrite.client import Client 12 | from appwrite.services.databases import Databases 13 | from appwrite.services.tables_db import TablesDB 14 | from appwrite.services.users import Users 15 | from appwrite.services.teams import Teams 16 | from appwrite.services.storage import Storage 17 | from appwrite.services.functions import Functions 18 | from appwrite.services.locale import Locale 19 | from appwrite.services.avatars import Avatars 20 | from appwrite.services.messaging import Messaging 21 | from appwrite.services.sites import Sites 22 | from appwrite.exception import AppwriteException 23 | from .tool_manager import ToolManager 24 | from .service import Service 25 | 26 | def parse_args(): 27 | parser = argparse.ArgumentParser(description='Appwrite MCP Server') 28 | parser.add_argument('--tables-db', action='store_true', help='Enable TablesDB service') 29 | parser.add_argument('--users', action='store_true', help='Enable Users service') 30 | parser.add_argument('--teams', action='store_true', help='Enable Teams service') 31 | parser.add_argument('--storage', action='store_true', help='Enable Storage service') 32 | parser.add_argument('--functions', action='store_true', help='Enable Functions service') 33 | parser.add_argument('--messaging', action='store_true', help='Enable Messaging service') 34 | parser.add_argument('--locale', action='store_true', help='Enable Locale service') 35 | parser.add_argument('--avatars', action='store_true', help='Enable Avatars service') 36 | parser.add_argument('--sites', action='store_true', help='Enable Sites service') 37 | parser.add_argument('--databases', action='store_true', help='Enable Legacy Databases service') 38 | parser.add_argument('--all', action='store_true', help='Enable all services') 39 | return parser.parse_args() 40 | 41 | # Load environment variables from .env file 42 | load_dotenv() 43 | 44 | # Get environment variables 45 | project_id = os.getenv('APPWRITE_PROJECT_ID') 46 | api_key = os.getenv('APPWRITE_API_KEY') 47 | endpoint = os.getenv('APPWRITE_ENDPOINT', 'https://cloud.appwrite.io/v1') 48 | 49 | if not project_id or not api_key: 50 | raise ValueError("APPWRITE_PROJECT_ID and APPWRITE_API_KEY must be set in environment variables") 51 | 52 | # Initialize Appwrite client 53 | client = Client() 54 | client.set_endpoint(endpoint) 55 | client.set_project(project_id) 56 | client.set_key(api_key) 57 | client.add_header('x-sdk-name', 'mcp') 58 | 59 | # Initialize tools manager 60 | tools_manager = ToolManager() 61 | 62 | def register_services(args): 63 | # If --all is specified, enable all services 64 | if args.all: 65 | args.tables_db = args.users = args.teams = args.storage = True 66 | args.functions = args.messaging = args.locale = args.avatars = True 67 | args.sites = True 68 | 69 | # Register services based on CLI arguments 70 | if args.tables_db: 71 | tools_manager.register_service(Service(TablesDB(client), "tables_db")) 72 | if args.users: 73 | tools_manager.register_service(Service(Users(client), "users")) 74 | if args.teams: 75 | tools_manager.register_service(Service(Teams(client), "teams")) 76 | if args.storage: 77 | tools_manager.register_service(Service(Storage(client), "storage")) 78 | if args.functions: 79 | tools_manager.register_service(Service(Functions(client), "functions")) 80 | if args.messaging: 81 | tools_manager.register_service(Service(Messaging(client), "messaging")) 82 | if args.locale: 83 | tools_manager.register_service(Service(Locale(client), "locale")) 84 | if args.avatars: 85 | tools_manager.register_service(Service(Avatars(client), "avatars")) 86 | if args.sites: 87 | tools_manager.register_service(Service(Sites(client), "sites")) 88 | if args.databases: 89 | tools_manager.register_service(Service(Databases(client), "databases")) 90 | 91 | # If no services were specified, enable tables_db by default 92 | if not any([args.databases, args.tables_db, args.users, args.teams, args.storage, 93 | args.functions, args.messaging, args.locale, args.avatars, args.sites]): 94 | tools_manager.register_service(Service(TablesDB(client), "tables_db")) 95 | 96 | async def serve() -> Server: 97 | server = Server("Appwrite MCP Server") 98 | 99 | @server.list_tools() 100 | async def handle_list_tools() -> list[types.Tool]: 101 | return tools_manager.get_all_tools() 102 | 103 | @server.call_tool() 104 | async def handle_call_tool( 105 | name: str, arguments: dict | None 106 | ) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]: 107 | 108 | try: 109 | tool_info = tools_manager.get_tool(name) 110 | if not tool_info: 111 | raise McpError(f"Tool {name} not found") 112 | 113 | bound_method = tool_info["function"] 114 | result = bound_method(**(arguments or {})) 115 | if hasattr(result, 'to_dict'): 116 | result_dict = result.to_dict() 117 | return [types.TextContent(type="text", text=str(result_dict))] 118 | return [types.TextContent(type="text", text=str(result))] 119 | except AppwriteException as e: 120 | return [types.TextContent(type="text", text=f"Appwrite Error: {str(e)}")] 121 | except Exception as e: 122 | return [types.TextContent(type="text", text=f"Error: {str(e)}")] 123 | 124 | return server 125 | 126 | async def _run(): 127 | args = parse_args() 128 | register_services(args) 129 | 130 | async with mcp.server.stdio.stdio_server() as (read_stream, write_stream): 131 | server = await serve() 132 | await server.run( 133 | read_stream, 134 | write_stream, 135 | InitializationOptions( 136 | server_name="appwrite", 137 | server_version="0.2.8", 138 | capabilities=server.get_capabilities( 139 | notification_options=NotificationOptions(), 140 | experimental_capabilities={}, 141 | ), 142 | ), 143 | ) 144 | 145 | if __name__ == "__main__": 146 | asyncio.run(_run()) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Appwrite MCP server 2 | 3 | mcp-name: io.github.appwrite/mcp-for-api 4 | 5 | [![Install MCP Server](https://cursor.com/deeplink/mcp-install-light.svg)](https://cursor.com/install-mcp?name=appwrite&config=eyJjb21tYW5kIjoidXZ4IG1jcC1zZXJ2ZXItYXBwd3JpdGUgLS11c2VycyIsImVudiI6eyJBUFBXUklURV9BUElfS0VZIjoiPHlvdXItYXBpLWtleT4iLCJBUFBXUklURV9QUk9KRUNUX0lEIjoiPHlvdXItcHJvamVjdC1pZD4iLCJBUFBXUklURV9FTkRQT0lOVCI6Imh0dHBzOi8vPFJFR0lPTj4uY2xvdWQuYXBwd3JpdGUuaW8vdjEifX0%3D) 6 | 7 | ## Overview 8 | 9 | A Model Context Protocol server for interacting with Appwrite's API. This server provides tools to manage databases, users, functions, teams, and more within your Appwrite project. 10 | 11 | ## Quick Links 12 | - [Configuration](#configuration) 13 | - [Installation](#installation) 14 | - IDE Integration: 15 | - [Claude Desktop](#usage-with-claude-desktop) 16 | - [Cursor](#usage-with-cursor) 17 | - [Windsurf Editor](#usage-with-windsurf-editor) 18 | - [VS Code](#usage-with-vs-code) 19 | - [Local Development](#local-development) 20 | - [Debugging](#debugging) 21 | 22 | ## Configuration 23 | 24 | > Before launching the MCP server, you must setup an [Appwrite project](https://cloud.appwrite.io/) and create an API key with the necessary scopes enabled. 25 | 26 | Create a `.env` file in your working directory and add the following: 27 | 28 | ```env 29 | APPWRITE_PROJECT_ID=your-project-id 30 | APPWRITE_API_KEY=your-api-key 31 | APPWRITE_ENDPOINT=https://.cloud.appwrite.io/v1 32 | ``` 33 | 34 | Then, open your terminal and run the following command 35 | 36 | ### Linux and MacOS 37 | 38 | ```sh 39 | source .env 40 | ``` 41 | 42 | ### Windows 43 | 44 | #### Command Prompt 45 | 46 | ```cmd 47 | for /f "tokens=1,2 delims==" %A in (.env) do set %A=%B 48 | ``` 49 | 50 | #### PowerShell 51 | 52 | ```powershell 53 | Get-Content .\.env | ForEach-Object { 54 | if ($_ -match '^(.*?)=(.*)$') { 55 | [System.Environment]::SetEnvironmentVariable($matches[1], $matches[2], "Process") 56 | } 57 | } 58 | ``` 59 | 60 | ## Installation 61 | 62 | ### Using uv (recommended) 63 | When using [`uv`](https://docs.astral.sh/uv/) no specific installation is needed. We will 64 | use [`uvx`](https://docs.astral.sh/uv/guides/tools/) to directly run *mcp-server-appwrite*. 65 | 66 | ```bash 67 | uvx mcp-server-appwrite [args] 68 | ``` 69 | 70 | ### Using pip 71 | 72 | ```bash 73 | pip install mcp-server-appwrite 74 | ``` 75 | Then run the server using 76 | 77 | ```bash 78 | python -m mcp_server_appwrite [args] 79 | ``` 80 | 81 | ### Command-line arguments 82 | 83 | Both the `uv` and `pip` setup processes require certain arguments to enable MCP tools for various Appwrite APIs. 84 | 85 | > When an MCP tool is enabled, the tool's definition is passed to the LLM, using up tokens from the model's available context window. As a result, the effective context window is reduced. 86 | > 87 | > The default Appwrite MCP server ships with only the Databases tools (our most commonly used API) enabled to stay within these limits. Additional tools can be enabled by using the flags below. 88 | 89 | | Argument | Description | 90 | | --- | --- | 91 | | `--tables-db` | Enables the TablesDB API | 92 | | `--users` | Enables the Users API | 93 | | `--teams` | Enables the Teams API | 94 | | `--storage` | Enables the Storage API | 95 | | `--functions` | Enables the Functions API | 96 | | `--messaging` | Enables the Messaging API | 97 | | `--locale` | Enables the Locale API | 98 | | `--avatars` | Enables the Avatars API | 99 | | `--sites` | Enables the Sites API | 100 | | `--all` | Enables all Appwrite APIs | 101 | | `--databases` | Enables the Legacy Databases API | 102 | 103 | ## Usage with Claude Desktop 104 | 105 | In the Claude Desktop app, open the app's **Settings** page (press `CTRL + ,` on Windows or `CMD + ,` on MacOS) and head to the **Developer** tab. Clicking on the **Edit Config** button will take you to the `claude_desktop_config.json` file, where you must add the following: 106 | 107 | ```json 108 | { 109 | "mcpServers": { 110 | "appwrite": { 111 | "command": "uvx", 112 | "args": [ 113 | "mcp-server-appwrite" 114 | ], 115 | "env": { 116 | "APPWRITE_PROJECT_ID": "", 117 | "APPWRITE_API_KEY": "", 118 | "APPWRITE_ENDPOINT": "https://.cloud.appwrite.io/v1" // Optional 119 | } 120 | } 121 | } 122 | } 123 | 124 | ``` 125 | 126 | > Note: In case you see a `uvx ENOENT` error, ensure that you either add `uvx` to the `PATH` environment variable on your system or use the full path to your `uvx` installation in the config file. 127 | 128 | Upon successful configuration, you should be able to see the server in the list of available servers in Claude Desktop. 129 | 130 | ![Claude Desktop Config](images/claude-desktop-integration.png) 131 | 132 | ## Usage with [Cursor](https://www.cursor.com/) 133 | 134 | Head to Cursor `Settings > MCP` and click on **Add new MCP server**. Choose the type as `Command` and add the command below to the **Command** field. 135 | 136 | - **MacOS** 137 | 138 | ```bash 139 | env APPWRITE_API_KEY=your-api-key env APPWRITE_PROJECT_ID=your-project-id uvx mcp-server-appwrite 140 | ``` 141 | 142 | - **Windows** 143 | 144 | ```cmd 145 | cmd /c SET APPWRITE_PROJECT_ID=your-project-id && SET APPWRITE_API_KEY=your-api-key && uvx mcp-server-appwrite 146 | ``` 147 | 148 | ![Cursor Settings](./images/cursor-integration.png) 149 | 150 | ## Usage with [Windsurf Editor](https://codeium.com/windsurf) 151 | 152 | Head to Windsurf `Settings > Cascade > Model Context Protocol (MCP) Servers` and click on **View raw config**. Update the `mcp_config.json` file to include the following: 153 | 154 | ```json 155 | { 156 | "mcpServers": { 157 | "appwrite": { 158 | "command": "uvx", 159 | "args": [ 160 | "mcp-server-appwrite" 161 | ], 162 | "env": { 163 | "APPWRITE_PROJECT_ID": "", 164 | "APPWRITE_API_KEY": "", 165 | "APPWRITE_ENDPOINT": "https://.cloud.appwrite.io/v1" // Optional 166 | } 167 | } 168 | } 169 | } 170 | ``` 171 | 172 | ![Windsurf Settings](./images/windsurf-integration.png) 173 | 174 | ## Usage with [VS Code](https://code.visualstudio.com/) 175 | 176 | ### Configuration 177 | 178 | 1. **Update the MCP configuration file**: Open the Command Palette (`Ctrl+Shift+P` or `Cmd+Shift+P`) and run `MCP: Open User Configuration`. It should open the `mcp.json` file in your user settings. 179 | 180 | 2. **Add the Appwrite MCP server configuration**: Add the following to the `mcp.json` file: 181 | 182 | ```json 183 | { 184 | "servers": { 185 | "appwrite": { 186 | "command": "uvx", 187 | "args": ["mcp-server-appwrite", "--users"], 188 | "env": { 189 | "APPWRITE_PROJECT_ID": "", 190 | "APPWRITE_API_KEY": "", 191 | "APPWRITE_ENDPOINT": "https://.cloud.appwrite.io/v1" 192 | } 193 | } 194 | } 195 | } 196 | ``` 197 | 198 | 3. **Start the MCP server**: Open the Command Palette (`Ctrl+Shift+P` or `Cmd+Shift+P`) and run `MCP: List Servers`. In the dropdown, select `appwrite` and click on the **Start Server** button. 199 | 200 | 4. **Use in Copilot Chat**: Open Copilot Chat and switch to **Agent Mode** to access the Appwrite tools. 201 | 202 | ![VS Code Settings](./images/vs-code-integration.png) 203 | 204 | ## Local Development 205 | 206 | ### Clone the repository 207 | 208 | ```bash 209 | git clone https://github.com/appwrite/mcp.git 210 | ``` 211 | 212 | ### Install `uv` 213 | 214 | - Linux or MacOS 215 | 216 | ```bash 217 | curl -LsSf https://astral.sh/uv/install.sh | sh 218 | ``` 219 | 220 | - Windows (PowerShell) 221 | 222 | ```powershell 223 | powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" 224 | ``` 225 | 226 | ### Prepare virtual environment 227 | 228 | First, create a virtual environment. 229 | 230 | ```bash 231 | uv venv 232 | ``` 233 | 234 | Next, activate the virtual environment. 235 | 236 | - Linux or MacOS 237 | 238 | ```bash 239 | source .venv/bin/activate 240 | ``` 241 | 242 | - Windows 243 | 244 | ```powershell 245 | .venv\Scripts\activate 246 | ``` 247 | 248 | ### Run the server 249 | 250 | ```bash 251 | uv run -v --directory ./ mcp-server-appwrite 252 | ``` 253 | 254 | ## Debugging 255 | 256 | You can use the MCP inspector to debug the server. 257 | 258 | ```bash 259 | npx @modelcontextprotocol/inspector \ 260 | uv \ 261 | --directory . \ 262 | run mcp-server-appwrite 263 | ``` 264 | 265 | Make sure your `.env` file is properly configured before running the inspector. You can then access the inspector at `http://localhost:5173`. 266 | 267 | ## License 268 | 269 | This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository. 270 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 3 3 | requires-python = ">=3.12" 4 | 5 | [[package]] 6 | name = "annotated-types" 7 | version = "0.7.0" 8 | source = { registry = "https://pypi.org/simple" } 9 | sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } 10 | wheels = [ 11 | { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, 12 | ] 13 | 14 | [[package]] 15 | name = "anyio" 16 | version = "4.8.0" 17 | source = { registry = "https://pypi.org/simple" } 18 | dependencies = [ 19 | { name = "idna" }, 20 | { name = "sniffio" }, 21 | { name = "typing-extensions", marker = "python_full_version < '3.13'" }, 22 | ] 23 | sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126, upload-time = "2025-01-05T13:13:11.095Z" } 24 | wheels = [ 25 | { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041, upload-time = "2025-01-05T13:13:07.985Z" }, 26 | ] 27 | 28 | [[package]] 29 | name = "appwrite" 30 | version = "13.4.1" 31 | source = { registry = "https://pypi.org/simple" } 32 | dependencies = [ 33 | { name = "requests" }, 34 | ] 35 | sdist = { url = "https://files.pythonhosted.org/packages/30/bc/c8e9671e00fc2feda1acc5b457e8f0277e5d44dc636d0c0e990167b470d6/appwrite-13.4.1.tar.gz", hash = "sha256:f6725133b57837f962970c6f665713ca430e2c12b5cd231f355612251cf168fd", size = 62458, upload-time = "2025-10-09T11:07:05.131Z" } 36 | wheels = [ 37 | { url = "https://files.pythonhosted.org/packages/ae/7a/990c43b44bc5c0abe6d4ccf2dd46232e17133043e77ebed99a43a0f0be4c/appwrite-13.4.1-py3-none-any.whl", hash = "sha256:0a6abca5120a9fa1ca0423a9e476c4e7edbb43c524970d5b8eff36aa66a92eec", size = 78976, upload-time = "2025-10-09T11:07:03.819Z" }, 38 | ] 39 | 40 | [[package]] 41 | name = "certifi" 42 | version = "2025.1.31" 43 | source = { registry = "https://pypi.org/simple" } 44 | sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577, upload-time = "2025-01-31T02:16:47.166Z" } 45 | wheels = [ 46 | { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393, upload-time = "2025-01-31T02:16:45.015Z" }, 47 | ] 48 | 49 | [[package]] 50 | name = "charset-normalizer" 51 | version = "3.4.1" 52 | source = { registry = "https://pypi.org/simple" } 53 | sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188, upload-time = "2024-12-24T18:12:35.43Z" } 54 | wheels = [ 55 | { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105, upload-time = "2024-12-24T18:10:38.83Z" }, 56 | { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404, upload-time = "2024-12-24T18:10:44.272Z" }, 57 | { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423, upload-time = "2024-12-24T18:10:45.492Z" }, 58 | { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184, upload-time = "2024-12-24T18:10:47.898Z" }, 59 | { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268, upload-time = "2024-12-24T18:10:50.589Z" }, 60 | { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601, upload-time = "2024-12-24T18:10:52.541Z" }, 61 | { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098, upload-time = "2024-12-24T18:10:53.789Z" }, 62 | { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520, upload-time = "2024-12-24T18:10:55.048Z" }, 63 | { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852, upload-time = "2024-12-24T18:10:57.647Z" }, 64 | { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488, upload-time = "2024-12-24T18:10:59.43Z" }, 65 | { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192, upload-time = "2024-12-24T18:11:00.676Z" }, 66 | { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550, upload-time = "2024-12-24T18:11:01.952Z" }, 67 | { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785, upload-time = "2024-12-24T18:11:03.142Z" }, 68 | { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698, upload-time = "2024-12-24T18:11:05.834Z" }, 69 | { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162, upload-time = "2024-12-24T18:11:07.064Z" }, 70 | { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263, upload-time = "2024-12-24T18:11:08.374Z" }, 71 | { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966, upload-time = "2024-12-24T18:11:09.831Z" }, 72 | { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992, upload-time = "2024-12-24T18:11:12.03Z" }, 73 | { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162, upload-time = "2024-12-24T18:11:13.372Z" }, 74 | { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972, upload-time = "2024-12-24T18:11:14.628Z" }, 75 | { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095, upload-time = "2024-12-24T18:11:17.672Z" }, 76 | { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668, upload-time = "2024-12-24T18:11:18.989Z" }, 77 | { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073, upload-time = "2024-12-24T18:11:21.507Z" }, 78 | { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732, upload-time = "2024-12-24T18:11:22.774Z" }, 79 | { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391, upload-time = "2024-12-24T18:11:24.139Z" }, 80 | { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702, upload-time = "2024-12-24T18:11:26.535Z" }, 81 | { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767, upload-time = "2024-12-24T18:12:32.852Z" }, 82 | ] 83 | 84 | [[package]] 85 | name = "click" 86 | version = "8.1.8" 87 | source = { registry = "https://pypi.org/simple" } 88 | dependencies = [ 89 | { name = "colorama", marker = "sys_platform == 'win32'" }, 90 | ] 91 | sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } 92 | wheels = [ 93 | { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, 94 | ] 95 | 96 | [[package]] 97 | name = "colorama" 98 | version = "0.4.6" 99 | source = { registry = "https://pypi.org/simple" } 100 | sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } 101 | wheels = [ 102 | { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, 103 | ] 104 | 105 | [[package]] 106 | name = "docstring-parser" 107 | version = "0.16" 108 | source = { registry = "https://pypi.org/simple" } 109 | sdist = { url = "https://files.pythonhosted.org/packages/08/12/9c22a58c0b1e29271051222d8906257616da84135af9ed167c9e28f85cb3/docstring_parser-0.16.tar.gz", hash = "sha256:538beabd0af1e2db0146b6bd3caa526c35a34d61af9fd2887f3a8a27a739aa6e", size = 26565, upload-time = "2024-03-15T10:39:44.419Z" } 110 | wheels = [ 111 | { url = "https://files.pythonhosted.org/packages/d5/7c/e9fcff7623954d86bdc17782036cbf715ecab1bec4847c008557affe1ca8/docstring_parser-0.16-py3-none-any.whl", hash = "sha256:bf0a1387354d3691d102edef7ec124f219ef639982d096e26e3b60aeffa90637", size = 36533, upload-time = "2024-03-15T10:39:41.527Z" }, 112 | ] 113 | 114 | [[package]] 115 | name = "h11" 116 | version = "0.14.0" 117 | source = { registry = "https://pypi.org/simple" } 118 | sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418, upload-time = "2022-09-25T15:40:01.519Z" } 119 | wheels = [ 120 | { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259, upload-time = "2022-09-25T15:39:59.68Z" }, 121 | ] 122 | 123 | [[package]] 124 | name = "httpcore" 125 | version = "1.0.7" 126 | source = { registry = "https://pypi.org/simple" } 127 | dependencies = [ 128 | { name = "certifi" }, 129 | { name = "h11" }, 130 | ] 131 | sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196, upload-time = "2024-11-15T12:30:47.531Z" } 132 | wheels = [ 133 | { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551, upload-time = "2024-11-15T12:30:45.782Z" }, 134 | ] 135 | 136 | [[package]] 137 | name = "httpx" 138 | version = "0.28.1" 139 | source = { registry = "https://pypi.org/simple" } 140 | dependencies = [ 141 | { name = "anyio" }, 142 | { name = "certifi" }, 143 | { name = "httpcore" }, 144 | { name = "idna" }, 145 | ] 146 | sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } 147 | wheels = [ 148 | { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, 149 | ] 150 | 151 | [[package]] 152 | name = "httpx-sse" 153 | version = "0.4.0" 154 | source = { registry = "https://pypi.org/simple" } 155 | sdist = { url = "https://files.pythonhosted.org/packages/4c/60/8f4281fa9bbf3c8034fd54c0e7412e66edbab6bc74c4996bd616f8d0406e/httpx-sse-0.4.0.tar.gz", hash = "sha256:1e81a3a3070ce322add1d3529ed42eb5f70817f45ed6ec915ab753f961139721", size = 12624, upload-time = "2023-12-22T08:01:21.083Z" } 156 | wheels = [ 157 | { url = "https://files.pythonhosted.org/packages/e1/9b/a181f281f65d776426002f330c31849b86b31fc9d848db62e16f03ff739f/httpx_sse-0.4.0-py3-none-any.whl", hash = "sha256:f329af6eae57eaa2bdfd962b42524764af68075ea87370a2de920af5341e318f", size = 7819, upload-time = "2023-12-22T08:01:19.89Z" }, 158 | ] 159 | 160 | [[package]] 161 | name = "idna" 162 | version = "3.10" 163 | source = { registry = "https://pypi.org/simple" } 164 | sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } 165 | wheels = [ 166 | { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, 167 | ] 168 | 169 | [[package]] 170 | name = "markdown-it-py" 171 | version = "3.0.0" 172 | source = { registry = "https://pypi.org/simple" } 173 | dependencies = [ 174 | { name = "mdurl" }, 175 | ] 176 | sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } 177 | wheels = [ 178 | { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, 179 | ] 180 | 181 | [[package]] 182 | name = "mcp" 183 | version = "1.3.0" 184 | source = { registry = "https://pypi.org/simple" } 185 | dependencies = [ 186 | { name = "anyio" }, 187 | { name = "httpx" }, 188 | { name = "httpx-sse" }, 189 | { name = "pydantic" }, 190 | { name = "pydantic-settings" }, 191 | { name = "sse-starlette" }, 192 | { name = "starlette" }, 193 | { name = "uvicorn" }, 194 | ] 195 | sdist = { url = "https://files.pythonhosted.org/packages/6b/b6/81e5f2490290351fc97bf46c24ff935128cb7d34d68e3987b522f26f7ada/mcp-1.3.0.tar.gz", hash = "sha256:f409ae4482ce9d53e7ac03f3f7808bcab735bdfc0fba937453782efb43882d45", size = 150235, upload-time = "2025-02-20T21:45:42.597Z" } 196 | wheels = [ 197 | { url = "https://files.pythonhosted.org/packages/d0/d2/a9e87b506b2094f5aa9becc1af5178842701b27217fa43877353da2577e3/mcp-1.3.0-py3-none-any.whl", hash = "sha256:2829d67ce339a249f803f22eba5e90385eafcac45c94b00cab6cef7e8f217211", size = 70672, upload-time = "2025-02-20T21:45:40.102Z" }, 198 | ] 199 | 200 | [package.optional-dependencies] 201 | cli = [ 202 | { name = "python-dotenv" }, 203 | { name = "typer" }, 204 | ] 205 | 206 | [[package]] 207 | name = "mcp-server-appwrite" 208 | version = "0.2.8" 209 | source = { editable = "." } 210 | dependencies = [ 211 | { name = "appwrite" }, 212 | { name = "docstring-parser" }, 213 | { name = "mcp", extra = ["cli"] }, 214 | ] 215 | 216 | [package.metadata] 217 | requires-dist = [ 218 | { name = "appwrite", specifier = ">=13.4.1" }, 219 | { name = "docstring-parser", specifier = ">=0.16" }, 220 | { name = "mcp", extras = ["cli"], specifier = ">=1.3.0" }, 221 | ] 222 | 223 | [[package]] 224 | name = "mdurl" 225 | version = "0.1.2" 226 | source = { registry = "https://pypi.org/simple" } 227 | sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } 228 | wheels = [ 229 | { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, 230 | ] 231 | 232 | [[package]] 233 | name = "pydantic" 234 | version = "2.10.6" 235 | source = { registry = "https://pypi.org/simple" } 236 | dependencies = [ 237 | { name = "annotated-types" }, 238 | { name = "pydantic-core" }, 239 | { name = "typing-extensions" }, 240 | ] 241 | sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681, upload-time = "2025-01-24T01:42:12.693Z" } 242 | wheels = [ 243 | { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696, upload-time = "2025-01-24T01:42:10.371Z" }, 244 | ] 245 | 246 | [[package]] 247 | name = "pydantic-core" 248 | version = "2.27.2" 249 | source = { registry = "https://pypi.org/simple" } 250 | dependencies = [ 251 | { name = "typing-extensions" }, 252 | ] 253 | sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443, upload-time = "2024-12-18T11:31:54.917Z" } 254 | wheels = [ 255 | { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127, upload-time = "2024-12-18T11:28:30.346Z" }, 256 | { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340, upload-time = "2024-12-18T11:28:32.521Z" }, 257 | { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900, upload-time = "2024-12-18T11:28:34.507Z" }, 258 | { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177, upload-time = "2024-12-18T11:28:36.488Z" }, 259 | { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046, upload-time = "2024-12-18T11:28:39.409Z" }, 260 | { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386, upload-time = "2024-12-18T11:28:41.221Z" }, 261 | { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060, upload-time = "2024-12-18T11:28:44.709Z" }, 262 | { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870, upload-time = "2024-12-18T11:28:46.839Z" }, 263 | { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822, upload-time = "2024-12-18T11:28:48.896Z" }, 264 | { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364, upload-time = "2024-12-18T11:28:50.755Z" }, 265 | { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303, upload-time = "2024-12-18T11:28:54.122Z" }, 266 | { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064, upload-time = "2024-12-18T11:28:56.074Z" }, 267 | { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046, upload-time = "2024-12-18T11:28:58.107Z" }, 268 | { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092, upload-time = "2024-12-18T11:29:01.335Z" }, 269 | { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709, upload-time = "2024-12-18T11:29:03.193Z" }, 270 | { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273, upload-time = "2024-12-18T11:29:05.306Z" }, 271 | { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027, upload-time = "2024-12-18T11:29:07.294Z" }, 272 | { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888, upload-time = "2024-12-18T11:29:09.249Z" }, 273 | { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738, upload-time = "2024-12-18T11:29:11.23Z" }, 274 | { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138, upload-time = "2024-12-18T11:29:16.396Z" }, 275 | { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025, upload-time = "2024-12-18T11:29:20.25Z" }, 276 | { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633, upload-time = "2024-12-18T11:29:23.877Z" }, 277 | { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404, upload-time = "2024-12-18T11:29:25.872Z" }, 278 | { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130, upload-time = "2024-12-18T11:29:29.252Z" }, 279 | { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946, upload-time = "2024-12-18T11:29:31.338Z" }, 280 | { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387, upload-time = "2024-12-18T11:29:33.481Z" }, 281 | { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453, upload-time = "2024-12-18T11:29:35.533Z" }, 282 | { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186, upload-time = "2024-12-18T11:29:37.649Z" }, 283 | ] 284 | 285 | [[package]] 286 | name = "pydantic-settings" 287 | version = "2.8.0" 288 | source = { registry = "https://pypi.org/simple" } 289 | dependencies = [ 290 | { name = "pydantic" }, 291 | { name = "python-dotenv" }, 292 | ] 293 | sdist = { url = "https://files.pythonhosted.org/packages/ca/a2/ad2511ede77bb424f3939e5148a56d968cdc6b1462620d24b2a1f4ab65b4/pydantic_settings-2.8.0.tar.gz", hash = "sha256:88e2ca28f6e68ea102c99c3c401d6c9078e68a5df600e97b43891c34e089500a", size = 83347, upload-time = "2025-02-21T08:04:52.046Z" } 294 | wheels = [ 295 | { url = "https://files.pythonhosted.org/packages/c1/a9/3b9642025174bbe67e900785fb99c9bfe91ea584b0b7126ff99945c24a0e/pydantic_settings-2.8.0-py3-none-any.whl", hash = "sha256:c782c7dc3fb40e97b238e713c25d26f64314aece2e91abcff592fcac15f71820", size = 30746, upload-time = "2025-02-21T08:04:50.49Z" }, 296 | ] 297 | 298 | [[package]] 299 | name = "pygments" 300 | version = "2.19.1" 301 | source = { registry = "https://pypi.org/simple" } 302 | sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581, upload-time = "2025-01-06T17:26:30.443Z" } 303 | wheels = [ 304 | { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293, upload-time = "2025-01-06T17:26:25.553Z" }, 305 | ] 306 | 307 | [[package]] 308 | name = "python-dotenv" 309 | version = "1.0.1" 310 | source = { registry = "https://pypi.org/simple" } 311 | sdist = { url = "https://files.pythonhosted.org/packages/bc/57/e84d88dfe0aec03b7a2d4327012c1627ab5f03652216c63d49846d7a6c58/python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", size = 39115, upload-time = "2024-01-23T06:33:00.505Z" } 312 | wheels = [ 313 | { url = "https://files.pythonhosted.org/packages/6a/3e/b68c118422ec867fa7ab88444e1274aa40681c606d59ac27de5a5588f082/python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a", size = 19863, upload-time = "2024-01-23T06:32:58.246Z" }, 314 | ] 315 | 316 | [[package]] 317 | name = "requests" 318 | version = "2.32.3" 319 | source = { registry = "https://pypi.org/simple" } 320 | dependencies = [ 321 | { name = "certifi" }, 322 | { name = "charset-normalizer" }, 323 | { name = "idna" }, 324 | { name = "urllib3" }, 325 | ] 326 | sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218, upload-time = "2024-05-29T15:37:49.536Z" } 327 | wheels = [ 328 | { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" }, 329 | ] 330 | 331 | [[package]] 332 | name = "rich" 333 | version = "13.9.4" 334 | source = { registry = "https://pypi.org/simple" } 335 | dependencies = [ 336 | { name = "markdown-it-py" }, 337 | { name = "pygments" }, 338 | ] 339 | sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } 340 | wheels = [ 341 | { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, 342 | ] 343 | 344 | [[package]] 345 | name = "shellingham" 346 | version = "1.5.4" 347 | source = { registry = "https://pypi.org/simple" } 348 | sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } 349 | wheels = [ 350 | { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, 351 | ] 352 | 353 | [[package]] 354 | name = "sniffio" 355 | version = "1.3.1" 356 | source = { registry = "https://pypi.org/simple" } 357 | sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } 358 | wheels = [ 359 | { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, 360 | ] 361 | 362 | [[package]] 363 | name = "sse-starlette" 364 | version = "2.2.1" 365 | source = { registry = "https://pypi.org/simple" } 366 | dependencies = [ 367 | { name = "anyio" }, 368 | { name = "starlette" }, 369 | ] 370 | sdist = { url = "https://files.pythonhosted.org/packages/71/a4/80d2a11af59fe75b48230846989e93979c892d3a20016b42bb44edb9e398/sse_starlette-2.2.1.tar.gz", hash = "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", size = 17376, upload-time = "2024-12-25T09:09:30.616Z" } 371 | wheels = [ 372 | { url = "https://files.pythonhosted.org/packages/d9/e0/5b8bd393f27f4a62461c5cf2479c75a2cc2ffa330976f9f00f5f6e4f50eb/sse_starlette-2.2.1-py3-none-any.whl", hash = "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99", size = 10120, upload-time = "2024-12-25T09:09:26.761Z" }, 373 | ] 374 | 375 | [[package]] 376 | name = "starlette" 377 | version = "0.46.0" 378 | source = { registry = "https://pypi.org/simple" } 379 | dependencies = [ 380 | { name = "anyio" }, 381 | ] 382 | sdist = { url = "https://files.pythonhosted.org/packages/44/b6/fb9a32e3c5d59b1e383c357534c63c2d3caa6f25bf3c59dd89d296ecbaec/starlette-0.46.0.tar.gz", hash = "sha256:b359e4567456b28d473d0193f34c0de0ed49710d75ef183a74a5ce0499324f50", size = 2575568, upload-time = "2025-02-22T17:34:45.949Z" } 383 | wheels = [ 384 | { url = "https://files.pythonhosted.org/packages/41/94/8af675a62e3c91c2dee47cf92e602cfac86e8767b1a1ac3caf1b327c2ab0/starlette-0.46.0-py3-none-any.whl", hash = "sha256:913f0798bd90ba90a9156383bcf1350a17d6259451d0d8ee27fc0cf2db609038", size = 71991, upload-time = "2025-02-22T17:34:43.786Z" }, 385 | ] 386 | 387 | [[package]] 388 | name = "typer" 389 | version = "0.15.1" 390 | source = { registry = "https://pypi.org/simple" } 391 | dependencies = [ 392 | { name = "click" }, 393 | { name = "rich" }, 394 | { name = "shellingham" }, 395 | { name = "typing-extensions" }, 396 | ] 397 | sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/dca7b219718afd37a0068f4f2530a727c2b74a8b6e8e0c0080a4c0de4fcd/typer-0.15.1.tar.gz", hash = "sha256:a0588c0a7fa68a1978a069818657778f86abe6ff5ea6abf472f940a08bfe4f0a", size = 99789, upload-time = "2024-12-04T17:44:58.956Z" } 398 | wheels = [ 399 | { url = "https://files.pythonhosted.org/packages/d0/cc/0a838ba5ca64dc832aa43f727bd586309846b0ffb2ce52422543e6075e8a/typer-0.15.1-py3-none-any.whl", hash = "sha256:7994fb7b8155b64d3402518560648446072864beefd44aa2dc36972a5972e847", size = 44908, upload-time = "2024-12-04T17:44:57.291Z" }, 400 | ] 401 | 402 | [[package]] 403 | name = "typing-extensions" 404 | version = "4.12.2" 405 | source = { registry = "https://pypi.org/simple" } 406 | sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321, upload-time = "2024-06-07T18:52:15.995Z" } 407 | wheels = [ 408 | { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438, upload-time = "2024-06-07T18:52:13.582Z" }, 409 | ] 410 | 411 | [[package]] 412 | name = "urllib3" 413 | version = "2.3.0" 414 | source = { registry = "https://pypi.org/simple" } 415 | sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268, upload-time = "2024-12-22T07:47:30.032Z" } 416 | wheels = [ 417 | { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369, upload-time = "2024-12-22T07:47:28.074Z" }, 418 | ] 419 | 420 | [[package]] 421 | name = "uvicorn" 422 | version = "0.34.0" 423 | source = { registry = "https://pypi.org/simple" } 424 | dependencies = [ 425 | { name = "click" }, 426 | { name = "h11" }, 427 | ] 428 | sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568, upload-time = "2024-12-15T13:33:30.42Z" } 429 | wheels = [ 430 | { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315, upload-time = "2024-12-15T13:33:27.467Z" }, 431 | ] 432 | --------------------------------------------------------------------------------