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
- Abre Configuración > Conectores > Añadir conector personalizado.
- Pega el endpoint:
https://mcp.parrotnotes.app/mcp
- Serás redirigido a
https://parrotnotes.app/auth/authorizepara iniciar sesión y otorgar consentimiento. - 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
| Herramienta | Qué hace | Acceso |
|---|---|---|
get_recent_notes | Enumera notas y grabaciones recientes, con paginación y un filtro de tipo | Lectura |
search_notes | Búsqueda de texto completo en tus notas por palabra clave | Lectura |
get_note | Devuelve una sola nota por ID con su transcripción y contenido completos | Lectura |
get_note_insights | Devuelve las ideas de IA guardadas en una nota: resúmenes, elementos de acción, sentimiento | Lectura |
get_user_labels | Enumera todas las etiquetas que has creado | Lectura |
get_note_labels | Devuelve las etiquetas asignadas a una nota específica | Lectura |
get_notes_by_label | Devuelve todas las notas que llevan una etiqueta determinada | Lectura |
get_subscription_status | Devuelve tu estado de suscripción actual | Lectura |
save_note_insight | Guarda una idea generada por IA en una nota | Escritura |
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:
| Campo | Tipo | Usado por |
|---|---|---|
id | string | get_note (note_id) |
localRecordingId | integer | get_note_insights, get_note_labels, save_note_insight (local_recording_id) |
localLabelId | integer | get_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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
limit | integer, 1 a 50 | No (predeterminado 10) | Número de notas a devolver |
offset | integer, 0 o más | No (predeterminado 0) | Número de notas a omitir, para paginación |
note_type | "audio" | "text" | No | Filtrar 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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
query | string | Sí | Palabra clave o frase de búsqueda |
limit | integer, 1 a 50 | No (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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
note_id | string | Sí | El id de la nota |
Devuelve un Note.
get_note_insights
Devuelve las ideas de IA guardadas en una nota.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
local_recording_id | string | Sí | El localRecordingId de la nota |
insight_type | string | No | Filtro, 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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
local_recording_id | integer | Sí | El localRecordingId de la nota |
Devuelve { labels: Label[] }.
get_notes_by_label
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
local_label_id | integer | Sí | 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ámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
local_recording_id | integer | Sí | El localRecordingId de la nota |
insight_type | enum | Sí | Uno de los valores a continuación |
content | string | Sí | El texto de la idea |
target_language | string | Cuando insight_type es translate | Có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ón | Respuesta |
|---|---|
| Sin token de portador | 401 con un encabezado WWW-Authenticate que apunta a los metadatos del recurso protegido |
| Token caducado, malformado o sesión revocada | 401 con error="invalid_token", que indica al cliente que se vuelva a autenticar |
| Servidor de autenticación inaccesible | 503 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
- Correo electrónico: support@parrotnotes.app
- Política de privacidad: parrotnotes.app/privacy
- Términos: parrotnotes.app/terms
- Esta página en Markdown: parrotnotes.app/docs/mcp.md