-
Notifications
You must be signed in to change notification settings - Fork 3.7k
Expand file tree
/
Copy pathserver_lowlevel.py
More file actions
87 lines (75 loc) · 3.19 KB
/
Copy pathserver_lowlevel.py
File metadata and controls
87 lines (75 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
"""Prompts primitive (lowlevel API): hand-built Prompt descriptors, GetPromptResult, completion."""
from typing import Any
import mcp_types as types
from mcp.server.context import ServerRequestContext
from mcp.server.lowlevel import Server
from stories._hosting import run_server_from_args
LANGUAGES = ["python", "pytorch", "rust", "go", "typescript"]
PROMPTS = [
types.Prompt(
name="greet",
title="Greeting",
description="Ask the model to greet someone by name.",
arguments=[types.PromptArgument(name="name", required=True)],
),
types.Prompt(
name="code_review",
title="Code Review",
description="Ask the model to review a code snippet.",
arguments=[
types.PromptArgument(name="language", required=True),
types.PromptArgument(name="code", required=True),
],
),
]
def build_server() -> Server[Any]:
async def list_prompts(
ctx: ServerRequestContext[Any], params: types.PaginatedRequestParams | None
) -> types.ListPromptsResult:
return types.ListPromptsResult(prompts=PROMPTS)
async def get_prompt(ctx: ServerRequestContext[Any], params: types.GetPromptRequestParams) -> types.GetPromptResult:
args = params.arguments or {}
if params.name == "greet":
return types.GetPromptResult(
description="Ask the model to greet someone by name.",
messages=[
types.PromptMessage(
role="user",
content=types.TextContent(text=f"Write a one-line greeting for {args['name']}."),
)
],
)
if params.name == "code_review":
return types.GetPromptResult(
description="Ask the model to review a code snippet.",
messages=[
types.PromptMessage(
role="user",
content=types.TextContent(
text=f"Review this {args['language']} code for bugs and idioms:\n\n{args['code']}"
),
),
types.PromptMessage(
role="assistant",
content=types.TextContent(text="I'll review it. Let me read through the code first."),
),
],
)
raise NotImplementedError
async def completion(ctx: ServerRequestContext[Any], params: types.CompleteRequestParams) -> types.CompleteResult:
if (
isinstance(params.ref, types.PromptReference)
and params.ref.name == "code_review"
and params.argument.name == "language"
):
matches = [lang for lang in LANGUAGES if lang.startswith(params.argument.value)]
return types.CompleteResult(completion=types.Completion(values=matches, total=len(matches), has_more=False))
return types.CompleteResult(completion=types.Completion(values=[]))
return Server(
"prompts-example",
on_list_prompts=list_prompts,
on_get_prompt=get_prompt,
on_completion=completion,
)
if __name__ == "__main__":
run_server_from_args(build_server)