dotnet-sherlock-mcp
About
ILSpy for LLM coding agents. Reflection-based MCP server with 31+ tools to explore .NET assemblies, NuGet packages, types, members, attributes, and XML docs.
Details
- Author
- jcucci
- Categories
- Developer Tools, Knowledge Base
Jump to
Setup
Install dotnet-sherlock-mcp in your MCP client (Claude Desktop, Cursor, Windsurf, and others).
Repository: https://github.com/jcucci/dotnet-sherlock-mcp
Follow the installation instructions in the repository README, then restart your MCP client.
Sherlock MCP for .NETis a comprehensive Model Context Protocol (MCP) server that provides deep introspection capabilities for .NET assemblies. It enables Language Learning Models (LLMs) to analyze and understand your .NET code with precision, delivering accurate and context-aware responses for complex development scenarios.
This tool is essential for developers who want to harness LLM capabilities for:
- Deep codebase analysis- Understanding complex .NET architectures and dependencies
- Precise type information- Getting detailed metadata about types, members, and their signatures
- Automated documentation- Extracting and utilizing XML documentation and attributes
- Custom tooling- Building sophisticated tools that interact with .NET assemblies
- Code generation- Creating accurate code based on existing type structures
- Comprehensive MCP Server: Provides 36 specialized tools for .NET assembly analysis
- Advanced Assembly Introspection: Deep reflection-based analysis of types, members, and metadata
- Rich Member Analysis: Detailed inspection of methods, properties, fields, events, and constructors
- Smart Filtering & Pagination: Advanced filtering by name/attributes with efficient pagination for large datasets
- XML Documentation Integration: Automatic extraction of summary, parameters, returns, and remarks
- Performance Optimized: Caching, streaming, and memory-efficient processing
- Stable JSON API: Consistent envelopes with versioning and structured error codes
- .NET 9.0 Native: Built on the latest .NET platform with modern C# features
- Project Integration: Solution and project file analysis with dependency resolution
- Current MCP SDK: Built onModelContextProtocol2.1.0 (GA)
- Current MCP Specification: Speaks protocol revision2026-07-28, and negotiates down automatically for clients on earlier revisions
- MCP 2026-07-28: upgraded toModelContextProtocol2.1.0, so clients negotiate the current specification revision instead of falling back. The handshake-less request flow is supported, and clients on earlier revisions keep working unchanged.
- Tool annotations: all 36 tools now advertise a title plus accurate behavioural hints (readOnlyHint,destructiveHint,openWorldHint,idempotentHint), so clients can tell at a glance that 35 of them only read metadata.
- Cacheable tool list:tools/listadvertisesttlMsandcacheScopeand returns tools in a deterministic order, letting clients skip redundant re-fetches. SeeCHANGELOG.mdfor full details.
Install the global tool from NuGet (addssherlock-mcpto your PATH):
dotnet tool install -g Sherlock.MCP.Server
Alternatively, during development you can run the server locally:
dotnet run --project src/server/Sherlock.MCP.Server.csproj
Sherlock runs as a standard MCP server that communicates over stdio.
- Cursor: Settings → MCP / Custom tools → Add tool → Command:sherlock-mcp
- Claude Desktop / other MCP clients: Add a server entry pointing to thesherlock-mcpcommand. Example JSON entry (refer to your client’s docs for exact file location/format):
{ "servers": { "sherlock": { "command": "sherlock-mcp" } } }
No arguments are required. The server self-registers all tools when launched.
You usually don't need to paste anything.Sherlock ships its usage guidance in the MCPinstructionsfield returned at initialize, and most MCP clients (including Claude Code) surface that to the agent automatically — so the guidance stays correct and versioned with the package, with no copy-paste to maintain.
The snippets below areoptional reinforcement. Keep them short and principle-based rather than enumerating tool names and workflows: a static list pasted into your repo will drift as Sherlock's tools evolve, whereas the tools' own descriptions (and the serverinstructions) always match the version you're running.
Tool names are exposed insnake_case(get_type_methods,search_members, …); argument names stay camelCase (projection,nameContains).
Optional — a short pointer in your project'sCLAUDE.md:
## .NET Assembly Analysis Use the Sherlock MCP tools (get_type_methods, 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.
The single-file.cursorrulesformat isdeprecated(and silently ignored in Cursor's Agent mode). Add a Project Rule at.cursor/rules/sherlock.mdcinstead:
--- description: Use Sherlock MCP for .NET assembly/type analysis alwaysApply: true --- - Prefer the Sherlock MCP tools (snake_case, e.g. get_type_methods, 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.
For tools that follow the cross-editorAGENTS.mdconvention, the same short pointer works — drop the Claude Code snippet above into yourAGENTS.md.
For system-wide usage, add to your global agent settings:
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.
Below are compact prompt snippets you can paste into your chat to get productive fast. Adjust paths to your local DLLs.
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.
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.
Use GetXmlDocsForMember on /abs/path/MyLib.dll, type MyNamespace.MyType, member TryParse. Summarize the summary + params.
List types from /abs/path/MyLib.dll; then get type info for the first result and list its nested types.
Use GetTypeMethods on /abs/path/MyLib.dll, type MyNamespace.MyType, sortBy name, sortOrder asc, skip 0, take 25, hasAttributeContains Obsolete.
Browse lean, then get detail (projection)
On /abs/path/MyLib.dll, run GetTypeMethods for MyNamespace.MyType with the default summary projection to see signatures. Then re-call GetTypeMethods with projection='full' only for the methods I name to get their parameters and attributes.
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.
Tool names:MCP clients call these tools insnake_case—GetTypeMethods→get_type_methods,SearchMembers→search_members, and so on. The PascalCase names used throughout this README match the underlying C# methods and the tool descriptions your client displays.
- AnalyzeAssembly: Complete assembly overview with public types and metadata
- GetAssemblyInfo: Assembly-level metadata — identity/version, target framework, and referenced assemblies (projection=fulladds all assembly attributes)
- FindAssemblyByClassName: Locate assemblies containing specific class names
- FindAssemblyByFileName: Find assemblies by file name in common build paths
- FindAssemblyByNugetPackage: Resolve a DLL from the local NuGet cache by package id (optionalversion/tfm)
- GetTypesFromAssembly: List all public types with metadata (paginated)
- AnalyzeType: Comprehensive type analysis with all members
- GetTypeInfo: Detailed type metadata (accessibility, generics, nested types)
- GetTypeHierarchy: Inheritance chain and interface implementations
- GetGenericTypeInfo: Generic parameters, arguments, and variance information
- GetTypeAttributes: Custom attributes declared on types
- GetNestedTypes: Nested type declarations
Member Analysis (Filterable & Paginated)
- GetAllTypeMembers: All members across all categories
- GetTypeMethods: Method signatures, overloads, and metadata
- GetTypeProperties: Property details including getters/setters and indexers
- GetTypeFields: Field information including constants and readonly fields
- GetTypeEvents: Event declarations with handler types
- GetTypeConstructors: Constructor signatures and parameters
- AnalyzeMethod: Deep method analysis with overloads and attributes
- SearchMembers: Search a whole assembly for members whose name contains a fragment — the entry point when you know a member name but not its declaring type. Filter bymemberKinds(method|property|field|event|type).
- FindImplementationsOf: Types implementing an interface or deriving from a base class (open-generic match supported)
- FindMethodsReturning: Methods whose return type matches a given type (open-generic match supported)
- FindExtensionMethodsFor: Extension methods that extend a given type (scans static classes bythis-parameter)
- FindReferencesTo: Broader sweep across parameters, fields, properties, events, and generic arguments; passanalysisDepth='il'to also resolve inbound callers from method bodies
- GetMethodCalls: Read a method's IL body to list what it calls and which fields it touches — the "what does this method do?" question signature-level tools can't answer (aggregates across overloads; use.ctor/.cctorfor constructors)
- GetMemberAttributes: Attributes for specific members
- GetParameterAttributes: Parameter-level attribute information
- GetXmlDocsForType: Extract type-level XML documentation
- GetXmlDocsForMember: Member-specific documentation (summary/params/returns/remarks)
- AnalyzeSolution: Parse .sln files and enumerate projects
- AnalyzeProject: Project metadata, references, and build configuration
- GetProjectOutputPaths: Resolve output directories for different configurations
- ResolvePackageReferences: Map NuGet packages to cached assemblies
- FindDepsJsonDependencies: Parse deps.json for runtime dependencies
- GetRuntimeOptions: Current server configuration and defaults
- UpdateRuntimeOptions: Modify pagination, caching, and search behavior
All member analysis tools support comprehensive filtering and pagination:
- caseSensitive(bool): Case-sensitive type/member matching
- nameContains(string): Filter by member name substring
- hasAttributeContains(string): Filter by attribute type substring
- includePublic/includeNonPublic(bool): Visibility filtering
- includeStatic/includeInstance(bool): Member type filtering
- skip/take(int): Standard offset pagination
- maxItems(int): Maximum results per request (default 50;FindReferencesTodefaults to 25)
- continuationToken(string): Token-based pagination for large datasets
- sortBy/sortOrder(string): Sort by name/access in asc/desc order
Most enumerating tools default to a leansummaryprojection and let you opt into the heavierfullpayload only when you need it. Reach forfulldeliberately —summaryis usually enough to decide your next call.
- projection(summary|full): supported byGetTypesFromAssembly,GetTypeMethods,GetAssemblyInfo,GetMethodCalls,FindImplementationsOf,FindMethodsReturning,FindExtensionMethodsFor, andFindReferencesTo.summaryreturns just enough to browse (e.g.{ name, signature }for methods);fulladds structured fields (parameters, attributes, return type, modifiers, etc.).Note:GetTypeProperties/Fields/Events/Constructorshave a single fixed shape and take noprojection.
- analysisDepth(signatures|il):FindReferencesToonly.signatures(default) scans member declarations;iladditionally scans method bodies for inbound callers (slower).
- additionalAssemblies(string[]): widen the search scope forGetTypeHierarchyand the reverse-lookup tools.GetTypeHierarchy.derivedTypesstaysnulluntil you pass this.
- noCache(bool): bypass the response cache for a single call when you suspect stale results.
- Supports full names (Namespace.Type), simple names (Type), and nested types (Outer+Inner)
- Case sensitivity controlled bycaseSensitiveparameter
- Automatic fallback resolution for ambiguous type names
All tools return a stable JSON envelope:
{ "kind": "type.list|member.methods|...", "version": "1.0.0", "data": { / result */ } }
{ "kind": "error", "version": "1.0.0", "code": "AssemblyNotFound|TypeNotFound|InvalidArgument|InternalError", "message": "...", "details": { } } Common error codes include AssemblyNotFound, TypeNotFound, MemberNotFound, InvalidArgument, and InternalError.
Contributions are welcome. This repo includes an.editorconfigwith modern C# preferences (file-scoped namespaces, expression-bodied members, 4-space indentation).
This project usesConventional Commitsfor automated changelog generation. All commits must follow this format:
- feat- A new feature
- fix- A bug fix
- docs- Documentation only changes
- style- Code style changes (formatting, semicolons, etc)
- refactor- Code change that neither fixes a bug nor adds a feature
- perf- Performance improvement
- test- Adding or correcting tests
- build- Changes to build system or dependencies
- ci- Changes to CI configuration
- chore- Other changes that don't modify src or test files
- revert- Reverts a previous commit
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"
# Restore .NET tools (versionize, husky) dotnet tool restore # Install git hooks for commit validation dotnet husky install
- Keep changes small and focused; add unit tests for new behavior.
- Follow the response envelope and error code conventions when adding tools.
- Rundotnet buildanddotnet testlocally before opening a PR.
# 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
The release workflow will automatically:
- Build and test the project
- Create a GitHub Release with changelog notes
- Publish the NuGet package
- Updateserver.jsonwith the new version
mcp-name: io.github.jcucci/dotnet-sherlock-mcp
Sherlock MCP for .NET is licensed under theMIT License.
This is a web browser that enables your coding agent, such as Claude Code, to visit websites on your behalf and assist you in identifying bugs or creating UI test cases.
Local stdio MCP server that lets AI coding agents read and maintain structured architecture, rules, and decisions directly from your repository.
Official Context7 MCP server that brings up-to-date, version-specific library documentation and code examples into AI coding prompts.
Remote, no-auth MCP server providing AI-powered codebase context and answers
Official Svelte MCP server, provides docs and suggestions on the generated code.
Documentation and assembly review for @nhtio/adk.
Structured .aide spec files that give AI agents progressive disclosure into your codebase architecture. 6 MCP tools, 8 slash commands, TUI wizard, multi-IDE support.
Assists AI developers with requirement clarification, module design, and technical architecture.
AmazingMCP — MCP Server for .NET / C# Codebases
An MCP server that gives AI agents deep understanding of C# codebases via Roslyn — type search, dependency graphs, usage analysis, and architecture overviews, all from a live in-memory compilation.
Automatically generates documentation for code repositories by analyzing directory structures and code files using the OpenRouter API.
MCP server that ingests project docs once and lets Claude search by meaning instead of reading everything — saving tokens on large codebases
Sign in to leave a review
Use Google, GitHub, or an email account so ratings stay tied to real people.
No reviews posted yet.





