diff --git a/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift
new file mode 100644
index 0000000000000000000000000000000000000000..91230c63f1aacc36064a366ecfca110e36f07b60
--- /dev/null
+++ b/Sources/XXMessengerClient/Messenger/Functions/MessengerReceiveFile.swift
@@ -0,0 +1,32 @@
+import Foundation
+import XCTestDynamicOverlay
+import XXClient
+
+public struct MessengerReceiveFile {
+  public enum Error: Swift.Error, Equatable {
+    case notConnected
+  }
+
+  public var run: () throws -> Void
+
+  public func callAsFunction() throws -> Void {
+    try run()
+  }
+}
+
+extension MessengerReceiveFile {
+  public static func live(_ env: MessengerEnvironment) -> MessengerReceiveFile {
+    MessengerReceiveFile {
+      guard let e2e = env.e2e() else {
+        throw Error.notConnected
+      }
+      // TODO: implement receiving file
+    }
+  }
+}
+
+extension MessengerReceiveFile {
+  public static let unimplemented = MessengerReceiveFile(
+    run: XCTUnimplemented("\(Self.self)")
+  )
+}
diff --git a/Sources/XXMessengerClient/Messenger/Messenger.swift b/Sources/XXMessengerClient/Messenger/Messenger.swift
index 2c8ef5d5e835c4520bda5a9a4b1232c0ed57f118..793daab0b708c48ee0fa1d2f9315a533c245475a 100644
--- a/Sources/XXMessengerClient/Messenger/Messenger.swift
+++ b/Sources/XXMessengerClient/Messenger/Messenger.swift
@@ -42,6 +42,7 @@ public struct Messenger {
   public var startLogging: MessengerStartLogging
   public var startFileTransfer: MessengerStartFileTransfer
   public var sendFile: MessengerSendFile
+  public var receiveFile: MessengerReceiveFile
 }
 
 extension Messenger {
@@ -87,7 +88,8 @@ extension Messenger {
       setLogLevel: .live(env),
       startLogging: .live(env),
       startFileTransfer: .live(env),
-      sendFile: .live(env)
+      sendFile: .live(env),
+      receiveFile: .live(env)
     )
   }
 }
@@ -134,6 +136,7 @@ extension Messenger {
     setLogLevel: .unimplemented,
     startLogging: .unimplemented,
     startFileTransfer: .unimplemented,
-    sendFile: .unimplemented
+    sendFile: .unimplemented,
+    receiveFile: .unimplemented
   )
 }
diff --git a/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift
new file mode 100644
index 0000000000000000000000000000000000000000..ef9b586421ebec8453ce7d2ec17e0f90a1ff6ef4
--- /dev/null
+++ b/Tests/XXMessengerClientTests/Messenger/Functions/MessengerReceiveFileTests.swift
@@ -0,0 +1,27 @@
+import CustomDump
+import XCTest
+import XXClient
+@testable import XXMessengerClient
+
+final class MessengerReceiveFileTests: XCTestCase {
+  func testReceiveFile() throws {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { .unimplemented }
+    let receiveFile: MessengerReceiveFile = .live(env)
+
+    try receiveFile()
+  }
+
+  func testReceiveFileWhenNotConnected() {
+    var env: MessengerEnvironment = .unimplemented
+    env.e2e.get = { nil }
+    let receiveFile: MessengerReceiveFile = .live(env)
+
+    XCTAssertThrowsError(try receiveFile()) { error in
+      XCTAssertNoDifference(
+        error as? MessengerReceiveFile.Error,
+        MessengerReceiveFile.Error.notConnected
+      )
+    }
+  }
+}