1
1
from fastmcp import FastMCP
2
2
from loguru import logger
3
+ import sys
3
4
import time
4
5
5
- # Create the MCP server with all interfaces binding
6
+ # Configure detailed logging
7
+ logger .remove ()
8
+ logger .add (sys .stdout , level = "DEBUG" , format = "{time} | {level} | {message}" )
9
+
10
+ # Create MCP server with fixed configuration
6
11
mcp = FastMCP (
7
- host =
8
- "0.0.0.0" , # Bind to all interfaces to be accessible from other contexts
12
+ host = "127.0.0.1" , # Bind to localhost only
9
13
port = 8000 ,
10
14
transport = "sse" ,
11
15
require_session_id = False ,
12
- cors_allowed_origins = ["*" ], # Allow all origins for testing
13
- debug = True # Enable debug mode
16
+ cors_allowed_origins = ["*" ],
17
+ debug = True
14
18
)
15
19
16
-
17
- # Define tools
20
+ # Define tools with proper return format
18
21
@mcp .tool ()
19
- def add (a : int , b : int ) -> str :
20
- """Add two numbers.
21
- Args:
22
- a (int): First number
23
- b (int): Second number
24
- Returns:
25
- str: A message containing the sum
26
- """
27
- logger .info (f"Adding { a } and { b } " )
22
+ def add (a : int , b : int ) -> int :
23
+ """Add two numbers."""
28
24
result = a + b
29
- return f"The sum of { a } and { b } is { result } "
30
-
25
+ logger . info ( f"Adding { a } + { b } = { result } ")
26
+ return result # Let FastMCP handle the response formatting
31
27
32
28
@mcp .tool ()
33
- def multiply (a : int , b : int ) -> str :
34
- """Multiply two numbers.
35
- Args:
36
- a (int): First number
37
- b (int): Second number
38
- Returns:
39
- str: A message containing the product
40
- """
41
- logger .info (f"Multiplying { a } and { b } " )
29
+ def multiply (a : int , b : int ) -> int :
30
+ """Multiply two numbers."""
42
31
result = a * b
43
- return f"The product of { a } and { b } is { result } "
44
-
32
+ logger . info ( f"Multiplying { a } * { b } = { result } ")
33
+ return result
45
34
46
35
@mcp .tool ()
47
- def divide (a : int , b : int ) -> str :
48
- """Divide two numbers.
49
- Args:
50
- a (int): Numerator
51
- b (int): Denominator
52
- Returns:
53
- str: A message containing the division result or an error message
54
- """
55
- logger .info (f"Dividing { a } by { b } " )
36
+ def divide (a : int , b : int ) -> float :
37
+ """Divide the first number by the second."""
56
38
if b == 0 :
57
- logger .warning ("Division by zero attempted" )
58
- return "Cannot divide by zero"
39
+ raise ValueError ("Cannot divide by zero" )
59
40
result = a / b
60
- return f" { a } divided by { b } is { result } "
61
-
41
+ logger . info ( f"Dividing { a } / { b } = { result } ")
42
+ return result
62
43
63
- if __name__ == "__main__" :
44
+ def main () :
64
45
try :
65
- # Log server details
66
- logger .info ("Starting math server on http://0.0.0.0:8000" )
67
- print ("Math MCP Server is running on http://0.0.0.0:8000" )
68
- print ("Press Ctrl+C to stop." )
69
-
70
- # List available tools
71
- print ("\n Available tools:" )
72
- print ("- add: Add two numbers" )
73
- print ("- multiply: Multiply two numbers" )
74
- print ("- divide: Divide first number by second number" )
75
-
76
- # Add a small delay to ensure logging is complete
77
- time .sleep (0.5 )
78
-
79
- # Run the MCP server
80
- mcp .run ()
81
- except KeyboardInterrupt :
82
- logger .info ("Server shutdown requested" )
83
- print ("\n Shutting down server..." )
46
+ logger .info ("Starting mock math server on http://127.0.0.1:8000" )
47
+ print ("Math MCP Server running on http://127.0.0.1:8000 (SSE)\n " )
48
+ print ("Available tools:\n - add\n - multiply\n - divide\n " )
49
+ mcp .run () # This runs the server in a blocking mode
84
50
except Exception as e :
85
- logger .error (f"Server error: { e } " )
86
- raise
51
+ logger .error (f"Error starting server: { e } " )
52
+ import traceback
53
+ traceback .print_exc ()
54
+
55
+ if __name__ == "__main__" :
56
+ main ()
0 commit comments