1010
1111from mcp .server .fastmcp import FastMCP
1212from mcp .types import ToolAnnotations
13- from pydantic import Field
13+ from pydantic import StringConstraints
1414
1515from my_mcp_server .prompts .code_review import register as register_code_review
1616from my_mcp_server .resources .server_info import register as register_server_info
2222# ---------------------------------------------------------------------------
2323
2424DEBUG = os .environ .get ("MCP_DEBUG" , "false" ).lower () == "true"
25+ VALID_LOG_LEVELS = {"DEBUG" , "INFO" , "WARNING" , "ERROR" , "CRITICAL" }
26+
27+
28+ def resolve_log_level () -> str :
29+ """Return a logging level name accepted by ``logging``."""
30+ if DEBUG :
31+ return "DEBUG"
32+
33+ candidate = os .environ .get ("LOG_LEVEL" , "INFO" ).upper ()
34+ if candidate not in VALID_LOG_LEVELS :
35+ return "INFO"
36+ return candidate
37+
2538
2639# ---------------------------------------------------------------------------
2740# Server
2841# ---------------------------------------------------------------------------
2942
43+ SERVER_NAME = "my-mcp-server"
44+ SERVER_INSTRUCTIONS = "An MCP server. Replace this with your description."
45+
3046mcp = FastMCP (
31- "my-mcp-server" ,
32- instructions = "An MCP server. Replace this with your description." ,
47+ SERVER_NAME ,
48+ instructions = SERVER_INSTRUCTIONS ,
3349)
3450
3551
5066async def greet (
5167 name : Annotated [
5268 str ,
53- Field (
69+ StringConstraints (
70+ strip_whitespace = True ,
5471 min_length = 1 ,
5572 max_length = 200 ,
56- description = "Name to greet (1-200 characters)." ,
5773 ),
5874 ],
5975) -> str :
@@ -64,8 +80,12 @@ async def greet(
6480 are rejected by the protocol layer before the handler runs. The TS
6581 sibling enforces the same shape via Zod.
6682 """
67- logger .info ("Greeting %s" , name )
68- return f"Hello, { name } !"
83+ normalized = name .strip ()
84+ if not normalized :
85+ raise ValueError ("name must contain at least one non-whitespace character" )
86+
87+ logger .info ("Greeting %s" , normalized )
88+ return f"Hello, { normalized } !"
6989
7090
7191# To add more tools, either decorate inline above or split them into modules
@@ -94,9 +114,8 @@ async def greet(
94114
95115def main () -> None :
96116 """Run the MCP server."""
97- log_level = "DEBUG" if DEBUG else os .environ .get ("LOG_LEVEL" , "INFO" ).upper ()
98117 logging .basicConfig (
99- level = getattr (logging , log_level , logging . INFO ),
118+ level = getattr (logging , resolve_log_level () ),
100119 format = "%(asctime)s [%(name)s] %(levelname)s: %(message)s" ,
101120 )
102- mcp .run ()
121+ mcp .run (transport = "stdio" )
0 commit comments