Mirror of https://github.com/modelcontextprotocol/go-sdk — The official Go SDK for Model Context Protocol servers and clients. Maintained in collaboration with Google.
  • Go 99.7%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Shusaku Yasoda a3935c6be2
examples/server: add example MCP server with JWT and API key (#339)
This commit introduces a new example demonstrating the integration of
authentication middleware with an MCP server. The server supports both
JWT token and API key authentication, along with scope-based access
control for various MCP tools. Key features include token generation
endpoints, in-memory API key storage, and a health check endpoint.

New files added:
- `main.go`: Implements the MCP server and authentication logic.
- `go.mod` and `go.sum`: Manage dependencies for the project.
- `README.md`: Provides setup instructions, available endpoints, and
example usage.

This example serves as a reference for implementing secure access to MCP
tools.

Fixes #330
2025-09-02 11:49:46 -04:00
.devcontainer feat(devcontainer): Adds Dev Container configuration (#154) 2025-07-30 12:54:41 -04:00
.github .github: add a staticcheck action (#326) 2025-08-19 14:58:01 -04:00
auth mcp: pass TokenInfo to server handler (#292) 2025-08-20 10:50:16 -04:00
design mcp: introduce Requests (#267) 2025-08-12 17:49:50 -04:00
examples examples/server: add example MCP server with JWT and API key (#339) 2025-09-02 11:49:46 -04:00
internal mcp: polish package doc for v0.3.0 2025-08-22 16:03:15 -04:00
jsonrpc jsonrpc: expose encoding and decoding functions (#114) 2025-07-14 07:01:40 -04:00
mcp mcp: statically type the server-side tool params (#378) 2025-08-30 08:16:06 -04:00
.gitignore .gitignore: add 2025-08-11 08:33:50 -04:00
CONTRIBUTING.md CONTRIBUTING.md: timeout policy (#187) 2025-07-30 12:53:56 -04:00
go.mod go.mod: update to fixed jsonschema (#370) 2025-08-25 14:00:24 -04:00
go.sum go.mod: update to fixed jsonschema (#370) 2025-08-25 14:00:24 -04:00
LICENSE Initial commit: add LICENSE 2025-06-23 17:17:37 +00:00
README.md mcp: polish package doc for v0.3.0 2025-08-22 16:03:15 -04:00

MCP Go SDK v0.3.0

Open in GitHub Codespaces

BREAKING CHANGES

This version contains breaking changes. See the release notes for details.

PkgGoDev

This repository contains an unreleased implementation of the official Go software development kit (SDK) for the Model Context Protocol (MCP).

Warning

The SDK is not yet at v1.0.0 and may still be subject to incompatible API changes. We aim to tag v1.0.0 in September, 2025. See https://github.com/modelcontextprotocol/go-sdk/issues/328 for details.

Design

The design doc for this SDK is at design.md, which was initially reviewed at modelcontextprotocol/discussions/364.

Further design discussion should occur in issues (for concrete proposals) or discussions for open-ended discussion. See CONTRIBUTING.md for details.

Package documentation

The SDK consists of three importable packages:

Example

In this example, an MCP client communicates with an MCP server running in a sidecar process:

package main

import (
	"context"
	"log"
	"os/exec"

	"github.com/modelcontextprotocol/go-sdk/mcp"
)

func main() {
	ctx := context.Background()

	// Create a new client, with no features.
	client := mcp.NewClient(&mcp.Implementation{Name: "mcp-client", Version: "v1.0.0"}, nil)

	// Connect to a server over stdin/stdout
	transport := &mcp.CommandTransport{Command: exec.Command("myserver")}
	session, err := client.Connect(ctx, transport, nil)
	if err != nil {
		log.Fatal(err)
	}
	defer session.Close()

	// Call a tool on the server.
	params := &mcp.CallToolParams{
		Name:      "greet",
		Arguments: map[string]any{"name": "you"},
	}
	res, err := session.CallTool(ctx, params)
	if err != nil {
		log.Fatalf("CallTool failed: %v", err)
	}
	if res.IsError {
		log.Fatal("tool failed")
	}
	for _, c := range res.Content {
		log.Print(c.(*mcp.TextContent).Text)
	}
}

Here's an example of the corresponding server component, which communicates with its client over stdin/stdout:

package main

import (
	"context"
	"log"

	"github.com/modelcontextprotocol/go-sdk/mcp"
)

type HiParams struct {
	Name string `json:"name" jsonschema:"the name of the person to greet"`
}

func SayHi(ctx context.Context, req *mcp.CallToolRequest, args HiParams) (*mcp.CallToolResult, any, error) {
	return &mcp.CallToolResult{
		Content: []mcp.Content{&mcp.TextContent{Text: "Hi " + args.Name}},
	}, nil, nil
}

func main() {
	// Create a server with a single tool.
	server := mcp.NewServer(&mcp.Implementation{Name: "greeter", Version: "v1.0.0"}, nil)

	mcp.AddTool(server, &mcp.Tool{Name: "greet", Description: "say hi"}, SayHi)
	// Run the server over stdin/stdout, until the client disconnects
	if err := server.Run(context.Background(), &mcp.StdioTransport{}); err != nil {
		log.Fatal(err)
	}
}

The examples/ directory contains more example clients and servers.

Acknowledgements

Several existing Go MCP SDKs inspired the development and design of this official SDK, notably mcp-go, authored by Ed Zynda. We are grateful to Ed as well as the other contributors to mcp-go, and to authors and contributors of other SDKs such as mcp-golang and go-mcp. Thanks to their work, there is a thriving ecosystem of Go MCP clients and servers.

License

This project is licensed under the MIT License - see the LICENSE file for details.