share_project_with_group
Share a GitLab project with a group. Define access level (Guest to Owner) and optional expiration date.
Instructions
Share project with a group.
Args:
project_id: GitLab project ID
group_id: Group ID to share with
group_access: Access level (10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner)
expires_at: Expiration date (YYYY-MM-DD) (optional)
token: GitLab Personal Access Token (optional)
ctx: MCP context (automatically injected)Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ||
| group_id | Yes | ||
| group_access | Yes | ||
| expires_at | No | ||
| token | No | ||
| ctx | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- The handler function for the 'share_project_with_group' tool. It shares a GitLab project with a group by making a POST request to /projects/{project_id}/share with group_id, group_access, and optional expires_at.
@mcp.tool() async def share_project_with_group(project_id: int, group_id: int, group_access: int, expires_at: str = None, token: str = None, ctx=None) -> str: """Share project with a group. Args: project_id: GitLab project ID group_id: Group ID to share with group_access: Access level (10=Guest, 20=Reporter, 30=Developer, 40=Maintainer, 50=Owner) expires_at: Expiration date (YYYY-MM-DD) (optional) token: GitLab Personal Access Token (optional) ctx: MCP context (automatically injected) """ data = { "group_id": group_id, "group_access": group_access } if expires_at: data["expires_at"] = expires_at result = await make_gitlab_request(f"/projects/{project_id}/share", "POST", data, ctx=ctx, token=token) if isinstance(result, dict) and "error" in result: return f"Error sharing project: {result['error']}" return f"Project shared with group {group_id} (access level: {group_access})" - gitlab_clone_mcp_server/server.py:1289-1289 (registration)Registration of the tool via the @mcp.tool() decorator on the async function.
@mcp.tool() - Helper function used by share_project_with_group to make the actual GitLab API request with authentication handling.
async def make_gitlab_request(endpoint: str, method: str = "GET", data: dict = None, ctx=None, token: str = None) -> dict[str, Any] | None: """Make a request to GitLab API with proper error handling.""" # Priority: 1. Explicit token parameter, 2. Context headers, 3. Environment variable # If no explicit token provided, try to get from context if not token and ctx and hasattr(ctx, 'request_context') and ctx.request_context: # Try to get from request headers if hasattr(ctx.request_context, 'headers'): token = ctx.request_context.headers.get('GITLAB_TOKEN') # Fallback to environment variable if not token: token = os.getenv("GITLAB_TOKEN") if not token: return {"error": "GitLab token not provided. Please provide a token parameter, GITLAB_TOKEN in the request headers, or set the environment variable."} # Get GitLab URL (from context or environment) gitlab_url = os.getenv("GITLAB_URL", "https://gitlab.com") headers = { "PRIVATE-TOKEN": token, "Content-Type": "application/json" } url = f"{gitlab_url}/api/v4{endpoint}" async with httpx.AsyncClient() as client: try: if method == "GET": response = await client.get(url, headers=headers, timeout=30.0) elif method == "POST": response = await client.post(url, headers=headers, json=data, timeout=30.0) elif method == "PUT": response = await client.put(url, headers=headers, json=data, timeout=30.0) elif method == "DELETE": response = await client.delete(url, headers=headers, timeout=30.0) response.raise_for_status() return response.json() if response.content else {"success": True} except Exception as e: return {"error": str(e)}