geo-explorer
Geo-Explorer
Geo-Explorer란?
Geo-Explorer는 DIO (Digital Innovation One)에서 영감을 받은 가상의 학습 플랫폼입니다. 이 프로젝트는 코드 챌린지와 인증서 발급을 포함한 학습 트랙 시스템을 시뮬레이션합니다.
다음을 위한 학습 기반으로 사용됩니다:
TypeScript CLI 도구 개발
플랫폼 로직을 AI 에이전트(Bob, Claude Desktop, Cursor 등)가 호출할 수 있는 도구로 노출하는 MCP Server 구축
Bob에서 채팅에서 직접 도구를 실행하기 위한 로컬 슬래시 명령 정의
100% 커버리지의 단위 테스트 실습
Related MCP server: MCP Learning Project
프로젝트 구조
geo-explorer/
│
├── commands/ # Comandos CLI executáveis via npm run
│ ├── lib/
│ │ └── trilhas.ts # Leitura de data/trilhas_dio.json e função findTrilha()
│ ├── trilha.ts # /trilha <tecnologia>
│ ├── desafio.ts # /desafio <tecnologia> [nivel]
│ └── certificado.ts # /certificado --nome "<nome>" --tech "<tecnologia>" (flags) ou posicional
│
├── data/
│ └── trilhas_dio.json # Base de dados com 35 trilhas DIO
│
├── mcp/ # MCP Server (pacote independente)
│ ├── src/
│ │ └── index.ts # Entry-point do servidor MCP (stdio transport)
│ ├── build/ # Saída compilada (gerada por npm run build, não versionada)
│ ├── package.json
│ ├── tsconfig.json
│ └── README.md # Documentação específica do servidor MCP
│
├── tests/ # Testes unitários (Vitest)
│ ├── trilha.test.ts
│ ├── desafio.test.ts
│ └── certificado.test.ts
│
├── .bob/
│ ├── commands/ # Slash commands locais do Bob
│ │ ├── trilha.md
│ │ ├── desafio.md
│ │ └── certificado.md
│ ├── mcp.example.json # Template de registro do MCP Server (versionado)
│ └── mcp.json # Configuração local do MCP Server (não versionada)
│
├── package.json
├── tsconfig.json
└── vitest.config.mts실행 방법
사전 요구 사항
Node.js ≥ 18
npm ≥ 9
설치
# Na raiz do projeto
npm install
# Para o servidor MCP (pacote separado)
cd mcp
npm install빌드(타입 검사)
# Raiz — verifica os tipos sem emitir arquivos
npm run build
# MCP Server — compila TypeScript para JavaScript em mcp/build/
cd mcp
npm run buildMCP 서버 빌드는 서버를 등록하기 전에 최소한 한 번은 실행해야 합니다.
명령 사용 방법
세 가지 CLI 명령은 프로젝트 루트에서 npm run을 통해 실행됩니다.
/trilha <tecnologia>
기술 이름(또는 이름의 일부)을 기준으로 트랙의 전체 학습 계획을 표시합니다. 검색은 대소문자를 구분하지 않으며 부분 일치를 허용합니다.
npm run trilha -- javascript출력:
╔══════════════════════════════════════════════════════╗
🎯 PLANO DE ESTUDOS — JAVASCRIPT DEVELOPER
╚══════════════════════════════════════════════════════╝
Tecnologia : JavaScript
Nível : Básico
Total de XP : 12.000 XP
Acesso : Por período
Promoção : ✅ Disponível
Lives ao vivo: 4
── MÓDULOS ──────────────────────────────────────────
1. Fundamentos de JavaScript e ambiente de execução
2. Tipos de dados, variáveis e operadores
3. Estruturas de controle e funções
4. Manipulação do DOM e eventos
5. ES6+: arrow functions, promises e async/await
6. Projeto final: aplicação web interativa
── BADGES DISPONÍVEIS ───────────────────────────────
🏅 JS Fundamentals
🏅 DOM Master
🏅 ES6+ Hero
Bons estudos! 🚀/desafio <tecnologia> [nivel]
무작위 코드 챌린지를 생성합니다. nivel 매개변수는 선택 사항이며, 생략하면 트랙에 등록된 레벨을 사용합니다. 허용되는 레벨 값: básico, intermediário, avançado(악센트 유무와 관계없이, 대소문자 구분 없음).
# Sem nível (usa o nível da trilha)
npm run desafio -- typescript
# Com nível explícito
npm run desafio -- python avançado출력(예시):
╔══════════════════════════════════════════════════════╗
⚔️ DESAFIO DE CÓDIGO — TYPESCRIPT
╚══════════════════════════════════════════════════════╝
Nível : Intermediário
Trilha base: Formação TypeScript Fullstack
── ENUNCIADO ────────────────────────────────────────
Implemente uma classe Stack (pilha) com os métodos push, pop, peek e isEmpty.
── CRITÉRIOS DE AVALIAÇÃO ───────────────────────────
✔ Código legível e bem estruturado
✔ Tratamento de casos extremos (edge cases)
✔ Complexidade de tempo e espaço adequada ao nível
✔ Testes mínimos demonstrando o funcionamento
Boa sorte! 💪/certificado
Markdown 형식의 가상 인증서를 발급합니다. 인증서 ID는 결정적입니다 — 학생 이름과 트랙 ID에서 생성됩니다.
이 명령은 두 가지 방식의 인자 전달을 지원합니다:
# Forma recomendada — flags explícitas; cada flag coleta todos os tokens
# até a flag seguinte, então valores com espaços funcionam normalmente
npm run certificado -- --nome "Maria Silva" --tech "TypeScript"
npm run certificado -- --nome "Ana Lima" --tech "Data Science"
# Forma posicional — o primeiro argumento vira nome e o segundo vira tecnologia;
# aspas fazem o shell entregar cada valor como um único elemento de argv,
# então espaços dentro de cada valor funcionam normalmente
npm run certificado -- "Ana Lima" "TypeScript"
npm run certificado -- "Ana" "Data Science"위치 기반 방식에서 파서는 정확히 두 개의 인자를 기대합니다(
argv[0]→ 이름,argv[1]→ 기술). 더 명시적인 구문을 선호하거나 셸 따옴표에 의존하지 않으려면--nome및--tech플래그를 사용하세요.
출력(Markdown):
# 🎓 CERTIFICADO DE CONCLUSÃO
---
**A Digital Innovation One certifica que**
## Maria Silva
**concluiu com êxito a trilha:**
# Formação TypeScript Fullstack
---
| Campo | Detalhe |
|--------------------|------------------------------------|
| **Tecnologia** | TypeScript |
| **Nível** | Intermediário |
| **Módulos** | 9 módulos concluídos |
| **XP conquistado** | 22.000 XP |
| **Lives ao vivo** | 6 aulas |
| **Emitido em** | <data de hoje> |
| **Certificado ID** | `DIO-002-XXXXXXXX` |
---
### Badges conquistadas
- 🏅 TS Beginner
- 🏅 TS Advanced
- 🏅 Fullstack Badge파일로 리디렉션:
npm run certificado -- --nome "Maria Silva" --tech "TypeScript" > certificado.md
Bob 채팅에서 사용하기
이 프로젝트는 .bob/commands/에 세 가지 로컬 슬래시 명령을 정의합니다. Bob에서 프로젝트를 연 후, 이 명령들은 채팅에서 바로 사용할 수 있습니다:
명령 | 구문 | 기능 |
|
|
|
|
|
|
|
|
|
채팅 사용 예시:
/trilha react
/desafio java intermediário
/certificado "Ana Lima" "Data Science"Bob은 인자를 해석하고 올바른 명령을 구성하여 채팅에서 포맷된 출력을 표시합니다.
테스트 실행 방법
# Executa os testes sem cobertura
npm test
# Executa os testes com relatório de cobertura
npm run test:coverage현재 결과
✔ tests/trilha.test.ts (14 testes)
✔ tests/certificado.test.ts (24 testes)
✔ tests/desafio.test.ts (20 testes)
Test Files 3 passed (3)
Tests 58 passed (58)
Duration 1.71s
% Coverage report from v8
------------------|---------|----------|---------|---------|
File | % Stmts | % Branch | % Funcs | % Lines |
------------------|---------|----------|---------|---------|
All files | 100 | 100 | 100 | 100 |
commands | 100 | 100 | 100 | 100 |
certificado.ts | 100 | 100 | 100 | 100 |
desafio.ts | 100 | 100 | 100 | 100 |
trilha.ts | 100 | 100 | 100 | 100 |
commands/lib | 100 | 100 | 100 | 100 |
trilhas.ts | 100 | 100 | 100 | 100 |
------------------|---------|----------|---------|---------|
Statements : 100% (49/49) | Branches : 100% (28/28) | Functions : 100% (14/14) | Lines : 100% (43/43)MCP Server
제공하는 기능
mcp/src/index.ts의 MCP 서버는 commands/의 명령 로직을 직접 재사용하며 네 가지 도구를 제공합니다:
도구 | 매개변수 | 설명 |
| (없음) | 사용 가능한 모든 기술을 레벨 및 총 XP와 함께 나열 |
|
| 한 기술의 전체 학습 계획을 반환 |
|
| 무작위 코드 챌린지 생성 |
|
| Markdown 형식의 인증서 발급 |
사용되는 전송 방식은 stdio입니다 — 서버는 MCP 클라이언트에 의해 자식 프로세스로 시작됩니다.
Bob에 등록하는 방법
서버를 빌드합니다(한 번만 필요):
cd mcp npm install npm run build구성 템플릿을 복사합니다:
cp .bob/mcp.example.json .bob/mcp.json.bob/mcp.json을 편집하여 경로를 자신의 머신 절대 경로로 바꿉니다:{ "mcpServers": { "geo-explorer": { "command": "node", "args": ["/caminho/absoluto/para/geo-explorer/mcp/build/mcp/src/index.js"] } } }Bob은 파일을 저장하면 MCP 서버를 자동으로 다시 로드합니다. 이후 geo-explorer가 Bob의 MCP 패널에 연결된 서버로 표시됩니다.
.bob/mcp.json파일은.gitignore에 포함되어 있습니다 — 각 개발자는 자신의 절대 경로를 로컬에서 관리합니다.
수행된 개선 사항
수동 테스트에서 발견된 수정 사항
명령을 해피 패스(happy path)를 넘어 검증했을 때 초기 테스트가 잡지 못한 두 가지 결함이 나타났습니다:
/certificado는 기술 이름에 공백이 있을 때("Data Science") 멈췄습니다. 파싱이 인자의 위치에 의존했고 이름이 끝나는 위치를 구분하지 못했습니다. 위치 기반 모드를 폴백으로 유지하면서 명시적인--nome및--tech플래그로 수정했습니다./trilha는 실제 이름 대신"Módulo 1, Módulo 2..."를 표시했습니다. 코드가numero_de_modulos필드에서 레이블을 생성했고 JSON의modulos배열을 무시했습니다 — 데이터는 정확했는데, 그것을 소비하는 쪽에서 읽지 않았던 것입니다.findTrilha는 빈 입력에 대해 카탈로그의 첫 번째 트랙을 반환했습니다."".includes("")가 항상 참이기 때문입니다. 검증이 CLI에는 있었지만, Zod 스키마가 공백 문자열을 허용하는 MCP 서버에는 없었습니다. 근본 원인에서 수정했습니다.
추정이 아닌 측정된 커버리지
목표는 70% 커버리지였습니다. 숫자를 주장하는 대신, 실제로 측정하도록 Vitest의 v8 provider를 구성했고, 파일로 기록되는 보고서와 재현 가능한 npm 스크립트를 포함했습니다. CLI entrypoint는 명시적인 근거를 들어 계산에서 제외했고, 그 후 발견된 나머지 브랜치들에는 테스트를 추가했습니다. 결과: 테스트 가능한 로직 기준 100%, 테스트 59개.
순수 로직과 I/O 분리
각 명령은 두 계층으로 리팩터링되었습니다: 내보내진 순수 함수와 require.main === module 가드로 분리된 run() 함수입니다. 이로써 process.argv 모킹 없이 코드를 테스트할 수 있게 되었고, MCP 서버가 중복 없이 동일한 로직을 가져올 수 있게 되었습니다.
버전 관리에서 제외된 로컬 구성
.bob/mcp.json은 머신의 절대 경로를 요구합니다. 내 컴퓨터에서만 작동하는 경로를 버전 관리에 넣는 대신, placeholder가 포함된 .bob/mcp.example.json을 버전 관리에 넣고 실제 파일은 무시했습니다 — .env.example과 동일한 패턴입니다.
생성된 문서 검토
에이전트가 생성한 문서는 줄 단위로 검토되었고 부정확한 내용이 포함되어 있었습니다: 잘못된 트랙 수(35 대신 15), 코드와 일치하지 않는 파서 설명, 그리고 trade-off를 인정하는 대신 중복 필드를 합리화한 모델링 근거입니다. 모두 코드를 기준으로 수정되었습니다.
배운 점
에이전트는 빠르게 생성하지만 검증하지 않습니다. 효과가 있었던 주기는 항상 동일했습니다: 요청하고, 결과를 읽고, 오류 경로를 테스트하고, 수정하는 것입니다. 이 프로젝트의 세 가지 버그는 모두 수동 테스트에서 나타났으며, 에이전트가 완료라고 보고한 내용에서는 절대 나타나지 않았습니다. 에이전트는 자신의 파서를 두 번이나 잘못 설명했습니다 — 의도를 설명했지 코드를 설명한 것이 아닙니다.
주장된 숫자는 측정된 숫자가 아닙니다. 참조 프로젝트는 커버리지 도구를 하나도 설치하지 않은 상태에서 100% 커버리지를 선언했습니다. 이는 말하는 것과 입증하는 것의 차이이며, 누군가 확인하려 할 때만 드러납니다.
기본 보안 방식은 종종 가장 약한 선택입니다. 원래 지침은 토큰을 디스크에 평문으로 저장하는
credential.helper store를 사용하라고 했습니다. 동일한 요구 사항을 암호화된 저장소로 충족하는 Git Credential Manager로 교체했습니다. GitHub 토큰은 사용자 환경 변수에 두었으며, 프로젝트 파일에는 절대 넣지 않았습니다 — 이는 저장소에 자격 증명을 보내지 말라는 챌린지 지침에도 부합하는 결정입니다.결정을 문서화하는 것은 코드를 문서화하는 것과 다릅니다.
ARQUITETURA.md는 각 섹션이 문제, 기각된 대안, 선택 이유를 기록하기 시작했을 때 비로소 유용해졌습니다. 코드가 무엇을 하는지 설명하는 것은 중복입니다 — 코드는 이미 그 자리에 있습니다.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP server that enables LLMs to interact with the Moodle platform to manage courses, students, assignments, and quizzes.711MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive learning platform for Model Context Protocol development that teaches MCP concepts through hands-on modules including text processing, file operations, and database integration. Designed as an educational tool with progressive difficulty levels from basic to advanced MCP server development.MIT
- FlicenseNot gradedqualityDmaintenanceAI-powered MCP server that transforms learning by finding best YouTube tutorials, generating personalized learning paths, and tracking progress for any tech skill.10
- AlicenseAqualityCmaintenanceAn MCP server that exposes certifications, projects, and an AI engineering learning roadmap as callable tools for MCP clients like Claude Desktop.41MIT
Related MCP Connectors
MCP server for skill documentation, generated by doc2mcp.
A MCP server built for developers enabling Git based project management with project and personal…
MCP server for the Inistate platform: module discovery, entry management, and activity submission.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/juanidives/geo-explorer'
If you have feedback or need assistance with the MCP directory API, please join our Discord server