Labsco
hloiseaufcms logo

MCP LSP Go

90

from hloiseaufcms

An MCP server that connects AI assistants to Go's Language Server Protocol (LSP) for advanced code analysis.

🔥🔥🔥🔥✓ VerifiedFreeQuick setup

mcp-gopls – MCP server for Go (gopls)

A Model Context Protocol (MCP) server that lets AI assistants use Go’s LSP (gopls) for navigation, diagnostics, testing, coverage, and more.

TL;DR: If you use Claude / Cursor / Copilot with Go, mcp-gopls gives the AI full LSP powers: go-to-definition, references, hover, completion, go test, coverage, go mod tidy, govulncheck, etc.

Demo Animation

Overview

This MCP server helps AI assistants to:

  • Use LSP to analyze Go workspaces
  • Navigate to definitions, references, and workspace symbols
  • Format, rename, and inspect code actions without leaving MCP
  • Run Go tests, coverage, go mod tidy, govulncheck, and module graph commands with structured results
  • Read workspace resources (overview + go.mod) and consume curated prompts

Status: Actively developed – used in real projects.
Tested with Go 1.25.x and gopls@latest.

Architecture

This project uses the mark3labs/mcp-go library to implement the Model Context Protocol. The MCP integration enables seamless communication between AI assistants and Go tools.

The server communicates with gopls, the official language server for Go, via the Language Server Protocol (LSP).

