ParrotNotes

Pesquise, resuma e salve insights nas suas notas de reunião presenciais do ParrotNotes. Servidor remoto hospedado com login OAuth, sem necessidade de chave de API.

Servidor MCP hospedado

npx add-mcp 'https://mcp.parrotnotes.app/mcp'

Instala no Claude Code, Codex, Cursor e outros

Documentação

O que faz

O ParrotNotes grava conversas presenciais no seu telefone ou Mac e as transforma em transcrições, resumos e itens de ação. Este servidor expõe essa biblioteca a um assistente de IA para que você possa fazer perguntas sobre suas próprias anotações sem abrir o aplicativo.

Solicitações típicas:

  • "Mostre minhas cinco gravações mais recentes."
  • "Encontre minhas anotações da visita ao site Henderson e resuma os pontos principais."
  • "O que este cliente se comprometeu a fazer? Salve isso de volta como uma lista de ações."
  • "Liste tudo marcado com project-alpha."

Antes de começar

  • Uma conta ParrotNotes. O plano gratuito funciona.
  • Pelo menos uma anotação ou gravação salva; caso contrário, todas as ferramentas retornam um resultado vazio.
  • As anotações são criadas nos aplicativos ParrotNotes para iOS, Android e macOS. Este servidor lê essa biblioteca existente e pode salvar um insight de volta em uma anotação. Ele não pode criar gravações.

Não é necessária chave de API, ID de cliente ou configuração manual. Os clientes se registram por meio do Dynamic Client Registration e você faz login pelo navegador.

Conectando

Claude

  1. Abra Configurações > Conectores > Adicionar conector personalizado.
  2. Cole o endpoint:
https://mcp.parrotnotes.app/mcp
  1. Você será redirecionado para https://parrotnotes.app/auth/authorize para fazer login e conceder consentimento.
  2. Após a aprovação, as ferramentas estarão disponíveis em qualquer conversa.

Claude Code

claude mcp add --transport http parrotnotes https://mcp.parrotnotes.app/mcp

Em seguida, execute /mcp dentro do Claude Code, selecione parrotnotes e conclua o login no seu navegador.

ChatGPT

Adicione o mesmo endpoint como um conector personalizado. O fluxo OAuth é idêntico.

MCP Inspector

npx @modelcontextprotocol/inspector

Defina o transporte como Streamable HTTP, a URL como https://mcp.parrotnotes.app/mcp e conecte-se. O inspector conclui o fluxo OAuth no navegador.

Verificar descoberta

Uma solicitação não autenticada retorna 401 com um ponteiro para os metadados do recurso protegido, que é como os clientes descobrem o servidor de autorização:

curl -i -X POST https://mcp.parrotnotes.app/mcp \
  -H "Content-Type: application/json" \
  -d '{}'
HTTP/2 401
www-authenticate: Bearer realm="parrot-notes", resource_metadata="https://mcp.parrotnotes.app/.well-known/oauth-protected-resource", scope="openid email profile"
curl https://mcp.parrotnotes.app/.well-known/oauth-protected-resource

