Files
Maksim Totmin c398045664
ci / test (push) Failing after 5s
ci / lint (push) Failing after 4s
chore: initial release v0.1.0
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
2026-09-14 00:23:08 +07:00

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).