ParrotNotes

Busca, resume y guarda información clave de tus notas de reuniones presenciales en ParrotNotes. Servidor remoto alojado con inicio de sesión OAuth, sin clave de API.

Servidor MCP alojado

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

Se instala en Claude Code, Codex, Cursor y más

Documentación

Qué hace

ParrotNotes graba conversaciones en persona en tu teléfono o Mac y las convierte en transcripciones, resúmenes y elementos de acción. Este servidor expone esa biblioteca a un asistente de IA para que puedas hacer preguntas sobre tus propias notas sin abrir la aplicación.

Solicitudes típicas:

  • "Muéstrame mis cinco grabaciones más recientes."
  • "Encuentra mis notas de la visita al sitio de Henderson y resume los puntos clave."
  • "¿A qué se comprometió este cliente? Guárdalo como una lista de acciones."
  • "Enumera todo lo etiquetado como project-alpha."

Antes de comenzar

  • Una cuenta de ParrotNotes. El plan gratuito funciona.
  • Al menos una nota o grabación guardada; de lo contrario, cada herramienta devuelve un resultado vacío.
  • Las notas se crean en las aplicaciones de ParrotNotes para iOS, Android y macOS. Este servidor lee esa biblioteca existente y puede guardar una idea en una nota. No puede crear grabaciones.

No se requiere clave de API, ID de cliente ni configuración manual. Los clientes se registran mediante Dynamic Client Registration y tú inicias sesión a través del navegador.

Conexión

Claude

  1. Abre Configuración > Conectores > Añadir conector personalizado.
  2. Pega el endpoint:
https://mcp.parrotnotes.app/mcp
  1. Serás redirigido a https://parrotnotes.app/auth/authorize para iniciar sesión y otorgar consentimiento.
  2. Después de la aprobación, las herramientas están disponibles en cualquier conversación.

Claude Code

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

Luego ejecuta /mcp dentro de Claude Code, selecciona parrotnotes y completa el inicio de sesión en tu navegador.

ChatGPT

Añade el mismo endpoint como conector personalizado. El flujo de OAuth es idéntico.

MCP Inspector

npx @modelcontextprotocol/inspector

Configura el transporte en Streamable HTTP, la URL en https://mcp.parrotnotes.app/mcp y conéctate. El inspector completa el flujo de OAuth en el navegador.

Verificar el descubrimiento

Una solicitud no autenticada devuelve 401 con un puntero a los metadatos del recurso protegido, que es como los clientes descubren el servidor de autorización:

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

La respuesta enumera el recurso (https://mcp.parrotnotes.app/mcp), su authorization_servers, scopes_supported y bearer_methods_supported (header).

Herramientas

HerramientaQué haceAcceso
get_recent_notesEnumera notas y grabaciones recientes, con paginación y un filtro de tipoLectura
search_notesBúsqueda de texto completo en tus notas por palabra claveLectura
get_noteDevuelve una sola nota por ID con su transcripción y contenido completosLectura
get_note_insightsDevuelve las ideas de IA guardadas en una nota: resúmenes, elementos de acción, sentimientoLectura
get_user_labelsEnumera todas las etiquetas que has creadoLectura
get_note_labelsDevuelve las etiquetas asignadas a una nota específicaLectura
get_notes_by_labelDevuelve todas las notas que llevan una etiqueta determinadaLectura
get_subscription_statusDevuelve tu estado de suscripción actualLectura
save_note_insightGuarda una idea generada por IA en una notaEscritura

Ocho de las nueve herramientas son de solo lectura y llevan readOnlyHint: true. save_note_insight es la única herramienta que cambia datos: inserta o actualiza una idea en una nota que te pertenece y puede sobrescribir una idea existente del mismo tipo e idioma de destino, por lo que lleva destructiveHint: true. Nunca se elimina nada. Cada herramienta establece openWorldHint: false y idempotentHint: true.

Cada herramienta declara un esquema de salida y devuelve structuredContent validados, con el mismo JSON reflejado como texto en content para clientes que solo leen texto.

Identificadores

Las notas llevan dos IDs. Usa el correcto para cada herramienta:

CampoTipoUsado por
idstringget_note (note_id)
localRecordingIdintegerget_note_insights, get_note_labels, save_note_insight (local_recording_id)
localLabelIdintegerget_notes_by_label (local_label_id)

Referencia de herramientas

get_recent_notes

Enumera notas y grabaciones, de más reciente a más antigua.

ParámetroTipoObligatorioDescripción
limitinteger, 1 a 50No (predeterminado 10)Número de notas a devolver
offsetinteger, 0 o másNo (predeterminado 0)Número de notas a omitir, para paginación
note_type"audio" | "text"NoFiltrar por grabaciones de voz o notas escritas

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

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

search_notes

Búsqueda por palabra clave en títulos de notas, transcripciones y contenido de texto.

ParámetroTipoObligatorioDescripción
querystringSíPalabra clave o frase de búsqueda
limitinteger, 1 a 50No (predeterminado 10)Número máximo de resultados

Devuelve { notes: NoteWithExcerpt[] }. Cada resultado añade un excerpt alrededor de la primera coincidencia.

{ "query": "Henderson site visit" }

get_note

Devuelve una nota con su transcripción completa o cuerpo de texto.

ParámetroTipoObligatorioDescripción
note_idstringSíEl id de la nota

Devuelve un Note.

get_note_insights

Devuelve las ideas de IA guardadas en una nota.

ParámetroTipoObligatorioDescripción
local_recording_idstringSíEl localRecordingId de la nota
insight_typestringNoFiltro, por ejemplo summary, action_items, sentiment, translate

Devuelve { insights: Insight[] }.

get_user_labels

Enumera todas las etiquetas de la cuenta. No toma parámetros.

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

get_note_labels

ParámetroTipoObligatorioDescripción
local_recording_idintegerSíEl localRecordingId de la nota

Devuelve { labels: Label[] }.

get_notes_by_label

ParámetroTipoObligatorioDescripción
local_label_idintegerSílocalLabelId de get_user_labels

Devuelve { notes: Note[] }.

get_subscription_status

No toma parámetros.

Devuelve { subscription: Subscription | null, isActive: boolean }. isActive es verdadero cuando la suscripción está activa o en período de prueba y no ha expirado.

save_note_insight

Guarda una idea en una nota. Inserta o actualiza según la combinación de nota, insight_type y target_language.

ParámetroTipoObligatorioDescripción
local_recording_idintegerSíEl localRecordingId de la nota
insight_typeenumSíUno de los valores a continuación
contentstringSíEl texto de la idea
target_languagestringCuando insight_type es translateCódigo de idioma, por ejemplo 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

Devuelve el Insight guardado.

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

Formas de datos

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
}

