Skip to main content
Glama

execute

Execute write SQL statements (INSERT, UPDATE, DELETE) to modify PostgreSQL database data. Use with caution as this tool directly changes database content.

Instructions

Execute a write SQL statement (INSERT, UPDATE, DELETE).

WARNING: This tool modifies data. Use with caution. Only available if ALLOW_WRITE_OPERATIONS=true is set. Args: sql: SQL statement to execute Returns: Execution result with affected row count

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sqlYes

Implementation Reference

  • The primary handler for the 'execute' tool. Decorated with @mcp.tool() for registration in FastMCP. Performs permission check and calls the underlying PostgresClient.execute_query method.
    @mcp.tool() @handle_db_error def execute(sql: str) -> dict: """Execute a write SQL statement (INSERT, UPDATE, DELETE). WARNING: This tool modifies data. Use with caution. Only available if ALLOW_WRITE_OPERATIONS=true is set. Args: sql: SQL statement to execute Returns: Execution result with affected row count """ settings = get_settings() if not settings.allow_write_operations: return { "success": False, "error": "Write operations are disabled. Set ALLOW_WRITE_OPERATIONS=true to enable.", } client = get_client() result = client.execute_query(sql, allow_write=True) return { "success": True, "row_count": result["row_count"], "message": result.get("message", "Query executed successfully"), }
  • Supporting helper method PostgresClient.execute_query that implements the actual SQL execution logic, including validation, connection management, result formatting, and handling both SELECT and write operations.
    def execute_query( self, query: str, params: Optional[tuple] = None, allow_write: bool = False, max_rows: Optional[int] = None, ) -> dict[str, Any]: """Execute a SQL query. Args: query: SQL query string params: Optional query parameters allow_write: Whether to allow write operations max_rows: Maximum rows to return (None uses settings default) Returns: Dict with results, row_count, columns """ # Validate query validated_query = validate_query(query, allow_write=allow_write) max_rows = max_rows or self.settings.max_rows with self.get_connection() as conn: cursor = conn.cursor() try: cursor.execute(validated_query, params) # Check if it's a SELECT query is_select = validated_query.strip().upper().startswith("SELECT") if is_select: rows = cursor.fetchmany(max_rows + 1) truncated = len(rows) > max_rows if truncated: rows = rows[:max_rows] columns = [desc[0] for desc in cursor.description] if cursor.description else [] return { "success": True, "rows": [dict(row) for row in rows], "row_count": len(rows), "columns": columns, "truncated": truncated, } else: conn.commit() return { "success": True, "rows": [], "row_count": cursor.rowcount, "columns": [], "message": f"{cursor.rowcount} rows affected", } except psycopg2.Error as e: conn.rollback() raise PostgresClientError(f"Query failed: {e}") from e finally: cursor.close()

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/JaviMaligno/postgres-mcp'

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