Tether MCP
Evita que los agentes de codificación de IA se desvíen de tu arquitectura: bloquea dependencias incorrectas, impone la estructura de archivos y otorga a los agentes memoria persistente de las reglas de tu proyecto.
Documentación
Tether MCP
El motor anti-deriva para agentes de codificación con IA.
Dale a tu IA memoria persistente de las reglas de tu proyecto. Un comando. Cero nube.
Los agentes de IA como Cursor y Claude escriben código rápido, pero sufren de Deriva de Agente: alucinan dependencias, violan límites arquitectónicos y crean código espagueti. Tether es un Arquitecto Senior persistente que tu IA debe consultar antes de realizar cambios estructurales.
Tabla de contenidos
- El problema
- Inicio rápido
- Cómo funciona
- Herramientas
- Recursos MCP
- Comandos CLI
- Configuración
- Niveles de severidad de dependencias
- El registro de decisiones
- Telemetría de sesión
- Frameworks compatibles
- Referencia de configuración
- Preguntas frecuentes
- Contribuciones
- Licencia
El problema
Ya has estado ahí. Le pides a un agente de IA que agregue una función y:
- 🎲 Instala
moment.jscuando tu proyecto ya usadate-fns - 🏗️ Crea un servidor Express dentro de tu aplicación Next.js
- 🧩 Agrega Riverpod cuando tu equipo de Flutter acordó usar BLoC
- 📝 Olvida toda la arquitectura después de unos mensajes
Cada sesión comienza desde cero. La IA no tiene memoria de tus reglas, tus decisiones de stack o tus límites arquitectónicos. Esto es Deriva de Agente, y convierte la codificación asistida por IA en una fábrica de deuda técnica.
Inicio rápido
1. Inicializa en tu proyecto
npx tether-mcp init
Tether escanea el manifiesto de tu proyecto (package.json, pubspec.yaml, .csproj, pyproject.toml, go.mod, Cargo.toml, build.gradle, pom.xml, o Package.swift), detecta automáticamente tu framework en 8 ecosistemas y 90 frameworks, y genera un tether.config.json personalizado con valores predeterminados inteligentes.
2. Conecta a tu agente de IA
Claude Code / Claude Desktop
Agrega a ~/.claude/claude_desktop_config.json:
{
"mcpServers": {
"tether": {
"command": "npx",
"args": ["-y", "tether-mcp"]
}
}
}
Cursor
Agrega a .cursor/mcp.json en la raíz de tu proyecto:
{
"mcpServers": {
"tether": {
"command": "npx",
"args": ["-y", "tether-mcp"]
}
}
}
Windsurf
Agrega a tu configuración MCP de Windsurf:
{
"mcpServers": {
"tether": {
"command": "npx",
"args": ["-y", "tether-mcp"]
}
}
}
3. Listo. Tu agente de IA ahora tiene protecciones ⚓
Cada vez que la IA comienza a trabajar, consulta a Tether primero: lee tus invariantes, verifica políticas de dependencias, valida ubicaciones de archivos y registra decisiones estructurales. No más deriva.
Cómo funciona
┌──────────────┐ MCP Tools ┌──────────────┐ Local Files ┌──────────────────┐
│ AI Agent │ ◄──────────────► │ Tether MCP │ ◄─────────────────► │ tether.config.json│
│ (Claude, │ │ Server │ │ ARCHITECTURE.md │
│ Cursor) │ │ │ │ DECISIONS.md │
└──────────────┘ └──────────────┘ └──────────────────┘
Herramientas (6 en total)
| Herramienta | Cuándo llamarla | Qué hace |
|---|---|---|
get_project_invariants | Antes de cualquier trabajo estructural | Alimenta a la IA con tu stack tecnológico, reglas de arquitectura y políticas de dependencias |
verify_dependency_addition | Antes de npm install <pkg> | Comprueba si el paquete está bloqueado, advertido, permitido o necesita revisión |
log_architectural_decision | Después de crear un componente o cambiar el flujo de datos | Agrega una entrada con marca de tiempo a DECISIONS.md |
check_file_structure | Antes de crear o mover archivos | Valida la ruta de archivo propuesta contra las convenciones del proyecto |
verify_code_pattern | Antes de implementar una función | Comprueba si el enfoque de codificación sigue patrones e invariantes aprobados |
health_check | Diagnóstico | Devuelve el estado del servidor, las herramientas registradas y la telemetría de sesión |
Recursos MCP
Tether también expone el contexto del proyecto como Recursos MCP a los que los clientes pueden suscribirse automáticamente:
| Recurso | URI | Descripción |
|---|---|---|
| Configuración | tether://config | El tether.config.json completo — stack tecnológico, invariantes, políticas de dependencias |
| Arquitectura | tether://architecture | El documento ARCHITECTURE.md del proyecto |
| Decisiones | tether://decisions | El registro DECISIONS.md de todas las decisiones registradas |
Configuración
Edita tether.config.json para que coincida con tu proyecto:
{
"projectName": "my-app",
"techStack": {
"frontend": ["Next.js", "React"],
"backend": ["Node.js"],
"orm": ["Prisma"]
},
"invariants": [
"All API routes must validate input with Zod.",
"Database access must go through Prisma — no raw SQL.",
"Use Server Components by default — client components only when needed."
],
"dependencies": {
"blocked": [
{
"name": "moment",
"reason": "Use date-fns instead.",
"alternatives": ["date-fns"],
"severity": "block"
},
{
"name": "lodash",
"reason": "Tree-shaking issues. Use native JS or lodash-es.",
"alternatives": ["lodash-es", "remeda"],
"severity": "warn"
}
]
},
"fileStructure": [
{
"pattern": "component",
"allowedPaths": ["src/components/", "src/app/"],
"reason": "All React components must live in src/components/ or src/app/"
},
{
"pattern": "api-route",
"allowedPaths": ["src/app/api/"],
"reason": "API routes must use Next.js Route Handlers in app/api/"
}
],
"codePatterns": [
{
"name": "State Management",
"rule": "Use React Context + useReducer for complex state — no Redux or Zustand",
"scope": "frontend/state"
},
{
"name": "Data Fetching",
"rule": "Use Server Components for data fetching — no client-side fetch in components",
"scope": "frontend"
}
]
}
Comandos CLI
npx tether-mcp init # Scan project & generate tether.config.json
npx tether-mcp serve # Start the MCP server (stdio)
npx tether-mcp status # Show project config summary & health
npx tether-mcp validate # Validate tether.config.json against schema
npx tether-mcp --version # Show version
npx tether-mcp --help # Show all commands
Niveles de severidad de dependencias
Las dependencias bloqueadas ahora admiten niveles de severidad:
| Severidad | Comportamiento |
|---|---|
"block" (predeterminado) | Detención total: se le dice a la IA que el paquete está prohibido |
"warn" | Advertencia suave: se desaconseja a la IA pero no se bloquea |
{
"dependencies": {
"blocked": [
{ "name": "moment", "reason": "Deprecated.", "alternatives": ["date-fns"], "severity": "block" },
{ "name": "axios", "reason": "Prefer native fetch.", "alternatives": ["fetch"], "severity": "warn" }
]
}
}
Qué se genera
Cuando ejecutas npx tether-mcp init en un proyecto Next.js + Prisma + Tailwind, Tether genera:
{
"projectName": "my-next-app",
"techStack": {
"frontend": ["Next.js", "React"],
"styling": ["Tailwind CSS"],
"orm": ["Prisma"],
"language": ["TypeScript"]
},
"invariants": [
"Use Next.js App Router for all new routes — do not use the Pages Router.",
"All database access must go through Prisma — no raw SQL queries.",
"Use Tailwind utility classes for styling — no inline styles.",
"All new code must be written in TypeScript with strict mode enabled."
],
"dependencies": {
"blocked": [
{ "name": "express", "reason": "Next.js has built-in API routes.", "alternatives": ["Next.js Route Handlers"] },
{ "name": "moment", "reason": "Deprecated and large bundle size.", "alternatives": ["date-fns"] }
]
}
}
El registro de decisiones
Cada decisión estructural que toma la IA se registra en DECISIONS.md:
## Added Redis caching layer
| Field | Value |
|-------|-------|
| **Date** | 2026-03-10T01:30:00.000Z |
| **Scope** | `api/cache` |
### Summary
Added Redis via ioredis for caching frequently accessed product data.
Chose Redis over Memcached for pub/sub support and persistence options.
Esto crea un rastro de auditoría inmutable de cada elección arquitectónica, visible para el próximo desarrollador y la próxima sesión de IA.
Telemetría de sesión
La herramienta health_check devuelve estadísticas de sesión solo locales:
{
"status": "healthy",
"session": {
"sessionStartedAt": "2026-03-12T10:00:00.000Z",
"totalCalls": 7,
"toolStats": {
"get_project_invariants": { "callCount": 3, "lastCalledAt": "...", "errors": 0 },
"verify_dependency_addition": { "callCount": 2, "lastCalledAt": "...", "errors": 0 }
}
}
}
Ningún dato sale de tu máquina. La telemetría se restablece cuando el servidor se reinicia.
Detección de frameworks compatibles
Tether detecta automáticamente 90 frameworks en 8 ecosistemas:
JavaScript / TypeScript (package.json)
| Categoría | Detectado |
|---|---|
| Frontend | Next.js, React, Vue.js, Svelte, Angular, Nuxt, Remix, Astro, SolidJS |
| Backend | Express, Fastify, NestJS, Hono, Koa, Elysia |
| ORM / DB | Prisma, Drizzle, TypeORM, Sequelize, Mongoose |
| Pruebas | Vitest, Jest, Playwright, Cypress |
| Estilos | Tailwind CSS, Styled Components, Emotion |
| Estado | Zustand, Redux Toolkit |
| Autenticación | NextAuth.js |
| Build | Vite |
| Lenguaje | TypeScript |
Python (pyproject.toml, requirements.txt)
| Categoría | Detectado |
|---|---|
| Backend | Django, Flask, FastAPI |
| ORM | SQLAlchemy |
| Pruebas | pytest |
| Validación | Pydantic |
| Cola de tareas | Celery |
| Ciencia de datos | NumPy, pandas |
| ML | TensorFlow, PyTorch |
| Frontend | Streamlit |
Dart / Flutter (pubspec.yaml)
| Categoría | Detectado |
|---|---|
| Framework | Flutter |
| Estado | BLoC, Riverpod, GetX, Provider |
| HTTP | Dio |
| Backend | Firebase |
| Enrutamiento | GoRouter |
| Generación de código | Freezed |
C# / .NET (.csproj)
| Categoría | Detectado |
|---|---|
| Backend | ASP.NET Core |
| ORM | Entity Framework Core, Dapper |
| Frontend | Blazor |
| Móvil | .NET MAUI |
| Pruebas | xUnit, NUnit |
| Arquitectura | MediatR |
| Registro | Serilog |
| Validación | FluentValidation |
Go (go.mod)
| Categoría | Detectado |
|---|---|
| Backend | Gin, Echo, Fiber, Chi |
| ORM | GORM |
| Pruebas | Testify |
| Enrutamiento | Gorilla Mux |
Rust (Cargo.toml)
| Categoría | Detectado |
|---|---|
| Backend | Actix Web, Axum, Rocket |
| Async | Tokio |
| ORM | Diesel, SeaORM |
| Serialización | Serde |
| Base de datos | SQLx |
| CLI | Clap |
Java / Kotlin (build.gradle, pom.xml)
| Categoría | Detectado |
|---|---|
| Backend | Spring Boot, Ktor |
| ORM | Hibernate |
| Pruebas | JUnit 5 |
| Frontend | Jetpack Compose |
Swift (Package.swift)
| Categoría | Detectado |
|---|---|
| Backend | Vapor |
| HTTP | Alamofire |
| CLI | Swift Argument Parser |
| Base de datos | GRDB |
Cada detección agrega invariantes específicos y reglas inteligentes de paquetes bloqueados específicos para tu stack.
Referencia de configuración
| Campo | Tipo | Descripción |
|---|---|---|
projectName | string | Nombre para mostrar del proyecto |
techStack | Record<string, string[]> | Tu stack tecnológico impuesto por categoría |
invariants | string[] | Reglas arquitectónicas inmutables que la IA debe seguir |
dependencies.allowed | string[] | Paquetes preaprobados |
dependencies.blocked | array | Paquetes prohibidos con razón, alternativas y severidad opcional |
dependencies.reviewRequired | string[] | Paquetes que necesitan justificación |
fileStructure | array | Reglas de ubicación de archivos con patrón, rutas permitidas y razón |
codePatterns | array | Reglas de patrones de código con nombre, regla y alcance |
architectureFile | string | Ruta al documento de arquitectura (predeterminado: ARCHITECTURE.md) |
decisionsFile | string | Ruta al registro de decisiones (predeterminado: DECISIONS.md) |
Preguntas frecuentes
"¿Necesito escribir el archivo de configuración yo mismo?"
No. Ejecuta npx tether-mcp init y genera automáticamente tether.config.json escaneando tu proyecto. Puedes personalizarlo después, pero los valores predeterminados son lo suficientemente inteligentes de fábrica.
"¿Necesito decirle a la IA que use Tether?"
No. Las herramientas MCP se descubren automáticamente. La IA ve las herramientas de Tether en su caja de herramientas y las llama al realizar cambios estructurales, igual que usa file_read o terminal.
"¿No quemará más tokens?"
~500-1,500 tokens por sesión para protecciones vs. 5,000-20,000 tokens desperdiciados arreglando errores de deriva. Tether se paga solo con la primera dependencia mala bloqueada.
"¿Por qué no usar simplemente Claude Opus? Es lo suficientemente inteligente."
Inteligente ≠ omnisciente. Claude no sabe que tu equipo decidió usar date-fns hace tres meses. No recuerda las decisiones de la Sesión #1 en la Sesión #10. Y cuando cierras la pestaña, el contexto se pierde. Tether le da a la IA memoria persistente basada en archivos de tus reglas, en cada sesión y cada agente.
"¿Qué pasa si trabajo en varios proyectos?"
Cada proyecto tiene su propio tether.config.json en su propio directorio. Las reglas del Proyecto A nunca se filtran al Proyecto B.
"¿Esto es solo un CLAUDE.md elegante?"
No. CLAUDE.md es pasivo: la IA puede o no leerlo. Tether es activo: valida dependencias, bloquea paquetes malos con alternativas, comprueba la estructura de archivos, verifica patrones de código y mantiene un rastro de auditoría. Funciona con Claude, Cursor, Windsurf y cualquier agente compatible con MCP.
Contribuciones
¡Las contribuciones son bienvenidas! Aquí hay algunas formas de ayudar:
- Agregar una firma de framework — detecta un nuevo framework en
src/utils/detect-stack.ts - Mejorar invariantes — mejores valores predeterminados para frameworks existentes
- Informes de errores — abre un issue
- Solicitudes de funciones — ideas para nuevas herramientas o recursos
git clone https://github.com/MoayadEsam/tether-mcp.git
cd tether-mcp
npm install
npm run build
Licencia
MIT — hecho con ♥ para desarrolladores que están cansados de limpiar después de sus agentes de IA.