@opencodehub/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/README.md +62 -0
  2. package/dist/analysis-bridge.d.ts +23 -0
  3. package/dist/analysis-bridge.d.ts.map +1 -0
  4. package/dist/analysis-bridge.js +83 -0
  5. package/dist/analysis-bridge.js.map +1 -0
  6. package/dist/connection-pool.d.ts +76 -0
  7. package/dist/connection-pool.d.ts.map +1 -0
  8. package/dist/connection-pool.js +179 -0
  9. package/dist/connection-pool.js.map +1 -0
  10. package/dist/error-envelope.d.ts +97 -0
  11. package/dist/error-envelope.d.ts.map +1 -0
  12. package/dist/error-envelope.js +75 -0
  13. package/dist/error-envelope.js.map +1 -0
  14. package/dist/group-resolver.d.ts +29 -0
  15. package/dist/group-resolver.d.ts.map +1 -0
  16. package/dist/group-resolver.js +100 -0
  17. package/dist/group-resolver.js.map +1 -0
  18. package/dist/index.d.ts +43 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +54 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/next-step-hints.d.ts +24 -0
  23. package/dist/next-step-hints.d.ts.map +1 -0
  24. package/dist/next-step-hints.js +41 -0
  25. package/dist/next-step-hints.js.map +1 -0
  26. package/dist/repo-resolver.d.ts +88 -0
  27. package/dist/repo-resolver.d.ts.map +1 -0
  28. package/dist/repo-resolver.js +211 -0
  29. package/dist/repo-resolver.js.map +1 -0
  30. package/dist/repo-uri-for-entry.d.ts +25 -0
  31. package/dist/repo-uri-for-entry.d.ts.map +1 -0
  32. package/dist/repo-uri-for-entry.js +64 -0
  33. package/dist/repo-uri-for-entry.js.map +1 -0
  34. package/dist/resources/repo-cluster.d.ts +19 -0
  35. package/dist/resources/repo-cluster.d.ts.map +1 -0
  36. package/dist/resources/repo-cluster.js +203 -0
  37. package/dist/resources/repo-cluster.js.map +1 -0
  38. package/dist/resources/repo-clusters.d.ts +14 -0
  39. package/dist/resources/repo-clusters.d.ts.map +1 -0
  40. package/dist/resources/repo-clusters.js +97 -0
  41. package/dist/resources/repo-clusters.js.map +1 -0
  42. package/dist/resources/repo-context.d.ts +12 -0
  43. package/dist/resources/repo-context.d.ts.map +1 -0
  44. package/dist/resources/repo-context.js +84 -0
  45. package/dist/resources/repo-context.js.map +1 -0
  46. package/dist/resources/repo-process.d.ts +19 -0
  47. package/dist/resources/repo-process.d.ts.map +1 -0
  48. package/dist/resources/repo-process.js +220 -0
  49. package/dist/resources/repo-process.js.map +1 -0
  50. package/dist/resources/repo-processes.d.ts +13 -0
  51. package/dist/resources/repo-processes.d.ts.map +1 -0
  52. package/dist/resources/repo-processes.js +99 -0
  53. package/dist/resources/repo-processes.js.map +1 -0
  54. package/dist/resources/repo-schema.d.ts +13 -0
  55. package/dist/resources/repo-schema.d.ts.map +1 -0
  56. package/dist/resources/repo-schema.js +99 -0
  57. package/dist/resources/repo-schema.js.map +1 -0
  58. package/dist/resources/repos.d.ts +20 -0
  59. package/dist/resources/repos.d.ts.map +1 -0
  60. package/dist/resources/repos.js +58 -0
  61. package/dist/resources/repos.js.map +1 -0
  62. package/dist/resources/store-helper.d.ts +28 -0
  63. package/dist/resources/store-helper.d.ts.map +1 -0
  64. package/dist/resources/store-helper.js +58 -0
  65. package/dist/resources/store-helper.js.map +1 -0
  66. package/dist/resources/yaml.d.ts +10 -0
  67. package/dist/resources/yaml.d.ts.map +1 -0
  68. package/dist/resources/yaml.js +16 -0
  69. package/dist/resources/yaml.js.map +1 -0
  70. package/dist/server.d.ts +46 -0
  71. package/dist/server.d.ts.map +1 -0
  72. package/dist/server.js +194 -0
  73. package/dist/server.js.map +1 -0
  74. package/dist/staleness.d.ts +19 -0
  75. package/dist/staleness.d.ts.map +1 -0
  76. package/dist/staleness.js +40 -0
  77. package/dist/staleness.js.map +1 -0
  78. package/dist/test-utils.d.ts +170 -0
  79. package/dist/test-utils.d.ts.map +1 -0
  80. package/dist/test-utils.js +473 -0
  81. package/dist/test-utils.js.map +1 -0
  82. package/dist/tools/api-impact.d.ts +47 -0
  83. package/dist/tools/api-impact.d.ts.map +1 -0
  84. package/dist/tools/api-impact.js +199 -0
  85. package/dist/tools/api-impact.js.map +1 -0
  86. package/dist/tools/confidence.d.ts +39 -0
  87. package/dist/tools/confidence.d.ts.map +1 -0
  88. package/dist/tools/confidence.js +58 -0
  89. package/dist/tools/confidence.js.map +1 -0
  90. package/dist/tools/context.d.ts +47 -0
  91. package/dist/tools/context.d.ts.map +1 -0
  92. package/dist/tools/context.js +577 -0
  93. package/dist/tools/context.js.map +1 -0
  94. package/dist/tools/dependencies.d.ts +29 -0
  95. package/dist/tools/dependencies.d.ts.map +1 -0
  96. package/dist/tools/dependencies.js +110 -0
  97. package/dist/tools/dependencies.js.map +1 -0
  98. package/dist/tools/detect-changes.d.ts +15 -0
  99. package/dist/tools/detect-changes.d.ts.map +1 -0
  100. package/dist/tools/detect-changes.js +78 -0
  101. package/dist/tools/detect-changes.js.map +1 -0
  102. package/dist/tools/group-contracts.d.ts +26 -0
  103. package/dist/tools/group-contracts.d.ts.map +1 -0
  104. package/dist/tools/group-contracts.js +251 -0
  105. package/dist/tools/group-contracts.js.map +1 -0
  106. package/dist/tools/group-cross-repo-links.d.ts +28 -0
  107. package/dist/tools/group-cross-repo-links.d.ts.map +1 -0
  108. package/dist/tools/group-cross-repo-links.js +128 -0
  109. package/dist/tools/group-cross-repo-links.js.map +1 -0
  110. package/dist/tools/group-list.d.ts +10 -0
  111. package/dist/tools/group-list.d.ts.map +1 -0
  112. package/dist/tools/group-list.js +74 -0
  113. package/dist/tools/group-list.js.map +1 -0
  114. package/dist/tools/group-query.d.ts +40 -0
  115. package/dist/tools/group-query.d.ts.map +1 -0
  116. package/dist/tools/group-query.js +209 -0
  117. package/dist/tools/group-query.js.map +1 -0
  118. package/dist/tools/group-status.d.ts +21 -0
  119. package/dist/tools/group-status.d.ts.map +1 -0
  120. package/dist/tools/group-status.js +121 -0
  121. package/dist/tools/group-status.js.map +1 -0
  122. package/dist/tools/group-sync.d.ts +23 -0
  123. package/dist/tools/group-sync.d.ts.map +1 -0
  124. package/dist/tools/group-sync.js +112 -0
  125. package/dist/tools/group-sync.js.map +1 -0
  126. package/dist/tools/impact.d.ts +36 -0
  127. package/dist/tools/impact.d.ts.map +1 -0
  128. package/dist/tools/impact.js +232 -0
  129. package/dist/tools/impact.js.map +1 -0
  130. package/dist/tools/license-audit.d.ts +34 -0
  131. package/dist/tools/license-audit.d.ts.map +1 -0
  132. package/dist/tools/license-audit.js +108 -0
  133. package/dist/tools/license-audit.js.map +1 -0
  134. package/dist/tools/list-dead-code.d.ts +26 -0
  135. package/dist/tools/list-dead-code.d.ts.map +1 -0
  136. package/dist/tools/list-dead-code.js +110 -0
  137. package/dist/tools/list-dead-code.js.map +1 -0
  138. package/dist/tools/list-findings-delta.d.ts +36 -0
  139. package/dist/tools/list-findings-delta.d.ts.map +1 -0
  140. package/dist/tools/list-findings-delta.js +274 -0
  141. package/dist/tools/list-findings-delta.js.map +1 -0
  142. package/dist/tools/list-findings.d.ts +30 -0
  143. package/dist/tools/list-findings.d.ts.map +1 -0
  144. package/dist/tools/list-findings.js +129 -0
  145. package/dist/tools/list-findings.js.map +1 -0
  146. package/dist/tools/list-repos.d.ts +17 -0
  147. package/dist/tools/list-repos.d.ts.map +1 -0
  148. package/dist/tools/list-repos.js +63 -0
  149. package/dist/tools/list-repos.js.map +1 -0
  150. package/dist/tools/owners.d.ts +23 -0
  151. package/dist/tools/owners.d.ts.map +1 -0
  152. package/dist/tools/owners.js +103 -0
  153. package/dist/tools/owners.js.map +1 -0
  154. package/dist/tools/pack-codebase.d.ts +76 -0
  155. package/dist/tools/pack-codebase.d.ts.map +1 -0
  156. package/dist/tools/pack-codebase.js +289 -0
  157. package/dist/tools/pack-codebase.js.map +1 -0
  158. package/dist/tools/project-profile.d.ts +28 -0
  159. package/dist/tools/project-profile.d.ts.map +1 -0
  160. package/dist/tools/project-profile.js +109 -0
  161. package/dist/tools/project-profile.js.map +1 -0
  162. package/dist/tools/query.d.ts +63 -0
  163. package/dist/tools/query.d.ts.map +1 -0
  164. package/dist/tools/query.js +662 -0
  165. package/dist/tools/query.js.map +1 -0
  166. package/dist/tools/remove-dead-code.d.ts +47 -0
  167. package/dist/tools/remove-dead-code.d.ts.map +1 -0
  168. package/dist/tools/remove-dead-code.js +258 -0
  169. package/dist/tools/remove-dead-code.js.map +1 -0
  170. package/dist/tools/rename.d.ts +21 -0
  171. package/dist/tools/rename.d.ts.map +1 -0
  172. package/dist/tools/rename.js +116 -0
  173. package/dist/tools/rename.js.map +1 -0
  174. package/dist/tools/risk-trends.d.ts +19 -0
  175. package/dist/tools/risk-trends.d.ts.map +1 -0
  176. package/dist/tools/risk-trends.js +73 -0
  177. package/dist/tools/risk-trends.js.map +1 -0
  178. package/dist/tools/route-map.d.ts +27 -0
  179. package/dist/tools/route-map.d.ts.map +1 -0
  180. package/dist/tools/route-map.js +119 -0
  181. package/dist/tools/route-map.js.map +1 -0
  182. package/dist/tools/scan.d.ts +27 -0
  183. package/dist/tools/scan.d.ts.map +1 -0
  184. package/dist/tools/scan.js +136 -0
  185. package/dist/tools/scan.js.map +1 -0
  186. package/dist/tools/shape-check.d.ts +53 -0
  187. package/dist/tools/shape-check.d.ts.map +1 -0
  188. package/dist/tools/shape-check.js +161 -0
  189. package/dist/tools/shape-check.js.map +1 -0
  190. package/dist/tools/shared.d.ts +101 -0
  191. package/dist/tools/shared.d.ts.map +1 -0
  192. package/dist/tools/shared.js +114 -0
  193. package/dist/tools/shared.js.map +1 -0
  194. package/dist/tools/signature.d.ts +38 -0
  195. package/dist/tools/signature.d.ts.map +1 -0
  196. package/dist/tools/signature.js +332 -0
  197. package/dist/tools/signature.js.map +1 -0
  198. package/dist/tools/sql.d.ts +34 -0
  199. package/dist/tools/sql.d.ts.map +1 -0
  200. package/dist/tools/sql.js +222 -0
  201. package/dist/tools/sql.js.map +1 -0
  202. package/dist/tools/tool-map.d.ts +24 -0
  203. package/dist/tools/tool-map.d.ts.map +1 -0
  204. package/dist/tools/tool-map.js +97 -0
  205. package/dist/tools/tool-map.js.map +1 -0
  206. package/dist/tools/verdict.d.ts +33 -0
  207. package/dist/tools/verdict.d.ts.map +1 -0
  208. package/dist/tools/verdict.js +102 -0
  209. package/dist/tools/verdict.js.map +1 -0
  210. package/package.json +76 -0
