MCPcopy Index your code
hub / github.com/modelcontextprotocol/go-sdk

github.com/modelcontextprotocol/go-sdk @v1.6.1 sqlite

repository ↗ · DeepWiki ↗ · release v1.6.1 ↗
1,489 symbols 5,672 edges 133 files 746 documented · 50% 20 cross-repo links
README

MCP Go SDK

Open in GitHub Codespaces

PkgGoDev OpenSSF Scorecard

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

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.

Version Compatibility

The following table shows which versions of the Go SDK support which versions of the MCP specification:

SDK Version Latest MCP Spec All Supported MCP Specs
v1.4.0+ 2025-11-25* 2025-11-25*, 2025-06-18, 2025-03-26, 2024-11-05
v1.2.0 - v1.3.1 2025-11-25** 2025-11-25**, 2025-06-18, 2025-03-26, 2024-11-05
v1.0.0 - v1.1.0 2025-06-18 2025-06-18, 2025-03-26, 2024-11-05

* Client side OAuth has experimental support.

** Partial support for 2025-11-25 (client side OAuth and Sampling with tools not available).

New releases of the SDK target only supported versions of Go. See https://go.dev/doc/devel/release#policy for more information.

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 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 Apache 2.0 for new contributions, with existing code under MIT - see the LICENSE file for details.

Extension points exported contracts — how you extend this code

Reader (Interface)
Reader abstracts the transport mechanics from the JSON RPC protocol. A Connection reads messages from the reader it was [12 …
internal/jsonrpc2/conn.go
Transport (Interface)
A Transport is used to create a bidirectional connection between MCP client and server. Transports should be used for a [12 …
mcp/transport.go
Content (Interface)
A Content is a [TextContent], [ImageContent], [AudioContent], [ResourceLink], [EmbeddedResource], [ToolUseContent], or [ [7 …
mcp/content.go
RequestParams (Interface)
RequestParams is a parameter (input) type for an MCP request. [22 implementers]
mcp/shared.go
OAuthHandler (Interface)
OAuthHandler is an interface for handling OAuth flows. If a transport wishes to support OAuth 2 authorization, it shoul [5 …
auth/client.go
EventStore (Interface)
An EventStore tracks data for SSE streams. A single EventStore suffices for all sessions, since session IDs are globally [1 …
mcp/event.go
TokenVerifier (FuncType)
A TokenVerifier checks the validity of a bearer token, and extracts information from it. If verification fails, it shoul
auth/auth.go
AuthorizationCodeFetcher (FuncType)
AuthorizationCodeFetcher is called to initiate the OAuth authorization flow. It is responsible for directing the user to
auth/authorization_code.go

Core symbols most depended-on inside this repo

Close
called by 247
mcp/transport.go
Run
called by 183
mcp/server.go
Error
called by 138
mcp/client.go
NewServer
called by 111
mcp/server.go
AddTool
called by 110
mcp/server.go
NewClient
called by 97
mcp/client.go
Connect
called by 84
mcp/client.go
Error
called by 81
oauthex/oauth2.go

Shape

Function 583
Method 540
Struct 308
Interface 25
TypeAlias 18
FuncType 15

Languages

Go100%

Modules by API surface

mcp/protocol.go201 symbols
mcp/shared.go80 symbols
mcp/server.go74 symbols
mcp/client.go71 symbols
mcp/transport.go53 symbols
mcp/streamable.go52 symbols
mcp/streamable_test.go44 symbols
mcp/mcp_test.go43 symbols
internal/jsonrpc2/conn.go39 symbols
conformance/everything-server/main.go36 symbols
examples/server/memory/kb.go34 symbols
mcp/content.go30 symbols

Dependencies from manifests, versioned

github.com/google/jsonschema-gov0.4.3 · 1×
github.com/segmentio/asmv1.1.3 · 1×
github.com/segmentio/encodingv0.5.4 · 1×
github.com/yosida95/uritemplate/v3v3.0.2 · 1×
golang.org/x/oauth2v0.35.0 · 1×
golang.org/x/sysv0.41.0 · 1×
golang.org/x/timev0.12.0 · 1×
golang.org/x/toolsv0.42.0 · 1×

For agents

$ claude mcp add go-sdk \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact