dotnet-sherlock-mcp
ILSpy para agentes de codificación LLM. Servidor MCP basado en reflexión con más de 31 herramientas para explorar ensamblados .NET, paquetes NuGet, tipos, miembros, atributos y documentación XML.
Documentación
Sherlock MCP para .NET
Sherlock MCP para .NET es un servidor integral del Protocolo de Contexto de Modelos (MCP) que proporciona capacidades profundas de introspección para ensamblados .NET. Permite que los Modelos de Lenguaje de Aprendizaje (LLMs) analicen y comprendan tu código .NET con precisión, ofreciendo respuestas precisas y conscientes del contexto para escenarios de desarrollo complejos.
Esta herramienta es esencial para desarrolladores que quieren aprovechar las capacidades de los LLM para:
- Análisis profundo de código - Comprender arquitecturas .NET complejas y dependencias
- Información precisa de tipos - Obtener metadatos detallados sobre tipos, miembros y sus firmas
- Documentación automatizada - Extraer y utilizar documentación XML y atributos
- Herramientas personalizadas - Construir herramientas sofisticadas que interactúan con ensamblados .NET
- Generación de código - Crear código preciso basado en estructuras de tipos existentes
Características Clave
- Servidor MCP Integral: Proporciona 40 herramientas especializadas para análisis de ensamblados .NET, con un perfil opcional de 20 herramientas
core - Introspección Avanzada de Ensamblados: Análisis profundo basado en reflexión de tipos, miembros y metadatos
- Análisis Enriquecido de Miembros: Inspección detallada de métodos, propiedades, campos, eventos y constructores
- Filtrado y Paginación Inteligente: Filtrado avanzado por nombre/atributos con paginación eficiente para grandes conjuntos de datos
- Integración de Documentación XML: Extracción automática de resúmenes, parámetros, valores de retorno y observaciones
- Optimizado para Rendimiento: Caché, paginación y procesamiento eficiente de memoria
- API JSON Estable: Envoltorios consistentes con versionado y códigos de error estructurados
- Nativo .NET 9.0: Construido sobre la última plataforma .NET con características modernas de C#
- Integración de Proyectos: Análisis de soluciones y archivos de proyecto con resolución de dependencias
- Indicaciones de Flujo de Trabajo: Las indicaciones
explore_package,explain_typeywho_callsofrecen puntos de entrada de un clic para flujos de trabajo de análisis comunes - SDK MCP Actual: Construido sobre
ModelContextProtocol2.1.0 (GA) - Especificación MCP Actual: Habla la revisión de protocolo
2026-07-28, y negocia automáticamente hacia abajo para clientes en revisiones anteriores
Novedades en 2.14.0
- Plugin de Claude Code:
/plugin marketplace add jcucci/dotnet-sherlock-mcpy/plugin install sherlock@dotnet-sherlock-mcpinstalan el servidor más una habilidad que enseña a los agentes el flujo de trabajo de Sherlock. Ver Plugin de Claude Code. get_type_membersy perfiles de herramientas: una lista paginada y filtrable de herramientas enumera cada tipo de miembro, y--profile core/SHERLOCK_TOOL_PROFILE=corereduce la superficie a las herramientas esenciales. Las herramientas de miembros por tipo están obsoletas.- Salida estructurada y guía de errores: las herramientas principales de navegación publican un
outputSchemay devuelvenstructuredContent, y las llamadas fallidas llevanisError: truecon candidatos de "quisiste decir" y sugerencias de corrección. - Cancelación, progreso y obtención de información: los escaneos largos se pueden cancelar y reportan progreso, y un nombre de tipo simple ambiguo solicita al cliente que elija. Ver
CHANGELOG.mdpara detalles completos.
Instalación
Ejecutar con dnx (SDK .NET 10)
Con el SDK .NET 10, dnx descarga el paquete de NuGet y lo ejecuta directamente — sin paso de instalación:
dnx -v q --yes Sherlock.MCP.Server@2.14.0
--yes omite el mensaje de confirmación interactivo, que un cliente MCP que lanza el servidor a través de stdio no puede responder. -v q evita que dnx imprima un aviso de "Omitiendo verificación de firma de paquete NuGet." en la salida estándar la primera vez que descarga una versión, lo que de otro modo corrompería el flujo MCP y fallaría esa primera conexión. Ambas son opciones de dnx, por lo que deben ir antes del id del paquete; cualquier cosa después se pasa al servidor. Fijar la versión mantiene los lanzamientos reproducibles; actualízala cuando quieras mejorar. El paquete se publica con el tipo de paquete McpServer, por lo que también aparece listado como servidor MCP en NuGet.org.
Instalar como herramienta global
En cualquier SDK compatible (.NET 8 o posterior), instala la herramienta global desde NuGet (agrega sherlock-mcp a tu PATH):
dotnet tool install -g Sherlock.MCP.Server
Alternativamente, durante el desarrollo puedes ejecutar el servidor localmente:
dotnet run --project src/server/Sherlock.MCP.Server.csproj
Configurar Tu Cliente MCP
Sherlock se ejecuta como un servidor MCP estándar que se comunica a través de stdio.
Plugin de Claude Code
Este repositorio también es un mercado de plugins de Claude Code. El plugin sherlock incluye el servidor (lanzado con dnx, por lo que necesita el SDK .NET 10) y una habilidad que enseña al agente el flujo de trabajo localizar → orientar → profundizar → relaciones:
/plugin marketplace add jcucci/dotnet-sherlock-mcp
/plugin install sherlock@dotnet-sherlock-mcp
El plugin inicia el servidor con el perfil de herramientas core, que coincide con las herramientas que cubre la habilidad. Para exponer todas las herramientas, establece SHERLOCK_TOOL_PROFILE=full en el entorno desde el que se lanza Claude Code.
Cada usuario ejecuta estos comandos una vez; reinicia Claude Code (o ejecuta /reload-plugins) después. Para obtener una nueva versión, ejecuta /plugin marketplace update dotnet-sherlock-mcp. Si previamente registraste Sherlock con claude mcp add, elimina esa entrada (claude mcp remove sherlock) para que las herramientas no se carguen dos veces.
Configuración de equipo
Para ofrecer el plugin a todos los que trabajan en un repositorio, confirma lo siguiente en el .claude/settings.json de ese repositorio. Claude Code solicita a cada compañero que lo instale cuando confían en la carpeta, para que nadie tenga que escribir los comandos anteriores:
{
"extraKnownMarketplaces": {
"dotnet-sherlock-mcp": {
"source": {
"source": "github",
"repo": "jcucci/dotnet-sherlock-mcp"
}
}
},
"enabledPlugins": {
"sherlock@dotnet-sherlock-mcp": true
}
}
Los compañeros aún necesitan el SDK .NET 10 en su PATH para dnx.
Usando dnx
- Claude Code:
claude mcp add sherlock -- dnx -v q --yes Sherlock.MCP.Server@2.14.0
- VS Code (
.vscode/mcp.json):
{
"servers": {
"sherlock": {
"type": "stdio",
"command": "dnx",
"args": ["-v", "q", "--yes", "Sherlock.MCP.Server@2.14.0"]
}
}
}
Usando la herramienta global
- Cursor: Configuración → MCP / Herramientas personalizadas → Agregar herramienta → Comando:
sherlock-mcp - Claude Desktop / otros clientes MCP: Agrega una entrada de servidor que apunte al comando
sherlock-mcp. Ejemplo de entrada JSON (consulta la documentación de tu cliente para la ubicación/formato exacto del archivo):
{
"servers": {
"sherlock": {
"command": "sherlock-mcp"
}
}
}
No se requieren argumentos. El servidor registra automáticamente todas las herramientas al iniciarse.
Perfiles de herramientas
Las listas grandes de herramientas cuestan contexto y descubribilidad a los agentes (Claude Code cambia a Búsqueda de Herramientas diferida una vez que las descripciones de herramientas crecen más allá de aproximadamente el 10% de la ventana de contexto). Sherlock puede iniciarse con una superficie más pequeña:
| Perfil | Herramientas | Contenido |
|---|---|---|
full (predeterminado) | 40 | Todas las herramientas, incluidas las herramientas de miembros por tipo obsoletas |
core | 20 | Descubrimiento (find_assembly_by_class_name, find_assembly_by_file_name, find_assembly_by_nuget_package, get_project_output_paths, open_assembly), orientación (get_assembly_info, get_types_from_assembly, get_type_info, get_type_hierarchy), miembros y documentación (get_type_members, search_members, analyze_method, get_xml_docs_for_type, get_xml_docs_for_member) y relaciones (find_implementations_of, find_methods_returning, find_extension_methods_for, find_references_to, get_method_calls) y descompilación (decompile_member) |
Selecciona un perfil con el argumento --profile o la variable de entorno SHERLOCK_TOOL_PROFILE (el argumento gana). Un nombre de perfil desconocido detiene el servidor con un error.
{
"servers": {
"sherlock": {
"command": "sherlock-mcp",
"args": ["--profile", "core"]
// or: "env": { "SHERLOCK_TOOL_PROFILE": "core" }
}
}
}
Auto-Configuración para Proyectos .NET
Normalmente no necesitas pegar nada. Sherlock incluye su guía de uso en el campo instructions de MCP devuelto al inicializar, y la mayoría de los clientes MCP (incluido Claude Code) la muestran al agente automáticamente — por lo que la guía se mantiene correcta y versionada con el paquete, sin copiar y pegar que mantener.
Los fragmentos a continuación son refuerzo opcional. Mantenlos cortos y basados en principios en lugar de enumerar nombres de herramientas y flujos de trabajo: una lista estática pegada en tu repositorio se desactualizará a medida que evolucionen las herramientas de Sherlock, mientras que las descripciones de las propias herramientas (y el instructions del servidor) siempre coinciden con la versión que estás ejecutando.
Los nombres de herramientas se exponen en
snake_case(get_type_members,search_members, …); los nombres de argumentos permanecen en camelCase (projection,nameContains).
Claude Code (CLAUDE.md)
Si instalaste el plugin de Claude Code, su habilidad ya cubre esto. De lo contrario, puedes agregar un puntero corto y opcional al CLAUDE.md de tu proyecto:
## .NET Assembly Analysis
Use the Sherlock MCP tools (`get_type_members`, `search_members`, …) for .NET type/assembly
questions instead of guessing. Locate DLLs with the `find_assembly_by_*` / `get_project_output_paths`
tools rather than hardcoding bin paths. Start lean — `search_members` or `get_types_from_assembly`,
then drill in — and pass `projection='full'` only when you need parameters/attributes/modifiers.
The tools' own descriptions cover the specifics.
Cursor (.cursor/rules)
El formato de archivo único .cursorrules está obsoleto (y se ignora silenciosamente en el modo Agente de Cursor).
Agrega una Regla de Proyecto en .cursor/rules/sherlock.mdc en su lugar:
---
description: Use Sherlock MCP for .NET assembly/type analysis
alwaysApply: true
---
- Prefer the Sherlock MCP tools (snake_case, e.g. `get_type_members`, `search_members`) over guessing about .NET APIs.
- Find DLLs with `find_assembly_by_*` / `get_project_output_paths`; don't hardcode `bin/Debug/<tfm>/*.dll`.
- Start lean (`search_members` / `get_types_from_assembly`); request `projection='full'` only when you need parameters/attributes/modifiers.
Otros agentes (AGENTS.md)
Para herramientas que siguen la convención AGENTS.md entre editores, el mismo puntero corto funciona — coloca el fragmento de Claude Code anterior en tu AGENTS.md.
Configuración global
Para uso en todo el sistema, agrega a tu configuración global de agente:
For .NET work, use the Sherlock MCP tools (snake_case) to analyze assemblies, types, and members instead of guessing. Start lean and opt into projection='full' only when you need detail.
Cómo Indicarle
A continuación hay fragmentos de indicaciones compactos que puedes pegar en tu chat para ser productivo rápidamente. Ajusta las rutas a tus DLLs locales.
Configuración general
You have access to an MCP server named "sherlock" that can analyze .NET assemblies. Prefer these tools for .NET questions and include short reasoning for which tool you chose. Ask me for the assembly path if missing.
Enumerar miembros de un tipo
Analyze: /absolute/path/to/MyLib/bin/Debug/net9.0/MyLib.dll
Type: MyNamespace.MyType
List methods, including non-public, filter name contains "Async", include attributes, return JSON.
Obtener documentación XML de un miembro
Use GetXmlDocsForMember on /abs/path/MyLib.dll, type MyNamespace.MyType, member TryParse. Summarize the summary + params.
Encontrar tipos y profundizar
List types from /abs/path/MyLib.dll; then get type info for the first result and list its nested types.
Ajustar paginación y filtros
Use GetTypeMembers on /abs/path/MyLib.dll, type MyNamespace.MyType, kinds method, sortBy name, sortOrder asc, skip 0, take 25, hasAttributeContains Obsolete.
Navegar ligero, luego obtener detalle (proyección)
On /abs/path/MyLib.dll, run GetTypeMembers for MyNamespace.MyType with the default summary projection to see signatures. Then re-call GetTypeMembers with kinds method, nameContains and projection='full' only for the methods I name to get their parameters and attributes.
Rastrear relaciones y sitios de llamada
On /abs/path/MyLib.dll: FindImplementationsOf MyNamespace.IMyService. Then FindReferencesTo that interface with analysisDepth='il' to find callers, and GetMethodCalls on the most relevant method to see what it invokes.
Resumen de Herramientas
Nombres de herramientas: Los clientes MCP llaman a estas herramientas en
snake_case—GetTypeMembers→get_type_members,SearchMembers→search_members, y así sucesivamente. Los nombres en PascalCase utilizados en todo este README coinciden con los métodos C# subyacentes y las descripciones de herramientas que muestra tu cliente.
Descubrimiento y Análisis de Ensamblados
OpenAssembly: Devuelve un identificador cortoasm_…para pasar comoassemblyHandleen lugar deassemblyPathen cualquier herramienta que acepte un ensamblado. El identificador llevaadditionalAssembliestambién, persiste entre reinicios del servidor (enhandles.jsonbajoSHERLOCK_STATE_DIR, por defecto la carpetasherlockde datos locales de aplicación del usuario) y está fijado a la compilación actual: después de una recompilación, las llamadas fallan conStaleAssemblyHandlehasta que se vuelva a abrirAnalyzeAssembly: Resumen completo del ensamblado con tipos públicos y metadatosGetAssemblyInfo: Metadatos a nivel de ensamblado — identidad/versión, marco de destino y ensamblados referenciados (projection=fullagrega todos los atributos del ensamblado)FindAssemblyByClassName: Localiza ensamblados que declaran un tipo público por nombre simple, completo o anidado; omiteobj/,ref/,refint/,node_modules/,packages/,TestResults/y directorios de puntos, y clasifica las coincidenciasbin/primeroFindAssemblyByFileName: Encuentra ensamblados por nombre de archivo bajo un directorio raíz, con las mismas exclusiones y clasificaciónFindAssemblyByNugetPackage: Resuelve una DLL desde la caché local de NuGet por id de paquete (version/tfmopcional)
Introspección de Tipos
GetTypesFromAssembly: Lista todos los tipos públicos con metadatos (paginado)AnalyzeType(obsoleto): Metadatos de tipo más todos los miembros; usaGetTypeInfo+GetTypeMembers projection=fullGetTypeInfo: Metadatos detallados de tipo (accesibilidad, genéricos, tipos anidados)GetTypeHierarchy: Cadena de herencia e implementaciones de interfacesGetGenericTypeInfo: Parámetros genéricos, argumentos e información de varianzaGetTypeAttributes: Atributos personalizados declarados en tiposGetNestedTypes: Declaraciones de tipos anidados
Análisis de Miembros (Filtrable y Paginado)
GetTypeMembers: Métodos, propiedades, campos, eventos y constructores de un tipo en una lista paginada. Reduce conkinds(method|property|field|event|constructor),nameContainsyhasAttributeContains; los elementossummaryson{ kind, name, signature },projection=fullagrega los campos estructurados de cada tipoAnalyzeMethod: Análisis profundo de métodos con sobrecargas y atributos- Obsoletas, mantenidas por una o dos versiones:
GetTypeMethods,GetTypeProperties,GetTypeFields,GetTypeEvents,GetTypeConstructors(usaGetTypeMembersconkinds) yGetAllTypeMembers(usaGetTypeMembers projection=full)
Búsqueda de Miembros
SearchMembers: Busca en todo un ensamblado miembros cuyo nombre contenga un fragmento — el punto de entrada cuando conoces un nombre de miembro pero no su tipo declarante. Filtra pormemberKinds(method|property|field|event|type).
Búsqueda Inversa
FindImplementationsOf: Tipos que implementan una interfaz o derivan de una clase base (coincidencia genérica abierta compatible)FindMethodsReturning: Métodos cuyo tipo de retorno coincide con un tipo dado (coincidencia genérica abierta compatible)FindExtensionMethodsFor: Métodos de extensión que extienden un tipo dado (escanea clases estáticas por el parámetrothis)FindReferencesTo: Barrido más amplio a través de parámetros, campos, propiedades, eventos y argumentos genéricos; paseanalysisDepth='il'para también resolver llamadores entrantes desde cuerpos de métodos
Análisis de IL
GetMethodCalls: Lee el cuerpo IL de un método para listar qué llama y qué campos toca — la pregunta "¿qué hace este método?" que las herramientas a nivel de firma no pueden responder (agrega entre sobrecargas; use.ctor/.cctorpara constructores)
Descompilación
DecompileMember: Descompila un miembro (método, propiedad, campo, evento o constructor) a C# con ICSharpCode.Decompiler. Devuelve cada sobrecarga del nombre, o una sobrecarga cuando se daparameterTypes(por ejemplo,string,int; una cadena vacía selecciona la sobrecarga sin parámetros). Use.ctor/.cctorpara constructoresDecompileType: Descompila un tipo completo a C#. No está en el perfilcore; prefieraDecompileMember
Ambas herramientas paginan su fuente por línea: maxLines (predeterminado 400, máximo 5000) limita el tamaño de página, una página también se detiene temprano una vez que alcanza aproximadamente 90,000 caracteres para que siempre quepa en el límite de respuesta, y cada página informa startLine, lineCount, totalLines, truncated y un continuationToken para la siguiente página. Las líneas de más de 2,000 caracteres se recortan con un marcador /* … more characters clipped */ y se cuentan en clippedLines. Pase additionalAssemblies (o use un assemblyHandle abierto con ellos) cuando las dependencias vivan fuera de la carpeta del ensamblado; sus carpetas se buscan al resolver tipos referenciados y sus sellos de archivo son parte de la clave de caché. La descompilación completa se almacena en caché por sello de archivo, por lo que las páginas posteriores son económicas. Un tipo que el ensamblado solo reenvía (por ejemplo, System.String en una fachada System.Runtime.dll) devuelve TypeForwarded con el ensamblado definidor en recommendedParams.
Atributos y Metadatos
GetMemberAttributes: Atributos para miembros específicosGetParameterAttributes: Información de atributos a nivel de parámetro
Documentación XML
GetXmlDocsForType: Extrae documentación XML a nivel de tipoGetXmlDocsForMember: Documentación específica de miembros (resumen/parámetros/retornos/comentarios)
Análisis de Proyectos y Soluciones
AnalyzeSolution: Analiza archivos .sln y enumera proyectosAnalyzeProject: Metadatos de proyecto, referencias y configuración de compilaciónGetProjectOutputPaths: Resuelve directorios de salida para diferentes configuracionesResolvePackageReferences: Mapea paquetes NuGet a ensamblados en cachéFindDepsJsonDependencies: Analiza deps.json para dependencias de tiempo de ejecución
Configuración y Tiempo de Ejecución
GetRuntimeOptions: Configuración actual del servidor y valores predeterminadosUpdateRuntimeOptions: Modifica el comportamiento de paginación, caché y búsqueda
Recursos
Tres plantillas de recursos permiten a los clientes obtener un solo tipo, entrada de documentación o paquete en caché sin otra llamada de herramienta. Cada variable está codificada en porcentaje.
sherlock://assembly/{path}/type/{fullName}: Metadatos de tipo, la misma carga útil queget_type_infosherlock://assembly/{path}/docs/{memberId}: Documentación XML para un id de documentación comoT:Ns.TypeoM:Ns.Type.Method(System.String)sherlock://nuget/{packageId}/{version}: El ensamblado al que se resuelve una versión de paquete NuGet en caché, la misma carga útil quefind_assembly_by_nuget_package
search_members, get_types_from_assembly y las herramientas de búsqueda inversa find_* devuelven un resource_link al recurso de tipo para cada tipo distinto en la página, después del bloque de texto JSON. resources/read lleva sugerencias de caché privadas; un URI cuyo ensamblado, tipo, id de documento o paquete no existe falla con -32602.
Las variables de plantilla admiten completion/complete, devolviendo como máximo 100 valores:
path: ensamblados cargados recientemente, luego archivos.dll/.exey subcarpetas de la carpeta que se está escribiendofullName: nombres de tipo (forma de metadatos, por ejemplo,List`1) from the assembly in theargumento de contextopath`memberId: ids de documentación del archivo XML junto al ensambladopathpackageId/version: carpetas de paquetes y sus versiones (más recientes primero) en la caché local de NuGet
Prompts
Tres prompts codifican secuencias comunes de herramientas como puntos de entrada de un clic (Claude Code los lista como comandos de barra /mcp__sherlock__<name>). Cada uno devuelve un solo mensaje de usuario que guía al agente a través de las herramientas; solo llaman herramientas en el perfil core, por lo que funcionan bajo cualquier perfil.
explore_package(packageId,version?): Resuelve el paquete desde la caché local de NuGet (versión en caché más alta cuando se omiteversion), se orienta en el ensamblado y resume sus tipos principales y puntos de entradaexplain_type(assemblyPath,typeName): Jerarquía, miembros, documentos XML y usos de un tipowho_calls(assemblyPath,typeName,memberName,additionalAssemblies?): Llamadores entrantes de un miembro desde IL, opcionalmente a través de una lista separada por comas de otros ensamblados
assemblyPath, typeName (con assemblyPath en el contexto de finalización), packageId y version (con packageId en el contexto) admiten completion/complete de la misma manera que las variables de plantilla de recursos. prompts/list lleva las mismas sugerencias de caché públicas que tools/list.
Filtrado Avanzado y Paginación
Todas las herramientas de análisis de miembros admiten filtrado y paginación completos:
Opciones de Filtrado:
caseSensitive(bool): Coincidencia de tipo/miembro sensible a mayúsculasnameContains(string): Filtrar por subcadena de nombre de miembrohasAttributeContains(string): Filtrar por subcadena de tipo de atributoincludePublic/includeNonPublic(bool): Filtrado de visibilidadincludeStatic/includeInstance(bool): Filtrado de tipo de miembro
Paginación:
skip/take(int): Paginación de desplazamiento estándarmaxItems(int): Máximo de resultados por solicitud (predeterminado 50;FindReferencesTopredeterminado a 25)continuationToken(string): Paginación basada en tokens para conjuntos de datos grandessortBy/sortOrder(string): Ordenar por nombre/acceso en orden asc/desc
Forma de Respuesta (eficiencia de tokens)
La mayoría de las herramientas de enumeración usan por defecto una proyección ligera summary y le permiten optar por la carga útil más pesada full solo cuando la necesita. Recurra a full deliberadamente — summary suele ser suficiente para decidir su próxima llamada.
projection(summary|full): compatible conGetTypesFromAssembly,GetTypeMembers,GetTypeMethods,GetAssemblyInfo,GetMethodCalls,FindImplementationsOf,FindMethodsReturning,FindExtensionMethodsForyFindReferencesTo.summarydevuelve lo suficiente para navegar (por ejemplo,{ kind, name, signature }para miembros);fullagrega campos estructurados (parámetros, atributos, tipo de retorno, modificadores, etc.). Nota: losGetTypeProperties/Fields/Events/Constructorsobsoletos tienen una forma fija única y no aceptanprojection.analysisDepth(signatures|il): soloFindReferencesTo.signatures(predeterminado) escanea declaraciones de miembros;ilademás escanea cuerpos de métodos para llamadores entrantes (más lento).additionalAssemblies(string[]): amplía el alcance de búsqueda paraGetTypeHierarchyy las herramientas de búsqueda inversa.GetTypeHierarchy.derivedTypespermanecenullhasta que pase esto.noCache(bool): omite la caché de respuestas para una sola llamada cuando sospecha resultados obsoletos. Cada herramienta que lee un ensamblado o proyecto almacena en caché su respuesta, clave por los sellos de archivo de sus entradas (el ensamblado y cualquieradditionalAssemblies, el archivo de documento XML junto a él, o el archivo de proyecto yobj/project.assets.json), por lo que una reconstrucción o restauración la invalida automáticamente. Las búsquedasfind_assembly_by_*yresolve_package_references(que leen la caché compartida de paquetes NuGet), las herramientas de configuración y manejo no se almacenan en caché. Dos casos que los sellos no detectan, dondenoCache=truees la solución: un DLL de dependencia colocado junto a un ensamblado que anteriormente se resolvía solo parcialmente (las claves sellan el ensamblado, no sus hermanos), y una restauración para un proyecto cuyoproject.assets.jsonvive fuera deobj/(por ejemplo,UseArtifactsOutputo unBaseIntermediateOutputPathpersonalizado).assemblyHandle(string): aceptado por cada herramienta que tomaassemblyPath, como alternativa a este (pase uno, no ambos). Obtenga uno deopen_assembly; también proporciona eladditionalAssembliescon el que se abrió, y cualquier que pase explícitamente se agrega a ellos.
Resolución de Tipos:
- Admite nombres completos (
Namespace.Type), nombres simples (Type) y tipos anidados (Outer+Inner) - Sensibilidad a mayúsculas controlada por el parámetro
caseSensitive - Resolución de respaldo automática para nombres de tipo ambiguos
Esquema de Respuesta
Todas las herramientas devuelven un sobre JSON estable:
{ "kind": "type.list|member.methods|...", "version": "1.0.0", "data": { /* result */ } }
El sobre se serializa como JSON compacto (sin sangría) en el bloque de contenido de texto de la herramienta. Las herramientas principales de navegación también anuncian un outputSchema de MCP y devuelven el mismo sobre como structuredContent, para que los clientes puedan validar y consumir resultados sin analizar texto: search_members, get_types_from_assembly, get_type_info, get_type_members, get_type_methods, get_assembly_info, get_method_calls, decompile_member, find_implementations_of, find_methods_returning, find_extension_methods_for y find_references_to. Sus esquemas describen la proyección predeterminada summary; los elementos projection='full' agregan campos además de ella. Los resultados de error nunca llevan structuredContent.
Los resultados de error se marcan con el isError: true de MCP, para que los clientes puedan distinguir un fallo de un resultado sin analizar el texto. Los errores usan una forma consistente. Cada error lleva kind, version, code y message; algunos agregan details, y los errores guiados agregan un suggestion, alternativeTools o recommendedParams para apuntar al agente a un siguiente paso:
{
"kind": "error",
"version": "1.0.0",
"code": "MethodNotFound",
"message": "No method named 'Parse' was found on type 'MyApp.Config' in MyApp.dll.",
"suggestion": "Verify the type and method names. Use get_type_members with kinds=method to list available methods, or set includeNonPublic=true for private methods.",
"alternativeTools": ["get_type_members", "analyze_method"]
}
Códigos de error:
- No encontrado:
AssemblyNotFound(recommendedParams.similarFileslista ensamblados casi coincidentes en la misma carpeta),TypeNotFound/MemberNotFound(recommendedParams.candidateslista los nombres más cercanos),MethodNotFound,PackageNotFound,VersionNotFound,XmlNotFound,ProjectNotFound,FileNotFound - Entrada incorrecta:
AmbiguousTypeName(solo para clientes que no pueden obtener;recommendedParams.candidateslista los nombres completos coincidentes),InvalidArgument,InvalidProjection,InvalidAnalysisDepth,InvalidContinuationToken - Carga:
InvalidAssembly(no es un ensamblado administrado),DependencyNotFound(un ensamblado referenciado no pudo cargarse),DependencyResolutionFailed,AccessDenied - Límites e internos:
ResponseTooLarge,InternalError
Hoja de Ruta
Las características enviadas y el trabajo planificado se resumen en src/docs/roadmap.md; la lista de verificación en vivo se rastrea en #87.
Contribuciones
Las contribuciones son bienvenidas. Este repositorio incluye un .editorconfig con preferencias modernas de C# (espacios de nombres con ámbito de archivo, miembros con cuerpo de expresión, sangría de 4 espacios).
Formato de Mensajes de Confirmación
Este proyecto usa Conventional Commits para la generación automatizada de registros de cambios. Todas las confirmaciones deben seguir este formato:
type(scope): description
Tipos válidos:
feat- Una nueva funcionalidadfix- Una corrección de erroresdocs- Solo cambios de documentaciónstyle- Cambios de estilo de código (formato, punto y coma, etc.)refactor- Cambio de código que no corrige un error ni agrega una funcionalidadperf- Mejora de rendimientotest- Agregar o corregir pruebasbuild- Cambios en el sistema de compilación o dependenciasci- Cambios en la configuración de CIchore- Otros cambios que no modifican archivos de src o de pruebarevert- Revierte una confirmación anterior
Ejemplos:
git commit -m "feat(tools): add new assembly analysis tool"
git commit -m "fix: resolve null reference in type loader"
git commit -m "docs(readme): update installation instructions"
Configuración de desarrollo
# Restore .NET tools (versionize, husky)
dotnet tool restore
# Install git hooks for commit validation
dotnet husky install
Directrices
- Mantén los cambios pequeños y enfocados; agrega pruebas unitarias para el nuevo comportamiento.
- Sigue el sobre de respuesta y las convenciones de códigos de error al agregar herramientas.
- Ejecuta
dotnet buildydotnet testlocalmente antes de abrir una solicitud de extracción (PR).
Creación de una versión
Los mantenedores pueden crear versiones usando:
# Restore tools if not already done
dotnet tool restore
# Preview what will change
dotnet versionize --dry-run
# Create release (bumps version, updates changelog, creates git tag)
dotnet versionize
# Push changes and tag to trigger release workflow
git push --follow-tags
versionize solo incrementa la versión del proyecto. Antes de enviar, incrementa ambos campos version en server.json, el version del plugin de Claude Code en plugins/sherlock/.claude-plugin/plugin.json y .claude-plugin/marketplace.json, y la versión fijada de dnx en plugins/sherlock/.mcp.json (y en este README) en la misma confirmación de versión, luego vuelve a apuntar la etiqueta a ella. server.json se empaqueta en el paquete NuGet como .mcp/server.json.
El flujo de trabajo de versión automáticamente:
- Verificará que la etiqueta,
server.json, la versión del proyecto y las versiones del plugin de Claude Code coincidan - Compilará y probará el proyecto
- Creará una versión de GitHub con notas de cambios
- Publicará el paquete NuGet y la entrada del Registro MCP
Registro MCP
mcp-name: io.github.jcucci/dotnet-sherlock-mcp
Licencia
Sherlock MCP para .NET está licenciado bajo la Licencia MIT.