Skip to content

Commit d3c7eb5

Browse files
changed some stuff
1 parent 11ec882 commit d3c7eb5

6 files changed

Lines changed: 69 additions & 63 deletions

File tree

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
/dgraph-bulk-loader
55
/osx-docker-gopath
66

7-
/mcp/dgraph-mcp/dgraph-mcp
8-
97
# goland project folder
108
.idea
119
dgraph.iml

dgraph/cmd/alpha/run.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,18 +476,18 @@ func serveGRPC(l net.Listener, tlsCfg *tls.Config, closer *z.Closer) {
476476
s.Stop()
477477
}
478478

479-
func setupMcp(baseMux *http.ServeMux, connectionString, readOnly string) error {
479+
func setupMcp(baseMux *http.ServeMux, connectionString, url string, readOnly bool) error {
480480
s, err := dgraphmcp.NewMCPServer(connectionString, readOnly)
481481
if err != nil {
482482
glog.Errorf("Failed to initialize MCPServer: %v", err)
483483
return err
484484
}
485485

486486
sse := server.NewSSEServer(s,
487-
server.WithBasePath("/mcp"),
487+
server.WithBasePath(url),
488488
)
489-
baseMux.HandleFunc("/mcp", sse.ServeHTTP)
490-
baseMux.HandleFunc("/mcp/", sse.ServeHTTP)
489+
baseMux.HandleFunc(url, sse.ServeHTTP)
490+
baseMux.HandleFunc(url+"/", sse.ServeHTTP)
491491
return nil
492492
}
493493

@@ -600,7 +600,10 @@ func setupServer(closer *z.Closer, enableMcp bool) {
600600
go serveGRPC(grpcListener, tlsCfg, x.ServerCloser)
601601

602602
if enableMcp {
603-
if err := setupMcp(baseMux, buildConnectionString(laddr, grpcPort()), "true"); err != nil {
603+
if err := setupMcp(baseMux, buildConnectionString(laddr, grpcPort()), "/mcp", false); err != nil {
604+
log.Fatal(err)
605+
}
606+
if err := setupMcp(baseMux, buildConnectionString(laddr, grpcPort()), "/mcp-ro", true); err != nil {
604607
log.Fatal(err)
605608
}
606609
}

dgraph/cmd/mcp/run.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* SPDX-FileCopyrightText: © Hypermode Inc. <[email protected]>
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package mcp
7+
8+
import (
9+
"github.com/golang/glog"
10+
"github.com/mark3labs/mcp-go/server"
11+
"github.com/spf13/cobra"
12+
13+
"github.com/hypermodeinc/dgraph/v25/mcp"
14+
"github.com/hypermodeinc/dgraph/v25/x"
15+
)
16+
17+
var (
18+
Mcp x.SubCommand
19+
)
20+
21+
func init() {
22+
Mcp.Cmd = &cobra.Command{
23+
Use: "mcp",
24+
Short: "Run Dgraph MCP server",
25+
Long: `
26+
A Dgraph MCP server is a long running process that provides an STDIO interface for running mcp
27+
`,
28+
Run: func(cmd *cobra.Command, args []string) {
29+
defer x.StartProfile(Mcp.Conf).Stop()
30+
run()
31+
},
32+
Annotations: map[string]string{"group": "core"},
33+
}
34+
Mcp.EnvPrefix = "DGRAPH_MCP"
35+
Mcp.Cmd.SetHelpTemplate(x.NonRootTemplate)
36+
37+
flag := Mcp.Cmd.Flags()
38+
39+
flag.StringP("connection", "c", "dgraph://localhost:9080", "Dgraph connection string.")
40+
flag.Bool("read-only", false, "Run MCP server in read-only mode.")
41+
}
42+
43+
func run() {
44+
connectionString := Mcp.Conf.GetString("connection")
45+
readOnly := Mcp.Conf.GetBool("read_only")
46+
47+
s, err := mcp.NewMCPServer(connectionString, readOnly)
48+
if err != nil {
49+
glog.Errorf("Failed to initialize MCPServer: %v", err)
50+
return
51+
}
52+
53+
// Start the stdio server
54+
if err := server.ServeStdio(s); err != nil {
55+
glog.Errorf("Server error: %v", err)
56+
}
57+
}

dgraph/cmd/root.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/decrypt"
3535
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/increment"
3636
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/live"
37+
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/mcp"
3738
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/migrate"
3839
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/version"
3940
"github.com/hypermodeinc/dgraph/v25/dgraph/cmd/zero"
@@ -78,7 +79,7 @@ var subcommands = []*x.SubCommand{
7879
&bulk.Bulk, &cert.Cert, &conv.Conv, &live.Live, &alpha.Alpha, &zero.Zero, &version.Version,
7980
&debug.Debug, &migrate.Migrate, &debuginfo.DebugInfo, &upgrade.Upgrade, &decrypt.Decrypt, &increment.Increment,
8081
&checkupgrade.CheckUpgrade, &backup.Restore, &backup.LsBackup, &backup.ExportBackup, &acl.CmdAcl,
81-
&audit.CmdAudit,
82+
&audit.CmdAudit, &mcp.Mcp,
8283
}
8384

8485
func initCmds() {

mcp/dgraph-mcp/main.go

Lines changed: 0 additions & 27 deletions
This file was deleted.

mcp/mcp_server.go

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package mcp
33
import (
44
"context"
55
"fmt"
6-
"os"
76
"time"
87

98
"github.com/dgraph-io/dgo/v250"
@@ -39,7 +38,7 @@ func getConn(connectionString string) (*dgo.Dgraph, error) {
3938
}
4039

4140
// NewMCPServer initializes and returns a new MCPServer instance.
42-
func NewMCPServer(connectionString, readOnly string) (*server.MCPServer, error) {
41+
func NewMCPServer(connectionString string, readOnly bool) (*server.MCPServer, error) {
4342
s := server.NewMCPServer(
4443
"Dgraph MCP Server",
4544
"1.0.0",
@@ -72,7 +71,7 @@ func NewMCPServer(connectionString, readOnly string) (*server.MCPServer, error)
7271
}),
7372
)
7473

75-
if readOnly != "true" {
74+
if !readOnly {
7675
alterSchemaTool := mcp.NewTool("Alter-Schema",
7776
mcp.WithDescription("Alter Dgraph DQL Schema in dgraph db"),
7877
mcp.WithString("schema",
@@ -303,30 +302,5 @@ func NewMCPServer(connectionString, readOnly string) (*server.MCPServer, error)
303302
}, nil
304303
})
305304

306-
addPrompt(s)
307-
308305
return s, nil
309306
}
310-
311-
func addPrompt(s *server.MCPServer) {
312-
promptFilePath := "./prompt.txt"
313-
promptBytes, err := os.ReadFile(promptFilePath)
314-
if err != nil {
315-
glog.Errorf("failed to read prompt file: %v", err)
316-
return
317-
}
318-
prompt := string(promptBytes)
319-
s.AddPrompt(mcp.NewPrompt("Quick start prompt",
320-
mcp.WithPromptDescription("A quick Start prompt for new users and llms"),
321-
), func(ctx context.Context, request mcp.GetPromptRequest) (*mcp.GetPromptResult, error) {
322-
return mcp.NewGetPromptResult(
323-
"A quick start prompt",
324-
[]mcp.PromptMessage{
325-
mcp.NewPromptMessage(
326-
mcp.RoleAssistant,
327-
mcp.NewTextContent(prompt),
328-
),
329-
},
330-
), nil
331-
})
332-
}

0 commit comments

Comments
 (0)