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
Robert Findley 07f6c490c6
mcp: make the streamable client transport less strict (#524)
In practice, the streamable client transport was having trouble
connecting to various backends, because they are nonconformant in
various ways.

While it would be nice if all servers conformed to the spec, in practice
there are certain spec violations that are recoverable, and we can and
should recover them. Specifically:

- tolerate 404 instead of 405 for the hanging GET (#393)
- tolerate (=ignore) spurious response body for notifications and
responses, since we know none are expected

Additionally, fix a bug that we weren't parsing Content-Type correctly.

Fixes #521
2025-09-24 14:07:27 -04:00
.devcontainer feat(devcontainer): Adds Dev Container configuration (#154) 2025-07-30 12:54:41 -04:00
.github chore(deps): add dependabot and SHA-pin workflow deps (#456) 2025-09-18 11:25:19 -04:00
auth add HTTP Request to TokenVerifier (#404) 2025-09-03 16:23:42 -04:00
design mcp: introduce Requests (#267) 2025-08-12 17:49:50 -04:00
docs mcp: update to jsonschema that does not validate structs (#511) 2025-09-22 15:28:04 -04:00
examples mcp: make the streamable client transport less strict (#524) 2025-09-24 14:07:27 -04:00
internal docs: adjust example code to remove horizontal scroll bar (#509) 2025-09-22 09:07:17 -04:00
jsonrpc jsonrpc: expose encoding and decoding functions (#114) 2025-07-14 07:01:40 -04:00
mcp mcp: make the streamable client transport less strict (#524) 2025-09-24 14:07:27 -04:00
oauthex oauthex: new package for oauth extensions (#429) 2025-09-18 08:25:24 -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
copyright_test.go all: add a test that checks for missing or mismatching file copyright 2025-09-11 13:53:22 -04:00
go.mod mcp: update to jsonschema that does not validate structs (#511) 2025-09-22 15:28:04 -04:00
go.sum mcp: update to jsonschema that does not validate structs (#511) 2025-09-22 15:28:04 -04:00
LICENSE Initial commit: add LICENSE 2025-06-23 17:17:37 +00:00
README.md docs: adjust example code to remove horizontal scroll bar (#509) 2025-09-22 09:07:17 -04:00

MCP Go SDK v0.6.0

Open in GitHub Codespaces

BREAKING CHANGES

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

PkgGoDev

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

Important

The SDK is in release-candidate state, and is going to be tagged v1.0.0 soon (see https://github.com/modelcontextprotocol/go-sdk/issues/328). We do not anticipate significant API changes or instability. Please use it and file issues.

Package / Feature documentation

The SDK consists of several importable packages:

The SDK endeavors to implement the full MCP spec. The docs/ directory contains feature documentation, mapping the MCP spec to the packages above.

Getting started

To get started creating an MCP server, create an mcp.Server instance, add features to it, and then run it over an mcp.Transport. For example, this server adds a single simple tool, and then connects it to clients over stdin/stdout:

package main

import (
	"context"
	"log"

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

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

type Output struct {
	Greeting string `json:"greeting" jsonschema:"the greeting to tell to the user"`
}

func SayHi(ctx context.Context, req *mcp.CallToolRequest, input Input) (
	*mcp.CallToolResult,
	Output,
	error,
) {
	return nil, Output{Greeting: "Hi " + input.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.StdioTransport{}); err != nil {
		log.Fatal(err)
	}
}

To communicate with that server, create an mcp.Client and connect it to the corresponding server, by running the server command and communicating over its stdin/stdout:

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)
	}
}

The examples/ directory contains more example clients and servers.

Contributing

We welcome contributions to the SDK! Please see See CONTRIBUTING.md for details of how to contribute.

Acknowledgements / Alternatives

Several third party Go MCP SDKs inspired the development and design of this official SDK, and continue to be viable alternatives, notably mcp-go, originally 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.