@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.
- package/README.md +2 -2
- package/bin/validate.js +379 -379
- package/claude-plugin.json +1 -1
- package/docs/CHEATSHEET.md +1 -1
- package/docs/QUICKSTART.md +1 -1
- package/framework/commands/commit.md +166 -166
- package/framework/commands/morph-infra.md +215 -215
- package/framework/commands/morph-preflight.md +205 -205
- package/framework/commands/morph-troubleshoot.md +124 -124
- package/framework/hooks/claude-code/core/validate-completion.js +2 -1
- package/framework/hooks/claude-code/statusline.py +679 -679
- package/framework/hooks/claude-code/statusline.sh +11 -11
- package/framework/hooks/git/commit-msg/conventional-commits.sh +33 -33
- package/framework/hooks/git/pre-commit/agents.sh +25 -25
- package/framework/hooks/git/pre-commit/orchestrator.sh +64 -64
- package/framework/hooks/git/pre-commit/specs.sh +50 -50
- package/framework/hooks/git/pre-push/run-tests.sh +44 -44
- package/framework/hooks/shared/activity-logger.js +160 -160
- package/framework/hooks/shared/build-check.js +97 -24
- package/framework/hooks/shared/stdin-reader.js +26 -26
- package/framework/rubrics/backend.json +41 -41
- package/framework/rules/ai-agents-standards.md +45 -45
- package/framework/rules/dotnet-templates.md +86 -86
- package/framework/rules/frontend-standards.md +13 -13
- package/framework/rules/infrastructure-standards.md +27 -27
- package/framework/rules/neon-standards.md +25 -25
- package/framework/rules/nextjs-standards.md +20 -20
- package/framework/rules/nextjs-templates.md +40 -40
- package/framework/skills/core/create-umbraco-lp/SKILL.md +1 -1
- package/framework/skills/core/migrate-lp-to-umbraco/SKILL.md +1 -1
- package/framework/skills/core/morph-apply/SKILL.md +1 -1
- package/framework/skills/core/morph-brainstorming/SKILL.md +1 -1
- package/framework/skills/core/morph-eval/SKILL.md +1 -1
- package/framework/skills/core/morph-hotfix/SKILL.md +1 -1
- package/framework/skills/core/morph-implement/SKILL.md +1 -1
- package/framework/skills/core/morph-plan/SKILL.md +1 -1
- package/framework/skills/core/morph-proposal/SKILL.md +1 -1
- package/framework/skills/core/morph-review/SKILL.md +1 -1
- package/framework/skills/core/morph-stack-scan/SKILL.md +1 -1
- package/framework/skills/core/morph-standards/SKILL.md +1 -1
- package/framework/standards/ai-agents/agent-session.md +160 -160
- package/framework/standards/ai-agents/batching.md +193 -193
- package/framework/standards/ai-agents/context-providers.md +188 -188
- package/framework/standards/ai-agents/mcp-server.md +250 -250
- package/framework/standards/ai-agents/mcp-tools.md +197 -197
- package/framework/standards/ai-agents/middleware-patterns.md +207 -207
- package/framework/standards/ai-agents/modalities-image-gen.md +173 -173
- package/framework/standards/ai-agents/modalities-speech-to-text.md +171 -171
- package/framework/standards/ai-agents/modalities-text-to-speech.md +181 -181
- package/framework/standards/ai-agents/modalities-vision.md +201 -201
- package/framework/standards/ai-agents/multi-agent-patterns.md +155 -155
- package/framework/standards/ai-agents/production.md +275 -275
- package/framework/standards/ai-agents/prompts-in-db.md +214 -214
- package/framework/standards/ai-agents/providers/model-registry.md +158 -158
- package/framework/standards/ai-agents/service-tier-flex.md +135 -135
- package/framework/standards/ai-agents/structured-output.md +249 -249
- package/framework/standards/ai-agents/sweet-spot.md +109 -109
- package/framework/templates/IDE-SNIPPETS.md +262 -262
- package/framework/templates/code/dotnet/abstractions/api-endpoint.cs +7 -7
- package/framework/templates/code/dotnet/ai-agents/AgentBootstrap.cs.template +39 -39
- package/framework/templates/code/dotnet/ai-agents/EmbeddingService.cs.template +68 -68
- package/framework/templates/code/dotnet/ai-agents/ModelRegistry.cs.template +117 -117
- package/framework/templates/code/dotnet/ai-agents/PromptRepository.cs.template +95 -95
- package/framework/templates/code/dotnet/ai-agents/ResilientToolMiddleware.cs.template +61 -61
- package/framework/templates/code/dotnet/ai-agents/VectorSearchTool.cs.template +107 -107
- package/framework/templates/code/dotnet/ai-agents/model-registry.json.template +58 -58
- package/framework/templates/code/dotnet/contracts/contracts-vsa.cs +281 -281
- package/framework/templates/code/dotnet/database/migration.cs +83 -83
- package/framework/templates/code/dotnet/feature/endpoint.cs.hbs +21 -21
- package/framework/templates/code/dotnet/feature/request.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/response.cs.hbs +4 -4
- package/framework/templates/code/dotnet/feature/validator.cs.hbs +15 -15
- package/framework/templates/code/sql/ai-agents/agent-prompts-migration.sql.template +58 -58
- package/framework/templates/code/sql/ai-agents/pgvector-embeddings-migration.sql.template +91 -91
- package/framework/templates/code/typescript/contracts.ts +167 -167
- package/framework/templates/docs/clarifications.md +253 -253
- package/framework/templates/docs/schema-analysis.md +119 -119
- package/framework/templates/docs/ui-components.md +52 -52
- package/framework/templates/docs/ui-design-system.md +76 -76
- package/framework/templates/docs/ui-flows.md +167 -167
- package/framework/templates/docs/ui-mockups.md +98 -98
- package/framework/templates/feature/decisions.md +122 -122
- package/framework/templates/frontend/nextjs/Dockerfile.nextjs.hbs +43 -43
- package/framework/templates/frontend/nextjs/client-component.tsx.hbs +26 -26
- package/framework/templates/frontend/nextjs/env.mjs.hbs +32 -32
- package/framework/templates/frontend/nextjs/feature-form.tsx.hbs +56 -56
- package/framework/templates/frontend/nextjs/page.tsx.hbs +22 -22
- package/framework/templates/frontend/nextjs/tsconfig.json.hbs +26 -26
- package/framework/templates/frontend/nextjs/use-feature.ts.hbs +54 -54
- package/framework/templates/infrastructure/docker/Dockerfile.template +58 -58
- package/framework/templates/infrastructure/docker/docker-compose.template.yml +50 -50
- package/framework/templates/infrastructure/docker/dockerfile-api.dockerfile +38 -38
- package/framework/templates/infrastructure/docker/dockerfile-web.dockerfile +48 -48
- package/framework/templates/infrastructure/github/README.md +56 -56
- package/framework/templates/infrastructure/github/actions/docker-build-push/action.yml.hbs +45 -45
- package/framework/templates/infrastructure/github/actions/health-check/action.yml.hbs +27 -27
- package/framework/templates/infrastructure/github/workflows/docker-build-push.yml.hbs +59 -59
- package/framework/templates/infrastructure/github/workflows/dotnet-build.yml.hbs +39 -39
- package/framework/templates/integrations/asaas-client.cs +387 -387
- package/framework/templates/integrations/asaas-webhook.cs +351 -351
- package/framework/templates/meta-prompts/fusion/fusion-agent.md +76 -76
- package/framework/templates/meta-prompts/fusion/fusion-aggregator.md +100 -100
- package/framework/templates/meta-prompts/validators/pre-commit-validator.md +95 -95
- package/framework/templates/project/validate.js +120 -120
- package/framework/templates/state.template.json +17 -17
- package/framework/templates/ui/design-system.css +226 -226
- package/package.json +1 -1
- package/src/commands/dashboard/dashboard.js +53 -53
- package/src/commands/index.js +13 -13
- package/src/commands/mcp/mcp-setup.js +519 -519
- package/src/commands/project/checkpoint.js +209 -209
- package/src/commands/project/worktree.js +83 -1
- package/src/core/state/phase-state-machine.js +197 -197
- package/src/core/templates/template-renderer.js +477 -477
- package/src/dashboard/app/components/DetailPanel.jsx +11 -11
- package/src/dashboard/app/components/FlowGraph.jsx +17 -17
- package/src/dashboard/app/components/SearchFilter.jsx +22 -22
- package/src/dashboard/app/hooks/useDetailPanel.js +15 -15
- package/src/dashboard/app/main.jsx +13 -13
- package/src/dashboard/app/pages/AgentMap.jsx +370 -370
- package/src/dashboard/app/pages/HookInspector.jsx +418 -418
- package/src/dashboard/app/pages/PhasePipeline.jsx +408 -408
- package/src/dashboard/app/pages/RulesMap.jsx +273 -273
- package/src/dashboard/app/pages/SkillsLibrary.jsx +366 -366
- package/src/dashboard/app/pages/Standards.jsx +332 -332
- package/src/dashboard/app/styles/index.css +47 -47
- package/src/dashboard/index.html +12 -12
- package/src/dashboard/package.json +24 -24
- package/src/dashboard/scanner/hooks-scanner.js +41 -41
- package/src/dashboard/scanner/phases-scanner.js +15 -15
- package/src/dashboard/scanner/rubrics-scanner.js +12 -12
- package/src/dashboard/scanner/rules-scanner.js +37 -37
- package/src/dashboard/scanner/skills-scanner.js +43 -43
- package/src/dashboard/scanner/squads-scanner.js +13 -13
- package/src/dashboard/scanner/standards-scanner.js +26 -26
- package/src/dashboard/vite-plugin-morph-data.js +17 -17
- package/src/dashboard/vite.config.js +24 -24
- package/src/lib/agents/metrics-aggregator.js +56 -56
- package/src/lib/agents/metrics-calculator.js +125 -125
- package/src/lib/agents/output-collector.js +73 -73
- package/src/lib/detectors/claude-config-detector.js +152 -152
- package/src/lib/detectors/design-system-detector.js +231 -231
- package/src/lib/detectors/index.js +217 -217
- package/src/lib/generators/architecture-scanner.js +639 -639
- package/src/lib/generators/design-system-generator.js +508 -508
- package/src/lib/generators/index.js +13 -13
- package/src/lib/generators/settings-generator.js +209 -209
- package/src/lib/hooks/hook-executor.js +167 -167
- package/src/lib/installers/mcp-installer.js +719 -719
- package/src/lib/tasks/task-classifier.js +30 -30
- package/src/lib/tasks/task-parser.js +209 -209
- package/src/lib/validators/architecture/architecture-validator.js +259 -259
- package/src/lib/validators/checkpoint-persistence.js +39 -39
- package/src/lib/validators/contracts/contract-compliance-validator.js +274 -274
- package/src/lib/validators/css/css-validator.js +340 -340
- package/src/lib/validators/packages/package-validator.js +347 -347
- package/src/lib/validators/shared/emit-validator-dispatch.js +14 -14
- package/src/lib/validators/shared/issue-counter.js +14 -14
- package/src/lib/validators/validation-runner.js +349 -349
- package/src/lib/validators/verify-runner.js +24 -7
- package/src/utils/agent-id-mapper.js +11 -11
- package/src/utils/claude-settings-manager.js +300 -300
- package/src/utils/skills-installer.js +174 -174
- package/framework/templates/.idea/morph-templates.xml +0 -92
- 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)*
|