Skip to main content
Glama

browse_community

Explore community persona collections from GitHub to find expert personas for AI interactions, with optional filtering by categories like Programming or Business.

Instructions

커뮤니티 페르소나 컬렉션을 탐색합니다 (GitHub에서 공유된 무료 페르소나)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
categoryNo필터링할 카테고리 (선택사항): Programming, Creative, Business, Education, Design 등

Implementation Reference

  • Main execution logic for browse_community tool: validates args, lists/filter/groups community personas, generates formatted list response.
    case 'browse_community': {
      const validated = browseCommunitySchema.parse(args);
      const personas = await listCommunityPersonas();
    
      if (personas.length === 0) {
        return {
          content: [
            {
              type: 'text',
              text: '📦 커뮤니티 페르소나가 아직 없습니다.\n\nCONTRIBUTING.md를 참조하여 첫 번째 기여자가 되어보세요!',
            },
          ],
        };
      }
    
      // 카테고리 필터링
      let filtered = personas;
      if (validated.category) {
        filtered = personas.filter(p =>
          p.category && p.category.toLowerCase().includes(validated.category!.toLowerCase())
        );
      }
    
      // 카테고리별로 그룹화
      const byCategory: Record<string, CommunityPersona[]> = {};
      filtered.forEach(p => {
        const cat = p.category || 'Other';
        if (!byCategory[cat]) {
          byCategory[cat] = [];
        }
        byCategory[cat].push(p);
      });
    
      let output = '🌟 Community Persona Collection\n\n';
      output += `Found ${filtered.length} persona(s)${validated.category ? ` in category "${validated.category}"` : ''}\n\n`;
    
      for (const [category, list] of Object.entries(byCategory)) {
        output += `## ${category}\n\n`;
        list.forEach(p => {
          output += `### ${p.name}\n`;
          if (p.author) output += `👤 Author: ${p.author}\n`;
          if (p.difficulty) output += `📊 Difficulty: ${p.difficulty}\n`;
          if (p.persona) output += `📝 Description: ${p.persona}\n`;
          if (p['use']) output += `💡 Use Cases: ${p['use']}\n`;
          output += `\n📥 Install: \`install_community_persona\` with name "${p.name}"\n\n`;
        });
      }
    
      output += '\n---\n\n';
      output += '💡 **Tip**: After installing, use @persona:name to activate\n';
      output += '📚 **More info**: See CONTRIBUTING.md to add your own persona\n';
      output += '🎯 **Vision**: Check VISION.md for the Persona Marketplace roadmap';
    
      return {
        content: [
          {
            type: 'text',
            text: output,
          },
        ],
      };
    }
  • Zod schema for validating browse_community tool input (optional category filter).
    export const browseCommunitySchema = z.object({
      category: z.string().optional(),
    });
  • src/index.ts:423-434 (registration)
    Tool registration in ListToolsRequestHandler, defining name, description, and inputSchema.
      name: 'browse_community',
      description: '커뮤니티 페르소나 컬렉션을 탐색합니다 (GitHub에서 공유된 무료 페르소나)',
      inputSchema: {
        type: 'object',
        properties: {
          category: {
            type: 'string',
            description: '필터링할 카테고리 (선택사항): Programming, Creative, Business, Education, Design 등',
          },
        },
      },
    },
  • Helper function to list community personas by reading .txt files from COMMUNITY_DIR and extracting metadata.
    async function listCommunityPersonas(): Promise<CommunityPersona[]> {
      try {
        const files = await fs.readdir(COMMUNITY_DIR);
        const personas: CommunityPersona[] = [];
    
        for (const file of files.filter(f => f.endsWith('.txt'))) {
          const name = file.replace('.txt', '');
          const filePath = path.join(COMMUNITY_DIR, file);
          const content = await fs.readFile(filePath, 'utf-8');
    
          // 메타데이터 추출
          const lines = content.split('\n');
          const metadata: Record<string, string> = {};
          for (const line of lines) {
            if (line.startsWith('# ')) {
              const match = line.match(/^# (\w+):\s*(.+)$/);
              if (match) {
                metadata[match[1].toLowerCase()] = match[2];
              }
            } else if (!line.startsWith('#')) {
              break; // 메타데이터 섹션 끝
            }
          }
    
          personas.push({
            name,
            ...metadata,
            file
          });
        }
    
        return personas;
      } catch (error) {
        console.error('Failed to list community personas:', error);
        return [];
      }
    }
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 mentions the source (GitHub) and that personas are free, but fails to disclose key behavioral traits such as whether this is a read-only operation, if it requires authentication, rate limits, pagination, or what the output format looks like. For a tool with no annotations, this is a significant gap in transparency.

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

Conciseness4/5

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

The description is a single, efficient sentence that conveys the core purpose without unnecessary details. It is front-loaded and wastes no words, though it could benefit from slightly more structure (e.g., separating key points) for clarity.

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 does not explain what the tool returns (e.g., list of personas, details), behavioral constraints, or how it integrates with sibling tools. For a tool with one parameter and no structured output, more context is needed to guide effective use.

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 'category' fully documented in the schema. The description does not add any additional meaning or examples beyond what the schema provides (e.g., how categories affect browsing). Baseline score of 3 is appropriate as the schema handles parameter documentation adequately.

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 ('browse') and resource ('community persona collection'), specifying that it's free personas shared on GitHub. It distinguishes from siblings like 'list_personas' by focusing on community rather than local personas, though not explicitly. However, it could be more specific about what 'browse' entails (e.g., searching or viewing).

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?

No explicit guidance on when to use this tool versus alternatives like 'list_personas' or 'suggest_persona'. The description implies usage for exploring community personas, but lacks context on prerequisites, exclusions, or comparisons with sibling tools, leaving the agent to infer usage scenarios.

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/seanshin0214/persona-mcp'

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