Skip to main content
Glama
lallen30

BluestoneApps MCP Remote Server

by lallen30

get_hook_example

Retrieve React Native hook examples from BluestoneApps coding standards to implement specific functionality in your application.

Instructions

Get a React Native hook example

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
hook_nameYesHook Name

Implementation Reference

  • The handler function for the get_hook_example MCP tool. Retrieves a React Native hook example by name from the codebase examples directory, supporting exact and fuzzy matching, and returns markdown content or error messages.
    async ({ hook_name }) => {
      if (!hook_name) {
        return {
          content: [
            {
              type: "text",
              text: "Hook name not specified",
            },
          ],
        };
      }
      
      try {
        // First try exact match
        const result = getExampleContent("hooks", hook_name);
        
        if (result.error) {
          // Try to find by fuzzy match
          const hooksDir = path.join(CODE_EXAMPLES_DIR, "react-native", "hooks");
          const closestMatch = findClosestMatch(hooksDir, hook_name);
          
          if (closestMatch) {
            const fuzzyResult = getExampleContent("hooks", closestMatch);
            return {
              content: [
                {
                  type: "text",
                  text: fuzzyResult.content?.[0] ?? fuzzyResult.error ?? "Error: No content available",
                },
              ],
            };
          } else {
            return {
              content: [
                {
                  type: "text",
                  text: `Hook ${hook_name} not found`,
                },
              ],
            };
          }
        }
        
        return {
          content: [
            {
              type: "text",
              text: result.content?.[0] ?? result.error ?? "Error: No content available",
            },
          ],
        };
      } catch (err) {
        console.error(`Error getting hook example ${hook_name}:`, err);
        return {
          content: [
            {
              type: "text",
              text: `Error getting hook example: ${err}`,
            },
          ],
        };
      }
    },
  • Zod input schema for the get_hook_example tool, defining the required hook_name string parameter.
    {
      hook_name: z.string().describe("Hook Name"),
    },
  • src/index.ts:298-367 (registration)
    Registration of the get_hook_example tool on the MCP server using server.tool() with name, description, schema, and inline handler.
    server.tool(
      "get_hook_example",
      "Get a React Native hook example",
      {
        hook_name: z.string().describe("Hook Name"),
      },
      async ({ hook_name }) => {
        if (!hook_name) {
          return {
            content: [
              {
                type: "text",
                text: "Hook name not specified",
              },
            ],
          };
        }
        
        try {
          // First try exact match
          const result = getExampleContent("hooks", hook_name);
          
          if (result.error) {
            // Try to find by fuzzy match
            const hooksDir = path.join(CODE_EXAMPLES_DIR, "react-native", "hooks");
            const closestMatch = findClosestMatch(hooksDir, hook_name);
            
            if (closestMatch) {
              const fuzzyResult = getExampleContent("hooks", closestMatch);
              return {
                content: [
                  {
                    type: "text",
                    text: fuzzyResult.content?.[0] ?? fuzzyResult.error ?? "Error: No content available",
                  },
                ],
              };
            } else {
              return {
                content: [
                  {
                    type: "text",
                    text: `Hook ${hook_name} not found`,
                  },
                ],
              };
            }
          }
          
          return {
            content: [
              {
                type: "text",
                text: result.content?.[0] ?? result.error ?? "Error: No content available",
              },
            ],
          };
        } catch (err) {
          console.error(`Error getting hook example ${hook_name}:`, err);
          return {
            content: [
              {
                type: "text",
                text: `Error getting hook example: ${err}`,
              },
            ],
          };
        }
      },
    );
  • Helper function called by the handler to locate and read the content of example files in the react-native/{subcategory} directories.
    // Helper function to get example content
    function getExampleContent(subcategory: string, filename: string): { content?: string[]; path?: string; error?: string } {
      const searchDir = path.join(CODE_EXAMPLES_DIR, "react-native", subcategory);
      
      const filePath = findFileInSubdirectories(searchDir, filename);
      
      if (!filePath || !fs.existsSync(filePath)) {
        return { error: `Example ${filename} not found` };
      }
      
      try {
        const content = fs.readFileSync(filePath, 'utf8');
        return {
          content: [content],
          path: path.relative(BASE_DIR, filePath)
        };
      } catch (err) {
        console.error(`Error reading example ${filename}:`, err);
        return { error: `Error reading example ${filename}` };
      }
    }
  • Helper function used for fuzzy matching of hook filenames when exact match fails.
    function findClosestMatch(directory: string, searchName: string, extensions: string[] = ['.js', '.jsx', '.ts', '.tsx']) {
      if (!fs.existsSync(directory)) return null;
      
      let closestMatch = null;
      
      for (const ext of extensions) {
        const files = glob.sync(`${directory}/**/*${ext}`);
        
        for (const filePath of files) {
          const fileName = path.basename(filePath);
          const fileNameNoExt = path.basename(fileName, path.extname(fileName));
          
          if (fileNameNoExt.toLowerCase().includes(searchName.toLowerCase())) {
            closestMatch = fileNameNoExt;
            break;
          }
        }
        
        if (closestMatch) break;
      }
      
      return closestMatch;
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It states the tool 'gets' an example, implying a read operation, but doesn't disclose behavioral traits such as what format the example is returned in, if there are rate limits, or if it requires authentication. This is a significant gap for a tool with no annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with zero waste. It's front-loaded and appropriately sized for the tool's purpose, making it efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what the tool returns (e.g., code snippet, documentation), how examples are sourced, or any limitations. For a tool with no structured output information, more context is needed to be fully helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the parameter 'hook_name' documented in the schema. The description adds no additional meaning beyond implying the parameter is for specifying a hook name, which is already clear from the schema. Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('a React Native hook example'), making the purpose understandable. However, it doesn't differentiate from sibling tools like 'get_component_example' or 'get_screen_example' beyond specifying 'hook' as the example type, which is somewhat helpful but not fully distinctive.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when-not scenarios, prerequisites, or refer to sibling tools like 'list_available_examples' for discovery, leaving usage context unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/lallen30/mcp-remote-server'

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