summaryrefslogtreecommitdiff
path: root/internal/mcp
diff options
context:
space:
mode:
Diffstat (limited to 'internal/mcp')
-rw-r--r--internal/mcp/handlers_test.go2
-rw-r--r--internal/mcp/server.go53
-rw-r--r--internal/mcp/server_test.go12
3 files changed, 59 insertions, 8 deletions
diff --git a/internal/mcp/handlers_test.go b/internal/mcp/handlers_test.go
index 1c74f98..2a4f821 100644
--- a/internal/mcp/handlers_test.go
+++ b/internal/mcp/handlers_test.go
@@ -871,7 +871,7 @@ func TestServer_Run_InvalidJSON(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
// Write invalid JSON
msg := []byte(`{invalid json}`)
diff --git a/internal/mcp/server.go b/internal/mcp/server.go
index 58de01d..83f75e8 100644
--- a/internal/mcp/server.go
+++ b/internal/mcp/server.go
@@ -13,6 +13,7 @@ import (
"codeberg.org/snonux/hexai/internal"
"codeberg.org/snonux/hexai/internal/promptstore"
+ "codeberg.org/snonux/hexai/internal/slashcommands"
)
// Server implements an MCP server over stdio using JSON-RPC 2.0.
@@ -23,6 +24,7 @@ type Server struct {
outMu sync.Mutex
logger *log.Logger
store promptstore.PromptStore
+ syncer *slashcommands.Syncer
initialized bool
mu sync.RWMutex
@@ -32,12 +34,13 @@ type Server struct {
// NewServer creates a new MCP server with the given store and I/O streams.
// The store provides access to prompts; logger is used for debugging.
-func NewServer(r io.Reader, w io.Writer, logger *log.Logger, store promptstore.PromptStore) *Server {
+func NewServer(r io.Reader, w io.Writer, logger *log.Logger, store promptstore.PromptStore, syncer *slashcommands.Syncer) *Server {
s := &Server{
in: bufio.NewReader(r),
out: w,
logger: logger,
store: store,
+ syncer: syncer,
}
// Initialize dispatch table
@@ -354,6 +357,14 @@ func (s *Server) handlePromptsCreate(req Request) {
}
s.logger.Printf("created prompt: %s", params.Name)
+
+ // Sync to slash commands if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Sync(prompt, slashcommands.OpCreate); err != nil {
+ s.logger.Printf("slash command sync failed: %v", err)
+ }
+ }
+
s.sendResponse(req.ID, result)
// Notify clients that the prompt list has changed
@@ -453,6 +464,14 @@ func (s *Server) handlePromptsUpdate(req Request) {
}
s.logger.Printf("updated prompt: %s", params.Name)
+
+ // Sync to slash commands if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Sync(existing, slashcommands.OpUpdate); err != nil {
+ s.logger.Printf("slash command sync failed: %v", err)
+ }
+ }
+
s.sendResponse(req.ID, result)
// Notify clients that the prompt list has changed
@@ -531,6 +550,14 @@ func (s *Server) handlePromptsDelete(req Request) {
}
s.logger.Printf("deleted prompt: %s", params.Name)
+
+ // Delete slash command file if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Delete(params.Name); err != nil {
+ s.logger.Printf("slash command sync delete failed: %v", err)
+ }
+ }
+
s.sendResponse(req.ID, result)
// Notify clients that the prompt list has changed
@@ -712,6 +739,14 @@ func (s *Server) callCreatePromptTool(id any, args map[string]interface{}) {
}
s.logger.Printf("created prompt via tool: %s", params.Name)
+
+ // Sync to slash commands if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Sync(prompt, slashcommands.OpCreate); err != nil {
+ s.logger.Printf("slash command sync failed: %v", err)
+ }
+ }
+
s.sendToolSuccess(id, fmt.Sprintf("Successfully created prompt: %s", params.Name))
// Notify clients that the prompt list has changed
@@ -751,6 +786,14 @@ func (s *Server) callUpdatePromptTool(id any, args map[string]interface{}) {
}
s.logger.Printf("updated prompt via tool: %s", params.Name)
+
+ // Sync to slash commands if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Sync(existing, slashcommands.OpUpdate); err != nil {
+ s.logger.Printf("slash command sync failed: %v", err)
+ }
+ }
+
s.sendToolSuccess(id, fmt.Sprintf("Successfully updated prompt: %s", params.Name))
// Notify clients that the prompt list has changed
@@ -774,6 +817,14 @@ func (s *Server) callDeletePromptTool(id any, args map[string]interface{}) {
}
s.logger.Printf("deleted prompt via tool: %s", name)
+
+ // Delete slash command file if enabled
+ if s.syncer != nil {
+ if err := s.syncer.Delete(name); err != nil {
+ s.logger.Printf("slash command sync delete failed: %v", err)
+ }
+ }
+
s.sendToolSuccess(id, fmt.Sprintf("Successfully deleted prompt: %s", name))
// Notify clients that the prompt list has changed
diff --git a/internal/mcp/server_test.go b/internal/mcp/server_test.go
index 4b43f51..8e3d7b5 100644
--- a/internal/mcp/server_test.go
+++ b/internal/mcp/server_test.go
@@ -54,7 +54,7 @@ func createTestServer(t *testing.T, store promptstore.PromptStore) (*Server, *by
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- return NewServer(inBuf, outBuf, logger, store), inBuf, outBuf
+ return NewServer(inBuf, outBuf, logger, store, nil), inBuf, outBuf
}
// sendRequest writes a JSON-RPC request as newline-delimited JSON (MCP stdio protocol).
@@ -395,7 +395,7 @@ func TestServer_Run(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
err := server.Run()
if err != nil {
@@ -408,7 +408,7 @@ func TestServer_Run(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
// Send initialize request
req := Request{
@@ -465,7 +465,7 @@ func TestServer_ReadMessage(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
// Write a newline-delimited JSON message (MCP stdio protocol)
msg := `{"jsonrpc":"2.0","id":1,"method":"test"}`
@@ -487,7 +487,7 @@ func TestServer_ReadMessage(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
// Write empty lines followed by a valid message
msg := `{"jsonrpc":"2.0","id":1,"method":"test"}`
@@ -508,7 +508,7 @@ func TestServer_ReadMessage(t *testing.T) {
inBuf := &bytes.Buffer{}
outBuf := &bytes.Buffer{}
logger := log.New(io.Discard, "", 0)
- server := NewServer(inBuf, outBuf, logger, store)
+ server := NewServer(inBuf, outBuf, logger, store, nil)
_, err := server.readMessage()
if err != io.EOF {