Skip to content

Prompts

Prompts are reusable templates that help structure interactions with AI models.

Defining a Prompt

zig
try server.addPrompt(.{
    .name = "summarize",
    .description = "Summarize a piece of text",
    .handler = summarizeHandler,
});

Prompt Properties

PropertyTypeDescription
name[]const u8Unique prompt name
title?[]const u8Human-readable title
description?[]const u8Description of the prompt
arguments?[]PromptArgumentExpected arguments
handler*HandlerFunction to generate messages

Handler Functions

zig
fn promptHandler(
    allocator: std.mem.Allocator,
    args: ?std.json.Value,
) PromptError![]const PromptMessage;

Example Handler

zig
fn codeReviewHandler(
    allocator: std.mem.Allocator,
    args: ?std.json.Value,
) mcp.prompts.PromptError![]const mcp.prompts.PromptMessage {
    const code = mcp.prompts.getStringArg(args, "code") orelse {
        return error.InvalidArguments;
    };

    const language = mcp.prompts.getStringArg(args, "language") orelse "unknown";

    const system_prompt = try std.fmt.allocPrint(
        allocator,
        "You are a code reviewer. Review the following {s} code for best practices, bugs, and improvements.",
        .{language},
    );

    return &.{
        mcp.prompts.userMessage(system_prompt),
        mcp.prompts.userMessage(code),
    };
}

Prompt Arguments

Define expected arguments:

zig
try server.addPrompt(.{
    .name = "analyze",
    .description = "Analyze text for sentiment",
    .arguments = &.{
        .{ .name = "text", .description = "Text to analyze", .required = true },
        .{ .name = "language", .description = "Language of the text", .required = false },
    },
    .handler = analyzeHandler,
});

Message Types

User Message

zig
mcp.prompts.userMessage("Analyze this text for me")

Assistant Message

zig
mcp.prompts.assistantMessage("I'll analyze the text...")

Custom Role

zig
.{
    .role = "system",
    .content = .{ .text = .{ .text = "You are a helpful assistant." } },
}

Using PromptBuilder

zig
var builder = mcp.prompts.PromptBuilder.init(allocator, "my_prompt");
defer builder.deinit();

const prompt = builder
    .description("A helpful prompt")
    .addArgument("input", "The input text", true)
    .addArgument("style", "Output style", false)
    .handler(myHandler)
    .build();

try server.addPrompt(prompt);

Complete Example

zig
const std = @import("std");
const mcp = @import("mcp");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    var server = mcp.Server.init(.{
        .name = "prompt-server",
        .version = "1.0.0",
        .allocator = allocator,
    });
    defer server.deinit();

    server.enablePrompts(true);

    // Simple prompt
    try server.addPrompt(.{
        .name = "explain",
        .description = "Explain a concept simply",
        .arguments = &.{
            .{ .name = "concept", .description = "The concept to explain", .required = true },
            .{ .name = "level", .description = "Expertise level (beginner/advanced)", .required = false },
        },
        .handler = explainHandler,
    });

    // Code generation prompt
    try server.addPrompt(.{
        .name = "generate_code",
        .description = "Generate code for a task",
        .arguments = &.{
            .{ .name = "task", .description = "What the code should do", .required = true },
            .{ .name = "language", .description = "Programming language", .required = true },
        },
        .handler = generateCodeHandler,
    });

    try server.run(.stdio);
}

fn explainHandler(
    allocator: std.mem.Allocator,
    args: ?std.json.Value,
) mcp.prompts.PromptError![]const mcp.prompts.PromptMessage {
    const concept = mcp.prompts.getStringArg(args, "concept") orelse {
        return error.InvalidArguments;
    };

    const level = mcp.prompts.getStringArg(args, "level") orelse "beginner";

    const prompt_text = try std.fmt.allocPrint(
        allocator,
        "Please explain '{s}' at a {s} level. Use simple examples and analogies.",
        .{ concept, level },
    );

    return &.{
        mcp.prompts.userMessage(prompt_text),
    };
}

fn generateCodeHandler(
    allocator: std.mem.Allocator,
    args: ?std.json.Value,
) mcp.prompts.PromptError![]const mcp.prompts.PromptMessage {
    const task = mcp.prompts.getStringArg(args, "task") orelse {
        return error.InvalidArguments;
    };

    const language = mcp.prompts.getStringArg(args, "language") orelse {
        return error.InvalidArguments;
    };

    const system = try std.fmt.allocPrint(
        allocator,
        "You are an expert {s} programmer. Generate clean, well-documented code.",
        .{language},
    );

    const user = try std.fmt.allocPrint(
        allocator,
        "Write {s} code to: {s}",
        .{ language, task },
    );

    return &.{
        .{ .role = "system", .content = .{ .text = .{ .text = system } } },
        mcp.prompts.userMessage(user),
    };
}

Next Steps