@polymorphism-tech/morph-spec 7.8.1 → 7.9.0

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