MCP-RAG Server
by felixscherz
from mcp import types
from mcp.server import FastMCP
from mcp.server import Server
from mcp.server.sse import SseServerTransport
from starlette.applications import Starlette
from starlette.routing import Mount
from starlette.routing import Route
import logging
logger = logging.getLogger()
logging.basicConfig(level=logging.DEBUG)
app = Server("example-server")
sse = SseServerTransport("/messages/")
async def handle_sse(request):
async with sse.connect_sse(request.scope, request.receive, request._send) as streams:
await app.run(streams[0], streams[1], app.create_initialization_options())
@app.list_prompts()
async def handle_list_prompts() -> list[types.Prompt]:
return [
types.Prompt(
name="example-prompt",
description="An example prompt template",
arguments=[
types.PromptArgument(
name="arg1",
description="Example argument",
required=True
)
]
)
]
@app.get_prompt()
async def handle_get_prompt(
name: str,
arguments: dict[str, str] | None
) -> types.GetPromptResult:
if name != "example-prompt":
raise ValueError(f"Unknown prompt: {name}")
return types.GetPromptResult(
description="Example prompt",
messages=[
types.PromptMessage(
role="user",
content=types.TextContent(
type="text",
text="Example prompt text"
)
)
]
)
@app.list_tools()
async def list_tools() -> list[types.Tool]:
...
# first argument is tool name, the second is a dict of arguments
@app.call_tool()
async def handle_call_tool(tool_name: str, arguments):
print(tool_name)
print(arguments)
return [types.TextContent(text=f"Hello {tool_name}", type="text")]
starlette_app = Starlette(
routes=[
Route("/sse", endpoint=handle_sse),
Mount("/messages/", app=sse.handle_post_message),
]
)
print(starlette_app.routes)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--host")
parser.add_argument("--port", type=int)
options = parser.parse_args()
import uvicorn
uvicorn.run(starlette_app, host=options.host, port=options.port)