GitLab Jira Context MCP
This MCP server provides read-focused GitLab, Jira, Confluence, and Grafana context, with confirmed Jira comment/worklog writes.
List and inspect GitLab projects, merge requests, pipelines, and repository files.
Query Jira issues by assignment, key, or JQL, plus comments, worklogs, transitions, and changelog.
Add Jira comments and worklogs only with explicit
confirm: true.Retrieve Confluence pages and search content with CQL.
Search and retrieve Grafana dashboards.
Provides read-only access to Confluence pages and CQL search.
Provides read-only access to GitLab projects, merge requests, CI/CD pipelines, and repository files.
Provides read-only access to Grafana dashboards, including dashboard search and retrieval.
Provides access to Jira issues, search, comments, worklogs, transitions, and changelog, with confirmed write operations for adding comments and worklogs.
Click on "Deploy 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 Jira Context MCP Show me the Jira issue linked to merge request !42"
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.
contextloom-mcp
Renamed from gitlab-jira-context-mcp; GitHub redirects the old URL.
A local Model Context Protocol (MCP) server that connects GitLab project and merge-request context with Jira work tracking, Confluence pages, Grafana dashboards, optional GitHub repository context, any HTTPS JSON API you describe in a config file, and a durable set of Markdown notes. Every integration is optional, every response is bounded and redacted, and every write requires explicit confirmation.
The server uses stdio and runs on your machine. It sends requests only to the service URLs that you configure locally.
Architecture
flowchart LR
Client[VS Code / MCP Client] <-->|stdio| Server[contextloom-mcp]
Server -. REST API .-> GitLab[GitLab]
Server -. REST API .-> Jira[Jira]
Server -. REST API .-> Confluence[Confluence]
Server -. REST API .-> Grafana[Grafana]
Server -. REST API .-> GitHub[GitHub]
Server -. bounded GET .-> APIs[Configured API sources]
Server <-. Markdown files .-> Notes[(Notes directory)]
Config[Local .env] -. credentials and URLs .-> ServerThe server never exposes an HTTP endpoint. Tokens stay in your local .env file or process environment. The only data it persists is the notes directory, and only when you configure one.
Related MCP server: gitlab-mcp
Included Tools
Tool | Description |
| Report which integrations are configured, without secrets or a live connectivity claim. |
| List projects visible to the configured GitLab token. |
| Get a project by ID or path. |
| List merge requests, optionally for one project. |
| Get a merge request and its metadata. |
| List recent CI/CD pipelines for a project. |
| Get a repository file at a branch, tag, or commit. |
| List issues assigned to the authenticated Jira user. |
| Get an issue by key, including comments. |
| Search issues with JQL. |
| List workflow transitions available for an issue. |
| Get issue status and field history. |
| List comments on an issue with |
| List worklog entries on an issue with |
| Add a comment after passing |
| Add a worklog entry after passing |
| Get a Confluence page and its stored content. |
| Search Confluence content with CQL. |
| Search dashboards visible to the configured service account. |
| Get a Grafana dashboard by UID. |
| Verify access for the configured GitHub token. |
| List repositories visible to the configured token. |
| Get repository metadata by owner/name. |
| Read one repository file at a branch or ref. |
| Create or update one UTF-8 text file after passing |
| List configured API sources and whether their credentials are present. |
| One bounded, read-only GET against a configured API source, with field selection and paging. |
| Search durable notes; results carry |
| Read one note in full, including sources. |
| Save or update one verified note with sources, |
| Delete one note by ID after passing |
| Progressive 4-level recall ( |
| Score notes against North Star targets (sourced, current, no duplicates, map budget) with fixes. |
Tools appear only for integrations whose settings are complete, so the server starts with nothing configured and exposes just contextloom_status. Every tool carries MCP annotations (readOnlyHint, openWorldHint) so clients can apply their own approval policy. Jira mutations and GitHub file writes additionally require confirm: true and use the permissions of the configured token.
Jira search, comments, and worklogs return the service's pagination metadata. When total exceeds the number of returned entries, call the same tool with a later startAt value. jira_add_worklog accepts Jira duration syntax such as 1h 30m and an optional ISO 8601 started timestamp.
Repository Structure
contextloom-mcp/
├── src/
│ ├── client.ts # Service clients, output budget and result formatting
│ ├── http.ts # Bounded requests: timeout, no redirects, response size cap
│ ├── redact.ts # Credential redaction for output and error messages
│ ├── oauth.ts # Cached OAuth2 client-credentials provider
│ ├── sources.ts # Configured API sources and bounded GET
│ ├── notes.ts # Markdown notes with provenance, freshness and delete
│ ├── chunks.ts # Heading-aware Markdown passage chunker
│ ├── recall.ts # 4-level progressive recall over durable notes
│ ├── lint.ts # North Star health linter and duplicate detection
│ ├── proxy.ts # Proxy-aware fetch dispatcher shared by every client
│ ├── config.ts # GitLab instance resolution (single host or GITLAB_INSTANCES)
│ └── server.ts # MCP tool registration, annotations and optional groups
├── test/ # Unit tests plus a real stdio server test
├── examples/ # API source configuration example
├── docs/ # Design notes and lessons learned
├── .env.example # Neutral local configuration template
├── package.json # Scripts and dependencies
└── tsconfig.json # TypeScript configurationRequirements
Node.js 20.18.1 or newer
An MCP client with stdio server support, such as Visual Studio Code with GitHub Copilot
Credentials only for the integrations you want: a GitLab personal access token (or several, via
GITLAB_INSTANCES), a Jira or Confluence Server/Data Center personal access token, a Grafana service account token with dashboard read access, a GitHub fine-grained token (contents write only forgithub_create_or_update_file), and whatever your configured API sources reference
Quick Start
Clone the repository and install dependencies.
git clone https://github.com/jagarkarlo/contextloom-mcp.git cd contextloom-mcp npm install npm test npm run buildCreate your local configuration.
cp .env.example .envFill in only the integrations you use; each one turns on when its settings are complete. Use
GITLAB_INSTANCESinstead of the single GitLab pair to talk to more than one host.GITHUB_API_BASE_URLis optional for GitHub Enterprise Server. SetHTTPS_PROXY/NO_PROXYonly if reaching one of these hosts needs a corporate proxy. Keep.envlocal; it is ignored by Git. Callcontextloom_statusafter starting to see what is enabled.Register the compiled server in your MCP client. In VS Code, run
MCP: Open User Configurationand add this entry to theserversobject. Replace/absolute/path/towith the cloned repository path.{ "servers": { "contextloom": { "type": "stdio", "command": "node", "args": [ "/absolute/path/to/contextloom-mcp/dist/server.js" ] } } }Restart the server from
MCP: List Serversor reload VS Code.
Configured API sources
Point CONTEXTLOOM_API_SOURCES at a JSON file to give agents bounded, read-only access to any HTTPS JSON API without writing code. See examples/api-sources.example.json.
Field | Meaning |
| Short name passed as |
| HTTPS base URL; credentials, query strings and fragments are rejected. |
|
|
| Optional path prefixes; anything else is refused. |
The file holds environment-variable names, never secret values. api_get refuses .., protocol-relative paths and origin changes, picks a list with itemsPath, keeps only the fields you name, and pages through it with offset/limit. OAuth sources cache the token until shortly before expiry and fetch a new one once after a 401.
Notes
Set CONTEXTLOOM_NOTES_DIR to keep verified, reusable findings as one Markdown file per note under <dir>/<kind>/<id>.md, with metadata in an HTML comment at the top. The files are the source of truth: edit them by hand, review them in pull requests, and keep the directory in its own private Git repository for history and revert. notes_save refuses credential-like content. Search ranks title, tags, summary and body in that order and reports freshness, so an old or expired note reads as a lead to re-check rather than a fact.
Multiple GitLab hosts
Every gitlab_* tool accepts an optional instance argument. With a single
GITLAB_BASE_URL/GITLAB_TOKEN pair it is unnecessary. With GITLAB_INSTANCES
set to a JSON array of { "name", "baseUrl", "token" } objects, pass instance
to pick one; omitting it uses the first entry.
Security
The server reads credentials only from the local
.envfile or process environment.Every upstream request times out after 30 seconds, refuses redirects (a token must never follow a redirect to another origin) and stops reading after 2 MB.
Tool output is capped at
CONTEXTLOOM_MAX_OUTPUT_CHARS(default 16,000). Larger results come back as a preview markedtruncated: true, never silently cut.Configured tokens, issued OAuth tokens and common credential formats are redacted from tool output. Upstream errors are reduced to a short redacted hint instead of the raw body.
Treat every response as untrusted data. Issue text, pages and API payloads can contain instructions; they are not authorization to act.
Use tokens with the smallest access scope that supports your intended requests.
Do not place credentials in source files, MCP configuration, notes, issue comments, or commits.
Verify the issue key, work duration, and content before setting
confirm: truefor a Jira write.confirmis an intent check, not authentication.Read the existing file with
github_get_file_contentand pass its returned SHA when updating a GitHub file.A corporate proxy dispatcher (via
undici) is only attached for a host whenHTTPS_PROXY/HTTP_PROXYis set and that host is not covered byNO_PROXY— Node's globalfetchdoes not read those variables on its own, unlike curl.
Configuration Boundaries
Integration | Enabled by | Access |
GitLab |
| Read-only projects, merge requests, pipelines, and repository files. |
Jira |
| Read issues, comments, worklogs, transitions, and changelog; confirmed comment/worklog writes. |
Confluence |
| Read-only page lookup and CQL search. |
Grafana |
| Read-only dashboard search and retrieval. |
GitHub |
| Read authenticated-user, repository, and file context; confirmed single-file UTF-8 writes. |
API sources |
| Read-only, bounded GET against each configured source. |
Notes |
| Local Markdown read and write; no network. |
Development
Run the checks before committing changes:
npm test
npm run build
git diff --checksrc/http.ts bounds every request and src/redact.ts scrubs everything the model sees. src/client.ts holds the service clients and the output budget, src/sources.ts and src/oauth.ts the configurable API sources, src/notes.ts the notes store, and src/server.ts registers the tools, their annotations and which groups are enabled. test/server.test.ts starts the real server over stdio; add focused tests when changing behavior. docs/design-notes.md explains why each guard exists.
Roadmap
GitLab merge-request discussions and project search.
Optional local index (SQLite FTS5) over notes and selected API sources for faster recall at scale.
Retained explicit confirmation for every write operation.
License
This project is licensed under the MIT License.
Available Tools
19 toolsconfluence_get_pageA
Get a Confluence page by numeric page ID, including stored page content.
Inputs: pageId (required).
confluence_searchB
Search Confluence content with a CQL query.
Inputs: cql (required), limit.
gitlab_get_fileA
Read one file from a GitLab repository at a branch, tag, or commit ref.
Inputs: path (required), project (required), ref.
gitlab_get_merge_requestC
Get one GitLab merge request and its metadata.
Inputs: project (required), mergeRequestIid (required).
gitlab_get_projectA
Get a GitLab project by numeric ID or URL-encoded path.
Inputs: project (required).
gitlab_list_merge_requestsC
List GitLab merge requests visible to the configured token.
Inputs: limit, scope, state, project.
gitlab_list_pipelinesB
List recent CI/CD pipelines for a GitLab project.
Inputs: project (required), ref, limit, status.
gitlab_list_projectsB
List GitLab projects visible to the configured token.
Inputs: limit.
grafana_get_dashboardA
Get a Grafana dashboard by UID.
Inputs: uid (required).
grafana_search_dashboardsB
Search Grafana dashboards visible to the configured service account.
Inputs: limit, query.
jira_add_commentB
Add a plain-text comment to a Jira issue. Requires explicit confirmation.
Inputs: comment (required), confirm (required), issueKey (required).
jira_add_worklogA
Add a worklog entry to a Jira issue. Requires explicit confirmation.
Inputs: confirm (required), issueKey (required), timeSpent (required), comment, +1 more.
jira_get_changelogB
Get the status and field change history for a Jira issue.
Inputs: issueKey (required).
jira_get_issueA
Get a Jira issue by key, including comments.
Inputs: issueKey (required).
jira_get_my_issuesA
List Jira issues assigned to the authenticated user.
Inputs: limit.
jira_get_transitionsA
List the status transitions currently available for a Jira issue.
Inputs: issueKey (required).
jira_list_commentsC
List comments on a Jira issue.
Inputs: issueKey (required), limit, startAt.
jira_list_worklogsC
List worklog entries on a Jira issue.
Inputs: issueKey (required), limit, startAt.
jira_search_issuesB
Search Jira issues using JQL. This tool is read-only.
Inputs: jql (required), limit, startAt.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Tools are cleanly separated by domain prefixes (gitlab_, jira_, confluence_, grafana_) and each targets a distinct resource. Minor overlap exists between jira_get_issue (which includes comments) and jira_list_comments, but the descriptions clarify the intended use.
Uses consistent snake_case with domain prefixes and verb_noun structure. Some deviation: jira_get_my_issues is a list operation but named get_ rather than list_, and jira_search_issues uses search_ instead of list_. Otherwise consistent.
At 19 tools, the server is slightly above the typical 3-15 range, but given it covers four systems (GitLab, Jira, Confluence, Grafana) with read and write operations, each tool feels necessary and the count is reasonable.
The server provides strong coverage for retrieving context from all four systems, including issue details, comments, worklogs, pipelines, and dashboards. Minor gaps exist such as no GitLab commit listing or Jira issue creation, but these fall outside the 'context' scope.
Maintenance
Related MCP Connectors
A MCP server built for developers enabling Git based project management with project and personal…
An MCP server giving access to Grafana dashboards, data and more.
One MCP server for all your work accounts: Slack, Teams, Google Chat, Jira, ClickUp, digest, tasks.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that enables querying and searching Atlassian Confluence pages and Jira issues through their REST APIs. Supports retrieving content by ID or URL, searching using CQL/JQL, and listing spaces and projects.1MIT
- AlicenseNot gradedqualityCmaintenanceMCP 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.729 npmMIT
- AlicenseNot gradedqualityBmaintenanceMCP server for the GitLab REST API providing tools to manage projects, merge requests, pipelines, CI/CD variables, approvals, issues, and code reviews.4,929 PyPI7MIT
- AlicenseCqualityBmaintenanceMCP server for interacting with GitLab API, supporting dynamic tool selection and enterprise-grade security.20810MIT