Files
microsoft--mcp-for-beginners/03-GettingStarted/14-sampling/solution/python/server.py
T
2026-07-13 13:31:35 +08:00

75 lines
1.7 KiB
Python

from starlette.applications import Starlette
from starlette.routing import Mount, Host
from mcp.server.fastmcp import Context, FastMCP
from mcp.server.session import ServerSession
from mcp.types import SamplingMessage, TextContent
import json
from uuid import uuid4
from typing import List
from pydantic import BaseModel
mcp = FastMCP("My App")
class Product(BaseModel):
id: int
name: str
description: str
def __init__(self, name: str, description: str):
super().__init__(
id=len(products) + 1,
name=name,
description=description
)
products: List[Product] = []
@mcp.tool()
async def create_product(product_name: str, keywords: str, ctx: Context[ServerSession, None]) -> str:
"""Create a product and generate a product description using LLM sampling."""
product = Product(name=product_name, description="")
prompt = f"Create a product description about {product_name} described by as {keywords}"
result = await ctx.session.create_message(
messages=[
SamplingMessage(
role="user",
content=TextContent(type="text", text=prompt),
)
],
max_tokens=100,
)
product.description = result.content.text
products.append(product)
# return the complete product
return json.dumps({
"id": product.id,
"name": product.name,
"description": product.description
})
if __name__ == "__main__":
print("Starting server...")
mcp.run()
# Mount the SSE server to the existing ASGI server
app = Starlette(
routes=[
Mount('/', app=mcp.sse_app()),
]
)
# run app with: uvicorn 03-GettingStarted/12-sampling/solution/python/server:app --port 8000