一键导入
mcp-developer
Skill para desarrollar, mantener y extender el servidor MCP de Obsidian. Incluye patrones de código, arquitectura, testing y gestión de paquetes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Skill para desarrollar, mantener y extender el servidor MCP de Obsidian. Incluye patrones de código, arquitectura, testing y gestión de paquetes.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Entrevista a un experto de dominio (SME) para extraer su conocimiento técnico tácito y sintetizarlo en una Skill reutilizable. Se activa PROACTIVAMENTE ante 3 situaciones: (1) Frustración — el usuario se queja de código, arquitectura o falta de estándares; (2) Ambigüedad sin Reglas — se pide un refactor profundo pero no hay estándares definidos; (3) Fricción — el usuario ha corregido 2+ veces decisiones de diseño en la misma sesión. USE FOR: extraer estándares, crear reglas de arquitectura, definir anti-patrones, capturar conocimiento tácito, generar prompts reutilizables, entrevistar experto, sintetizar conocimiento técnico, crear skills desde cero.
Entrevista a un experto de dominio (SME) para extraer su conocimiento técnico y sintetizarlo en una Skill Maestra Abstracta (prompt reutilizable). Se activa PROACTIVAMENTE ante 3 situaciones: (1) Frustración — el usuario se queja de código, arquitectura o falta de estándares (ej. "vaya desastre", "arregla este espagueti", "los logs están mal"); (2) Ambigüedad sin Reglas — se pide un refactor profundo o pieza core pero no hay estándares definidos en el contexto; (3) Fricción — el usuario ha corregido 2 o más veces decisiones de diseño/arquitectura/formato en la misma sesión. USE FOR: extraer estándares, crear reglas de arquitectura, definir anti-patrones, refactor sin criterios claros, capturar conocimiento tácito, generar prompts reutilizables, entrevistar experto, sintetizar conocimiento técnico.
Skill para mantener la calidad del código: linting, formatting, type checking. Garantiza que el código cumple con los estándares del proyecto.
Skill para mantener la documentación sincronizada con el código. Incluye patrones de documentación, ubicaciones estándar, y checklists.
Skill para manejar el flujo de trabajo de Git: changelog, commits, push, y releases. Automatiza el proceso de versionado y publicación.
Buenas prácticas y patrones de desarrollo Python para el proyecto MCP. Incluye estándares de código, patrones arquitectónicos, y convenciones.
| name | MCP Developer |
| description | Skill para desarrollar, mantener y extender el servidor MCP de Obsidian. Incluye patrones de código, arquitectura, testing y gestión de paquetes. |
| tools | ["read","edit","run_command","grep_search"] |
obsidian-mcp-server/
├── obsidian_mcp/
│ ├── server.py # Punto de entrada - crea FastMCP y registra módulos
│ ├── config.py # Pydantic Settings (OBSIDIAN_VAULT_PATH, LOG_LEVEL)
│ ├── tools/ # Herramientas MCP (funciones invocables)
│ │ ├── navigation.py # Leer, listar, buscar notas
│ │ ├── creation.py # Crear, editar, eliminar notas
│ │ ├── analysis.py # Estadísticas, gestión de tags
│ │ ├── graph.py # Backlinks, notas huérfanas
│ │ ├── agents.py # Cargador de skills (del vault del usuario)
│ │ ├── semantic.py # Integración RAG/búsqueda vectorial
│ │ ├── context.py # Contexto y estructura del vault
│ │ └── youtube.py # Extracción de transcripciones
│ ├── semantic/ # Módulo RAG opcional (ChromaDB)
│ │ ├── indexer.py # Generación de embeddings
│ │ ├── retriever.py # Búsqueda por similitud
│ │ └── service.py # API de alto nivel RAG
│ ├── resources/ # Recursos MCP (endpoints de solo lectura)
│ ├── prompts/ # Prompts MCP (system prompts para IA)
│ └── utils/ # Utilidades compartidas
│ ├── logging.py # Logging centralizado (a stderr)
│ ├── security.py # Validación de rutas
│ └── vault.py # Operaciones de archivos del vault
├── tests/ # Suite de tests pytest
└── docs/ # Documentación
uv. NUNCA uses pip.uv add packageuv run tooluv add --dev packageuv run pyrightanyio para tests asíncronos, no asyncio directo.IMPORTANTE: Separa siempre la lógica del registro MCP. Esto permite testear las funciones independientemente y reduce la complejidad.
Para cada módulo de tools, mantén dos archivos:
obsidian_mcp/tools/
├── navigation.py # Solo registro MCP (wrappers delgados)
├── navigation_logic.py # Lógica de negocio (funciones puras)
├── analysis.py
├── analysis_logic.py
└── ...
*_logic.py)Contiene la implementación real, testeable independientemente:
"""
Core business logic for XXX tools.
This module contains the actual implementation, separated from MCP
registration to improve testability and maintain single responsibility.
"""
from pathlib import Path
from ..config import get_vault_path
from ..utils import get_logger
logger = get_logger(__name__)
def do_something(param: str) -> str:
"""
Descripción de lo que hace la función.
Args:
param: Descripción del parámetro.
Returns:
Resultado formateado como string.
"""
vault_path = get_vault_path()
if not vault_path:
return "Error: La ruta del vault no está configurada."
# ... implementación
logger.info(f"Ejecutando do_something con {param}")
return "Resultado exitoso"
*.py)Contiene solo wrappers delgados que delegan a la lógica:
"""
MCP tool registration for XXX functionality.
"""
from fastmcp import FastMCP
from .xxx_logic import do_something
def register_xxx_tools(mcp: FastMCP) -> None:
"""Registra las herramientas de XXX."""
@mcp.tool()
def mi_herramienta(param: str) -> str:
"""
Descripción de lo que hace la herramienta.
Args:
param: Descripción del parámetro.
Returns:
Descripción del resultado.
"""
return do_something(param)
| Aspecto | Sin separación | Con separación |
|---|---|---|
| Testabilidad | Requiere MCP mock | Import directo |
| Complejidad | Alta (C901 > 10) | Baja (~1-2) |
| Reutilización | Imposible | Fácil |
| Mantenibilidad | Difícil | Simple |
*_logic.py (funciones puras, testeables)*.py con el decorator @mcp.tool()server.py si es un nuevo módulotests/ (importando desde *_logic.py)docs/tool-reference.mdconstants.py)Todas las constantes numéricas deben estar centralizadas:
from obsidian_mcp.constants import (
SemanticDefaults, # CHUNK_SIZE, VECTOR_K, DEFAULT_THRESHOLD...
SearchLimits, # MAX_SEARCH_RESULTS, MAX_DISPLAY_FILES...
FolderSuggestion, # SIMILAR_NOTES_LIMIT, HIGH_CONFIDENCE_THRESHOLD...
)
NO hagas esto (magic numbers dispersos):
# ❌ MAL
if len(results) > 100:
results = results[:100]
Haz esto:
# ✅ BIEN
from ..constants import SearchLimits
if len(results) > SearchLimits.MAX_SEARCH_RESULTS:
results = results[:SearchLimits.MAX_SEARCH_RESULTS]
messages.py)Mensajes de error y éxito estandarizados:
from obsidian_mcp.messages import ErrorMessages, SuccessMessages
# Uso
return ErrorMessages.VAULT_NOT_CONFIGURED
return SuccessMessages.format_note_created(path)
vault_config.py)Carpetas y patrones excluidos:
from obsidian_mcp.vault_config import (
DEFAULT_EXCLUDED_FOLDERS, # [".git", ".obsidian", ...]
DEFAULT_EXCLUDED_PATTERNS, # ["*.tmp", "*.bak", ...]
)
# Formatear código
uv run ruff format .
# Verificar linting
uv run ruff check .
# Corregir linting automáticamente
uv run ruff check . --fix
# Verificar tipos
uv run pyright
# Ejecutar tests
uv run pytest tests/
# Ejecutar servidor en modo desarrollo
uv run mcp dev obsidian_mcp/server.py
uv run ruff format .uv run ruff check . --fixLas skills NO están en este repositorio. Se cargan desde el vault del usuario:
{vault}/.agents/skills/{nombre_skill}/SKILL.md{vault}/.agents/REGLAS_GLOBALES.mdstderr (stdout está reservado para el protocolo MCP)from ..utils import get_logger; logger = get_logger(__name__)LOG_LEVELVariables de entorno soportadas:
| Variable | Requerido | Descripción |
|---|---|---|
OBSIDIAN_VAULT_PATH | Sí | Ruta absoluta al vault |
LOG_LEVEL | No | Nivel de logging (default: INFO) |
OBSIDIAN_TEMPLATES_FOLDER | No | Carpeta de plantillas |
OBSIDIAN_SYSTEM_FOLDER | No | Carpeta del sistema |
# MAL - No testeable, alta complejidad
@mcp.tool()
def mi_herramienta() -> str:
# 100 líneas de código aquí
...
# MAL - ¿Qué significa 100? ¿Por qué 0.7?
if len(results) > 100:
...
if similarity < 0.7:
...
# MAL - Mismo mensaje en 5 archivos distintos
return "❌ Error: La ruta del vault no está configurada."
# MAL - Complejidad ciclomática > 10
def register_xxx_tools(mcp): # 500+ líneas
@mcp.tool()
def tool1(): ... # 80 líneas
@mcp.tool()
def tool2(): ... # 100 líneas
# ... más funciones anidadas
# Muestra funciones con complejidad > 10
uv run ruff check . --select=C901
type(scope): descriptionCo-Authored-Bygit commit --trailer "Reported-by:<name>"git commit --trailer "Github-Issue:#<number>"