tables_db_update_polygon_column
Modify a polygon column in an Appwrite database table to adjust requirements, default values, or column keys for geographic data storage.
Instructions
Update a polygon column. Changing the default value will not update already existing rows.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| database_id | Yes | Database ID. | |
| table_id | Yes | Table ID. You can create a new table using the TablesDB service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable). | |
| key | Yes | Column Key. | |
| required | Yes | Is column required? | |
| default | No | Default value for column when not provided, three-dimensional array where the outer array holds one or more linear rings, [[[longitude, latitude], …], …], the first ring is the exterior boundary, any additional rings are interior holes, and each ring must start and end with the same coordinate pair. Cannot be set when column is required. | |
| new_key | No | New Column Key. |
Implementation Reference
- src/mcp_server_appwrite/server.py:71-71 (registration)Registers the TablesDB Appwrite service instance with the tool manager under the name 'tables_db'. All public methods of TablesDB will be exposed as MCP tools prefixed with 'tables_db_', including 'tables_db_update_polygon_column'.tools_manager.register_service(Service(TablesDB(client), "tables_db"))
- Generic MCP tool handler that executes any registered tool. For 'tables_db_update_polygon_column', it retrieves the bound method TablesDB.update_polygon_column and calls it with the input arguments, returning the result as text content.@server.call_tool() async def handle_call_tool( name: str, arguments: dict | None ) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]: try: tool_info = tools_manager.get_tool(name) if not tool_info: raise McpError(f"Tool {name} not found") bound_method = tool_info["function"] result = bound_method(**(arguments or {})) if hasattr(result, 'to_dict'): result_dict = result.to_dict() return [types.TextContent(type="text", text=str(result_dict))] return [types.TextContent(type="text", text=str(result))] except AppwriteException as e: return [types.TextContent(type="text", text=f"Appwrite Error: {str(e)}")] except Exception as e: return [types.TextContent(type="text", text=f"Error: {str(e)}")]
- Dynamically generates tool definitions (including schema) for all public methods of the service instance. For TablesDB.update_polygon_column, it creates the tool 'tables_db_update_polygon_column' with input schema derived from the method's type hints, signature, and docstring.def list_tools(self) -> Dict[str, Dict]: """Lists all available tools for this service""" tools = {} for name, func in inspect.getmembers(self.service, predicate=inspect.ismethod): if name.startswith('_'): # Skip private methods continue original_func = func.__func__ # Skip if not from the service's module if original_func.__module__ != self.service.__class__.__module__: continue # Get the overridden name if it exists tool_name = self._method_name_overrides.get(name, f"{self.service_name}_{name}") docstring = parse(original_func.__doc__) signature = inspect.signature(original_func) type_hints = get_type_hints(original_func) properties = {} required = [] for param_name, param in signature.parameters.items(): if param_name == 'self': continue param_type = type_hints.get(param_name, str) properties[param_name] = self.python_type_to_json_schema(param_type) properties[param_name]["description"] = f"Parameter '{param_name}'" for doc_param in docstring.params: if doc_param.arg_name == param_name: properties[param_name]["description"] = doc_param.description if param.default is param.empty: required.append(param_name) tool_definition = Tool( name=tool_name, description=f"{docstring.short_description or "No description available"}", inputSchema={ "type": "object", "properties": properties, "required": required } ) tools[tool_name] = { "definition": tool_definition, "function": func } return tools
- ToolManager.register_service appends the service and merges its tools (from list_tools()) into the central registry, making them available via get_tool() and get_all_tools().def register_service(self, service: Service): """Register a new service and its tools""" self.services.append(service) self.tools_registry.update(service.list_tools())
- MCP server list_tools handler that returns all tool definitions from the ToolManager, including the schema for 'tables_db_update_polygon_column'.@server.list_tools() async def handle_list_tools() -> list[types.Tool]: return tools_manager.get_all_tools()