Skip to main content
Glama
aserper

RTFD (Read The F*****g Docs)

by aserper

fetch_github_readme

Retrieve README files from GitHub repositories to access project overviews, installation guides, and usage examples for understanding codebases.

Instructions

        Fetch README file from a GitHub repository.

        USE THIS WHEN: You need the project overview, quick start, or basic documentation.

        BEST FOR: Getting a high-level understanding of a project.
        The README typically contains installation, usage examples, and project description.

        For deeper code exploration, use:
        - get_repo_tree() to see the complete file structure
        - get_file_content() to read specific source files

        Args:
            repo: Repository in "owner/repo" format (e.g., "psf/requests")
            max_bytes: Maximum content size, default 20KB

        Returns: JSON with README content, size, and metadata

        Example: fetch_github_readme("psf/requests") → Returns the requests README
        

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
repoYes
max_bytesNo

Implementation Reference

  • The main handler function for the 'fetch_github_readme' MCP tool. It parses the repository string, handles validation, delegates to the internal helper method, and serializes the result as a CallToolResult.
    async def fetch_github_readme(repo: str, max_bytes: int = 20480) -> CallToolResult:
        """
        Fetch README file from a GitHub repository.
    
        USE THIS WHEN: You need the project overview, quick start, or basic documentation.
    
        BEST FOR: Getting a high-level understanding of a project.
        The README typically contains installation, usage examples, and project description.
    
        For deeper code exploration, use:
        - get_repo_tree() to see the complete file structure
        - get_file_content() to read specific source files
    
        Args:
            repo: Repository in "owner/repo" format (e.g., "psf/requests")
            max_bytes: Maximum content size, default 20KB
    
        Returns: JSON with README content, size, and metadata
    
        Example: fetch_github_readme("psf/requests") → Returns the requests README
        """
        # Parse owner/repo format
        parts = repo.split("/", 1)
        if len(parts) != 2:
            error_result = {
                "repository": repo,
                "content": "",
                "error": "Invalid repo format. Use 'owner/repo'",
                "size_bytes": 0,
                "source": None,
            }
            return serialize_response_with_meta(error_result)
    
        owner, repo_name = parts
        result = await self._fetch_github_readme(owner, repo_name, max_bytes)
        return serialize_response_with_meta(result)
  • The internal helper method that performs the core logic of fetching the README from the GitHub API, decoding content, converting relative URLs, truncating if necessary, and handling errors.
    async def _fetch_github_readme(
        self, owner: str, repo: str, max_bytes: int = 20480
    ) -> dict[str, Any]:
        """
        Fetch README from GitHub repository.
    
        Args:
            owner: Repository owner
            repo: Repository name
            max_bytes: Maximum content size
    
        Returns:
            Dict with content, size, source info
        """
        try:
            headers = self._get_headers()
            url = f"https://api.github.com/repos/{owner}/{repo}/readme"
    
            async with await self._http_client() as client:
                resp = await client.get(url, headers=headers)
                resp.raise_for_status()
                data = resp.json()
    
            # Decode base64 content
            content = base64.b64decode(data["content"]).decode("utf-8")
    
            # Convert relative URLs to absolute
            # Use the blob URL for the specific branch/path
            data.get("name", "README.md")
            readme_path = data.get("path", "")
            default_branch = "main"  # Could be fetched from repo metadata if needed
    
            base_url = f"https://github.com/{owner}/{repo}/blob/{default_branch}"
            if readme_path and "/" in readme_path:
                # If README is in a subdirectory
                dir_path = "/".join(readme_path.split("/")[:-1])
                base_url = f"{base_url}/{dir_path}"
    
            content = convert_relative_urls(content, base_url)
    
            # Truncate if needed
            if len(content.encode("utf-8")) > max_bytes:
                # Simple truncation for now - could use smart_truncate
                encoded = content.encode("utf-8")[:max_bytes]
                # Handle potential multi-byte character splits
                while len(encoded) > 0:
                    try:
                        content = encoded.decode("utf-8")
                        break
                    except UnicodeDecodeError:
                        encoded = encoded[:-1]
                truncated = True
            else:
                truncated = False
    
            return {
                "repository": f"{owner}/{repo}",
                "content": content,
                "size_bytes": len(content.encode("utf-8")),
                "source": "github_readme",
                "readme_path": readme_path,
                "truncated": truncated,
            }
    
        except httpx.HTTPStatusError as exc:
            return {
                "repository": f"{owner}/{repo}",
                "content": "",
                "error": f"GitHub returned {exc.response.status_code}",
                "size_bytes": 0,
                "source": None,
            }
        except Exception as exc:
            return {
                "repository": f"{owner}/{repo}",
                "content": "",
                "error": f"Failed to fetch README: {exc!s}",
                "size_bytes": 0,
                "source": None,
            }
  • Registration of the 'fetch_github_readme' tool (and related fetch tools) in the GitHubProvider's get_tools() method, conditional on fetch being enabled.
    if is_fetch_enabled():
        tools["fetch_github_readme"] = fetch_github_readme
        tools["list_repo_contents"] = list_repo_contents
        tools["get_file_content"] = get_file_content
        tools["get_repo_tree"] = get_repo_tree
        tools["get_commit_diff"] = get_commit_diff
  • The 'fetch_github_readme' tool is listed in the provider metadata's tool_names (conditionally), indicating it will be exposed as an MCP tool.
    tool_names.extend(
        [
            "fetch_github_readme",
            "list_repo_contents",
            "get_file_content",
            "get_repo_tree",
            "get_commit_diff",
            "list_github_packages",
            "get_package_versions",
        ]
    )

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aserper/RTFD'

If you have feedback or need assistance with the MCP directory API, please join our Discord server