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

Servidor MCP que deixa o Claude (claude.ai, Claude Desktop e Claude Code)
consultar o conteúdo publicado mais recente do [IA.med](https://app.iamed.cc)
sobre IA aplicada à medicina: artigos, news, podcasts, aulas, eventos,
conferências e repositórios. Faz parte da família de MCPs do IA.med
([iamed.cc/mcps](https://iamed.cc/mcps)).

Somente leitura, sem login, sem chamar LLM. Cada item volta com o link da
página no app e a fonte original.

## Ferramentas

| Tool | O que faz |
|---|---|
| `listar_recentes` | O que saiu de novo, por tipo, especialidade, escopo (nacional ou internacional) e janela de dias (1 a 365, padrão 14). Eventos e conferências entram também os próximos. |
| `buscar` | Busca por tema em título, resumo e tags, sem depender de acento ("etica" acha "Ética"). Palavras genéricas como "IA" e "medicina" não contam. |
| `abrir_item` | Abre um item pelo id: resumo (até 2.000 caracteres), tags, especialidades, data, organizador, link no app e fonte. |

Toda resposta é estruturada e traz o campo `aviso`: títulos, resumos e tags
vêm de fontes de terceiros e devem ser tratados como conteúdo a citar, não como
instruções.

## O que o servidor nunca devolve

- Dado de usuário do app (perfil, plano, Caderno, Salvos, comunidade).
- Item que não esteja publicado (o espelho só recebe Status publicado).
- O corpo de artigos e aulas: esse fica no app, atrás dos planos. O MCP entrega
  resumo e link.

## Como funciona

Lê o espelho do Notion no Supabase do app pela API REST, com a **chave anon**
e uma lista fechada de tabelas e colunas (`src/iamed_mcp/fonte.py`). O servidor
recusa subir com chave secreta ou de service role. A base inteira (cerca de 650
itens em outubro de 2026) fica em memória por 5 minutos, com uma carga por vez:
o Supabase recebe no máximo cinco consultas a cada 5 minutos, qualquer que seja
o tráfego. Se o Supabase cair, o servidor serve a última leitura boa com aviso.

Desenho completo e modelo de ameaça:
[docs/superpowers/specs/2026-10-16-iamed-mcp-design.md](docs/superpowers/specs/2026-10-16-iamed-mcp-design.md).

## Uso local (Claude Code, stdio)

```bash
git clone https://github.com/fabianofilho/iamed-mcp && cd iamed-mcp
cp .env.example .env   # preencha SUPABASE_ANON_KEY com a chave anon/publishable
uv sync
claude mcp add iamed -- uv --directory "$PWD" run iamed-mcp
```

## Conector (streamable-http)

```bash
TRANSPORTE=streamable-http HTTP_PORTA=8107 uv run iamed-mcp
```

Escuta em `127.0.0.1:8107/mcp`. Em produção roda no debian-f como serviço de
usuário (`deploy/iamed-connector.service`; antes de instalar, `uv sync --frozen
--no-dev` no checkout, porque o serviço roda o binário do `.venv` sem uv),
atrás do Tailscale Funnel na rota `/iamed` (URL pública
`https://debian-f.tailf42a96.ts.net/iamed/mcp`, só depois de publicado).
Limites: 300 requisições por minuto no total e 60 por origem (acima disso, 429
com `Retry-After: 60`), corpo de requisição até 64 KB (acima, 413) e resposta
abaixo de 100 KB. Se o Supabase falhar, o servidor espera 30 s antes de tentar
ler de novo.

## Desligar rápido

Do mais rápido para o mais completo (no debian-f, ou pelo Mac com
`ssh f@debian-f '<comando>'`):

1. Tirar só a rota pública (o uso local continua):
   `tailscale funnel --https=443 --set-path=/iamed off`
2. Parar o processo: `systemctl --user stop iamed-connector`
3. Não voltar no boot: `systemctl --user disable iamed-connector`

## Registro de uso

Uma linha por chamada no journal do systemd (`journalctl --user -u
iamed-connector`): tool, filtros, tamanho do tema (não o texto), quantidade
devolvida, duração e resultado. Nunca o texto buscado nem o conteúdo devolvido.

## Desenvolvimento

```bash
make check   # ruff, mypy e pytest
```

Licença Apache-2.0.

TDQS

A4.4/5.0

Scored across 3 tools

Disambiguation4/5

The three tools map to distinct retrieval modes: browse by recency (listar_recentes), query by theme (buscar), and fetch full detail by id (abrir_item). There is mild overlap since listar_recentes and buscar share the same tipo/especialidade/dias filters and both return item lists, but the recency-vs-term distinction is clearly stated.

Naming Consistency4/5

All names are Portuguese imperative verbs and use snake_case, giving a predictable feel. Minor deviation: listar_recentes and abrir_item follow a verb_noun shape while buscar is a bare verb (its object is implied by the required 'tema' argument), which is a small inconsistency rather than a real problem.

Tool Count4/5

Three tools is on the lean side but well-matched to a read-only discovery surface: list, search, and open. Each earns its place with no redundant tool, though a metadata/browse-by-category tool would round it out.

Completeness4/5

For a curated read-only knowledge base the essential lifecycle is covered: enumerate recent items, search by topic, and retrieve full item detail by id. Minor gaps exist around discovering available tipos/especialidades or related-item exploration, but core agent workflows have no dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues