@polymorphism-tech/morph-spec 8.1.0 → 8.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/README.md +2 -2
  2. package/bin/validate.js +379 -379
  3. package/claude-plugin.json +1 -1
  4. package/docs/CHEATSHEET.md +1 -1
  5. package/docs/QUICKSTART.md +1 -1
  6. package/framework/commands/commit.md +166 -166
  7. package/framework/commands/morph-infra.md +215 -215
  8. package/framework/commands/morph-preflight.md +205 -205
  9. package/framework/commands/morph-troubleshoot.md +124 -124
  10. package/framework/hooks/claude-code/core/validate-completion.js +2 -1
  11. package/framework/hooks/claude-code/statusline.py +679 -679
  12. package/framework/hooks/claude-code/statusline.sh +11 -11
  13. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  14. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  15. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  16. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  17. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  18. package/framework/hooks/shared/activity-logger.js +160 -160
  19. package/framework/hooks/shared/build-check.js +97 -24
  20. package/framework/hooks/shared/stdin-reader.js +26 -26
  21. package/framework/rubrics/backend.json +41 -41
  22. package/framework/rules/ai-agents-standards.md +45 -45
  23. package/framework/rules/dotnet-templates.md +86 -86
  24. package/framework/rules/frontend-standards.md +13 -13
  25. package/framework/rules/infrastructure-standards.md +27 -27
  26. package/framework/rules/neon-standards.md +25 -25
  27. package/framework/rules/nextjs-standards.md +20 -20
  28. package/framework/rules/nextjs-templates.md +40 -40
  29. package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
  30. package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
  31. package/framework/skills/core/morph-apply/SKILL.md +1 -1
  32. package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
  33. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  34. package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
  35. package/framework/skills/core/morph-implement/SKILL.md +1 -1
  36. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  37. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  38. package/framework/skills/core/morph-review/SKILL.md +1 -1
  39. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  40. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  41. package/framework/standards/ai-agents/agent-session.md +160 -160
  42. package/framework/standards/ai-agents/batching.md +193 -193
  43. package/framework/standards/ai-agents/context-providers.md +188 -188
  44. package/framework/standards/ai-agents/mcp-server.md +250 -250
  45. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  46. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  47. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  48. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  49. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  50. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  51. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  52. package/framework/standards/ai-agents/production.md +275 -275
  53. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  54. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  55. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  56. package/framework/standards/ai-agents/structured-output.md +249 -249
  57. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  58. package/framework/templates/IDE-SNIPPETS.md +262 -262
  59. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  60. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  61. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  62. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  63. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  64. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  65. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  66. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  67. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  68. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  69. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  70. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  71. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  72. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  73. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  74. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  75. package/framework/templates/code/typescript/contracts.ts +167 -167
  76. package/framework/templates/docs/clarifications.md +253 -253
  77. package/framework/templates/docs/schema-analysis.md +119 -119
  78. package/framework/templates/docs/ui-components.md +52 -52
  79. package/framework/templates/docs/ui-design-system.md +76 -76
  80. package/framework/templates/docs/ui-flows.md +167 -167
  81. package/framework/templates/docs/ui-mockups.md +98 -98
  82. package/framework/templates/feature/decisions.md +122 -122
  83. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  84. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  85. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  86. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  87. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  88. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  89. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  90. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  91. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  92. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  93. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  94. package/framework/templates/infrastructure/github/README.md +56 -56
  95. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  96. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  97. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  98. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  99. package/framework/templates/integrations/asaas-client.cs +387 -387
  100. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  101. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  102. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  103. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  104. package/framework/templates/project/validate.js +120 -120
  105. package/framework/templates/state.template.json +17 -17
  106. package/framework/templates/ui/design-system.css +226 -226
  107. package/package.json +1 -1
  108. package/src/commands/dashboard/dashboard.js +53 -53
  109. package/src/commands/index.js +13 -13
  110. package/src/commands/mcp/mcp-setup.js +519 -519
  111. package/src/commands/project/checkpoint.js +209 -209
  112. package/src/commands/project/worktree.js +83 -1
  113. package/src/core/state/phase-state-machine.js +197 -197
  114. package/src/core/templates/template-renderer.js +477 -477
  115. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  116. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  117. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  118. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  119. package/src/dashboard/app/main.jsx +13 -13
  120. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  121. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  122. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  123. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  124. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  125. package/src/dashboard/app/pages/Standards.jsx +332 -332
  126. package/src/dashboard/app/styles/index.css +47 -47
  127. package/src/dashboard/index.html +12 -12
  128. package/src/dashboard/package.json +24 -24
  129. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  130. package/src/dashboard/scanner/phases-scanner.js +15 -15
  131. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  132. package/src/dashboard/scanner/rules-scanner.js +37 -37
  133. package/src/dashboard/scanner/skills-scanner.js +43 -43
  134. package/src/dashboard/scanner/squads-scanner.js +13 -13
  135. package/src/dashboard/scanner/standards-scanner.js +26 -26
  136. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  137. package/src/dashboard/vite.config.js +24 -24
  138. package/src/lib/agents/metrics-aggregator.js +56 -56
  139. package/src/lib/agents/metrics-calculator.js +125 -125
  140. package/src/lib/agents/output-collector.js +73 -73
  141. package/src/lib/detectors/claude-config-detector.js +152 -152
  142. package/src/lib/detectors/design-system-detector.js +231 -231
  143. package/src/lib/detectors/index.js +217 -217
  144. package/src/lib/generators/architecture-scanner.js +639 -639
  145. package/src/lib/generators/design-system-generator.js +508 -508
  146. package/src/lib/generators/index.js +13 -13
  147. package/src/lib/generators/settings-generator.js +209 -209
  148. package/src/lib/hooks/hook-executor.js +167 -167
  149. package/src/lib/installers/mcp-installer.js +719 -719
  150. package/src/lib/tasks/task-classifier.js +30 -30
  151. package/src/lib/tasks/task-parser.js +209 -209
  152. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  153. package/src/lib/validators/checkpoint-persistence.js +39 -39
  154. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  155. package/src/lib/validators/css/css-validator.js +340 -340
  156. package/src/lib/validators/packages/package-validator.js +347 -347
  157. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  158. package/src/lib/validators/shared/issue-counter.js +14 -14
  159. package/src/lib/validators/validation-runner.js +349 -349
  160. package/src/lib/validators/verify-runner.js +24 -7
  161. package/src/utils/agent-id-mapper.js +11 -11
  162. package/src/utils/claude-settings-manager.js +300 -300
  163. package/src/utils/skills-installer.js +174 -174
  164. package/framework/templates/.idea/morph-templates.xml +0 -92
  165. package/framework/templates/.vscode/morph-templates.code-snippets +0 -186