A resposta lista o recurso (https://mcp.parrotnotes.app/mcp), seu authorization_servers, scopes_supported e bearer_methods_supported (header).

Ferramentas

FerramentaO que fazAcesso
get_recent_notesLista anotações e gravações recentes, com paginação e filtro por tipoLeitura
search_notesPesquisa de texto completo em suas anotações por palavra-chaveLeitura
get_noteRetorna uma única anotação por ID com sua transcrição e conteúdo completosLeitura
get_note_insightsRetorna insights de IA salvos em uma anotação: resumos, itens de ação, sentimentoLeitura
get_user_labelsLista todos os rótulos que você criouLeitura
get_note_labelsRetorna os rótulos atribuídos a uma anotação específicaLeitura
get_notes_by_labelRetorna todas as anotações com um determinado rótuloLeitura
get_subscription_statusRetorna seu status atual de assinaturaLeitura
save_note_insightSalva um insight gerado por IA em uma anotaçãoEscrita

Oito das nove ferramentas são somente leitura e carregam readOnlyHint: true. save_note_insight é a única ferramenta que altera dados: ela faz upsert de um insight em uma anotação sua e pode sobrescrever um insight existente do mesmo tipo e idioma de destino, portanto carrega destructiveHint: true. Nada é excluído. Toda ferramenta define openWorldHint: false e idempotentHint: true.

Toda ferramenta declara um esquema de saída e retorna structuredContent validado, com o mesmo JSON espelhado como texto em content para clientes que leem apenas texto.

Identificadores

As anotações têm dois IDs. Use o correto para cada ferramenta:

CampoTipoUsado por
idstringget_note (note_id)
localRecordingIdinteiroget_note_insights, get_note_labels, save_note_insight (local_recording_id)
localLabelIdinteiroget_notes_by_label (local_label_id)

Referência das ferramentas

get_recent_notes

Lista anotações e gravações, das mais recentes para as mais antigas.

ParâmetroTipoObrigatórioDescrição
limitinteiro, 1 a 50Não (padrão 10)Número de anotações a retornar
offsetinteiro, 0 ou maisNão (padrão 0)Número de anotações a pular, para paginação
note_type"audio" | "text"NãoFiltro para gravações de voz ou anotações escritas

Retorna { notes: Note[], hasMore: boolean }.

{ "limit": 5, "note_type": "audio" }

search_notes

Pesquisa por palavra-chave em títulos, transcrições e conteúdo de texto das anotações.

ParâmetroTipoObrigatórioDescrição
querystringSimPalavra-chave ou frase de pesquisa
limitinteiro, 1 a 50Não (padrão 10)Número máximo de resultados

Retorna { notes: NoteWithExcerpt[] }. Cada resultado adiciona um excerpt ao redor da primeira correspondência.

{ "query": "Henderson site visit" }

get_note

Retorna uma anotação com sua transcrição completa ou corpo de texto.

ParâmetroTipoObrigatórioDescrição
note_idstringSimO id da anotação

Retorna um Note.

get_note_insights

Retorna os insights de IA salvos em uma anotação.

ParâmetroTipoObrigatórioDescrição
local_recording_idstringSimO localRecordingId da anotação
insight_typestringNãoFiltro, por exemplo summary, action_items, sentiment, translate

Retorna { insights: Insight[] }.

get_user_labels

Lista todos os rótulos da conta. Não aceita parâmetros.

Retorna { labels: { localLabelId: number, name: string }[] }.

get_note_labels

ParâmetroTipoObrigatórioDescrição
local_recording_idinteiroSimO localRecordingId da anotação

Retorna { labels: Label[] }.

get_notes_by_label

ParâmetroTipoObrigatórioDescrição
local_label_idinteiroSimlocalLabelId de get_user_labels

Retorna { notes: Note[] }.

get_subscription_status

Não aceita parâmetros.

Retorna { subscription: Subscription | null, isActive: boolean }. isActive é verdadeiro quando a assinatura está ativa ou em teste e não expirou.

save_note_insight

Salva um insight em uma anotação. Faz upsert na combinação de anotação, insight_type e target_language.

ParâmetroTipoObrigatórioDescrição
local_recording_idinteiroSimO localRecordingId da anotação
insight_typeenumSimUm dos valores abaixo
contentstringSimO texto do insight
target_languagestringQuando insight_type é translateCódigo do idioma, por exemplo es, fr, de

Valores permitidos de insight_type:

summary, key_points, offer_tips, make_notes, action_items, meeting_report,
translate, linkedin_post, tweet, blog_post, email, sentiment, shopping_list

Retorna o Insight salvo.

{
  "local_recording_id": 1712,
  "insight_type": "action_items",
  "content": "- Send revised quote by Friday\n- Book second site visit"
}

Formatos de dados

interface Note {
  id: string                          // use with get_note
  localRecordingId: number            // use with insight and label tools
  displayName: string
  noteType: string                    // "audio" | "text"
  transcript: string | null           // audio notes
  textContent: string | null          // text notes
  duration: number | null             // seconds
  dateTime: string                    // ISO 8601
  transcriptionStatus: string | null
}

interface NoteWithExcerpt extends Note {
  excerpt: string | null              // snippet around the first match
}

interface Label {
  localLabelId: number
  name: string
}

interface Insight {
  id: string
  localRecordingId: string
  insightType: string
  content: string
  targetLanguage: string | null
}

interface Subscription {
  id: string
  provider: string                    // e.g. revenuecat, lemonsqueezy
  productId: string | null
  status: string                      // e.g. active, trialing, expired
  expiresAt: string | null            // ISO 8601, null if it does not expire
}

Erros

Uma chamada com falha retorna um resultado de ferramenta normal com isError: true e uma mensagem legível em content. Detalhes internos são removidos da mensagem. Uma chamada sem uma sessão válida retorna Authentication required.

O que ele pode e não pode acessar

Para administradores de TI que avaliam este conector.

Ele pode ler: suas próprias anotações e gravações, suas transcrições e conteúdo, insights de IA salvos nelas, seus rótulos e seu status de assinatura.

Ele pode escrever: uma coisa, um insight anexado a uma anotação sua.

Ele não pode acessar: dados de qualquer outro usuário, memória do Claude, histórico de chat, resumos de conversas ou arquivos que você enviou ao assistente. Ele não coleta dados de conversa além do que uma chamada de ferramenta específica precisa para funcionar.

Escopo: toda consulta ao banco de dados é limitada ao usuário autenticado por meio da segurança em nível de linha do Postgres. Uma sessão não pode acessar dados de outra conta, mesmo que uma ferramenta seja chamada com identificadores de outra conta.

Segurança

A autenticação usa OAuth 2.0 com Dynamic Client Registration (RFC 7591). O servidor de autorização é o Supabase Auth, com uma página de consentimento hospedada em parrotnotes.app.

Toda solicitação para /mcp é verificada contra o servidor de autenticação antes de chegar à camada MCP, portanto, um token expirado, malformado ou cuja sessão foi encerrada em outro lugar é rejeitado imediatamente.

SituaçãoResposta
Sem token bearer401 com um cabeçalho WWW-Authenticate apontando para os metadados do recurso protegido
Token expirado, malformado ou sessão revogada401 com error="invalid_token", que informa ao cliente para reautenticar
Servidor de autenticação inacessível503 sem desafio, para que os clientes tentem novamente em vez de reautenticar

O transporte é somente HTTPS. Tokens são aceitos apenas no cabeçalho Authorization: Bearer.

Privacidade e retenção de dados

  • Nenhum dado é usado para treinamento de modelos de IA.
  • A exclusão automática de áudio está disponível no aplicativo: a transcrição é mantida e a gravação é descartada. Isso é importante em setores sensíveis à conformidade.
  • Política completa: parrotnotes.app/privacy

Solução de problemas

O assistente pede que você reconecte repetidamente. Sair do ParrotNotes na web com um escopo global encerra todas as sessões da sua conta, incluindo sessões de conectores. Entre novamente e reautorize o conector.

As ferramentas retornam resultados vazios. A conta ainda não tem anotações. Grave ou importe algo no aplicativo primeiro.

Uma chamada de ferramenta falha com erro de permissão. O ID da anotação pertence a outra conta. As ferramentas retornam apenas dados de propriedade do usuário conectado.

get_note_labels ou save_note_insight rejeita o ID. Elas usam o localRecordingId inteiro, não o id string. Consulte Identificadores.

Suporte