Skip to main content
Glama
README.md
# mcp-perfil

Currículo + portfólio vivo: um servidor MCP (Model Context Protocol) que expõe seu
perfil profissional como ferramentas consumíveis por agentes de IA (Claude Code,
Claude Desktop, Cursor, VS Code, qualquer cliente MCP), e que também serve uma
landing page bonita e um PDF de currículo bilíngue (PT/EN) — tudo gerado na hora,
direto de um único arquivo de dados (`profile.json`).

Este README é um guia de replicação: siga os passos para transformar isto no
**seu** perfil, do zero ao deploy.

## O que você ganha

- **Servidor MCP** (`get_experiences`, `get_skills`, `get_projects`, `get_summary`,
  `get_recommendations`, `get_github_repos`, `get_github_repo`) — qualquer agente de
  IA pode consultar seu histórico profissional em tempo real.
- **Landing page** bilíngue (PT/EN), com modo "view as agent" (texto puro para LLMs),
  projetos puxados ao vivo do GitHub (com cache), e uma seção "para agentes" com o
  comando de instalação do seu MCP pronto para copiar.
- **Currículo em PDF**, gerado na hora a partir dos mesmos dados, nos dois idiomas,
  disponível em `/resume` e `/resume?lang=en`.
- **Testes automatizados** (`npm test`) que travam a integridade dos dados: se você
  adicionar uma experiência/projeto sem a tradução em inglês correspondente, a
  suíte falha antes de você publicar.
- **CI no GitHub Actions**, rodando os testes a cada push/PR.

## 1. Fork e instalação

```bash
git clone https://github.com/<seu-usuario>/mcp-perfil.git
cd mcp-perfil
npm install
```

## 2. Edite `profile.json` com os seus dados

Esse arquivo é a única fonte de verdade — landing page, PDF e ferramentas MCP leem
dele. Campos principais:

| Campo | O que é |
|---|---|
| `nome`, `nome_exibicao` | Nome completo e nome curto exibido no site |
| `titulo`, `localizacao`, `resumo_curto`, `resumo` | Headline, cidade, resumo curto (hero/currículo) e resumo longo |
| `contato.linkedin` / `.github` / `.site` | Links do rodapé e do currículo |
| `habilidades` | Objeto de categorias → lista de skills (vira os chips na página e as seções do PDF) |
| `idiomas` | `[{ "idioma": "...", "nivel": "..." }]` |
| `experiencias` | `[{ cargo, empresa, inicio, fim, descricao, tecnologias[] }]` — bullets de `descricao` começam com `"- "` |
| `formacao` | `[{ curso, instituicao, local, inicio, fim }]` |
| `certificacoes` | `[{ nome, instituicao, emissao, credencial }]` |
| `projetos` | `[{ nome, descricao, link, tecnologias[], categoria, status }]` — `nome` deve bater com o nome do repositório no GitHub para puxar estrelas/linguagem ao vivo |
| `recomendacoes_recebidas` | `[{ autor, cargo_autor, relacao, data, texto }]` |
| `github_usuario` | Seu usuário do GitHub, usado para listar repositórios públicos |

Troque também os assets em `public/`:

- `public/favicon.jpg` — ícone do site
- `public/portrait.mp4` — vídeo curto do seu rosto, usado no efeito de pontos do hero
  (mudo, alguns segundos, de preferência fundo neutro — o efeito faz a extração de
  silhueta automaticamente)

E o e-mail de contato: procure por `jeansaantos89@gmail.com` em
`src/landing-page.js` e `src/resume.js` e troque pelo seu.

## 3. Traduza para inglês (`src/i18n.js`)

A página e o PDF renderizam em inglês por padrão e trocam para português no
clique do botão EN/PT. As traduções vivem em dicionários PT→EN dentro de
`src/i18n.js` (`ROLES`, `BULLETS`, `PROJECTS`, `TITLES`, `TERMS`, etc.) e são
aplicadas pela função `en()`.

Depois de editar `profile.json`, rode os testes — eles apontam exatamente o que
ainda falta traduzir:

```bash
npm test
```

Se aparecer `missing EN translation for ...`, adicione a entrada correspondente
no dicionário certo em `i18n.js` (o próprio erro já mostra o texto que falta).

