GitLab Documentation MCP Server
Provides searchable access to GitLab's official documentation, enabling AI assistants to search and retrieve documentation from multiple GitLab OSS repositories including GitLab CE/EE, Runner, Omnibus, Gitaly, Pages, and Agent.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@GitLab Documentation MCP ServerHow do I set up a GitLab CI/CD pipeline?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GitLab Documentation MCP Server
A Model Context Protocol (MCP) server that provides searchable access to GitLab's official documentation. This server indexes markdown documentation from multiple GitLab OSS repositories and makes it available for AI assistants and other MCP clients.
Features
Full-text search across GitLab documentation using SQLite FTS5
Version-specific docs - Build for any GitLab version (e.g., 18.7.2) or latest
Multiple repositories indexed:
GitLab CE/EE (main application)
GitLab Runner (CI/CD runner)
Omnibus GitLab (installation packages)
Gitaly (Git RPC service)
GitLab Pages (static sites)
GitLab Agent (Kubernetes integration, includes KAS)
Optimized Docker image - Uses sparse checkout and filters to minimize size
Related MCP server: docs-mcp-server
Building the Docker Image
Find the GitLab Version
Look for the latest patch version for your desired GitLab release:
Build for Specific Version
# Set the GitLab version you want (use full patch version)
GITLAB_VERSION=18.7.2
# Build the image
GITLAB_MINOR=$(echo $GITLAB_VERSION | cut -d. -f1,2)
docker build -f docker/Dockerfile --build-arg GITLAB_VERSION=$GITLAB_VERSION \
-t gitlab-docs-mcp:$GITLAB_VERSION \
-t mcp/gitlab-docs-mcp:$GITLAB_VERSION \
-t gitlab-docs-mcp:$GITLAB_MINOR \
-t mcp/gitlab-docs-mcp:$GITLAB_MINOR .
# Verify the images were created
echo "\nCreated images:"
docker images | grep gitlab-docs-mcp
# Test the image - initialize and list tools
echo "\nTesting MCP server initialization:"
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | \
docker run -i --rm mcp/gitlab-docs-mcp:$GITLAB_VERSION | jq .
echo "\nListing available tools:"
(echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'; \
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list"}') | \
docker run -i --rm mcp/gitlab-docs-mcp:$GITLAB_VERSION 2>/dev/null | tail -1 | jq .Build for Latest (Main Branch)
docker build -f docker/Dockerfile \
-t gitlab-docs-mcp:latest \
-t mcp/gitlab-docs-mcp:latest .
# Verify the images were created
echo "\nCreated images:"
docker images | grep gitlab-docs-mcp
# Test the image - initialize and list tools
echo "\nTesting MCP server initialization:"
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | \
docker run -i --rm mcp/gitlab-docs-mcp:latest | head -20
echo "\nListing available tools:"
(echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}'; \
echo '{"jsonrpc":"2.0","id":2,"method":"tools/list"}') | \
docker run -i --rm mcp/gitlab-docs-mcp:latest 2>/dev/null | tail -1 | jq .```
## Installation
This server is published to the [MCP Community Registry](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.nunolima/gitlab-docs-mcp).
### Prerequisites
- Docker installed and running
- MCP-compatible client (Claude Desktop, Cline, Cursor, etc.)
### Setup Instructions
#### Claude Desktop
1. **Locate your config file**:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
- Linux: `~/.config/Claude/claude_desktop_config.json`
2. **Add the server configuration**:
```json
{
"mcpServers": {
"gitlab-docs": {
"command": "docker",
"args": ["run", "-i", "--rm", "nunolima/gitlab-docs-mcp:18.7"]
}
}
}Restart Claude Desktop - The server will appear in the MCP tools menu (๐ icon)
Cline (VS Code Extension)
Open Cline settings in VS Code
Navigate to MCP Servers section
Add this configuration:
{ "mcpServers": { "gitlab-docs": { "command": "docker", "args": ["run", "-i", "--rm", "nunolima/gitlab-docs-mcp:18.7"] } } }Reload VS Code window
Cursor
Open Cursor settings
Go to Features โ Model Context Protocol
Add the server configuration:
{ "mcpServers": { "gitlab-docs": { "command": "docker", "args": ["run", "-i", "--rm", "nunolima/gitlab-docs-mcp:18.7"] } } }
Version Selection
Choose the version that matches your GitLab deployment:
// For GitLab 18.7.x
"args": ["run", "-i", "--rm", "nunolima/gitlab-docs-mcp:18.7"]
// For latest GitLab version
"args": ["run", "-i", "--rm", "nunolima/gitlab-docs-mcp:latest"]Verification
After setup, verify the server is working:
In Claude Desktop: Look for the ๐ icon - you should see "gitlab-docs" listed
Test a query: Ask Claude to search GitLab documentation, e.g., "Search GitLab docs for CI/CD pipeline configuration"
Check Docker: Run
docker ps -aafter making a query to see if the container ran
An good test AI request message is: Using only the "gitlab-docs-mcp" mcp tools as source, what is the latest x.y.z GitLab version covered in the GitLab upgrade notes (doc/update/versions/)?
Troubleshooting
Server not appearing in client:
Ensure Docker is running:
docker infoCheck config file JSON is valid (no trailing commas, proper quotes)
Restart your MCP client completely
"Cannot connect to Docker daemon" error:
Start Docker Desktop
Verify Docker is accessible:
docker ps
Old documentation version:
Use a different version tag (see Version Selection above)
Check available tags: https://hub.docker.com/r/nunolima/gitlab-docs-mcp/tags
Available Tools
Once connected, the server provides these tools (MCP Python SDK v2, structured outputs):
search_docs: Full-text search across all GitLab documentation (returns paths, titles, repos)get_doc: Retrieve a specific document by exact path from search resultssearch_and_fetch: Search and return full markdown for each hit in one call
Resources
docs://repos: Indexed repository keysdocs://{+path}: Full markdown for an indexed document path
Example Queries
Try asking your AI assistant:
"Search GitLab docs for how to set up GitLab Runner with Docker"
"Find documentation about GitLab CI/CD pipeline syntax"
"What does the GitLab documentation say about backup and restore?"
"Search for GitLab Pages custom domain configuration"
How It Works
Build time: Clones doc folders from GitLab repositories using sparse checkout
Indexing: Parses markdown files and builds an SQLite FTS5 search index
Runtime: MCP server provides search tools to query the indexed documentation
Versioning Strategy
Main GitLab repo: Uses full version tag (e.g.,
v18.7.2-ee)Omnibus GitLab: Uses full version with +ee suffix (e.g.,
18.7.2+ee.0)Other repositories: Use major.minor.0 version (e.g.,
v18.7.0)This uses the first stable release (.0) for each major.minor version
Example: Building GitLab 18.7.2 will use Runner/Gitaly/Pages/Agent v18.7.0
Development
Project Structure
python/gitlab-docs-mcp/
โโโ docker/
โ โโโ Dockerfile # Main Dockerfile with version support
โโโ indexer/
โ โโโ build_index.py # Builds search index from markdown files
โโโ server/
โ โโโ main.py # MCP server implementation
โโโ data/
โ โโโ docs.db # SQLite FTS5 database (generated)
โโโ repos/ # Cloned documentation (generated)Local Development
# Install dependencies
pip install -r requirements.txt
# Clone repos manually for testing
# (or let Docker handle it)
# Build index
python indexer/build_index.py
# Run server (stdio)
python -m server.mainIntegration tests (curl + jq)
test.sh starts the Docker image with Streamable HTTP and validates discover, tools, and resources against MCP protocol 2026-07-28:
# Rebuild image first, then:
./test.sh 19.0.5
# Or against an already-running HTTP server:
MCP_TRANSPORT=streamable-http MCP_HOST=0.0.0.0 MCP_PORT=8000 python -m server.main
MCP_BASE_URL=http://127.0.0.1:8000/mcp ./test.shLicense
MIT License - Copyright (c) 2026 Nuno Lima
This project indexes documentation from GitLab's open source repositories. See individual repository licenses for details.
Acknowledgments
Development of this project was supported by OLX, which provided access to AI-assisted development tools.
Available Tools
3 toolsget_docGet GitLab docARead-onlyIdempotent
Fetch the full markdown content of a single documentation page by path.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Exact document path from search results. |
Output Schema
| Name | Required | Description |
|---|---|---|
| path | Yes | |
| repo | Yes | |
| title | Yes | |
| content | Yes | Full markdown body of the document. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent; the description adds that the response is the page's full Markdown content rather than a summary or search snippet. This clarifies output granularity and format beyond what the safety annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the key action and resource, with no filler or redundant explanation. Every word contributes to selecting or invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-required-parameter read tool with an output schema and safety annotations, the description plus schema fully covers what an agent needs: what to fetch, how to identify the page, and that it is read-only/idempotent. No missing prerequisite or postcondition creates ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the sole parameter, path, is already described as the exact document path from search results. The description only repeats 'by path' and does not add formatting, encoding, or alternate-source guidance, so it stays at the baseline for a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('fetch'), resource ('full markdown content of a single documentation page'), and method ('by path'). This clearly distinguishes it from the search-oriented siblings search_docs and search_and_fetch, which find or combine docs rather than retrieving one known page.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description and path parameter make the usage context clear: call this when you already have the exact document path, which the schema says comes from search results. It does not explicitly name when-not-to-use conditions or alternatives, but the intended flow is easily inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_and_fetchSearch then fetch GitLab docsARead-onlyIdempotent
Search documentation and return full markdown for each hit in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum documents to search and fetch. | |
| query | Yes | Full-text search query (SQLite FTS5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of documents returned with content. |
| query | Yes | |
| documents | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only and idempotent behavior, and the description adds useful context about the combined search-and-fetch outcome and that full markdown is returned for each hit. It does not discuss potential response size, but that is minor given the annotations and output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence that front-loads the action and outcome with no filler. Every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with rich schema documentation, read-only/idempotent annotations, an output schema, and clear combined behavior, the description is complete. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents query and limit. The description's phrase 'full markdown for each hit' slightly reinforces the limit's behavior, but it adds no new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb (search) and resource (documentation), and the key distinctive outcome: returns full markdown for each hit in one call. This directly differentiates it from siblings like search_docs or get_doc, which would require separate calls.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in one call' implies it should be used when both searching and retrieving full content are needed, but it does not explicitly name alternatives or state when not to use it. Usage context is inferred from the behavior rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch GitLab docsBRead-onlyIdempotent
Search indexed GitLab documentation and return matching paths and titles.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum hits to return. | |
| query | Yes | Full-text search query (SQLite FTS5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | Number of hits returned. |
| query | Yes | |
| results | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, covering safety and repeatability. The description adds that the search operates over 'indexed' documentation and returns only paths and titles, which is useful but does not go beyond what the annotations and output schema already convey. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that names the action, the resource, and the result shape with no wasted words. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple schema, full parameter descriptions, output schema presence, and annotations covering read-only/idempotent behavior, the description is largely sufficient for invoking the tool correctly. The main missing piece is sibling differentiation, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'query' and 'limit' already documented in the input schema. The description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Search') and resource ('indexed GitLab documentation'), and specifies the return type ('matching paths and titles'). It does not explicitly contrast itself with siblings like get_doc or search_and_fetch, so it slightly falls short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool (when searching docs is needed) but provides no guidance on when to prefer it over the sibling alternatives, nor any exclusion criteria. With siblings named get_doc and search_and_fetch, the absence of routing advice is a notable gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
search_docs and get_doc are clearly distinct, with one returning metadata and the other full content. search_and_fetch overlaps with both by combining them, but its purpose as a convenience method is clear enough to avoid real confusion.
search_docs and get_doc follow a consistent verb_noun pattern. search_and_fetch breaks the pattern slightly by combining two verbs with 'and', but the overall naming style remains predictable and readable.
Three tools is appropriate for a documentation-focused server: one to search, one to retrieve a single document, and one combined operation. Each tool has a distinct, useful purpose with no redundancy.
The core documentation workflow of searching and fetching content is fully covered. A minor gap is the lack of browsing or listing documentation paths without a search query, but agents can work around this using search_docs.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
MCP server for querying Forkast documentation
MCP server for innovationlab documentation, generated by doc2mcp.
MCP server for opencode documentation, generated by doc2mcp.
Related MCP Servers
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables interaction with GitLab accounts to manage repositories, merge requests, code reviews, and CI/CD pipelines through natural language.4117921MIT
- AlicenseNot gradedqualityAmaintenanceA Model Context Protocol (MCP) server that scrapes, indexes, and searches documentation for third-party software libraries and packages, supporting versioning and hybrid search.3,2251,674MIT
- -licenseNot gradedqualityNot gradedmaintenanceA Model Context Protocol server that enables AI assistants to interact with GitLab repositories, allowing tasks like managing merge requests, searching projects, and creating comments through RESTful API integration.192
- AlicenseNot gradedqualityDmaintenanceMCP server for interacting with GitLab API, supporting both self-hosted instances and gitlab.com. Provides tools for managing issues, merge requests, code review, pipelines, milestones, releases, search, and file access.302MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nunolima/gitlab-docs-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server