gitlab_get_user_activity_feed
Retrieve a chronological feed of user activities including commits, issues, merge requests, and comments across GitLab projects to track engagement, monitor workflows, and generate reports.
Instructions
Retrieve user's complete activity/events timeline
Get chronological feed of all user activities including commits, issues, MRs, comments, and other interactions across all accessible projects.
Returns activity timeline with:
Event details: type, target, description
Timestamps: creation and update times
Project context: where activity occurred
Related objects: linked issues, MRs, commits
Action metadata: push details, comment excerpts
Use cases:
Track user engagement patterns
Monitor team member activities
Generate activity reports
Debug user workflow issues
Parameters:
user_id: Numeric user ID
username: Username string (use either user_id or username)
action: Filter by action type (created, updated, closed, merged, etc.)
target_type: Filter by target (Issue, MergeRequest, Project, etc.)
after: Events after this date (YYYY-MM-DD)
before: Events before this date (YYYY-MM-DD)
per_page: Results per page (default: 20)
page: Page number (default: 1)
Example: Get recent issue activities
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| user_id | No | Numeric user ID | |
| username | No | Username string | |
| action | No | Filter by action type | |
| target_type | No | Filter by target type | |
| after | No | Events after this date (YYYY-MM-DD) | |
| before | No | Events before this date (YYYY-MM-DD) | |
| per_page | No | Number of results per page Type: integer Range: 1-100 Default: 20 Example: 50 (for faster browsing) Tip: Use smaller values (10-20) for detailed operations, larger (50-100) for listing | |
| page | No | Page number for pagination Type: integer Range: ≥1 Default: 1 Example: 3 (to get the third page of results) Note: Use with per_page to navigate large result sets |
Implementation Reference
- src/mcp_gitlab/tool_handlers.py:699-720 (handler)The primary handler function for the gitlab_get_user_activity_feed tool. It parses input arguments using helper functions and calls the underlying GitLabClient.get_user_activity_feed method to retrieve and return the user's recent activity events.def handle_get_user_activity_feed(client: GitLabClient, arguments: Optional[Dict[str, Any]]) -> Dict[str, Any]: """Handle getting user activity feed""" user_id = get_argument(arguments, "user_id") username = get_argument(arguments, "username") action = get_argument(arguments, "action") target_type = get_argument(arguments, "target_type") after = get_argument(arguments, "after") before = get_argument(arguments, "before") per_page = get_argument(arguments, "per_page", DEFAULT_PAGE_SIZE) page = get_argument(arguments, "page", 1) return client.get_user_activity_feed( user_id=user_id, username=username, action=action, target_type=target_type, after=after, before=before, per_page=per_page, page=page )
- Pydantic/MCP schema definition for the tool, including input schema with properties like username (required), action, target_type, pagination parameters, and enums for filtering user events.types.Tool( name=TOOL_GET_USER_ACTIVITY_FEED, description=desc.DESC_GET_USER_ACTIVITY_FEED, inputSchema={ "type": "object", "properties": { "username": {"type": "string", "description": "Username string"}, "action": {"type": "string", "description": "Event action type", "enum": ["created", "updated", "closed", "reopened", "pushed", "commented", "merged", "joined", "left", "destroyed", "expired", "approved"]}, "target_type": {"type": "string", "description": "Event target type", "enum": ["issue", "milestone", "merge_request", "note", "project", "snippet", "user", "wiki"]}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": SMALL_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} }, "required": ["username"] } ),
- src/mcp_gitlab/tool_handlers.py:1077-1077 (registration)Maps the tool name constant to its handler function in the central TOOL_HANDLERS dictionary, which is used by server.py's @server.call_tool() dispatcher to route tool calls.TOOL_GET_USER_ACTIVITY_FEED: handle_get_user_activity_feed,
- src/mcp_gitlab/server.py:47-720 (registration)Imports the TOOL_HANDLERS dictionary in the main server.py file where tool dispatch occurs via TOOL_HANDLERS.get(name) in @server.call_tool().from .tool_handlers import TOOL_HANDLERS, get_project_id_or_detect from . import tool_descriptions as desc except ImportError as e: # Fallback imports for development/testing when package is not installed import sys import os from pathlib import Path # Add the parent directory to sys.path to allow imports src_path = Path(__file__).resolve().parent.parent sys.path.insert(0, str(src_path)) try: from mcp_gitlab.gitlab_client import GitLabClient, GitLabConfig from mcp_gitlab.git_detector import GitDetector from mcp_gitlab.utils import GitLabClientManager, sanitize_error, truncate_response from mcp_gitlab.constants import ( DEFAULT_GITLAB_URL, DEFAULT_PAGE_SIZE, SMALL_PAGE_SIZE, MAX_PAGE_SIZE, DEFAULT_MAX_BODY_LENGTH, MAX_RESPONSE_SIZE, LOG_LEVEL, LOG_FORMAT, JSON_LOGGING, ERROR_NO_TOKEN, ERROR_AUTH_FAILED, ERROR_NOT_FOUND, ERROR_RATE_LIMIT, ERROR_GENERIC, ERROR_NO_PROJECT, ERROR_INVALID_INPUT, TOOL_LIST_PROJECTS, TOOL_GET_PROJECT, TOOL_GET_CURRENT_PROJECT, TOOL_LIST_ISSUES, TOOL_LIST_MRS, TOOL_GET_MR_NOTES, TOOL_LIST_BRANCHES, TOOL_LIST_PIPELINES, TOOL_LIST_COMMITS, TOOL_LIST_REPOSITORY_TREE, TOOL_LIST_TAGS, TOOL_LIST_USER_EVENTS, TOOL_LIST_PROJECT_MEMBERS, TOOL_LIST_PROJECT_HOOKS, TOOL_LIST_RELEASES, TOOL_GET_CURRENT_USER, TOOL_GET_USER, TOOL_LIST_GROUPS, TOOL_GET_GROUP, TOOL_LIST_GROUP_PROJECTS, TOOL_LIST_SNIPPETS, TOOL_GET_SNIPPET, TOOL_CREATE_SNIPPET, TOOL_UPDATE_SNIPPET, TOOL_LIST_PIPELINE_JOBS, TOOL_DOWNLOAD_JOB_ARTIFACT, TOOL_LIST_PROJECT_JOBS, TOOL_SEARCH_USER, TOOL_GET_USER_DETAILS, TOOL_GET_MY_PROFILE, TOOL_GET_USER_CONTRIBUTIONS_SUMMARY, TOOL_GET_USER_ACTIVITY_FEED, TOOL_GET_USER_OPEN_MRS, TOOL_GET_USER_REVIEW_REQUESTS, TOOL_GET_USER_OPEN_ISSUES, TOOL_GET_USER_REPORTED_ISSUES, TOOL_GET_USER_RESOLVED_ISSUES, TOOL_GET_USER_COMMITS, TOOL_GET_USER_MERGE_COMMITS, TOOL_GET_USER_CODE_CHANGES_SUMMARY, TOOL_GET_USER_SNIPPETS, TOOL_GET_USER_ISSUE_COMMENTS, TOOL_GET_USER_MR_COMMENTS, TOOL_GET_USER_DISCUSSION_THREADS, TOOL_GET_USER_RESOLVED_THREADS ) from mcp_gitlab.tool_handlers import TOOL_HANDLERS, get_project_id_or_detect import mcp_gitlab.tool_descriptions as desc except ImportError: # If mcp_gitlab package doesn't exist, try direct imports from gitlab_client import GitLabClient, GitLabConfig from git_detector import GitDetector from utils import GitLabClientManager, sanitize_error, truncate_response from constants import ( DEFAULT_GITLAB_URL, DEFAULT_PAGE_SIZE, SMALL_PAGE_SIZE, MAX_PAGE_SIZE, DEFAULT_MAX_BODY_LENGTH, MAX_RESPONSE_SIZE, LOG_LEVEL, LOG_FORMAT, JSON_LOGGING, ERROR_NO_TOKEN, ERROR_AUTH_FAILED, ERROR_NOT_FOUND, ERROR_RATE_LIMIT, ERROR_GENERIC, ERROR_NO_PROJECT, ERROR_INVALID_INPUT, TOOL_LIST_PROJECTS, TOOL_GET_PROJECT, TOOL_GET_CURRENT_PROJECT, TOOL_LIST_ISSUES, TOOL_LIST_MRS, TOOL_GET_MR_NOTES, TOOL_LIST_BRANCHES, TOOL_LIST_PIPELINES, TOOL_LIST_COMMITS, TOOL_LIST_REPOSITORY_TREE, TOOL_LIST_TAGS, TOOL_LIST_USER_EVENTS, TOOL_LIST_PROJECT_MEMBERS, TOOL_LIST_PROJECT_HOOKS, TOOL_LIST_RELEASES, TOOL_GET_CURRENT_USER, TOOL_GET_USER, TOOL_LIST_GROUPS, TOOL_GET_GROUP, TOOL_LIST_GROUP_PROJECTS, TOOL_LIST_SNIPPETS, TOOL_GET_SNIPPET, TOOL_CREATE_SNIPPET, TOOL_UPDATE_SNIPPET, TOOL_LIST_PIPELINE_JOBS, TOOL_DOWNLOAD_JOB_ARTIFACT, TOOL_LIST_PROJECT_JOBS, TOOL_SEARCH_USER, TOOL_GET_USER_DETAILS, TOOL_GET_MY_PROFILE, TOOL_GET_USER_CONTRIBUTIONS_SUMMARY, TOOL_GET_USER_ACTIVITY_FEED, TOOL_GET_USER_OPEN_MRS, TOOL_GET_USER_REVIEW_REQUESTS, TOOL_GET_USER_OPEN_ISSUES, TOOL_GET_USER_REPORTED_ISSUES, TOOL_GET_USER_RESOLVED_ISSUES, TOOL_GET_USER_COMMITS, TOOL_GET_USER_MERGE_COMMITS, TOOL_GET_USER_CODE_CHANGES_SUMMARY, TOOL_GET_USER_SNIPPETS, TOOL_GET_USER_ISSUE_COMMENTS, TOOL_GET_USER_MR_COMMENTS, TOOL_GET_USER_DISCUSSION_THREADS, TOOL_GET_USER_RESOLVED_THREADS ) from tool_handlers import TOOL_HANDLERS, get_project_id_or_detect import tool_descriptions as desc load_dotenv() # Configure logging based on environment settings if JSON_LOGGING: # Use python-json-logger for structured logging from pythonjsonlogger import jsonlogger handler = logging.StreamHandler() formatter = jsonlogger.JsonFormatter( fmt='%(timestamp)s %(level)s %(name)s %(message)s', rename_fields={'timestamp': 'asctime', 'level': 'levelname'} ) handler.setFormatter(formatter) # Configure root logger logging.root.handlers = [handler] logging.root.setLevel(getattr(logging, LOG_LEVEL.upper())) else: # Use traditional logging format logging.basicConfig( level=getattr(logging, LOG_LEVEL.upper()), format=LOG_FORMAT ) logger = logging.getLogger(__name__) server = Server("mcp-gitlab") client_manager = GitLabClientManager() def get_gitlab_client() -> GitLabClient: """Get GitLab client using singleton manager""" config = GitLabConfig( url=os.getenv("GITLAB_URL", DEFAULT_GITLAB_URL), private_token=os.getenv("GITLAB_PRIVATE_TOKEN"), oauth_token=os.getenv("GITLAB_OAUTH_TOKEN") ) return client_manager.get_client(config) @server.list_tools() async def handle_list_tools() -> List[types.Tool]: """List all available GitLab tools""" return [ # Project Management types.Tool( name=TOOL_LIST_PROJECTS, description=desc.DESC_LIST_PROJECTS, inputSchema={ "type": "object", "properties": { "owned": {"type": "boolean", "description": desc.DESC_OWNED_PROJECTS, "default": False}, "search": {"type": "string", "description": desc.DESC_SEARCH_TERM + " for projects"}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name=TOOL_GET_PROJECT, description=desc.DESC_GET_PROJECT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID_REQUIRED} }, "required": ["project_id"] } ), types.Tool( name=TOOL_GET_CURRENT_PROJECT, description=desc.DESC_GET_CURRENT_PROJECT, inputSchema={ "type": "object", "properties": { "path": {"type": "string", "description": desc.DESC_GIT_PATH} } } ), # Authentication & User Info types.Tool( name=TOOL_GET_CURRENT_USER, description=desc.DESC_GET_CURRENT_USER, inputSchema={ "type": "object", "properties": {} } ), types.Tool( name=TOOL_GET_USER, description=desc.DESC_GET_USER, inputSchema={ "type": "object", "properties": { "user_id": {"type": "integer", "description": desc.DESC_USER_ID}, "username": {"type": "string", "description": desc.DESC_USERNAME} } } ), # Group Management types.Tool( name=TOOL_LIST_GROUPS, description=desc.DESC_LIST_GROUPS, inputSchema={ "type": "object", "properties": { "search": {"type": "string", "description": desc.DESC_SEARCH_TERM + " for groups"}, "owned": {"type": "boolean", "description": desc.DESC_OWNED_GROUPS, "default": False}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name=TOOL_GET_GROUP, description=desc.DESC_GET_GROUP, inputSchema={ "type": "object", "properties": { "group_id": {"type": "string", "description": desc.DESC_GROUP_ID}, "with_projects": {"type": "boolean", "description": desc.DESC_WITH_PROJECTS, "default": False} }, "required": ["group_id"] } ), types.Tool( name=TOOL_LIST_GROUP_PROJECTS, description=desc.DESC_LIST_GROUP_PROJECTS, inputSchema={ "type": "object", "properties": { "group_id": {"type": "string", "description": desc.DESC_GROUP_ID}, "search": {"type": "string", "description": desc.DESC_SEARCH_TERM + " for projects"}, "include_subgroups": {"type": "boolean", "description": desc.DESC_INCLUDE_SUBGROUPS, "default": False}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} }, "required": ["group_id"] } ), # Issues types.Tool( name=TOOL_LIST_ISSUES, description=desc.DESC_LIST_ISSUES, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "state": {"type": "string", "description": desc.DESC_STATE_ISSUE, "enum": ["opened", "closed", "all"], "default": "opened"}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name="gitlab_get_issue", description=desc.DESC_GET_ISSUE, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "issue_iid": {"type": "integer", "description": desc.DESC_ISSUE_IID} }, "required": ["issue_iid"] } ), # Merge Requests types.Tool( name=TOOL_LIST_MRS, description=desc.DESC_LIST_MRS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "state": {"type": "string", "description": desc.DESC_STATE_MR, "enum": ["opened", "closed", "merged", "all"], "default": "opened"}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name="gitlab_get_merge_request", description=desc.DESC_GET_MR, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID} }, "required": ["mr_iid"] } ), types.Tool( name=TOOL_GET_MR_NOTES, description=desc.DESC_GET_MR_NOTES, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": SMALL_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1}, "sort": {"type": "string", "description": desc.DESC_SORT_ORDER, "enum": ["asc", "desc"], "default": "asc"}, "order_by": {"type": "string", "description": desc.DESC_ORDER_BY, "enum": ["created_at", "updated_at"], "default": "created_at"}, "max_body_length": {"type": "integer", "description": desc.DESC_MAX_BODY_LENGTH, "default": DEFAULT_MAX_BODY_LENGTH, "minimum": 0} }, "required": ["mr_iid"] } ), # Repository Files types.Tool( name="gitlab_get_file_content", description=desc.DESC_GET_FILE_CONTENT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "file_path": {"type": "string", "description": desc.DESC_FILE_PATH}, "ref": {"type": "string", "description": desc.DESC_REF} }, "required": ["file_path"] } ), types.Tool( name=TOOL_LIST_REPOSITORY_TREE, description=desc.DESC_LIST_TREE, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "path": {"type": "string", "description": desc.DESC_TREE_PATH, "default": ""}, "ref": {"type": "string", "description": desc.DESC_REF}, "recursive": {"type": "boolean", "description": desc.DESC_RECURSIVE, "default": False} } } ), # Snippets types.Tool( name=TOOL_LIST_SNIPPETS, description=desc.DESC_LIST_SNIPPETS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name=TOOL_GET_SNIPPET, description=desc.DESC_GET_SNIPPET, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "snippet_id": {"type": "integer", "description": desc.DESC_SNIPPET_ID} }, "required": ["snippet_id"] } ), types.Tool( name=TOOL_CREATE_SNIPPET, description=desc.DESC_CREATE_SNIPPET, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "title": {"type": "string", "description": desc.DESC_SNIPPET_TITLE}, "file_name": {"type": "string", "description": desc.DESC_SNIPPET_FILE_NAME}, "content": {"type": "string", "description": desc.DESC_SNIPPET_CONTENT}, "description": {"type": "string", "description": desc.DESC_SNIPPET_DESCRIPTION}, "visibility": {"type": "string", "description": desc.DESC_SNIPPET_VISIBILITY, "enum": ["private", "internal", "public"], "default": "private"} }, "required": ["title", "file_name", "content"] } ), types.Tool( name=TOOL_UPDATE_SNIPPET, description=desc.DESC_UPDATE_SNIPPET, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "snippet_id": {"type": "integer", "description": desc.DESC_SNIPPET_ID}, "title": {"type": "string", "description": desc.DESC_SNIPPET_TITLE}, "file_name": {"type": "string", "description": desc.DESC_SNIPPET_FILE_NAME}, "content": {"type": "string", "description": desc.DESC_SNIPPET_CONTENT}, "description": {"type": "string", "description": desc.DESC_SNIPPET_DESCRIPTION}, "visibility": {"type": "string", "description": desc.DESC_SNIPPET_VISIBILITY, "enum": ["private", "internal", "public"]} }, "required": ["snippet_id"] } ), # Commits types.Tool( name=TOOL_LIST_COMMITS, description=desc.DESC_LIST_COMMITS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "ref_name": {"type": "string", "description": desc.DESC_REF.replace("commit SHA", "tag name")}, "since": {"type": "string", "description": desc.DESC_DATE_SINCE}, "until": {"type": "string", "description": desc.DESC_DATE_UNTIL}, "path": {"type": "string", "description": desc.DESC_PATH_FILTER}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool( name="gitlab_get_commit", description=desc.DESC_GET_COMMIT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "commit_sha": {"type": "string", "description": desc.DESC_COMMIT_SHA}, "include_stats": {"type": "boolean", "description": desc.DESC_INCLUDE_STATS, "default": False} }, "required": ["commit_sha"] } ), types.Tool( name="gitlab_get_commit_diff", description=desc.DESC_GET_COMMIT_DIFF, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "commit_sha": {"type": "string", "description": "Commit SHA"} }, "required": ["commit_sha"] } ), # Search types.Tool( name="gitlab_search_projects", description=desc.DESC_SEARCH_PROJECTS, inputSchema={ "type": "object", "properties": { "search": {"type": "string", "description": desc.DESC_SEARCH_TERM}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} }, "required": ["search"] } ), types.Tool( name="gitlab_search_in_project", description=desc.DESC_SEARCH_IN_PROJECT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "scope": {"type": "string", "description": desc.DESC_SEARCH_SCOPE, "enum": ["issues", "merge_requests", "milestones", "notes", "wiki_blobs", "commits", "blobs"]}, "search": {"type": "string", "description": desc.DESC_SEARCH_TERM}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} }, "required": ["scope", "search"] } ), # Repository Info types.Tool( name=TOOL_LIST_BRANCHES, description=desc.DESC_LIST_BRANCHES, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": "Project ID or path (optional - auto-detects from git)"} } } ), types.Tool( name=TOOL_LIST_PIPELINES, description=desc.DESC_LIST_PIPELINES, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "ref": {"type": "string", "description": desc.DESC_BRANCH_TAG_REF} } } ), # User Events types.Tool( name=TOOL_LIST_USER_EVENTS, description=desc.DESC_LIST_USER_EVENTS, inputSchema={ "type": "object", "properties": { "username": {"type": "string", "description": desc.DESC_USERNAME}, "action": {"type": "string", "description": desc.DESC_ACTION_FILTER, "enum": ["commented", "pushed", "created", "closed", "opened", "merged", "joined", "left", "destroyed", "expired", "removed", "deleted", "approved", "updated", "uploaded", "downloaded"]}, "target_type": {"type": "string", "description": desc.DESC_TARGET_TYPE_FILTER, "enum": ["Note", "Issue", "MergeRequest", "Commit", "Project", "Snippet", "User", "WikiPage", "Milestone", "Discussion", "DiffNote"]}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1}, "after": {"type": "string", "description": desc.DESC_DATE_AFTER}, "before": {"type": "string", "description": desc.DESC_DATE_BEFORE} }, "required": ["username"] } ), # MR Lifecycle Tools types.Tool( name="gitlab_update_merge_request", description=desc.DESC_UPDATE_MR, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID}, "title": {"type": "string", "description": desc.DESC_TITLE}, "description": {"type": "string", "description": desc.DESC_DESCRIPTION}, "assignee_id": {"type": "integer", "description": desc.DESC_ASSIGNEE_ID}, "assignee_ids": {"type": "array", "items": {"type": "integer"}, "description": desc.DESC_ASSIGNEE_IDS}, "reviewer_ids": {"type": "array", "items": {"type": "integer"}, "description": desc.DESC_REVIEWER_IDS}, "labels": {"type": "string", "description": desc.DESC_LABELS}, "milestone_id": {"type": "integer", "description": desc.DESC_MILESTONE_ID}, "state_event": {"type": "string", "description": desc.DESC_STATE_EVENT, "enum": ["close", "reopen"]}, "remove_source_branch": {"type": "boolean", "description": desc.DESC_REMOVE_SOURCE_BRANCH}, "squash": {"type": "boolean", "description": desc.DESC_SQUASH}, "discussion_locked": {"type": "boolean", "description": desc.DESC_DISCUSSION_LOCKED}, "allow_collaboration": {"type": "boolean", "description": desc.DESC_ALLOW_COLLABORATION}, "target_branch": {"type": "string", "description": desc.DESC_TARGET_BRANCH} }, "required": ["mr_iid"] } ), types.Tool( name="gitlab_close_merge_request", description=desc.DESC_CLOSE_MR, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID} }, "required": ["mr_iid"] } ), types.Tool( name="gitlab_merge_merge_request", description=desc.DESC_MERGE_MR, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID}, "merge_when_pipeline_succeeds": {"type": "boolean", "description": desc.DESC_MERGE_WHEN_PIPELINE_SUCCEEDS, "default": False}, "should_remove_source_branch": {"type": "boolean", "description": desc.DESC_REMOVE_SOURCE_BRANCH}, "merge_commit_message": {"type": "string", "description": desc.DESC_MERGE_COMMIT_MESSAGE}, "squash_commit_message": {"type": "string", "description": desc.DESC_SQUASH_COMMIT_MESSAGE}, "squash": {"type": "boolean", "description": desc.DESC_SQUASH} }, "required": ["mr_iid"] } ), # Comment Tools types.Tool( name="gitlab_add_issue_comment", description=desc.DESC_ADD_ISSUE_COMMENT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "issue_iid": {"type": "integer", "description": desc.DESC_ISSUE_IID}, "body": {"type": "string", "description": desc.DESC_COMMENT_BODY} }, "required": ["issue_iid", "body"] } ), types.Tool( name="gitlab_add_merge_request_comment", description=desc.DESC_ADD_MR_COMMENT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID}, "body": {"type": "string", "description": desc.DESC_COMMENT_BODY} }, "required": ["mr_iid", "body"] } ), # Approval Tools types.Tool( name="gitlab_approve_merge_request", description=desc.DESC_APPROVE_MR, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID} }, "required": ["mr_iid"] } ), types.Tool( name="gitlab_get_merge_request_approvals", description=desc.DESC_GET_MR_APPROVALS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "mr_iid": {"type": "integer", "description": desc.DESC_MR_IID} }, "required": ["mr_iid"] } ), # Repository Tools types.Tool( name=TOOL_LIST_TAGS, description=desc.DESC_LIST_TAGS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "order_by": {"type": "string", "description": desc.DESC_ORDER_BY_TAG, "enum": ["name", "updated", "version", "semver"], "default": "updated"}, "sort": {"type": "string", "description": desc.DESC_SORT_ORDER, "enum": ["asc", "desc"], "default": "desc"} } } ), types.Tool( name="gitlab_create_commit", description=desc.DESC_CREATE_COMMIT, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "branch": {"type": "string", "description": desc.DESC_BRANCH}, "commit_message": {"type": "string", "description": desc.DESC_COMMIT_MESSAGE}, "actions": { "type": "array", "description": desc.DESC_ACTIONS, "items": { "type": "object", "properties": { "action": {"type": "string", "enum": ["create", "update", "delete", "move"]}, "file_path": {"type": "string"}, "content": {"type": "string"}, "previous_path": {"type": "string"}, "encoding": {"type": "string", "enum": ["text", "base64"], "default": "text"} }, "required": ["action", "file_path"] } }, "author_email": {"type": "string", "description": desc.DESC_AUTHOR_EMAIL}, "author_name": {"type": "string", "description": desc.DESC_AUTHOR_NAME} }, "required": ["branch", "commit_message", "actions"] } ), types.Tool( name="gitlab_compare_refs", description=desc.DESC_COMPARE_REFS, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "from_ref": {"type": "string", "description": desc.DESC_FROM_REF}, "to_ref": {"type": "string", "description": desc.DESC_TO_REF}, "straight": {"type": "boolean", "description": desc.DESC_STRAIGHT, "default": False} }, "required": ["from_ref", "to_ref"] } ), # Release and Member Tools types.Tool( name=TOOL_LIST_RELEASES, description=desc.DESC_LIST_RELEASES, inputSchema={ "type": "object", "properties": { "project_id": {"type": "string", "description": desc.DESC_PROJECT_ID}, "order_by": {"type": "string", "description": desc.DESC_ORDER_BY, "enum": ["released_at", "created_at"], "default": "released_at"}, "sort": {"type": "string", "description": desc.DESC_SORT_ORDER, "enum": ["asc", "desc"], "default": "desc"}, "per_page": {"type": "integer", "description": desc.DESC_PER_PAGE, "default": DEFAULT_PAGE_SIZE, "minimum": 1, "maximum": MAX_PAGE_SIZE}, "page": {"type": "integer", "description": desc.DESC_PAGE_NUMBER, "default": 1, "minimum": 1} } } ), types.Tool(
- src/mcp_gitlab/constants.py:255-255 (helper)Constant definition for the tool name string, used across handler registration, schema definitions, and server listings.TOOL_GET_USER_ACTIVITY_FEED = "gitlab_get_user_activity_feed"