@@ -0,0 +1,577 @@
1
+ /**
2
+ * `context` — 360-degree view of a single symbol.
3
+ *
4
+ * Resolution order:
5
+ * 1. `uid` — direct node-id lookup; no disambiguation, no name match.
6
+ * 2. `symbol` (or `name` alias) — filtered by optional `kind` and
7
+ * `file_path` (snake_case, with `filePath` camelCase alias preserved
8
+ * for backward compat). Ambiguous names surface a ranked candidate
9
+ * list instead of silently picking one (EC-04 in the PRD).
10
+ *
11
+ * Once a single target is resolved we collect:
12
+ * - `incoming` — every edge where the target is the `to_id`, bucketed
13
+ * by edge type (calls, imports, accesses, has_method, has_property,
14
+ * extends, implements, method_overrides, method_implements).
15
+ * - `outgoing` — the same bucketing for edges where the target is
16
+ * the `from_id`.
17
+ * - `processes` — PROCESS_STEP participation (Process-kind partners).
18
+ * - `cochanges` — git-history partners for the target's enclosing file.
19
+ * - `operations` — OpenAPI `Operation` nodes linked to a Route target via
20
+ * `HANDLES_ROUTE` (cross-stack trace from the OpenAPI phase).
21
+ * - `confidenceBreakdown` — provenance tally over every edge surfaced.
22
+ * - `content` (optional) — the target's indexed source, capped at
23
+ * {@link CONTENT_CHAR_CAP} characters. Only returned when
24
+ * `include_content` is true.
25
+ * - `location` — `{ filePath, startLine, endLine }` for quick jump-to.
26
+ *
27
+ * The flat `callers`, `callees`, `members`, and `owner` fields are kept on
28
+ * the response for backward compat with pre-parity consumers; new callers
29
+ * should prefer the `incoming` / `outgoing` category buckets.
30
+ */
31
+ // biome-ignore-all lint/complexity/useLiteralKeys: dot-access disallowed on Record index signatures
32
+ import { z } from "zod";
33
+ import { toolErrorFromUnknown } from "../error-envelope.js";
34
+ import { withNextSteps } from "../next-step-hints.js";
35
+ import { stalenessFromMeta } from "../staleness.js";
36
+ import { computeConfidenceBreakdown } from "./confidence.js";
37
+ import { fromToolResult, repoArgShape, toToolResult, withStore, } from "./shared.js";
38
+ /** Upper bound on the `content` field size when `include_content` is true. */
39
+ const CONTENT_CHAR_CAP = 2000;
40
+ /**
41
+ * Relation types surfaced in the categorised `incoming` / `outgoing`
42
+ * buckets. PROCESS_STEP / HANDLES_ROUTE / CONTAINS live in their own
43
+ * dedicated fields and are excluded here.
44
+ */
45
+ const CATEGORY_EDGE_TYPES = [
46
+ "CALLS",
47
+ "IMPORTS",
48
+ "ACCESSES",
49
+ "HAS_METHOD",
50
+ "HAS_PROPERTY",
51
+ "EXTENDS",
52
+ "IMPLEMENTS",
53
+ "METHOD_OVERRIDES",
54
+ "METHOD_IMPLEMENTS",
55
+ ];
56
+ /** Edge types aggregated into the `confidenceBreakdown` tally. */
57
+ const CONFIDENCE_EDGE_TYPES = [
58
+ ...CATEGORY_EDGE_TYPES,
59
+ "CONTAINS",
60
+ "PROCESS_STEP",
61
+ "HANDLES_ROUTE",
62
+ ];
63
+ const ContextInput = {
64
+ symbol: z
65
+ .string()
66
+ .min(1)
67
+ .optional()
68
+ .describe("The symbol name to inspect (function, class, method, etc.). Alias of `name`."),
69
+ name: z.string().min(1).optional().describe("Alias for `symbol`."),
70
+ uid: z
71
+ .string()
72
+ .min(1)
73
+ .optional()
74
+ .describe("Direct node id from prior tool results. When supplied, skips name-based disambiguation."),
75
+ ...repoArgShape,
76
+ kind: z
77
+ .string()
78
+ .optional()
79
+ .describe("Optional NodeKind to disambiguate (e.g. 'Function' vs 'Method')."),
80
+ file_path: z
81
+ .string()
82
+ .optional()
83
+ .describe("Optional file path substring to disambiguate same-named symbols. Matched via LIKE '%<file_path>%'."),
84
+ filePath: z.string().optional().describe("camelCase alias of `file_path` for backward compat."),
85
+ include_content: z
86
+ .boolean()
87
+ .optional()
88
+ .describe(`When true, attach the target's indexed source under \`content\` (capped at ${CONTENT_CHAR_CAP} chars). Default false.`),
89
+ };
90
+ function makeBuckets() {
91
+ return {
92
+ calls: [],
93
+ imports: [],
94
+ accesses: [],
95
+ has_method: [],
96
+ has_property: [],
97
+ extends: [],
98
+ implements: [],
99
+ method_overrides: [],
100
+ method_implements: [],
101
+ };
102
+ }
103
+ export async function runContext(ctx, args) {
104
+ const call = await withStore(ctx, args, async (store, resolved) => {
105
+ try {
106
+ const nameInput = args.symbol ?? args.name;
107
+ const uid = args.uid;
108
+ if (!nameInput && !uid) {
109
+ return withNextSteps(`Either "symbol" (or "name") or "uid" is required.`, { target: null, candidates: [] }, ["call `query` to locate a symbol and re-try `context` with its uid"], stalenessFromMeta(resolved.meta));
110
+ }
111
+ const filePathHint = args.file_path ?? args.filePath;
112
+ const resolveArgs = {};
113
+ if (uid !== undefined)
114
+ resolveArgs.uid = uid;
115
+ if (nameInput !== undefined)
116
+ resolveArgs.name = nameInput;
117
+ if (args.kind !== undefined)
118
+ resolveArgs.kind = args.kind;
119
+ if (filePathHint !== undefined)
120
+ resolveArgs.filePath = filePathHint;
121
+ const resolution = await resolveTarget(store.graph, resolveArgs);
122
+ if (resolution.kind === "not_found") {
123
+ const label = nameInput ?? uid ?? "(unknown)";
124
+ return withNextSteps(`No symbol named "${label}" in ${resolved.name}.`, { target: null, candidates: [] }, ["call `query` with a broader phrase to locate similar symbols"], stalenessFromMeta(resolved.meta));
125
+ }
126
+ if (resolution.kind === "ambiguous") {
127
+ const list = resolution.candidates
128
+ .map((c, i) => `${i + 1}. [${c.kind}] ${c.filePath} (${c.id})`)
129
+ .join("\n");
130
+ return withNextSteps(`"${nameInput ?? uid}" is ambiguous (${resolution.candidates.length} matches):\n${list}`, { target: null, candidates: resolution.candidates }, ["re-call `context` with `uid` (from the list above) or narrow via `kind` / `file_path`"], stalenessFromMeta(resolved.meta));
131
+ }
132
+ const target = resolution.target;
133
+ const location = {
134
+ filePath: target.filePath,
135
+ startLine: resolution.startLine,
136
+ endLine: resolution.endLine,
137
+ };
138
+ const content = args.include_content === true ? capContent(resolution.content) : undefined;
139
+ const [incomingRows, outgoingRows, processRows, cochanges, operations, breakdownEdges, owner,] = await Promise.all([
140
+ fetchCategorizedEdges(store.graph, target.id, "incoming"),
141
+ fetchCategorizedEdges(store.graph, target.id, "outgoing"),
142
+ fetchProcessParticipation(store.graph, target.id),
143
+ fetchCochangePartners(store, target),
144
+ fetchLinkedOperations(store.graph, target),
145
+ fetchConfidenceBreakdownEdges(store.graph, target.id),
146
+ fetchOwner(store.graph, target.id),
147
+ ]);
148
+ const confidenceBreakdown = computeConfidenceBreakdown(breakdownEdges);
149
+ const incoming = bucketize(incomingRows);
150
+ const outgoing = bucketize(outgoingRows);
151
+ const callers = incoming.calls;
152
+ const callees = outgoing.calls;
153
+ const members = [...outgoing.has_method, ...outgoing.has_property];
154
+ const lines = [];
155
+ lines.push(`Symbol: ${target.name} [${target.kind}] — ${target.filePath}`);
156
+ if (location.startLine !== null && location.endLine !== null) {
157
+ lines.push(`Location: lines ${location.startLine}-${location.endLine}`);
158
+ }
159
+ lines.push(`Confidence: ${confidenceBreakdown.confirmed} confirmed, ` +
160
+ `${confidenceBreakdown.heuristic} heuristic, ` +
161
+ `${confidenceBreakdown.unknown} unknown`);
162
+ appendCategorySection(lines, "Incoming", incoming);
163
+ appendCategorySection(lines, "Outgoing", outgoing);
164
+ if (owner.length > 0) {
165
+ lines.push(`Owner:`);
166
+ for (const o of owner)
167
+ lines.push(` ⊃ ${o.name} [${o.kind}] — ${o.filePath}`);
168
+ }
169
+ if (processRows.length > 0) {
170
+ lines.push(`Processes (${processRows.length}):`);
171
+ for (const p of processRows) {
172
+ const stepSuffix = p.step !== null ? ` (step ${p.step})` : "";
173
+ lines.push(` ⊿ ${p.label}${stepSuffix}`);
174
+ }
175
+ }
176
+ if (cochanges.length > 0) {
177
+ lines.push(`Files often edited together with this one (by lift) — git history, NOT call dependencies (${cochanges.length}):`);
178
+ for (const p of cochanges) {
179
+ lines.push(` ⇌ ${p.file} [lift=${p.lift.toFixed(2)}, co-commits=${p.cocommitCount}, last=${p.lastCocommitAt}]`);
180
+ }
181
+ }
182
+ if (operations.length > 0) {
183
+ lines.push(`OpenAPI operations (${operations.length}):`);
184
+ for (const op of operations) {
185
+ const opSuffix = op.operationId ? ` (${op.operationId})` : "";
186
+ const sumSuffix = op.summary ? ` — ${op.summary}` : "";
187
+ lines.push(` ⇢ ${op.method} ${op.path}${opSuffix}${sumSuffix}`);
188
+ lines.push(` spec: ${op.filePath}`);
189
+ }
190
+ }
191
+ if (content !== undefined) {
192
+ lines.push(`Content (first ${CONTENT_CHAR_CAP} chars):`);
193
+ lines.push(content);
194
+ }
195
+ const next = [
196
+ `call \`impact\` with target="${target.id}" to see downstream blast radius`,
197
+ ];
198
+ if (callers.length === 0) {
199
+ next.push("no callers found — this may be an entry point or dead code");
200
+ }
201
+ if (cochanges.length > 0) {
202
+ next.push("review cochanges: files historically edited together with this one (git-history signal, not call dependencies)");
203
+ }
204
+ if (operations.length > 0) {
205
+ next.push("route is documented by an OpenAPI operation — consult the spec file(s) listed above");
206
+ }
207
+ const structured = {
208
+ target,
209
+ location,
210
+ candidates: [],
211
+ incoming,
212
+ outgoing,
213
+ processes: processRows,
214
+ // Flat legacy fields preserved for pre-parity consumers.
215
+ callers,
216
+ callees,
217
+ members,
218
+ owner,
219
+ cochanges,
220
+ operations,
221
+ confidenceBreakdown,
222
+ };
223
+ if (content !== undefined)
224
+ structured["content"] = content;
225
+ return withNextSteps(lines.join("\n"), structured, next, stalenessFromMeta(resolved.meta));
226
+ }
227
+ catch (err) {
228
+ return toolErrorFromUnknown(err);
229
+ }
230
+ });
231
+ return toToolResult(call);
232
+ }
233
+ export function registerContextTool(server, ctx) {
234
+ server.registerTool("context", {
235
+ title: "360-degree symbol view",
236
+ description: "Resolve a symbol to its graph node and return categorised incoming/outgoing edges (calls, imports, accesses, has_method, has_property, extends, implements, method_overrides, method_implements), process participation, OpenAPI operation links for Route targets, and file location. Use `uid` for zero-ambiguity lookup, or narrow a common name with `file_path` and/or `kind`; when a name still matches more than one node the response is a candidate list for you to pick from. Set `include_content: true` to attach the indexed source (capped at 2000 characters). The response also carries a `confidenceBreakdown` (confirmed / heuristic / unknown) tallying the provenance tier of every edge surfaced — so callers can tell whether the neighbourhood is backed by an LSP oracle or by heuristics. Finally, a top-level `cochanges` field lists files often edited together with the target's enclosing file, ranked by lift. These come from the dedicated `cochanges` table (git history), are strictly a statistical signal, and MUST NOT be treated as static code dependencies.",
237
+ inputSchema: ContextInput,
238
+ annotations: {
239
+ readOnlyHint: true,
240
+ destructiveHint: false,
241
+ idempotentHint: true,
242
+ openWorldHint: false,
243
+ },
244
+ }, async (args) => fromToolResult(await runContext(ctx, args)));
245
+ }
246
+ /**
247
+ * Resolve a symbol to a single graph node.
248
+ *
249
+ * `uid` short-circuits the resolver — we ignore name/kind/filePath hints
250
+ * and return the matching node if present. For name-based lookup we apply
251
+ * `kind` and `filePath` as filters and return every match up to 25 rows.
252
+ */
253
+ async function resolveTarget(graph, args) {
254
+ if (args.uid) {
255
+ const list = await graph.listNodes({ ids: [args.uid], limit: 1 });
256
+ const node = list[0];
257
+ if (!node)
258
+ return { kind: "not_found" };
259
+ return {
260
+ kind: "resolved",
261
+ target: nodeToRow(node),
262
+ startLine: toLineOrNull(getProp(node, "startLine")),
263
+ endLine: toLineOrNull(getProp(node, "endLine")),
264
+ content: stringOrNull(getProp(node, "content")),
265
+ };
266
+ }
267
+ if (!args.name)
268
+ return { kind: "not_found" };
269
+ const listOpts = args.kind !== undefined ? { kinds: [args.kind] } : {};
270
+ let candidates = await graph.listNodesByName(args.name, listOpts);
271
+ if (args.filePath !== undefined) {
272
+ const sub = args.filePath;
273
+ candidates = candidates.filter((n) => n.filePath.includes(sub));
274
+ }
275
+ // Match prior ORDER BY file_path LIMIT 25.
276
+ const sorted = [...candidates].sort((a, b) => a.filePath < b.filePath ? -1 : a.filePath > b.filePath ? 1 : 0);
277
+ const sliced = sorted.slice(0, 25);
278
+ if (sliced.length === 0)
279
+ return { kind: "not_found" };
280
+ if (sliced.length > 1) {
281
+ return {
282
+ kind: "ambiguous",
283
+ candidates: sliced.map(nodeToRow),
284
+ };
285
+ }
286
+ const node = sliced[0];
287
+ if (!node)
288
+ return { kind: "not_found" };
289
+ return {
290
+ kind: "resolved",
291
+ target: nodeToRow(node),
292
+ startLine: toLineOrNull(getProp(node, "startLine")),
293
+ endLine: toLineOrNull(getProp(node, "endLine")),
294
+ content: stringOrNull(getProp(node, "content")),
295
+ };
296
+ }
297
+ function nodeToRow(n) {
298
+ return {
299
+ id: n.id,
300
+ name: n.name,
301
+ kind: n.kind,
302
+ filePath: n.filePath,
303
+ };
304
+ }
305
+ function getProp(n, key) {
306
+ return n[key];
307
+ }
308
+ function toLineOrNull(raw) {
309
+ if (raw === null || raw === undefined)
310
+ return null;
311
+ const n = Number(raw);
312
+ if (!Number.isFinite(n) || n <= 0)
313
+ return null;
314
+ return Math.trunc(n);
315
+ }
316
+ function stringOrNull(raw) {
317
+ if (typeof raw !== "string" || raw.length === 0)
318
+ return null;
319
+ return raw;
320
+ }
321
+ function capContent(raw) {
322
+ if (raw === null)
323
+ return undefined;
324
+ if (raw.length <= CONTENT_CHAR_CAP)
325
+ return raw;
326
+ return `${raw.slice(0, CONTENT_CHAR_CAP - 1)}…`;
327
+ }
328
+ /**
329
+ * Fetch every edge connected to the target in a single round-trip,
330
+ * projecting both the relation type and the partner node's metadata. The
331
+ * `direction` selects whether the target sits on the `to_id` (incoming)
332
+ * or `from_id` (outgoing) side of the join.
333
+ */
334
+ async function fetchCategorizedEdges(graph, targetId, direction) {
335
+ const filter = direction === "incoming" ? { toIds: [targetId] } : { fromIds: [targetId] };
336
+ const edges = await graph.listEdges({
337
+ types: CATEGORY_EDGE_TYPES,
338
+ ...filter,
339
+ limit: 200,
340
+ });
341
+ if (edges.length === 0)
342
+ return [];
343
+ const partnerIds = Array.from(new Set(edges.map((e) => (direction === "incoming" ? e.from : e.to))));
344
+ const partners = await graph.listNodes({ ids: partnerIds });
345
+ const byId = new Map();
346
+ for (const n of partners)
347
+ byId.set(n.id, n);
348
+ const out = [];
349
+ for (const e of edges) {
350
+ const partnerId = direction === "incoming" ? e.from : e.to;
351
+ const partner = byId.get(partnerId);
352
+ if (!partner)
353
+ continue;
354
+ out.push({
355
+ relType: e.type,
356
+ id: partner.id,
357
+ name: partner.name,
358
+ kind: partner.kind,
359
+ filePath: partner.filePath,
360
+ });
361
+ }
362
+ return out;
363
+ }
364
+ function bucketize(rows) {
365
+ const buckets = makeBuckets();
366
+ for (const r of rows) {
367
+ const key = r.relType.toLowerCase();
368
+ const node = { id: r.id, name: r.name, kind: r.kind, filePath: r.filePath };
369
+ const bucket = buckets[key];
370
+ if (Array.isArray(bucket))
371
+ bucket.push(node);
372
+ }
373
+ return buckets;
374
+ }
375
+ function appendCategorySection(lines, header, buckets) {
376
+ const entries = [
377
+ ["calls", buckets.calls],
378
+ ["imports", buckets.imports],
379
+ ["accesses", buckets.accesses],
380
+ ["has_method", buckets.has_method],
381
+ ["has_property", buckets.has_property],
382
+ ["extends", buckets.extends],
383
+ ["implements", buckets.implements],
384
+ ["method_overrides", buckets.method_overrides],
385
+ ["method_implements", buckets.method_implements],
386
+ ];
387
+ const total = entries.reduce((acc, [, list]) => acc + list.length, 0);
388
+ lines.push(`${header} (${total}):`);
389
+ const arrow = header === "Incoming" ? "←" : "→";
390
+ for (const [label, list] of entries) {
391
+ if (list.length === 0)
392
+ continue;
393
+ lines.push(` ${label} (${list.length}):`);
394
+ for (const n of list) {
395
+ lines.push(` ${arrow} ${n.name} [${n.kind}] — ${n.filePath}`);
396
+ }
397
+ }
398
+ }
399
+ /**
400
+ * Find Process-kind partners reachable from the target via `PROCESS_STEP`
401
+ * edges. The processes phase emits symbol-to-symbol step edges under a
402
+ * Process node, so we accept either direction on the join and filter on
403
+ * `kind = 'Process'`.
404
+ */
405
+ async function fetchProcessParticipation(graph, targetId) {
406
+ const [outEdges, inEdges] = await Promise.all([
407
+ graph.listEdgesByType("PROCESS_STEP", { fromIds: [targetId] }),
408
+ graph.listEdgesByType("PROCESS_STEP", { toIds: [targetId] }),
409
+ ]);
410
+ const partnerIds = new Set();
411
+ for (const e of [...outEdges, ...inEdges]) {
412
+ const id = e.from === targetId ? e.to : e.from;
413
+ partnerIds.add(id);
414
+ }
415
+ if (partnerIds.size === 0)
416
+ return [];
417
+ const partners = await graph.listNodes({ ids: [...partnerIds] });
418
+ const partnerById = new Map();
419
+ for (const p of partners)
420
+ partnerById.set(p.id, p);
421
+ const dedup = new Map();
422
+ for (const e of [...outEdges, ...inEdges]) {
423
+ const partnerId = e.from === targetId ? e.to : e.from;
424
+ const partner = partnerById.get(partnerId);
425
+ if (!partner || partner.kind !== "Process")
426
+ continue;
427
+ if (dedup.has(partner.id))
428
+ continue;
429
+ const inferredLabel = partner.inferredLabel;
430
+ const label = typeof inferredLabel === "string" && inferredLabel.length > 0 ? inferredLabel : partner.name;
431
+ dedup.set(partner.id, { label, step: toLineOrNull(e.step) });
432
+ }
433
+ const items = Array.from(dedup.entries()).map(([id, v]) => ({
434
+ id,
435
+ label: v.label,
436
+ step: v.step,
437
+ }));
438
+ items.sort((a, b) => {
439
+ const as = a.step ?? Number.POSITIVE_INFINITY;
440
+ const bs = b.step ?? Number.POSITIVE_INFINITY;
441
+ if (as !== bs)
442
+ return as - bs;
443
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
444
+ });
445
+ return items.slice(0, 20);
446
+ }
447
+ /**
448
+ * Fetch the target's enclosing owner (class/module/file). Mirrors the
449
+ * previous tool's behaviour: any of HAS_METHOD / HAS_PROPERTY / CONTAINS
450
+ * pointing at the target counts as an owner edge.
451
+ */
452
+ async function fetchOwner(graph, targetId) {
453
+ const edges = await graph.listEdges({
454
+ types: ["HAS_METHOD", "HAS_PROPERTY", "CONTAINS"],
455
+ toIds: [targetId],
456
+ limit: 5,
457
+ });
458
+ if (edges.length === 0)
459
+ return [];
460
+ const fromIds = Array.from(new Set(edges.map((e) => e.from)));
461
+ const partners = await graph.listNodes({ ids: fromIds });
462
+ const byId = new Map();
463
+ for (const n of partners)
464
+ byId.set(n.id, n);
465
+ const out = [];
466
+ const seen = new Set();
467
+ for (const e of edges) {
468
+ if (seen.has(e.from))
469
+ continue;
470
+ seen.add(e.from);
471
+ const node = byId.get(e.from);
472
+ if (!node)
473
+ continue;
474
+ out.push(nodeToRow(node));
475
+ }
476
+ return out;
477
+ }
478
+ /**
479
+ * Fetch up to 10 strongest cochange partners for the target's enclosing
480
+ * file from the dedicated `cochanges` table. For File-kind targets we use
481
+ * the node's own `file_path`; for any other kind we use `target.filePath`
482
+ * so the caller always gets file-level cochange even when they asked about
483
+ * a symbol inside the file.
484
+ *
485
+ * Ranked by `lift` DESC; rows below the default lift floor (1.0 — i.e.
486
+ * weaker than chance) are dropped. This is a statistical (git-history)
487
+ * signal, not a call-graph dependency.
488
+ */
489
+ async function fetchCochangePartners(store, target) {
490
+ const file = target.filePath;
491
+ if (file.length === 0)
492
+ return [];
493
+ const rows = await store.temporal.lookupCochangesForFile(file, { limit: 10 });
494
+ const out = [];
495
+ for (const r of rows) {
496
+ const partner = r.sourceFile === file ? r.targetFile : r.sourceFile;
497
+ out.push({
498
+ file: partner,
499
+ cocommitCount: r.cocommitCount,
500
+ lift: r.lift,
501
+ lastCocommitAt: r.lastCocommitAt,
502
+ });
503
+ }
504
+ return out;
505
+ }
506
+ /**
507
+ * For `Route` targets, fetch all `Operation` nodes connected via
508
+ * `HANDLES_ROUTE` (Operation → Route direction — emitted by the OpenAPI
509
+ * phase). Returns an empty array for any non-Route target so the main
510
+ * handler can call unconditionally.
511
+ */
512
+ async function fetchLinkedOperations(graph, target) {
513
+ if (target.kind !== "Route")
514
+ return [];
515
+ const edges = await graph.listEdgesByType("HANDLES_ROUTE", { toIds: [target.id], limit: 20 });
516
+ if (edges.length === 0)
517
+ return [];
518
+ const fromIds = Array.from(new Set(edges.map((e) => e.from)));
519
+ const partners = await graph.listNodes({ ids: fromIds });
520
+ const byId = new Map();
521
+ for (const p of partners)
522
+ byId.set(p.id, p);
523
+ const out = [];
524
+ for (const e of edges) {
525
+ const partner = byId.get(e.from);
526
+ if (!partner || partner.kind !== "Operation")
527
+ continue;
528
+ const opAny = partner;
529
+ const httpMethod = typeof opAny["httpMethod"] === "string" ? opAny["httpMethod"] : "";
530
+ const httpPath = typeof opAny["httpPath"] === "string" ? opAny["httpPath"] : "";
531
+ const summary = typeof opAny["summary"] === "string" ? opAny["summary"] : undefined;
532
+ const operationId = typeof opAny["operationId"] === "string" ? opAny["operationId"] : undefined;
533
+ out.push({
534
+ id: partner.id,
535
+ method: httpMethod,
536
+ path: httpPath,
537
+ filePath: partner.filePath,
538
+ ...(typeof summary === "string" && summary.length > 0 ? { summary } : {}),
539
+ ...(typeof operationId === "string" && operationId.length > 0 ? { operationId } : {}),
540
+ });
541
+ }
542
+ out.sort((a, b) => {
543
+ if (a.method !== b.method)
544
+ return a.method < b.method ? -1 : 1;
545
+ return a.path < b.path ? -1 : a.path > b.path ? 1 : 0;
546
+ });
547
+ return out;
548
+ }
549
+ /**
550
+ * Fetch `confidence` + `reason` for every incoming and outgoing edge that
551
+ * the `context` response surfaces. The filter list mirrors the relation
552
+ * types queried above. Cochange rows live in their own table with different
553
+ * semantics (lift, not confidence) and never enter the confidence-breakdown
554
+ * tally.
555
+ */
556
+ async function fetchConfidenceBreakdownEdges(graph, targetId) {
557
+ const [fromEdges, toEdges] = await Promise.all([
558
+ graph.listEdges({ types: CONFIDENCE_EDGE_TYPES, fromIds: [targetId] }),
559
+ graph.listEdges({ types: CONFIDENCE_EDGE_TYPES, toIds: [targetId] }),
560
+ ]);
561
+ const out = [];
562
+ const seen = new Set();
563
+ for (const e of [...fromEdges, ...toEdges]) {
564
+ const key = `${e.from}|${e.to}|${e.type}|${e.step ?? 0}`;
565
+ if (seen.has(key))
566
+ continue;
567
+ seen.add(key);
568
+ const confidenceRaw = Number(e.confidence ?? 0);
569
+ const reasonRaw = e.reason;
570
+ out.push({
571
+ confidence: Number.isFinite(confidenceRaw) ? confidenceRaw : 0,
572
+ ...(typeof reasonRaw === "string" && reasonRaw.length > 0 ? { reason: reasonRaw } : {}),
573
+ });
574
+ }
575
+ return out;
576
+ }
577
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * `dependencies` — enumerate Dependency nodes for an indexed repo.
3
+ *
4
+ * A Dependency node is produced by the `dependencies` pipeline phase
5
+ * from per-ecosystem manifest parsers. Every node carries
6
+ * `ecosystem`, `name`, `version`, and a `lockfileSource` relpath.
7
+ *
8
+ * Filters:
9
+ * - `ecosystem` — restrict to one ecosystem (npm, pypi, go, cargo,
10
+ * maven, nuget). Server does no validation beyond
11
+ * string compare — an unknown value returns an
12
+ * empty list.
13
+ * - `filePath` — substring match against `file_path` (alias of the
14
+ * lockfile source). Useful when a repo has multiple
15
+ * workspaces with their own manifests.
16
+ */
17
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
18
+ import { type ToolContext, type ToolResult } from "./shared.js";
19
+ interface DependenciesArgs {
20
+ readonly repo?: string | undefined;
21
+ readonly repo_uri?: string | undefined;
22
+ readonly filePath?: string | undefined;
23
+ readonly ecosystem?: "npm" | "pypi" | "go" | "cargo" | "maven" | "nuget" | undefined;
24
+ readonly limit?: number | undefined;
25
+ }
26
+ export declare function runDependencies(ctx: ToolContext, args: DependenciesArgs): Promise<ToolResult>;
27
+ export declare function registerDependenciesTool(server: McpServer, ctx: ToolContext): void;
28
+ export {};
29
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/dependencies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKzE,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,UAAU,EAGhB,MAAM,aAAa,CAAC;AAkCrB,UAAU,gBAAgB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAsB,eAAe,CACnC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA+DrB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAiBlF"}