or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

authentication.mdclient.mdindex.mdserver-advanced.mdserver-prompts.mdserver-resources.mdserver-tools.mdtransports.mdtypes.md

server-prompts.mddocs/

0

# Server Prompts API

1

2

Prompts are reusable conversation templates for LLM interactions. Designed to be user-driven (e.g., slash commands, conversation starters).

3

4

## Registration

5

6

```typescript { .api }

7

server.registerPrompt<Args extends PromptArgsRawShape>(

8

name: string,

9

config: {

10

title?: string;

11

description?: string;

12

argsSchema?: Args;

13

icons?: Icons;

14

_meta?: Record<string, unknown>;

15

},

16

callback: (args: z.infer<ZodObject<Args>>) => GetPromptResult | Promise<GetPromptResult>

17

): RegisteredPrompt;

18

```

19

20

## Examples

21

22

```typescript

23

import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';

24

import { z } from 'zod';

25

26

const server = new McpServer({ name: 'prompts-server', version: '1.0.0' });

27

28

// Simple prompt without arguments

29

server.registerPrompt('code-review', {

30

title: 'Code Review',

31

description: 'Review code for best practices'

32

}, () => ({

33

messages: [{

34

role: 'user',

35

content: { type: 'text', text: 'Please review my code for best practices and potential issues.' }

36

}]

37

}));

38

39

// Prompt with arguments

40

server.registerPrompt('analyze-file', {

41

title: 'Analyze File',

42

description: 'Analyze a specific file',

43

argsSchema: {

44

filePath: z.string().describe('Path to the file'),

45

analysisType: z.enum(['security', 'performance', 'style']).describe('Type of analysis to perform')

46

}

47

}, ({ filePath, analysisType }) => ({

48

description: `Analyze ${filePath} for ${analysisType}`,

49

messages: [{

50

role: 'user',

51

content: { type: 'text', text: `Please analyze ${filePath} focusing on ${analysisType} aspects.` }

52

}]

53

}));

54

55

// Prompt with embedded resources

56

server.registerPrompt('review-code-with-context', {

57

title: 'Code Review with Context',

58

description: 'Review code with full context',

59

argsSchema: {

60

code: z.string().describe('Code to review')

61

}

62

}, ({ code }) => ({

63

messages: [

64

{ role: 'user', content: { type: 'text', text: 'Please review this code:' } },

65

{ role: 'user', content: { type: 'resource', resource: { uri: 'inline://code', mimeType: 'text/plain', text: code } } }

66

]

67

}));

68

69

// Multi-turn conversation

70

server.registerPrompt('interactive-review', {

71

title: 'Interactive Code Review',

72

description: 'Start an interactive code review session'

73

}, () => ({

74

description: 'Interactive code review',

75

messages: [

76

{ role: 'user', content: { type: 'text', text: 'I need help reviewing some code' } },

77

{ role: 'assistant', content: { type: 'text', text: 'I\'d be happy to help! Please share the code you\'d like me to review.' } }

78

]

79

}));

80

```

81

82

## Argument Completion

83

84

```typescript { .api }

85

import { completable } from '@modelcontextprotocol/sdk/server/completable.js';

86

87

// completable<T>(schema: ZodType<T>, completeCallback: CompleteCallback<T>): Completable<T>

88

type CompleteCallback<T> = (value: string, context?: { arguments?: Record<string, unknown> }) => Promise<string[]> | string[];

89

```

90

91

### Example

92

93

```typescript

94

server.registerPrompt('team-greeting', {

95

title: 'Team Greeting',

96

description: 'Generate a greeting for team members',

97

argsSchema: {

98

department: completable(z.string(), (value) => {

99

return ['engineering', 'sales', 'marketing', 'support'].filter(d => d.startsWith(value));

100

}),

101

name: completable(z.string(), (value, context) => {

102

// Provide name suggestions based on selected department

103

const department = context?.arguments?.['department'];

104

if (department === 'engineering') {

105

return ['Alice', 'Bob', 'Charlie'].filter(n => n.startsWith(value));

106

} else if (department === 'sales') {

107

return ['David', 'Eve', 'Frank'].filter(n => n.startsWith(value));

108

}

109

return ['Guest'].filter(n => n.startsWith(value));

110

})

111

}

112

}, ({ department, name }) => ({

113

messages: [{

114

role: 'assistant',

115

content: { type: 'text', text: `Hello ${name}, welcome to the ${department} team!` }

116

}]

117

}));

118

```

119

120

## Return Values

121

122

```typescript { .api }

123

interface GetPromptResult {

124

description?: string;

125

messages: PromptMessage[];

126

_meta?: Record<string, unknown>;

127

}

128

129

interface PromptMessage {

130

role: 'user' | 'assistant';

131

content: ContentBlock; // TextContent | ImageContent | AudioContent | EmbeddedResource

132

}

133

```

134

135

### Examples

136

137

```typescript

138

// Simple text prompt

139

return {

140

messages: [{ role: 'user', content: { type: 'text', text: 'Analyze this data for trends' } }]

141

};

142

143

// Prompt with image

144

return {

145

messages: [{ role: 'user', content: { type: 'image', data: base64ImageData, mimeType: 'image/png' } }]

146

};

147

148

// Prompt with embedded resource

149

return {

150

messages: [{

151

role: 'user',

152

content: {

153

type: 'resource',

154

resource: { uri: 'file:///project/README.md', mimeType: 'text/markdown', text: readmeContent }

155

}

156

}]

157

};

158

```

159

160

## Managing Prompts

161

162

```typescript { .api }

163

interface RegisteredPrompt {

164

enable(): void;

165

disable(): void;

166

update(config: Partial<{ title?: string; description?: string; argsSchema?: PromptArgsRawShape; }>): void;

167

remove(): void;

168

}

169

```

170

171

## Notifications

172

173

```typescript { .api }

174

server.sendPromptListChanged(): Promise<void>;

175

```

176

177

## Types Reference

178

179

```typescript { .api }

180

interface Prompt {

181

name: string;

182

title?: string;

183

description?: string;

184

arguments?: PromptArgument[];

185

icons?: Icons;

186

_meta?: Record<string, unknown>;

187

}

188

189

interface PromptArgument {

190

name: string;

191

description?: string;

192

required?: boolean;

193

}

194

195

interface ListPromptsResult {

196

prompts: Prompt[];

197

nextCursor?: string;

198

}

199

200

type PromptArgsRawShape = Record<string, ZodTypeAny>;

201

```

202

203

## Legacy API

204

205

```typescript { .api }

206

server.prompt(name: string, callback: PromptCallback): RegisteredPrompt;

207

server.prompt(name: string, description: string, callback: PromptCallback): RegisteredPrompt;

208

server.prompt<Args extends PromptArgsRawShape>(name: string, argsSchema: Args, callback: PromptCallback<Args>): RegisteredPrompt;

209

server.prompt<Args extends PromptArgsRawShape>(name: string, description: string, argsSchema: Args, callback: PromptCallback<Args>): RegisteredPrompt;

210

```

211

212

Use `registerPrompt` for new code.

213