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
- Abra Configurações > Conectores > Adicionar conector personalizado.
- Cole o endpoint:
https://mcp.parrotnotes.app/mcp
- Você será redirecionado para
https://parrotnotes.app/auth/authorizepara fazer login e conceder consentimento. - 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
| Ferramenta | O que faz | Acesso |
|---|---|---|
get_recent_notes | Lista anotações e gravações recentes, com paginação e filtro por tipo | Leitura |
search_notes | Pesquisa de texto completo em suas anotações por palavra-chave | Leitura |
get_note | Retorna uma única anotação por ID com sua transcrição e conteúdo completos | Leitura |
get_note_insights | Retorna insights de IA salvos em uma anotação: resumos, itens de ação, sentimento | Leitura |
get_user_labels | Lista todos os rótulos que você criou | Leitura |
get_note_labels | Retorna os rótulos atribuídos a uma anotação específica | Leitura |
get_notes_by_label | Retorna todas as anotações com um determinado rótulo | Leitura |
get_subscription_status | Retorna seu status atual de assinatura | Leitura |
save_note_insight | Salva um insight gerado por IA em uma anotação | Escrita |
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:
| Campo | Tipo | Usado por |
|---|---|---|
id | string | get_note (note_id) |
localRecordingId | inteiro | get_note_insights, get_note_labels, save_note_insight (local_recording_id) |
localLabelId | inteiro | get_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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
limit | inteiro, 1 a 50 | Não (padrão 10) | Número de anotações a retornar |
offset | inteiro, 0 ou mais | Não (padrão 0) | Número de anotações a pular, para paginação |
note_type | "audio" | "text" | Não | Filtro 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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
query | string | Sim | Palavra-chave ou frase de pesquisa |
limit | inteiro, 1 a 50 | Nã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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
note_id | string | Sim | O id da anotação |
Retorna um Note.
get_note_insights
Retorna os insights de IA salvos em uma anotação.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
local_recording_id | string | Sim | O localRecordingId da anotação |
insight_type | string | Não | Filtro, 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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
local_recording_id | inteiro | Sim | O localRecordingId da anotação |
Retorna { labels: Label[] }.
get_notes_by_label
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
local_label_id | inteiro | Sim | localLabelId 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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
local_recording_id | inteiro | Sim | O localRecordingId da anotação |
insight_type | enum | Sim | Um dos valores abaixo |
content | string | Sim | O texto do insight |
target_language | string | Quando insight_type é translate | Có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ção | Resposta |
|---|---|
| Sem token bearer | 401 com um cabeçalho WWW-Authenticate apontando para os metadados do recurso protegido |
| Token expirado, malformado ou sessão revogada | 401 com error="invalid_token", que informa ao cliente para reautenticar |
| Servidor de autenticação inacessível | 503 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
- E-mail: support@parrotnotes.app
- Política de privacidade: parrotnotes.app/privacy
- Termos: parrotnotes.app/terms
- Esta página em Markdown: parrotnotes.app/docs/mcp.md