Team Relay MCP
Leer, buscar y escribir notas del vault de Obsidian a través del servidor colaborativo Team Relay. Admite carpetas compartidas y sincronización en tiempo real.
Documentación
EVC Team Relay - Servidor MCP
Dale a tu agente de IA acceso de lectura/escritura a tu bóveda de Obsidian.
Tu agente lee tus notas, crea nuevas y se mantiene sincronizado, todo a través de la API de Team Relay.
Funciona con Claude Code, Codex CLI, OpenCode y cualquier cliente compatible con MCP.
Inicio rápido
1. Instalación
Opción A — desde PyPI (recomendado):
No se necesita instalación — uvx se descarga y ejecuta automáticamente. Ve al paso 2.
Opción B — desde el código fuente:
git clone https://github.com/entire-vc/evc-team-relay-mcp.git
cd evc-team-relay-mcp
uv sync # or: pip install .
2. Configura tu herramienta de IA
Añade el servidor MCP a la configuración de tu herramienta. Elige un método de autenticación:
Clave de agente (recomendada) — crea una clave en el plugin de Obsidian → Configuración de Team Relay → Claves de agente. Admite lectura y escritura: list_files, read_file, tr_search y upsert_file funcionan con una sola clave. Inicio rápido →
Correo electrónico + contraseña — usa una cuenta de agente dedicada en tu instancia de Relay.
Claude Code — clave de agente
Añade a .mcp.json en la raíz de tu proyecto o a ~/.claude/.mcp.json:
{
"mcpServers": {
"evc-relay": {
"command": "uvx",
"args": ["evc-team-relay-mcp"],
"env": {
"RELAY_CP_URL": "https://cp.yourdomain.com",
"RELAY_AGENT_KEY": "tr_agent_your_key_here"
}
}
}
}
Claude Code — correo/contraseña
{
"mcpServers": {
"evc-relay": {
"command": "uvx",
"args": ["evc-team-relay-mcp"],
"env": {
"RELAY_CP_URL": "https://cp.yourdomain.com",
"RELAY_EMAIL": "agent@yourdomain.com",
"RELAY_PASSWORD": "your-password"
}
}
}
}
Codex CLI
Añade a tu codex.json:
{
"mcp_servers": {
"evc-relay": {
"type": "stdio",
"command": "uvx",
"args": ["evc-team-relay-mcp"],
"env": {
"RELAY_CP_URL": "https://cp.yourdomain.com",
"RELAY_AGENT_KEY": "tr_agent_your_key_here"
}
}
}
}
OpenCode
Añade a opencode.json:
{
"mcpServers": {
"evc-relay": {
"command": "uvx",
"args": ["evc-team-relay-mcp"],
"env": {
"RELAY_CP_URL": "https://cp.yourdomain.com",
"RELAY_AGENT_KEY": "tr_agent_your_key_here"
}
}
}
}
Desde el código fuente (todas las herramientas)
Si instalaste desde el código fuente en lugar de PyPI, reemplaza "command": "uvx" / "args": ["evc-team-relay-mcp"] con:
"command": "uv",
"args": ["run", "--directory", "/path/to/evc-team-relay-mcp", "relay_mcp.py"]
Variables de entorno:
| Variable | Requerida | Descripción |
|---|---|---|
RELAY_CP_URL | Sí | URL base del plano de control |
RELAY_AGENT_KEY | Una de | Clave de agente desde la configuración del plugin — lectura + escritura (recomendada) |
RELAY_EMAIL | Una de | Correo de la cuenta (modo correo/contraseña) |
RELAY_PASSWORD | Una de | Contraseña de la cuenta (modo correo/contraseña) |
También hay plantillas de configuración listas para copiar en config/.
3. Úsalo
Tu agente de IA ahora tiene estas herramientas:
| Herramienta | Descripción |
|---|---|
authenticate | Autenticarse con credenciales (gestionado automáticamente) |
list_shares | Listar recursos compartidos accesibles (filtrar por tipo, propiedad) |
list_files | Listar archivos en un recurso compartido de carpeta |
read_file | Leer un archivo por ruta desde un recurso compartido de carpeta |
read_document | No implementado — no hay ruta de backend en ningún modo de autenticación, siempre genera error |
upsert_file | Crear o actualizar un archivo por ruta — solo en modo clave de agente; genera error en modo correo/contraseña (JWT) |
write_document | No implementado — no hay ruta de backend en ningún modo de autenticación, siempre genera error |
delete_file | No implementado — no hay ruta de backend en ningún modo de autenticación, siempre genera error |
Flujo de trabajo típico: list_shares -> list_files -> read_file / upsert_file
La autenticación es automática — el servidor inicia sesión y renueva los tokens internamente.
Matriz de disponibilidad de herramientas
No todas las herramientas funcionan en todos los modos de autenticación, y un grupo no funciona en ninguno de los modos — son dos hechos no relacionados, así que no los confundas:
| Grupo | Herramientas | Estado |
|---|---|---|
| Clave de agente, recursos compartidos de carpeta | list_files, read_file, upsert_file | Funcionando — la única vía de escritura en este servidor MCP |
| JWT (correo/contraseña) | list_files, tr_search, read_file | Funcionando, solo lectura por diseño |
| Sin ruta de backend en ningún modo | read_document, write_document, delete_file | Siempre generan ValueError — no es una restricción de autenticación |
- El acceso de escritura es solo con clave de agente, por política sancionada (ver
TR-05 (#0cdd5328)):
upsert_filees la única herramienta de escritura con una ruta de backend funcional, y solo escribe cuando se configura una clave de agente (RELAY_AGENT_KEY/RELAY_AGENT_KEYS). El modo JWT al llamar aupsert_filegenera unValueErrorclaro indicando el modo clave de agente como solución, en lugar de un 404 confuso. read_document,write_documentydelete_fileson una brecha separada e independiente — el plano de control no tiene ruta de backend para ellos en absoluto, tampoco en modo clave de agente. Cambiar a una clave de agente no los hará funcionar: el contenido en vivo de recursos compartidos de documentos es solo CRDT/WebSocket (sin puente REST), y la eliminación por archivo no tiene rutaDELETEen el servidor todavía. Si alguna vez se añaden rutas para estos, seguirían la política de escritura solo con clave de agente anterior — JWT permanecería en solo lectura.
Implementación remota (transporte HTTP)
Para implementaciones compartidas o del lado del servidor, ejecuta como servidor HTTP:
# Direct
uv run relay_mcp.py --transport http --port 8888
# Docker (pulls from Docker Hub automatically)
RELAY_CP_URL=https://cp.yourdomain.com \
RELAY_EMAIL=agent@yourdomain.com \
RELAY_PASSWORD=your-password \
docker compose up -d
# Or pull explicitly
docker pull deadalusevc/evc-team-relay-mcp:latest
Por defecto, el servidor se vincula a 127.0.0.1 (solo localhost) — el endpoint no es
alcanzable a través de la red incluso si el host tiene una IP pública. Esto coincide con el caso
común de un solo cliente MCP en la misma máquina que el servidor.
Luego configura tu cliente MCP para conectarse vía HTTP:
{
"mcpServers": {
"evc-relay": {
"type": "streamable-http",
"url": "http://127.0.0.1:8888/mcp"
}
}
}
Acceso remoto mediante túnel SSH (recomendado)
Si tu cliente MCP se ejecuta en una máquina diferente al servidor, haz un túnel al puerto vinculado a localhost en lugar de exponerlo públicamente:
# From the client machine, forward local 8888 to the server's localhost:8888
ssh -N -L 8888:127.0.0.1:8888 user@your-server
Luego apunta la configuración del cliente a http://127.0.0.1:8888/mcp como arriba — el tráfico
pasa por el túnel SSH, y la dirección de vinculación del servidor nunca necesita cambiar.
Vinculación pública / proxy inverso (opt-in)
Si realmente necesitas que el servidor acepte conexiones de otros hosts directamente
(por ejemplo, si está detrás de un proxy inverso que termina TLS y maneja la autenticación), pasa
--host explícitamente:
uv run relay_mcp.py --transport http --port 8888 --host 0.0.0.0
Haz esto solo detrás de un proxy inverso o cortafuegos — el endpoint HTTP de MCP
no tiene autenticación integrada, así que vincularlo a 0.0.0.0 en una red abierta
expone cada llamada de herramienta de relay a cualquiera que pueda alcanzar el puerto.
Seguridad
El servidor MCP proporciona ventajas de seguridad significativas sobre las integraciones basadas en shell:
- Sin ejecución de shell — todas las operaciones son llamadas a funciones de Python vía JSON-RPC, eliminando riesgos de inyección de comandos
- Sin argumentos de CLI — las credenciales y tokens nunca se pasan como argumentos de proceso (invisibles en la salida de
ps) - Gestión automática de tokens — el servidor maneja el inicio de sesión, la renovación de JWT y el ciclo de vida de los tokens internamente; el agente nunca toca tokens en bruto
- Entradas tipadas — todos los parámetros se validan contra JSON Schema antes de la ejecución
- Proceso persistente único — sin generación de shell por llamada, sin fuga de entorno entre invocaciones
Nota: Si estás usando la habilidad OpenClaw (scripts bash), considera migrar a este servidor MCP para una integración más segura y mantenible.
Cómo funciona
┌─────────────┐ MCP ┌──────────────┐ REST API ┌──────────────┐ Yjs CRDT ┌──────────────┐
│ AI Agent │ ◄────────────► │ MCP Server │ ◄─────────────► │ Team Relay │ ◄──────────────► │ Obsidian │
│ (any tool) │ stdio / HTTP │ (this repo) │ read/write │ Server │ real-time │ Client │
└─────────────┘ └──────────────┘ └──────────────┘ sync └──────────────┘
El servidor MCP envuelve la API REST de Team Relay en herramientas MCP estándar. Team Relay almacena documentos como CRDT de Yjs y los sincroniza con los clientes de Obsidian en tiempo real. Los cambios realizados por el agente aparecen en Obsidian al instante — y viceversa.
Requisitos previos
- Python 3.10+ con uv (recomendado) o pip
- Una instancia de EVC Team Relay en ejecución (autohospedada o alojada)
- Una cuenta de usuario en el plano de control de Relay
Parte de toda la caja de herramientas de VC
| Producto | Qué hace | Enlace |
|---|---|---|
| Team Relay | Servidor de colaboración autohospedado | repositorio |
| Team Relay Plugin | Plugin de Obsidian para Team Relay | repositorio |
| Relay MCP | Servidor MCP para agentes de IA | este repositorio |
| OpenClaw Skill | Habilidad de agente OpenClaw (bash) | repositorio |
| Local Sync | Sincronización de bóveda <-> herramientas de desarrollo de IA | repositorio |
| Spark MCP | Servidor MCP para catálogo de flujos de trabajo de IA | repositorio |
Comunidad
Licencia
MIT