Viewing version 0.5.2. Open the latest package page.
dart_mcp
0.5.2A package for making MCP servers and clients.
Readme
A Dart package for making MCP servers and clients.
Note: This package is still experimental and is likely to evolve quickly.
Implementing Servers
To implement a server, import package:dart_mcp/server.dart and extend the
MCPServer class. You must provide the server a communication channel to send
and receive messages with.
For each specific MCP capability or utility your server supports, there is a
corresponding mixin that you can use (ToolsSupport, ResourcesSupport, etc).
Each mixin has doc comments explaining how to use it - some may require you to provide implementations of methods, while others may just expose new methods that you can call.
See the examples for some example code (server examples end in _server.dart).
Invoking Client Capabilities
All client capabilities are exposed as methods on the MCPServer class.
Before attempting to call these methods, you must first wait for the
MCPServer.initialized future and then check the capabilities of the
client by reading the MCPServer.clientCapabilities.
Alternatively, if your server requires certain capabilities from the client for
all operations, you may override the MCPServer.initialize function and return
an error, which may result in a better UX for the users of the client.
Implementing Clients
To implement a client, import package:dart_mcp/client.dart and extend the
MCPClient class, or directly call its constructor with a
Implementation if you aren't implementing any "capabilities".
For each specific MCP capability your client supports, there is a corresponding
mixin that you can use (RootsSupport, SamplingSupport, etc). Each mixin has
doc comments explaining how to use it - some may require you to provide
implementations of methods, while others may just expose new methods that you
can call.
Connecting to Servers
You can connect this client with STDIO servers using the
MCPClient.connectStdioServer method, or you can call MCPClient.connectServer
with any other communication channel.
The returned ServerConnection should be used for all interactions with the
server, starting with a call to ServerConnection.initialize, followed up with
a call to ServerConnection.notifyInitialized (if initialization was
successful). If a version could not be negotiated or a server does not support
required features, the server connection should be closed (by calling
ServerConnection.shutdown).
See initialization lifecycle for information about the client/server initialization protocol.
Invoking Server Capabilities and Utilities
All server capabilities and utilities are exposed as methods or streams on the
ServerConnection class.
Before attempting to call methods on the server however, you should first verify
the capabilities of the server by reading them from the InitializeResult returned
from ServerConnection.initialize.
Supported Protocol Versions
2024-11-05 2025-03-26 2025-06-18 2025-11-05
If support for a given protocol version is dropped, that will be released as a breaking change in this package.
However, we will strive to maintain backwards compatibility where possible.
Base Utilities
This table describes the state of implementation for the base protocol utilities.
Both the MCPServer and MCPClient support these.
| Utility | Support | Notes |
|---|---|---|
| Ping | :heavy_check_mark: | |
| Cancellation | :x: | https://github.com/dart-lang/ai/issues/37 |
| Progress | :heavy_check_mark: |
Transport Mechanisms
This table describes the supported transport mechanisms.
At its core this package is just built on streams, so any transport mechanism can be used, but some are directly supported out of the box.
| Transport | Support | Notes |
|---|---|---|
| Stdio | :heavy_check_mark: | |
| Streamable HTTP | :x: | Unsupported at this time, may come in the future. |
Batching Requests
Both the client and server support processing batch requests, but do not support creating batch requests at this time.
Authorization
Authorization is not supported at this time. This package is primarily targeted at local MCP server usage for now.
Server Capabilities
This table describes the state of implementation for the server capabilities.
Note: Servers can also invoke all client capabilities, see Invoking Client Capabilities.
| Capability | Support | Notes |
|---|---|---|
| Prompts | :heavy_check_mark: | |
| Resources | :heavy_check_mark: | |
| Tools | :heavy_check_mark: |
Server Utilities
This table describes the state of implementation for the server utilities.
| Utility | Support | Notes |
|---|---|---|
| Completion | :heavy_check_mark: | |
| Logging | :heavy_check_mark: | |
| Pagination | :construction: | https://github.com/dart-lang/ai/issues/28 |
Client Capabilities
This table describes the state of implementation for the client capabilities.
Note: Clients can also invoke all server capabilities and server utilities, see Invoking Server Capabilities and Utilities.
| Capability | Support | Notes |
|---|---|---|
| Roots | :heavy_check_mark: | |
| Sampling | :heavy_check_mark: |
Changelog
0.5.2
- Update
listRootsto normalize URIs to file: scheme variants when given raw file paths. This fixes non-spec compliant clients.
0.5.1
- Always send a properties object for tool input schemas, see https://github.com/dart-lang/ai/issues/170.
0.5.0
- Initial support for protocol version 2025-11-25.
- Added support for
Icons inImplementation,Tool,Resource,ResourceTemplate, andPrompt. - Added support for
ToolChoicein samplingCreateMessageRequest. - Added support for URL-based elicitations in
ElicitRequest.- Separated
ElicitationSupportintoElicitationFormSupportandElicitationUrlSupportmixins, which will affect which capabilities your server advertises. The originalElicitationSupportmixin is now deprecated (and is an alias forElicitationFormSupport). - Added
onElicitationCompleteextension getter toElicitRequest, which will listen fornotifications/elicitation/completenotifications. - If a tool call fails with the
urlElicitationRequirederror code, and the client supports URL based elicitations, the client will automatically handle the elicitation and retry the tool call if the elicitation succeeds.
- Separated
- Added an
McpErrorCodesnamespace for MCP error codes. For now only contains theurlElicitationRequirederror code. - Added examples for URL based elicitations, including handling
urlElicitationRequirederrors. - Added
descriptionfield toImplementation. - Does not add support for Tasks yet.
- Added support for
EnumSchemasubtypes, matching the spec. This includes multi select enums and enums with titles. Validation is also supported. - Added
Meta? metaparam toElicitRequest.
- Added support for
- Added
ConstSchematype for constant values, with validation. - BREAKING:
- Change many fields of
ResourceLinkto be nullable, and their associated parameters to be optional. This brings us in line with the specification. - The
WithElicitationHandlerinterface is now private and implemented by theElicitationFormSupportandElicitationUrlSupportmixins. - Added a required
ServerConnection serverparameter to theElicitationSupport.handleElicitationmethod. ElicitRequest.requestedSchemais now nullable (for url mode).EnumSchemais now a union type with 4 subtypes, matching the spec changes.
- Change many fields of
0.4.1
- Expose various private methods on MCP server mixins as public methods, with
@mustCallSuperannotations. This allows intercepting calls for logging, metrics, or other purposes. - Fix the
resourceparameter type onEmbeddedResourceto beResourceContentsinstead ofContents.- Note: This is technically breaking but the previous API would not have been possible to use in a functional manner, so it is assumed that it had no usage previously.
- Fix the
typegetter onEmbeddedResourceto read the actual type field. - Add
toJsonmethod to theCreateMessageResultof a sampling request.
0.4.0
- Update the tool calling example to include progress notifications.
- Breaking: Update APIs to accept nullable parameters when the parameters are not required for that method. This is only breaking if you override these methods.
0.3.3
- Fix
PingRequesthandling when it is sent from a non-Dart client. - Deprecate
ElicitationAction.rejectand replace it withElicitationAction.decline.- In the initial elicitations schema this was incorrectly listed as
reject. - This package still allows
rejectand treats it as an alias fordecline. - The old
rejectenum value was replaced with a static constant equal exactly todecline, so switches are not affected.
- In the initial elicitations schema this was incorrectly listed as
- Add
titleparameter toPromptconstructor. - Only execute sub-processes in a shell if they are
.batfiles.
0.3.2
- Deprecate the
EnumSchematype in favor of theStringSchemawith anenumValuesparameter. TheEnumSchematype was not MCP spec compatible.- Also deprecated the associated JsonType.enumeration which doesn't exist in the JSON schema spec.
0.3.1
- Fixes communication problem when a
MCPServeris instantiated without instructions. - Fix the
contentargument toPromptMessageto be a singleContentobject. - Add new
package:dart_mcp/stdio.dartlibrary with astdioChannelutility for creating a stream channel that separates messages by newlines. - Added more examples.
- Deprecated the
WithElicitationHandlerinterface - the method this required is now defined directly on theElicitationSupportmixin which matches the pattern used by other mixins in this package. - Change the
schemaparameter for elicitation requests to anObjectSchemato match the spec. - Deprecate the
Elicitationsserver capability, this doesn't exist in the spec.
0.3.0
- Added error checking to required fields of all
Requestsubclasses so that they will throw helpful errors when accessed and not set. - Added enum support to Schema.
- Add more detail to type validation errors.
- Remove some duplicate validation errors, errors are only reported for the
leaf nodes and not all the way up the tree.
- Deprecated a few validation error types as a part of this, including
propertyNamesInvalid,propertyValueInvalid,itemInvalidandprefixItemInvalid.
- Deprecated a few validation error types as a part of this, including
- Added a
customvalidation error type. - Breaking: Auto-validate schemas for all tools by default. This can be
disabled by passing
validateArguments: falsetoregisterTool. - Updates to the latest MCP spec, 2025-06-08
- Adds support for Elicitations to allow the server to ask the user questions.
- Adds
ResourceLinkas a tool return content type. - Adds support for structured tool output.
- Breaking: Change
MCPClient.connectStdioServersignature to accept stdin and stdout streams instead of starting processes itself. This enables custom process spawning (such as using package:process), and also enables the client to run in browser environments. - Fixed a problem where specifying
--log-filewould cause the server to stop working.
0.2.2
- Refactor
ClientImplementationandServerImplementationto the sharedImplementationtype to match the spec. The old names are deprecated but will still work until the next breaking release. - Add
clientInfofield toMCPServer, assigned during initialization. - Move the
donefuture from theServerConnectionintoMCPBaseso it is available to theMPCServerclass as well.
0.2.1
- Fix the
protocolLogSinksupport when usingMCPClient.connectStdioServer. - Update workflow example to show thinking spinner and input and output token usage.
- Update file system example to support relative paths.
- Fix a bug in notification handling where leaving off the parameters caused a type exception.
- Added
--help,--log, and--modelflags to the workflow example. - Fixed a bug where the examples would only connect to a server with the latest protocol version.
- Handle failed calls to
listRootsin theRootsTrackingSupportmixin more gracefully. Previously this would leave therootsfuture hanging indefinitely, but now it will log an error and set the roots to empty. - Added validation for Schema extension.
- Fixed an issue where getting the type of a Schema with a null type would throw.
0.2.0
- Support protocol version 2025-03-26.
- Adds support for
AudioContent. - Adds support for
ToolAnnotations. - Adds support for
ProgressNotificationmessages.
- Adds support for
- Save the
ServerCapabilitiesobject on theServerConnectionclass to make it easier to check the capabilities of the server. - Add default version negotiation logic.
- Save the negotiated
ProtocolVersionin aprotocolVersionfield for bothMCPServerand theServerConnectionclasses. - Automatically disconnect from servers if version negotiation fails.
- Save the negotiated
- Added support for adding and listing
ResourceTemplates.- Handlers have to handle their own matching of templates.
- Added a
RootsTrackingSupportserver mixin which can be used to keep an updated list of the roots set by the client. - Added default throttling with a 500ms delay for
ResourceListChangedNotifications andResourceUpdatedNotifications. The delay can be modified by overridingResourcesSupport.resourceUpdateThrottleDelay. - Add
Sink<String> protocolLogSinkparameters to server constructor and client connection methods, which can be used to capture protocol messages for debugging purposes. - Only send notifications if the peer is still connected. Fixes issues where notifications are delayed due to throttling and the client has since closed.
- Breaking: Fixed paginated result subtypes to use
nextCursorinstead ofcursoras the key for the next cursor. - Breaking: Change the
ProgressNotification.progressandProgressNotification.totaltypes tonuminstead ofintto align with the spec. - Breaking: Change the
protocolVersionstring to aProtocolVersionenum, which has all supported versions and whether or not they are supported. - Breaking: Change
InitializeRequestandInitializeResultto take aProtocolVersioninstead of a string. - Breaking: Change the
InitializeResult'sinstructionstoString?to reflect that not all servers return instructions. - Change the
MCPServer.fromStreamChannelconstructor to make theinstructionsparameter optional. - Breaking: Change
MCPBaseto accept aStreamChannel<String>instead of aPeer, and construct its ownPeer. - Breaking: Add
protocolLogSinkoptional parameter to connect methods onMCPClient. - Breaking: Move
channelparameter onMCPServer.newto a positional parameter for consistency.
0.1.0
- Initial release, supports all major MCP functionality for both clients and servers, at protocol version 2024-11-05.
- APIs may change frequently until the 1.0.0 release based on feedback and needs.
Installing
export PUB_HOSTED_URL=https://pub.mirror.p-hatan.ir
flutter pub add 'dart_mcp:0.5.2'pubspec.yaml
name: dart_mcp
version: 0.5.2
description: A package for making MCP servers and clients.
repository: https://github.com/dart-lang/ai/tree/main/pkgs/dart_mcp
issue_tracker: https://github.com/dart-lang/ai/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Adart_mcp
environment:
sdk: ^3.7.0
dependencies:
async: ^2.13.0
collection: ^1.19.1
json_rpc_2: ">=3.0.3 <5.0.0"
meta: ^1.16.0
stream_channel: ^2.1.4
stream_transform: ^2.1.1
dev_dependencies:
dart_flutter_team_lints: ^3.2.1
test: ^1.25.15
Version history
| Version | Published | Archive | SHA-256 |
|---|---|---|---|
| 0.1.0-wip | On demand | Download | 4a1d9f2e…2e32a7 |
| 0.1.0 | On demand | Download | be3dfdf5…64afef |
| 0.2.0 | On demand | Download | f3804635…a0876a |
| 0.2.1 | On demand | Download | a5bd04e6…0e4173 |
| 0.2.2 | On demand | Download | 7caf75ac…da07ff |
| 0.3.0 | On demand | Download | 48be26e4…a4e4e2 |
| 0.3.1 | On demand | Download | 0f0074bc…e6a2f6 |
| 0.3.2 | On demand | Download | 4c30dacf…7df7a7 |
| 0.3.3 | On demand | Download | 2b34cbd6…66de45 |
| 0.4.0 | On demand | Download | 5c6d4cdb…368916 |
| 0.4.1 | On demand | Download | dda8a8a8…0779e4 |
| 0.5.0 | On demand | Download | 92a2ee1c…b9c4b1 |
| 0.5.1 | On demand | Download | c133c6f3…8acddf |
| 0.5.2 | Cached · Upstream SHA-256 matched | Download | 852b51da…ceac7a |
Dependencies
async "^2.13.0"
collection "^1.19.1"
json_rpc_2 "\u003e=3.0.3 \u003c5.0.0"
meta "^1.16.0"
stream_channel "^2.1.4"
stream_transform "^2.1.1"