@@ -25,7 +25,6 @@ import (
2525 "time"
2626
2727 "github.com/golang/glog"
28- "github.com/mark3labs/mcp-go/mcp"
2928 "github.com/mark3labs/mcp-go/server"
3029 "github.com/pkg/errors"
3130 "github.com/spf13/cobra"
@@ -46,6 +45,7 @@ import (
4645 "github.com/hypermodeinc/dgraph/v25/audit"
4746 "github.com/hypermodeinc/dgraph/v25/edgraph"
4847 "github.com/hypermodeinc/dgraph/v25/graphql/admin"
48+ dgraphmcp "github.com/hypermodeinc/dgraph/v25/mcp"
4949 "github.com/hypermodeinc/dgraph/v25/posting"
5050 "github.com/hypermodeinc/dgraph/v25/schema"
5151 "github.com/hypermodeinc/dgraph/v25/tok"
@@ -474,57 +474,23 @@ func serveGRPC(l net.Listener, tlsCfg *tls.Config, closer *z.Closer) {
474474 s .Stop ()
475475}
476476
477- func setupMcp (baseMux * http.ServeMux ) {
478- s := server .NewMCPServer (
479- "Dgraph MCP Server" ,
480- "1.0.0" ,
481- server .WithResourceCapabilities (true , true ),
482- server .WithLogging (),
483- server .WithRecovery (),
484- )
485-
486- schemaTool := mcp .NewTool ("Get-Schema" ,
487- mcp .WithDescription ("Get schema from dgraph db" ),
488- )
489-
490- queryTool := mcp .NewTool ("Run-DQL" ,
491- mcp .WithDescription ("Run DQL mutation / query on dgraph db" ),
492- mcp .WithString ("query" ,
493- mcp .Required (),
494- mcp .Description ("The query to perform. For mutations the format should look like {set {}}" ),
495- ),
496- )
497-
498- s .AddTool (queryTool , func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
499- op := request .Params .Arguments ["query" ].(string )
500- req := & apiv25.RunDQLRequest {
501- NsName : "root" ,
502- DqlQuery : op ,
503- }
504- resp , err := (& edgraph.ServerV25 {}).RunDQL (ctx , req )
505- if err != nil {
506- return mcp .NewToolResultError (err .Error ()), nil
507- }
508- return mcp .NewToolResultText (string (resp .QueryResult )), nil
509- })
510-
511- s .AddTool (schemaTool , func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
512- req := & apiv25.RunDQLRequest {
513- NsName : "root" ,
514- DqlQuery : "schema {}" ,
515- }
516- resp , err := (& edgraph.ServerV25 {}).RunDQL (ctx , req )
517- if err != nil {
518- return mcp .NewToolResultError (err .Error ()), nil
519- }
520- return mcp .NewToolResultText (string (resp .QueryResult )), nil
521- })
477+ func setupMcp (baseMux * http.ServeMux , connectionString , readOnly string ) error {
478+ s , err := dgraphmcp .NewMCPServer (connectionString , readOnly )
479+ if err != nil {
480+ glog .Errorf ("Failed to initialize MCPServer: %v\n " , err )
481+ return err
482+ }
522483
523484 sse := server .NewSSEServer (s ,
524485 server .WithBasePath ("/mcp" ),
525486 )
526487 baseMux .HandleFunc ("/mcp" , sse .ServeHTTP )
527488 baseMux .HandleFunc ("/mcp/" , sse .ServeHTTP )
489+ return nil
490+ }
491+
492+ func buildConnectionString (addr string , port int ) string {
493+ return fmt .Sprintf ("dgraph://%s:%d" , addr , port )
528494}
529495
530496func setupServer (closer * z.Closer ) {
@@ -563,7 +529,6 @@ func setupServer(closer *z.Closer) {
563529 baseMux .HandleFunc ("/state" , stateHandler )
564530 baseMux .HandleFunc ("/debug/jemalloc" , x .JemallocHandler )
565531 http .DefaultServeMux .Handle ("/debug/z" , zpages .NewTracezHandler (zpages .NewSpanProcessor ()))
566- setupMcp (baseMux )
567532
568533 // TODO: Figure out what this is for?
569534 http .HandleFunc ("/debug/store" , storeStatsHandler )
@@ -631,6 +596,10 @@ func setupServer(closer *z.Closer) {
631596 // Initialize the servers.
632597 x .ServerCloser .AddRunning (3 )
633598 go serveGRPC (grpcListener , tlsCfg , x .ServerCloser )
599+
600+ if err := setupMcp (baseMux , buildConnectionString (laddr , grpcPort ()), "true" ); err != nil {
601+ log .Fatal (err )
602+ }
634603 go x .StartListenHttpAndHttps (httpListener , tlsCfg , x .ServerCloser )
635604
636605 go func () {
0 commit comments