Skip to main content
Glama
appwrite

Appwrite MCP Server

Official
by appwrite

tables_db_get_index

Retrieve a specific database index by its key to inspect table structure and optimize query performance in Appwrite projects.

Instructions

Get index by ID.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
database_idYesDatabase ID.
table_idYesTable ID. You can create a new table using the Database service [server integration](https://appwrite.io/docs/references/cloud/server-dart/tablesDB#createTable).
keyYesIndex Key.

Implementation Reference

  • Generic MCP tool execution handler for all tools, including "tables_db_get_index". It retrieves the specific bound method from the tool registry and invokes it with the provided arguments, handling Appwrite and general exceptions.
    @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 inspects the TablesDB class methods (including get_index), constructs tool names like "tables_db_get_index", parses docstrings and type hints to build JSON input schemas, and registers the tool definitions with execution functions.
    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
  • Explicit registration of the TablesDB Appwrite service as "tables_db", which enables dynamic tool creation for its methods, including "tables_db_get_index".
    if args.tables_db:
        tools_manager.register_service(Service(TablesDB(client), "tables_db"))
  • Default registration of the TablesDB service as "tables_db" when no specific services are selected, enabling the "tables_db_get_index" tool.
    if not any([args.databases, args.tables_db, args.users, args.teams, args.storage,
                args.functions, args.messaging, args.locale, args.avatars, args.sites]):
        tools_manager.register_service(Service(TablesDB(client), "tables_db"))
  • Updates the tools registry with all tools from the service (including "tables_db_get_index"), making them available for listing and execution.
    def register_service(self, service: Service):
        """Register a new service and its tools"""
        self.services.append(service)
        self.tools_registry.update(service.list_tools())
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get index by ID' implies a read-only operation, but it doesn't specify whether this requires authentication, what happens if the index doesn't exist (e.g., error behavior), rate limits, or the format of the returned data. For a tool with no annotation coverage, this minimal description fails to provide necessary behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise ('Get index by ID.'), which could be efficient if it were informative, but it's under-specified rather than appropriately sized. It's front-loaded but lacks substance, failing to earn its place with useful details. While not verbose, it sacrifices clarity for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (a database operation with 3 required parameters), no annotations, and no output schema, the description is incomplete. It doesn't explain what an 'index' is in this context, what data is returned, error conditions, or dependencies. For a tool that likely retrieves structured metadata, more context is needed to guide effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all three parameters (database_id, table_id, key) documented in the input schema. The description adds no additional meaning beyond the schema, such as explaining what 'key' represents (e.g., index identifier) or relationships between parameters. However, with full schema coverage, the baseline score of 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get index by ID' is a tautology that restates the tool name 'tables_db_get_index' without adding meaningful context. It mentions 'index' and 'ID' but doesn't specify what type of index (database index) or what resource it operates on (a table within a database). Compared to siblings like 'tables_db_get_table' or 'tables_db_get_row', it doesn't clearly distinguish its specific purpose beyond the obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. The description doesn't mention prerequisites (e.g., needing an existing index), when-not-to-use scenarios, or how it differs from related tools like 'tables_db_list_indexes' (which likely lists multiple indexes) or 'tables_db_create_index'. This leaves the agent without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/appwrite/mcp-for-api'

If you have feedback or need assistance with the MCP directory API, please join our Discord server