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
Jonathan Amsterdam 6c6243c0b0
mcp: NewClient and NewServer take Implementation (#113)
Change the name and version arguments to NewClient and NewServer to a
`*Implementation`, to future-proof against the spec.

Fixes #109.
2025-07-10 16:57:38 -04:00
.github .github: add PR template (#75) 2025-06-30 14:30:30 -04:00
design mcp: NewClient and NewServer take Implementation (#113) 2025-07-10 16:57:38 -04:00
examples mcp: NewClient and NewServer take Implementation (#113) 2025-07-10 16:57:38 -04:00
internal mcp: NewClient and NewServer take Implementation (#113) 2025-07-10 16:57:38 -04:00
jsonrpc jsonrpc: package with JSON-RPC symbols (#117) 2025-07-10 14:33:23 -04:00
jsonschema jsonschema: support "jsonschema" struct tags (#101) 2025-07-10 13:51:23 -04:00
mcp mcp: NewClient and NewServer take Implementation (#113) 2025-07-10 16:57:38 -04:00
CONTRIBUTING.md feat(ci): Ensure that the README.md is in sync with internal/readme (#53) 2025-06-26 12:45:44 -04:00
go.mod mcp/Resource: Refactor URI Template Matching with uritemplate Library (#100) 2025-07-08 15:52:54 -04:00
go.sum mcp/Resource: Refactor URI Template Matching with uritemplate Library (#100) 2025-07-08 15:52:54 -04:00
LICENSE Initial commit: add LICENSE 2025-06-23 17:17:37 +00:00
README.md mcp: NewClient and NewServer take Implementation (#113) 2025-07-10 16:57:38 -04:00

MCP Go SDK

BREAKING CHANGES

The latest version contains breaking changes:

  • Server.AddTools is replaced by Server.AddTool.

  • NewServerTool is replaced by AddTool. AddTool takes a Tool rather than a name and description, so you can set any field on the Tool that you want before associating it with a handler.

  • Tool options have been removed. If you don't want AddTool to infer a JSON Schema for you, you can construct one as a struct literal, or using any other code that suits you.

  • AddPrompts, AddResources and AddResourceTemplates are similarly replaced by singular methods which pair the feature with a handler. The ServerXXX types have been removed.

PkgGoDev

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

WARNING: The SDK should be considered unreleased, and is currently unstable and subject to breaking changes. Please test it out and file bug reports or API proposals, but don't use it in real projects. See the issue tracker for known issues and missing features. We aim to release a stable version of the SDK in August, 2025.

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 two 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.NewCommandTransport(exec.Command("myserver"))
	session, err := client.Connect(ctx, transport)
	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", mcp:"the name of the person to greet"`
}

func SayHi(ctx context.Context, cc *mcp.ServerSession, params *mcp.CallToolParamsFor[HiParams]) (*mcp.CallToolResultFor[any], error) {
	return &mcp.CallToolResultFor[any]{
		Content: []mcp.Content{&mcp.TextContent{Text: "Hi " + params.Arguments.Name}},
	}, 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.NewStdioTransport()); 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.