Tool call generates an invalid json when fine-grained header is enabled
Overview
When the following request is executed:
curl -X POST "https://api.anthropic.com/v1/messages?beta=true" \
-H "Content-Type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: extended-cache-ttl-2025-04-11" \
-H "anthropic-beta: fine-grained-tool-streaming-2025-05-14" \
-H "anthropic-beta: context-1m-2025-08-07" \
-d @request.json
request.json
{
"model":"claude-sonnet-4-5-20250929",
"max_tokens":32768,
"messages":[
{
"role":"user",
"content":"\n\nexplain this project"
}
],
"temperature":0.0,
"system":[
{
"text":"You are GitLab Duo Chat, an AI coding assistant.\n\n<core_mission>\nYour primary role is collaborative programming and working alongside the USER to accomplish coding objectives.\n</core_mission>\n\n<gitlab_instance>\n<gitlab_instance_type>Self-Managed</gitlab_instance_type>\n<gitlab_instance_url>http://gdk.test:3000</gitlab_instance_url>\n<gitlab_instance_version>18.5.0</gitlab_instance_version>\n</gitlab_instance>\n\n<model_info>\n<model_name>Claude Sonnet 4.0 - Anthropic</model_name>\n</model_info>\n\n<communication_guidelines>\n- Provide clear and concise responses to user questions. Your responses appear in a chat panel with limited space\n- Users are context-switching between code and chat, so brevity and clarity are critical\n- Focus on providing the user with clean, practical solutions that help them make progress on their goals and tasks, as opposed to theoretical discussions of little practical value to the user.\n- Keep responses to user questions brief and to the point\n- One-word answers are perfect when they suffice\n- Expand your response only when users explicitly ask for explanations, you\\'re debugging complex multi-factor issues, discussing architecture trade-offs, or addressing security concerns\n- For ambiguous requests, ask specific clarifying questions while minimizing cognitive load for the user wherever possible. Example: If you need to know what the user\\'s module system is to accomplish a task, ask \"What module system would you prefer, ES6 modules or CommonJS?\"\n- When users correct you, acknowledge briefly and apply the correction immediately\n- Build on previous context and decisions without re-explaining them\n- When unable to complete requests, explain the limitation in a concise and to the point manner, and provide relevant alternatives to help the user continue making progress\n- CRITICAL: Use active, present-tense language to describe what you\\'re doing. Start with actions like \\'Analyzing...\\', \\'Processing...\\', \\'Examining...\\' instead of phrases like \\'Let me...\\', \\'Now let me\\', \\'I\\'ll...\\', or \\'I need to...\\'\n</communication_guidelines>\n\n<code_tools>\nWhen to Use Tools vs Code Blocks:\n- USE code editing tools when users ask to add, change, or remove code\n- SHOW code blocks only when users ask for coding suggestions, examples, or advice\n- Exception: Show code blocks when demonstrating multiple implementation options\n</code_tools>\n\n<tool_orchestration>\nExecute multiple tool operations in parallel for optimal performance. When\ngathering information or performing independent operations, run them\nsimultaneously rather than sequentially.\n\nParallel execution patterns:\n- Reading multiple files or searching different locations\n- Running multiple search queries with different patterns\n- Gathering various types of information about a codebase\n- Performing any independent operations that don\\'t depend on each other\n\nOnly use sequential execution when the output of one operation is required as\ninput for the next. Default to parallel execution - this provides 3-5x faster\nresponses and better user experience.\n\nWhen investigating issues or gathering context:\n- Plan your information needs upfront\n- Execute all necessary searches and reads together\n- Synthesize results comprehensively before responding\n- Prefer finding answers independently over asking for clarification\n\nIf tools fail or are blocked, determine if you can work around the issue or need user assistance with configuration.\n</tool_orchestration>\n\n<code_analysis>\nBefore Writing Any Code:\n1. Read existing files to understand context and preserve important logic\n2. Check dependencies exist before importing (look in package.json,\nrequirements.txt, etc.)\n3. Identify and match existing patterns:\n- Import style (named vs default exports)\n- Naming patterns (camelCase vs snake_case)\n- Component structure (functional vs class components)\n- File organization (where similar code lives)\n- Error handling approach (try/catch, error boundaries, etc.)\n</code_analysis>\n\n<code_standards>\nGeneral Purpose Solutions:\nWrite high-quality, general purpose solutions that work correctly for all valid\ninputs, not just test cases. Never hard-code values or create solutions that\nonly work for specific test inputs. Instead, implement the actual logic that\nsolves the problem generally.\n\nFocus on understanding the problem requirements and implementing the correct\nalgorithm. Tests verify correctness but don\\'t define the solution. Provide\nprincipled implementations that follow best practices and software design\nprinciples.\n\nCode Quality Requirements:\n- Make code immediately executable. No placeholders like \"// TODO: implement this\"\n- Match existing patterns: if the codebase uses `async/await`, don\\'t introduce `.then()` chains\n- For error handling: use the project\\'s established pattern\n- Follow the actual logic that solves problems, not just test requirements\n- Verify changes work as expected before completing the task\n\nFrontend Development:\nWhen creating user interfaces, don\\'t hold back - give it your all:\n- Include as many relevant features and interactions as possible\n- Add thoughtful details like hover states, transitions, and micro-interactions\n- Create impressive demonstrations showcasing web development capabilities\n- Apply design principles: hierarchy, contrast, balance, and movement\n- Use the project\\'s existing UI framework or library\n- Ensure accessibility: semantic HTML, alt text, keyboard navigation\n</code_standards>\n\n<file_creation_guidelines>\nCRITICAL: Use extended thinking for working through complex tasks rather than creating temporary files or scripts.\nNEVER add files with documentation, usage examples, or change summaries unless this type of file is explicitly requested by the USER.\n</file_creation_guidelines>\n\n<documentation_search_guidelines>\nWhen Gitlab documentation search results are returned:\n1. Incorporate information from the documentation into your response.\n2. ALWAYS include a \"Sources\" section at the end that lists each unique document title with its `source_url` in this format:\nSources:\n- [Document Title](SOURCE_URL)\n3. Do NOT include a \"Sources\" section if no documentation results with `source_url` were used.\n4. Never generate a \"Sources\" section for answers that come from code, memory, or user-provided context only.\n</documentation_search_guidelines>\n\n<examples>\n<example>\nuser: what logging mechanisms are available in this project\nassistant: Searching the project to identify the logging mechanisms available:\ntool: list_dir\ntool: find_files\ntool: grep\nassistant: Examining the key logging files to understand the mechanisms:\ntool: read_file\ntool: read_file\ntool: read_file\nassistant: Here are the logging mechanisms available in this project:\n- Structured Logging with Structlog\n The project uses structlog as the primary logging framework in structured_logging.py\n Configuration Options\n- Logging Configuration through environment variables (LOGGING__*)\n LOGGING__LEVEL: Log level (DEBUG, INFO, WARNING, ERROR)\n</example>\n\n<example>\nuser: does authorizer.rb have full test coverage?\nassistant: Finding authorizer.rb and its corresponding test file\ntool: find_files\ntool: find_files\ntool: read_file\ntool: read_file\nassistant: Running the tests to see the coverage:\ntool: run_command\nassistant: The authorizer.rb file has excellent test coverage. Fully covered methods:\n - `execute` - Extensively tested for multiple scenarios\n - `container` - Well-tested for the following scenarios\n - `resource` - Tested, but no scenario for when the current_user is already present.\n Would you like me to add tests for the resource method?\nuser: Yes\nassistant: Adding test coverage for the resource method in authorizer.rb\ntool: edit_file\nassistant: I\\'ve added test case for the `resource` method to cover the scenario where there is already a logged in user.\n</example>\n\n<example>\nuser: write code to resolve the bug in issue 1234\nassistant: Reading issue 1234.\ntool: read_issue\nassistant: Searching the codebase to find the root cause of of the bug:\ntool: find_files\ntool: read_file\nassistant: I\\'ve identified the root cause. Updating the code and adding a regression test for this behavior.\ntool: edit_file\ntool: edit_file\nassistant: Running the new test to make sure that it passes\ntool: run_command\nassistant: I identified the root cause of the bug described in issue 1234, fixed the bug, and backfilled test coverage.\n</example>\n</examples>",
"type":"text",
"cache_control":{
"type":"ephemeral",
"ttl":"1h"
}
},
{
"type":"text",
"text":"<system_status>\n<current_date>2025-10-08 (ISO 8601 format)</current_date>\n<current_time>15:31:10</current_time>\n<user_timezone>CEST</user_timezone>\n<project>\nInformation for the current GitLab project the USER is working on\n<project_id>3</project_id>\n<project_name>Gitlab Shell</project_name>\n<project_url>http://gdk.test:3000/gitlab-org/gitlab-shell</project_url>\n<project_languages>[{'name': 'Go', 'share': 92.67}, {'name': 'Ruby', 'share': 6.27}, {'name': 'Makefile', 'share': 0.78}, {'name': 'Shell', 'share': 0.26}, {'name': 'Dockerfile', 'share': 0.02}]</project_languages>\n</project>\n</system_status>"
}
],
"tools":[
{
"name":"list_issues",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"assignee_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues assigned to the given user ID. It can't be used together with assignee_usernames.\nNone returns unassigned issues. Any returns issues with an assignee."
},
"assignee_usernames":{
"anyOf":[
{
"items":{
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues assigned to the given username. This works like assignee_id but can't be used together with it. In GitLab CE,\nassignee_username can only have one value. If there's more than one, an error will be returned."
},
"author_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues created by the given user id.\nIt can't be used together with author_username.\nCombine with scope=all or scope=assigned_to_me."
},
"author_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues created by the given username.\nSimilar to author_id and it can't be used together with author_id.\nCombine with scope=all or scope=assigned_to_me."
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter confidential or public issues"
},
"created_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues created on or after the given time. Expected in ISO 8601 date and time format (YYYY-MM-DDTHH:MM:SSZ)"
},
"created_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues created on or before the given time. Expected in ISO 8601 date and time format (YYYY-MM-DDTHH:MM:SSZ)"
},
"due_date":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues that have no due date, are overdue, or whose due date is this week, this month, or between two weeks ago and next month.\nAccepts: 0 (no due date), any, today, tomorrow, overdue, week, month, next_month_and_previous_two_weeks."
},
"health_status":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues with the specified health_status. None returns issues with no\nhealth status assigned, and Any returns issues with a health status assigned."
},
"issue_type":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter to a given type of issue. One of issue, incident, test_case or task."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated list of label names, issues must have all labels to be returned.\nNone lists all issues with no labels. Any lists all issues with at least one label. Predefined names are case-insensitive."
},
"scope":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues for the given scope: created_by_me, assigned_to_me or all. Defaults to created_by_me."
},
"search":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search issues against their title and description"
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issues sorted in asc or desc order. Default is desc."
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return all issues or just those that are opened or closed"
},
"page":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number. Default is 1."
}
},
"type":"object"
},
"description":"List issues in a GitLab project.\n By default, only returns the first 20 issues - use page parameter to get complete results.\n\n To identify the project you must provide either:\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/issues\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/issues\n\n\n For example:\n - Given project_id 13, the tool call would be:\n list_issues(project_id=13)\n - Given the URL https://gitlab.com/namespace/project, the tool call would be:\n list_issues(url=\"https://gitlab.com/namespace/project\")\n "
},
{
"name":"get_issue",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"issue_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project issue. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Get a single issue in a GitLab project.\n\n To identify an issue you must provide either:\n- project_id and issue_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/issues/42\n - https://gitlab.com/group/subgroup/project/-/issues/42\n\n\n For example:\n - Given project_id 13 and issue_iid 9, the tool call would be:\n get_issue(project_id=13, issue_iid=9)\n - Given the URL https://gitlab.com/namespace/project/-/issues/103, the tool call would be:\n get_issue(url=https://gitlab.com/namespace/project/-/issues/103)\n "
},
{
"name":"list_issue_notes",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"issue_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project issue. Required if URL is not provided."
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issue notes sorted in asc or desc order. Default is desc"
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return issue notes ordered by created_at or updated_at fields. Default is created_at"
},
"page":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number. Default is 1."
}
},
"type":"object"
},
"description":"Get a list of issue notes (comments) for a specific issue.\n By default, only returns the first 20 issue notes - use page parameter to get complete results.\n\n To identify an issue you must provide either:\n- project_id and issue_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/issues/42\n - https://gitlab.com/group/subgroup/project/-/issues/42\n\n\n For example:\n - Given project_id 13 and issue_iid 9, the tool call would be:\n list_issue_notes(project_id=13, issue_iid=9)\n - Given the URL https://gitlab.com/namespace/project/-/issues/103, the tool call would be:\n list_issue_notes(url=\"https://gitlab.com/namespace/project/-/issues/103\")\n "
},
{
"name":"get_issue_note",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"issue_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project issue. Required if URL is not provided."
},
"note_id":{
"description":"The ID of the note",
"type":"integer"
}
},
"required":[
"note_id"
],
"type":"object"
},
"description":"Get a single note (comment) from a specific issue.\n\n To identify an issue you must provide either:\n- project_id and issue_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/issues/42\n - https://gitlab.com/group/subgroup/project/-/issues/42\n\n\n For example:\n - Given project_id 13, issue_iid 9, and note_id 5, the tool call would be:\n get_issue_note(project_id=13, issue_iid=9, note_id=5)\n - Given the URL https://gitlab.com/namespace/project/-/issues/103 and note_id 42, the tool call would be:\n get_issue_note(url=\"https://gitlab.com/namespace/project/-/issues/103\", note_id=42)\n\n The note_id parameter is always required.\n "
},
{
"name":"get_job_logs",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"job_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the job. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Get the trace for a job.\n\n Use this tool to get more details for specific jobs within a pipeline.\n\n To identify a job you must provide either:\n - project_id and job_id, or\n - A GitLab URL like:\n - https://gitlab.com/namespace/project/-/jobs/42\n - https://gitlab.com/group/subgroup/project/-/jobs/42\n\n For example:\n - Given project_id 13 and job_id 9, the tool call would be:\n get_job_logs(project_id=13, job_id=9)\n - Given the URL https://gitlab.com/namespace/project/-/jobs/103, the tool call would be:\n get_job_logs(url=\"https://gitlab.com/namespace/project/-/jobs/103\")\n\n You can obtain the project_id and job_id from the pipeline details.\n "
},
{
"name":"get_merge_request",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project merge request. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Fetch details about the merge request.\n\n To identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\n For example:\n - Given project_id 13 and merge_request_iid 9, the tool call would be:\n get_merge_request(project_id=13, merge_request_iid=9)\n - Given the URL https://gitlab.com/namespace/project/-/merge_requests/103, the tool call would be:\n get_merge_request(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\")\n "
},
{
"name":"get_pipeline_errors",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The IID of the merge request. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Get the logs for failed jobs in a pipeline.\n You can use this tool by passing in a merge request to get the failing jobs in the\n latest pipeline. You can also use this tool by identifying a pipeline directly.\n This tool can be used when you have a project_id and merge_request_iid.\n This tool can be used when you have a merge request URL.\n This tool can be used when you have a pipeline URL.\n Be careful to differentiate between a pipeline_id and a job_id when using this tool\n\n To identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\n To identify a pipeline you must provide:\n - A GitLab URL like:\n - https://gitlab.com/namespace/project/-/pipelines/33\n - https://gitlab.com/group/subgroup/project/-/pipelines/42\n\n For example:\n - Given project_id 13 and merge_request_iid 9, the tool call would be:\n get_pipeline_errors(project_id=13, merge_request_iid=9)\n - Given a merge request URL https://gitlab.com/namespace/project/-/merge_requests/103, the tool call would be:\n get_pipeline_errors(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\")\n - Given a pipeline URL https://gitlab.com/namespace/project/-/pipelines/33, the tool call would be:\n get_pipeline_errors(url=\"https://gitlab.com/namespace/project/-/pipelines/33\")\n "
},
{
"name":"get_project",
"input_schema":{
"properties":{
"project_id":{
"description":"Id of the project",
"type":"integer"
}
},
"required":[
"project_id"
],
"type":"object"
},
"description":"Fetch details about the project"
},
{
"name":"list_all_merge_request_notes",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project merge request. Required if URL is not provided."
}
},
"type":"object"
},
"description":"List all notes (comments) on a merge request.\n\n To identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\n For example:\n - Given project_id 13 and merge_request_iid 9, the tool call would be:\n list_all_merge_request_notes(project_id=13, merge_request_iid=9)\n - Given the URL https://gitlab.com/namespace/project/-/merge_requests/103, the tool call would be:\n list_all_merge_request_notes(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\")\n "
},
{
"name":"list_merge_request_diffs",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project merge request. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Fetch the diffs of the files changed in a merge request.\n\n To identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\n For example:\n - Given project_id 13 and merge_request_iid 9, the tool call would be:\n list_merge_request_diffs(project_id=13, merge_request_iid=9)\n - Given the URL https://gitlab.com/namespace/project/-/merge_requests/103, the tool call would be:\n list_merge_request_diffs(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\")\n "
},
{
"name":"gitlab_issue_search",
"input_schema":{
"properties":{
"id":{
"description":"The ID of the project or group",
"type":"string"
},
"search":{
"description":"The search term",
"type":"string"
},
"search_type":{
"description":"Whether to search in a project or a group",
"enum":[
"projects",
"groups"
],
"type":"string"
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Sort results. Allowed value is created_at"
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Sort order. Allowed values are asc or desc"
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by confidentiality"
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by state"
}
},
"required":[
"id",
"search",
"search_type"
],
"type":"object"
},
"description":"\n \n Search for issues in the specified GitLab project or group.\n\n Parameters:\n - id: The ID of the project or group. In GitLab, a namespace and group are used interchangeably,\n so either a group_id or namespace_id can be used to fill this argument. (required)\n - search_type: Whether to search in a project or a group (required)\n - search: The search term (required)\n - confidential: Filter by confidentiality\n - order_by: Sort results. Allowed value is created_at\n - sort: Sort order. Allowed values are asc or desc\n - state: Filter by state\n\n An example tool_call is presented below\n {\n \\'id\\': \\'toolu_01KqpqRQhTM2pxJrhtTscMWu\\',\n \\'name\\': \\'gitlab_issue_search\\',\n \\'type\\': \\'tool_use\\'\n \\'input\\': {\n \\'id\\': 123,\n \\'search_type\\': \\'projects\\',\n \\'scope\\': \\'issues\\',\n \\'search\\': \\'Duo Workflow\\',\n },\n }\n \n\n Search Term Syntax (for code search only):\n - filename: Search by filename: filename:*spec.rb\n - path: Search by repository location (full or partial matches): path:spec/workers/\n - extension: Search by file extension without . (exact matches only): extension:js\n - blob: Search by Git object ID (exact matches only): blob:998707*\n - Use quotes for exact phrase matches: \"exact phrase\"\n - Use + to specify AND condition: term1+term2\n - Use | for OR condition: term1|term2\n - Use - to exclude terms: -term\n - Use * for wildcard searches: ter*\n - Use \\ to escape special characters: \\#group\n - Use # for searching by issue or merge request ID: #123\n - Use ! for exact word match: !word\n - Use ~ followed by a number for fuzzy search: word~3\n - Parentheses can be used for grouping: (term1+term2)|term3\n\n Examples:\n - rails -filename:gemfile.lock: Returns rails in all files except the gemfile.lock file\n - RSpec.describe Resolvers -*builder: Returns RSpec.describe Resolvers that does not start with builder\n - bug | (display +banner): Returns bug or both display and banner\n - helper -extension:yml -extension:js: Returns helper in all files except files with a .yml or .js extension\n - helper path:lib/git: Returns helper in all files with a lib/git* path (for example, spec/lib/gitlab)\n - \"hello world\": Exact phrase match\n - hello+world: Contains both \"hello\" AND \"world\"\n - hello|world: Contains either \"hello\" OR \"world\"\n - hello -world: Contains \"hello\" but NOT \"world\"\n - hel*o: Matches \"hello\", \"helio\", etc.\n - \\#group: Searches for the literal \"#group\"\n - #123: Searches for issue or merge request with ID 123\n - !important: Matches the exact word \"important\"\n - hello~2: Fuzzy search for \"hello\" with up to 2 character differences\n - (hello+world)|\"greeting message\": Complex query\n\n Note: If a user is not a member of a private project or a private group, this tool is going to result in a 404 status code.\n "
},
{
"name":"gitlab_blob_search",
"input_schema":{
"properties":{
"id":{
"description":"The ID of the project or group",
"type":"string"
},
"search":{
"description":"The search term",
"type":"string"
},
"search_type":{
"description":"Whether to search in a project or a group",
"enum":[
"projects",
"groups"
],
"type":"string"
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Sort results. Allowed value is created_at"
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Sort order. Allowed values are asc or desc"
},
"ref":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The name of a repository branch or tag to search on (only applicable for project searches)"
}
},
"required":[
"id",
"search",
"search_type"
],
"type":"object"
},
"description":"\n \n Search for blobs in the specified GitLab group or project. In GitLab, a \"blob\" refers to a file\\'s content in a specific version of the repository.\n This can include source code files, text files, or any other file type stored in the repository.\n\n Parameters:\n - id: The ID of the project or group. In GitLab, a namespace and group are used interchangeably,\n so either a group_id or namespace_id can be used to fill this argument. (required)\n - search_type: Whether to search in a project or a group (required)\n - search: The search term (required)\n - ref: The name of a repository branch or tag to search on. Only applicable for projects search_type\n - order_by: Sort results. Allowed value is created_at\n - sort: Sort order. Allowed values are asc or desc\n\n An example tool_call is presented below\n {\n \\'id\\': \\'toolu_01KqpqRQhTM2pxJrhtTscMWu\\',\n \\'name\\': \\'gitlab_blob_search\\',\n \\'type\\': \\'tool_use\\'\n \\'input\\': {\n \\'id\\': 123,\n \\'search_type\\': \\'projects\\',\n \\'scope\\': \\'blobs\\',\n \\'search\\': \\'Duo Workflow\\',\n \\'ref\\': \\'main\\',\n },\n }\n \n\n Search Term Syntax (for code search only):\n - filename: Search by filename: filename:*spec.rb\n - path: Search by repository location (full or partial matches): path:spec/workers/\n - extension: Search by file extension without . (exact matches only): extension:js\n - blob: Search by Git object ID (exact matches only): blob:998707*\n - Use quotes for exact phrase matches: \"exact phrase\"\n - Use + to specify AND condition: term1+term2\n - Use | for OR condition: term1|term2\n - Use - to exclude terms: -term\n - Use * for wildcard searches: ter*\n - Use \\ to escape special characters: \\#group\n - Use # for searching by issue or merge request ID: #123\n - Use ! for exact word match: !word\n - Use ~ followed by a number for fuzzy search: word~3\n - Parentheses can be used for grouping: (term1+term2)|term3\n\n Examples:\n - rails -filename:gemfile.lock: Returns rails in all files except the gemfile.lock file\n - RSpec.describe Resolvers -*builder: Returns RSpec.describe Resolvers that does not start with builder\n - bug | (display +banner): Returns bug or both display and banner\n - helper -extension:yml -extension:js: Returns helper in all files except files with a .yml or .js extension\n - helper path:lib/git: Returns helper in all files with a lib/git* path (for example, spec/lib/gitlab)\n - \"hello world\": Exact phrase match\n - hello+world: Contains both \"hello\" AND \"world\"\n - hello|world: Contains either \"hello\" OR \"world\"\n - hello -world: Contains \"hello\" but NOT \"world\"\n - hel*o: Matches \"hello\", \"helio\", etc.\n - \\#group: Searches for the literal \"#group\"\n - #123: Searches for issue or merge request with ID 123\n - !important: Matches the exact word \"important\"\n - hello~2: Fuzzy search for \"hello\" with up to 2 character differences\n - (hello+world)|\"greeting message\": Complex query\n\n Note: If a user is not a member of a private project or a private group, this tool is going to result in a 404 status code.\n "
},
{
"name":"gitlab_merge_request_search",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"author_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests created by the given username. Mutually exclusive with author_id."
},
"author_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests created by the given user ID. Mutually exclusive with author_username."
},
"assignee_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests assigned to the given username. Mutually exclusive with assignee_id."
},
"assignee_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests assigned to the given user ID. Mutually exclusive with assignee_username."
},
"reviewer_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests with the given username as reviewer. Mutually exclusive with reviewer_id."
},
"reviewer_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests with the given user ID as reviewer. Mutually exclusive with reviewer_username."
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by state: 'opened', 'closed', 'locked', 'merged', or 'all'."
},
"milestone":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Returns merge requests for a specific milestone. 'None' returns merge requests with no milestone."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated list of label names. Returns merge requests matching all labels."
},
"search":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search merge requests against their title and description."
},
"scope":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by scope: 'created_by_me', 'assigned_to_me', or 'all'."
}
},
"type":"object"
},
"description":"List merge requests in a GitLab project.\n This tool supports filtering by author, assignee, reviewer, state, milestone, labels, and more.\n This tool also supports searching for merge requests against their title and description.\n Use this tool when you need to filter or search for merge requests by author or other specific criteria.\n\n To identify the project you must provide either:\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/merge_requests\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/merge_requests\n\n\n For example:\n - List merge requests by author username:\n gitlab_merge_request_search(project_id=13, author_username=\"janedoe1337\")\n - List merge requests assigned to a specific user:\n gitlab_merge_request_search(project_id=13, assignee_username=\"janedoe1337\")\n - List all open merge requests:\n gitlab_merge_request_search(project_id=13, state=\"opened\")\n - List merge requests with specific labels:\n gitlab_merge_request_search(project_id=13, labels=\"bug,urgent\")\n - Given the URL https://gitlab.com/namespace/project and author filter:\n gitlab_merge_request_search(url=\"https://gitlab.com/namespace/project\", author_username=\"janedoe1337\")\n - Search merge requests against their title and description\n gitlab_merge_request_search(project_id=13, search=\"bug fix\")\n "
},
{
"name":"gitlab_documentation_search",
"input_schema":{
"properties":{
"search":{
"description":"The search term",
"type":"string"
}
},
"required":[
"search"
],
"type":"object"
},
"description":"Find GitLab documentations,\n useful for answering questions concerning GitLab and its features, e.g.:\n projects, groups, issues, merge requests, epics, milestones, labels, CI/CD pipelines, git repositories, and more.\n\n Parameters:\n - search: The search term (required)\n\n An example tool_call is presented below\n {\n 'id': 'toolu_01KqpqRQhTM2pxJrhtTscMWu',\n 'name': 'gitlab_documentation_search',\n 'type': 'tool_use'\n 'input': {\n 'search': 'How do I set up a new project?',\n },\n }\n "
},
{
"name":"get_repository_file",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"ref":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The name of branch, tag or commit. Use HEAD to automatically use the default branch."
},
"file_path":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Full path to file, such as lib/class.rb."
}
},
"type":"object"
},
"description":"Get the contents of a file from a remote repository.\n\n To identify a file you must provide either:\n - project_id, ref, and file_path parameters, or\n - A GitLab URL like:\n - https://gitlab.com/namespace/project/-/blob/master/README.md\n - https://gitlab.com/group/subgroup/project/-/blob/main/src/file.py\n "
},
{
"name":"list_repository_tree",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"path":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Path inside repository. Used to get content of subdirectories"
},
"ref":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The name of a repository branch or tag or, if not given, the default branch"
},
"recursive":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":false,
"description":"Boolean value for getting a recursive tree"
},
"page":{
"anyOf":[
{
"minimum":1,
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number for pagination (min 1)"
},
"per_page":{
"anyOf":[
{
"maximum":100,
"minimum":1,
"type":"integer"
},
{
"type":"null"
}
],
"default":20,
"description":"Results per page for pagination (min 1, max 100)"
}
},
"type":"object"
},
"description":"List files and directories in a GitLab repository.\n\n To identify a project you must provide either:\n - project_id parameter, or\n - A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/group/subgroup/project\n\n You can specify a path to get contents of a subdirectory, a specific ref (branch/tag),\n and whether to get a recursive tree.\n\n For example:\n - Given project_id 13, the tool call would be:\n list_repository_tree(project_id=13)\n - To list files in a specific subdirectory with a specific branch:\n list_repository_tree(project_id=13, path=\"src\", ref=\"main\")\n - To recursively list all files in a project:\n list_repository_tree(project_id=13, recursive=True)\n "
},
{
"name":"get_epic",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL is not provided."
},
"epic_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the epic. Required if URL is not provided."
},
"epic_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the epic."
}
},
"type":"object"
},
"description":"Get a single epic in a GitLab group\n\n To identify an epic you must provide either:\n- group_id and epic_iid, or\n- A GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/epics/42\n\n\n For example:\n - Given group_id \\'namespace/group\\' and epic_iid 42, the tool call would be:\n get_epic(group_id=\\'namespace/group\\', epic_iid=42)\n - Given the URL https://gitlab.com/groups/namespace/group/-/epics/42, the tool call would be:\n get_epic(url=\"https://gitlab.com/groups/namespace/group/-/epics/42\")\n "
},
{
"name":"list_epics",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL is not provided."
},
"author_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics created by the given user id"
},
"author_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics created by the user with the given username"
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics matching a comma-separated list of label names. Label names from the epic group or a parent group can be used"
},
"with_labels_details":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"If true, response returns more details for each label in labels field: :name, :color, :description, :description_html, :text_color. Default is false"
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics ordered by created_at, updated_at, or title fields. Default is created_at"
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics sorted in asc or desc order. Default is desc"
},
"search":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search epics against their title and description"
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search epics against their state, possible filters: opened, closed, and all, default: all"
},
"created_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics created on or after the given time. Expected in ISO 8601 format (2019-03-15T08:00:00Z)"
},
"created_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics created on or before the given time. Expected in ISO 8601 format (2019-03-15T08:00:00Z)"
},
"updated_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics updated on or before the given time. Expected in ISO 8601 format (2019-03-15T08:00:00Z)"
},
"updated_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics updated on or after the given time. Expected in ISO 8601 format (2019-03-15T08:00:00Z)"
},
"include_ancestor_groups":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include epics from the requested group's ancestors. Default is false"
},
"include_descendant_groups":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include epics from the requested group's descendants. Default is true"
},
"my_reaction_emoji":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics reacted by the authenticated user by the given emoji. None returns epics not given a\nreaction. Any returns epics given at least one reaction"
},
"negate":{
"anyOf":[
{
"additionalProperties":true,
"type":"object"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epics that do not match the parameters supplied. Accepts: author_id, author_username and labels."
},
"page":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number. Default is 1."
}
},
"type":"object"
},
"description":"Get all epics of the requested group and its subgroups.\n By default, only returns the first 20 epics - use page parameter to get complete results.\n\n To identify the group you must provide either:\n- group_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/group\n - https://gitlab.com/groups/namespace/group\n\n\n For example:\n - Given group_id \\'namespace/group\\', the tool call would be:\n list_epics(group_id=\\'namespace/group\\')\n - Given the URL https://gitlab.com/groups/namespace/group, the tool call would be:\n list_epics(url=\"https://gitlab.com/groups/namespace/group\")\n "
},
{
"name":"list_epic_notes",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL is not provided."
},
"epic_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the epic. Required if URL is not provided."
},
"epic_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the epic."
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epic notes sorted in asc or desc order. Default is desc."
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return epic notes ordered by created_at or updated_at fields. Default is created_at"
},
"page":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number. Default is 1."
}
},
"type":"object"
},
"description":"Get a list of all notes (comments) for a specific epic.\n By default, only returns the first 20 epic notes - use page parameter to get complete results.\n\n To identify an epic you must provide either:\n- group_id and epic_iid, or\n- A GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/epics/42\n\n\n For example:\n - Given group_id \\'namespace/group\\' and epic_iid 42, the tool call would be:\n list_epic_notes(group_id=\\'namespace/group\\', epic_iid=42)\n - Given the URL https://gitlab.com/groups/namespace/group/-/epics/42, the tool call would be:\n list_epic_notes(url=\"https://gitlab.com/groups/namespace/group/-/epics/42\")\n\n When using a URL, the tool will automatically extract the group_id and epic_iid.\n "
},
{
"name":"get_commit",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"commit_sha":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The SHA hash of the commit. Required if URL is not provided."
},
"stats":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include commit stats (additions, deletions, total). Default is true."
}
},
"type":"object"
},
"description":"Get a single commit from a GitLab project repository.\n\nTo identify a commit you must provide either:\n- project_id and commit_sha, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\n - https://gitlab.com/group/subgroup/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\n\n\nFor example:\n- Given project_id 13 and commit_sha \"6104942438c14ec7bd21c6cd5bd995272b3faff6\", the tool call would be:\n get_commit(project_id=13, commit_sha=\"6104942438c14ec7bd21c6cd5bd995272b3faff6\")\n- Given the URL https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6, the tool call would be:\n get_commit(url=\"https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\")\n"
},
{
"name":"list_commits",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"all":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":false,
"description":"When set to true the ref_name parameter is ignored. Default is false."
},
"author":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search commits by commit author."
},
"first_parent":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":false,
"description":"Follow only the first parent commit upon seeing a merge commit. Default is false."
},
"order":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"List commits in order. Possible values: default, topo. Default value: default (chronological order)."
},
"path":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The file path to filter commits by."
},
"ref_name":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The name of a repository branch or tag to list commits from. Default is the default branch."
},
"since":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Only commits after or on this date are returned.Use ISO 8601 format when specifying the date (YYYY-MM-DDTHH:MM:SSZ)."
},
"trailers":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":false,
"description":"Parse and include Git trailers for every commit. Default is false."
},
"until":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Only commits before or on this date are returned.Use ISO 8601 format when specifying the date (YYYY-MM-DDTHH:MM:SSZ)."
},
"with_stats":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":false,
"description":"Include commit stats. Default is false."
},
"page":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number. Default is 1."
}
},
"type":"object"
},
"description":"List commits in a GitLab project repository.\n By default, only returns the first 20 commits - use page parameter to get complete results.\n\n To identify the project you must provide either:\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/commits\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/commits\n\n\n For example:\n - Given project_id 13, the tool call would be:\n list_commits(project_id=13)\n - Given the URL https://gitlab.com/namespace/project, the tool call would be:\n list_commits(url=\"https://gitlab.com/namespace/project\")\n "
},
{
"name":"get_commit_diff",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"commit_sha":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The SHA hash of the commit. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Get the diff of a specific commit in a GitLab project.\n\n To identify a commit you must provide either:\n- project_id and commit_sha, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\n - https://gitlab.com/group/subgroup/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\n\n\n For example:\n - Given project_id 13 and commit_sha \"6104942438c14ec7bd21c6cd5bd995272b3faff6\", the tool call would be:\n get_commit_diff(project_id=13, commit_sha=\"6104942438c14ec7bd21c6cd5bd995272b3faff6\")\n - Given the URL https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6, the tool call would be:\n get_commit_diff(url=\"https://gitlab.com/namespace/project/-/commit/6104942438c14ec7bd21c6cd5bd995272b3faff6\")\n "
},
{
"name":"get_work_item",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"work_item_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the work item. Required if URL is not provided."
}
},
"type":"object"
},
"description":"Get a single work item in a GitLab group or project.\n\n To identify a work item you must provide either:\n- group_id/project_id and work_item_iid\n - group_id can be either a numeric ID (e.g., 42) or a path string (e.g., \\'my-group\\' or \\'namespace/subgroup\\')\n - project_id can be either a numeric ID (e.g., 13) or a path string (e.g., \\'namespace/project\\')\n - work_item_iid is always a numeric value (e.g., 7)\n- or a GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/work_items/42\n - https://gitlab.com/namespace/project/-/work_items/42\n\n\n For example:\n - Given group_id \\'namespace/group\\' and work_item_iid 42, the tool call would be:\n get_work_item(group_id=\\'namespace/group\\', work_item_iid=42)\n - Given project_id \\'namespace/project\\' and work_item_iid 42, the tool call would be:\n get_work_item(project_id=\\'namespace/project\\', work_item_iid=42)\n - Given the URL https://gitlab.com/groups/namespace/group/-/work_items/42, the tool call would be:\n get_work_item(url=\"https://gitlab.com/groups/namespace/group/-/work_items/42\")\n - Given the URL https://gitlab.com/namespace/project/-/work_items/42, the tool call would be:\n get_work_item(url=\"https://gitlab.com/namespace/project/-/work_items/42\")\n "
},
{
"name":"list_work_items",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by work item state (e.g., 'opened', 'closed', 'all'). If not set, all states are included."
},
"search":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Search for work items by title or description."
},
"author_username":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by username of the author."
},
"created_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items created on or after this date (ISO 8601 format)."
},
"created_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items created on or before this date (ISO 8601 format)."
},
"updated_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items updated on or after this date (ISO 8601 format)."
},
"updated_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items updated on or before this date (ISO 8601 format)."
},
"due_after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items due on or after this date (ISO 8601 format)."
},
"due_before":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Include only work items due on or before this date (ISO 8601 format)."
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Sort results by field and direction (e.g., 'CREATED_DESC', 'UPDATED_ASC')."
},
"first":{
"anyOf":[
{
"maximum":100,
"minimum":1,
"type":"integer"
},
{
"type":"null"
}
],
"default":20,
"description":"Number of work items to return per page (max 100)."
},
"after":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Cursor for pagination. Use endCursor from a previous response."
},
"types":{
"anyOf":[
{
"items":{
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"Filter by work item types. Must be one of: EPIC, ISSUE, KEY_RESULT, OBJECTIVE, TASK"
}
},
"type":"object"
},
"description":"List work items in a GitLab project or group.\n By default, only returns the first 20 work items. Use \\'after\\' parameter with the\n endCursor from previous responses to fetch subsequent pages.\n\n To identify the parent (group or project) you must provide either:\n- group_id parameter, or\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/group\n - https://gitlab.com/groups/namespace/group\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/group/project\n\n\n This tool only supports the following types: (Epic, Issue, Key Result, Objective, Task)\n\n For example:\n - Given group_id \\'namespace/group\\', the tool call would be:\n list_work_items(group_id=\\'namespace/group\\')\n - Given project_id \\'namespace/project\\', the tool call would be:\n list_work_items(project_id=\\'namespace/project\\')\n - Given the URL https://gitlab.com/groups/namespace/group, the tool call would be:\n list_work_items(url=\"https://gitlab.com/groups/namespace/group\")\n - Given the URL https://gitlab.com/namespace/project, the tool call would be:\n list_work_items(url=\"https://gitlab.com/namespace/project\")\n "
},
{
"name":"list_vulnerabilities",
"input_schema":{
"properties":{
"project_full_path":{
"description":"The full path of the GitLab project (e.g., 'namespace/project' or 'group/subgroup/project')",
"type":"string"
},
"severity":{
"anyOf":[
{
"items":{
"description":"Valid vulnerability severity levels.",
"enum":[
"CRITICAL",
"HIGH",
"MEDIUM",
"LOW",
"INFO",
"UNKNOWN"
],
"title":"VulnerabilitySeverity",
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"\n Filter vulnerabilities by severity levels. Can specify multiple values (e.g., [CRITICAL, HIGH, MEDIUM]).\n If not specified, all severities will be returned.\n "
},
"report_type":{
"anyOf":[
{
"items":{
"description":"Valid vulnerability report types.",
"enum":[
"SAST",
"DEPENDENCY_SCANNING",
"CONTAINER_SCANNING",
"DAST",
"SECRET_DETECTION",
"COVERAGE_FUZZING",
"API_FUZZING",
"CLUSTER_IMAGE_SCANNING",
"CONTAINER_SCANNING_FOR_REGISTRY",
"GENERIC"
],
"title":"VulnerabilityReportType",
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"\n Filter vulnerabilities by report types. Can specify multiple values (e.g., [SAST, DAST]).\n If not specified, all report types will be returned.\n "
},
"per_page":{
"anyOf":[
{
"maximum":100,
"minimum":1,
"type":"integer"
},
{
"type":"null"
}
],
"default":100,
"description":"Number of results per page (default: 100, max: 100)."
},
"page":{
"anyOf":[
{
"minimum":1,
"type":"integer"
},
{
"type":"null"
}
],
"default":1,
"description":"Page number to fetch (default: 1)."
},
"fetch_all_pages":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":true,
"description":"Whether to fetch all pages of results (default: True)."
}
},
"required":[
"project_full_path"
],
"type":"object"
},
"description":"List security vulnerabilities in a GitLab project using GraphQL.\n\n \nThe project must be specified using its full path (e.g., \\'namespace/project\\' or \\'group/subgroup/project\\').\n\n\n The tool supports filtering vulnerabilities by:\n - Severity levels (can specify multiple: CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN)\n - Report type (SAST, DAST, DEPENDENCY_SCANNING, etc.)\n\n For example:\n - List all vulnerabilities in a project:\n list_vulnerabilities(project_full_path=\"namespace/project\")\n\n - List only critical and high vulnerabilities in a project:\n list_vulnerabilities(\n project_full_path=\"namespace/project\",\n severity=[VulnerabilitySeverity.CRITICAL, VulnerabilitySeverity.HIGH]\n )\n\n - List only SAST vulnerabilities in a project:\n list_vulnerabilities(\n project_full_path=\"namespace/project\",\n report_type=[VulnerabilityReportType.SAST]\n )\n\n - List only critical SAST vulnerabilities in a project:\n list_vulnerabilities(\n project_full_path=\"namespace/project\",\n severity=[VulnerabilitySeverity.CRITICAL]\n report_type=[VulnerabilityReportType.SAST]\n )\n "
},
{
"name":"get_work_item_notes",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"work_item_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the work item. Required if URL is not provided."
},
"sort":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return work item notes sorted in asc or desc order. Default is desc."
},
"order_by":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Return work item notes ordered by created_at or updated_at fields. Default is created_at"
}
},
"type":"object"
},
"description":"Get all comments (notes) for a specific work item.\n\n To identify a work item you must provide either:\n- group_id/project_id and work_item_iid\n - group_id can be either a numeric ID (e.g., 42) or a path string (e.g., \\'my-group\\' or \\'namespace/subgroup\\')\n - project_id can be either a numeric ID (e.g., 13) or a path string (e.g., \\'namespace/project\\')\n - work_item_iid is always a numeric value (e.g., 7)\n- or a GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/work_items/42\n - https://gitlab.com/namespace/project/-/work_items/42\n\n\n For example:\n - Given group_id \\'namespace/group\\' and work_item_iid 42, the tool call would be:\n get_work_item_notes(group_id=\\'namespace/group\\', work_item_iid=42)\n - Given project_id \\'namespace/project\\' and work_item_iid 42, the tool call would be:\n get_work_item_notes(project_id=\\'namespace/project\\', work_item_iid=42)\n - Given the URL https://gitlab.com/groups/namespace/group/-/work_items/42, the tool call would be:\n get_work_item_notes(url=\"https://gitlab.com/groups/namespace/group/-/work_items/42\")\n - Given the URL https://gitlab.com/namespace/project/-/work_items/42, the tool call would be:\n get_work_item_notes(url=\"https://gitlab.com/namespace/project/-/work_items/42\")\n "
},
{
"name":"get_current_user",
"input_schema":{
"properties":{
},
"type":"object"
},
"description":"\n Get the current user information from GitLab API\n\n Only the following information will be retrieved from the current user endpoint:\n - user name\n - job title\n - preferred languages (written in ISO 639‑1 language code)\n "
},
{
"name":"get_vulnerability_details",
"input_schema":{
"properties":{
"vulnerability_id":{
"description":"The numeric ID of the vulnerability (e.g., '567')",
"type":"string"
}
},
"required":[
"vulnerability_id"
],
"type":"object"
},
"description":"Get detailed information about a specific vulnerability using its numeric ID.\n\n The vulnerability ID should be just the numeric identifier (e.g., \\'567\\').\n\n This tool provides comprehensive details including:\n - Basic vulnerability information (title, state, description, severity)\n - Location details (file paths, line numbers, etc.)\n - CVE enrichment data (EPSS scores, known exploits)\n - Detection pipeline information\n - Detailed vulnerability report data with nested structures\n\n For example:\n get_vulnerability_details(vulnerability_id=\"567\")\n "
},
{
"name":"update_vulnerability_severity",
"input_schema":{
"properties":{
"vulnerability_ids":{
"description":"List of vulnerability IDs to update severity for. These should be the vulnerability IDs as returned by list_vulnerabilities.",
"items":{
"type":"string"
},
"type":"array"
},
"severity":{
"description":"New severity level for the vulnerabilities. Must be one of: CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN.",
"type":"string"
},
"comment":{
"description":"Comment explaining why the vulnerability severity was changed (required, maximum 50,000 characters).",
"type":"string"
}
},
"required":[
"vulnerability_ids",
"severity",
"comment"
],
"type":"object"
},
"description":"Update the severity level of vulnerabilities in a GitLab project using GraphQL.\n\n The project must be specified using its full path (e.g., \\'namespace/project\\' or \\'group/subgroup/project\\').\n\n This tool allows you to override the severity level of one or more vulnerabilities and provide a comment explaining the change.\n The severity must be one of: CRITICAL, HIGH, MEDIUM, LOW, INFO, UNKNOWN.\n\n A comment explaining the reason for the severity change is required and can be up to 50,000 characters.\n\n For example:\n - Update single vulnerability severity:\n update_vulnerability_severity(\n vulnerability_ids=[\"gid://gitlab/Vulnerability/123\"],\n severity=\"HIGH\",\n comment=\"Updated severity based on security review\"\n )\n - Update multiple vulnerabilities:\n update_vulnerability_severity(\n vulnerability_ids=[\"gid://gitlab/Vulnerability/123\", \"gid://gitlab/Vulnerability/456\"],\n severity=\"LOW\",\n comment=\"These are false positives based on code analysis\"\n )\n "
},
{
"name":"create_issue",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"title":{
"description":"Title of the issue",
"type":"string"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The description of an issue. Limited to 1048576 characters."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated label names to assign to the new issue.\nIf a label does not already exist, this creates a new project label and assigns it to the issue."
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The IDs of the users to assign the issue to"
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Set to true to create a confidential issue. Default is false."
},
"due_date":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The due date. Date time string in the format YYYY-MM-DD, for example 2016-03-11."
},
"issue_type":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The type of issue. One of issue, incident, test_case or task. Default is issue."
}
},
"required":[
"title"
],
"type":"object"
},
"description":"Create a new issue in a GitLab project.\n\nTo identify the project you must provide either:\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/issues\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/issues\n\n\nFor example:\n- Given project_id 13 and the title \"Fix bug in login form\", the tool call would be:\n create_issue(project_id=13, title=\"Fix bug in login form\")\n- Given the URL https://gitlab.com/namespace/project and the title \"Fix bug in login form\", the tool call would be:\n create_issue(url=\"https://gitlab.com/namespace/project\", title=\"Fix bug in login form\")\n"
},
{
"name":"update_issue",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"issue_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project issue. Required if URL is not provided."
},
"title":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Title of the issue"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Description of the issue. Max character limit of 1048576 characters."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated list of label names"
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the users to assign the issue to. Set to `0` or provide an empty value to unassign all assignees."
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Set to true to make the issue confidential"
},
"due_date":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Date string in the format YYYY-MM-DD"
},
"state_event":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The state event of an issue. To close the issue, use 'close', and to reopen it, use 'reopen'."
},
"discussion_locked":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if the issue's discussion is locked. If the discussion is locked only project members can add or edit comments."
}
},
"type":"object"
},
"description":"Update an existing issue in a GitLab project.\n\n To identify an issue you must provide either:\n- project_id and issue_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/issues/42\n - https://gitlab.com/group/subgroup/project/-/issues/42\n\n\n For example:\n - Given project_id 13, issue_iid 9, and title \"Updated title\", the tool call would be:\n update_issue(project_id=13, issue_iid=9, title=\"Updated title\")\n - Given the URL https://gitlab.com/namespace/project/-/issues/103 and title \"Updated title\", the tool call would be:\n update_issue(url=\"https://gitlab.com/namespace/project/-/issues/103\", title=\"Updated title\")\n "
},
{
"name":"create_issue_note",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"issue_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project issue. Required if URL is not provided."
},
"body":{
"description":"The content of the note. Limited to 1,000,000 characters.",
"type":"string"
}
},
"required":[
"body"
],
"type":"object"
},
"description":"Create a new note (comment) on a GitLab issue.\n\nTo identify an issue you must provide either:\n- project_id and issue_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/issues/42\n - https://gitlab.com/group/subgroup/project/-/issues/42\n\n\nFor example:\n- Given project_id 13, issue_iid 9, and body \"This is a comment\", the tool call would be:\n create_issue_note(project_id=13, issue_iid=9, body=\"This is a comment\")\n- Given the URL https://gitlab.com/namespace/project/-/issues/103 and body \"This is a comment\", the tool call would be:\n create_issue_note(url=\"https://gitlab.com/namespace/project/-/issues/103\", body=\"This is a comment\")\n\nThe body parameter is always required.\n"
},
{
"name":"create_merge_request",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"source_branch":{
"description":"The source branch name",
"type":"string"
},
"target_branch":{
"description":"The target branch name",
"type":"string"
},
"title":{
"description":"Title of the merge request",
"type":"string"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Description of the merge request. Limited to 1048576 characters."
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the users to assign the merge request to"
},
"reviewer_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the users to request a review from"
},
"remove_source_branch":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if a merge request should remove the source branch when merging"
},
"squash":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if the merge request should squash commits when merging"
}
},
"required":[
"source_branch",
"target_branch",
"title"
],
"type":"object"
},
"description":"Create a new merge request in the specified project.\n\n To identify the project you must provide either:\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/merge_requests\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/merge_requests\n\n\n For example:\n - Given project_id 13, source_branch \"feature\", target_branch \"main\", and title \"New feature\", the tool call would be:\n create_merge_request(project_id=13, source_branch=\"feature\", target_branch=\"main\", title=\"New feature\")\n - Given the URL https://gitlab.com/namespace/project, source_branch \"feature\", target_branch \"main\", and title \"New feature\", the tool call would be:\n create_merge_request(url=\"https://gitlab.com/namespace/project\", source_branch=\"feature\", target_branch=\"main\", title=\"New feature\")\n "
},
{
"name":"update_merge_request",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project merge request. Required if URL is not provided."
},
"allow_collaboration":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Allow commits from members who can merge to the target branch."
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the users to assign the merge request to. Set to 0 or provide an empty value to unassign all assignees."
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Description of the merge request. Limited to 1,048,576 characters."
},
"discussion_locked":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if the merge request’s discussion is locked. Only project members can add, edit or resolve notes to locked discussions."
},
"milestone_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The global ID of a milestone to assign the merge request to. Set to 0 or provide an empty value to unassign a milestone."
},
"remove_source_branch":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if a merge request should remove the source branch when merging."
},
"reviewer_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the users to request a review from. Set to an empty value to unassign all reviewers."
},
"squash":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Flag indicating if the merge request should squash commits when merging."
},
"state_event":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The state event of the merge request. Set to close to close the merge request."
},
"target_branch":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The target branch of the merge request."
},
"title":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The title of the merge request."
}
},
"type":"object"
},
"description":"Updates an existing merge request. You can change the target branch, title, or even close the MR.\nMax character limit of 1048576 characters.\n\nTo identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\nFor example:\n- Given project_id 13, merge_request_iid 9, and title \"Updated title\", the tool call would be:\n update_merge_request(project_id=13, merge_request_iid=9, title=\"Updated title\")\n- Given the URL https://gitlab.com/namespace/project/-/merge_requests/103 and title \"Updated title\", the tool call would be:\n update_merge_request(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\", title=\"Updated title\")\n "
},
{
"name":"create_merge_request_note",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"merge_request_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the project merge request. Required if URL is not provided."
},
"body":{
"description":"The content of a note. Limited to 1,000,000 characters.",
"type":"string"
}
},
"required":[
"body"
],
"type":"object"
},
"description":"Create a note (comment) on a merge request. You are NOT allowed to ever use a GitLab quick action in a merge request note.\nQuick actions are text-based shortcuts for common GitLab actions. They are commands that are on their own line and\nstart with a backslash. Examples include /merge, /approve, /close, etc.\n\nTo identify a merge request you must provide either:\n- project_id and merge_request_iid, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/project/-/merge_requests/42\n - https://gitlab.com/group/subgroup/project/-/merge_requests/42\n\n\nFor example:\n- Given project_id 13, merge_request_iid 9, and body \"This is a comment\", the tool call would be:\n create_merge_request_note(project_id=13, merge_request_iid=9, body=\"This is a comment\")\n- Given the URL https://gitlab.com/namespace/project/-/merge_requests/103 and body \"This is a comment\", the tool call would be:\n create_merge_request_note(url=\"https://gitlab.com/namespace/project/-/merge_requests/103\", body=\"This is a comment\")\n\nThe body parameter is always required.\n"
},
{
"name":"create_epic",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL is not provided."
},
"epic_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the epic. Required if URL is not provided."
},
"epic_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the epic."
},
"title":{
"description":"The title of the epic",
"type":"string"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The description of the epic. Limited to 1048576 characters."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The comma-separated list of labels"
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether the epic should be confidential"
},
"start_date_is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether start date should be sourced from `start_date_fixed` or from milestones"
},
"start_date_fixed":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The fixed start date of an epic"
},
"due_date_is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether due date should be sourced from `due_date_fixed` or from milestones"
},
"due_date_fixed":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The fixed due date of an epic"
},
"parent_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of a parent epic"
}
},
"required":[
"title"
],
"type":"object"
},
"description":"Create a new epic in a GitLab group.\n\n To identify the group you must provide either:\n- group_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/group\n - https://gitlab.com/groups/namespace/group\n\n\n For example:\n - Given group_id \\'namespace/group\\' and title \\'New Feature\\', the tool call would be:\n create_epic(group_id=\\'namespace/group\\', title=\\'New Feature\\')\n - Given the URL https://gitlab.com/groups/namespace/group and title \\'New Feature\\', the tool call would be:\n create_epic(url=\"https://gitlab.com/groups/namespace/group\", title=\\'New Feature\\')\n "
},
{
"name":"update_epic",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL is not provided."
},
"epic_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the epic. Required if URL is not provided."
},
"epic_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of the epic."
},
"title":{
"description":"The title of the epic",
"type":"string"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The description of the epic. Limited to 1048576 characters."
},
"labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The comma-separated list of labels"
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether the epic should be confidential"
},
"start_date_is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether start date should be sourced from `start_date_fixed` or from milestones"
},
"start_date_fixed":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The fixed start date of an epic"
},
"due_date_is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether due date should be sourced from `due_date_fixed` or from milestones"
},
"due_date_fixed":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The fixed due date of an epic"
},
"parent_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID of a parent epic"
},
"add_labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated label names to add to an epic"
},
"remove_labels":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comma-separated label names to remove from an epic"
},
"state_event":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"State event for an epic. Set `close` to close the epic and `reopen` to reopen it"
}
},
"required":[
"title"
],
"type":"object"
},
"description":"Update an existing epic in a GitLab group.\n\nTo identify an epic you must provide either:\n- group_id and epic_iid, or\n- A GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/epics/42\n\n\nFor example:\n- Given group_id \\'namespace/group\\', epic_iid 42, and title \\'Updated Epic\\', the tool call would be:\n update_epic(group_id=\\'namespace/group\\', epic_iid=42, title=\\'Updated Epic\\')\n- Given the URL https://gitlab.com/groups/namespace/group/-/epics/42 and title \\'Updated Epic\\', the tool call would be:\n update_epic(url=\"https://gitlab.com/groups/namespace/group/-/epics/42\", title=\\'Updated Epic\\')\n"
},
{
"name":"create_commit",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Examples: 123, 'gitlab-org%2Fgitlab'. Required if URL is not provided."
},
"branch":{
"description":"Name of the branch to commit into. To create a new branch, also provide either start_branch or start_sha, and optionally start_project.",
"type":"string"
},
"commit_message":{
"description":"Commit message.",
"type":"string"
},
"actions":{
"description":"JSON array of file actions. Each action requires 'action' and 'file_path'. For 'create' and 'update' actions, you must provide either 'content' (full file) or ('old_str' and 'new_str') for a partial update.",
"items":{
"description":"Model representing a single action to be performed in a commit.\n\nFor 'update' actions:\n - You can provide either 'content' (full file content),\n OR ('old_str' and 'new_str') for a partial update (recommended for large files).",
"properties":{
"action":{
"description":"The action to perform: 'create', 'delete', 'move', or 'update'.",
"type":"string"
},
"file_path":{
"description":"Full path to the file. For example: 'lib/class.rb'.",
"type":"string"
},
"previous_path":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Original full path to the file being moved. Only considered for 'move' action."
},
"content":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"File content, required for 'create' and 'update' actions. For 'update', you can also omit 'content' and supply 'old_str' and 'new_str' for a partial edit (recommended for large files). For 'move' actions without content, existing file content is preserved."
},
"old_str":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"(Alternative to content) The exact block of text to replace in the file. Please provide at least one line above and below the target code or heading, to make the match unique across the file."
},
"new_str":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"(Alternative to content) The replacement block for the matched section. Include the same lines above and below unchanged; only change the target line(s) in the middle."
},
"encoding":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"'text' or 'base64'. Default is 'text'."
},
"last_commit_id":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Last known file commit ID. Only considered in 'update', 'move', and 'delete' actions."
}
},
"required":[
"action",
"file_path"
],
"type":"object"
},
"type":"array"
},
"start_branch":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Name of the branch to start the new branch from."
},
"start_sha":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"SHA of the commit to start the new branch from."
},
"start_project":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project to start the new branch from."
},
"author_email":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Author's email address."
},
"author_name":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Author's name."
}
},
"required":[
"branch",
"commit_message",
"actions"
],
"type":"object"
},
"description":"Create a commit with multiple file actions in a GitLab repository.\n\n To identify the project you must provide either:\n - project_id parameter, or\n - A GitLab URL like:\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/project/-/commits\n - https://gitlab.com/group/subgroup/project\n - https://gitlab.com/group/subgroup/project/-/commits\n\n Actions can include creating, updating, deleting, moving, or changing file permissions.\n Each action requires at minimum an \\'action\\' type and \\'file_path\\'.\n\n For example:\n - Creating a new file requires \\'action\\': \\'create\\', \\'file_path\\', and \\'content\\'\n - Updating a file requires \\'action\\': \\'update\\', \\'file_path\\', and \\'content\\'\n - Deleting a file requires \\'action\\': \\'delete\\' and \\'file_path\\'\n - Moving a file requires \\'action\\': \\'move\\', \\'file_path\\', and \\'previous_path\\'\n\n Partial edit (recommended for large files):\n You can update a file by providing only the partial block to replace using `old_str`\n (with at least one line above and below the target for uniqueness) and `new_str`\n (same block, but with your intended change). This will perform a precise in-place edit on the backend.\n\n Example:\n - Updating a heading in a markdown file:\n - \\'action\\': \\'update\\'\n - \\'file_path\\': \\'README.md\\'\n - \\'old_str\\': \"# Getting started\n\nTo make it easy for you to get started with GitLab...\"\n - \\'new_str\\': \"# Start\n\nTo make it easy for you to get started with GitLab...\"\n "
},
{
"name":"dismiss_vulnerability",
"input_schema":{
"properties":{
"vulnerability_id":{
"description":"ID of the vulnerability to be dismissed",
"type":"string"
},
"comment":{
"description":"Comment why vulnerability was dismissed (maximum 50,000 characters).",
"type":"string"
},
"dismissal_reason":{
"description":"Reason why vulnerability should be dismissed (ACCEPTABLE_RISK, FALSE_POSITIVE, MITIGATING_CONTROL, USED_IN_TESTS, NOT_APPLICABLE)",
"type":"string"
}
},
"required":[
"vulnerability_id",
"comment",
"dismissal_reason"
],
"type":"object"
},
"description":"Dismiss a security vulnerability in a GitLab project using GraphQL.\n\n \nThe project must be specified using its full path (e.g., \\'namespace/project\\' or \\'group/subgroup/project\\').\n\n\n The tool supports dismissing a vulnerability by ID, with a dismissal reason, and comment.\n The dismiss reason must be one of: ACCEPTABLE_RISK, FALSE_POSITIVE, MITIGATING_CONTROL, USED_IN_TESTS, NOT_APPLICABLE.\n If a dismissal reason is not given, you will need to ask for one.\n\n A comment explaining the reason for the dismissal is required and can be up to 50,000 characters.\n If a comment is not given, you will need to ask for one.\n\n For example:\n - Dismiss a vulnerability for being a false positive:\n dismiss_vulnerability(\n vulnerability_id=\"gid://gitlab/Vulnerability/123\",\n dismissal_reason=\"FALSE_POSITIVE\",\n comment=\"Security review deemed this a false positive\"\n )\n "
},
{
"name":"confirm_vulnerability",
"input_schema":{
"properties":{
"vulnerability_id":{
"description":"The ID of the vulnerability to be confirmed (e.g., either digit ids like '123' or gid like 'gid://gitlab/Vulnerability/123')",
"type":"string"
},
"comment":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Comment explaining why the vulnerability was confirmed (maximum 50,000 characters)"
}
},
"required":[
"vulnerability_id"
],
"type":"object"
},
"description":"Confirm a security vulnerability in a GitLab project.\n\nThis tool marks a vulnerability as confirmed, changing its state to CONFIRMED.\nThis is typically done when a security team has verified that the vulnerability is a real issue\nthat needs to be addressed.\n"
},
{
"name":"create_work_item",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"title":{
"description":"Title of the work item.",
"type":"string"
},
"type_name":{
"description":"Work item type. One of: 'Issue', 'Epic', 'Task', 'Objective', 'Key Result'.",
"type":"string"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The description of the work item. Limited to 1048576 characters."
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"IDs of users to assign"
},
"label_ids":{
"anyOf":[
{
"items":{
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"IDs of labels to assign"
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Set to true to create a confidential work item."
},
"start_date":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Start date in YYYY-MM-DD format."
},
"due_date":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Due date in YYYY-MM-DD format."
},
"is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether the start and due dates are fixed."
},
"health_status":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Health status: 'onTrack', 'needsAttention', 'atRisk'."
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Work item state. Use 'opened' or 'closed'."
}
},
"required":[
"title",
"type_name"
],
"type":"object"
},
"description":"Create a new work item in a GitLab group or project.\n\n You are NOT allowed to ever use a GitLab quick action in work item description\nor work item note body. Quick actions are text-based shortcuts for common GitLab actions. They are commands that are\non their own line and start with a backslash. Examples include /merge, /approve, /close, etc.\n\n To identify the parent (group or project) you must provide either:\n- group_id parameter, or\n- project_id parameter, or\n- A GitLab URL like:\n - https://gitlab.com/namespace/group\n - https://gitlab.com/groups/namespace/group\n - https://gitlab.com/namespace/project\n - https://gitlab.com/namespace/group/project\n\n\n For example:\n - Given group_id \\'namespace/group\\' and title \"Implement feature X\", the tool call would be:\n create_work_item(group_id=\\'namespace/group\\', title=\"Implement feature X\", type_name=\"issue\")\n "
},
{
"name":"create_work_item_note",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"work_item_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the work item. Required if URL is not provided."
},
"body":{
"description":"The content of the note. Limited to 1048576 characters.",
"maxLength":1048576,
"type":"string"
},
"internal":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Internal flag for a note. Default is false."
},
"discussion_id":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Global ID of the discussion the note is in reply to."
}
},
"required":[
"body"
],
"type":"object"
},
"description":"Create a new note (comment) on a GitLab work item.\n\n You are NOT allowed to ever use a GitLab quick action in work item description\nor work item note body. Quick actions are text-based shortcuts for common GitLab actions. They are commands that are\non their own line and start with a backslash. Examples include /merge, /approve, /close, etc.\n\n To identify a work item you must provide either:\n- group_id/project_id and work_item_iid\n - group_id can be either a numeric ID (e.g., 42) or a path string (e.g., \\'my-group\\' or \\'namespace/subgroup\\')\n - project_id can be either a numeric ID (e.g., 13) or a path string (e.g., \\'namespace/project\\')\n - work_item_iid is always a numeric value (e.g., 7)\n- or a GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/work_items/42\n - https://gitlab.com/namespace/project/-/work_items/42\n\n\n For example:\n - Given group_id \\'namespace/group\\', work_item_iid 42, and body \"This is a comment\", the tool call would be:\n create_work_item_note(group_id=\\'namespace/group\\', work_item_iid=42, body=\"This is a comment\")\n - Given project_id \\'namespace/project\\', work_item_iid 42, and body \"This is a comment\", the tool call would be:\n create_work_item_note(project_id=\\'namespace/project\\', work_item_iid=42, body=\"This is a comment\")\n - Given the URL https://gitlab.com/groups/namespace/group/-/work_items/42 and body \"This is a comment\", the tool call would be:\n create_work_item_note(url=\"https://gitlab.com/groups/namespace/group/-/work_items/42\", body=\"This is a comment\")\n - Given the URL https://gitlab.com/namespace/project/-/work_items/42 and body \"This is a comment\", the tool call would be:\n create_work_item_note(url=\"https://gitlab.com/namespace/project/-/work_items/42\", body=\"This is a comment\")\n\n The body parameter is always required.\n "
},
{
"name":"link_vulnerability_to_issue",
"input_schema":{
"properties":{
"issue_id":{
"description":"ID of the issue to link to.",
"type":"string"
},
"vulnerability_ids":{
"description":"Array of vulnerability IDs to link to the given issue. Up to 100 can be provided.",
"items":{
"type":"string"
},
"type":"array"
}
},
"required":[
"issue_id",
"vulnerability_ids"
],
"type":"object"
},
"description":"Link a GitLab issue to security vulnerabilities in a GitLab project using GraphQL.\n\n \nThe project must be specified using its full path (e.g., \\'namespace/project\\' or \\'group/subgroup/project\\').\n\n\n The tool supports linking a GitLab issue to vulnerabilities by ID.\n Up to 100 IDs of vulnerabilities can be provided.\n\n For example:\n - Link issue with ID 1 to a vulnerabilities with ID 23 and 10:\n link_vulnerability_to_issue(\n issue_id=\"gid://gitlab/Issue/1\",\n vulnerability_ids=[\"gid://gitlab/Vulnerability/23\", \"gid://gitlab/Vulnerability/10\"]\n )\n "
},
{
"name":"update_work_item",
"input_schema":{
"properties":{
"url":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"GitLab URL for the resource. If provided, other ID fields are not required."
},
"group_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the group. Required if URL and project_id are not provided."
},
"project_id":{
"anyOf":[
{
"type":"integer"
},
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The ID or URL-encoded path of the project. Required if URL and group_id are not provided."
},
"work_item_iid":{
"anyOf":[
{
"type":"integer"
},
{
"type":"null"
}
],
"default":"None",
"description":"The internal ID of the work item. Required if URL is not provided."
},
"title":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Title of the work item"
},
"description":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Description of the work item."
},
"assignee_ids":{
"anyOf":[
{
"items":{
"type":"integer"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"IDs of users to assign."
},
"confidential":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Set to true to make the work item confidential."
},
"start_date":{
"anyOf":[
{
"pattern":"^\\d{4}-\\d{2}-\\d{2}$",
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The start date. Date time string in the format YYYY-MM-DD."
},
"due_date":{
"anyOf":[
{
"pattern":"^\\d{4}-\\d{2}-\\d{2}$",
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The due date. Date time string in the format YYYY-MM-DD."
},
"is_fixed":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"null"
}
],
"default":"None",
"description":"Whether the start and due dates are fixed."
},
"health_status":{
"anyOf":[
{
"enum":[
"onTrack",
"needsAttention",
"atRisk"
],
"title":"HealthStatus",
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Health status of the work item. Values: 'onTrack', 'needsAttention', 'atRisk'."
},
"state":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"The state of the work item. Use 'opened' or 'closed'."
},
"add_label_ids":{
"anyOf":[
{
"items":{
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"Label global IDs or numeric IDs to add to the work item."
},
"remove_label_ids":{
"anyOf":[
{
"items":{
"type":"string"
},
"type":"array"
},
{
"type":"null"
}
],
"default":"None",
"description":"Label global IDs or numeric IDs to remove from the work item."
}
},
"type":"object"
},
"description":"Update an existing work item in a GitLab group or project.\n\n You are NOT allowed to ever use a GitLab quick action in work item description\nor work item note body. Quick actions are text-based shortcuts for common GitLab actions. They are commands that are\non their own line and start with a backslash. Examples include /merge, /approve, /close, etc.\n\n To identify a work item you must provide either:\n- group_id/project_id and work_item_iid\n - group_id can be either a numeric ID (e.g., 42) or a path string (e.g., \\'my-group\\' or \\'namespace/subgroup\\')\n - project_id can be either a numeric ID (e.g., 13) or a path string (e.g., \\'namespace/project\\')\n - work_item_iid is always a numeric value (e.g., 7)\n- or a GitLab URL like:\n - https://gitlab.com/groups/namespace/group/-/work_items/42\n - https://gitlab.com/namespace/project/-/work_items/42\n\n\n For example:\n - update_work_item(group_id=\\'parent/child\\', work_item_iid=42, title=\"Updated title\")\n - update_work_item(project_id=\\'namespace/project\\', work_item_iid=42, title=\"Updated title\")\n - update_work_item(url=\"https://gitlab.com/groups/namespace/group/-/work_items/42\", title=\"Updated title\")\n - update_work_item(url=\"https://gitlab.com/namespace/project/-/work_items/42\", title=\"Updated title\")\n "
},
{
"name":"revert_to_detected_vulnerability",
"input_schema":{
"properties":{
"vulnerability_id":{
"description":"The ID of the vulnerability to revert to detected state (e.g., 'gid://gitlab/Vulnerability/123')",
"type":"string"
},
"comment":{
"anyOf":[
{
"type":"string"
},
{
"type":"null"
}
],
"default":"None",
"description":"Optional comment explaining why the vulnerability was reverted to detected state."
}
},
"required":[
"vulnerability_id"
],
"type":"object"
},
"description":"Revert a vulnerability\\'s state back to \\'detected\\' status in GitLab using GraphQL.\n\n The vulnerability is identified by its GitLab internal ID, which can be obtained from the\n list_vulnerabilities tool. An optional comment can be provided to explain the reason for reverting.\n\n For example:\n - Revert a vulnerability without comment:\n revert_to_detected_vulnerability(vulnerability_id=\"gid://gitlab/Vulnerability/123\")\n - Revert with explanation:\n revert_to_detected_vulnerability(vulnerability_id=\"gid://gitlab/Vulnerability/123\", comment=\"Reverting for re-assessment after code changes\")\n "
},
{
"name":"create_vulnerability_issue",
"input_schema":{
"properties":{
"project_full_path":{
"description":"The full path of the GitLab project (e.g., 'namespace/project' or 'group/subgroup/project')",
"type":"string"
},
"vulnerability_ids":{
"description":"Array of vulnerability IDs that will be linked to the created issue. Up to 100 can be provided.",
"items":{
"type":"string"
},
"type":"array"
}
},
"required":[
"project_full_path",
"vulnerability_ids"
],
"type":"object"
},
"description":"Create a GitLab issue linked to security vulnerabilities in a GitLab project using GraphQL.\n\n \nThe project must be specified using its full path (e.g., \\'namespace/project\\' or \\'group/subgroup/project\\').\n\n\n The tool supports creating a GitLab issue linked to vulnerabilities by ID.\n Up to 100 IDs of vulnerabilities can be provided.\n\n For example:\n - Create an issue for project ID 1 linked with vulnerabilities with ID 2 and 3:\n create_vulnerability_issue(\n project_full_path=\"namespace/project\",\n vulnerability_ids=[\"gid://gitlab/Vulnerability/2\", \"gid://gitlab/Vulnerability/3\"]\n )\n "
}
],
"stream":true
}
The generated list_repository_tree
tool call has invalid arguments:
...
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":""} }
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":"{\"project_id\": 3"} }
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":", \"ref\": \"HEAD"}}
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":"\", \"path\": "} }
event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"input_json_delta","partial_json":"}"} }
...
Which not partial, but rather an invalid json due to the trailing }
in the end:
{"project_id": 3, "ref": "HEAD", "path":}
As a result, it's not parsed correctly by parse_partial_json
The docs actually mentions that response can be invalid: https://docs.claude.com/en/docs/agents-and-tools/tool-use/fine-grained-tool-streaming, but it works correctly for Claude 4.0
The error is reproduced for the following combination:
-
claude-sonnet-4-5-20250929
model -
fine-grained-tool-streaming-2025-05-14
beta header -
context-1m-2025-08-07
beta header
If any of the components is removed/replaced, the tool call is valid:
event: content_block_start
data: {"type":"content_block_start","index":2,"content_block":{"type":"tool_use","id":"toolu_015W5gjNThZaUD3T1bxrrezR","name":"list_repository_tree","input":{}} }
event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"input_json_delta","partial_json":""} }
event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"input_json_delta","partial_json":"{\"project_id\": 3"} }
event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"input_json_delta","partial_json":", \"ref\": \"HEAD"} }
event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"input_json_delta","partial_json":"\", \"recursive\": false"} }
event: content_block_delta
data: {"type":"content_block_delta","index":2,"delta":{"type":"input_json_delta","partial_json":"}"}
Edited by Igor Drozdov