From a9e37d25c676ed25ea4b6dc00d4c50221f2018da Mon Sep 17 00:00:00 2001 From: Jack Adamson Date: Fri, 29 Nov 2024 15:22:46 +0000 Subject: [PATCH 1/2] switch pydantic type annotations to satisfy pyright --- src/fetch/src/mcp_server_fetch/server.py | 40 ++++++++++++++++-------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/fetch/src/mcp_server_fetch/server.py b/src/fetch/src/mcp_server_fetch/server.py index a3c0f95..ae417ef 100644 --- a/src/fetch/src/mcp_server_fetch/server.py +++ b/src/fetch/src/mcp_server_fetch/server.py @@ -1,4 +1,5 @@ from typing import Optional, Tuple +from typing_extensions import Annotated from urllib.parse import urlparse, urlunparse import markdownify @@ -17,7 +18,7 @@ from mcp.types import ( INTERNAL_ERROR, ) from protego import Protego -from pydantic import BaseModel, Field, AnyUrl, conint +from pydantic import BaseModel, Field, AnyUrl DEFAULT_USER_AGENT_AUTONOMOUS = "ModelContextProtocol/1.0 (Autonomous; +https://github.com/modelcontextprotocol/servers)" DEFAULT_USER_AGENT_MANUAL = "ModelContextProtocol/1.0 (User-Specified; +https://github.com/modelcontextprotocol/servers)" @@ -148,18 +149,31 @@ async def fetch_url( class Fetch(BaseModel): """Parameters for fetching a URL.""" - url: AnyUrl = Field(..., description="URL to fetch") - max_length: conint(gt=0, lt=1000000) = Field( - 5000, description="Maximum number of characters to return." - ) - start_index: conint(ge=0) = Field( - 0, - description="On return output starting at this character index, useful if a previous fetch was truncated and more context is required.", - ) - raw: bool = Field( - False, - description="Get the actual HTML content if the requested page, without simplification.", - ) + url: Annotated[AnyUrl, Field(description="URL to fetch")] + max_length: Annotated[ + int, + Field( + default=5000, + description="Maximum number of characters to return.", + gt=0, + lt=1000000, + ), + ] + start_index: Annotated[ + int, + Field( + default=0, + description="On return output starting at this character index, useful if a previous fetch was truncated and more context is required.", + ge=0, + ), + ] + raw: Annotated[ + bool, + Field( + default=False, + description="Get the actual HTML content if the requested page, without simplification.", + ), + ] async def serve( From bee382cec5170c39a4adb93d8d1ad1198d05c35e Mon Sep 17 00:00:00 2001 From: Jack Adamson Date: Fri, 29 Nov 2024 15:45:10 +0000 Subject: [PATCH 2/2] make changes requested in PR --- src/fetch/src/mcp_server_fetch/server.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/fetch/src/mcp_server_fetch/server.py b/src/fetch/src/mcp_server_fetch/server.py index ae417ef..3d35094 100644 --- a/src/fetch/src/mcp_server_fetch/server.py +++ b/src/fetch/src/mcp_server_fetch/server.py @@ -1,5 +1,4 @@ -from typing import Optional, Tuple -from typing_extensions import Annotated +from typing import Annotated, Tuple from urllib.parse import urlparse, urlunparse import markdownify @@ -177,7 +176,7 @@ class Fetch(BaseModel): async def serve( - custom_user_agent: Optional[str] = None, ignore_robots_txt: bool = False + custom_user_agent: str | None = None, ignore_robots_txt: bool = False ) -> None: """Run the fetch MCP server.