Add Dart MCP Server Feature
dart-lang/ai
Instructions for adding new features (tools, prompts, etc.) to the dartmcpserver package.
A skill your agent uses when building or extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project, creating an McpServer, adding tools, resources, resource…
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install leehack/mcp_dart mcp-dart-server --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/mcp-dart-server .claude/skills/mcp-dart-server && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .claude/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-serverType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install leehack/mcp_dart mcp-dart-server --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/mcp-dart-server .agents/skills/mcp-dart-server && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .agents/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install leehack/mcp_dart mcp-dart-server --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/mcp-dart-server .cursor/skills/mcp-dart-server && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .cursor/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/leehack/mcp_dart.git --path skills/mcp-dart-server--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install leehack/mcp_dart mcp-dart-server --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/mcp-dart-server .gemini/skills/mcp-dart-server && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .gemini/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install leehack/mcp_dart mcp-dart-serverInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/mcp-dart-server .github/skills/mcp-dart-server && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .github/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add leehack/mcp_dart --skill mcp-dart-server -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install leehack/mcp_dart mcp-dart-server --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/leehack/mcp_dart.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/mcp-dart-server .opencode/skills/mcp-dart-server && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "mcp-dart-server" agent skill from https://github.com/leehack/mcp_dart/tree/main/skills/mcp-dart-server into .opencode/skills/mcp-dart-server/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "mcp-dart-server", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
mcp-dart-serverA skill your agent uses when building or extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project, creating an McpServer, adding tools, resources, resource…
MCP Dart Server is an agent skill from leehack/mcp_dart. Use when building or extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project, creating an McpServer, adding tools, resources, resource templates or prompts, returning tool results and errors, reporting progress, running over stdio, or testing the server.
Its SKILL.md is about 4.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Agent Workflows, covering MCP servers. It works with Model Context Protocol and Dart. The repository describes itself as: Dart implementation of MCP SDK. The licence is MIT.
Read from SKILL.md and the folder at commit 69ffef3. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dartFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
MCP Dart Server loads about 4.1k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 642 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from leehack/mcp_dart at commit 69ffef3, republished under its MIT licence (© leehack). 642 words, ~4,059 tokens.
.claude/skills/mcp-dart-server/SKILL.md (or your agent's skills folder).McpServer exposes tools, resources and prompts to MCP clients. By default it
speaks MCP 2026-07-28 and falls back to initialization-era versions (MCP
2025-11-25 and earlier) for legacy clients. Import everything from
package:mcp_dart/mcp_dart.dart.
Keep MCP wiring thin and separate from the application's logic. This is the
layout that mcp_dart create generates; use it for hand-written servers too:
my_server/
bin/server.dart # Reads config, builds shared services, picks the transport.
lib/mcp/mcp.dart # createMcpServer(services): the only server factory.
lib/mcp/tools/base_tool.dart # BaseTool + registerBaseTool extension.
lib/mcp/tools/*_tool.dart # One class per tool; dependencies via the constructor.
lib/mcp/resources/ # Resources and resource templates.
lib/mcp/prompts/ # Prompts.
lib/src/ # Domain services and models; no mcp_dart imports.
test/ # In-process client/server tests.lib/mcp/tools/base_tool.dart already exists, the project came from
mcp_dart create. Follow it: add a BaseTool subclass and list it in
createAllTools(), and use BaseResource/BasePrompt the same way. Do not
add inline registerTool calls beside that pattern.dart pub global activate mcp_dart_cli
then mcp_dart create my_server (the CLI needs Dart 3.12; the generated
project adds args and logging and targets Dart 3.4). Adding a server to
an existing package needs only dart pub add mcp_dart.CallToolResult(isError: true). Keep business rules,
I/O and state in lib/src/ so they are testable without MCP.bin/server.dart and pass them to
createMcpServer. Never create state inside a tool call or inside a
Streamable HTTP serverFactory, which runs per request or session.McpServer(Implementation(name:, version:)). The
register* methods advertise the tools, resources and prompts
capabilities automatically; pass McpServerOptions(capabilities: ...) only
for extra flags such as listChanged or subscribe, and advertise only
what the server actually implements.McpProtocol.stable profile. Use
McpServerOptions(protocol: McpProtocol.legacy) or
McpProtocol.require2026 only when a deployment must pin one protocol era.connect. One McpServer instance owns one
transport; build a fresh instance per transport from createMcpServer.JsonSchema.object(properties: ..., required: ...).
The SDK validates arguments before the callback runs, so the callback may
cast declared fields (args['a'] as num). Still validate business rules.(Map<String, dynamic> args, RequestHandlerExtra extra)
and return CallToolResult. Return CallToolResult(isError: true, ...) for
expected domain failures (not found, bad input, upstream API errors) so the
model can recover. Throw McpError(ErrorCode.x.value, message) only for
protocol-level failures.outputSchema and return
CallToolResult.fromStructuredContent({...}); it also fills content with
the serialized JSON for clients that ignore structured content.ToolAnnotations(readOnlyHint: true), destructiveHint,
idempotentHint or openWorldHint honestly; they are hints, not access
control.extra.sendProgress(done, total: n, message: ...)
(a no-op when the client sent no progress token) and check
extra.signal.aborted to stop promptly after cancellation.registerResource(name, uri, (description:, mimeType:), callback)
for fixed URIs; registerResourceTemplate(name, ResourceTemplateRegistration('scheme://{var}', listCallback: null), ...) for
URI families. Return contents whose uri is the concrete requested URI.
For an unknown URI, throw McpError with invalidParams for MCP 2026-07-28
requests and resourceNotFound for legacy ones.registerPrompt(name, argsSchema: {...}, callback: ...). The
prompt callback's args and extra are nullable.InputRequiredResult) needs the registerStateless* counterpart. Use the
plain register* methods otherwise.stderr, never print. Tune SDK-internal logs with setMcpLogHandler
or silenceMcpLogs.StdioServerTransport(maxIncomingMessageBytes: ...) only when needed, and
keep it finite.IOStreamTransport pair with
fake or in-memory services. Check a running server by hand with
mcp_dart inspect (the CLI's mcp_dart skills install adds a debugging
workflow skill for its inspect and trace commands).A complete server in the layout above. Each block is one file, named by its
first line; my_server is the package name.
// file: lib/src/note_repository.dart
/// Thrown when a note violates a business rule.
class NoteRejected implements Exception {
NoteRejected(this.message);
final String message;
}
/// Domain service; it knows nothing about MCP.
class NoteRepository {
final Map<String, String> _notes = {};
Iterable<String> get ids => _notes.keys;
String? read(String id) => _notes[id];
void save(String id, String text) {
if (!RegExp(r'^[a-z0-9-]+$').hasMatch(id)) {
throw NoteRejected('id must be lowercase letters, digits or hyphens.');
}
_notes[id] = text;
}
}// file: lib/mcp/tools/base_tool.dart
import 'package:mcp_dart/mcp_dart.dart';
abstract class BaseTool {
String get name;
String get description;
ToolInputSchema get inputSchema;
ToolOutputSchema? get outputSchema => null;
ToolAnnotations? get annotations => null;
Future<CallToolResult> execute(
Map<String, dynamic> args,
RequestHandlerExtra extra,
);
}
extension ToolRegistration on McpServer {
void registerBaseTool(BaseTool tool) {
registerTool(
tool.name,
description: tool.description,
inputSchema: tool.inputSchema,
outputSchema: tool.outputSchema,
annotations: tool.annotations,
callback: tool.execute,
);
}
}// file: lib/mcp/tools/add_note_tool.dart
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/mcp/tools/base_tool.dart';
import 'package:my_server/src/note_repository.dart';
class AddNoteTool extends BaseTool {
AddNoteTool(this._notes);
final NoteRepository _notes;
@override
String get name => 'add_note';
@override
String get description => 'Store a note under an id.';
@override
ToolInputSchema get inputSchema => JsonSchema.object(
properties: {
'id': JsonSchema.string(description: 'Lowercase note id'),
'text': JsonSchema.string(description: 'Note body'),
},
required: ['id', 'text'],
);
@override
ToolAnnotations get annotations =>
const ToolAnnotations(idempotentHint: true);
@override
Future<CallToolResult> execute(
Map<String, dynamic> args,
RequestHandlerExtra extra,
) async {
final id = args['id'] as String;
try {
_notes.save(id, args['text'] as String);
} on NoteRejected catch (error) {
return CallToolResult(
isError: true,
content: [TextContent(text: error.message)],
);
}
return CallToolResult(content: [TextContent(text: 'Saved $id.')]);
}
}// file: lib/mcp/tools/count_notes_tool.dart
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/mcp/tools/base_tool.dart';
import 'package:my_server/src/note_repository.dart';
class CountNotesTool extends BaseTool {
CountNotesTool(this._notes);
final NoteRepository _notes;
@override
String get name => 'count_notes';
@override
String get description => 'Return how many notes are stored.';
@override
ToolInputSchema get inputSchema => JsonSchema.object(properties: {});
@override
ToolOutputSchema get outputSchema => JsonSchema.object(
properties: {'count': JsonSchema.integer()},
required: ['count'],
);
@override
ToolAnnotations get annotations => const ToolAnnotations(readOnlyHint: true);
@override
Future<CallToolResult> execute(
Map<String, dynamic> args,
RequestHandlerExtra extra,
) async =>
CallToolResult.fromStructuredContent({'count': _notes.ids.length});
}// file: lib/mcp/resources/note_resources.dart
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/src/note_repository.dart';
void registerNoteResources(McpServer server, NoteRepository notes) {
server.registerResource(
'Note index',
'notes://index',
(description: 'All note ids', mimeType: 'text/plain'),
(uri, extra) => ReadResourceResult(
contents: [
TextResourceContents(
uri: uri.toString(),
mimeType: 'text/plain',
text: notes.ids.join('\n'),
),
],
),
);
server.registerResourceTemplate(
'Note',
ResourceTemplateRegistration('notes://{id}', listCallback: null),
(description: 'One note by id', mimeType: 'text/plain'),
(uri, variables, extra) {
final id = variables['id'];
final text = id is String ? notes.read(id) : null;
if (text == null) {
final version = extra.protocolVersion;
throw McpError(
version != null && isStatelessProtocolVersion(version)
? ErrorCode.invalidParams.value
: ErrorCode.resourceNotFound.value,
'Resource not found',
{'uri': uri.toString()},
);
}
return ReadResourceResult(
contents: [
TextResourceContents(
uri: uri.toString(),
mimeType: 'text/plain',
text: text,
),
],
);
},
);
}// file: lib/mcp/prompts/note_prompts.dart
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/src/note_repository.dart';
void registerNotePrompts(McpServer server, NoteRepository notes) {
server.registerPrompt(
'summarize_note',
description: 'Ask the model to summarize a note.',
argsSchema: const {
'id': PromptArgumentDefinition(description: 'Note id', required: true),
},
callback: (args, extra) {
final id = args?['id'] as String? ?? '';
return GetPromptResult(
messages: [
PromptMessage(
role: PromptMessageRole.user,
content: TextContent(
text: 'Summarize this note:\n${notes.read(id) ?? '(missing)'}',
),
),
],
);
},
);
}// file: lib/mcp/mcp.dart
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/mcp/prompts/note_prompts.dart';
import 'package:my_server/mcp/resources/note_resources.dart';
import 'package:my_server/mcp/tools/add_note_tool.dart';
import 'package:my_server/mcp/tools/base_tool.dart';
import 'package:my_server/mcp/tools/count_notes_tool.dart';
import 'package:my_server/src/note_repository.dart';
List<BaseTool> createAllTools(NoteRepository notes) => [
AddNoteTool(notes),
CountNotesTool(notes),
];
McpServer createMcpServer(NoteRepository notes) {
final server = McpServer(
const Implementation(name: 'my_server', version: '1.0.0'),
options: const McpServerOptions(
instructions: 'Stores short notes. Use add_note, then read notes://.',
),
);
for (final tool in createAllTools(notes)) {
server.registerBaseTool(tool);
}
registerNoteResources(server, notes);
registerNotePrompts(server, notes);
return server;
}// file: bin/server.dart
import 'dart:io';
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/mcp/mcp.dart';
import 'package:my_server/src/note_repository.dart';
Future<void> main(List<String> args) async {
final notes = NoteRepository();
if (!args.contains('--http')) {
await createMcpServer(notes).connect(StdioServerTransport());
stderr.writeln('my_server ready on stdio');
return;
}
final server = StreamableMcpServer(
serverFactory: (sessionId) => createMcpServer(notes),
host: '127.0.0.1',
port: 3000,
);
await server.start();
stderr.writeln('my_server listening on http://127.0.0.1:3000/mcp');
await ProcessSignal.sigint.watch().first;
await server.stop();
}// file: test/add_note_tool_test.dart
import 'dart:async';
import 'package:mcp_dart/mcp_dart.dart';
import 'package:my_server/mcp/mcp.dart';
import 'package:my_server/src/note_repository.dart';
import 'package:test/test.dart';
void main() {
late NoteRepository notes;
late McpServer server;
late McpClient client;
late List<StreamController<List<int>>> pipes;
setUp(() async {
notes = NoteRepository();
server = createMcpServer(notes);
final toServer = StreamController<List<int>>();
final toClient = StreamController<List<int>>();
pipes = [toServer, toClient];
await server.connect(
IOStreamTransport(stream: toServer.stream, sink: toClient.sink),
);
client = McpClient(const Implementation(name: 'test', version: '1.0.0'));
await client.connect(
IOStreamTransport(stream: toClient.stream, sink: toServer.sink),
);
});
tearDown(() async {
await client.close();
await server.close();
for (final pipe in pipes) {
await pipe.close();
}
});
test('add_note stores the note', () async {
final result = await client.callTool(
const CallToolRequest(
name: 'add_note',
arguments: {'id': 'todo', 'text': 'Ship it'},
),
);
expect(result.isError, isFalse);
expect(notes.read('todo'), 'Ship it');
});
test('add_note returns rejected input as a tool error', () async {
final result = await client.callTool(
const CallToolRequest(
name: 'add_note',
arguments: {'id': 'Bad Id', 'text': 'x'},
),
);
expect(result.isError, isTrue);
expect(notes.ids, isEmpty);
});
}A cancellable tool that reports progress:
import 'package:mcp_dart/mcp_dart.dart';
Future<CallToolResult> exportRows(
Map<String, dynamic> args,
RequestHandlerExtra extra,
) async {
final rows = args['rows'] as int;
for (var done = 0; done < rows; done += 100) {
if (extra.signal.aborted) {
return const CallToolResult(
isError: true,
content: [TextContent(text: 'Export cancelled.')],
);
}
await Future<void>.delayed(const Duration(milliseconds: 10));
await extra.sendProgress(
done.toDouble(),
total: rows.toDouble(),
message: 'Exported $done of $rows rows',
);
}
return CallToolResult(content: [TextContent(text: 'Exported $rows rows.')]);
}registerStateless*, tasks): https://github.com/leehack/mcp_dart/blob/main/doc/mcp-2026-07-28.mdcreate, inspect, skills install): https://github.com/leehack/mcp_dart/tree/main/packages/mcp_dart_climcp-dart-streamable-http skill.© leehack, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/mcp-dart-server of leehack/mcp_dart.
Open the folder on GitHubat commit 69ffef3
MCP Dart Server next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| MCP Dart Server this skillleehack/mcp_dart | 116 | — | ~4.1k | Automated safety check: Pass | MIT | |
| Add Dart MCP Server Featuredart-lang/ai | 286 | — | ~687 | Automated safety check: Pass | BSD-3-Clause | |
| Flutter MCP E2E HarnessArenukvern/mcp_flutter | 385 | — | ~2.2k | Automated safety check: Pass | MIT | |
| Flutter MCP Toolkit DebugArenukvern/mcp_flutter | 385 | — | ~4.7k | Automated safety check: Pass | MIT | |
| MCP Server Builderanthropics/skills | 180k | 62 repos | ~2.3k | Automated safety check: Pass | Apache-2.0 | |
| MCP Server BuildershareAI-lab/learn-claude-code | 78k | 5 repos | ~1.2k | Automated safety check: Pass | MIT |
dart-lang/ai
Instructions for adding new features (tools, prompts, etc.) to the dartmcpserver package.
Arenukvern/mcp_flutter
A skill your agent uses when writing or running repeatable E2E scenarios for Flutter apps as checked-in Dart with the fluttermcpharness package (packages/harness) — build/launch the app, attach to…
Arenukvern/mcp_flutter
Diagnose problems in a running Flutter app — read logs, evaluate Dart expressions, interpret error envelopes.
anthropics/skills
Guides the design and implementation of Model Context Protocol servers in TypeScript or Python, from tool naming and error messages to evaluation.
shareAI-lab/learn-claude-code
Walks through building MCP servers in Python or TypeScript that expose tools, resources and prompts to Claude, with templates, registration and testing.
anthropics/claude-plugins-official
Explains how to bundle Model Context Protocol servers in a Claude Code plugin, covering config files, stdio, SSE, HTTP and WebSocket server types, and authentication.
leehack/mcp_dart
A skill your agent uses when connecting a Dart or Flutter app to a Model Context Protocol (MCP) server with mcpdart: creating an McpClient, launching a local server over stdio or reaching a remote…
leehack/mcp_dart
A skill your agent uses when serving an MCP server over HTTP with mcpdart or connecting to a remote one: StreamableMcpServer setup, Host and Origin allowlists (DNS rebinding protection), CORS for…
leehack/mcp_dart
A skill your agent uses when building, testing, debugging, or reviewing Model Context Protocol servers, clients, transports, tools, resources, prompts, and agent host configuration.
Works with
Categories
A skill your agent uses when building or extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project, creating an McpServer, adding tools, resources, resource…. MCP Dart Server is an agent skill from leehack/mcp_dart. Use when building or extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project, creating an McpServer, adding tools, resources, resource templates or prompts, returning tool results and errors, reporting progress, running over stdio, or testing the server.
MCP Dart Server fits situations like: extending a Model Context Protocol (MCP) server in Dart with mcpdart: structuring the project; creating an McpServer; resource templates; returning tool results and errors.
Run `npx skills add leehack/mcp_dart --skill mcp-dart-server -a claude-code`. Or copy the skill folder (skills/mcp-dart-server in leehack/mcp_dart) into .claude/skills/mcp-dart-server in your project. Claude Code loads it when a task matches its description.
Run `npx skills add leehack/mcp_dart --skill mcp-dart-server -a codex`. Or copy the skill folder (skills/mcp-dart-server in leehack/mcp_dart) into .agents/skills/mcp-dart-server in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add leehack/mcp_dart --skill mcp-dart-server -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/mcp-dart-server, .gemini/skills/mcp-dart-server, .github/skills/mcp-dart-server and .opencode/skills/mcp-dart-server in your project.
Going by SKILL.md and its folder, MCP Dart Server needs the command-line tools its instructions call (dart).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
MCP Dart Server is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with MCP Dart Server: Add Dart MCP Server Feature (dart-lang/ai, 286 stars), Flutter MCP E2E Harness (Arenukvern/mcp_flutter, 385 stars), Flutter MCP Toolkit Debug (Arenukvern/mcp_flutter, 385 stars) and MCP Server Builder (anthropics/skills, 180k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
leehack (a GitHub user) maintains it in leehack/mcp_dart, which has 116 GitHub stars. The repository holds 4 skills in this directory. The repository was last updated on October 5, 2026.
Source: leehack/mcp_dart on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.