flutter-mcp-toolkit-custom-tools
- Repo stars 0
- Author updated Live
- Author repo skills-registry
- Domain
- AI
- Compatible agents
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- Trust score
- 88 / 100 · community maintained
- Author / version / license
- @tomevault-io · no license declared
- Token usage
- Lean
- Setup complexity
- Guided setup
- External API key
- Not required
- Operating systems
- Unspecified (assume cross-platform)
- Runtime requirements
- No special requirements
- Permissions
-
- Read-only
- Write / modify
- Shell exec
- Network behavior
- External requests
- Install commands
- 26 variants
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: flutter-mcp-toolkit-custom-tools
description: Use this skill when the agent exposes app-specific surfaces by registering custom MCP tools and…
category: ai
runtime: no special runtime
---
# flutter-mcp-toolkit-custom-tools output preview
## PART A: Task fit
- Use case: Use this skill when the agent exposes app-specific surfaces by registering custom MCP tools and resources inside the Flutter app (mcp_toolkit dynamic registry — MCPCallEntry, bootstrapFlutter additionalEntries / addEntries). Covers tool vs resource vs evaluate-expression, Map-based handlers, schema strictness, discovery via fmt_list_client_tools_and_resources, fmt_client_tool, fmt_client_resource, and lifecycle pitfalls..
- Inputs: target material, constraints, expected output, and acceptance criteria.
- Evidence boundary: follow “Pick the right primitive / Handler signature (tools and resources) / Minimal tool registration” and do not present inference as author intent.
## PART B: Execution result
- **01** The card summarizes the use case; runtime output centers on “Use this skill when the agent exposes app-specific surfaces by registering custom MCP tools and resources inside the Flutter app (mcp_toolkit dynamic registry — MCPCallEntry, bootstrapFlutter additionalEntries / addEntries). Covers tool vs resource vs evaluate-expression, Map-based handlers, schema strictness, discovery via fmt_list_client_tools_and_resources, fmt_client_tool, fmt_client_resource, and lifecycle pitfalls.”.
- **02** When the source has headings, the agent prioritizes “Pick the right primitive / Handler signature (tools and resources) / Minimal tool registration” so the result follows the author’s structure.
- **03** Typical output includes task judgment, concrete steps, required commands or file edits, validation, and follow-up options.
- **04** Risk context follows the fingerprint: read files, write/modify files, run shell commands; may access external network resources; usually needs no extra API key.
## Running Rules
- read files, write/modify files, run shell commands; may access external network resources; usually needs no extra API key.
- Validate with a small sample before expanding scope.
- Return the result, validation criteria, and next iteration options. The source does not require a stable slash command. After installation, invoke the skill by name and describe the task.
Name target files or source material, expected output, forbidden changes, and whether network or shell access is allowed. Permission fingerprint: read files, write/modify files, run shell commands.
Start with a small task and check whether the result follows “Pick the right primitive / Handler signature (tools and resources) / Minimal tool registration”. Inspect diffs, logs, previews, or tests before expanding scope.
Confirm the final output includes a concrete result, evidence, and next action. If it stays generic, tighten inputs, boundaries, and acceptance criteria.
---
name: flutter-mcp-toolkit-custom-tools
description: Use this skill when the agent exposes app-specific surfaces by registering custom MCP tools and…
category: ai
source: tomevault-io/skills-registry
---
# flutter-mcp-toolkit-custom-tools
## When to use
- Use this skill when the agent exposes app-specific surfaces by registering custom MCP tools and resources inside the F…
- Use it when the task has clear inputs, repeatable steps, and validation criteria.
## What to provide
- Target material, scope, expected result, and forbidden changes.
- Whether network, commands, file writes, or external services are allowed.
## Execution rules
- Organize steps around “Pick the right primitive / Handler signature (tools and resources) / Minimal tool registration” and keep inference separate from source facts.
- read files, write/modify files, run shell commands; may access external network resources; usually needs no extra API key.
- Validate with a small sample before expanding the task.
## Output requirements
- Return the deliverable, key evidence, validation method, and next action.
- Mark missing information as unknown; do not invent commands, platforms, or dependencies. The author source anchors workflow facts; repository files anchor sources and commands; Fluxly only adds fit, limitations, and quality judgment.
skill "flutter-mcp-toolkit-custom-tools" {
input -> user goal + target files + boundaries + acceptance criteria
context -> Pick the right primitive / Handler signature (tools and resources) / Minimal tool registration
rules -> SKILL.md triggers / order / output contract
runtime -> no special runtime | read files, write/modify files, run shell commands | may access external network resources
guardrails -> usually needs no extra API key + small-sample validation + diff/log review
output -> copyable result + checklist + next iteration
} Custom MCP Toolkit Tools & Resources (Dynamic Registry)
Use this when bundled MCP tools (screenshot, semantic snapshot, tap, …) are not enough and you need app-specific read surfaces or actions — e.g. cart totals, feature flags, curated debug snapshots of internal state. Entries are registered in the Flutter process and exposed to the agent through the dynamic registry.
Pick the right primitive
| Need | Use |
|---|---|
| One-off read of a simple value | fmt_evaluate_dart_expression (no app code change). |
| Stable read-only payload (diagnostics, JSON snapshot, “current route”) | MCPCallEntry.resource + fmt_client_resource. Prefer resources when the contract is “GET-like” and idempotent. |
| Parameterized or mutating action, or reusable named operation | MCPCallEntry.tool + fmt_client_tool. |
Handler signature (tools and resources)
MCPCallHandler is FutureOr<MCPCallResult> Function(ServiceExtensionRequestMap request) where ServiceExtensionRequestMap is Map<String, String>.
- Tool arguments arrive as string values keyed by schema property names — mirror the README pattern:
request['n'],request['userId'], then parse (int.tryParse,double.tryParse,jsonDecodefor nested blobs if the wire format sends JSON-as-string). - Do not use
request.arguments— that is not the app-side API.
Minimal tool registration
import 'package:mcp_toolkit/mcp_toolkit.dart';
final tool = MCPCallEntry.tool(
handler: (request) async {
final userId = request['userId'] ?? '';
final cart = CartRepository.instance.forUser(userId);
return MCPCallResult(
message: 'ok',
parameters: {
'total': cart.total,
'items': cart.items.map((i) => i.toJson()).toList(),
},
);
},
definition: MCPToolDefinition(
name: 'cart_get_snapshot',
description: 'Return current cart total and items for a user.',
inputSchema: {
'type': 'object',
'additionalProperties': false,
'properties': {
'userId': {'type': 'string'},
},
'required': ['userId'],
},
),
);
await MCPToolkitBinding.instance.addEntries(entries: {tool});
Prefer MCPToolkitBinding.instance.bootstrapFlutter(additionalEntries: { ... }, runApp: ...) so tools/resources register in one place with zone/error setup — same entries shape as above.
Register after initialize() / bootstrapFlutter wiring, once at bootstrap — not inside build, not per-widget initState.
Custom resources
Resources are for read-only MCP surfaces: diagnostics, config summaries, or JSON blobs the agent polls without treating them as imperative actions.
MCPCallEntry.resource(
definition: MCPResourceDefinition(
name: 'app_cart_digest',
description: 'Compact cart summary for agents (read-only).',
mimeType: 'application/json',
),
handler: (request) async => MCPCallResult(
message: 'Cart digest',
parameters: {
'itemCount': CartRepository.instance.visibleCount,
'currency': CartRepository.instance.currencyCode,
},
),
),
namemust besnake_case(letters, digits, underscores).resourceUrimaps it to avisual://localhost/...URI (underscore segments become path segments). Agents consume it viafmt_client_resourceusing that URI / listing fromfmt_list_client_tools_and_resources.- Set
mimeTypehonestly (application/jsonvstext/plain) so clients know how to interpret payloads.
Schema rules (tools)
The MCP server enforces strict JSON Schema:
- Prefer
additionalProperties: falseunless you intentionally accept arbitrary keys. Unknown keys fail validation — good for catching agent typos. - Mark
requiredfor anything the handler reads unconditionally. - Prefer primitives and
enumover unconstrained strings. parametersinMCPCallResultmust be JSON-serializable; non-serializable objects degrade totoString().
Discovery from the agent side
fmt_list_client_tools_and_resources— enumerate app-registered tools and resources.fmt_client_tool— invoke a tool by name with JSON args (CLI:flutter-mcp-toolkit exec --name fmt_client_tool --args '...'per your transport).fmt_client_resource— fetch a registered resource (URI from listing /resourceUriconvention).
If something should appear but does not: confirm addEntries completed (await), then hot restart — reload does not always replay discovery cleanly.
Lifecycle gotchas
- Hot reload +
addEntriesfrom widget code → duplicate registrations. Register once inmain()/ bootstrap, not inbuild. - Hot restart clears VM state; registrations tied to
bootstrapFlutter/mainrun again on boot — correct pattern survives restart. - Debug mode only — release builds do not expose these VM service extensions.
- Naming: flat global namespace per app — prefix tools/resources (
cart_,flags_,nav_) to avoid collisions with builtins or other domains.
When the agent authors surfaces for the user’s app
- Ensure
mcp_toolkitis inpubspec.yaml. - Add
lib/mcp_tools/<domain>_surfaces.dartexportingregisterXSurfaces()that returnsSet<MCPCallEntry>or performsaddEntriesonce. - Wire
registerXSurfaces()frombootstrapFlutter(..., additionalEntries: ...)or calladdEntriesimmediately afterinitializeFlutterToolkitinsidebootstrapFlutter’s chain — never fromStatefulWidgetlifecycle. - Tight schemas (
additionalProperties: false, explicitrequired). - Hot restart, then
fmt_list_client_tools_and_resourcesbefore firstfmt_client_tool/fmt_client_resourcecall.
Safety and scope
- Treat handlers as powerful debug hooks: avoid exposing secrets, full databases, or unchecked filesystem/network IO.
- Keep handlers thin: delegate to domain/services already used by the app (same DI/getters), don’t duplicate business logic in MCP-only paths unless intentional.
Common traps
request.arguments— wrong shape; userequest['key']onMap<String, String>.- Missing
awaitonaddEntries→ race before discovery lists your surface. - Returning
Futureinstances insideparameters→ useless serialization;awaitinside the handler. inputSchemaout of sync with the handler → agents trust the schema; update both.
Related
- Driving the live app (snapshot / tap / reload):
flutter-mcp-toolkit-guide→flutter-mcp-toolkit-inspect/flutter-mcp-toolkit-control. - Repository
ARCHITECTURE.md→ “Dynamic Registry Architecture”.
Source: Arenukvern/mcp_flutter — distributed by TomeVault.
Decide Fit First
Design Intent
How To Use It
Boundaries And Review