Skip to content

Prompts

Prompts are reusable message templates that MCP clients can invoke. They generate structured messages for LLM conversations.

Tools vs Prompts

ToolPrompt
PurposeAI executes code on the serverMessage template sent to AI
Who invokesAI selects and calls automaticallyUser selects explicitly
ReturnsExecution result (text, image, etc.)Message array (role + content)
ExamplesRun DB query, create file"Review this code" template

Simple rule: runs code on server → Tool, assembles messages for AI → Prompt.

Basic prompt

typescript
import { definePrompt } from '@airmcp-dev/core';

const summarize = definePrompt('summarize', {
  description: 'Summarize content',
  arguments: [
    { name: 'text', description: 'Text to summarize', required: true },
    { name: 'style', description: 'Summary style (brief/detailed)', required: false },
  ],
  handler: async ({ text, style }) => [
    {
      role: 'user',
      content: `Summarize the following in a ${style || 'brief'} style:\n\n${text}`,
    },
  ],
});

definePrompt API

Two calling styles:

typescript
// Style 1: name + options
definePrompt('summarize', { description, arguments, handler });

// Style 2: single object
definePrompt({ name: 'summarize', description, arguments, handler });

AirPromptDef

typescript
interface AirPromptDef {
  name: string;
  description?: string;
  arguments?: AirPromptArg[];
  handler: (args: Record<string, string>) => Promise<AirPromptMessage[]> | AirPromptMessage[];
}

handler can be sync or async.

AirPromptArg

typescript
interface AirPromptArg {
  name: string;
  description?: string;
  required?: boolean;    // Default: false
}

AirPromptMessage

typescript
interface AirPromptMessage {
  role: 'user' | 'assistant';
  content: string;
}

Internally converted to { role, content: { type: 'text', text: content } } when registered with MCP SDK.

Arguments

Prompt arguments are all string type (unlike tool params which support typed validation). This is a constraint of the MCP protocol spec.

typescript
definePrompt('search-help', {
  arguments: [
    { name: 'topic', description: 'Search topic', required: true },
    { name: 'language', description: 'Response language', required: false },
  ],
  handler: ({ topic, language }) => [
    { role: 'user', content: `Explain ${topic} in ${language || 'English'}.` },
  ],
});

Prompts without arguments:

typescript
definePrompt('greeting', {
  description: 'Default greeting message',
  handler: () => [
    { role: 'user', content: 'Hello! How can I help you?' },
  ],
});

Multi-turn prompts

Return multiple messages for a conversation template:

typescript
definePrompt('code-review', {
  description: 'Review code and suggest improvements',
  arguments: [
    { name: 'code', description: 'Code to review', required: true },
    { name: 'language', description: 'Programming language', required: true },
  ],
  handler: ({ code, language }) => [
    {
      role: 'user',
      content: `Review this ${language} code for bugs and improvements:\n\n\`\`\`${language}\n${code}\n\`\`\``,
    },
    {
      role: 'assistant',
      content: 'I\'ll review for potential bugs, performance issues, and style improvements.',
    },
    {
      role: 'user',
      content: 'Focus on security vulnerabilities if any.',
    },
  ],
});

Practical examples

Documentation helper

typescript
definePrompt('write-doc', {
  description: 'API documentation template',
  arguments: [
    { name: 'functionName', required: true },
    { name: 'signature', required: true },
    { name: 'purpose', required: true },
  ],
  handler: ({ functionName, signature, purpose }) => [
    {
      role: 'user',
      content: `Write API documentation for the following function.

Function: ${functionName}
Signature: ${signature}
Purpose: ${purpose}

Include: description, parameter table, return value, usage example, and caveats.`,
    },
  ],
});

SQL query helper

typescript
definePrompt('sql-help', {
  description: 'SQL query writing assistant',
  arguments: [
    { name: 'tables', description: 'Available table definitions', required: true },
    { name: 'question', description: 'Natural language question', required: true },
  ],
  handler: ({ tables, question }) => [
    {
      role: 'user',
      content: `Write a SQL query based on these tables:\n\n${tables}\n\nQuestion: ${question}\n\nUse PostgreSQL syntax and include an explanation.`,
    },
  ],
});

Error analysis

typescript
definePrompt('analyze-error', {
  description: 'Analyze error logs and suggest fixes',
  arguments: [
    { name: 'error', description: 'Error message or stack trace', required: true },
    { name: 'context', description: 'Context where error occurred', required: false },
  ],
  handler: ({ error, context }) => [
    {
      role: 'user',
      content: `Analyze this error and suggest fixes:\n\nError:\n${error}${context ? `\n\nContext:\n${context}` : ''}\n\nInclude:\n1. Root cause analysis\n2. Fix (with code)\n3. Prevention measures`,
    },
  ],
});

Register in server

typescript
defineServer({
  prompts: [
    definePrompt('summarize', {
      description: 'Summarize text',
      arguments: [{ name: 'text', required: true }],
      handler: ({ text }) => [
        { role: 'user', content: `Please summarize:\n\n${text}` },
      ],
    }),
    definePrompt('translate', {
      description: 'Translate text',
      arguments: [
        { name: 'text', required: true },
        { name: 'to', description: 'Target language', required: true },
      ],
      handler: ({ text, to }) => [
        { role: 'user', content: `Translate to ${to}:\n\n${text}` },
      ],
    }),
  ],
});

Released under the Apache-2.0 License.