angular-signal-forms-migration-mcp
angular-signal-forms-migration-mcp
[!license](https://img.shields.io/ npm/l/angular-signal-forms-migration-mcp.svg)](./LICENSE)
一个 MCP 服务器,帮助 AI 编程代理将 Angular Reactive Forms 迁移到 Angular Signal Forms。
它会在你的代码库中找出 Reactive Forms 结构,区分出安全的机械性重命名和需要人的决策的重命名,并给出经过真实 Angular 版本验证的 before→after 方案,而不是凭记忆编造。
安装
要求 Node.js 20+。无需克隆任何内容——npx 会按需拉取。
claude mcp add signal-forms-migration -- npx -y angular-signal-forms-migration-mcp@latest或者把它添加到任何 MCP 客户端配置中:
{
"mcpServers": {
"signal-forms-migration": {
"command": "npx",
"args": ["-y", "angular-signal-forms-migration-mcp@latest"]
}
}
}@latest 会让 npx 在每次启动时重新解析版本,因此重启编辑器后就会自动获取新发布。没有它,npx会一直使用首次缓存的版本——请把配置重新指向@latest,或执行 npm cache clean --force 清空缓存。
服务器还会每天检查一次新版本,并向 stderr 写一行提示。这个检查会被限流,2 秒超时,绝不触碰 stdout,遇到任何失败时保持无声。要关闭它,就在上面的配置块中添加 "env": { "SIGNAL_FORMS_MCP_NO_UPDATE_CHECK": "1" }。要看实际运行的是什么:
npx angular-signal-forms-migration-mcp@latest --version[!IMPORTANT] 不要
npm install安装到你的 Angular 应用中。 它是由你的编辑器拉起的独立进程,不是项目所依赖的库。npx会把它放在完全独立于项目之外的缓存中。
[!NOTE] 它只探测与建议,从不修改你的代码。 这里没有任何工具会写你的源文件,以后也不会有。服务器返回“发现结果”和“迁移方案”;由你的代理决定改哪些并执行编辑,所以每次改动仍然会走你平常的 code review 和版本控制。
Related MCP server: VA Form Generation MCP Server
它长什么样
> Migrate the forms in src/app/checkout to Signal Forms.
1. find_form_candidates { path: ".../src/app/checkout" }
→ 9 findings across 2 files: 6 mechanical, 3 judgment
(the FormArray of line items is judgment — its shape changes)
2. get_signalforms_recipe { construct: "FormBuilder.group" }
→ before/after + caveats
3. the agent applies the edits, you review the diff
4. verify_migration { path: ".../checkout.component.ts" }
→ traps that compile and are still wrong在给出建议前,它检查的前提
迁移报告会把那些让迁移无法进行的过渡的因素列在最前,因为没法执行的方案比没有方案更差:
Angular 21+。
@angular/forms/signals在 v21 之前不存在。低于该版本,服务器会返回一个升级方案,而非迁移方案。声明的版本与已安装的版本一致。 在较新的
node_modules之下检出旧分支,会同时跨越 v21 那条线。如果按实际安装的版本迁移,下一次npm ci就会回退到目标 API 不存在的版本——所以服务器拒绝站边,并明说“无法判断”。moduleResolution了解exports(bundler、node16或nodenext)。@angular/forms/signals是 package-exports 分离的子路径;旧的node解析方式看不到它,导入时会报成一个“缺依赖”的错误。
工
工具 | 它回答的问题 |
| Reactive Forms 结构在哪里,哪些需要人来决策? |
| 这个结构的符合验证的 before→after 方案是什么? |
| 这项任务有多大,应该哪个文件开头? |
| 把整份东西作为 markdown 文档给我。 |
| 我已经迁移过了——哪些能编译但仍然错误? |
| 我的版本低于 v21。我如何到支持它的版本? |
完整参数、响应格式和作用域限制见 docs/TOOLS.md。
这些方案是如何验证的
Signal Forms 很新,大多数模型的训练数据中都没有可靠地包含它——凭记忆写成的方案,错得看起来又像对。所以没有一种是这些凭记忆写。
方案会针对 Angular v22 验证:使用官方 Angular CLI MCP 服务器,并用 angular.dev 交叉确认,同时携带结构化出处(verifiedAgainstVersion、retrievedISO、sources),随工具响应一起发给你的代理,让它能判断建议的新旧。带有空白 sources 列表的方案便会 CI 失败。
凡是在文档中没有回答的地方,方案会在其 caveats 里直接说明,而不是自造答案——“UNVERIFIED — confirm ”,或在 Angular 根本没有 migration 路径时,标注 UNVERIFIED — tool-authored guidance(工具自己写的做法)。主要例子就是 RxJS 流层级:原语有文档且能编译,但在这些之间作选择是本工具的判断,而不是 Angular 的。当前 37 个方案中有 14 个带这类标记。这是输出中诚实的一部分,不是忽略,而且会有一个测试另行保障这个数字真实。
这些方案还可被编译。 CI 安装真实的 @angular/forms@22,并对覆盖全部方案 API 的 fixture 做类型检查,外加两个案例:
disabled(path, { when }) 作为 v22 的签名就是这么确立的——文档里既没有演示它,也没有演示嵌套的 schema() + apply() 组合。
这两个例子是 “记忆”会给记错的:
绑定指令是
[formField]/FormField——不是[control]/Control,后者出现在 v21 预发布材料里,也是模型常出的错。disabled()/hidden()在 v22 上加了对象参数形式,并把裸回调标为@deprecated而非移除——所以按 v21 的写法写来 v22 依然能编译,只是有警告。これは通过比较已产生的重载,而不是文档得出结论。
不同版本真正行为不同的方案带一个 VERSION-SENSITIVE 注释来指出每种版本形式,并由服务器针对项目检测到的版本来解析。读 caveats 数组,那里藏着树利角。
对新 Angular 新版本的重新验证过程在 [REVEREIFIC.html) 里。
它会在没有干干净净答案时告诉你
并非每个 Angular Reactive 模式都有 Signal Forms 对应物;假装那么做的迁移工具比不做还要糟。表单流根据 .pipe() 链中的 RxjS 运算符分成等级:
等级 | 运算符 | 答案 |
简单 | 无 / 裸 |
|
中等 |
|
|
困难 |
| 没有直接等价物 |
对困难这一档,会在“没有直接等价物”里直说,并给出三个真实策略——异步校验 rules、rxesource、或在 toObservable/toSignal 后保留 RxJS——而不是伪造一个不存在的一行式代码。
同理,addControl()/removeControl() 完全没有替代对应物:字段树是从 model signal 的类型派生得来的。它的路线方法三个实答,而不是找一个能编译不了的 API。
yes 不会做
改你的文件。 永远不,是按设计决定的。
证明你的迁移一定正确。
verify_migration证明没有 已知 缺陷。请在tscription后运行它,而不是替代它。迁移模板驱动表单。
ngModel的迁移没有上游文档;猜它正是这个项目要避免的动手模式。分析带
${...}替换的模板字符串,因为字符串里的内容不是 Angular 编译器看到的界面。而不带替换的一段内联template:字符串 会 被分析。扫描 CSS/SCSS 或跨文件解析类型——探测只是单文件语法 pass,不是
ts. Program。
ROADMAP.md 跟踪这些; 迁移报告会在其自身 "Scope” 部分重复它们,而不是用总来误示完毕。
为什么不直接只用官方 Auther MCP
都用。 官方 @angular/cli MCP 服务器懂 Angular;这一个懂 迁移—你的代码里有哪些结构、哪些是机械的、哪些需要决策,以及替换的方案是什么。你的代理可以从这里取发现和建议,再到官方那确认当前及项目特定的事件。
状态
一直在副稳定。六个工具齐全的 with:
feature-complete through M16。六个工具发布,带:
基础构造、数组、运行时形状变化、异步 validators、自定义控件、三个 RxJS 层、读写表单状态、提交、模型形状限制、CSS 状态类、spec 迁移,以及
.html模板层——绑定、状态读取、<selectmultiple>阻塞问题,以及静默错误键更换。
传输是 stdio——stdout 只做 protocol,log 全部走 stderr。
贡献和本地开发:CONTRIBUTING.md。
License
MIT
Available Tools
6 toolsanalyze_migration_complexitySummarise the size and shape of a Signal Forms migrationARead-only
Scans .ts and .html files (or a directory) and summarises the migration: total findings, counts per construct, the mechanical/judgment split, and a suggested file order (simplest first, so all-mechanical files land before the ones needing design decisions). Read-only: this tool never modifies your files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .ts file or a directory to scan recursively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| byConstruct | Yes | |
| judgmentCount | Yes | |
| totalFindings | Yes | |
| angularVersion | Yes | |
| suggestedOrder | Yes | |
| mechanicalCount | Yes | |
| referenceOnlyFiles | Yes | |
| blockingPrerequisite | Yes | |
| sharedValidatorFiles | Yes | |
| signalFormsAvailable | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and destructiveHint=false, so the behavior is largely covered structurally. The description reinforces the read-only guarantee and adds context about scanning behavior and result structure, but it does not disclose edge cases such as invalid paths or recursion behavior beyond what is already implied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the input and output details directly, and the second provides a clear read-only safety note. There is no fluff, redundancy, or unnecessary beat-around-the-bush phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has one required parameter, a simple input schema, output schema coverage, and clear annotations. The description supplies all the essential operational context: file types scanned, summarization outputs, file ordering rationale, and the mutation safety guarantee. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single path parameter with 100% coverage. The description further clarifies that the tool scans .ts and .html files, and notes the directory alternative, adding practical meaning beyond the schema. There is slight ambiguity about whether a standalone .html file path is accepted, but overall the description usefully extends the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it scans .ts and .html files or a directory and summarises the migration. It also enumerates concrete outputs such as total findings, per-construct counts, and the mechanical/judgment split, which clearly distinguishes it from siblings like verify_migration or get_migration_report.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what the tool does and what it returns, but it does not explicitly state when to prefer this tool over siblings such as find_form_candidates or get_angular_upgrade_plan. It does not provide exclusions or an explicit when-to-use/when-not-to-use scenario, leaving usage mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_form_candidatesFind Angular Reactive Forms migration candidatesARead-only
Scans .ts and .html files (or a directory) for Angular Reactive Forms constructs and classifies each finding as "mechanical" (safe to transliterate) or "judgment" (a human must decide the target design). Read-only: this tool never modifies your files. Results are PAGED (default 200 findings) — check incomplete: non-null means there is more, and says how to get it. Filter with constructs / classification to work one decision at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .ts file or a directory to scan recursively. | |
| limit | No | Maximum findings to return. Defaults to 200. A whole workspace can be far larger than one context window, so the response is a window and says so when it is. | |
| offset | No | Index of the first finding to return. Defaults to 0. Page with page.nextOffset. | |
| constructs | No | Return only these construct names (e.g. ["FormArray.push"]). Use it to pull one decision at a time. Filtering is announced in `incomplete`. | |
| classification | No | Return only "mechanical" or only "judgment" findings. |
Output Schema
| Name | Required | Description |
|---|---|---|
| page | Yes | |
| files | Yes | |
| incomplete | Yes | Non-null when this response is NOT the full result, with the call that returns the rest. Null means complete. Never treat a filtered or paged list as the whole job. |
| totalFindings | Yes | Findings in the whole scan, unfiltered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint being true, the description goes well beyond that by explicitly stating the tool never modifies files, results are paged, the default page size, and what `incomplete` means. It also communicates the mechanical/judgment classification logic, which is valuable beyond the annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences each carry distinct value: scanning scope, read-only guarantee, paging, and filter guidance. The most important details are front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a read-only scanning utility, and the description covers all relevant operational aspects: input scope, safety, classification semantics, paging, and filtering. The presence of an output schema further covers return details, so no necessary information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all parameters at 100% coverage, so the baseline is high. The description adds value by framing constructs/classification as a 'work one decision at a time' workflow and by highlighting paging constraints in the overall behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation (scans .ts and .html files or a directory), the object (Angular Reactive Forms constructs), and the output distinction (mechanical vs. judgment). This differentiates it from sibling tools like analyze_migration_complexity or get_migration_report, which focus on broader analysis or reporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly describes path-based scanning, result filtering, and pagination workflow, saying to check `incomplete` for more results. It does not explicitly say when NOT to use this tool in favor of a sibling, but the operational guidance for how to use this tool is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_angular_upgrade_planPlan the Angular upgrade that Signal Forms requiresARead-only
Signal Forms needs Angular 21+. When a project is older, this returns the upgrade plan as markdown, reproducing angular.dev/update-guide from Angular's own published step data — not written by this server. The current version is detected from the project; you choose application complexity (1 Basic, 2 Medium, 3 Advanced) and whether you use ngUpgrade, Angular Material or Windows, exactly as the official guide asks. Read-only: this tool never modifies your files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path inside the Angular project. The current version is read from its package.json. | |
| level | No | Application complexity, as on angular.dev/update-guide: 1 Basic, 2 Medium, 3 Advanced. Defaults to 3. | |
| toMajor | No | Target major. Defaults to the version the recipes are verified against. | |
| windows | No | "I use Windows." Swaps in cmd-compatible commands. | |
| material | No | "I use Angular Material." | |
| fromMajor | No | Override the detected current major version. | |
| ngUpgrade | No | "I use ngUpgrade to combine AngularJS & Angular." |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only: this tool never modifies your files.' It adds meaningful context beyond the annotations: the plan is reproduced from Angular's published step data (not written by this server), the output is markdown, and the current version is auto-detected from the project with optional overrides. It just does not cover edge cases such as what happens when the project is already above the required version.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the purpose and the trigger condition ('When a project is older, this returns the upgrade plan'). Each sentence pulls its weight: requirement, result/format/source, input choices matching the official guide, and the read-only guarantee. It is a touch dense but there is no dead weight and no repetition of the raw schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with full parameter descriptions, an output schema, and explicit read-only annotations, this description covers nearly everything: why it exists (Signal Forms needs 21+), when to call it (older projects), what comes back (official markdown plan), and which input choices to make (the official questionnaire parameters). Minor gaps remain, such as expected behavior when the project is already current or how the detected version is resolved from package.json, but these are edge cases, not blocking gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter already has a description, defaults, and constraints in the input schema. The description adds only slight glue (the choices are exactly what the official guide asks, the version is detected from the project), which is helpful but not a substantial extension of the schema. Baseline 3 is appropriate here; a higher score would require the description to clarify meanings the schema left unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete deliverable — 'the upgrade plan as markdown' reproducing angular.dev/update-guide from Angular's published step data — and anchors it to a requirement (Signal Forms needs Angular 21+). It clearly distinguishes this tool from siblings like analyze_migration_complexity and get_migration_report, which are about analysis and reporting rather than the official step-by-step upgrade plan. The verb (returns) and the resource (the Angular plan from the official guide) are precise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear trigger condition: use it when a project is older than Angular 21+ so the tool emits the official upgrade plan. It also helps the agent select the right parameters by telling it to choose complexity and options 'exactly as the official guide asks.' It does not explicitly name the siblings as alternatives or say when not to use it, which keeps it below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_migration_reportGenerate a Signal Forms migration reportARead-only
Scans .ts and .html files (or a directory) and returns a MARKDOWN REPORT combining findings, complexity, a suggested file order, the constructs present with their recipe names, and a warning for any version-sensitive recipe involved. Returns the report as a string — it does NOT write a file; you decide whether to save it. Read-only: this tool never modifies your files.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to a .ts file or a directory to scan recursively. |
Output Schema
| Name | Required | Description |
|---|---|---|
| markdown | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description clearly discloses that the tool is read-only and does not write files, which aligns with and adds context beyond the readOnlyHint annotation. It also explains that the report is returned as a string and that saving it is the caller's decision, which is useful behavioral guidance for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core action. It packs useful details into three sentences, but it has some redundancy: 'it does NOT write a file', 'you decide whether to save it', and 'this tool never modifies your files' all express similar read-only/no-file-write behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a read-only reporting tool of this complexity. It names the input scope, the output format, the report contents, and the file-writing behavior. Since an output schema exists and annotations cover read-only behavior, nothing critical is missing for an agent to decide whether to call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents the `path` parameter as an absolute path to a .ts file or directory. The description adds context by mentioning .html files and directories, but it does not materially expand the parameter semantics beyond what the schema describes. With 100% schema coverage, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies what the tool does: it scans .ts and .html files or a directory and returns a Markdown report with specific content (findings, complexity, file order, recipe names, version warnings). It distinguishes the tool from generic utility tools by naming the report contents, though it stops short of explicitly contrasting itself with the sibling analysis tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need a combined migration report as a string rather than a file. It does not explicitly state when not to use it or which sibling tool should be used instead, such as `analyze_migration_complexity` for complexity-only analysis or `verify_migration` for validation afterward.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signalforms_recipeGet an Angular Signal Forms migration recipeARead-only
Returns a verified before/after migration recipe for a single Reactive Forms construct (e.g. "FormControl", "FormBuilder.group", "Validators.required"). An unknown construct returns found:false plus the list of available constructs — it is never an error. Read-only: this tool never modifies your files.
| Name | Required | Description | Default |
|---|---|---|---|
| construct | Yes | Reactive Forms construct to look up, e.g. "FormControl", "FormBuilder.group", "Validators.required". |
Output Schema
| Name | Required | Description |
|---|---|---|
| after | No | |
| found | Yes | |
| before | No | |
| caveats | No | |
| construct | Yes | |
| provenance | No | |
| description | No | |
| availableConstructs | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this with 'Read-only: this tool never modifies your files.' Beyond that, it adds a valuable behavioral edge case: unknown constructs return found:false plus available constructs and are never an error, which is more informative than standard error expectations. This exceeds the baseline set by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero waste. The core behavior is front-loaded, followed by the edge case and a read-only guarantee. Every sentence earns its place, and no irrelevant information is included.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter lookup tool with a known input shape and an output schema. The description covers behavior, unknown-input handling, and side-effect safety, so an agent has everything needed to invoke it correctly. The output schema handles the return-value details, and the description covers the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter is already well documented. The description's examples ('FormControl', 'FormBuilder.group', 'Validators.required') mirror the schema's own examples and do not add new semantic depth. The description adds only a mild connection between the parameter and the resulting recipe concept, which keeps this at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Returns a verified before/after migration recipe for a single Reactive Forms construct.' It also gives concrete examples ('FormControl', 'FormBuilder.group', 'Validators.required') and distinguishes itself from sibling tools by targeting a single construct lookup rather than scanning, analysis, or reporting. This makes it unambiguous which tool an agent should select.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the use case: looking up a recipe for a specific Reactive Forms construct. It doesn't explicitly name alternative tools, but the examples and single-construct scope make it evident as a lookup tool. However, it does not explicitly state when to prefer a sibling like find_form_candidates or verify_migration instead, leaving a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_migrationVerify an already-migrated Signal Forms fileARead-only
Reads code you have ALREADY migrated and reports Signal Forms traps that COMPILE and are still wrong — a missed signal call in a position TypeScript does not check, a deprecated-but-valid v21 rule shape, a pre-release API name, an AbstractControl left in a form() model, Reactive Forms imports left behind. Run it after tsc, not instead of it: anything the compiler already reports is deliberately not repeated here. Read-only. It proves the ABSENCE OF KNOWN DEFECTS, never correctness.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Absolute path to an ALREADY-MIGRATED .ts file, or a directory to scan. |
Output Schema
| Name | Required | Description |
|---|---|---|
| files | Yes | |
| checksRun | Yes | |
| infoCount | Yes | |
| disclaimer | Yes | |
| errorCount | Yes | |
| warningCount | Yes | |
| checksSkipped | Yes | |
| notMigratedFiles | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, which already mark read-only and non-destructive behavior, the description adds important behavioral nuances: it only reports defects the compiler misses, it does not re-report compiler errors, and its results 'prove the ABSENCE OF KNOWN DEFECTS, never correctness.' This is exactly the kind of limitation disclosure that helps the agent set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but stays efficient: it front-loads the tool's core behavior, lists useful defect categories, states the run order relative to tsc, and closes with an epistemically honest caveat. Every sentence contributes meaningful decision-making information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only verifier with a 100%-documented schema and an output schema present, the description covers what the tool reads, what defects it finds, where it fits in the workflow, what it explicitly does not do, and its limits. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers the only parameter with 100% accuracy, including that the path must point to an already-migrated file or directory. The description reinforces this with 'reads code you have ALREADY migrated,' but it does not need to add parameter-level detail beyond what the schema already supplies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies a specific verb+resource: it reads already-migrated code and reports Signal Forms traps that compile but are still wrong. It gives concrete examples and establishes that its scope is intentionally narrower than 'correctness checking,' making it distinguishable from migration-planning and reporting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit usage boundary: 'Run it after tsc, not instead of it.' It also states that compiler-reported errors are deliberately excluded, so an agent knows when the tool is and is not the right choice in a migration workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.9.1- First observed
analyze_migration_complexity - First observed
find_form_candidates - First observed
get_angular_upgrade_plan - First observed
get_migration_report - First observed
get_signalforms_recipe - First observed
verify_migration
TDQS
Scored across 6 tools
Most tools are clearly distinct in purpose: discovery, complexity analysis, report generation, recipe lookup, upgrade planning, and verification. The only potential overlap is between find_form_candidates, analyze_migration_complexity, and get_migration_report, but their distinct output shape (raw findings vs. summary vs. combined report) keeps them distinguishable.
All tool names follow a consistent verb_noun snake_case pattern: get_*, find_*, analyze_*, verify_*. The verbs and nouns are explicit and predictable, so an agent can infer tool behavior from the name.
Six tools is well-scoped for a migration-assist server. Each tool covers a necessary part of the migration workflow—candidate discovery, recipe lookup, complexity analysis, report generation, upgrade planning, and post-migration verification—without redundancy or bloat.
The tool surface covers the full lifecycle of the migration assistance: analyzing the existing code, obtaining recipes, generating reports, planning version upgrades, and verifying the migrated result. It lacks a tool that applies the migration automatically, but the server explicitly positions itself as read-only and focuses on verification rather than execution.
Maintenance
Related MCP Connectors
Find retiring AI models and outdated API SDKs in your code, with dates, replacements and guides.
Code intelligence platform for AI agents. 20 tools for architecture, security & impact analysis.
Codebase intelligence for AI agents — dead code, blast radius, ownership.
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables LLMs to apply Martin Fowler's 71+ refactoring patterns to codebases through a pluggable, language-agnostic architecture. Supports previewing and applying refactorings, analyzing code smells, and inspecting code structure with safe-by-default operations.529 PyPI5MIT
- AlicenseBqualityDmaintenanceProvides tools for auditing and fixing scaffolded VA forms to ensure they follow best practices and VA.gov content standards. Enables automated validation, agent prompt generation, and orchestration of form fixes across any vets-website workspace.51MIT
- AlicenseBqualityDmaintenanceEnables AI agents to safely upgrade JavaScript and TypeScript projects through dependency analysis, upgrade path detection, breaking change identification, codemod application, and PR summary generation.148 npmMIT
- AlicenseNot gradedqualityAmaintenanceProvides symbol-level dependency analysis and LLM-ready migration prompts for TypeScript/JavaScript projects, enabling AI editors to scan projects, analyze packages, and generate refactoring prompts.21 npm19MIT