forge-toolkit: хелперы для разработки MCP-серверов на Go. - toolkit: args/schema/result/env/probe/server - toolkit/validate: валидаторы синтаксиса - configreload: live-reload конфига по контент-хэшу - docs: ARCHITECTURE, quickstart, mcp-contract - template/ и examples/hello-tool/ - CI (Gitea Actions), лицензия Apache-2.0
124 lines
2.7 KiB
Markdown
124 lines
2.7 KiB
Markdown
# Быстрый старт: первый инструмент за 10 минут
|
|
|
|
Сделаем MCP-сервер с одним инструментом `echo`, который возвращает переданный
|
|
текст.
|
|
|
|
## 1. Модуль
|
|
|
|
```bash
|
|
mkdir my-mcp && cd my-mcp
|
|
go mod init example.com/my-mcp
|
|
export GOPRIVATE=git.totmin.ru
|
|
go get git.totmin.ru/en2zmax/forge-toolkit@latest
|
|
go get github.com/modelcontextprotocol/go-sdk@latest
|
|
```
|
|
|
|
## 2. Инструмент
|
|
|
|
`internal/tools/tools.go`:
|
|
|
|
```go
|
|
package tools
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
"git.totmin.ru/en2zmax/forge-toolkit"
|
|
)
|
|
|
|
func RegisterAll(s *mcp.Server) {
|
|
mcp.AddTool(s, &mcp.Tool{
|
|
Name: "echo",
|
|
Description: "Возвращает переданный текст. Без побочных эффектов.",
|
|
InputSchema: toolkit.Schema(map[string]any{
|
|
"text": toolkit.StrProps("текст для возврата", true),
|
|
}, []string{"text"}),
|
|
}, handleEcho)
|
|
}
|
|
|
|
func handleEcho(_ context.Context, req *mcp.CallToolRequest, _ struct{}) (*mcp.CallToolResult, any, error) {
|
|
text, err := toolkit.RequireString(toolkit.RequestArgs(req), "text")
|
|
if err != nil {
|
|
return toolkit.Error(err.Error()), nil, nil
|
|
}
|
|
return toolkit.Text(text), nil, nil
|
|
}
|
|
```
|
|
|
|
## 3. `main.go`
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"example.com/my-mcp/internal/tools"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
"git.totmin.ru/en2zmax/forge-toolkit"
|
|
)
|
|
|
|
func main() {
|
|
if toolkit.Health() {
|
|
return
|
|
}
|
|
if err := toolkit.Run("my-mcp", func(s *mcp.Server) {
|
|
tools.RegisterAll(s)
|
|
}); err != nil {
|
|
fmt.Fprintf(os.Stderr, "my-mcp: %v\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
```
|
|
|
|
## 4. Сборка и проверка
|
|
|
|
```bash
|
|
go mod tidy
|
|
go build -o my-mcp .
|
|
./my-mcp --health # → ok
|
|
```
|
|
|
|
## 5. Подключение
|
|
|
|
**Любой MCP-клиент** (Claude Desktop, Cursor и т.п.) — как обычный stdio-сервер:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"my-mcp": { "command": "/abs/path/my-mcp" }
|
|
}
|
|
}
|
|
```
|
|
|
|
**Агентная платформа Forge** — сервер объявляется оператором в конфиге, а
|
|
агент подключает его по имени. Например, глобально:
|
|
|
|
```json
|
|
{
|
|
"mcp": {
|
|
"servers": {
|
|
"my-mcp": { "command": "/abs/path/my-mcp", "args": [] }
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
и в агенте:
|
|
|
|
```yaml
|
|
mcp_servers:
|
|
- my-mcp
|
|
```
|
|
|
|
Инструмент станет доступен модели как `my-mcp__echo`.
|
|
|
|
## Дальше
|
|
|
|
- Контракт и правила — [`ARCHITECTURE.md`](ARCHITECTURE.md).
|
|
- Формат результата/probe — [`mcp-contract.md`](mcp-contract.md).
|
|
- Каркас с конфигом и Makefile — [`../template/`](../template).
|