easy_api_generator 1.0.2
easy_api_generator: ^1.0.2 copied to clipboard
Build Runner generator that creates MCP server code from @tool annotations.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.0.2 - 2026-05-20 #
Fixed #
- Generated MCP tool handlers now properly serialize
Map<String, dynamic>return types usingjsonEncode()instead of.toString(). Previously, tools returning maps (e.g., fromresponse.toJson()) produced invalid JSON output like{key: value}instead of{"key": "value"}. The_serializeResultfunction in both stdio and HTTP templates now includes aMaptype check that mirrors the OpenAPI builder's behavior.
1.0.1 - 2026-05-19 #
Security #
registerTool(...)interpolation in both stdio and HTTP templates now routes the toolnameanddescriptionthrough_escapeDartString, so doc comments containing apostrophes,$, or backslashes can no longer break the generated Dart literal or trigger unintended string interpolation. (M1)- Added identifier validation for user-supplied annotation values that
flow into generated source:
@Tool(name:),@Server(toolPrefix:), and@Parameter(alias:)must now match^[a-zA-Z_][a-zA-Z0-9_]*$. The builder raises anInvalidGenerationSourceErrorotherwise. This closes a source-injection vector in both the generated Dart member references (_$name) and the Code Mode JS wrapper'sexternal_<toolName>helpers. (M2 / transitively M3)
Documentation #
- Added a "Security & Operational Caveats" section to the package README
covering: (a) the interaction between
@Server(logErrors: true)and@Parameter(sensitive: true)—sensitiveis a transport/UI hint and does not redact local stderr — and (b) the trust model of Code Mode, clarifying that the Node.js subprocess is a resource sandbox bounded by--max-old-space-size=64andcodeModeTimeout, not a security boundary. (L1, L2)
Fixed #
- Generated MCP tool handlers now preserve the original Dart-type
nullability of each parameter and re-emit any default-value expression.
Previously every optional parameter was cast as
Type?, which broke AOT compilation when the underlying method declared an optional non-nullable parameter with a default (e.g.[String greeting = 'hi']). The builder now capturesisNullableanddefaultValueCodefrom the analyzer (_extractParametersFromElementinmcp_builder.dart) and the stdio / HTTP templates render the appropriate cast: required params keep their original nullability, optional + nullable params cast asType?, and optional + non-nullable params with defaults emit(arguments?['x'] as Type?) ?? defaultLiteralso the call site sees a non-nullable value.
1.0.0 - 2026-05-08 #
First stable release. Pairs with easy_api_annotations 1.0.0 and targets
dart_mcp ≥ 0.5.0.
Added #
- Generator support for
ToolAnnotationsfromeasy_api_annotations1.0.0. Per-tool@Tool(annotations: ToolAnnotations(...))and server-wide@Server(annotationsDefault: ToolAnnotations(...))are now emitted asToolAnnotations(...)expressions in both the generated stdio and HTTP.mcp.darttemplates. - Added
_extractToolAnnotations,_extractAnnotationsDefault, and_mergeAnnotationshelpers inMcpBuilderthat resolve per-tool and server-wide annotation hints and merge them per the documented rules (tool-level overrides server defaults;titleis never inherited). - Added
_generateAnnotationsExpressionhelper intemplates.dartthat emits only the non-null hint fields, producing minimal, readableToolAnnotations(...)literals in generated code.
Fixed #
- Hardened
_extractToolAnnotationsagainst a non-stringtitlefield:DartObject.toStringValue()can legally returnnulleven when the field itself is non-null, so the extractor now guards the result and never storesnullunder the'title'key (which would later fail anas Stringcast during code generation). - The generated
_runCodeSandboxmethod now uses null-safe cleanup (process?.kill(...)andawait tempDir?.delete(...)) in itsfinallyblock, preventingNoSuchMethodError/FileSystemExceptionwhen an exception is thrown before those locals are assigned, or when the outercatchalready cleaned up the temp directory.
Changed #
- Bumped package version to 1.0.0 to signal API stability.
- Targets
easy_api_annotations1.0.0 as the companion annotation package.
0.6.1 - 2026-05-01 #
Fixed #
- Schema code generation for
double/numparameters now emitsSchema.num(...)to matchdart_mcp≥ 0.5.0 (previously emitted non-existentSchema.number(...), which causedError: Member not found: 'Schema.number'at compile time in generated.mcp.dartfiles). Also added a dedicated'num'case toSchemaBuilder.fromTypeand updatedfromSchemaMapplus the_applyMetadataToSchemaregex accordingly.
0.6.0 - 2026-04-30 #
Added #
- Added canonical
lib/easy_api_generator.dartentry point that re-exportsmcp_generator.dart. Consumers can now use the conventionalimport 'package:easy_api_generator/easy_api_generator.dart'— the legacymcp_generator.dartimport still works. - REST template now honors
@Server(logErrors:), mirroring the MCP templates: detailed exceptions + stack traces go tostderrwhenlogErrors: true, while the 500 response body stays generic. Previously the REST template silently swallowed caught exceptions, leaving operators with no diagnostic signal. @Parameter(sensitive: true)is now actually emitted:.mcp.jsoninputSchema adds"x-sensitive": trueon the property,.openapi.jsonaddswriteOnly: true, and string-typed sensitive parameters also getformat: 'password'. Previously the flag was extracted but never written anywhere.
Changed #
- Renamed
@Mcpto@Server— generator now recognizes@Serveras the primary annotation - Renamed
generateOpenApiparameter togenerateRest - Added
generateMcpparameter (default: true) to control .mcp.dart generation - Added
generateRestparameter (default: false) to control .openapi.json generation - Consolidated the 12 per-field
@Serverannotation scans inMcpBuilderinto a single_extractServerConfigAST walk; the library is now traversed once per build instead of 12 times - Removed the dead
_dartTypeToJsonSchemahelper and its unread'schema'entry from the collected parameter maps; callers already rely on the richerschemaMapproduced by_introspectType SchemaBuilderandOpenApiBuildernow expose private constructors (pure static helpers — not meant to be instantiated)- Enabled strict analyzer modes (
strict-casts,strict-inference,strict-raw-types) and addedalways_declare_return_types,always_use_package_imports,avoid_catches_without_on_clauses,unawaited_futureslints
Removed #
- BREAKING: Removed
lib/stubs.dart— obsolete re-export layer;package:buildis already a direct dependency - BREAKING: Removed
lib/builder/doc_extractor.dartalong with the unused public classesToolInfo,ParameterInfo, andDocExtractor— these were never wired into the builder after the full analyzer integration landed - Deleted the placeholder
test/mcp_builder_test.dartthat only assertedexpect(true, isTrue) - Dropped unused
code_builderandjson_annotationdirect dependencies
Deprecated #
@Mcptypedef — still recognized for backward compatibility
0.5.0 - 2026-04-18 #
Added #
- OpenAPI 3.0 specification generation with
generateOpenApi: trueparameter - RESTful API endpoint mapping following Swagger best practices
- Automatic resource inference from tool names (e.g.,
createUser→POST /users) - Full request/response schema generation with validation
- Proper HTTP status codes (200, 201, 204, 400, 404)
OpenApiBuilderclass for transforming MCP tools to OpenAPI specs
0.4.2 - 2026-04-15 #
Changed #
- Updated README with absolute logo URL for pub.dev compatibility
- Added Buy Me a Coffee image button
- Updated version references to 0.4.2
0.4.1 - 2026-04-15 #
Fixed #
- Fixed method name resolution when
autoClassPrefixis enabled - Method calls now correctly use original method names instead of prefixed tool names
- Example:
UserStore.createUser()instead ofUserStore.UserStore_createUser()
0.4.0 - 2026-04-15 #
Added #
- Added support for
autoClassPrefixparameter on@Mcpannotation - Generator now automatically prefixes tool names with class name when enabled
- Supports combining
autoClassPrefixwithtoolPrefixfor flexible naming - Updated documentation with examples for all naming options
0.3.0 - 2026-04-15 #
Added #
- Added support for custom tool names via
@Tool.nameparameter - Added support for tool name prefixes via
@Mcp.toolPrefixparameter - Generator now uses custom names and applies prefixes when generating tool definitions
- Updated documentation with examples for custom tool naming
0.2.1 - 2026-04-14 #
Fixed #
- Updated repository and homepage URLs to point to package-specific directories
0.2.0 - 2026-04-14 #
Added #
- Added support for
@Parameterannotation for rich parameter metadata- Extracts
title,description,examplefor documentation - Supports validation constraints:
minimum,maximum,pattern,enumValues - Supports
sensitiveflag for marking sensitive data
- Extracts
- Added support for
portparameter in HTTP transport configuration - Added support for
addressparameter in HTTP transport configuration - Added
generateJsonparameter to control.mcp.jsonmetadata file generation - HTTP server now uses
io.InternetAddress.loopbackIPv4for default address (127.0.0.1) - Conditional import of
dart:ioonly when needed for HTTP transport - Updated documentation with HTTP transport and
@Parameterexamples
Security #
- Fixed information leakage in generated code - error messages no longer expose internal exception details
- Generated error responses now return generic "An error occurred while processing the request." message
- Added proper string escaping for regex patterns and special characters
Fixed #
- Fixed unused import warning for
dart:ioin generated HTTP server code - Fixed annotation extraction to use
peek()instead ofread()for optional fields - Fixed complex schema corruption when applying metadata
- Fixed dollar sign escaping in generated strings for regex patterns
0.1.2 - 2026-04-13 #
Fixed #
- Widen analyzer constraint to support latest versions
- Add example for package usage
- Fix lint issues and improve pana score
0.1.0 - 2026-04-13 #
Added #
- Initial release of mcp_generator package
- Build runner generator for @tool annotations
- AST-based parsing using dart:analyzer and source_gen
- Support for both stdio (JSON-RPC) and HTTP (Shelf) transports
- Automatic JSON-Schema generation from Dart types
- Dynamic method dispatch in generated servers
- Template-based code generation with StdioTemplate and HttpTemplate
- Doc comment extraction for tool descriptions