title | description |
---|---|
Quickstart |
Set up your first mcp-golang server |
First, add mcp-golang to your project:
go get github.com/rvoh-emccaleb/mcp-golang
Here's a simple example of creating an MCP server with a basic tool, a prompt and two resources.
package main
import (
"fmt"
"github.com/rvoh-emccaleb/mcp-golang"
"github.com/rvoh-emccaleb/mcp-golang/transport/stdio"
)
type Content struct {
Title string `json:"title" jsonschema:"required,description=The title to submit"`
Description *string `json:"description" jsonschema:"description=The description to submit"`
}
type MyFunctionsArguments struct {
Submitter string `json:"submitter" jsonschema:"required,description=The name of the thing calling this tool (openai, google, claude, etc)"`
Content Content `json:"content" jsonschema:"required,description=The content of the message"`
}
func main() {
done := make(chan struct{})
server := mcp_golang.NewServer(stdio.NewStdioServerTransport())
err := server.RegisterTool("hello", "Say hello to a person", func(arguments MyFunctionsArguments) (*mcp_golang.ToolResponse, error) {
return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Submitter))), nil
})
if err != nil {
panic(err)
}
err = server.RegisterPrompt("prompt_test", "This is a test prompt", func(arguments Content) (*mcp_golang.PromptResponse, error) {
return mcp_golang.NewPromptResponse("description", mcp_golang.NewPromptMessage(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Title)), mcp_golang.RoleUser)), nil
})
if err != nil {
panic(err)
}
err = server.RegisterResource("test://resource", "resource_test", "This is a test resource", "application/json", func() (*mcp_golang.ResourceResponse, error) {
return mcp_golang.NewResourceResponse(mcp_golang.NewTextEmbeddedResource("test://resource", "This is a test resource", "application/json")), nil
})
err = server.RegisterResource("file://app_logs", "app_logs", "The app logs", "text/plain", func() (*mcp_golang.ResourceResponse, error) {
return mcp_golang.NewResourceResponse(mcp_golang.NewTextEmbeddedResource("file://app_logs", "This is a test resource", "text/plain")), nil
})
err = server.Serve()
if err != nil {
panic(err)
}
<-done
}
Create a file in ~/Library/Application Support/Claude/claude_desktop_config.json with the following contents:
{
"mcpServers": {
"golang-mcp-server": {
"command": "<your path to golang MCP server go executable>",
"args": [],
"env": {}
}
}
}
You can also create an HTTP-based MCP server. Note that HTTP transport is stateless and doesn't support bidirectional features like notifications - use stdio transport if you need those features.
package main
import (
"context"
"log"
"github.com/rvoh-emccaleb/mcp-golang"
"github.com/rvoh-emccaleb/mcp-golang/transport/http"
)
func main() {
// Create an HTTP transport
transport := http.NewHTTPTransport("/mcp")
transport.WithAddr(":8080")
// Create server with the HTTP transport
server := mcp.NewServer(transport)
// Register your tools
server.RegisterTool("hello", &HelloTool{})
// Start the server
if err := server.Serve(); err != nil {
log.Fatal(err)
}
}
Or using the Gin framework:
package main
import (
"github.com/gin-gonic/gin"
"github.com/rvoh-emccaleb/mcp-golang"
"github.com/rvoh-emccaleb/mcp-golang/transport/http"
)
func main() {
// Create a Gin transport
transport := http.NewGinTransport()
// Create server with the Gin transport
server := mcp.NewServer(transport)
// Register your tools
server.RegisterTool("hello", &HelloTool{})
// Set up Gin router
router := gin.Default()
router.POST("/mcp", transport.Handler())
// Start the server
router.Run(":8080")
}
To connect to an HTTP-based MCP server:
package main
import (
"context"
"log"
"github.com/rvoh-emccaleb/mcp-golang"
"github.com/rvoh-emccaleb/mcp-golang/transport/http"
)
func main() {
// Create an HTTP client transport
transport := http.NewHTTPClientTransport("/mcp")
transport.WithBaseURL("http://localhost:8080")
// Create client with the HTTP transport
client := mcp.NewClient(transport)
// Use the client with context
ctx := context.Background()
response, err := client.CallTool(ctx, "hello", map[string]interface{}{
"name": "World",
})
if err != nil {
log.Fatal(err)
}
log.Printf("Response: %v", response)
}
- If you're interested in contributing to mcp-golang, check out Development Guide for more detailed information
- Join our Discord Community for support
- Visit our GitHub Repository to contribute