chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# Run the sample
|
||||
|
||||
## Create virtual environment
|
||||
|
||||
```sh
|
||||
python -m venv venv
|
||||
source ./venv/bin/activate
|
||||
```
|
||||
|
||||
## Install dependencies
|
||||
|
||||
```sh
|
||||
pip install "mcp[cli]"
|
||||
```
|
||||
|
||||
## Run the server
|
||||
|
||||
```sh
|
||||
uvicorn server:app --port 8000
|
||||
```
|
||||
|
||||
## Test the server out with GitHub Copilot and VS Code
|
||||
|
||||
Add the entry to mcp.json like so:
|
||||
|
||||
```json
|
||||
"servers": {
|
||||
"my-mcp-server-999e9ea3": {
|
||||
"url": "http://localhost:8001/sse",
|
||||
"type": "http"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Make sure you click "start" on the server.
|
||||
|
||||
In GitHub Copilot paste the following prompt:
|
||||
|
||||
```text
|
||||
create a blog post named "Where Python comes from", the content is "Python is actually named after Monty Python Flying Circus"
|
||||
```
|
||||
|
||||
The first time you will be asked whether to accept a Sampling action, then you will be asked to accept the tool to run "create_blog". You should see a response similar to:
|
||||
|
||||
```json
|
||||
{
|
||||
"result": "{\"id\": \"Where Python comes from\", \"abstract\": \"# Python's Origin\\n\\nPython, the popular programming language, derives its name from **Monty Python's Flying Circus**, the British comedy troupe, rather than the snake. This naming choice reflects the creator's desire to make programming more fun and accessible.\"}"
|
||||
}
|
||||
```
|
||||
@@ -0,0 +1,69 @@
|
||||
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("Blog post generator")
|
||||
|
||||
# app = FastAPI()
|
||||
|
||||
posts = []
|
||||
|
||||
class BlogPost(BaseModel):
|
||||
id: int
|
||||
title: str
|
||||
content: str
|
||||
abstract: str
|
||||
|
||||
posts: List[BlogPost] = []
|
||||
|
||||
@mcp.tool()
|
||||
async def create_blog(title: str, content: str, ctx: Context[ServerSession, None]) -> str:
|
||||
"""Create a blog post and generate a summary"""
|
||||
|
||||
post = BlogPost(
|
||||
id=len(posts) + 1,
|
||||
title=title,
|
||||
content=content,
|
||||
abstract=""
|
||||
)
|
||||
|
||||
prompt = f"Create an abstract of the following blog post: title: {title} and draft: {content} "
|
||||
|
||||
result = await ctx.session.create_message(
|
||||
messages=[
|
||||
SamplingMessage(
|
||||
role="user",
|
||||
content=TextContent(type="text", text=prompt),
|
||||
)
|
||||
],
|
||||
max_tokens=100,
|
||||
)
|
||||
|
||||
post.abstract = result.content.text
|
||||
|
||||
posts.append(post)
|
||||
|
||||
# return the complete blog post
|
||||
return json.dumps({
|
||||
"id": post.title,
|
||||
"abstract": post.abstract
|
||||
})
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("Starting server...")
|
||||
# mcp.run()
|
||||
mcp.run(transport="streamable-http")
|
||||
|
||||
# run app with: python server.py
|
||||
Reference in New Issue
Block a user