blob: 97cc35101cd22eea7517876aa75efcf0a2ff2695 [file] [edit]
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
/// A server that makes sampling requests to a client.
library;
import 'dart:async';
import 'dart:io' as io;
import 'package:dart_mcp/server.dart';
import 'package:dart_mcp/stdio.dart';
void main() {
// Create the server and connect it to stdio.
MCPServerWithSampling(stdioChannel(input: io.stdin, output: io.stdout));
}
/// This server uses the [createMessage] function to make sampling requests
/// to the client.
base class MCPServerWithSampling extends MCPServer with LoggingSupport {
MCPServerWithSampling(super.channel)
: super.fromStreamChannel(
implementation: Implementation(
name: 'An example dart server which makes sampling requests',
version: '0.1.0',
),
instructions: 'Just respond to the requests',
) {
// You can't make requests until after we are fully initialized.
unawaited(initialized.then((_) => _makeSamplingRequest()));
}
/// Makes a sampling request and logs the response.
void _makeSamplingRequest() async {
// Actually send the request.
final result = await createMessage(
CreateMessageRequest(
// All of the messages to be included in the context for the sampling
// request.
messages: [
SamplingMessage(
// The role to be assigned the message in the context.
role: Role.user,
// The actual content of the message in the context.
content: Content.text(text: 'Hello'),
),
],
// The maximum response size in tokens.
maxTokens: 1000,
// This controls how much additional context to include from the
// original chat in the sampling request. Note that clients may not
// respect this argument.
includeContext: IncludeContext.none,
),
);
// Simply log the result, the client will print this to the console.
log(
LoggingLevel.warning,
'(${result.role}): ${(result.content as TextContent).text}',
);
}
}