## 4. Rode localmente

```bash
npm run start:http
```

Abre em `http://localhost:3000`. Edite `profile.json` e dê refresh para ver as
mudanças — não há build, tudo é renderizado a cada request.

Para usar via stdio (Claude Desktop/Code local, sem subir servidor HTTP):

```bash
npm start
```

## 5. Deploy gratuito (Render)

1. Suba o fork no GitHub.
2. Crie uma conta em [render.com](https://render.com) (login com GitHub, sem cartão).
3. **New +** → **Web Service** → selecione o repositório.
4. Configure:
   - Runtime: Node
   - Build Command: `npm install`
   - Start Command: `npm run start:http`
   - Instance Type: Free
5. Depois do deploy, a URL pública (ex: `https://seu-app.onrender.com/mcp`) já pode
   ser usada em qualquer cliente MCP compatível com Streamable HTTP.

> O plano free do Render "dorme" após 15 min de inatividade — a primeira
> requisição após esse período pode levar ~1 min para responder. Para evitar
> isso, configure um cronjob externo (ex: [cron-job.org](https://cron-job.org),
> grátis) batendo a cada 10 min em `https://seu-app.onrender.com/health` —
> essa rota responde um "ok" mínimo, pensada exatamente para pingers de
> keep-alive (a página completa é grande demais para a maioria desses serviços).
> Mantendo um único serviço free sempre ativo você fica dentro da cota de 750h
> de instância gratuita por mês do Render; se tiver outro serviço free na
> mesma conta, as horas somam e podem estourar o limite.

## 6. Conecte num cliente MCP

Com o servidor rodando (local ou no Render), a própria landing page mostra o
comando de instalação pronto na seção "for agents", para Claude Code, Cursor,
VS Code e `curl`. Exemplo (Claude Code):

```bash
claude mcp add --transport http perfil https://seu-app.onrender.com/mcp
```

## Estrutura

```
profile.json          — todos os dados do perfil (a única fonte de verdade)
public/                — favicon e vídeo do retrato
src/
  create-server.js     — tools/resources do MCP, leitura do profile.json e da API do GitHub
  server.js            — entrada stdio (uso local em clientes MCP)
  http-server.js        — entrada HTTP: landing page, PDF do currículo, /health, e /mcp (Streamable HTTP)
  landing-page.js       — renderiza a landing page (HTML+CSS+JS inline, sem build step)
  resume.js             — gera o PDF do currículo (pdfkit), bilíngue
  i18n.js               — dicionários de tradução PT→EN e textos de UI
tests/                 — node --test: integridade de tradução, estrutura da página, PDF, rotas HTTP
.github/workflows/      — CI rodando os testes a cada push/PR
```

## Rodando os testes

```bash
npm test
```

Cobre: toda experiência/projeto/formação tem tradução em inglês registrada,
a página renderiza um card/entrada por item do `profile.json` (sem hardcode de
conteúdo), o PDF do currículo é gerado com sucesso nos dois idiomas, e as rotas
HTTP respondem como esperado — incluindo um teste de regressão para a proteção
contra path traversal na rota de arquivos estáticos.

## Licença

[MIT](LICENSE) — use, copie, modifique e redistribua à vontade, inclusive
comercialmente, só mantendo o aviso de copyright.

TDQS

A3.5/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a clearly distinct resource or action: experiences, skills, projects, summary, recommendations, GitHub repo list, and GitHub repo detail. The list-versus-detail distinction for GitHub is explicit, leaving no meaningful overlap.

Naming Consistency4/5

Six tools follow a consistent Portuguese verb_noun snake_case pattern (buscar_*, listar_*), and all use snake_case. The exception is 'resumo_perfil', a noun phrase that breaks the verb-first convention.

Tool Count5/5

Seven tools is well-scoped for a read-only professional profile server. Each tool earns its place by covering a distinct profile section or GitHub operation.

Completeness3/5

The surface covers summary, experiences, skills, projects, recommendations, and GitHub repositories, but omits common profile sections like education, certifications, and languages. These are notable gaps that could cause agent failures for users expecting full profile coverage.

Maintenance

ActivityMaintained
ResponsivenessNo issues