-          @if (hasViewOnly()) {
+          @if (hasViewOnly() || !supportUpload()) {
             
diff --git a/src/app/shared/components/files-tree/files-tree.component.ts b/src/app/shared/components/files-tree/files-tree.component.ts
index 7eea3e257..cdae7ea25 100644
--- a/src/app/shared/components/files-tree/files-tree.component.ts
+++ b/src/app/shared/components/files-tree/files-tree.component.ts
@@ -36,7 +36,7 @@ import { embedDynamicJs, embedStaticHtml } from '@osf/features/files/constants';
 import { StopPropagationDirective } from '@osf/shared/directives';
 import { FileMenuType } from '@osf/shared/enums';
 import { hasViewOnlyParam } from '@osf/shared/helpers';
-import { FileLabelModel, FileMenuAction, FilesTreeActions, OsfFile } from '@osf/shared/models';
+import { FileLabelModel, FileMenuAction, FileMenuFlags, FilesTreeActions, OsfFile } from '@osf/shared/models';
 import { FileSizePipe } from '@osf/shared/pipes';
 import { CustomConfirmationService, FilesService, ToastService } from '@osf/shared/services';
 import { DataciteService } from '@osf/shared/services/datacite/datacite.service';
@@ -88,6 +88,8 @@ export class FilesTreeComponent implements OnDestroy, AfterViewInit {
   viewOnly = input
(true);
   viewOnlyDownloadable = input(false);
   provider = input();
+  allowedMenuActions = input({} as FileMenuFlags);
+  supportUpload = input(true);
   isDragOver = signal(false);
   hasViewOnly = computed(() => hasViewOnlyParam(this.router) || this.viewOnly());
 
diff --git a/src/app/shared/enums/addon-supported-features.enum.ts b/src/app/shared/enums/addon-supported-features.enum.ts
new file mode 100644
index 000000000..45b045f00
--- /dev/null
+++ b/src/app/shared/enums/addon-supported-features.enum.ts
@@ -0,0 +1,11 @@
+export enum SupportedFeature {
+  AddUpdateFiles = 'ADD_UPDATE_FILES',
+  CopyInto = 'COPY_INTO',
+  DeleteFiles = 'DELETE_FILES',
+  DownloadAsZip = 'DOWNLOAD_AS_ZIP',
+  FileVersions = 'FILE_VERSIONS',
+  Forking = 'FORKING',
+  Logs = 'LOGS',
+  Permissions = 'PERMISSIONS',
+  Registering = 'REGISTERING',
+}
diff --git a/src/app/shared/enums/index.ts b/src/app/shared/enums/index.ts
index fb580a69f..301cfef44 100644
--- a/src/app/shared/enums/index.ts
+++ b/src/app/shared/enums/index.ts
@@ -1,5 +1,6 @@
 export * from './addon-form-controls.enum';
 export * from './addon-service-names.enum';
+export * from './addon-supported-features.enum';
 export * from './addon-tab.enum';
 export * from './addon-type.enum';
 export * from './addons-category.enum';
diff --git a/src/app/shared/models/files/file-menu-action.model.ts b/src/app/shared/models/files/file-menu-action.model.ts
index d5566932d..f151e2f0e 100644
--- a/src/app/shared/models/files/file-menu-action.model.ts
+++ b/src/app/shared/models/files/file-menu-action.model.ts
@@ -8,3 +8,5 @@ export interface FileMenuAction {
 export interface FileMenuData {
   type: string;
 }
+
+export type FileMenuFlags = Record;
diff --git a/src/app/shared/services/files.service.ts b/src/app/shared/services/files.service.ts
index 0bb5f4764..8970afbe4 100644
--- a/src/app/shared/services/files.service.ts
+++ b/src/app/shared/services/files.service.ts
@@ -21,6 +21,8 @@ import {
 } from '@osf/features/files/models';
 import {
   AddFileResponse,
+  AddonGetResponseJsonApi,
+  AddonModel,
   ApiData,
   ConfiguredAddonGetResponseJsonApi,
   ConfiguredAddonModel,
@@ -318,4 +320,12 @@ export class FilesService {
       })
     );
   }
+
+  getExternalStorageService(serviceId: string): Observable {
+    return this.jsonApiService
+      .get<
+        JsonApiResponse
+      >(`${this.addonsApiUrl}/configured-storage-addons/${serviceId}/external_storage_service/`)
+      .pipe(map((response) => AddonMapper.fromResponse(response.data)));
+  }
 }