telegram-mcp-read-only/serve.go
2025-04-03 02:22:46 +03:00

81 lines
1.9 KiB
Go

package main
import (
"context"
"encoding/json"
"fmt"
"os"
"github.com/chaindead/telegram-mcp/internal/tg"
mcp "github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
"github.com/rs/zerolog/log"
"github.com/urfave/cli/v3"
)
func serve(ctx context.Context, cmd *cli.Command) error {
appID := cmd.Int("app-id")
appHash := cmd.String("api-hash")
sessionPath := cmd.String("session")
dryRun := cmd.Bool("dry")
_, err := os.Stat(sessionPath)
if err != nil {
return fmt.Errorf("session file not found(%s): %w", sessionPath, err)
}
server := mcp.NewServer(stdio.NewStdioServerTransport())
client := tg.New(int(appID), appHash, sessionPath)
if dryRun {
answer, err := client.GetMe(tg.EmptyArguments{})
if err != nil {
return fmt.Errorf("get user: %w", err)
}
data, err := json.MarshalIndent(answer, "", " ")
if err != nil {
return fmt.Errorf("marshal: %w", err)
}
log.Info().RawJSON("answer", data).Msg("Check GetMe: OK")
answer, err = client.GetDialogs(tg.DialogsArguments{WithLastMessages: true})
if err != nil {
return fmt.Errorf("get dialogs: %w", err)
}
data, err = json.MarshalIndent(answer, "", " ")
if err != nil {
return fmt.Errorf("marshal: %w", err)
}
log.Info().RawJSON("answer", data).Msg("Check GetDialogs: OK")
return nil
}
err = server.RegisterTool("tg_me", "Get current account info", client.GetMe)
if err != nil {
return fmt.Errorf("register tool: %w", err)
}
err = server.RegisterTool("tg_dialogs", "Get list of dialogs (chats, channels, groups)", client.GetDialogs)
if err != nil {
return fmt.Errorf("register dialogs tool: %w", err)
}
err = server.RegisterResource("telegram://chats", "tg_chats", "List of telegram chats", "application/json", sampleResource)
if err != nil {
return fmt.Errorf("register chats resource: %w", err)
}
if err := server.Serve(); err != nil {
return fmt.Errorf("serve: %w", err)
}
<-ctx.Done()
return nil
}