diff --git a/examples/screenshot.py b/examples/screenshot.py index b338d75b6..bfef5d8e9 100644 --- a/examples/screenshot.py +++ b/examples/screenshot.py @@ -1,33 +1,31 @@ # /// script -# dependencies = ["pyautogui"] +# dependencies = ["fastmcp", "pyautogui", "Pillow"] # /// """ FastMCP Screenshot Example -A simple example that provides a tool to capture screenshots. +Give Claude a tool to capture and view screenshots. """ -import base64 import io -import pyautogui -from fastmcp.server import FastMCP +from fastmcp import FastMCP, Image # Create server mcp = FastMCP("Screenshot Demo") @mcp.tool() -def take_screenshot() -> str: - """Take a screenshot and return it as a base64 encoded string""" - # Capture the screen - screenshot = pyautogui.screenshot() +def take_screenshot() -> Image: + """Take a screenshot of the user's screen and return it as an image""" + import pyautogui - # Convert to base64 + screenshot = pyautogui.screenshot() buffer = io.BytesIO() - screenshot.save(buffer, format="PNG") - return base64.b64encode(buffer.getvalue()).decode() + # if the file exceeds ~1MB, it will be rejected by Claude + screenshot.convert("RGB").save(buffer, format="JPEG", quality=60, optimize=True) + return Image(data=buffer.getvalue(), format="jpeg") if __name__ == "__main__": diff --git a/src/fastmcp/cli/cli.py b/src/fastmcp/cli/cli.py index 64772095a..42e63251b 100644 --- a/src/fastmcp/cli/cli.py +++ b/src/fastmcp/cli/cli.py @@ -275,7 +275,7 @@ def install( typer.Option( "--name", "-n", - help="Custom name for the server (defaults to file name)", + help="Custom name for the server (defaults to server's name attribute or file name)", ), ] = None, with_editable: Annotated[ @@ -324,17 +324,28 @@ def install( logger.error("Claude app not found") sys.exit(1) + # Try to import server to get its name, but fall back to file name if dependencies missing + name = server_name + if not name: + try: + server = _import_server(file, server_object) + name = server.name + except (ImportError, ModuleNotFoundError) as e: + logger.debug( + "Could not import server (likely missing dependencies), using file name", + extra={"error": str(e)}, + ) + name = file.stem + if claude.update_claude_config( file, - server_name, + name, with_editable=with_editable, with_packages=with_packages, force=force, ): - name = server_name or file.stem print(f"Successfully installed {name} in Claude app") else: - name = server_name or file.stem print(f"Failed to install {name} in Claude app") sys.exit(1) diff --git a/src/fastmcp/tools.py b/src/fastmcp/tools.py index 67e474ff7..7f0c55a3e 100644 --- a/src/fastmcp/tools.py +++ b/src/fastmcp/tools.py @@ -56,6 +56,7 @@ class Image: data = base64.b64encode(f.read()).decode() else: data = base64.b64encode(self.data).decode() + return ImageContent(type="image", data=data, mimeType=self._mime_type)