@polymorphism-tech/morph-spec 7.8.0 → 7.8.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 (166) 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/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-brainstorming/SKILL.md +8 -4
  32. package/framework/skills/core/morph-eval/SKILL.md +1 -1
  33. package/framework/skills/core/morph-plan/SKILL.md +8 -4
  34. package/framework/skills/core/morph-proposal/SKILL.md +1 -1
  35. package/framework/skills/core/morph-review/SKILL.md +13 -7
  36. package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
  37. package/framework/skills/core/morph-standards/SKILL.md +1 -1
  38. package/framework/standards/ai-agents/agent-session.md +160 -160
  39. package/framework/standards/ai-agents/batching.md +193 -193
  40. package/framework/standards/ai-agents/context-providers.md +188 -188
  41. package/framework/standards/ai-agents/mcp-server.md +250 -250
  42. package/framework/standards/ai-agents/mcp-tools.md +197 -197
  43. package/framework/standards/ai-agents/middleware-patterns.md +207 -207
  44. package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
  45. package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
  46. package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
  47. package/framework/standards/ai-agents/modalities-vision.md +201 -201
  48. package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
  49. package/framework/standards/ai-agents/production.md +275 -275
  50. package/framework/standards/ai-agents/prompts-in-db.md +214 -214
  51. package/framework/standards/ai-agents/providers/model-registry.md +158 -158
  52. package/framework/standards/ai-agents/service-tier-flex.md +135 -135
  53. package/framework/standards/ai-agents/structured-output.md +249 -249
  54. package/framework/standards/ai-agents/sweet-spot.md +109 -109
  55. package/framework/templates/IDE-SNIPPETS.md +262 -262
  56. package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
  57. package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
  58. package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
  59. package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
  60. package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
  61. package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
  62. package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
  63. package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
  64. package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
  65. package/framework/templates/code/dotnet/database/migration.cs +83 -83
  66. package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
  67. package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
  68. package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
  69. package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
  70. package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
  71. package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
  72. package/framework/templates/code/typescript/contracts.ts +167 -167
  73. package/framework/templates/docs/clarifications.md +253 -253
  74. package/framework/templates/docs/schema-analysis.md +119 -119
  75. package/framework/templates/docs/ui-components.md +52 -52
  76. package/framework/templates/docs/ui-design-system.md +76 -76
  77. package/framework/templates/docs/ui-flows.md +167 -167
  78. package/framework/templates/docs/ui-mockups.md +98 -98
  79. package/framework/templates/feature/decisions.md +122 -122
  80. package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
  81. package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
  82. package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
  83. package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
  84. package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
  85. package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
  86. package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
  87. package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
  88. package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
  89. package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
  90. package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
  91. package/framework/templates/infrastructure/github/README.md +56 -56
  92. package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
  93. package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
  94. package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
  95. package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
  96. package/framework/templates/integrations/asaas-client.cs +387 -387
  97. package/framework/templates/integrations/asaas-webhook.cs +351 -351
  98. package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
  99. package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
  100. package/framework/templates/meta-prompts/parallel-workers/parallel-coordinator.md +113 -113
  101. package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
  102. package/framework/templates/project/validate.js +120 -120
  103. package/framework/templates/state.template.json +17 -17
  104. package/framework/templates/ui/design-system.css +226 -226
  105. package/package.json +1 -1
  106. package/src/commands/dashboard/dashboard.js +53 -53
  107. package/src/commands/index.js +13 -13
  108. package/src/commands/mcp/mcp-setup.js +519 -519
  109. package/src/commands/project/checkpoint.js +209 -209
  110. package/src/commands/project/update.js +7 -4
  111. package/src/core/state/phase-state-machine.js +197 -197
  112. package/src/core/templates/template-renderer.js +477 -477
  113. package/src/dashboard/app/components/DetailPanel.jsx +11 -11
  114. package/src/dashboard/app/components/FlowGraph.jsx +17 -17
  115. package/src/dashboard/app/components/SearchFilter.jsx +22 -22
  116. package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
  117. package/src/dashboard/app/main.jsx +13 -13
  118. package/src/dashboard/app/pages/AgentMap.jsx +370 -370
  119. package/src/dashboard/app/pages/HookInspector.jsx +418 -418
  120. package/src/dashboard/app/pages/LiveState.jsx +239 -239
  121. package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
  122. package/src/dashboard/app/pages/RulesMap.jsx +273 -273
  123. package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
  124. package/src/dashboard/app/pages/Standards.jsx +332 -332
  125. package/src/dashboard/app/styles/index.css +47 -47
  126. package/src/dashboard/index.html +12 -12
  127. package/src/dashboard/package.json +24 -24
  128. package/src/dashboard/scanner/hooks-scanner.js +41 -41
  129. package/src/dashboard/scanner/phases-scanner.js +15 -15
  130. package/src/dashboard/scanner/rubrics-scanner.js +12 -12
  131. package/src/dashboard/scanner/rules-scanner.js +37 -37
  132. package/src/dashboard/scanner/skills-scanner.js +43 -43
  133. package/src/dashboard/scanner/squads-scanner.js +13 -13
  134. package/src/dashboard/scanner/standards-scanner.js +26 -26
  135. package/src/dashboard/vite-plugin-morph-data.js +17 -17
  136. package/src/dashboard/vite.config.js +24 -24
  137. package/src/lib/agents/metrics-aggregator.js +56 -56
  138. package/src/lib/agents/metrics-calculator.js +125 -125
  139. package/src/lib/agents/output-collector.js +73 -73
  140. package/src/lib/detectors/claude-config-detector.js +152 -152
  141. package/src/lib/detectors/design-system-detector.js +231 -231
  142. package/src/lib/detectors/index.js +217 -217
  143. package/src/lib/generators/architecture-scanner.js +639 -639
  144. package/src/lib/generators/design-system-generator.js +508 -508
  145. package/src/lib/generators/index.js +13 -13
  146. package/src/lib/generators/settings-generator.js +209 -209
  147. package/src/lib/hooks/hook-executor.js +167 -167
  148. package/src/lib/installers/mcp-installer.js +719 -719
  149. package/src/lib/tasks/task-classifier.js +30 -30
  150. package/src/lib/tasks/task-parser.js +209 -209
  151. package/src/lib/tasks/test-runner.js +81 -81
  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/scripts/setup-infra.js +383 -383
  161. package/src/utils/agent-id-mapper.js +11 -11
  162. package/src/utils/banner.js +1 -2
  163. package/src/utils/claude-settings-manager.js +300 -300
  164. package/src/utils/skills-installer.js +172 -172
  165. package/framework/templates/.idea/morph-templates.xml +0 -92
  166. 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)*