Composable CLI framework and stdio MCP server for Flutter and Dart. Scaffolding, code generation, transactional plugin installs, hot reload, REPL, and AI agent tool surfaces in one binary.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/fluttersdk/artisanResumen de MCP Servers
<p align="center">
<img src="https://raw.githubusercontent.com/fluttersdk/magic/master/.github/magic-logo.svg" width="120" alt="Artisan Logo" />
</p>
<h1 align="center">Artisan</h1>
<p align="center">
<strong>Composable CLI framework and stdio MCP server for Flutter and Dart.</strong><br/>
Scaffolding, code generation, transactional plugin installs, hot reload orchestration, REPL, and AI agent tool surfaces in one binary.
</p>
<p align="center">
<a href="https://pub.dev/packages/fluttersdk_artisan"><img src="https://img.shields.io/pub/v/fluttersdk_artisan.svg" alt="pub package"></a>
<a href="https://github.com/fluttersdk/artisan/actions"><img src="https://img.shields.io/github/actions/workflow/status/fluttersdk/artisan/ci.yml?branch=master&label=CI" alt="CI"></a>
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT"></a>
<a href="https://pub.dev/packages/fluttersdk_artisan/score"><img src="https://img.shields.io/pub/points/fluttersdk_artisan" alt="pub points"></a>
<a href="https://github.com/fluttersdk/artisan/stargazers"><img src="https://img.shields.io/github/stars/fluttersdk/artisan?style=flat" alt="GitHub stars"></a>
</p>
<p align="center">
<a href="https://fluttersdk.com/artisan">Documentation</a> ·
<a href="https://pub.dev/packages/fluttersdk_artisan">pub.dev</a> ·
<a href="https://github.com/fluttersdk/artisan/issues">Issues</a>
</p>
---
## Why Artisan?
Dart's CLI surface is fragmented. Every package invents its own install ritual, its own scaffold script, its own hand-edited entry point. A team that adopts five tools ends up with five `bin/*.dart` wrappers, five README install sections, and five chances for a bad merge to silently break the build. AI agents that want to drive the running app reach for ad hoc shell scripts because there is no shared tool surface.
**Artisan fixes this.** One binary registers every command, one protocol describes every plugin install, and one stdio MCP server exposes the whole stack to AI agents.
```bash
# Before, the painful manual setup ritual
edit pubspec.yaml # add the plugin dependency
edit bin/<custom>.dart # wire the provider
edit lib/main.dart # register the config factory
edit android/app/src/AndroidManifest.xml # add the permission
edit ios/Runner/Info.plist # add the entry
write .env stub # remember which keys
restart the app and hope nothing collided
```
```bash
# After, the Artisan way
dart pub add fluttersdk_artisan
dart run fluttersdk_artisan install
dart run fluttersdk_artisan plugin:install <name>
```
If you know `php artisan`, you already know the verb shape. The implementation is pure Dart 3.4+, no Flutter runtime dependency in the framework core.
## Features
| | Feature | Description |
|:--|:--------|:------------|
| 🎼 | **Command Registry** | `ArtisanRegistry` collects commands from every registered `ArtisanServiceProvider`, collision-detected at boot |
| 🧰 | **22 Built-in Commands** | Lifecycle, scaffolding, plugin management, MCP, introspection, codegen, one binary |
| ✍️ | **Signature DSL** | `String get signature => 'cmd:name {arg} {--flag}'`, Dart 3 record-style parser, ArgParser fallback when needed |
| 🤖 | **MCP Server** | Stdio JSON-RPC server built on `dart_mcp`, exposes substrate and plugin tools to AI agents |
| 🌳 | **Magic-Free Path** | `install` writes a canonical wrapper for plain Flutter and Dart projects, no framework dependency |
| 🔌 | **Plugin Protocol** | `install.yaml` declarative manifest plus `PluginInstaller` fluent DSL escape hatch |
| 🔄 | **Idempotent Installs** | Lookahead-anchored regex injection, replace-by-name registry, re-running an install is a safe no-op |
| ↩️ | **Reversible Ops** | Every applied operation is recorded under `.artisan/installed/<plugin>.json`, `plugin:uninstall` walks it in reverse |
| 🪞 | **VM Service Hooks** | `tinker`, `reload`, `hot-restart` drive the running Flutter VM directly over `ext.*` extensions |
| 🎯 | **Context-Aware Generators** | `make:command` detects plugin vs consumer context, `make:plugin` upgrades to magic-mode automatically |
| 🧪 | **Testable Primitives** | `VirtualFs` plus `InMemoryFs`, `InstallContext.test`, `ArtisanContext.bare`, `BufferedOutput` capture |
## Quick Start
### 1. Install and scaffold
```bash
dart pub add fluttersdk_artisan
dart run fluttersdk_artisan install
```
`install` writes `bin/dispatcher.dart` (the consumer entry that calls `runArtisan(...)`) plus barrels (`lib/app/_plugins.g.dart`, `lib/app/commands/_index.g.dart`), then auto-chains `make:fast-cli` so `bin/fsa` is ready immediately. Re-running is idempotent, pass `--force` to overwrite.
After scaffold, run any built-in command via the consumer wrapper:
```bash
dart run artisan list
dart run artisan doctor
dart run artisan start --device=chrome
```
### 2. Install a plugin
```bash
dart pub add awesome_plugin
dart run fluttersdk_artisan plugin:install awesome_plugin
```
Plugins ship either an `install.yaml` manifest (declarative, walked by `ManifestInstaller`) or a procedural `ArtisanInstallCommand` subclass that drives `PluginInstaller` directly. Either way, the registry records every applied operation so a future `plugin:uninstall` can reverse them safely.
Plugin commands surface automatically. After installing `fluttersdk_dusk`, `dart run artisan list` shows the new `dusk:*` entries under their own namespace section.
### 3. Wire the MCP server for your AI agent
```bash
./bin/fsa mcp:install
# or, on Windows / when bin/fsa is absent:
# dart run fluttersdk_artisan mcp:install
```
`mcp:install` writes (or updates) the `mcpServers.fluttersdk` entry in `.mcp.json`. After install, reconnect the MCP client once (for Claude Code: `/mcp reconnect fluttersdk`). The server boots in stdio JSON-RPC mode and exposes 10 substrate tools (`artisan_start`, `artisan_stop`, `artisan_status`, `artisan_logs`, `artisan_restart`, `artisan_reload`, `artisan_hot_restart`, `artisan_doctor`, `artisan_list`, `artisan_tinker`) plus any plugin-contributed tools.
Read the full setup walkthrough at [MCP setup guide](https://fluttersdk.com/artisan/mcp/setup).
## Commands
Artisan ships 22 built-in commands across 6 namespaces. Every command is a `final class X extends ArtisanCommand` with a `signature` string and a `handle()` method.
| Namespace | Count | Commands |
|:----------|:-----:|:---------|
| **Lifecycle** | 7 | `start`, `stop`, `status`, `logs`, `restart`, `reload`, `hot-restart` |
| **Scaffolding** | 4 | `make:plugin`, `make:command`, `make:fast-cli`, `install` |
| **Plugin Management** | 3 | `plugin:install`, `plugin:uninstall`, `plugins:refresh` |
| **MCP** | 3 | `mcp:serve`, `mcp:install`, `mcp:uninstall` |
| **Introspection** | 4 | `help`, `list`, `doctor`, `tinker` |
| **Codegen** | 1 | `commands:refresh` |
Highlights:
```bash
# Lifecycle
dart run artisan start --device=chrome # spawn flutter run, record the session under ~/.artisan/sessions/<project>/
dart run artisan reload # send r (hot reload) via FIFO bridge to detached process
dart run artisan hot-restart # send R (hot restart, drops Dart state)
# Scaffolding
dart run artisan make:plugin awesome # 7-file plugin skeleton, auto-upgrades to magic-mode when applicable
dart run artisan make:command Greet # context-aware: plugin vs consumer context, auto-registers in provider
dart run artisan make:fast-cli # compile artisan to native binary at bin/fsa (~50ms startup vs ~3s)
# Introspection
dart run artisan tinker # connected REPL against the running VM
dart run artisan tinker --eval='1 + 1' # one-shot evaluation flag for automation
dart run artisan doctor # preflight checks: flutter + dart on PATH, default port availability
```
Full command catalog and per-command flag reference at [commands catalog](https://fluttersdk.com/artisan/commands/).
### Writing your own command
`make:command` scaffolds a `final class` extending `ArtisanCommand` and auto-registers it in the nearest service provider. The signature DSL parses arguments and flags from one string, the `handle()` method receives a typed `ArtisanContext`:
```dart
final class GreetCommand extends ArtisanCommand {
@override
String get signature => 'greet {name} {--shout}';
@override
String get description => 'Greet a person by name.';
@override
Future<int> handle(ArtisanContext context) async {
final name = context.input.argument('name');
final shout = context.input.option('shout') == 'true';
final greeting = shout ? 'HELLO, ${name.toUpperCase()}!' : 'Hello, $name';
context.output.success(greeting);
return 0;
}
}
```
For cases the signature DSL cannot express (positional rest, mutually exclusive flag groups), override `void configure(ArgParser parser)` and read from `context.input.results` directly. Signature DSL grammar at [signature DSL reference](https://fluttersdk.com/artisan/reference/signature-dsl).
## Plugin Protocol
Artisan plugins declare their install footprint in `install.yaml`, a declarative manifest walked by `ManifestInstaller`. The manifest supports `publish` (files to copy), `magic.provider` plus `magic.configFactory` plus `magic.routes` (framework wiring), `native.android` (permissions, metaData, gradle plugins, gradle dependencies), `native.ios` and `native.macos` (plist entries, pod entries), `native.web` (head injections, meta tags), `env` (environment variable declarations with defaults), `prompts` (interactive install prompts), `placeholders` (token resolution from prompt answers), and `bootstrap_command` (post-install hint). Schema reference at [install.yaml schema](https://fluttersdk.com/artisan/plugins/install-yaml).
A minimal `install.yaml` looks like this:
```yaml
publish:
- from: stubs/config.dart
to: lib/config/aweLo que la gente pregunta sobre artisan
¿Qué es fluttersdk/artisan?
+
fluttersdk/artisan es mcp servers para el ecosistema de Claude AI. Composable CLI framework and stdio MCP server for Flutter and Dart. Scaffolding, code generation, transactional plugin installs, hot reload, REPL, and AI agent tool surfaces in one binary. Tiene 2 estrellas en GitHub y su última actualización registrada es del 2026-09-13.
¿Cómo se instala artisan?
+
Puedes instalar artisan clonando el repositorio (https://github.com/fluttersdk/artisan) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar fluttersdk/artisan?
+
Nuestro agente de seguridad ha analizado fluttersdk/artisan y le ha asignado un Trust Score de 95/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene fluttersdk/artisan?
+
fluttersdk/artisan es mantenido por fluttersdk. La última actividad registrada en GitHub es del 2026-09-13, con 0 issues abiertos.
¿Hay alternativas a artisan?
+
Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.
Despliega artisan en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/fluttersdk-artisan)<a href="https://claudewave.com/repo/fluttersdk-artisan"><img src="https://claudewave.com/api/badge/fluttersdk-artisan" alt="Featured on ClaudeWave: fluttersdk/artisan" width="320" height="64" /></a>Más MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl!
The fastest path to AI-powered full stack observability, even for lean teams.