get_project
Retrieve detailed information about a GitLab project using its project ID.
Instructions
Get detailed information about a specific project.
Args:
project_id: GitLab project ID
token: GitLab Personal Access Token (optional)
ctx: MCP context (automatically injected)Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ||
| token | No | ||
| ctx | No |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- The `get_project` tool handler function. It calls GitLab API `GET /projects/{project_id}` and formats a detailed response with project info (name, path, description, visibility, default branch, dates, stars, forks, issues, URL). Decorated with @mcp.tool() which serves as both registration and handler definition.
@mcp.tool() async def get_project(project_id: int, token: str = None, ctx=None) -> str: """Get detailed information about a specific project. Args: project_id: GitLab project ID token: GitLab Personal Access Token (optional) ctx: MCP context (automatically injected) """ data = await make_gitlab_request(f"/projects/{project_id}", ctx=ctx, token=token) if isinstance(data, dict) and "error" in data: return f"Error: {data['error']}" result = f"Project: {data['name']} (ID: {data['id']})\n" result += f"Path: {data['path_with_namespace']}\n" result += f"Description: {data.get('description', 'No description')}\n" result += f"Visibility: {data['visibility']}\n" result += f"Default Branch: {data['default_branch']}\n" result += f"Created: {data['created_at']}\n" result += f"Last Activity: {data['last_activity_at']}\n" result += f"Stars: {data['star_count']} | Forks: {data['forks_count']}\n" result += f"Issues: {data['open_issues_count']} open\n" result += f"URL: {data['web_url']}" return result - Input schema definition via the function signature: accepts project_id (int, required), token (str, optional), ctx (MCP context, auto-injected).
async def get_project(project_id: int, token: str = None, ctx=None) -> str: """Get detailed information about a specific project. Args: project_id: GitLab project ID token: GitLab Personal Access Token (optional) ctx: MCP context (automatically injected) """ - gitlab_clone_mcp_server/server.py:1097-1106 (registration)Tool registration via `@mcp.tool()` decorator on line 1097, which registers 'get_project' with the FastMCP server instance.
@mcp.tool() async def get_project(project_id: int, token: str = None, ctx=None) -> str: """Get detailed information about a specific project. Args: project_id: GitLab project ID token: GitLab Personal Access Token (optional) ctx: MCP context (automatically injected) """ data = await make_gitlab_request(f"/projects/{project_id}", ctx=ctx, token=token) - The `make_gitlab_request` helper function used by `get_project` to make the actual HTTP GET request to GitLab API.
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)}