Skip to content

Commit 7bef5a2

Browse files
committed
Test README prompt definition examples
1 parent 2e3d9cf commit 7bef5a2

File tree

4 files changed

+97
-12
lines changed

4 files changed

+97
-12
lines changed

README.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -349,12 +349,13 @@ The `MCP::Prompt` class provides two ways to create prompts:
349349

350350
1. As a class definition with metadata:
351351

352+
<!-- SNIPPET ID: prompt_class_definition -->
352353
```ruby
353354
class MyPrompt < MCP::Prompt
354355
prompt_name "my_prompt" # Optional - defaults to underscored class name
355356
description "This prompt performs specific functionality..."
356357
arguments [
357-
Prompt::Argument.new(
358+
MCP::Prompt::Argument.new(
358359
name: "message",
359360
description: "Input message",
360361
required: true
@@ -363,16 +364,16 @@ class MyPrompt < MCP::Prompt
363364

364365
class << self
365366
def template(args, server_context:)
366-
Prompt::Result.new(
367+
MCP::Prompt::Result.new(
367368
description: "Response description",
368369
messages: [
369-
Prompt::Message.new(
370+
MCP::Prompt::Message.new(
370371
role: "user",
371-
content: Content::Text.new("User message")
372+
content: MCP::Content::Text.new("User message")
372373
),
373-
Prompt::Message.new(
374+
MCP::Prompt::Message.new(
374375
role: "assistant",
375-
content: Content::Text.new(args["message"])
376+
content: MCP::Content::Text.new(args[:message])
376377
)
377378
]
378379
)
@@ -385,28 +386,29 @@ prompt = MyPrompt
385386

386387
2. Using the `MCP::Prompt.define` method:
387388

389+
<!-- SNIPPET ID: prompt_definition_with_block -->
388390
```ruby
389391
prompt = MCP::Prompt.define(
390392
name: "my_prompt",
391393
description: "This prompt performs specific functionality...",
392394
arguments: [
393-
Prompt::Argument.new(
395+
MCP::Prompt::Argument.new(
394396
name: "message",
395397
description: "Input message",
396398
required: true
397399
)
398400
]
399401
) do |args, server_context:|
400-
Prompt::Result.new(
402+
MCP::Prompt::Result.new(
401403
description: "Response description",
402404
messages: [
403-
Prompt::Message.new(
405+
MCP::Prompt::Message.new(
404406
role: "user",
405-
content: Content::Text.new("User message")
407+
content: MCP::Content::Text.new("User message")
406408
),
407-
Prompt::Message.new(
409+
MCP::Prompt::Message.new(
408410
role: "assistant",
409-
content: Content::Text.new(args["message"])
411+
content: MCP::Content::Text.new(args[:message])
410412
)
411413
]
412414
)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
require "mcp"
4+
5+
require_relative "code_snippet"
6+
7+
b = binding
8+
eval(File.read("code_snippet.rb"), b) # rubocop:disable Security/Eval -- We need to run the snippet in this context to extract the prompt
9+
prompt = b.local_variable_get(:prompt)
10+
11+
server = MCP::Server.new(prompts: [prompt])
12+
13+
[
14+
{ jsonrpc: "2.0", id: "1", method: "prompts/list" },
15+
{ jsonrpc: "2.0", id: "2", method: "prompts/get", params: { name: "my_prompt", arguments: { message: "Test message" } } },
16+
].each { |request| puts server.handle_json(request.to_json) }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
prompt_class_definition.rb

test/integration/readme_code_snippets_test.rb

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,72 @@ class ReadmeCodeSnippetsTest < ActiveSupport::TestCase
155155
)
156156
end
157157

158+
test "Prompts examples work exactly as documented in README" do
159+
assert_json_lines(
160+
[
161+
{
162+
jsonrpc: "2.0",
163+
id: "1",
164+
result: {
165+
prompts: [
166+
{
167+
name: "my_prompt",
168+
description: "This prompt performs specific functionality...",
169+
arguments: [
170+
{ name: "message", description: "Input message", required: true },
171+
],
172+
},
173+
],
174+
},
175+
},
176+
{
177+
jsonrpc: "2.0",
178+
id: "2",
179+
result: {
180+
description: "Response description",
181+
messages: [
182+
{ role: "user", content: { type: "text", text: "User message" } },
183+
{ role: "assistant", content: { type: "text", text: "Test message" } },
184+
],
185+
},
186+
},
187+
],
188+
run_code_snippet("prompt_class_definition"),
189+
)
190+
191+
assert_json_lines(
192+
[
193+
{
194+
jsonrpc: "2.0",
195+
id: "1",
196+
result: {
197+
prompts: [
198+
{
199+
name: "my_prompt",
200+
description: "This prompt performs specific functionality...",
201+
arguments: [
202+
{ name: "message", description: "Input message", required: true },
203+
],
204+
},
205+
],
206+
},
207+
},
208+
{
209+
jsonrpc: "2.0",
210+
id: "2",
211+
result: {
212+
description: "Response description",
213+
messages: [
214+
{ role: "user", content: { type: "text", text: "User message" } },
215+
{ role: "assistant", content: { type: "text", text: "Test message" } },
216+
],
217+
},
218+
},
219+
],
220+
run_code_snippet("prompt_definition_with_block"),
221+
)
222+
end
223+
158224
private
159225

160226
def assert_json_lines(expected, actual, message = "Expected the given JSON lines")

0 commit comments

Comments
 (0)