Screenshot demo working

This commit is contained in:
Jeremiah Lowin 2024-11-29 22:58:38 -05:00
commit 627cf8a84e
3 changed files with 26 additions and 16 deletions

View file

@ -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__":

View file

@ -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)

View file

@ -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)