blob: 18f6fb302091894c82cbfa0b498ee28f7426974a [file] [log] [blame] [view]
---
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.