Skip to main content
Glama
pinzonjulian

Turbo Docs MCP Server

by pinzonjulian

reference-frames

Access Turbo Frames API documentation including element attributes, JavaScript methods, lifecycle callbacks, and programmatic control for implementing dynamic page updates.

Instructions

Turbo Frames API reference - detailed frame element attributes, JavaScript methods, lifecycle callbacks, and programmatic frame control

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Implementation Reference

  • Inline handler function for the 'reference-frames' tool, dynamically registered in a loop over docFiles. Fetches markdown content from 'reference/frames.md' using readMarkdownFile and returns it as MCP content block, or error message on failure.
    docFiles.forEach(({ folder, file, name, description }) => {
      server.tool(
        name,
        description,
        async () => {
          try {
            const content = await readMarkdownFile(path.join(folder, file));
            return {
              content: [
                {
                  type: "text",
                  text: content
                }
              ]
            };
          } catch (error) {
            const errorMessage = error instanceof Error ? error.message : String(error);
            return {
              content: [
                {
                  type: "text",
                  text: `Error reading ${file}: ${errorMessage}`
                }
              ]
            };
          }
        }
      );
  • src/config.ts:82-87 (registration)
    Configuration defining the 'reference-frames' tool name, target file path, and description, used during dynamic registration in index.ts.
    {
      folder: 'reference',
      file: 'frames.md',
      name: 'reference-frames',
      description: 'Turbo Frames API reference - detailed frame element attributes, JavaScript methods, lifecycle callbacks, and programmatic frame control'
    },
  • Helper function readMarkdownFile that implements the file fetching logic (cache, GitHub, local fallback) called by the tool handler to load the documentation content.
    export async function readMarkdownFile(filename: string): Promise<string> {
      const filePath = path.join(docsFolder, filename);
      if (!filePath.startsWith(docsFolder)) {
        throw new Error("Invalid file path");
      }
      
      // Get current commit info if we don't have it yet
      if (!mainBranchInfo) {
        try {
          const commitInfo = await fetchMainBranchInformation();
          const cacheKey = `${commitInfo.sha.substring(0, 7)}-${commitInfo.timestamp}`;
          mainBranchInfo = {
            ...commitInfo,
            cacheKey
          };
        } catch (shaError) {
          console.error('Failed to get GitHub commit info, falling back to direct fetch');
        }
      }
      
      // Try to read from cache first if we have commit info
      if (mainBranchInfo) {
        const cachedFilePath = path.join(cacheFolder, mainBranchInfo.cacheKey, filename);
        try {
          const content = await fs.promises.readFile(cachedFilePath, "utf-8");
          console.error(`Using cached content for ${mainBranchInfo.cacheKey}: ${filename}`);
          return content;
        } catch (cacheError) {
          // Cache miss, continue to fetch from GitHub
        }
      }
      
      // Fetch from GitHub
      try {
        return await fetchFromGitHub(filename, mainBranchInfo?.cacheKey);
      } catch (githubError) {
        console.error(`GitHub fetch failed: ${githubError}, attempting to read from local files...`);
        
        // Fallback: read from local files
        try {
          return await fs.promises.readFile(filePath, "utf-8");
        } catch (localError) {
          const githubErrorMessage = githubError instanceof Error ? githubError.message : String(githubError);
          const localErrorMessage = localError instanceof Error ? localError.message : String(localError);
          throw new Error(`Failed to read file from GitHub (${githubErrorMessage}) and locally (${localErrorMessage})`);
        }
      }
    }
  • Supporting utility fetchFromGitHub used by readMarkdownFile to retrieve documentation files from GitHub repo and cache them.
    export async function fetchFromGitHub(filename: string, cacheKey?: string): Promise<string> {
      const githubUrl = `${GITHUB_RAW_BASE_URL}/${filename}`;
    
      console.error(`Fetching ${filename} from GitHub: ${githubUrl}`);
      const response = await fetch(githubUrl);
      
      if (!response.ok) {
        throw new Error(`GitHub fetch failed: ${response.status} ${response.statusText}`);
      }
      
      const content = await response.text();
      
      // Cache the content with cache key if available
      if (cacheKey) {
        try {
          const cacheFolder = path.resolve(__dirname, "../cache");
          const cachedFilePath = path.join(cacheFolder, cacheKey, filename);
          await fs.promises.mkdir(path.dirname(cachedFilePath), { recursive: true });
          await fs.promises.writeFile(cachedFilePath, content, "utf-8");
          console.error(`Cached GitHub content for ${cacheKey}: ${filename}`);
        } catch (cacheError) {
          console.error(`Failed to cache content: ${cacheError}`);
        }
      }
      
      return content;
    }

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/pinzonjulian/turbo-docs-mcp-server'

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