← GitLab MCP Server

GitLab MCP Server 2.2.4

npm · @ttpears/gitlab-mcp-server · current release

63
Tools
0
Resources
0
Templates
8
Prompts

Observation

Observed 2026-08-17T11:54:43.738Z using mcpSecurity-inventory. Status: succeeded. Negotiated protocol: 2025-06-18.

Server capabilities
{
  "tools": {},
  "prompts": {}
}

Tools 63

ToolCategoryAnnotationsRisk
analytics_group_summaryAggregated activity summary for an entire group (optionally including subgroups) over a time window — totals by action type (pushes, MRs opened/merged, comments, approvals), with breakdowns by project, by contributor, and by day. Use this to answer "what did this team do" without fanning out across list_project_events yourself.
Input schema
{
  "type": "object",
  "properties": {
    "group": {
      "type": "string",
      "minLength": 1,
      "description": "Group full path (e.g. \"my-group\" or \"my-group/sub-group\")"
    },
    "since": {
      "type": "string",
      "description": "ISO date/datetime, inclusive lower bound (e.g. \"2026-04-01\" or \"2026-04-01T00:00:00Z\")"
    },
    "until": {
      "type": "string",
      "description": "ISO date/datetime, inclusive upper bound. Defaults to now."
    },
    "includeSubgroups": {
      "type": "boolean",
      "default": true,
      "description": "Recurse into subgroup projects. Defaults to true."
    },
    "topContributors": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 10,
      "description": "Cap on the byUser[] list (sorted by event count desc). Default 10."
    },
    "maxEvents": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10000,
      "description": "Global cap on events fetched across all projects. Defaults to 2000; envelope flags truncated:true if reached."
    },
    "maxProjects": {
      "type": "integer",
      "minimum": 1,
      "maximum": 2000,
      "description": "Cap on projects scanned. Defaults to 500."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "group",
    "since"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
analytics_review_bottlenecksAggregate open (non-draft) merge requests across a group or project to surface review bottlenecks. Returns per-reviewer queue stats, age-bucket histogram, and the stalest MRs by updatedAt. MRs with no reviewer assigned are bucketed under "(unassigned)".
Input schema
{
  "type": "object",
  "properties": {
    "group": {
      "type": "string",
      "description": "Group full path (e.g. \"my-group\"). Mutually exclusive with `project`."
    },
    "project": {
      "type": "string",
      "description": "Project full path (e.g. \"my-group/my-project\"). Mutually exclusive with `group`."
    },
    "staleAfterDays": {
      "type": "integer",
      "minimum": 0,
      "default": 3,
      "description": "An MR counts as \"stale\" if its updatedAt is older than this many days. Default 3."
    },
    "topStalest": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 20,
      "description": "Cap on the stalest[] list. Default 20."
    },
    "maxMRs": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5000,
      "default": 1000,
      "description": "Hard cap on MRs scanned. Envelope flags `truncated:true` if reached."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
analytics_user_summaryAggregated activity summary for a user over a time window — totals by action type (pushes, MRs opened/merged, comments, approvals), breakdown by project and by day. Use this instead of list_user_events when you want counts rather than a raw event feed.
Input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "minLength": 1,
      "description": "Username (e.g. \"alice\") or numeric user ID"
    },
    "since": {
      "type": "string",
      "description": "ISO date/datetime, inclusive lower bound (e.g. \"2026-03-01\" or \"2026-03-01T00:00:00Z\")"
    },
    "until": {
      "type": "string",
      "description": "ISO date/datetime, inclusive upper bound. Defaults to now."
    },
    "maxEvents": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5000,
      "description": "Cap on events fetched. Defaults to 2000; returned envelope has truncated:true if reached."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "user",
    "since"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
browse_repositoryBrowse repository files and folders - essential for exploring codebase structure
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "path": {
      "type": "string",
      "default": "",
      "description": "Directory path to browse (empty for root)"
    },
    "ref": {
      "type": "string",
      "default": "HEAD",
      "description": "Git reference (branch, tag, or commit SHA)"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
create_broadcast_messageCreate a GitLab broadcast message. Requires administrator privileges on the GitLab instance.
Input schema
{
  "type": "object",
  "properties": {
    "message": {
      "type": "string",
      "minLength": 1,
      "description": "Message text to display"
    },
    "starts_at": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp when the message starts"
    },
    "ends_at": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp when the message ends"
    },
    "color": {
      "type": "string",
      "description": "Background color in hex format, e.g. \"#E75E40\""
    },
    "font": {
      "type": "string",
      "description": "Foreground (font) color in hex format"
    },
    "target_access_levels": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Access levels to target: 10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner"
    },
    "target_path": {
      "type": "string",
      "description": "Path glob for pages where the message should appear"
    },
    "broadcast_type": {
      "type": "string",
      "enum": [
        "banner",
        "notification"
      ],
      "description": "Broadcast type: \"banner\" or \"notification\""
    },
    "dismissable": {
      "type": "boolean",
      "description": "Whether users can dismiss the broadcast message"
    },
    "theme": {
      "type": "string",
      "description": "Theme name (GitLab 16.9+), e.g. \"indigo\", \"red\""
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "message"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
create_issueCreate a new issue in a GitLab project (requires user authentication with write permissions)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "description": "Title of the issue"
    },
    "description": {
      "type": "string",
      "description": "Description of the issue"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "title"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
create_merge_requestCreate a new merge request in a GitLab project (requires user authentication with write permissions)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "description": "Title of the merge request"
    },
    "sourceBranch": {
      "type": "string",
      "minLength": 1,
      "description": "Source branch name"
    },
    "targetBranch": {
      "type": "string",
      "minLength": 1,
      "description": "Target branch name"
    },
    "description": {
      "type": "string",
      "description": "Description of the merge request"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "title",
    "sourceBranch",
    "targetBranch"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
create_noteAdd a comment/note to an issue or merge request (requires user authentication)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "noteableType": {
      "type": "string",
      "enum": [
        "issue",
        "merge_request"
      ],
      "description": "Type of item to add a note to"
    },
    "iid": {
      "type": "string",
      "description": "Issue or merge request IID"
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "description": "Note body (supports Markdown)"
    },
    "internal": {
      "type": "boolean",
      "default": false,
      "description": "Whether the note is internal/confidential (only visible to project members)"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "noteableType",
    "iid",
    "body"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
delete_broadcast_messageDelete a GitLab broadcast message by ID. Requires administrator privileges.
Input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Broadcast message ID"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": true,
  "idempotentHint": true
}
Writes · Destructive
delete_issueDelete a GitLab issue. Requires a user token with permission to delete issues in the project (typically the issue author or a maintainer).
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "minLength": 1,
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "minLength": 1,
      "description": "Issue IID (the number shown in the GitLab UI, e.g. \"42\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": true,
  "idempotentHint": true
}
Writes · Destructive
delete_noteDelete a comment (note) on a GitLab issue or merge request. Requires a user token belonging to the note author or a maintainer.
Input schema
{
  "type": "object",
  "properties": {
    "noteId": {
      "type": "string",
      "minLength": 1,
      "description": "Note ID — either the bare numeric ID or the full GraphQL gid (gid://gitlab/Note/123)"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "noteId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": true,
  "idempotentHint": true
}
Writes · Destructive
execute_custom_queryExecute custom GraphQL queries for complex filtering (e.g., issues with assigneeUsernames: ["user"], labelName: ["bug"]). Use this for structured filtering by assignee/author/labels when search tools return 0 results. Use pagination and limit complexity to avoid timeouts.
Input schema
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "GraphQL query string. Example: query { issues(assigneeUsernames: [\"cdhanlon\"], state: opened, first: 50) { nodes { iid title webUrl } } }"
    },
    "variables": {
      "type": "object",
      "additionalProperties": {},
      "description": "Variables for the GraphQL query"
    },
    "requiresWrite": {
      "type": "boolean",
      "default": false,
      "description": "Hint that this needs write access. Mutations are auto-detected and always write-gated regardless of this flag."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
execute_rest_readExecute an arbitrary GET request against the GitLab REST API at /api/v4. Open-ended escape hatch for read endpoints not covered by a dedicated tool — e.g. /projects/:id/repository/files, /projects/:id/pipelines/:pipeline_id/test_report, /admin/*. Provide the path beginning with "/" (no host, no /api/v4 prefix) and an optional query object. For writes, use execute_rest_write.
Input schema
{
  "type": "object",
  "properties": {
    "path": {
      "type": "string",
      "minLength": 1,
      "description": "Path under /api/v4, beginning with \"/\" (e.g. \"/projects/42/issues\" or \"/projects/foo%2Fbar/repository/commits/HEAD\"). Must not include host, \"/api/v4\" prefix, or \"?\" query string."
    },
    "query": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      },
      "description": "Query string parameters (e.g. { state: \"opened\", per_page: 20 }). Values are coerced to strings."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "path"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
execute_rest_writeExecute an arbitrary POST/PUT/PATCH/DELETE request against the GitLab REST API at /api/v4. Open-ended escape hatch for write endpoints not covered by a dedicated tool. Destructive — DELETE is permitted, so check the path before invoking. For reads, use execute_rest_read.
Input schema
{
  "type": "object",
  "properties": {
    "method": {
      "type": "string",
      "enum": [
        "POST",
        "PUT",
        "PATCH",
        "DELETE"
      ],
      "description": "HTTP method. DELETE is destructive and not reversible."
    },
    "path": {
      "type": "string",
      "minLength": 1,
      "description": "Path under /api/v4, beginning with \"/\" (e.g. \"/projects/42/issues\" or \"/projects/foo%2Fbar/merge_requests/3/merge\"). Must not include host, \"/api/v4\" prefix, or \"?\" query string."
    },
    "body": {
      "description": "Request body — JSON-serialized as application/json. Omit for endpoints that don't take a body (most DELETE / some PUT)."
    },
    "query": {
      "type": "object",
      "additionalProperties": {
        "type": [
          "string",
          "number",
          "boolean"
        ]
      },
      "description": "Query string parameters. Most write endpoints take their args in the body, but a few mix."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "method",
    "path"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": true,
  "idempotentHint": false
}
Writes · Destructive
get_available_queriesGet list of available GraphQL queries and mutations from the GitLab schema
Input schema
{
  "type": "object",
  "properties": {
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_broadcast_messageGet a specific GitLab broadcast message by ID.
Input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Broadcast message ID"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_current_userGet information about the current authenticated GitLab user
Input schema
{
  "type": "object",
  "properties": {
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_file_contentGet the content of a specific file from a GitLab repository - crucial for code analysis
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "filePath": {
      "type": "string",
      "description": "Path to the file within the repository (e.g., \"src/main.js\")"
    },
    "ref": {
      "type": "string",
      "default": "HEAD",
      "description": "Git reference (branch, tag, or commit SHA)"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "filePath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_group_projectsList projects inside a GitLab group (optionally filter by search term)
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "minLength": 1,
      "description": "Group full path (e.g., \"group/subgroup\")"
    },
    "searchTerm": {
      "type": "string",
      "description": "Optional search term to filter group projects"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of projects to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_issue_contextBundle issue body, all notes (paginated up to maxNotes), related merge requests (mentioning), closing merge requests, linked issues (relates_to/blocks/is_blocked_by) into a single call. Use this instead of fanning out across get_issues + get_notes + search_merge_requests when investigating an issue.
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "minLength": 1,
      "description": "Full project path (e.g. \"my-group/my-project\")"
    },
    "iid": {
      "type": "string",
      "minLength": 1,
      "description": "Issue IID (the number shown in the GitLab UI)"
    },
    "maxNotes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 100,
      "description": "Cap on notes fetched. Default 100."
    },
    "includeSystemNotes": {
      "type": "boolean",
      "default": false,
      "description": "Include system-generated notes (label changes, assignment events). Default false."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_issuesGet issues from a specific GitLab project (read-only)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of issues to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "sort": {
      "type": "string",
      "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_request_commitsGet commits for a merge request (excluding merge commits), with commit count and details
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Merge request IID"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of commits to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_request_contextBundle MR body, all notes (paginated up to maxNotes, filtered to non-system by default), commits, pipeline summary, reviewers with approval state, and issues this MR will close into a single call. Use this instead of fanning out across get_merge_requests + get_notes + get_merge_request_commits + get_merge_request_pipelines when investigating an MR.
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "minLength": 1,
      "description": "Full project path (e.g. \"my-group/my-project\")"
    },
    "iid": {
      "type": "string",
      "minLength": 1,
      "description": "Merge request IID"
    },
    "maxNotes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 100,
      "description": "Cap on notes fetched. Default 100."
    },
    "maxCommits": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 50,
      "description": "Cap on commits fetched. Default 50."
    },
    "includeSystemNotes": {
      "type": "boolean",
      "default": false,
      "description": "Include system-generated notes. Default false."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_request_diffsGet diff statistics for a merge request, including per-file additions/deletions and diff refs
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Merge request IID"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_request_pipelinesGet CI/CD pipelines for a merge request, including status, duration, and stages
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Merge request IID"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of pipelines to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_request_reviewersGet approval and reviewer status for a merge request, including who approved and review states
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Merge request IID"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_merge_requestsGet merge requests from a specific GitLab project (read-only)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of merge requests to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "sort": {
      "type": "string",
      "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_notesGet notes (comments) on an issue or merge request, including system notes and inline MR comments
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "noteableType": {
      "type": "string",
      "enum": [
        "issue",
        "merge_request"
      ],
      "description": "Type of item to get notes for"
    },
    "iid": {
      "type": "string",
      "description": "Issue or merge request IID"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of notes to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "noteableType",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_pipeline_jobsGet jobs for a specific pipeline, including status, stage, duration, and retry/cancel info
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "pipelineIid": {
      "type": "string",
      "description": "Pipeline IID"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of jobs to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "pipelineIid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_projectGet detailed information about a specific GitLab project (read-only)
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_project_statisticsGet aggregate project statistics: open issues/MRs, star/fork counts, storage sizes, commit count, last pipeline status, release count, and language breakdown
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_projectsList projects accessible to the user (requires authentication to see private projects)
Input schema
{
  "type": "object",
  "properties": {
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of projects to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "sort": {
      "type": "string",
      "description": "GitLab project sort string (e.g., latest_activity_desc, created_desc, name_asc, stars_desc). Defaults to latest_activity_desc for recency."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_time_trackingGet time tracking data (estimate, spent, timelogs) for an issue or merge request
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "resourceType": {
      "type": "string",
      "enum": [
        "issue",
        "merge_request"
      ],
      "description": "Type of resource to get time tracking for"
    },
    "iid": {
      "type": "string",
      "description": "Issue or merge request IID"
    },
    "includeTimelogs": {
      "type": "boolean",
      "default": true,
      "description": "Whether to include individual timelog entries"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of timelog entries to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "resourceType",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_type_fieldsList available fields on a GraphQL type using introspected schema (requires schema to be introspected)
Input schema
{
  "type": "object",
  "properties": {
    "typeName": {
      "type": "string",
      "minLength": 1,
      "description": "GraphQL type name (e.g., \"Project\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "typeName"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_user_issuesGet all issues assigned to a specific user - uses proper GraphQL filtering for reliable results
Input schema
{
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "description": "Username to find issues for (e.g., \"cdhanlon\")"
    },
    "state": {
      "type": "string",
      "default": "opened",
      "description": "Filter by issue state (opened, closed, all)"
    },
    "projectPath": {
      "type": "string",
      "description": "Optional: limit search to a specific project"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of issues to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "username"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_user_merge_requestsGet merge requests for a specific user (as author or assignee) - uses proper GraphQL filtering
Input schema
{
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "description": "Username to find merge requests for (e.g., \"cdhanlon\")"
    },
    "role": {
      "type": "string",
      "enum": [
        "author",
        "assignee"
      ],
      "default": "author",
      "description": "Whether to find MRs authored by or assigned to the user"
    },
    "state": {
      "type": "string",
      "default": "opened",
      "description": "Filter by MR state (opened, closed, merged, all)"
    },
    "projectPath": {
      "type": "string",
      "description": "Optional: limit search to a specific project"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of merge requests to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "username"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
get_work_itemFetch a GitLab work item (issue, task, epic, incident, OKR) by global ID. Returns the raw widgets array so epic hierarchy, health status, iteration, milestone, and dates are all visible. Accepts either a numeric id or a full gid (gid://gitlab/WorkItem/123).
Input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Work item ID — numeric (e.g. \"123\") or full gid (e.g. \"gid://gitlab/WorkItem/123\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_broadcast_messagesList all GitLab broadcast messages (instance-wide announcements). Read-only.
Input schema
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number (1-based)"
    },
    "perPage": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Results per page"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_group_membersList group members with access levels, optionally filtered by search term
Input schema
{
  "type": "object",
  "properties": {
    "groupPath": {
      "type": "string",
      "description": "Full path of the group (e.g., \"my-group\" or \"parent/child-group\")"
    },
    "search": {
      "type": "string",
      "description": "Optional search term to filter members by name or username"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of members to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "groupPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_iterationsList iterations (sprints) for a group with cadence info. Requires GitLab Premium/Ultimate.
Input schema
{
  "type": "object",
  "properties": {
    "groupPath": {
      "type": "string",
      "description": "Full path of the group (e.g., \"my-group\" or \"parent/child-group\")"
    },
    "state": {
      "type": "string",
      "description": "Filter by state: upcoming, current, opened, closed (omit for all)"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of iterations to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "groupPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_milestonesList milestones for a project or group with progress statistics (total/closed issue counts)
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "description": "Full path of the project or group (e.g., \"group/project-name\" or \"group\")"
    },
    "isProject": {
      "type": "boolean",
      "description": "Whether the path is a project (true) or group (false)"
    },
    "state": {
      "type": "string",
      "description": "Filter by state: active, closed (omit for all)"
    },
    "search": {
      "type": "string",
      "description": "Search milestones by title"
    },
    "includeAncestors": {
      "type": "boolean",
      "default": false,
      "description": "Include milestones from ancestor groups"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of milestones to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath",
    "isProject"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_my_eventsList the authenticated user's GitLab activity feed — pushes, MRs, comments, approvals, issue actions. Primary tool for "what did I just do". Requires user authentication.
Input schema
{
  "type": "object",
  "properties": {
    "action": {
      "type": "string",
      "enum": [
        "approved",
        "closed",
        "commented",
        "created",
        "destroyed",
        "expired",
        "joined",
        "left",
        "merged",
        "pushed",
        "reopened",
        "updated"
      ],
      "description": "Filter by action type"
    },
    "target_type": {
      "type": "string",
      "enum": [
        "issue",
        "milestone",
        "merge_request",
        "note",
        "project",
        "snippet",
        "user"
      ],
      "description": "Filter by target resource type"
    },
    "before": {
      "type": "string",
      "description": "Only events before this date (YYYY-MM-DD)"
    },
    "after": {
      "type": "string",
      "description": "Only events after this date (YYYY-MM-DD)"
    },
    "sort": {
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ],
      "default": "desc",
      "description": "Sort order (default desc — newest first)"
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number (1-based)"
    },
    "per_page": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Results per page"
    },
    "scope": {
      "type": "string",
      "enum": [
        "all"
      ],
      "description": "Set to \"all\" to include events from any project you have access to, not just your own authored events"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_my_todosList the authenticated user's GitLab to-do items (notifications about issues, MRs, mentions, reviews requested, etc.). Filter by state, action, target type, or group/project. Requires user authentication.
Input schema
{
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "enum": [
        "pending",
        "done",
        "all"
      ],
      "default": "pending",
      "description": "Filter by todo state: pending (default), done, or all"
    },
    "action": {
      "type": "string",
      "description": "Filter by todo action — e.g. assigned, mentioned, build_failed, marked, approval_required, unmergeable, directly_addressed, review_requested"
    },
    "type": {
      "type": "string",
      "description": "Filter by target type — e.g. Issue, MergeRequest, Epic, Commit, DesignManagement::Design, AlertManagement::Alert"
    },
    "groupPath": {
      "type": "string",
      "description": "Limit to a group by full path (e.g. \"my-org/platform\"). Resolved to a node GID server-side before filtering."
    },
    "projectPath": {
      "type": "string",
      "description": "Limit to a project by full path (e.g. \"my-org/my-repo\"). Resolved to a node GID server-side before filtering."
    },
    "authorIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "description": "Filter by todo authors. Accepts numeric user IDs or full gid://gitlab/User/N strings."
    },
    "isSnoozed": {
      "type": "boolean",
      "description": "Filter by snooze state: true → only snoozed, false → only non-snoozed."
    },
    "sort": {
      "type": "string",
      "description": "Sort order — e.g. CREATED_DESC (default on server), CREATED_ASC, UPDATED_DESC, UPDATED_ASC."
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of todos to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_project_eventsList activity events for a single GitLab project — commits pushed, MRs opened/merged, issues touched, notes added. Accepts project full path or numeric ID.
Input schema
{
  "type": "object",
  "properties": {
    "project": {
      "type": "string",
      "minLength": 1,
      "description": "Project full path (e.g. \"group/my-project\") or numeric project ID"
    },
    "action": {
      "type": "string",
      "enum": [
        "approved",
        "closed",
        "commented",
        "created",
        "destroyed",
        "expired",
        "joined",
        "left",
        "merged",
        "pushed",
        "reopened",
        "updated"
      ],
      "description": "Filter by action type"
    },
    "target_type": {
      "type": "string",
      "enum": [
        "issue",
        "milestone",
        "merge_request",
        "note",
        "project",
        "snippet",
        "user"
      ],
      "description": "Filter by target resource type"
    },
    "before": {
      "type": "string",
      "description": "Only events before this date (YYYY-MM-DD)"
    },
    "after": {
      "type": "string",
      "description": "Only events after this date (YYYY-MM-DD)"
    },
    "sort": {
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ],
      "default": "desc",
      "description": "Sort order (default desc — newest first)"
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number (1-based)"
    },
    "per_page": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Results per page"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "project"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_user_eventsList a specific user's public GitLab activity feed by username or numeric ID. Use for tracking what a teammate has been working on.
Input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "minLength": 1,
      "description": "Username (e.g. \"alice\") or numeric user ID"
    },
    "action": {
      "type": "string",
      "enum": [
        "approved",
        "closed",
        "commented",
        "created",
        "destroyed",
        "expired",
        "joined",
        "left",
        "merged",
        "pushed",
        "reopened",
        "updated"
      ],
      "description": "Filter by action type"
    },
    "target_type": {
      "type": "string",
      "enum": [
        "issue",
        "milestone",
        "merge_request",
        "note",
        "project",
        "snippet",
        "user"
      ],
      "description": "Filter by target resource type"
    },
    "before": {
      "type": "string",
      "description": "Only events before this date (YYYY-MM-DD)"
    },
    "after": {
      "type": "string",
      "description": "Only events after this date (YYYY-MM-DD)"
    },
    "sort": {
      "type": "string",
      "enum": [
        "asc",
        "desc"
      ],
      "default": "desc",
      "description": "Sort order (default desc — newest first)"
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number (1-based)"
    },
    "per_page": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Results per page"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "user"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
list_work_itemsList work items within a namespace (group or project fullPath). Supports filtering by type (ISSUE, TASK, EPIC, INCIDENT, OBJECTIVE, KEY_RESULT) and state, plus cursor pagination and fetchAll.
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "description": "Namespace full path — group (e.g. \"my-group\") or project (e.g. \"my-group/my-project\")"
    },
    "types": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "ISSUE",
          "TASK",
          "EPIC",
          "INCIDENT",
          "OBJECTIVE",
          "KEY_RESULT",
          "TEST_CASE",
          "REQUIREMENT"
        ]
      },
      "description": "Filter by work item types. Omit for all types."
    },
    "state": {
      "type": "string",
      "enum": [
        "opened",
        "closed",
        "all"
      ],
      "description": "Filter by state. \"all\" returns every state."
    },
    "first": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Page size (default 20, capped by server maxPageSize)"
    },
    "after": {
      "type": "string",
      "description": "Cursor for next page"
    },
    "fetchAll": {
      "type": "boolean",
      "description": "Auto-paginate up to first items"
    },
    "sort": {
      "type": "string",
      "description": "Sort enum, e.g. UPDATED_DESC (default), CREATED_DESC, TITLE_ASC"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
manage_pipelineRetry or cancel a CI/CD pipeline (requires user authentication with write permissions)
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "pipelineIid": {
      "type": "string",
      "description": "Pipeline IID"
    },
    "action": {
      "type": "string",
      "enum": [
        "retry",
        "cancel"
      ],
      "description": "Action to perform on the pipeline"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "pipelineIid",
    "action"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": false
}
Writes · Non-destructive
mark_all_todos_doneMark pending to-do items as done for the authenticated user. With no arguments, marks every pending todo. Optional scoping args (groupPath, projectPath, action, type, authorIds, targetId) narrow which todos are marked. Irreversible without per-item restore_todo calls. Returns the actual list of updated todos.
Input schema
{
  "type": "object",
  "properties": {
    "groupPath": {
      "type": "string",
      "description": "Limit to a group by full path. Resolved to a node GID server-side."
    },
    "projectPath": {
      "type": "string",
      "description": "Limit to a project by full path. Resolved to a node GID server-side."
    },
    "action": {
      "type": "string",
      "description": "Limit to todos with this action (e.g. assigned, mentioned, review_requested)."
    },
    "type": {
      "type": "string",
      "description": "Limit to todos targeting this type (e.g. Issue, MergeRequest, Epic)."
    },
    "authorIds": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "description": "Limit to todos authored by these users. Numeric IDs or gid://gitlab/User/N strings."
    },
    "targetId": {
      "type": "string",
      "description": "Limit to todos for a single target (e.g. a specific issue/MR GID)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": true,
  "idempotentHint": true
}
Writes · Destructive
mark_todo_doneMark a single to-do item as done for the authenticated user. Requires the todo's ID (numeric or full gid://gitlab/Todo/N form) from list_my_todos.
Input schema
{
  "type": "object",
  "properties": {
    "todoId": {
      "type": "string",
      "minLength": 1,
      "description": "Todo ID — accepts a bare numeric ID (\"42\") or a full gid (\"gid://gitlab/Todo/42\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "todoId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive
resolve_pathResolve a GitLab path to either a project or group and list group projects when applicable
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "minLength": 1,
      "description": "Project or group full path (e.g., \"group/subgroup/project\")"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of items to retrieve when listing group projects"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
restore_todoRestore a previously-marked-done to-do item back to pending state. Accepts the todo's ID (numeric or full gid://gitlab/Todo/N form).
Input schema
{
  "type": "object",
  "properties": {
    "todoId": {
      "type": "string",
      "minLength": 1,
      "description": "Todo ID — accepts a bare numeric ID (\"42\") or a full gid (\"gid://gitlab/Todo/42\")"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "todoId"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive
search_gitlabText search across GitLab projects and issues (Note: Does not support filtering by assignee/labels - use search_issues for that. MRs cannot be searched globally - use search_merge_requests with username)
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Search term (leave empty for recent activity)"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of results to retrieve per category"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages per category in one call, up to ~100 items each — NOT exhaustive. For complete results, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_groupsSearch for GitLab groups and organizations
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Search term to find groups by name or path"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of groups to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "searchTerm"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_issuesSearch for issues with text search and/or structured filtering (assignee, author, labels, state). For filtering by assignee/author/labels without text search, leave searchTerm empty.
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Text search term (optional - leave empty to filter by assignee/author/labels only)"
    },
    "projectPath": {
      "type": "string",
      "description": "Optional project path (e.g., \"group/project\"). Omit for global search."
    },
    "state": {
      "type": "string",
      "default": "all",
      "description": "Filter by issue state (opened, closed, all)"
    },
    "assigneeUsernames": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Filter by assignee usernames (e.g., [\"cdhanlon\", \"jsmith\"])"
    },
    "authorUsername": {
      "type": "string",
      "description": "Filter by author username (e.g., \"cdhanlon\")"
    },
    "labelNames": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Filter by label names (e.g., [\"Priority::High\", \"bug\"])"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of issues to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "sort": {
      "type": "string",
      "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_labelsSearch for labels in a project or group, with optional text filtering
Input schema
{
  "type": "object",
  "properties": {
    "fullPath": {
      "type": "string",
      "description": "Full path of the project or group (e.g., \"group/project-name\" or \"group\")"
    },
    "isProject": {
      "type": "boolean",
      "description": "Whether the path is a project (true) or group (false)"
    },
    "search": {
      "type": "string",
      "description": "Optional search term to filter labels"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of labels to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "fullPath",
    "isProject"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_merge_requestsSearch merge requests by username (supports "username", "author:username", "assignee:username") or search within a specific project. Note: GitLab does not support global text search for MRs - use projectPath for text searches.
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Username (e.g., \"cdhanlon\", \"author:username\", \"assignee:username\") or text when projectPath provided"
    },
    "projectPath": {
      "type": "string",
      "description": "Project path (e.g., \"group/project\"). Required for text searches, optional for username searches."
    },
    "state": {
      "type": "string",
      "default": "all",
      "description": "Filter by merge request state (opened, closed, merged, all)"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of merge requests to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "sort": {
      "type": "string",
      "description": "Sort order (e.g., UPDATED_DESC, CREATED_DESC, CREATED_ASC). Defaults to UPDATED_DESC for recency."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "searchTerm"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_notesFull-text search across issue and merge request comments. Scope can be global, a project, or a group. NOTE: on self-hosted GitLab, the "notes" search scope requires Advanced Search (Elasticsearch) to be enabled — without it, this endpoint returns an error. search_gitlab does NOT search note bodies; this tool does.
Input schema
{
  "type": "object",
  "properties": {
    "search": {
      "type": "string",
      "minLength": 1,
      "description": "Search term. Trimmed; empty rejected."
    },
    "scope": {
      "type": "string",
      "enum": [
        "global",
        "project",
        "group"
      ],
      "default": "global",
      "description": "Search scope. Default global."
    },
    "projectPath": {
      "type": "string",
      "description": "Required when scope=project. Full project path."
    },
    "groupPath": {
      "type": "string",
      "description": "Required when scope=group. Full group path."
    },
    "perPage": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Results per page. Default 20."
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "default": 1,
      "description": "Page number. Default 1."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "search"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_projectsSearch for GitLab projects by name or description
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Search term to find projects by name or description"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of projects to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "searchTerm"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
search_usersSearch for GitLab users by username or name - useful for finding team members or contributors
Input schema
{
  "type": "object",
  "properties": {
    "searchTerm": {
      "type": "string",
      "description": "Search term to find users by username or name"
    },
    "first": {
      "type": "number",
      "minimum": 1,
      "maximum": 100,
      "default": 20,
      "description": "Number of users to retrieve"
    },
    "after": {
      "type": "string",
      "description": "Pagination cursor. To fetch the next page, pass the previous response pageInfo.endCursor here and repeat until pageInfo.hasNextPage is false. Paginating this way is the reliable path to complete results and accurate totals."
    },
    "fetchAll": {
      "type": "boolean",
      "default": false,
      "description": "Fetch multiple pages in one call, up to \"first\" items total (max 100) — NOT exhaustive. For complete results or accurate counts, leave this false and paginate via after (pageInfo.endCursor)."
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "searchTerm"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": true,
  "destructiveHint": false,
  "idempotentHint": true
}
Read only · Non-destructive
update_broadcast_messageUpdate an existing GitLab broadcast message. Requires administrator privileges.
Input schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "description": "Broadcast message ID"
    },
    "message": {
      "type": "string",
      "minLength": 1,
      "description": "Message text to display"
    },
    "starts_at": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp when the message starts"
    },
    "ends_at": {
      "type": "string",
      "format": "date-time",
      "description": "ISO 8601 timestamp when the message ends"
    },
    "color": {
      "type": "string",
      "description": "Background color in hex format, e.g. \"#E75E40\""
    },
    "font": {
      "type": "string",
      "description": "Foreground (font) color in hex format"
    },
    "target_access_levels": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "Access levels to target: 10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner"
    },
    "target_path": {
      "type": "string",
      "description": "Path glob for pages where the message should appear"
    },
    "broadcast_type": {
      "type": "string",
      "enum": [
        "banner",
        "notification"
      ],
      "description": "Broadcast type: \"banner\" or \"notification\""
    },
    "dismissable": {
      "type": "boolean",
      "description": "Whether users can dismiss the broadcast message"
    },
    "theme": {
      "type": "string",
      "description": "Theme name (GitLab 16.9+), e.g. \"indigo\", \"red\""
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "id"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive
update_issueUpdate an issue (title, description, assignees, labels, due date) with schema-aware mutations
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Issue IID (internal ID shown in the URL)"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "assigneeUsernames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "labelNames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "dueDate": {
      "type": "string",
      "description": "YYYY-MM-DD"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive
update_merge_requestUpdate a merge request (title, description, assignees, reviewers, labels) with schema-aware mutations
Input schema
{
  "type": "object",
  "properties": {
    "projectPath": {
      "type": "string",
      "description": "Full path of the project (e.g., \"group/project-name\")"
    },
    "iid": {
      "type": "string",
      "description": "Merge Request IID (internal ID shown in the URL)"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "assigneeUsernames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "reviewerUsernames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "labelNames": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "projectPath",
    "iid"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive
update_noteEdit the body of an existing comment (note) on a GitLab issue or merge request. Requires a user token belonging to the note author.
Input schema
{
  "type": "object",
  "properties": {
    "noteId": {
      "type": "string",
      "minLength": 1,
      "description": "Note ID — either the bare numeric ID or the full GraphQL gid (gid://gitlab/Note/123)"
    },
    "body": {
      "type": "string",
      "minLength": 1,
      "description": "New note body (Markdown supported)"
    },
    "userCredentials": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "gitlabUrl": {
              "type": "string",
              "format": "uri"
            },
            "accessToken": {
              "type": "string",
              "minLength": 1
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Your GitLab credentials (optional — falls back to the configured env token if not provided)"
    }
  },
  "required": [
    "noteId",
    "body"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
Annotations
{
  "readOnlyHint": false,
  "destructiveHint": false,
  "idempotentHint": true
}
Writes · Non-destructive

Resources 0

Resource templates 0

Prompts 8

Let’s talk about MCP security.

Share your details and our security team will contact you.