Skip to main content
Glama
Hoseong21

github-portfolio-mcp

by Hoseong21

github-portfolio-mcp

GitHub 포트폴리오 레포를 검색하고 조회하는 토이 MCP 서버입니다.

📋 개요

우아한형제들 기술 블로그의 MCP 해커톤 후기를 참고해 MCP의 개념 및 구조를 학습하고,
이를 참고하여 GitHub API를 연동한 MCP 서버를 구현하고 Claude Desktop에 연결해본 토이 프로젝트입니다.

Related MCP server: Portfolio MCP Server

🛠️ 기능

Claude Desktop에 연결하면 자연어로 GitHub 포트폴리오를 조회할 수 있습니다.

  • list_repos — 전체 공개 레포 목록과 설명을 가져온다

  • search_repos — 키워드로 레포 이름/설명을 검색한다

  • get_readme — 특정 레포의 README 내용을 가져온다 (최대 3000자)

💡 배운 점

  • MCP SDK v1 → v2 마이그레이션: 개발 중 SDK가 v2로 업데이트되면서 FastMCP 클래스가 MCPServer로 이름이 바뀜 (mcp.server.fastmcpmcp.server.mcpserver). 공식 마이그레이션 가이드를 참고해 import 경로만 수정해서 해결. 데코레이터(@mcp.tool())나 나머지 로직은 그대로 유지됨.

  • tool의 description이 곧 사용성: LLM은 함수의 docstring만 보고 언제/어떻게 호출할지 스스로 판단하기 때문에, 이 설명을 얼마나 명확히 쓰느냐가 tool의 실사용성을 좌우한다.

  • 시스템 Python 격리: macOS 기본 Python(3.9.6)을 건드리지 않고 uv로 프로젝트별 Python 버전(3.12)을 관리하는 방식으로 진행.

⚠️ 한계

  • search_repos는 이름/설명에 대한 단순 부분 문자열 매칭이라, README 본문 검색이나 유사어 검색은 불가능합니다 (예: "RAG"로 검색해도 이름에 "RAG"가 없으면 못 찾음).

  • get_readme는 3000자 이후 내용이 잘립니다.

  • GitHub 공개 레포만 조회 가능합니다. (private 레포 미지원).

🖥️ 실행 예시

Claude Desktop에서 자연어로 질문하면 실제 GitHub API를 호출해서 답합니다.

search_repos와 get_readme 실행 예시

Available Tools

3 tools
get_readmeA

특정 레포의 README 내용을 가져옵니다.

Args:
    repo_name: 정확한 레포 이름 (예: "MIMIC-IV-ICU-LOS")
ParametersJSON Schema
NameRequiredDescriptionDefault
repo_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are provided, so the description carries the behavioral burden. It adds the useful constraint that repo_name must be exact and provides an example, but it does not disclose error behavior, access requirements, or any edge cases. This is minimal but acceptable for a simple read operation.

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 very short, front-loaded with the core purpose, and includes a compact parameter explanation. Every sentence earns its place with no filler.

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

Completeness3/5

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

For a single-parameter tool with an output schema, the description is adequate but not fully complete. It lacks sibling-routing guidance and behavioral caveats, though these are less critical given the tool's simplicity.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains that repo_name means the exact repository name and gives a concrete example, adding value beyond the schema's plain string type.

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

Purpose5/5

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

The description states a specific verb and resource: fetching the README content of a specific repository. This clearly distinguishes the tool from the sibling search_repos and list_repos tools, which operate on repo discovery/listing rather than README retrieval.

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 gives no guidance on when to use this tool instead of search_repos or list_repos, and does not mention any prerequisites or exclusions. An agent must infer that this is for retrieving READMEs from already-known repositories.

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

list_reposA

내 GitHub 계정의 모든 공개 레포 목록을 이름과 설명과 함께 가져옵니다.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

No annotations are present, so the description carries the full burden. It does disclose the operational scope (only public repos), the resource owner (the GitHub account), and the returned content (names and descriptions). However, it does not mention authentication requirements, pagination, rate limits, or ordering, which are relevant for a listing endpoint.

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, focused sentence with no filler or redundant information. It front-loads the action and resource, making it easy for an agent to understand the tool quickly.

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

Completeness4/5

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

For a parameterless list tool with an output schema and simple sibling context, the description is largely complete. It states the scope, subject, and included fields. It could slightly improve by noting that this is a read-only operation and whether the public-repo scope is the only intended use case.

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

Parameters4/5

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

The tool has zero parameters and the schema description coverage is 100%, so there are no parameters to document. The description adds meaningful context about what the result will include, which is sufficient for a parameterless tool.

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

Purpose5/5

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

The description states a specific action ('가져옵니다' fetches) and a specific resource: all public repositories in the user's GitHub account, with names and descriptions. This clearly differentiates the tool from siblings like search_repos, which searches across repositories rather than listing the account's own public repos.

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

Usage Guidelines3/5

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

The description implies the tool is for listing the authenticated user's public repositories, but it does not explicitly state when to prefer this over search_repos or get_readme. There is no exclusionary guidance or mention of alternatives, so usage context is only implied rather than directed.

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

search_reposA

키워드로 내 레포 이름과 설명을 검색합니다.

Args:
    keyword: 검색할 키워드 (예: "RAG", "텍스트마이닝")
ParametersJSON Schema
NameRequiredDescriptionDefault
keywordYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses the behavior (searching and returning matching repos) and indicates a read-only action. However, it does not mention potential side effects, return format, or error cases, though these are not critical for a search tool.

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 concise and focused, containing only the essential information: the tool's purpose and the parameter definition. No unnecessary words or redundant details.

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

Completeness5/5

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

For a simple search tool, the description provides sufficient context: it specifies what is searched (repo names and descriptions) and what the keyword is. No additional context needed for correct usage.

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

Parameters4/5

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

The description explicitly defines the 'keyword' parameter as the search term, which adds meaning beyond the bare schema type. Since the parameter coverage is 100% and the description enriches it, a score above baseline is warranted.

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

Purpose5/5

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

The description clearly states the tool's function: searching repository names and descriptions by keyword. It is specific and distinct from sibling tools (list_repos lists all repos, get_readme fetches a specific repo's readme).

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

Usage Guidelines3/5

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

The description does not explicitly mention when to use this tool versus alternatives like list_repos or get_readme. The intent is implied but not stated, leaving some ambiguity for the agent.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 3 tool updatesv0.1.0
    • First observedget_readme
    • First observedlist_repos
    • First observedsearch_repos

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation4/5

Each tool has a distinct purpose, but search_repos and list_repos both return repository names and descriptions, with the only difference being keyword filtering. This overlap is manageable but could cause minor selection confusion.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case: search_repos, get_readme, list_repos. The naming convention is uniform and predictable.

Tool Count5/5

With only 3 tools, the set is tightly scoped to a portfolio viewing purpose. Each tool is essential and there is no clutter or redundancy.

Completeness5/5

For a read-only portfolio server, the tools cover the core workflows: listing all repositories, searching by keyword, and retrieving a README. No critical operations are missing given the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

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/Hoseong21/github-portfolio-mcp'

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