@polymorphism-tech/morph-spec 7.9.0 → 7.9.1

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 (167) 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 +5 -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/statusline.py +679 -679
  11. package/framework/hooks/claude-code/statusline.sh +11 -11
  12. package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
  13. package/framework/hooks/git/pre-commit/agents.sh +25 -25
  14. package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
  15. package/framework/hooks/git/pre-commit/specs.sh +50 -50
  16. package/framework/hooks/git/pre-push/run-tests.sh +44 -44
  17. package/framework/hooks/shared/activity-logger.js +160 -160
  18. package/framework/hooks/shared/hook-response.js +45 -45
  19. package/framework/hooks/shared/payload-utils.js +78 -78
  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-implement/SKILL.md +1 -1
  35. package/framework/skills/core/morph-plan/SKILL.md +1 -1
  36. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  37. package/framework/skills/core/morph-review/SKILL.md +1 -1
  38. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  39. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  40. package/framework/standards/ai-agents/agent-session.md +160 -160
  41. package/framework/standards/ai-agents/batching.md +193 -193
  42. package/framework/standards/ai-agents/context-providers.md +188 -188
  43. package/framework/standards/ai-agents/mcp-server.md +250 -250
  44. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  45. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  46. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  47. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  48. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  49. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  50. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  51. package/framework/standards/ai-agents/production.md +275 -275
  52. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  53. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  54. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  55. package/framework/standards/ai-agents/structured-output.md +249 -249
  56. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  57. package/framework/templates/IDE-SNIPPETS.md +262 -262
  58. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  59. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  60. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  61. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  62. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  63. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  64. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  65. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  66. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  67. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  68. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  69. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  70. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  71. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  72. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  73. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  74. package/framework/templates/code/typescript/contracts.ts +167 -167
  75. package/framework/templates/docs/clarifications.md +253 -253
  76. package/framework/templates/docs/schema-analysis.md +119 -119
  77. package/framework/templates/docs/ui-components.md +52 -52
  78. package/framework/templates/docs/ui-design-system.md +76 -76
  79. package/framework/templates/docs/ui-flows.md +167 -167
  80. package/framework/templates/docs/ui-mockups.md +98 -98
  81. package/framework/templates/feature/decisions.md +122 -122
  82. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  83. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  84. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  85. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  86. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  87. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  88. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  89. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  90. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  91. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  92. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  93. package/framework/templates/infrastructure/github/README.md +56 -56
  94. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  95. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  96. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  97. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  98. package/framework/templates/integrations/asaas-client.cs +387 -387
  99. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  100. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  101. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  102. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  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 +2 -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/update.js +4 -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/LiveState.jsx +239 -239
  123. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  124. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  125. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  126. package/src/dashboard/app/pages/Standards.jsx +332 -332
  127. package/src/dashboard/app/styles/index.css +47 -47
  128. package/src/dashboard/index.html +12 -12
  129. package/src/dashboard/package.json +24 -24
  130. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  131. package/src/dashboard/scanner/phases-scanner.js +15 -15
  132. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  133. package/src/dashboard/scanner/rules-scanner.js +37 -37
  134. package/src/dashboard/scanner/skills-scanner.js +43 -43
  135. package/src/dashboard/scanner/squads-scanner.js +13 -13
  136. package/src/dashboard/scanner/standards-scanner.js +26 -26
  137. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  138. package/src/dashboard/vite.config.js +24 -24
  139. package/src/lib/agents/metrics-aggregator.js +56 -56
  140. package/src/lib/agents/metrics-calculator.js +125 -125
  141. package/src/lib/agents/output-collector.js +73 -73
  142. package/src/lib/detectors/claude-config-detector.js +152 -152
  143. package/src/lib/detectors/design-system-detector.js +231 -231
  144. package/src/lib/detectors/index.js +217 -217
  145. package/src/lib/generators/architecture-scanner.js +639 -639
  146. package/src/lib/generators/design-system-generator.js +508 -508
  147. package/src/lib/generators/index.js +13 -13
  148. package/src/lib/generators/settings-generator.js +209 -209
  149. package/src/lib/hooks/hook-executor.js +167 -167
  150. package/src/lib/installers/mcp-installer.js +719 -719
  151. package/src/lib/tasks/task-classifier.js +30 -30
  152. package/src/lib/tasks/task-parser.js +209 -209
  153. package/src/lib/tasks/test-runner.js +81 -81
  154. package/src/lib/validators/architecture/architecture-validator.js +259 -259
  155. package/src/lib/validators/checkpoint-persistence.js +39 -39
  156. package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
  157. package/src/lib/validators/css/css-validator.js +340 -340
  158. package/src/lib/validators/packages/package-validator.js +347 -347
  159. package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
  160. package/src/lib/validators/shared/issue-counter.js +14 -14
  161. package/src/lib/validators/validation-runner.js +349 -349
  162. package/src/scripts/setup-infra.js +385 -385
  163. package/src/utils/agent-id-mapper.js +11 -11
  164. package/src/utils/claude-settings-manager.js +300 -300
  165. package/src/utils/skills-installer.js +174 -174
  166. package/framework/templates/.idea/morph-templates.xml +0 -92
  167. 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)*