@@ -25,6 +25,8 @@ import (
2525 "time"
2626
2727 "github.com/golang/glog"
28+ "github.com/mark3labs/mcp-go/mcp"
29+ "github.com/mark3labs/mcp-go/server"
2830 "github.com/pkg/errors"
2931 "github.com/spf13/cobra"
3032 "go.opencensus.io/plugin/ocgrpc"
@@ -472,9 +474,61 @@ func serveGRPC(l net.Listener, tlsCfg *tls.Config, closer *z.Closer) {
472474 s .Stop ()
473475}
474476
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+ })
522+
523+ sse := server .NewSSEServer (s ,
524+ server .WithBasePath ("/mcp" ),
525+ )
526+ baseMux .HandleFunc ("/mcp" , sse .ServeHTTP )
527+ baseMux .HandleFunc ("/mcp/" , sse .ServeHTTP )
528+ }
529+
475530func setupServer (closer * z.Closer ) {
476531 go worker .RunServer (bindall ) // For pb.communication.
477-
478532 laddr := "localhost"
479533 if bindall {
480534 laddr = "0.0.0.0"
@@ -509,6 +563,7 @@ func setupServer(closer *z.Closer) {
509563 baseMux .HandleFunc ("/state" , stateHandler )
510564 baseMux .HandleFunc ("/debug/jemalloc" , x .JemallocHandler )
511565 http .DefaultServeMux .Handle ("/debug/z" , zpages .NewTracezHandler (zpages .NewSpanProcessor ()))
566+ setupMcp (baseMux )
512567
513568 // TODO: Figure out what this is for?
514569 http .HandleFunc ("/debug/store" , storeStatsHandler )
0 commit comments