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

Anchor

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.

npm version npm downloads MIT License MCP Node.js


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

Ya has estado ahí. Le pides a un agente de IA que agregue una función y:

  • 🎲 Instala moment.js cuando tu proyecto ya usa date-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)

HerramientaCuándo llamarlaQué hace
get_project_invariantsAntes de cualquier trabajo estructuralAlimenta a la IA con tu stack tecnológico, reglas de arquitectura y políticas de dependencias
verify_dependency_additionAntes de npm install <pkg>Comprueba si el paquete está bloqueado, advertido, permitido o necesita revisión
log_architectural_decisionDespués de crear un componente o cambiar el flujo de datosAgrega una entrada con marca de tiempo a DECISIONS.md
check_file_structureAntes de crear o mover archivosValida la ruta de archivo propuesta contra las convenciones del proyecto
verify_code_patternAntes de implementar una funciónComprueba si el enfoque de codificación sigue patrones e invariantes aprobados
health_checkDiagnósticoDevuelve 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:

RecursoURIDescripción
Configuracióntether://configEl tether.config.json completo — stack tecnológico, invariantes, políticas de dependencias
Arquitecturatether://architectureEl documento ARCHITECTURE.md del proyecto
Decisionestether://decisionsEl 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:

SeveridadComportamiento
"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íaDetectado
FrontendNext.js, React, Vue.js, Svelte, Angular, Nuxt, Remix, Astro, SolidJS
BackendExpress, Fastify, NestJS, Hono, Koa, Elysia
ORM / DBPrisma, Drizzle, TypeORM, Sequelize, Mongoose
PruebasVitest, Jest, Playwright, Cypress
EstilosTailwind CSS, Styled Components, Emotion
EstadoZustand, Redux Toolkit
AutenticaciónNextAuth.js
BuildVite
LenguajeTypeScript

Python (pyproject.toml, requirements.txt)

CategoríaDetectado
BackendDjango, Flask, FastAPI
ORMSQLAlchemy
Pruebaspytest
ValidaciónPydantic
Cola de tareasCelery
Ciencia de datosNumPy, pandas
MLTensorFlow, PyTorch
FrontendStreamlit

Dart / Flutter (pubspec.yaml)

CategoríaDetectado
FrameworkFlutter
EstadoBLoC, Riverpod, GetX, Provider
HTTPDio
BackendFirebase
EnrutamientoGoRouter
Generación de códigoFreezed

C# / .NET (.csproj)

CategoríaDetectado
BackendASP.NET Core
ORMEntity Framework Core, Dapper
FrontendBlazor
Móvil.NET MAUI
PruebasxUnit, NUnit
ArquitecturaMediatR
RegistroSerilog
ValidaciónFluentValidation

Go (go.mod)

CategoríaDetectado
BackendGin, Echo, Fiber, Chi
ORMGORM
PruebasTestify
EnrutamientoGorilla Mux

Rust (Cargo.toml)

CategoríaDetectado
BackendActix Web, Axum, Rocket
AsyncTokio
ORMDiesel, SeaORM
SerializaciónSerde
Base de datosSQLx
CLIClap

Java / Kotlin (build.gradle, pom.xml)

CategoríaDetectado
BackendSpring Boot, Ktor
ORMHibernate
PruebasJUnit 5
FrontendJetpack Compose

Swift (Package.swift)

CategoríaDetectado
BackendVapor
HTTPAlamofire
CLISwift Argument Parser
Base de datosGRDB

Cada detección agrega invariantes específicos y reglas inteligentes de paquetes bloqueados específicos para tu stack.

Referencia de configuración

CampoTipoDescripción
projectNamestringNombre para mostrar del proyecto
techStackRecord<string, string[]>Tu stack tecnológico impuesto por categoría
invariantsstring[]Reglas arquitectónicas inmutables que la IA debe seguir
dependencies.allowedstring[]Paquetes preaprobados
dependencies.blockedarrayPaquetes prohibidos con razón, alternativas y severidad opcional
dependencies.reviewRequiredstring[]Paquetes que necesitan justificación
fileStructurearrayReglas de ubicación de archivos con patrón, rutas permitidas y razón
codePatternsarrayReglas de patrones de código con nombre, regla y alcance
architectureFilestringRuta al documento de arquitectura (predeterminado: ARCHITECTURE.md)
decisionsFilestringRuta 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.