This commit is contained in:
2026-10-01 16:42:39 +07:00
parent 5638349623
commit ee15d149bd
31 changed files with 37 additions and 88 deletions
+1 -10
View File
@@ -1,4 +1,4 @@
// Package mcp_service собирает MCP-сервер (Model Context Protocol) для
// Пакет mcp_service собирает MCP-сервер (Model Context Protocol) для
// игры «Вечерний детектив»: инструменты MCP вызывают игровые сервисы
// напрямую (через интерфейс GamePlayer), без HTTP-прослойки. MCP-сервер
// монтируется в основной процесс как HTTP-эндпоинт /mcp (streamable HTTP)
@@ -49,13 +49,10 @@ type MCPService struct {
answers AnswerSubmitter
}
// NewMCPService создаёт сервис поверх игровых сервисов.
func NewMCPService(game GamePlayer, answers AnswerSubmitter) *MCPService {
return &MCPService{game: game, answers: answers}
}
// Server собирает и возвращает MCP-сервер с зарегистрированными
// инструментами.
func (s *MCPService) Server() *server.MCPServer {
srv := server.NewMCPServer(
"evening-detective-mcp",
@@ -124,7 +121,6 @@ func (s *MCPService) Server() *server.MCPServer {
return srv
}
// connectArgs — результат разбора ссылки на игру.
type connectArgs struct {
teamID int64
password string
@@ -168,21 +164,17 @@ func parseConnectURL(rawURL string) (connectArgs, error) {
return connectArgs{teamID: teamID, password: password}, nil
}
// gameResponse — компактное описание игры для ответа инструментов
// (game_model.Game JSON-тегов не имеет).
type gameResponse struct {
ID int `json:"id"`
Name string `json:"name"`
Status string `json:"status"`
}
// storyResponse — JSON-ответ инструментов: история команды + инфо об игре.
type storyResponse struct {
Story *storytelling.Story `json:"story"`
Game *gameResponse `json:"game"`
}
// storyJSON сериализует историю команды и игру в JSON.
func storyJSON(story *storytelling.Story, game *game_model.Game) (string, error) {
resp := storyResponse{
Story: story,
@@ -284,7 +276,6 @@ func (s *MCPService) handleMakeMove(ctx context.Context, req mcp.CallToolRequest
return mcp.NewToolResultText(jsonBody), nil
}
// submitAnswersArgs — разобранные аргументы инструмента submit_answers.
type submitAnswersArgs struct {
teamID int64
password string
@@ -82,7 +82,7 @@ func defaultGame() *game_model.Game {
}
}
// mcpFixture поднимает in-process MCP-клиент над сервисом с моком
// mcpFixture поднимает встроенный MCP-клиент над сервисом с моком
// GamePlayer. Каждый кейс создаёт СВЕЖИЙ сервис.
type mcpFixture struct {
client *client.Client