Files
Paymahn Moghadasian 6a972a1f05 feat: add slack-cli, a no-daemon CLI over the slack-mcp-server engine
Turn the forked slack-mcp-server into a CLI so running many agents no
longer means one resident MCP process each. Every command is a
short-lived process that reads the shared on-disk cache.

- rename module to github.com/paymog/slack-cli (go install/homebrew/ldflags)
- internal/toolcall: invoke the upstream tool handlers in-process; the only
  mcp-go coupling lives here, so pkg/handler and pkg/provider are reused
  byte-for-byte (clean upstream merges, fork-and-extend)
- internal/{cli,cmds,config,credstore,runtime,output}: cobra command tree,
  keyring-backed credential profiles, provider bootstrap, result printing
- 21 tools as subcommands (channels, conversations, users, usergroups,
  saved, reactions, attachments, cache); write tools keep their env gating
- goreleaser + homebrew release workflow; ships a skills/slack-cli skill
- unit tests for config/credstore/toolcall; MCP server still builds

The MCP server (cmd/slack-mcp-server) is kept intact.
2026-06-26 11:04:05 -05:00

35 lines
1018 B
Go

package cmds
import (
"github.com/paymog/slack-cli/internal/config"
"github.com/paymog/slack-cli/internal/runtime"
"github.com/paymog/slack-cli/pkg/handler"
"github.com/spf13/cobra"
)
func newAttachmentsCommand(cfg *config.Config) *cobra.Command {
cmd := &cobra.Command{
Use: "attachments",
Aliases: []string{"attachment", "files"},
Short: "Download attachment data (requires SLACK_MCP_ATTACHMENT_TOOL)",
}
cmd.AddCommand(attachmentsGetCommand(cfg))
return cmd
}
func attachmentsGetCommand(cfg *config.Config) *cobra.Command {
return &cobra.Command{
Use: "get <file_id>",
Short: "Download an attachment by file ID (Fxxxxxxxxxx); max 5MB",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
p, logger, err := runtime.PrepareRead(cmd.Context(), cfg)
if err != nil {
return err
}
h := handler.NewConversationsHandler(p, logger)
return emit(cmd, cfg, "attachment_get_data", h.FilesGetHandler, map[string]any{"file_id": args[0]})
},
}
}