Errores

Una llamada fallida devuelve un resultado de herramienta normal con isError: true y un mensaje legible en content. Los detalles internos se eliminan del mensaje. Una llamada sin una sesión válida devuelve Authentication required.

Qué puede y qué no puede acceder

Para administradores de TI que evalúan este conector.

Puede leer: tus propias notas y grabaciones, sus transcripciones y contenido, las ideas de IA guardadas en ellas, tus etiquetas y tu estado de suscripción.

Puede escribir: una sola cosa, una idea adjunta a una nota que te pertenece.

No puede acceder: a los datos de ningún otro usuario, la memoria de Claude, el historial de chat, los resúmenes de conversaciones ni los archivos que hayas subido al asistente. No recopila datos de conversación más allá de lo que necesita una llamada de herramienta determinada para ejecutarse.

Delimitación: cada consulta a la base de datos está delimitada al usuario autenticado mediante seguridad a nivel de fila de Postgres. Una sesión no puede acceder a los datos de otra cuenta incluso si se llamara a una herramienta con los identificadores de otra cuenta.

Seguridad

La autenticación utiliza OAuth 2.0 con Dynamic Client Registration (RFC 7591). El servidor de autorización es Supabase Auth, con una página de consentimiento alojada en parrotnotes.app.

Cada solicitud a /mcp se verifica contra el servidor de autenticación antes de llegar a la capa MCP, por lo que un token caducado, malformado o cuya sesión se cerró en otro lugar se rechaza inmediatamente.

SituaciónRespuesta
Sin token de portador401 con un encabezado WWW-Authenticate que apunta a los metadatos del recurso protegido
Token caducado, malformado o sesión revocada401 con error="invalid_token", que indica al cliente que se vuelva a autenticar
Servidor de autenticación inaccesible503 sin desafío, para que los clientes reintenten en lugar de volver a autenticarse

El transporte es solo HTTPS. Los tokens se aceptan únicamente en el encabezado Authorization: Bearer.

Privacidad y retención de datos

  • No se utilizan datos para el entrenamiento de modelos de IA.
  • La eliminación automática de audio está disponible en la aplicación: se conserva la transcripción y se descarta la grabación. Esto es importante en industrias sensibles al cumplimiento normativo.
  • Política completa: parrotnotes.app/privacy

Solución de problemas

El asistente te pide que te reconectes repetidamente. Cerrar sesión en ParrotNotes en la web con un alcance global finaliza todas las sesiones de tu cuenta, incluidas las sesiones del conector. Vuelve a iniciar sesión y reautoriza el conector.

Las herramientas devuelven resultados vacíos. La cuenta aún no tiene notas. Graba o importa algo en la aplicación primero.

Una llamada a una herramienta falla con un error de permiso. El ID de la nota pertenece a una cuenta diferente. Las herramientas solo devuelven datos propiedad del usuario que ha iniciado sesión.

get_note_labels o save_note_insight rechaza el ID. Estas toman el localRecordingId entero, no el id de cadena. Consulta Identificadores.

Soporte