| --- |
| title: "Gopls: Model Context Protocol support" |
| --- |
| |
| Gopls includes an experimental built-in server for the [Model Context |
| Protocol](https://modelcontextprotocol.io/introduction) (MCP), allowing it to |
| expose a subset of its functionality to AI assistants in the form of MCP tools. |
| |
| ## Running the MCP server |
| |
| There are two modes for running this server: 'attached' and 'detached'. In |
| attached mode, the MCP server operates in the context of an active gopls LSP |
| session, and so is able to share memory with your LSP session and observe the |
| current unsaved buffer state. In detached mode, gopls interacts with a headless |
| LSP session, and therefore only sees saved files on disk. |
| |
| ### Attached mode |
| |
| To use the 'attached' mode, run gopls with the `-mcp.listen` flag. For |
| example: |
| |
| ``` |
| gopls serve -mcp.listen=localhost:8092 |
| ``` |
| |
| This exposes an HTTP based MCP server using the server-sent event transport |
| (SSE), available at `http://localhost:8092/sessions/1` (assuming you have only |
| one [session](../daemon.md) on your gopls instance). |
| |
| ### Detached mode |
| |
| To use the 'detached' mode, run the `mcp` subcommand: |
| |
| ``` |
| gopls mcp |
| ``` |
| |
| This runs a standalone gopls instance that speaks MCP over stdin/stdout. |
| |
| ## Instructions to the model |
| |
| This gopls MCP server includes model instructions for its usage, describing |
| workflows for interacting with Go code using its available tools. These |
| instructions are automatically published during the MCP server initialization, |
| but you may want to also load them as additional context in your AI-assisted |
| session, to emphasize their importance. The `-instructions` flag causes them to |
| be printed, so that you can do, for example: |
| |
| ``` |
| gopls mcp -instructions > /path/to/contextFile.md |
| ``` |
| |
| ## Security considerations |
| |
| The gopls MCP server is a wrapper around the functionality ordinarily exposed |
| by gopls through the Language Server Protocol (LSP). As such, gopls' tools |
| may perform any of the operations gopls normally performs, including: |
| |
| - reading files from the file system, and returning their contents in tool |
| results (such as when providing context); |
| - executing the `go` command to load package information, which may result in |
| calls to https://proxy.golang.org to download Go modules, and writes to go |
| caches; |
| - writing to gopls' cache or persistant configuration files; and |
| - uploading weekly telemetry data **if you have opted in** to [Go telemetry](https://go.dev/doc/telemetry). |
| |
| The gopls MCP server does not perform any operations not already performed by |
| gopls in an ordinary IDE session. Like most LSP servers, gopls does not |
| generally write directly to your source tree, though it may instruct the client |
| to apply edits. Nor does it make arbitrary requests over the network, though it |
| may make narrowly scoped requests to certain services such as the Go module |
| mirror or the Go vulnerability database, which can't readily be exploited as a |
| vehicle for exfiltration by a confused agent. Nevertheless, these capabilities |
| may require additional consideration when used as part of an AI-enabled system. |