145 lines
4.4 KiB
Go
145 lines
4.4 KiB
Go
// Copyright 2025 The Go MCP SDK Authors. All rights reserved.
|
|
// Use of this source code is governed by an MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
)
|
|
|
|
var (
|
|
httpAddr = flag.String("http", "", "if set, use streamable HTTP at this address, instead of stdin/stdout")
|
|
memoryFilePath = flag.String("memory", "", "if set, persist the knowledge base to this file; otherwise, it will be stored in memory and lost on exit")
|
|
)
|
|
|
|
// HiArgs defines arguments for the greeting tool.
|
|
type HiArgs struct {
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
// CreateEntitiesArgs defines the create entities tool parameters.
|
|
type CreateEntitiesArgs struct {
|
|
Entities []Entity `json:"entities" mcp:"entities to create"`
|
|
}
|
|
|
|
// CreateEntitiesResult returns newly created entities.
|
|
type CreateEntitiesResult struct {
|
|
Entities []Entity `json:"entities"`
|
|
}
|
|
|
|
// CreateRelationsArgs defines the create relations tool parameters.
|
|
type CreateRelationsArgs struct {
|
|
Relations []Relation `json:"relations" mcp:"relations to create"`
|
|
}
|
|
|
|
// CreateRelationsResult returns newly created relations.
|
|
type CreateRelationsResult struct {
|
|
Relations []Relation `json:"relations"`
|
|
}
|
|
|
|
// AddObservationsArgs defines the add observations tool parameters.
|
|
type AddObservationsArgs struct {
|
|
Observations []Observation `json:"observations" mcp:"observations to add"`
|
|
}
|
|
|
|
// AddObservationsResult returns newly added observations.
|
|
type AddObservationsResult struct {
|
|
Observations []Observation `json:"observations"`
|
|
}
|
|
|
|
// DeleteEntitiesArgs defines the delete entities tool parameters.
|
|
type DeleteEntitiesArgs struct {
|
|
EntityNames []string `json:"entityNames" mcp:"entities to delete"`
|
|
}
|
|
|
|
// DeleteObservationsArgs defines the delete observations tool parameters.
|
|
type DeleteObservationsArgs struct {
|
|
Deletions []Observation `json:"deletions" mcp:"observations to delete"`
|
|
}
|
|
|
|
// DeleteRelationsArgs defines the delete relations tool parameters.
|
|
type DeleteRelationsArgs struct {
|
|
Relations []Relation `json:"relations" mcp:"relations to delete"`
|
|
}
|
|
|
|
// SearchNodesArgs defines the search nodes tool parameters.
|
|
type SearchNodesArgs struct {
|
|
Query string `json:"query" mcp:"query string"`
|
|
}
|
|
|
|
// OpenNodesArgs defines the open nodes tool parameters.
|
|
type OpenNodesArgs struct {
|
|
Names []string `json:"names" mcp:"names of nodes to open"`
|
|
}
|
|
|
|
func main() {
|
|
flag.Parse()
|
|
|
|
// Initialize storage backend
|
|
var kbStore store
|
|
kbStore = &memoryStore{}
|
|
if *memoryFilePath != "" {
|
|
kbStore = &fileStore{path: *memoryFilePath}
|
|
}
|
|
kb := knowledgeBase{s: kbStore}
|
|
|
|
// Setup MCP server with knowledge base tools
|
|
server := mcp.NewServer(&mcp.Implementation{Name: "memory"}, nil)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "create_entities",
|
|
Description: "Create multiple new entities in the knowledge graph",
|
|
}, kb.CreateEntities)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "create_relations",
|
|
Description: "Create multiple new relations between entities",
|
|
}, kb.CreateRelations)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "add_observations",
|
|
Description: "Add new observations to existing entities",
|
|
}, kb.AddObservations)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "delete_entities",
|
|
Description: "Remove entities and their relations",
|
|
}, kb.DeleteEntities)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "delete_observations",
|
|
Description: "Remove specific observations from entities",
|
|
}, kb.DeleteObservations)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "delete_relations",
|
|
Description: "Remove specific relations from the graph",
|
|
}, kb.DeleteRelations)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "read_graph",
|
|
Description: "Read the entire knowledge graph",
|
|
}, kb.ReadGraph)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "search_nodes",
|
|
Description: "Search for nodes based on query",
|
|
}, kb.SearchNodes)
|
|
mcp.AddTool(server, &mcp.Tool{
|
|
Name: "open_nodes",
|
|
Description: "Retrieve specific nodes by name",
|
|
}, kb.OpenNodes)
|
|
|
|
// Start server with appropriate transport
|
|
if *httpAddr != "" {
|
|
handler := mcp.NewStreamableHTTPHandler(func(*http.Request) *mcp.Server {
|
|
return server
|
|
}, nil)
|
|
log.Printf("MCP handler listening at %s", *httpAddr)
|
|
http.ListenAndServe(*httpAddr, handler)
|
|
} else {
|
|
t := &mcp.LoggingTransport{Transport: &mcp.StdioTransport{}, Writer: os.Stderr}
|
|
if err := server.Run(context.Background(), t); err != nil {
|
|
log.Printf("Server failed: %v", err)
|
|
}
|
|
}
|
|
}
|