golang-gopls
samber/cc-skills-golang
Official Go language server for semantic code intelligence: definitions, references, refactoring, diagnostics, and workspace navigation.
What is golang-gopls?
gopls is the official Go language server providing semantic code analysis for your workspace. Use it to navigate code (jump to definitions, find references), understand dependencies, refactor safely (rename, extract, inline), run diagnostics, and discover APIs—all based on your exact pinned build in go.mod and go.sum.
- Navigate code: go-to-definition, find references, call/implementation hierarchy, and call graphs
- Search workspace symbols and fuzzy-find types, functions, and variables by name
- Understand dependencies: package API discovery, file context analysis, and workspace layout detection
- Run diagnostics: compiler errors, analyzer warnings, and lightweight vulnerability checks (go_vulncheck)
- Refactor safely: rename (with interface-satisfaction checks), extract/inline functions, fill structs/switches, and apply code actions
- Format code: canonical gofmt-equivalent formatting and import organization
How to install golang-gopls
npx skills add https://github.com/samber/cc-skills-golang --skill golang-gopls- Go 1.x installed and on PATH
- gopls v0.20+ installed: run `go install golang.org/x/tools/gopls@latest`
- For MCP integration: register with `claude mcp add gopls -- gopls mcp`
- For native LSP tool in Claude Code: set `ENABLE_LSP_TOOL=1` and install the `gopls-lsp@claude-plugins-official` marketplace plugin
How to use golang-gopls
- 1.Call `go_workspace` at session start to detect the workspace layout and run a baseline vulnerability check
- 2.Use `go_search` to fuzzy-find a symbol by name when you don't know its exact location
- 3.Call `go_file_context` after reading a Go file for the first time to see its imports and dependencies
- 4.Before modifying any definition, call `go_symbol_references` to find all call sites and judge the refactoring scope
- 5.Make all planned edits, then run `go_diagnostics` on each changed file to catch errors
- 6.Fix reported diagnostics and re-run to confirm; ignore unrelated hint/info messages
- 7.If go.mod dependencies changed, run `go_vulncheck` on the whole workspace after diagnostics are clean
- 8.Run `go test` on changed package paths to verify the refactoring
Use cases
- Jump to a function definition before modifying unfamiliar code to understand its behavior
- Find all call sites of a function before renaming it to judge the refactoring scope
- Extract a repeated code block into a new function with automatic parameter inference
- Run diagnostics after editing a file to catch type errors and missing imports before testing
- Search for a type or interface by name when you can't remember its exact location in the codebase
- Go developers refactoring or navigating codebases
- Teams using Claude Code or similar AI coding agents for Go projects
- Engineers integrating semantic analysis into CI/CD or code-review workflows
golang-gopls FAQ
gopls answers questions about your specific workspace and its pinned dependencies in go.mod/go.sum. godig queries the public package ecosystem (versions, docs, licenses, importers) for packages not yet in your build. Use gopls for local code analysis and refactoring; use godig for package discovery and ecosystem research.
gopls includes a lightweight `go_vulncheck` reachability check for known vulnerabilities in your dependencies. govulncheck performs a whole-tree vulnerability audit with detailed reporting. Use gopls's check as a quick baseline after dependency changes; use govulncheck for comprehensive security audits.
Prefer MCP (gopls's own server) for most agent tasks—it takes names and paths instead of cursor positions. Use the native LSP tool if you're in Claude Code and want automatic diagnostics pushed into context after edits. Use the CLI only as a fallback when neither is available. All three reach the same engine.
No. gopls only analyzes your workspace and its exact pinned dependencies. For packages you haven't added yet, versions, licenses, CVEs, or importers, use the godig skill (golang-pkg-go-dev) instead.
Call `go_vulncheck` once at session start as a baseline, and again after any go.mod change. It reports known vulnerabilities reachable from your code. For a deeper audit, use the govulncheck skill (golang-security).
Full instructions (SKILL.md)
Source of truth, from samber/cc-skills-golang.
name: golang-gopls
description: "Golang semantic code intelligence via gopls, the official Go language server — go-to-definition, find references, call/implementation hierarchy, workspace symbol search, package API discovery, diagnostics, safe rename, refactors (extract/inline/fill/rewrite code actions), formatting, and generated tests. Reaches an agent via gopls's own MCP server (go_* tools), Claude Code's native LSP tool, or the gopls CLI. Use when navigating or refactoring Go code — jumping to a definition, finding call sites before a rename, understanding a file's or package's dependencies, running diagnostics after an edit, or extracting/inlining/renaming. Not for the published ecosystem — packages not in your go.mod, versions, licenses, importers — → See samber/cc-skills-golang@golang-pkg-go-dev skill (godig). Not for a whole-tree vulnerability audit → See samber/cc-skills-golang@golang-security skill (govulncheck)."
user-invocable: true
license: MIT
compatibility: Designed for Claude Code, Codex or similar harness. Requires the gopls binary (go install golang.org/x/tools/gopls@latest) v0.20+ on PATH.
metadata:
author: samber
version: "1.1.1"
openclaw:
emoji: "🛰️"
homepage: https://github.com/samber/cc-skills-golang
requires:
bins:
- go
- gopls
install:
- kind: go
package: golang.org/x/tools/gopls@latest
bins: [gopls]
skill-library-version: "0.22.0"
allowed-tools: Read Edit Write Glob Grep Bash(go:) Bash(golangci-lint:) Bash(git:) Agent Bash(gopls:) LSP mcp__gopls__*
paths:
- "**/*.go"
Persona: You are a Go engineer who reaches for semantic code intelligence instead of grep whenever a question is about the resolved build — grep finds text, gopls finds meaning (types, call graphs, shadowing, implementation relationships).
Dependencies: gopls — go install golang.org/x/tools/gopls@latest (v0.20+). The native LSP tool additionally needs ENABLE_LSP_TOOL=1 and the gopls-lsp@claude-plugins-official marketplace plugin (see references/mcp.md).
gopls is the official Go language server. It only answers questions about your specific, locally resolved build — your workspace plus every dependency exactly as pinned in go.sum, including replace directives. For a package that isn't part of that build (versions, docs, licenses, CVEs of something you haven't added yet), → See samber/cc-skills-golang@golang-pkg-go-dev skill (godig) instead.
Three ways to reach gopls
Not interchangeable — pick by what you already know and what you need back:
- gopls's own MCP server (preferred for most tasks) — purpose-built for agents: tools take names, file paths, and fuzzy queries instead of raw cursor positions. Register once per machine:
claude mcp add gopls -- gopls mcp. Runs headless over stdio, no editor attached, only sees files saved to disk — the right default for an agent-only workflow. See references/mcp.md for every tool. - The native
LSPtool — Claude Code's built-in editor-style integration. Off by default: setENABLE_LSP_TOOL=1, installgopls, and install the officialgopls-lsp@claude-plugins-officialmarketplace plugin to wire it as the Go language server. Operations (goToDefinition,findReferences,hover,documentSymbol,workspaceSymbol,goToImplementation, call hierarchy) are keyed byline/character, so they're most useful once you already have a location — typically right after a grep or a read. Unique value: compiler diagnostics are pushed into context automatically after every edit, no explicit call needed. - The
goplsCLI — same engine, invoked asgopls <command> <file:line:col>. The Go team documents it as experimental and debugging-only — "not efficient, complete, flexible, or officially supported." Use it when neither MCP nor the native tool is wired up, or for a one-shot scripted check. Positions arefile:line:col(1-indexed, UTF-8 bytes) orfile:#offset(0-indexed). See references/cli.md.
Preference order: MCP → native LSP → CLI. MCP tools match how an agent thinks (by name/path, not cursor position); the native tool adds free automatic diagnostics; the CLI is the documented fallback of last resort. Wire as many as are available and let the task pick the tool — a query you already have a line:col for is cheap via LSP, a "where is X" query is cheap via go_search, a quick unattended check is cheap via the CLI.
Capability → CLI → MCP → native LSP
Full mapping of every capability to its CLI command, MCP tool, and native LSP op: references/matrix.md.
Use cases
- Navigation — jump to a definition, an implementation, or trace a call graph before touching code you didn't write. Details: references/features.md.
- Code discovery — learn a workspace's shape (
go_workspace), fuzzy-search a symbol you can't place exactly (go_search), or read a dependency's public surface (go_package_api) before using it. - Documentation — hover for type/doc/size info, signature help while calling a function, or browse rendered package docs (
source.doc, including internal packages pkg.go.dev never sees). - Diagnostics & safety — compiler and analyzer errors after every edit (
go_diagnostics/ automatic withLSP), plus a lightweightgo_vulncheckreachability check: once as a baseline right after detecting the workspace, and again after anygo.modchange. - Formatting — canonical
gofmt-equivalent formatting and import organization, both scriptable and code-action-driven. - Refactoring — safe rename (blocks a change that would break interface satisfaction), extract/inline, and the full
refactor.rewrite.*family (fill struct/switch, invert if, split/join lines, remove unused parameter, add struct tags, implement interface). Full catalog with gotchas: references/features.md.
Efficient workflows
These Read/Edit workflows encode the order that avoids redundant queries and half-applied edits — treat every step as required, not optional, even to save a round trip.
- Session start — call
go_workspaceonce to detect whether this is a Go workspace at all; if it is, immediately follow with a baselinego_vulncheckto surface vulnerabilities the workspace already carries. This is unconditional, separate from the edit workflow's later check after a dependency change.
Read workflow (understand before touching anything):
go_workspace— layout (module/workspace/GOPATH); same call as the session-start check above if it hasn't run yet.go_search— fuzzy-locate a type/function/variable by name.go_file_context— right after reading any Go file for the first time, see what it pulls in from the rest of its package; re-run if that file's dependencies change.go_package_api— a third-party dependency's or sibling package's public surface, without reading every file.
Edit workflow (iterate until diagnostics are clean):
- Read first (workflow above).
go_symbol_referencesbefore modifying any definition — judge the blast radius, then read every referencing file that needs a matching edit.- Make all planned edits, including the reference-site edits, before moving on.
go_diagnosticson every changed file — mandatory after each modification, not an optional cleanup pass.- Fix reported errors: review any suggested quick-fix diff before applying, then re-run diagnostics to confirm the fix landed. Ignore hint/info diagnostics unrelated to the task. A diagnostic message can paraphrase the surrounding source rather than quote it verbatim.
- Only if
go.moddependencies changed, rungo_vulncheckon the whole workspace — after diagnostics are clean, not before. - Run
go test <changed-package-paths>— not./...unless explicitly asked, since a full-repo run slows the iteration loop.
Gotchas worth knowing before you rely on a result:
referencesresults only reflect the build configuration of the queried file — a query onfoo_windows.gowill not surface matches inbar_linux.go; re-run under the relevantGOOS/build tags if a cross-platform result is missing.call_hierarchyonly shows static calls — calls through function values or interface methods are invisible to it; corroborate withreferenceswhen the call site matters.- Extract/inline refactors are less rigorous than rename: comments are sometimes dropped, and generated files marked
DO NOT EDITreceive no code actions at all. refactor.rewrite.fillStructsearches only the current file above the cursor and needs the struct's package already imported — runsource.organizeImportsfirst if the type was just typed in.
gopls vs godig vs Context7 vs govulncheck
gopls only reasons about code present and resolvable in the local build:
- For anything not tied to that build (version history, license, ecosystem-wide importers, CVEs of a package not yet added) → See
samber/cc-skills-golang@golang-pkg-go-devskill (godig) — it queries pkg.go.dev directly, no local checkout needed. - For a comprehensive, whole-tree vulnerability audit (CI gates, periodic sweeps) rather than gopls's lightweight on-demand
go_vulncheck→ Seesamber/cc-skills-golang@golang-securityskill (govulncheck). - Context7 remains a fallback for non-Go docs or a Go module not indexed on pkg.go.dev.
The full task-to-tool matrix lives in the samber/cc-skills-golang@golang-how-to skill's "godig vs gopls vs Context7 vs govulncheck" section.
Related skills
More from samber/cc-skills-golang and the wider catalog.

golang-graphql
Implement GraphQL APIs in Go using gqlgen or graphql-go with schema-first design and N+1 prevention.

golang-grpc
Production-ready gRPC patterns, proto organization, and error handling for Go microservices.

golang-how-to
Orchestrates Go skills for coding, debugging, and setup tasks—loads multiple relevant skills together automatically.

golang-lint
Configure golangci-lint, interpret lint output, and suppress warnings in Go projects.

golang-linter
Agent skill from samber/cc-skills-golang.

golang-modernize
Modernize Go code to use recent language features, standard library improvements, and idiomatic patterns.