Skip to main content
Glama
Xuanwo

MCP Server for Apache OpenDAL™

by Xuanwo

read

Retrieve file content from various storage services using a unified URI interface. Specify the resource location to access data across S3, Azure Blob Storage, and Google Cloud Storage.

Instructions

Read file content from OpenDAL service Args: uri: resource URI, e.g. mys3://path/to/file Returns: File content or error information

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
uriYes

Implementation Reference

  • The MCP tool handler for 'read'. It processes the URI input, parses it using parse_uri, and invokes the opendal_resource template to retrieve and format the file content as text or base64-encoded binary.
    @mcp.tool() async def read(uri: str) -> Dict[str, Any]: """ Read file content from OpenDAL service Args: uri: resource URI, e.g. mys3://path/to/file Returns: File content or error information """ logger.debug(f"Reading file content: {uri}") try: resource, path = parse_uri(uri) # Directly call the resource function to get content return await opendal_resource(resource.scheme, path) except Exception as e: logger.error(f"Failed to read file content: {e!s}") return {"error": str(e)}
  • Key helper resource template (@mcp.resource) that performs the core file reading logic. Reads raw bytes with read_path, stats the file, detects text/binary, and formats the output dictionary used by the 'read' tool.
    @mcp.resource("{scheme}://{path}") async def opendal_resource(scheme: str, path: str) -> Dict[str, Any]: """ Access files in OpenDAL service Args: scheme: storage service scheme path: file path Returns: Dictionary containing file content and metadata """ logger.debug(f"Reading template resource content: {scheme}://{path}") try: resource = OpendalResource(scheme) data = await resource.read_path(path) metadata = await resource.stat(path) if resource.is_text_file(path): return { "content": data.decode("utf-8"), "mime_type": metadata.content_type or "text/plain", "size": metadata.content_length, "is_binary": False, } else: return { "content": base64.b64encode(data).decode("ascii"), "mime_type": metadata.content_type or "application/octet-stream", "size": metadata.content_length, "is_binary": True, } except Exception as e: logger.error(f"Failed to read resource: {e!s}") return {"error": str(e)}
  • Low-level asynchronous method in OpendalResource class that executes the actual file read operation using the underlying OpenDAL operator (self.op.read). Called by opendal_resource.
    async def read_path(self, path: Union[str, os.PathLike]) -> bytes: """Read content from a specific path""" logger.debug(f"Reading path: {path}") return await self.op.read(path)
  • Utility function to parse the input URI into scheme and path, instantiating the appropriate OpendalResource. Used by the 'read' tool.
    def parse_uri(uri: str) -> Tuple[OpendalResource, str]: """Parse a URI into a resource and path""" from urllib.parse import unquote, urlparse logger.debug(f"Parsing URI: {uri}") parsed = urlparse(uri) scheme = parsed.scheme path = parsed.netloc + parsed.path path = unquote(path) # Decode URL-encoded characters return (OpendalResource(scheme), path)
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/Xuanwo/mcp-server-opendal'

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