Public log

@zereight/mcp-gitlab

GitLab MCP server for projects, merge requests, issues, pipelines, wiki, releases, and more

npm · fingerprint 209ee82b9d1033e633fb1d67 · repository · RSS

39tools
7recorded versions
46dtracked
changed 2d ago

What changed

Changed 2026-10-15 11:13 UTC

19 descriptions rewritten.

--- pinned/get_branch
+++ observed/get_branch
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get branch details (commit, protection status). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get branch details (commit, protection status). To find resources, use the matching list or search tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "branch_name": {
--- pinned/get_commit
+++ observed/get_commit
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a specific commit. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get details of a specific commit. To find resources, use the matching list or search tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/get_commit_diff
+++ observed/get_commit_diff
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get changes/diffs of a specific commit. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get changes/diffs of a specific commit. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "full_diff": {
--- pinned/get_file_contents
+++ observed/get_file_contents
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get contents of a file or directory from a GitLab project. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get contents of a file or directory from a GitLab project. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "file_path": {
--- pinned/get_merge_request
+++ observed/get_merge_request
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a merge request (merge_request_iid or source_branch required). Set include_summaries=true for deployment/commit/approval summaries. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get details of a merge request (merge_request_iid or source_branch required). Set include_summaries=true for deployment/commit/approval summaries. To find resources, use the matching list or search tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "include_summaries": {
--- pinned/get_merge_request_diffs
+++ observed/get_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get the changes/diffs of a merge request (merge_request_iid or source_branch required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get the changes/diffs of a merge request (merge_request_iid or source_branch required). To find resources, use the matching list or search tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "excluded_file_patterns": {
--- pinned/get_merge_request_file_diff
+++ observed/get_merge_request_file_diff
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get diffs for specific files from a merge request (merge_request_iid or source_branch required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get diffs for specific files from a merge request (merge_request_iid or source_branch required). Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "file_paths": {
--- pinned/get_project
+++ observed/get_project
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a specific project. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get details of a specific project. To find resources, use the matching list or search tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/get_repository_tree
+++ observed/get_repository_tree
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List files and directories in a repository. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List files and directories in a repository. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/list_branches
+++ observed/list_branches
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List branches in project with search filter. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List branches in project with search filter. For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/list_commits
+++ observed/list_commits
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List repository commits with filtering options. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List repository commits with filtering options. For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "all": {
--- pinned/list_labels
+++ observed/list_labels
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List labels for a project. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List labels for a project. For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "include_ancestor_groups": {
--- pinned/list_merge_request_changed_files
+++ observed/list_merge_request_changed_files
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List changed file paths in a merge request without diff content (merge_request_iid or source_branch required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List changed file paths in a merge request without diff content (merge_request_iid or source_branch required). Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "excluded_file_patterns": {
--- pinned/list_merge_request_diffs
+++ observed/list_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List merge request diffs with pagination (merge_request_iid or source_branch required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List merge request diffs with pagination (merge_request_iid or source_branch required). For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/list_merge_requests
+++ observed/list_merge_requests
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List merge requests (without project_id: user's MRs; with project_id: project MRs). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List merge requests (without project_id: user's MRs; with project_id: project MRs). For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "approved_by_usernames": {
--- pinned/list_project_members
+++ observed/list_project_members
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List members of a GitLab project. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List members of a GitLab project. Read-only; missing resources, denied access, and rate limits return errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "include_inheritance": {
--- pinned/list_projects
+++ observed/list_projects
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List projects accessible by the current user. Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List projects accessible by the current user. For one known resource, use the matching get tool. Read-only; missing resources, denied access, and rate limits return errors.",
    "inputSchema": {
      "properties": {
        "archived": {
--- pinned/search_repositories
+++ observed/search_repositories
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Search for GitLab projects. Use this to discover matching content; choose a typed get or list tool when the target identifier is already known. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Search for GitLab projects. If the identifier is known, use a typed get or list tool. Read-only; missing resources, denied access, and rate limits return errors.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/update_merge_request
+++ observed/update_merge_request
  {
    "annotations": {
      "openWorldHint": true
-   "description": "Update a merge request (merge_request_iid or source_branch required). Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Update a merge request (merge_request_iid or source_branch required). Use the create tool for new resources and a note tool for comments. Changes GitLab data; needs permission and returns validation or conflict errors. `project_id`/`group_id` take a numeric ID or URL-encoded path.",
    "inputSchema": {
      "properties": {
        "assignee_ids": {

Changed 2026-10-14 11:36 UTC

1 description rewritten.

--- pinned/discover_tools
+++ observed/discover_tools
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Discover and activate additional tool categories for this session. Available categories: core, merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
+   "description": "Discover and activate additional tool categories for this session. Available categories: core, merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Explicit-only toolsets are omitted; list them in GITLAB_TOOLSETS. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
    "inputSchema": {
      "properties": {
        "category": {

Changed 2026-10-12 15:04 UTC

1 description rewritten.

--- pinned/health_check
+++ observed/health_check
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. A 403 from GET /user with an insufficient_scope error means the token is accepted but User API scope is missing (read_user or fine-grained User:Read); the check stays ok, sets user_api_warning, and omits version metadata. Rate-limit and authentication-ban 403 responses stay unauthenticated. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.",
+   "description": "Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. A 403 from GET /user with an insufficient_scope error means the token is accepted but User API scope is missing (read_user or fine-grained User:Read); the check stays ok, sets user_api_warning, and omits version metadata. Rate-limit and authentication-ban 403 responses stay unauthenticated. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available. Connection failures with no HTTP response return status error, authenticated false, and an error object (kind tls, dns, timeout, or network, plus code and message) instead of a protocol error.",
    "inputSchema": {
      "properties": {
        "jmespath": {

Changed 2026-10-10 12:17 UTC

9 descriptions rewritten.

--- pinned/get_merge_request
+++ observed/get_merge_request
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a merge request (mergeRequestIid or branchName required). Set include_summaries=true for deployment/commit/approval summaries. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get details of a merge request (merge_request_iid or source_branch required). Set include_summaries=true for deployment/commit/approval summaries. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "include_summaries": {
--- pinned/get_merge_request_diffs
+++ observed/get_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get the changes/diffs of a merge request (mergeRequestIid or branchName required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get the changes/diffs of a merge request (merge_request_iid or source_branch required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "excluded_file_patterns": {
--- pinned/get_merge_request_file_diff
+++ observed/get_merge_request_file_diff
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get diffs for specific files from a merge request (mergeRequestIid or branchName required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get diffs for specific files from a merge request (merge_request_iid or source_branch required). Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "file_paths": {
--- pinned/health_check
+++ observed/health_check
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.",
+   "description": "Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. A 403 from GET /user with an insufficient_scope error means the token is accepted but User API scope is missing (read_user or fine-grained User:Read); the check stays ok, sets user_api_warning, and omits version metadata. Rate-limit and authentication-ban 403 responses stay unauthenticated. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/list_merge_request_changed_files
+++ observed/list_merge_request_changed_files
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List changed file paths in a merge request without diff content (mergeRequestIid or branchName required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List changed file paths in a merge request without diff content (merge_request_iid or source_branch required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "excluded_file_patterns": {
--- pinned/list_merge_request_diffs
+++ observed/list_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List merge request diffs with pagination (mergeRequestIid or branchName required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List merge request diffs with pagination (merge_request_iid or source_branch required). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "jmespath": {
--- pinned/my_issues
+++ observed/my_issues
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List issues assigned to the authenticated user. Use this for issue management: list issues assigned to the authenticated user. Use `list_issues` for project-wide or author-scoped listing and `get_issue` for one issue. It is read-only and paginated, requires authentication, and returns assigned issue records or permission/rate-limit errors.",
+   "description": "List issues assigned to the authenticated user. Use this for issue management: list issues assigned to the authenticated user. Use `list_issues` for project-wide or author-scoped listing and `get_issue` for one issue. Resolving the current user requires classic read_user or fine-grained User:Read. It is read-only and paginated, requires authentication, and returns assigned issue records or permission/rate-limit errors.",
    "inputSchema": {
      "properties": {
        "created_after": {
--- pinned/update_merge_request
+++ observed/update_merge_request
  {
    "annotations": {
      "openWorldHint": true
-   "description": "Update a merge request (mergeRequestIid or branchName required). Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Update a merge request (merge_request_iid or source_branch required). Use this for an existing resource; choose the corresponding create tool for a new resource and a note tool for discussion-only text. It changes remote GitLab state and requires the necessary project or group permission; GitLab returns validation, conflict, permission, or rate-limit errors instead of silently applying an invalid request. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
    "inputSchema": {
      "properties": {
        "assignee_ids": {
--- pinned/whoami
+++ observed/whoami
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get current authenticated user details. Use this to identify the authenticated GitLab user; use `get_user` or `get_users` when looking up another user. It is read-only and returns the current user profile, while missing credentials or GitLab permission failures are reported as errors.",
+   "description": "Get current authenticated user details. Use this to identify the authenticated GitLab user; use `get_user` or `get_users` when looking up another user. It requires classic read_user or fine-grained User:Read. It is read-only and returns the current user profile, while missing credentials or GitLab permission failures are reported as errors.",
    "inputSchema": {
      "properties": {
        "jmespath": {

Changed 2026-10-08 13:12 UTC

2 descriptions rewritten, 79 tools removed.

--- pinned/discover_tools
+++ observed/discover_tools
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
+   "description": "Discover and activate additional tool categories for this session. Available categories: core, merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
    "inputSchema": {
      "properties": {
        "category": {
--- pinned/get_issue
+++ observed/get_issue
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone object. Use this for issue management: inspect one issue's fields; use `list_issues` or `my_issues` to discover issues first. It is read-only, requires issue read permission, and returns the issue or an error when the identifier is invalid, the issue is missing, or access is denied.",
+   "description": "Get details of a specific issue. Returns the issue with a slim nested milestone by default; set full_response=true for the complete milestone object. Use this for issue management: inspect one issue's fields; use `list_issues` or `my_issues` to discover issues first. It is read-only, requires issue read permission, and returns the issue or an error when the identifier is invalid, the issue is missing, or access is denied.",
    "inputSchema": {
      "properties": {
        "full_response": {
-         "description": "If true, return the complete issue object including the full milestone description. Default returns a slim milestone (id, iid, title, state, web_url) to reduce token usage.",
+         "description": "If true, include the complete milestone object, including its description, on the returned issue. Default returns the issue with a slim milestone (id, iid, title, state, web_url) to reduce token usage.",
          "type": "boolean"
        },
        "issue_iid": {

tool removed: approve_merge_request

tool removed: bulk_publish_draft_notes

tool removed: create_branch

tool removed: create_commit_status

tool removed: create_draft_note

tool removed: create_group

tool removed: create_issue_emoji_reaction

tool removed: create_issue_link

tool removed: create_issue_note_emoji_reaction

tool removed: create_label

tool removed: create_merge_request_discussion_note

tool removed: create_merge_request_emoji_reaction

tool removed: create_merge_request_note

tool removed: create_merge_request_note_emoji_reaction

tool removed: create_note

tool removed: create_or_update_file

tool removed: create_repository

tool removed: delete_branch

tool removed: delete_draft_note

tool removed: delete_issue

tool removed: delete_issue_emoji_reaction

tool removed: delete_issue_link

tool removed: delete_issue_note_emoji_reaction

tool removed: delete_label

tool removed: delete_merge_request_discussion_note

tool removed: delete_merge_request_emoji_reaction

tool removed: delete_merge_request_note

tool removed: delete_merge_request_note_emoji_reaction

tool removed: download_attachment

tool removed: fork_repository

tool removed: get_branch_diffs

tool removed: get_ci_catalog_resource

tool removed: get_draft_note

tool removed: get_issue_link

tool removed: get_label

tool removed: get_merge_request_conflicts

tool removed: get_merge_request_version

tool removed: get_namespace

tool removed: get_project_events

tool removed: get_protected_branch

tool removed: get_user

tool removed: get_users

tool removed: list_ci_catalog_resources

tool removed: list_commit_statuses

tool removed: list_draft_notes

tool removed: list_events

tool removed: list_group_iterations

tool removed: list_group_members

tool removed: list_group_merge_requests

tool removed: list_group_projects

tool removed: list_issue_emoji_reactions

tool removed: list_issue_links

tool removed: list_issue_note_emoji_reactions

tool removed: list_merge_request_emoji_reactions

tool removed: list_merge_request_note_emoji_reactions

tool removed: list_merge_request_pipelines

tool removed: list_merge_request_versions

tool removed: list_namespaces

tool removed: list_protected_branches

tool removed: list_todos

tool removed: mark_all_todos_done

tool removed: mark_todo_done

tool removed: merge_merge_request

tool removed: protect_branch

tool removed: publish_draft_note

tool removed: push_files

tool removed: unapprove_merge_request

tool removed: unprotect_branch

tool removed: update_default_branch

tool removed: update_draft_note

tool removed: update_issue_note

tool removed: update_label

tool removed: update_merge_request_discussion_note

tool removed: update_merge_request_note

tool removed: update_project

tool removed: upload_markdown

tool removed: validate_ci_lint

tool removed: validate_project_ci_lint

tool removed: verify_namespace

Changed 2026-10-05 14:12 UTC

5 descriptions rewritten, 112 schema or annotation changes with the description left byte-identical, 1 tool added.

--- pinned/approve_merge_request
+++ observed/approve_merge_request
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of the merge request to approve",
          "type": "string"
--- pinned/bulk_publish_draft_notes
+++ observed/bulk_publish_draft_notes
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/create_branch
+++ observed/create_branch
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "branch",
-       "project_id"
+       "project_id",
+       "branch"
      ],
      "type": "object"
    },
--- pinned/create_commit_status
+++ observed/create_commit_status
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "Status name. GitLab defaults to 'default' when omitted.",
          "maxLength": 255,
+       "project_id",
        "sha",
-       "state",
-       "project_id"
+       "state"
      ],
      "type": "object"
    },
--- pinned/create_draft_note
+++ observed/create_draft_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "body",
        "project_id",
-       "merge_request_iid"
+       "merge_request_iid",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_group
+++ observed/create_group
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "The name of the group",
          "type": "string"
--- pinned/create_issue
+++ observed/create_issue
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names",
          "items": {
-       "title",
-       "project_id"
+       "project_id",
+       "title"
      ],
      "type": "object"
    },
--- pinned/create_issue_emoji_reaction
+++ observed/create_issue_emoji_reaction
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')",
          "type": "string"
-       "name",
        "project_id",
-       "issue_iid"
+       "issue_iid",
+       "name"
      ],
      "type": "object"
    },
--- pinned/create_issue_link
+++ observed/create_issue_link
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "link_type": {
          "description": "The type of the relation, defaults to relates_to",
          "enum": [
--- pinned/create_issue_note
+++ observed/create_issue_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "body",
        "project_id",
-       "issue_iid"
+       "issue_iid",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_issue_note_emoji_reaction
+++ observed/create_issue_note_emoji_reaction
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "Name of the emoji without colons (e.g. 'thumbsup', 'rocket', 'eyes')",
          "type": "string"
-       "name",
        "project_id",
        "issue_iid",
-       "note_id"
+       "note_id",
+       "name"
      ],
      "type": "object"
    },
--- pinned/create_label
+++ observed/create_label
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "The name of the label",
          "type": "string"
+       "project_id",
        "name",
-       "color",
-       "project_id"
+       "color"
      ],
      "type": "object"
    },
--- pinned/create_merge_request
+++ observed/create_merge_request
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Labels for the MR",
          "items": {
+       "project_id",
        "title",
        "source_branch",
-       "target_branch",
-       "project_id"
+       "target_branch"
      ],
      "type": "object"
    },
--- pinned/create_merge_request_discussion_note
+++ observed/create_merge_request_discussion_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "body",
        "project_id",
        "merge_request_iid",
-       "discussion_id"
+       "discussion_id",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_merge_request_emoji_reaction
+++ observed/create_merge_request_emoji_reaction
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "name",
        "project_id",
-       "merge_request_iid"
+       "merge_request_iid",
+       "name"
      ],
      "type": "object"
    },
--- pinned/create_merge_request_note
+++ observed/create_merge_request_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "body",
        "project_id",
-       "merge_request_iid"
+       "merge_request_iid",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_merge_request_note_emoji_reaction
+++ observed/create_merge_request_note_emoji_reaction
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "name",
        "project_id",
        "merge_request_iid",
-       "note_id"
+       "note_id",
+       "name"
      ],
      "type": "object"
    },
--- pinned/create_merge_request_thread
+++ observed/create_merge_request_thread
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "body",
        "project_id",
-       "merge_request_iid"
+       "merge_request_iid",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_note
+++ observed/create_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "noteable_iid": {
          "description": "IID of the issue or merge request",
          "type": "string"
-       "noteable_type",
-       "body",
        "project_id",
-       "noteable_iid"
+       "noteable_type",
+       "noteable_iid",
+       "body"
      ],
      "type": "object"
    },
--- pinned/create_or_update_file
+++ observed/create_or_update_file
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "last_commit_id": {
          "description": "Last known file commit ID",
          "type": "string"
+       "project_id",
        "file_path",
        "content",
        "commit_message",
-       "branch",
-       "project_id"
+       "branch"
      ],
      "type": "object"
    },
--- pinned/create_repository
+++ observed/create_repository
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "Repository name",
          "type": "string"
+         "maximum": 9007199254740991,
          "minimum": 1,
          "type": "integer"
        },
--- pinned/delete_branch
+++ observed/delete_branch
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "branch_name",
-       "project_id"
+       "project_id",
+       "branch_name"
      ],
      "type": "object"
    },
--- pinned/delete_draft_note
+++ observed/delete_draft_note
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/delete_issue
+++ observed/delete_issue
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/delete_issue_emoji_reaction
+++ observed/delete_issue_emoji_reaction
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
--- pinned/delete_issue_link
+++ observed/delete_issue_link
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/delete_issue_note_emoji_reaction
+++ observed/delete_issue_note_emoji_reaction
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "note_id": {
          "description": "The ID of a note (comment or thread reply)",
          "type": "string"
--- pinned/delete_label
+++ observed/delete_label
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "label_id": {
          "description": "The ID or title of a project's label",
          "type": "string"
--- pinned/delete_merge_request_discussion_note
+++ observed/delete_merge_request_discussion_note
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/delete_merge_request_emoji_reaction
+++ observed/delete_merge_request_emoji_reaction
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/delete_merge_request_note
+++ observed/delete_merge_request_note
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/delete_merge_request_note_emoji_reaction
+++ observed/delete_merge_request_note_emoji_reaction
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/discover_tools
+++ observed/discover_tools
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
+   "description": "Discover and activate additional tool categories for this session. Available categories: merge_requests, issues, repositories, branches, projects, labels, ci, groups, pipelines, milestones, wiki, releases, tags, snippets, users, workitems, webhooks, search, variables, dependency_proxy, vulnerabilities, orbit. Already-active categories are listed in the response. Use this when a needed opt-in category is not currently exposed; omit `category` to inspect available categories, then call it with a category to activate that group for the current session. It changes only the session's tool registry, returns the active-tool summary, and does not change GitLab data.",
    "inputSchema": {
      "properties": {
        "category": {
+       },
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
        }
      },
      "type": "object"
--- pinned/download_attachment
+++ observed/download_attachment
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "local_path": {
          "description": "Local path to save the file (optional, defaults to current directory)",
          "type": "string"
--- pinned/fork_repository
+++ observed/fork_repository
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "namespace": {
          "description": "Namespace to fork to (full path)",
          "type": "string"
--- pinned/get_branch
+++ observed/get_branch
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "branch_name",
-       "project_id"
+       "project_id",
+       "branch_name"
      ],
      "type": "object"
    },
--- pinned/get_branch_diffs
+++ observed/get_branch_diffs
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
+       "project_id",
        "from",
-       "to",
-       "project_id"
+       "to"
      ],
      "type": "object"
    },
--- pinned/get_ci_catalog_resource
+++ observed/get_ci_catalog_resource
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "version_limit": {
          "description": "Number of versions to include (default: 5, max: 20)",
          "maximum": 20,
--- pinned/get_commit
+++ observed/get_commit
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "sha",
-       "project_id"
+       "project_id",
+       "sha"
      ],
      "type": "object"
    },
--- pinned/get_commit_diff
+++ observed/get_commit_diff
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "sha",
-       "project_id"
+       "project_id",
+       "sha"
      ],
      "type": "object"
    },
--- pinned/get_draft_note
+++ observed/get_draft_note
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/get_file_blame
+++ observed/get_file_blame
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        },
        "range_start": {
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        },
        "ref": {
+       "project_id",
        "file_path",
        "ref"
      ],
--- pinned/get_file_contents
+++ observed/get_file_contents
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "path": {
          "description": "Alias of file_path",
          "type": "string"
--- pinned/get_issue
+++ observed/get_issue
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone object. Use this for a known resource or result; choose the corresponding list or search tool when you need to discover multiple resources. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "Get details of a specific issue. Returns a slim milestone by default; set full_response=true for the complete milestone object. Use this for issue management: inspect one issue's fields; use `list_issues` or `my_issues` to discover issues first. It is read-only, requires issue read permission, and returns the issue or an error when the identifier is invalid, the issue is missing, or access is denied.",
    "inputSchema": {
      "properties": {
        "full_response": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/get_issue_link
+++ observed/get_issue_link
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/get_label
+++ observed/get_label
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "label_id": {
          "description": "The ID or title of a project's label",
          "type": "string"
--- pinned/get_merge_request
+++ observed/get_merge_request
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/get_merge_request_approval_state
+++ observed/get_merge_request_approval_state
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of the merge request",
          "type": "string"
--- pinned/get_merge_request_conflicts
+++ observed/get_merge_request_conflicts
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of the merge request",
          "type": "string"
--- pinned/get_merge_request_diffs
+++ observed/get_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"

+ tool added: get_merge_request_discussion

--- pinned/get_merge_request_file_diff
+++ observed/get_merge_request_file_diff
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/get_merge_request_note
+++ observed/get_merge_request_note
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/get_merge_request_notes
+++ observed/get_merge_request_notes
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/get_merge_request_version
+++ observed/get_merge_request_version
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The internal ID of the merge request",
          "type": "string"
--- pinned/get_namespace
+++ observed/get_namespace
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "namespace_id": {
          "description": "Namespace ID or full path",
          "type": "string"
--- pinned/get_project
+++ observed/get_project
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/get_project_events
+++ observed/get_project_events
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Returns the specified results page. Default: 1",
          "type": "number"
--- pinned/get_protected_branch
+++ observed/get_protected_branch
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "branch_name",
-       "project_id"
+       "project_id",
+       "branch_name"
      ],
      "type": "object"
    },
--- pinned/get_repository_tree
+++ observed/get_repository_tree
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page_token": {
          "description": "Token for keyset pagination. Use the next_page_token value returned in the previous response to retrieve the next page.",
          "type": "string"
--- pinned/get_user
+++ observed/get_user
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "user_id": {
          "description": "The ID of the user",
          "type": "string"
--- pinned/get_users
+++ observed/get_users
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "usernames": {
          "description": "Array of usernames to search for",
          "items": {
--- pinned/health_check
+++ observed/health_check
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "Verify server status and authentication. When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.",
+   "description": "Verify server status and authentication. Always reports the MCP server version (mcp_server_version). When authenticated, also reports the GitLab instance version from GET /api/v4/version (version, revision, enterprise). Version lookup failures do not fail the health check — those fields are omitted. Use this to verify server connectivity and authentication before making GitLab requests; use `whoami` when the authenticated user's identity is the goal. It does not mutate GitLab state and returns server/authentication status plus GitLab version details when available.",
    "inputSchema": {
-     "properties": {},
+     "properties": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       }
+     },
      "type": "object"
    },
    "name": "health_check"
--- pinned/list_branches
+++ observed/list_branches
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_ci_catalog_resources
+++ observed/list_ci_catalog_resources
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "scope": {
          "description": "Catalog resource scope",
          "enum": [
--- pinned/list_commit_statuses
+++ observed/list_commit_statuses
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "name": {
          "description": "Filter statuses by status name or context",
          "type": "string"
-       "sha",
-       "project_id"
+       "project_id",
+       "sha"
      ],
      "type": "object"
    },
--- pinned/list_commits
+++ observed/list_commits
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "order": {
          "description": "List commits in order",
          "enum": [
--- pinned/list_draft_notes
+++ observed/list_draft_notes
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/list_events
+++ observed/list_events
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Returns the specified results page. Default: 1",
          "type": "number"
--- pinned/list_group_iterations
+++ observed/list_group_iterations
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_group_members
+++ observed/list_group_members
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_group_merge_requests
+++ observed/list_group_merge_requests
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names",
          "items": {
--- pinned/list_group_projects
+++ observed/list_group_projects
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "min_access_level": {
          "description": "Filter by minimum access level",
          "type": "number"
--- pinned/list_issue_discussions
+++ observed/list_issue_discussions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_issue_emoji_reactions
+++ observed/list_issue_emoji_reactions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
--- pinned/list_issue_links
+++ observed/list_issue_links
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/list_issue_note_emoji_reactions
+++ observed/list_issue_note_emoji_reactions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "note_id": {
          "description": "The ID of a note (comment or thread reply)",
          "type": "string"
--- pinned/list_issues
+++ observed/list_issues
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List issues (default: created by current user; use scope='all' for all). Use this for a collection of resources; choose the corresponding get tool when you already know the single resource to inspect. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List issues (default: created by current user; use scope='all' for all). Use this for issue management: list GitLab issues, optionally scoped with `project_id`. Use `get_issue` when the issue iid is already known and `my_issues` for issues assigned to the current user. It is read-only and paginated, requires issue read permission, and returns issue records or GitLab errors for invalid identifiers, missing resources, or rate limits.",
    "inputSchema": {
      "properties": {
        "assignee_id": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names",
          "items": {
--- pinned/list_labels
+++ observed/list_labels
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_merge_request_changed_files
+++ observed/list_merge_request_changed_files
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/list_merge_request_diffs
+++ observed/list_merge_request_diffs
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/list_merge_request_emoji_reactions
+++ observed/list_merge_request_emoji_reactions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/list_merge_request_note_emoji_reactions
+++ observed/list_merge_request_note_emoji_reactions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/list_merge_request_pipelines
+++ observed/list_merge_request_pipelines
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The internal ID of the merge request",
          "type": "string"
-       "merge_request_iid",
-       "project_id"
+       "project_id",
+       "merge_request_iid"
      ],
      "type": "object"
    },
--- pinned/list_merge_request_versions
+++ observed/list_merge_request_versions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The internal ID of the merge request",
          "type": "string"
--- pinned/list_merge_requests
+++ observed/list_merge_requests
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names",
          "items": {
--- pinned/list_namespaces
+++ observed/list_namespaces
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "owned": {
          "description": "Filter for namespaces owned by current user",
          "type": "boolean"
--- pinned/list_project_members
+++ observed/list_project_members
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_projects
+++ observed/list_projects
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "membership": {
          "description": "Filter for projects where current user is a member",
          "type": "boolean"
--- pinned/list_protected_branches
+++ observed/list_protected_branches
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/list_todos
+++ observed/list_todos
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/mark_all_todos_done
+++ observed/mark_all_todos_done
  {
    "annotations": {
      "openWorldHint": true
-     "properties": {},
+     "properties": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       }
+     },
      "type": "object"
    },
    "name": "mark_all_todos_done"
--- pinned/mark_todo_done
+++ observed/mark_todo_done
  {
    "annotations": {
      "openWorldHint": true
+       },
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
        }
      },
      "required": [
--- pinned/merge_merge_request
+++ observed/merge_merge_request
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_commit_message": {
          "description": "Custom merge commit message",
          "type": "string"
--- pinned/mr_discussions
+++ observed/mr_discussions
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/my_issues
+++ observed/my_issues
  {
    "annotations": {
      "openWorldHint": true,
-   "description": "List issues assigned to the authenticated user. Use this for the specific operation described; choose a sibling tool when you need a different resource or lifecycle action. It is read-only and does not mutate GitLab data; missing resources, invalid identifiers, insufficient permission, and rate limits are returned as errors. When `project_id` or `group_id` is accepted, provide the numeric ID or complete URL-encoded path described by the schema; use required identifiers and pagination fields exactly as documented.",
+   "description": "List issues assigned to the authenticated user. Use this for issue management: list issues assigned to the authenticated user. Use `list_issues` for project-wide or author-scoped listing and `get_issue` for one issue. It is read-only and paginated, requires authentication, and returns assigned issue records or permission/rate-limit errors.",
    "inputSchema": {
      "properties": {
        "created_after": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names to filter by",
          "items": {
--- pinned/protect_branch
+++ observed/protect_branch
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_access_level": {
          "description": "Access level for merging (0=No access, 30=Developer, 40=Maintainer, 60=Admin). GitLab default applies when omitted.",
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        },
        "name": {
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        },
        "unprotect_access_level": {
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        }
      },
+       "project_id",
        "branch_name"
      ],
      "type": "object"
--- pinned/publish_draft_note
+++ observed/publish_draft_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/push_files
+++ observed/push_files
  {
    "annotations": {
      "destructiveHint": true,
-           "additionalProperties": false,
            "properties": {
              "action": {
                "description": "Commit action for this file. Defaults to 'create'.",
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
+       "project_id",
        "branch",
        "files",
-       "commit_message",
-       "project_id"
+       "commit_message"
      ],
      "type": "object"
    },
--- pinned/resolve_merge_request_thread
+++ observed/resolve_merge_request_thread
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/search_repositories
+++ observed/search_repositories
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "page": {
          "description": "Page number for pagination (default: 1)",
          "type": "number"
--- pinned/unapprove_merge_request
+++ observed/unapprove_merge_request
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of the merge request to unapprove",
          "type": "string"
--- pinned/unprotect_branch
+++ observed/unprotect_branch
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "branch_name",
-       "project_id"
+       "project_id",
+       "branch_name"
      ],
      "type": "object"
    },
--- pinned/update_default_branch
+++ observed/update_default_branch
  {
    "annotations": {
      "destructiveHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or complete URL-encoded path to project",
          "type": "string"
-       "default_branch",
-       "project_id"
+       "project_id",
+       "default_branch"
      ],
      "type": "object"
    },
--- pinned/update_draft_note
+++ observed/update_draft_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
--- pinned/update_issue
+++ observed/update_issue
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Array of label names",
          "items": {
--- pinned/update_issue_description_patch
+++ observed/update_issue_description_patch
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "patch": {
          "description": "The patch content to apply to the issue description",
          "maxLength": 50000,
-       "patch_type",
-       "patch",
        "project_id",
-       "issue_iid"
+       "issue_iid",
+       "patch_type",
+       "patch"
      ],
      "type": "object"
    },
--- pinned/update_issue_note
+++ observed/update_issue_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "note_id": {
          "description": "The ID of a thread note",
          "type": "string"
+     "required": [
+       "project_id",
+       "issue_iid",
+       "discussion_id",
+       "note_id"
+     ],
      "type": "object"
    },
    "name": "update_issue_note"
--- pinned/update_label
+++ observed/update_label
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "label_id": {
          "description": "The ID or title of a project's label",
          "type": "string"
--- pinned/update_merge_request
+++ observed/update_merge_request
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "labels": {
          "description": "Labels for the MR",
          "items": {
--- pinned/update_merge_request_discussion_note
+++ observed/update_merge_request_discussion_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
+     "required": [
+       "project_id",
+       "merge_request_iid",
+       "discussion_id",
+       "note_id"
+     ],
      "type": "object"
    },
    "name": "update_merge_request_discussion_note"
--- pinned/update_merge_request_note
+++ observed/update_merge_request_note
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_request_iid": {
          "description": "The IID of a merge request",
          "type": "string"
-       "body",
        "project_id",
        "merge_request_iid",
-       "note_id"
+       "note_id",
+       "body"
      ],
      "type": "object"
    },
--- pinned/update_project
+++ observed/update_project
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "merge_method": {
          "description": "Merge method",
          "enum": [
+     "required": [
+       "project_id"
+     ],
      "type": "object"
    },
    "name": "update_project"
--- pinned/upload_markdown
+++ observed/upload_markdown
  {
    "annotations": {
      "openWorldHint": true
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path of the project",
          "type": "string"
--- pinned/validate_ci_lint
+++ observed/validate_ci_lint
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
-       "content",
-       "project_id"
+       "project_id",
+       "content"
      ],
      "type": "object"
    },
--- pinned/validate_project_ci_lint
+++ observed/validate_project_ci_lint
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "project_id": {
          "description": "Project ID or URL-encoded path",
          "type": "string"
--- pinned/verify_namespace
+++ observed/verify_namespace
  {
    "annotations": {
      "openWorldHint": true,
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       },
        "parent_id": {
          "description": "Parent namespace ID; required to correctly resolve paths in nested namespaces where the same path may exist under different parents",
+         "maximum": 9007199254740991,
+         "minimum": -9007199254740991,
          "type": "integer"
        },
        "path": {
--- pinned/whoami
+++ observed/whoami
  {
    "annotations": {
      "openWorldHint": true,
-     "properties": {},
+     "properties": {
+       "jmespath": {
+         "description": "Optional JMESPath expression filtering the JSON result before return.",
+         "type": "string"
+       }
+     },
      "type": "object"
    },
    "name": "whoami"

Current tools

Show all 39 tool fingerprints
create_issue
e84e65c2056afce6
create_issue_note
bca14717f6f10eb8
create_merge_request
2fbf078e619f5bf9
create_merge_request_thread
cef231a8511a0967
discover_tools
bb558050a87d4f06
get_branch
b2ca19c5ebef3c71
get_commit
61882d9082fdd1be
get_commit_diff
623cd32bff273be2
get_file_blame
cc5464f2f025ac28
get_file_contents
e5f59d140991a1fe
get_issue
01ef49442efb11e5
get_merge_request
5d444eb693974022
get_merge_request_approval_state
f0808c7c20330ee6
get_merge_request_diffs
195bce37481c0d3c
get_merge_request_discussion
119d49039f980f6d
get_merge_request_file_diff
aab926c3dd886ecd
get_merge_request_note
70fe8e416463a6d2
get_merge_request_notes
47767fc950b9deae
get_project
a7ef74f4cf92745f
get_repository_tree
be6856d3d30ffce6
health_check
cb333b28245cb4e4
list_branches
18976d0e29b375a9
list_commits
a64af7ccb23a6d7c
list_issue_discussions
037612291a818f11
list_issues
18d29c38c2232933
list_labels
69ecb960e17706cc
list_merge_request_changed_files
5e13784d610caabe
list_merge_request_diffs
402e710d03d6d5a9
list_merge_requests
f7c46c7a3e08901f
list_project_members
0a736c019b937978
list_projects
dd528d53537928aa
mr_discussions
27277f6801dcc2b0
my_issues
587880eef91d10d6
resolve_merge_request_thread
15aba81e4547a7f3
search_repositories
496b6aa23f59e4de
update_issue
f81deed0fc260193
update_issue_description_patch
441edd2d88d254c8
update_merge_request
8826dedbb0c4a7db
whoami
9b4093cc5531564e

Watch this server yourself

If you run this server, put the proxy in front of it. It pins these exact fingerprints on first connect and stops the session if they move.

npx -y mcp-pin@0.2.3 -- <your @zereight/mcp-gitlab command>

Or subscribe to this page's RSS feed to be told when it changes.

Badge

mcp-pin status badge for @zereight/mcp-gitlab

The badge states one fact about time and nothing else. It never claims a server is safe.

[![mcp-pin](https://mcp-pin.gautamkhosla.com/badge/4914d06c4a8c19cf.svg)](https://mcp-pin.gautamkhosla.com/servers/4914d06c4a8c19cf.html)