Features

  • Configurable runtime: --workspace, --gopls-path, --log-level, --rpc-timeout, and --shutdown-timeout flags + env vars (MCP_GOPLS_*)
  • Structured logging: Text/JSON logging with slog and optional file output
  • Extended LSP surface: navigation, diagnostics, formatting, rename, code actions, hover, completion, workspace symbols
  • Test & tooling helpers: coverage analysis, go test, go mod tidy, govulncheck, go mod graph
  • MCP extras: resources (resource://workspace/overview, resource://workspace/go.mod) and prompts (summarize_diagnostics, refactor_plan)
  • Progress streaming: long-running commands emit notifications/progress events so clients can surface status updates

Feature comparison: mcp-gopls vs built-in gopls MCP

As of gopls v0.20.0, the built-in MCP server exposes these tools: go_context, go_diagnostics, go_file_context, go_file_diagnostics, go_file_metadata, go_package_api, go_references, go_rename_symbol, go_search, go_symbol_references, go_workspace, go_vulncheck.

Feature / capabilitymcp-gopls (this project)Built-in gopls MCP
Go-to-definitionYes (go_to_definition tool)No dedicated MCP tool (not in tool list)
Find referencesYes (find_references)Yes (go_references, go_symbol_references)
Diagnostics (file / workspace)Yes (check_diagnostics)Yes (go_diagnostics, go_file_diagnostics)
Hover informationYes (get_hover_info)No dedicated MCP tool (not in tool list)
CompletionYes (get_completion)No dedicated MCP tool (not in tool list)
FormattingYes (format_document)No dedicated MCP tool (not in tool list)
Rename symbolYes (rename_symbol)Yes (go_rename_symbol)
Code actionsYes (list_code_actions)No dedicated MCP tool (not in tool list)
Workspace symbol searchYes (search_workspace_symbols)Yes (go_search)
Package / workspace API/context toolsNo dedicated MCP toolYes (go_package_api, go_file_context, go_file_metadata, go_workspace, go_context)
Run go testYes (run_go_test)No MCP tool for running tests
Coverage analysisYes (analyze_coverage)No MCP tool for coverage
go mod tidyYes (run_go_mod_tidy)No MCP tool for go mod tidy
govulncheckYes (run_govulncheck)Yes (go_vulncheck)
Module graph (go mod graph)Yes (module_graph)No MCP tool for module graph
Extra MCP resourcesYes (resource://workspace/overview, resource://workspace/go.mod)Not documented as MCP resources
Custom MCP promptsYes (summarize_diagnostics, refactor_plan)Not exposed as MCP prompts (only model instructions)
Model instructions shipped with serverNo special mechanism (documented in README/docs)Yes: gopls mcp -instructions prints usage workflows

If you want full LSP-like editing + tooling from MCP (definition, hover, completion, format, rename, code actions, go test, coverage, go mod tidy, module graph), mcp-gopls is strictly richer.

If you mostly want read-only/introspective tools (diagnostics, symbol search, references, package API, workspace/file context, vulncheck) with no extra binary, the built-in gopls MCP is enough.

Note: The built-in gopls MCP server is still marked experimental and its tool set may change over time. This comparison is accurate as of gopls v0.20.x.

Project Structure

.
├── cmd
│   └── mcp-gopls        # Application entry point
├── pkg
│   ├── lsp             # LSP client to communicate with gopls
│   │   ├── client      # LSP client implementation
│   │   └── protocol    # LSP protocol types and features
│   ├── server          # MCP server
│   └── tools           # MCP tools exposing LSP features

Docker / MCP Gateway

If you prefer to run mcp-gopls in a container (for Docker MCP Gateway or other containerized setups), use the official image.

Docker run

docker run --rm -i \
  -v /absolute/path/to/your/go/project:/workspace \
  ghcr.io/hloiseau/mcp-gopls:latest \
  --workspace /workspace

docker-mcp.yaml

Copy docs/docker-mcp.yaml, update the bind mount path, then run from that directory:

docker mcp gateway run

Tools catalog metadata

If your MCP catalog tooling requires a toolsUrl, use docs/tools.json as a static tool list.

MCP Tools

ToolDescription
go_to_definitionNavigate to the definition of a symbol
find_referencesList all references for a symbol
check_diagnosticsFetch cached diagnostics for a file
get_hover_infoReturn hover markdown for a symbol
get_completionReturn completion labels at a position
format_documentReturn formatting edits for an entire document
rename_symbolReturn workspace edits for a rename
list_code_actionsList available code actions for a range
search_workspace_symbolsSearch workspace-wide symbols
analyze_coverageRun go test with coverage + optional per-function report
run_go_testExecute go test for a package/pattern
run_go_mod_tidyExecute go mod tidy
run_govulncheckExecute govulncheck ./...
module_graphReturn go mod graph output

Progress Notifications

Long-running tools emit structured notifications/progress events so IDEs can show rich status indicators:

  • Streaming progress (run_go_test, analyze_coverage, run_govulncheck, run_go_mod_tidy) forwards incremental log lines and percentage updates. Cursor displays these as a live log.
  • Start/complete events only (go_to_definition, find_references, rename_symbol, etc.) fire a quick “started” event so the UI can show a spinner, followed by a completion payload with the final result.
  • Each progress token is now namespaced (e.g., run_go_test/<rand>) to avoid “unknown token” errors when multiple tools run concurrently.

When integrating new tools, opt into streaming mode only if the underlying LSP/golang command produces meaningful interim output; otherwise stick to the lightweight start/complete flow to minimize noise.

Prompt Instructions

Both prompts are accessible from any MCP-aware client via the “Prompts” catalog.

summarize_diagnostics

  • When to use: After check_diagnostics or run_go_test to turn raw diagnostics into actionable steps.
  • Arguments: None. The server automatically reads the last diagnostics payload cached by the tools layer.
  • Typical workflow: check_diagnostics → copy the returned array into the prompt input field (Cursor’s UI pastes it automatically when you select “Use last result”).

refactor_plan

  • When to use: You already have a diagnostics JSON array and want a concise change checklist.
  • Arguments: Requires a diagnostics object containing the raw Go diagnostics (the same payload returned by check_diagnostics).
  • Example invocation payload:
{
  "diagnostics": [
    {
      "uri": "file:///path/to/pkg/tools/workspace.go",
      "range": {"start": {"line": 12, "character": 5}, "end": {"line": 12, "character": 25}},
      "severity": 1,
      "message": "unused variable testHelper"
    }
  ]
}

The prompt responds with a numbered set of refactor steps plus suggested validation commands (go test, analyze_coverage, etc.).

Development

git clone https://github.com/hloiseau/mcp-gopls.git
cd mcp-gopls
go mod tidy
go test ./...
go build ./cmd/mcp-gopls

Table-driven tests live under pkg/tools and CI runs via .github/workflows/ci.yml.

Documentation

  • docs/usage.md – quickstart and tool catalog walkthrough
  • Workspace resources expose resource://workspace/overview and resource://workspace/go.mod
  • Prompts (summarize_diagnostics, refactor_plan) help assistants produce consistent outputs

Integration with Ollama

This MCP server can be used with any tool that supports the MCP protocol. For Ollama integration:

  1. Make sure Ollama is running
  2. The MCP server runs independently and communicates through stdin/stdout
  3. Configure your client to use the MCP server as a tool provider