Find Usages of a Symbol
find_usagesLists direct users of a C# type, member, or constructor to assess impact before changing or deleting it; covers callers, readers, writers, raisers, subscribers, and test users.
Instructions
List who uses a symbol (direct fan-in); impact_of_change adds closure and risk, calls_external covers external members.
Use it before changing or deleting a symbol, not grep. What is listed depends on resolvedKind: 'type' - the types that reference it (a doc cref too: docCrefOnly), plus markup views; 'method' - its callers, overloads unioned ('overloads'; item 'calls': its own); 'property' or 'field' - its readers and writers; 'event' - its raisers and (un)subscribers; 'enum_member' - its references; 'operator' ('op_Equality') - its uses, casts too; 'constructor' ('Type.Type') - the type's construction and injection sites. Test users included.
Returns symbol, resolvedKind, usedBy (capped envelope: items, count, totalFound, truncated; max 100). An item is {name, file, line}, one per user: file is solution-relative, line where its declaration starts (not the reference); 'files' [{file, line}] for a type declared in several; absent if unknown; users sharing a name add 'fullName' (a type), 'project'. Optional members qualify it: 'note' ahead of the list (an empty or constructor answer, unresolved core references), 'namesakes' (several types share it, unioned), 'collision' (a same-named other kind, not counted), 'viaContract' + 'viaContractNote' (a qualified method's contract or virtual-base callers), 'selfReferences' (users on the member's own type), 'textuallyInvisibleUsers' (users not naming it), 'nearest' (on 'not_found': a close name), 'resourceKeyNote' (markup keys the type; those views: find_resource_usages).
An empty usedBy on a resolved symbol is not proof of dead code: entry points, DI, reflection, source generators and unrecorded markup leave no reference. 'not_found' is not 'undeclared': a delegate type and a qualified or nested type name answer it; 'note' may say why.
Read-only. symbol is case-sensitive. A type takes its simple name. A member takes 'Type.Member' for one type's, or a bare name: that answers for ONE kind, the first in the order above with users, unioned over its same-named members.
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"sessionId": "<sessionId>",
"symbol": "<symbol>"
},
"name": "find_usages"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | The exact (case-sensitive) type, method, property, field, event, enum-member or operator (metadata) name - the qualified Type.Member form for a member - or 'Type.Type' for a type's CONSTRUCTOR (see the tool description: the answer is the type's construction/injection sites, overloads unioned). | |
| sessionId | Yes | The session_id returned by analyze_solution. Also takes an absolute .sln/.slnx/.slnf path, analyzed on first use. | |
| includeTests | No | Include users declared in test projects (default true). false lists production users only, BEFORE the 100-item cap, and 'testUsersFiltered' says how many were left out; viaContract keeps counting every caller. |