@@ -1,197 +1,197 @@
1
- # MCP Tools — Agent consuming MCP servers
2
-
3
- > **Scope:** stacks=["dotnet"]
4
- > **Layer:** 2 (on-keyword)
5
- > **Keywords:** mcp, model context protocol, mcp client, consume mcp server, mcp tools, external tools
6
- > **Read by Claude in:** implement (quando um agente usa tools de um MCP server externo)
7
-
8
- **Verified against:** MAF 1.0 GA + ModelContextProtocol C# SDK. Last-verified: 2026-05-19.
9
-
10
- ---
11
-
12
- ## O que é (no contexto de um agente MAF)
13
-
14
- MCP (Model Context Protocol) é um protocolo aberto que padroniza como um agente expõe e consome tools. Um agente MAF pode se conectar a qualquer **MCP server externo** (GitHub, filesystem, Postgres, ferramentas internas de outro projeto) e usar as tools desse servidor exatamente como se fossem tools nativas — o MAF trata tudo como `AITool`.
15
-
16
- Casos de uso típicos:
17
-
18
- - Agente de repositório que usa o GitHub MCP server para listar PRs e issues
19
- - Agente de dados que usa o PostgreSQL MCP server para rodar queries
20
- - Agente de documentação que usa o filesystem MCP server para ler arquivos locais
21
- - Agente corporativo que consome um MCP server interno de outro projeto
22
-
23
- ---
24
-
25
- ## A API
26
-
27
- **Package:**
28
-
29
- ```xml
30
- <PackageReference Include="ModelContextProtocol" Version="0.1.*" />
31
- ```
32
-
33
- > O pacote `ModelContextProtocol` é o SDK C# oficial do protocolo. Versão 0.1.* (preview) — GA previsto; verifique no NuGet antes de travar versão.
34
-
35
- **Fluxo de consumo:**
36
-
37
- 1. `McpClientFactory.CreateAsync(transport)` — conecta ao MCP server e retorna um client `IDisposable`
38
- 2. `mcpClient.ListToolsAsync()` — descobre as tools disponíveis no servidor
39
- 3. `mcpTools.Cast<AITool>()` — converte para `AITool` (interface do MAF / `Microsoft.Extensions.AI`)
40
- 4. Passa as tools ao agente via `AsAIAgent(..., tools: [.. mcpTools.Cast<AITool>()])`
41
-
42
- **Transports suportados:**
43
-
44
- | Transport | Classe | Quando usar |
45
- |-----------|--------|------------|
46
- | stdio | `StdioClientTransport` | MCP server local (processo filho — `npx`, executável) |
47
- | HTTP (SSE) | `SseClientTransport` | MCP server remoto via HTTP/SSE |
48
-
49
- **Regra importante:** use `await using` no `mcpClient` — o dispose fecha o transporte corretamente.
50
-
51
- ---
52
-
53
- ## Exemplo C#
54
-
55
- Agente que consome o GitHub MCP server e responde perguntas sobre repositórios:
56
-
57
- ```csharp
58
- using ModelContextProtocol;
59
- using ModelContextProtocol.Client;
60
- using Microsoft.Agents.AI;
61
- using Microsoft.Extensions.AI;
62
-
63
- // 1. Conectar ao MCP server (GitHub via npx)
64
- await using var mcpClient = await McpClientFactory.CreateAsync(
65
- new StdioClientTransport(new()
66
- {
67
- Name = "GitHubServer",
68
- Command = "npx",
69
- Arguments = ["-y", "--verbose", "@modelcontextprotocol/server-github"],
70
- }));
71
-
72
- // 2. Descobrir as tools do servidor
73
- var mcpTools = await mcpClient.ListToolsAsync();
74
-
75
- // 3. Criar o agente MAF com as MCP tools registradas
76
- // _modelRegistry vem de IModelRegistry (ai-agents-providers-model-registry)
77
- AIAgent agent = _modelRegistry.GetChatClient("text-default")
78
- .AsAIAgent(
79
- instructions: "You answer questions about GitHub repositories.",
80
- tools: [.. mcpTools.Cast<AITool>()]);
81
-
82
- // 4. Usar o agente normalmente
83
- var response = await agent.RunAsync(
84
- "Summarize the last 4 commits to microsoft/agent-framework");
85
- Console.WriteLine(response.Text);
86
- ```
87
-
88
- **Variante com MCP server remoto (HTTP/SSE):**
89
-
90
- ```csharp
91
- using ModelContextProtocol.Client;
92
-
93
- await using var mcpClient = await McpClientFactory.CreateAsync(
94
- new SseClientTransport(new()
95
- {
96
- Name = "RemoteToolsServer",
97
- Uri = new Uri("https://tools.example.com/mcp"),
98
- }));
99
-
100
- var mcpTools = await mcpClient.ListToolsAsync();
101
- // Mesmo padrão para criar o agente...
102
- ```
103
-
104
- **Múltiplos MCP servers:**
105
-
106
- ```csharp
107
- // Conectar a dois servidores e combinar as tools
108
- await using var githubClient = await McpClientFactory.CreateAsync(
109
- new StdioClientTransport(new()
110
- {
111
- Name = "GitHub",
112
- Command = "npx",
113
- Arguments = ["-y", "@modelcontextprotocol/server-github"],
114
- }));
115
-
116
- await using var fsClient = await McpClientFactory.CreateAsync(
117
- new StdioClientTransport(new()
118
- {
119
- Name = "Filesystem",
120
- Command = "npx",
121
- Arguments = ["-y", "@modelcontextprotocol/server-filesystem", "/repo"],
122
- }));
123
-
124
- var allTools = (await githubClient.ListToolsAsync())
125
- .Concat(await fsClient.ListToolsAsync())
126
- .Cast<AITool>()
127
- .ToArray();
128
-
129
- AIAgent agent = _modelRegistry.GetChatClient("text-default")
130
- .AsAIAgent(
131
- instructions: "You help navigate the codebase.",
132
- tools: allTools);
133
- ```
134
-
135
- ---
136
-
137
- ## Popular MCP Servers
138
-
139
- | Server npm | Propósito |
140
- |-----------|-----------|
141
- | `@modelcontextprotocol/server-github` | Repos, issues, PRs do GitHub |
142
- | `@modelcontextprotocol/server-filesystem` | Operações no sistema de arquivos |
143
- | `@modelcontextprotocol/server-sqlite` | Acesso a banco de dados SQLite |
144
- | `@modelcontextprotocol/server-postgres` | Acesso a banco de dados PostgreSQL |
145
-
146
- ---
147
-
148
- ## MCP server vs tool nativa
149
-
150
- | Cenário | Decisão | Motivo |
151
- |---------|---------|--------|
152
- | O servidor existe e é mantido por terceiros (GitHub, Postgres...) | Consumir MCP server | Reutilização imediata; sem esforço de manutenção |
153
- | A lógica é específica deste projeto (ex.: buscar pedido no banco) | Escrever tool nativa `[Description]` | Mais simples, sem overhead de protocolo, testável diretamente |
154
- | O servidor interno já existe e está publicado como MCP | Consumir MCP server | Evita duplicar lógica |
155
- | Precisa de controle total de retries, logging, validação | Tool nativa + middleware MAF | Middleware `ResilientToolMiddleware` dá controle fino |
156
-
157
- **Regra**: prefira MCP server quando o servidor já existe e é mantido por terceiros. Prefira tool nativa quando a lógica é do próprio projeto.
158
-
159
- ---
160
-
161
- ## Anti-patterns
162
-
163
- | Anti-pattern | Problema | Solução |
164
- |-------------|---------|---------|
165
- | Criar um MCP server próprio só para o agente do mesmo projeto chamar | Overhead desnecessário de protocolo e deploy | Escrever tool nativa com `[Description]` + `AIFunctionFactory.Create()` |
166
- | Não tratar indisponibilidade do MCP server | O MCP server pode estar offline ou lento; o agente quebra | Usar `ResilientToolMiddleware` para capturar `HttpRequestException` e `TimeoutException` (ver `ai-agents-production`) |
167
- | Não usar `await using` no `mcpClient` | Processo filho (npx) fica zumbi; leak de recursos | Sempre `await using var mcpClient = await McpClientFactory.CreateAsync(...)` |
168
- | Hardcodar o model diretamente (`new ChatClient("gpt-4o", key)`) | Viola provider-agnostic; difícil de trocar | Sempre `_modelRegistry.GetChatClient("alias")` (ver `ai-agents-providers-model-registry`) |
169
-
170
-
171
- ---
172
-
173
- ## Checklist (verifiable by morph-eval)
174
-
175
- - [ ] `ModelContextProtocol` presente no `.csproj`
176
- - [ ] `await using var mcpClient` — dispose correto do transporte
177
- - [ ] `McpClientFactory.CreateAsync(new StdioClientTransport(...))` com `Name`, `Command`, `Arguments`
178
- - [ ] `ListToolsAsync()` chamado antes de criar o agente
179
- - [ ] `mcpTools.Cast<AITool>()` para registrar no agente
180
- - [ ] Agente criado via `_modelRegistry.GetChatClient("alias").AsAIAgent(...)` — provider-agnostic
181
- - [ ] `ResilientToolMiddleware` ou equivalente registrado (o MCP server pode ficar indisponível)
182
- - [ ] Nenhum `Guid.NewGuid()` — usar `Guid.CreateVersion7()` se IDs são necessários
183
-
184
- ---
185
-
186
- ## References
187
-
188
- - `ai-agents-setup` — pacotes base MAF, DI, quick start
189
- - `ai-agents-production` — panorama de MCP Integration, `ResilientToolMiddleware`, middleware pipeline
190
- - `ai-agents-mcp-server` — expor capacidades do próprio projeto como MCP server
191
- - `integration/mcp/mcp-tools.md` — MCPs no workflow do morph-spec (Playwright, Context7, Neon) — contexto complementar, escopo diferente
192
- - [ModelContextProtocol C# SDK](https://github.com/modelcontextprotocol/csharp-sdk)
193
- - [Using MCP Tools — MAF docs](https://learn.microsoft.com/agent-framework/user-guide/model-context-protocol/using-mcp-tools)
194
-
195
- ---
196
-
197
- *MORPH-SPEC by Polymorphism Tech — ai-agents/mcp-tools.md v1.0 (2026-05-19)*
1
+ # MCP Tools — Agent consuming MCP servers
2
+
3
+ > **Scope:** stacks=["dotnet"]
4
+ > **Layer:** 2 (on-keyword)
5
+ > **Keywords:** mcp, model context protocol, mcp client, consume mcp server, mcp tools, external tools
6
+ > **Read by Claude in:** implement (quando um agente usa tools de um MCP server externo)
7
+
8
+ **Verified against:** MAF 1.0 GA + ModelContextProtocol C# SDK. Last-verified: 2026-05-19.
9
+
10
+ ---
11
+
12
+ ## O que é (no contexto de um agente MAF)
13
+
14
+ MCP (Model Context Protocol) é um protocolo aberto que padroniza como um agente expõe e consome tools. Um agente MAF pode se conectar a qualquer **MCP server externo** (GitHub, filesystem, Postgres, ferramentas internas de outro projeto) e usar as tools desse servidor exatamente como se fossem tools nativas — o MAF trata tudo como `AITool`.
15
+
16
+ Casos de uso típicos:
17
+
18
+ - Agente de repositório que usa o GitHub MCP server para listar PRs e issues
19
+ - Agente de dados que usa o PostgreSQL MCP server para rodar queries
20
+ - Agente de documentação que usa o filesystem MCP server para ler arquivos locais
21
+ - Agente corporativo que consome um MCP server interno de outro projeto
22
+
23
+ ---
24
+
25
+ ## A API
26
+
27
+ **Package:**
28
+
29
+ ```xml
30
+ <PackageReference Include="ModelContextProtocol" Version="0.1.*" />
31
+ ```
32
+
33
+ > O pacote `ModelContextProtocol` é o SDK C# oficial do protocolo. Versão 0.1.* (preview) — GA previsto; verifique no NuGet antes de travar versão.
34
+
35
+ **Fluxo de consumo:**
36
+
37
+ 1. `McpClientFactory.CreateAsync(transport)` — conecta ao MCP server e retorna um client `IDisposable`
38
+ 2. `mcpClient.ListToolsAsync()` — descobre as tools disponíveis no servidor
39
+ 3. `mcpTools.Cast<AITool>()` — converte para `AITool` (interface do MAF / `Microsoft.Extensions.AI`)
40
+ 4. Passa as tools ao agente via `AsAIAgent(..., tools: [.. mcpTools.Cast<AITool>()])`
41
+
42
+ **Transports suportados:**
43
+
44
+ | Transport | Classe | Quando usar |
45
+ |-----------|--------|------------|
46
+ | stdio | `StdioClientTransport` | MCP server local (processo filho — `npx`, executável) |
47
+ | HTTP (SSE) | `SseClientTransport` | MCP server remoto via HTTP/SSE |
48
+
49
+ **Regra importante:** use `await using` no `mcpClient` — o dispose fecha o transporte corretamente.
50
+
51
+ ---
52
+
53
+ ## Exemplo C#
54
+
55
+ Agente que consome o GitHub MCP server e responde perguntas sobre repositórios:
56
+
57
+ ```csharp
58
+ using ModelContextProtocol;
59
+ using ModelContextProtocol.Client;
60
+ using Microsoft.Agents.AI;
61
+ using Microsoft.Extensions.AI;
62
+
63
+ // 1. Conectar ao MCP server (GitHub via npx)
64
+ await using var mcpClient = await McpClientFactory.CreateAsync(
65
+ new StdioClientTransport(new()
66
+ {
67
+ Name = "GitHubServer",
68
+ Command = "npx",
69
+ Arguments = ["-y", "--verbose", "@modelcontextprotocol/server-github"],
70
+ }));
71
+
72
+ // 2. Descobrir as tools do servidor
73
+ var mcpTools = await mcpClient.ListToolsAsync();
74
+
75
+ // 3. Criar o agente MAF com as MCP tools registradas
76
+ // _modelRegistry vem de IModelRegistry (ai-agents-providers-model-registry)
77
+ AIAgent agent = _modelRegistry.GetChatClient("text-default")
78
+ .AsAIAgent(
79
+ instructions: "You answer questions about GitHub repositories.",
80
+ tools: [.. mcpTools.Cast<AITool>()]);
81
+
82
+ // 4. Usar o agente normalmente
83
+ var response = await agent.RunAsync(
84
+ "Summarize the last 4 commits to microsoft/agent-framework");
85
+ Console.WriteLine(response.Text);
86
+ ```
87
+
88
+ **Variante com MCP server remoto (HTTP/SSE):**
89
+
90
+ ```csharp
91
+ using ModelContextProtocol.Client;
92
+
93
+ await using var mcpClient = await McpClientFactory.CreateAsync(
94
+ new SseClientTransport(new()
95
+ {
96
+ Name = "RemoteToolsServer",
97
+ Uri = new Uri("https://tools.example.com/mcp"),
98
+ }));
99
+
100
+ var mcpTools = await mcpClient.ListToolsAsync();
101
+ // Mesmo padrão para criar o agente...
102
+ ```
103
+
104
+ **Múltiplos MCP servers:**
105
+
106
+ ```csharp
107
+ // Conectar a dois servidores e combinar as tools
108
+ await using var githubClient = await McpClientFactory.CreateAsync(
109
+ new StdioClientTransport(new()
110
+ {
111
+ Name = "GitHub",
112
+ Command = "npx",
113
+ Arguments = ["-y", "@modelcontextprotocol/server-github"],
114
+ }));
115
+
116
+ await using var fsClient = await McpClientFactory.CreateAsync(
117
+ new StdioClientTransport(new()
118
+ {
119
+ Name = "Filesystem",
120
+ Command = "npx",
121
+ Arguments = ["-y", "@modelcontextprotocol/server-filesystem", "/repo"],
122
+ }));
123
+
124
+ var allTools = (await githubClient.ListToolsAsync())
125
+ .Concat(await fsClient.ListToolsAsync())
126
+ .Cast<AITool>()
127
+ .ToArray();
128
+
129
+ AIAgent agent = _modelRegistry.GetChatClient("text-default")
130
+ .AsAIAgent(
131
+ instructions: "You help navigate the codebase.",
132
+ tools: allTools);
133
+ ```
134
+
135
+ ---
136
+
137
+ ## Popular MCP Servers
138
+
139
+ | Server npm | Propósito |
140
+ |-----------|-----------|
141
+ | `@modelcontextprotocol/server-github` | Repos, issues, PRs do GitHub |
142
+ | `@modelcontextprotocol/server-filesystem` | Operações no sistema de arquivos |
143
+ | `@modelcontextprotocol/server-sqlite` | Acesso a banco de dados SQLite |
144
+ | `@modelcontextprotocol/server-postgres` | Acesso a banco de dados PostgreSQL |
145
+
146
+ ---
147
+
148
+ ## MCP server vs tool nativa
149
+
150
+ | Cenário | Decisão | Motivo |
151
+ |---------|---------|--------|
152
+ | O servidor existe e é mantido por terceiros (GitHub, Postgres...) | Consumir MCP server | Reutilização imediata; sem esforço de manutenção |
153
+ | A lógica é específica deste projeto (ex.: buscar pedido no banco) | Escrever tool nativa `[Description]` | Mais simples, sem overhead de protocolo, testável diretamente |
154
+ | O servidor interno já existe e está publicado como MCP | Consumir MCP server | Evita duplicar lógica |
155
+ | Precisa de controle total de retries, logging, validação | Tool nativa + middleware MAF | Middleware `ResilientToolMiddleware` dá controle fino |
156
+
157
+ **Regra**: prefira MCP server quando o servidor já existe e é mantido por terceiros. Prefira tool nativa quando a lógica é do próprio projeto.
158
+
159
+ ---
160
+
161
+ ## Anti-patterns
162
+
163
+ | Anti-pattern | Problema | Solução |
164
+ |-------------|---------|---------|
165
+ | Criar um MCP server próprio só para o agente do mesmo projeto chamar | Overhead desnecessário de protocolo e deploy | Escrever tool nativa com `[Description]` + `AIFunctionFactory.Create()` |
166
+ | Não tratar indisponibilidade do MCP server | O MCP server pode estar offline ou lento; o agente quebra | Usar `ResilientToolMiddleware` para capturar `HttpRequestException` e `TimeoutException` (ver `ai-agents-production`) |
167
+ | Não usar `await using` no `mcpClient` | Processo filho (npx) fica zumbi; leak de recursos | Sempre `await using var mcpClient = await McpClientFactory.CreateAsync(...)` |
168
+ | Hardcodar o model diretamente (`new ChatClient("gpt-4o", key)`) | Viola provider-agnostic; difícil de trocar | Sempre `_modelRegistry.GetChatClient("alias")` (ver `ai-agents-providers-model-registry`) |
169
+
170
+
171
+ ---
172
+
173
+ ## Checklist (verifiable by morph-eval)
174
+
175
+ - [ ] `ModelContextProtocol` presente no `.csproj`
176
+ - [ ] `await using var mcpClient` — dispose correto do transporte
177
+ - [ ] `McpClientFactory.CreateAsync(new StdioClientTransport(...))` com `Name`, `Command`, `Arguments`
178
+ - [ ] `ListToolsAsync()` chamado antes de criar o agente
179
+ - [ ] `mcpTools.Cast<AITool>()` para registrar no agente
180
+ - [ ] Agente criado via `_modelRegistry.GetChatClient("alias").AsAIAgent(...)` — provider-agnostic
181
+ - [ ] `ResilientToolMiddleware` ou equivalente registrado (o MCP server pode ficar indisponível)
182
+ - [ ] Nenhum `Guid.NewGuid()` — usar `Guid.CreateVersion7()` se IDs são necessários
183
+
184
+ ---
185
+
186
+ ## References
187
+
188
+ - `ai-agents-setup` — pacotes base MAF, DI, quick start
189
+ - `ai-agents-production` — panorama de MCP Integration, `ResilientToolMiddleware`, middleware pipeline
190
+ - `ai-agents-mcp-server` — expor capacidades do próprio projeto como MCP server
191
+ - `integration/mcp/mcp-tools.md` — MCPs no workflow do morph-spec (Playwright, Context7, Neon) — contexto complementar, escopo diferente
192
+ - [ModelContextProtocol C# SDK](https://github.com/modelcontextprotocol/csharp-sdk)
193
+ - [Using MCP Tools — MAF docs](https://learn.microsoft.com/agent-framework/user-guide/model-context-protocol/using-mcp-tools)
194
+
195
+ ---
196
+
197
+ *MORPH-SPEC by Polymorphism Tech — ai-agents/mcp-tools.md v1.0 (2026-05-19)*