@mka-rainmaker/ama 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.
- package/LICENSE +21 -0
- package/README.md +149 -0
- package/dist/analyzers/baseline/analyzer.d.ts +47 -0
- package/dist/analyzers/baseline/analyzer.d.ts.map +1 -0
- package/dist/analyzers/baseline/analyzer.js +84 -0
- package/dist/analyzers/baseline/analyzer.js.map +1 -0
- package/dist/analyzers/baseline/c.d.ts +12 -0
- package/dist/analyzers/baseline/c.d.ts.map +1 -0
- package/dist/analyzers/baseline/c.js +56 -0
- package/dist/analyzers/baseline/c.js.map +1 -0
- package/dist/analyzers/baseline/config.d.ts +21 -0
- package/dist/analyzers/baseline/config.d.ts.map +1 -0
- package/dist/analyzers/baseline/config.js +32 -0
- package/dist/analyzers/baseline/config.js.map +1 -0
- package/dist/analyzers/baseline/csharp.d.ts +9 -0
- package/dist/analyzers/baseline/csharp.d.ts.map +1 -0
- package/dist/analyzers/baseline/csharp.js +107 -0
- package/dist/analyzers/baseline/csharp.js.map +1 -0
- package/dist/analyzers/baseline/go.d.ts +11 -0
- package/dist/analyzers/baseline/go.d.ts.map +1 -0
- package/dist/analyzers/baseline/go.js +66 -0
- package/dist/analyzers/baseline/go.js.map +1 -0
- package/dist/analyzers/baseline/java.d.ts +9 -0
- package/dist/analyzers/baseline/java.d.ts.map +1 -0
- package/dist/analyzers/baseline/java.js +50 -0
- package/dist/analyzers/baseline/java.js.map +1 -0
- package/dist/analyzers/baseline/javascript.d.ts +10 -0
- package/dist/analyzers/baseline/javascript.d.ts.map +1 -0
- package/dist/analyzers/baseline/javascript.js +55 -0
- package/dist/analyzers/baseline/javascript.js.map +1 -0
- package/dist/analyzers/baseline/kotlin.d.ts +11 -0
- package/dist/analyzers/baseline/kotlin.d.ts.map +1 -0
- package/dist/analyzers/baseline/kotlin.js +67 -0
- package/dist/analyzers/baseline/kotlin.js.map +1 -0
- package/dist/analyzers/baseline/paths.d.ts +6 -0
- package/dist/analyzers/baseline/paths.d.ts.map +1 -0
- package/dist/analyzers/baseline/paths.js +17 -0
- package/dist/analyzers/baseline/paths.js.map +1 -0
- package/dist/analyzers/baseline/php.d.ts +11 -0
- package/dist/analyzers/baseline/php.d.ts.map +1 -0
- package/dist/analyzers/baseline/php.js +76 -0
- package/dist/analyzers/baseline/php.js.map +1 -0
- package/dist/analyzers/baseline/python.d.ts +10 -0
- package/dist/analyzers/baseline/python.d.ts.map +1 -0
- package/dist/analyzers/baseline/python.js +63 -0
- package/dist/analyzers/baseline/python.js.map +1 -0
- package/dist/analyzers/baseline/rust.d.ts +10 -0
- package/dist/analyzers/baseline/rust.d.ts.map +1 -0
- package/dist/analyzers/baseline/rust.js +45 -0
- package/dist/analyzers/baseline/rust.js.map +1 -0
- package/dist/analyzers/baseline/swift.d.ts +11 -0
- package/dist/analyzers/baseline/swift.d.ts.map +1 -0
- package/dist/analyzers/baseline/swift.js +19 -0
- package/dist/analyzers/baseline/swift.js.map +1 -0
- package/dist/analyzers/baseline/treesitter.d.ts +11 -0
- package/dist/analyzers/baseline/treesitter.d.ts.map +1 -0
- package/dist/analyzers/baseline/treesitter.js +87 -0
- package/dist/analyzers/baseline/treesitter.js.map +1 -0
- package/dist/analyzers/baseline/walk.d.ts +26 -0
- package/dist/analyzers/baseline/walk.d.ts.map +1 -0
- package/dist/analyzers/baseline/walk.js +76 -0
- package/dist/analyzers/baseline/walk.js.map +1 -0
- package/dist/analyzers/registry.d.ts +19 -0
- package/dist/analyzers/registry.d.ts.map +1 -0
- package/dist/analyzers/registry.js +43 -0
- package/dist/analyzers/registry.js.map +1 -0
- package/dist/analyzers/sfc/analyzer.d.ts +17 -0
- package/dist/analyzers/sfc/analyzer.d.ts.map +1 -0
- package/dist/analyzers/sfc/analyzer.js +141 -0
- package/dist/analyzers/sfc/analyzer.js.map +1 -0
- package/dist/analyzers/sidecar/analyzer.d.ts +29 -0
- package/dist/analyzers/sidecar/analyzer.d.ts.map +1 -0
- package/dist/analyzers/sidecar/analyzer.js +114 -0
- package/dist/analyzers/sidecar/analyzer.js.map +1 -0
- package/dist/analyzers/sidecar/protocol.d.ts +508 -0
- package/dist/analyzers/sidecar/protocol.d.ts.map +1 -0
- package/dist/analyzers/sidecar/protocol.js +102 -0
- package/dist/analyzers/sidecar/protocol.js.map +1 -0
- package/dist/analyzers/types.d.ts +46 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +2 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/analyzers/typescript/analyzer.d.ts +126 -0
- package/dist/analyzers/typescript/analyzer.d.ts.map +1 -0
- package/dist/analyzers/typescript/analyzer.js +1600 -0
- package/dist/analyzers/typescript/analyzer.js.map +1 -0
- package/dist/cli/commands/cycles.d.ts +6 -0
- package/dist/cli/commands/cycles.d.ts.map +1 -0
- package/dist/cli/commands/cycles.js +27 -0
- package/dist/cli/commands/cycles.js.map +1 -0
- package/dist/cli/commands/files.d.ts +6 -0
- package/dist/cli/commands/files.d.ts.map +1 -0
- package/dist/cli/commands/files.js +33 -0
- package/dist/cli/commands/files.js.map +1 -0
- package/dist/cli/commands/impact.d.ts +18 -0
- package/dist/cli/commands/impact.d.ts.map +1 -0
- package/dist/cli/commands/impact.js +113 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/lifecycle.d.ts +5 -0
- package/dist/cli/commands/lifecycle.d.ts.map +1 -0
- package/dist/cli/commands/lifecycle.js +83 -0
- package/dist/cli/commands/lifecycle.js.map +1 -0
- package/dist/cli/commands/query.d.ts +31 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +187 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/search.d.ts +21 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +160 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/status.d.ts +6 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +63 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +6 -0
- package/dist/cli/commands/sync.d.ts.map +1 -0
- package/dist/cli/commands/sync.js +57 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/emit.d.ts +9 -0
- package/dist/cli/emit.d.ts.map +1 -0
- package/dist/cli/emit.js +10 -0
- package/dist/cli/emit.js.map +1 -0
- package/dist/cli/index.d.ts +37 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +128 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/paths.d.ts +7 -0
- package/dist/cli/paths.d.ts.map +1 -0
- package/dist/cli/paths.js +10 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/query-runner.d.ts +13 -0
- package/dist/cli/query-runner.d.ts.map +1 -0
- package/dist/cli/query-runner.js +33 -0
- package/dist/cli/query-runner.js.map +1 -0
- package/dist/graph/dispatch.d.ts +17 -0
- package/dist/graph/dispatch.d.ts.map +1 -0
- package/dist/graph/dispatch.js +82 -0
- package/dist/graph/dispatch.js.map +1 -0
- package/dist/graph/id.d.ts +19 -0
- package/dist/graph/id.d.ts.map +1 -0
- package/dist/graph/id.js +17 -0
- package/dist/graph/id.js.map +1 -0
- package/dist/graph/index.d.ts +6 -0
- package/dist/graph/index.d.ts.map +1 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/graph/types.d.ts +71 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +52 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/indexer/debouncer.d.ts +32 -0
- package/dist/indexer/debouncer.d.ts.map +1 -0
- package/dist/indexer/debouncer.js +81 -0
- package/dist/indexer/debouncer.js.map +1 -0
- package/dist/indexer/ignore.d.ts +55 -0
- package/dist/indexer/ignore.d.ts.map +1 -0
- package/dist/indexer/ignore.js +170 -0
- package/dist/indexer/ignore.js.map +1 -0
- package/dist/indexer/indexer.d.ts +112 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +392 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/watcher.d.ts +50 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +86 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/mcp/build-info.d.ts +16 -0
- package/dist/mcp/build-info.d.ts.map +1 -0
- package/dist/mcp/build-info.js +54 -0
- package/dist/mcp/build-info.js.map +1 -0
- package/dist/mcp/http.d.ts +18 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +145 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/server.d.ts +22 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +401 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +155 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +319 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/query/service.d.ts +329 -0
- package/dist/query/service.d.ts.map +1 -0
- package/dist/query/service.js +959 -0
- package/dist/query/service.js.map +1 -0
- package/dist/runtime/entrypoint.d.ts +11 -0
- package/dist/runtime/entrypoint.d.ts.map +1 -0
- package/dist/runtime/entrypoint.js +22 -0
- package/dist/runtime/entrypoint.js.map +1 -0
- package/dist/runtime/quiet-sqlite-warning.d.ts +14 -0
- package/dist/runtime/quiet-sqlite-warning.d.ts.map +1 -0
- package/dist/runtime/quiet-sqlite-warning.js +26 -0
- package/dist/runtime/quiet-sqlite-warning.js.map +1 -0
- package/dist/runtime/wasm-tier.d.ts +2 -0
- package/dist/runtime/wasm-tier.d.ts.map +1 -0
- package/dist/runtime/wasm-tier.js +54 -0
- package/dist/runtime/wasm-tier.js.map +1 -0
- package/dist/store/memory.d.ts +54 -0
- package/dist/store/memory.d.ts.map +1 -0
- package/dist/store/memory.js +210 -0
- package/dist/store/memory.js.map +1 -0
- package/dist/store/sqlite.d.ts +38 -0
- package/dist/store/sqlite.d.ts.map +1 -0
- package/dist/store/sqlite.js +298 -0
- package/dist/store/sqlite.js.map +1 -0
- package/dist/store/types.d.ts +76 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +2 -0
- package/dist/store/types.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as http from "node:http";
|
|
2
|
+
import { AmaSession } from "./session.js";
|
|
3
|
+
/**
|
|
4
|
+
* A standalone Node HTTP server that serves Ama's MCP tools over the Streamable
|
|
5
|
+
* HTTP transport — the same tools as the stdio server, reachable by URL.
|
|
6
|
+
*
|
|
7
|
+
* One {@link AmaSession} (the index) is shared across every client session, so
|
|
8
|
+
* it outlives a client disconnect/reconnect within this process. That decouples
|
|
9
|
+
* the index's lifetime from the client connection: a `tsx watch` restart of the
|
|
10
|
+
* *process* is the only thing that drops it, and connect-time catch-up (plus a
|
|
11
|
+
* future persistent store) makes that cheap. Each MCP session gets its own
|
|
12
|
+
* transport + {@link createMcpServer} wrapper over the shared session.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createHttpServer(session?: AmaSession): http.Server;
|
|
15
|
+
/** Entry point: serve MCP over Streamable HTTP. Logs to stderr (stdout is free
|
|
16
|
+
* here, unlike stdio, but stderr keeps logging uniform across transports). */
|
|
17
|
+
export declare function main(): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAWlC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,UAA6B,GAAG,IAAI,CAAC,MAAM,CAsDpF;AA8BD;8EAC8E;AAC9E,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAgC1C"}
|
package/dist/mcp/http.js
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as http from "node:http";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
6
|
+
import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
+
import { createDefaultIndexer } from "../indexer/indexer.js";
|
|
8
|
+
import { isEntrypoint } from "../runtime/entrypoint.js";
|
|
9
|
+
import { ensureBaselineWasmTier } from "../runtime/wasm-tier.js";
|
|
10
|
+
import { InMemoryStore } from "../store/memory.js";
|
|
11
|
+
import { SqliteStore } from "../store/sqlite.js";
|
|
12
|
+
import { createServer as createMcpServer } from "./server.js";
|
|
13
|
+
import { AmaSession } from "./session.js";
|
|
14
|
+
const MCP_PATH = "/mcp";
|
|
15
|
+
/**
|
|
16
|
+
* A standalone Node HTTP server that serves Ama's MCP tools over the Streamable
|
|
17
|
+
* HTTP transport — the same tools as the stdio server, reachable by URL.
|
|
18
|
+
*
|
|
19
|
+
* One {@link AmaSession} (the index) is shared across every client session, so
|
|
20
|
+
* it outlives a client disconnect/reconnect within this process. That decouples
|
|
21
|
+
* the index's lifetime from the client connection: a `tsx watch` restart of the
|
|
22
|
+
* *process* is the only thing that drops it, and connect-time catch-up (plus a
|
|
23
|
+
* future persistent store) makes that cheap. Each MCP session gets its own
|
|
24
|
+
* transport + {@link createMcpServer} wrapper over the shared session.
|
|
25
|
+
*/
|
|
26
|
+
export function createHttpServer(session = new AmaSession()) {
|
|
27
|
+
const transports = new Map();
|
|
28
|
+
return http.createServer((req, res) => void handle(req, res));
|
|
29
|
+
async function handle(req, res) {
|
|
30
|
+
try {
|
|
31
|
+
const { pathname } = new URL(req.url ?? "/", "http://localhost");
|
|
32
|
+
if (pathname !== MCP_PATH) {
|
|
33
|
+
res.writeHead(404).end();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const header = req.headers["mcp-session-id"];
|
|
37
|
+
const sessionId = Array.isArray(header) ? header[0] : header;
|
|
38
|
+
if (req.method === "POST") {
|
|
39
|
+
const body = await readJson(req);
|
|
40
|
+
let transport = sessionId ? transports.get(sessionId) : undefined;
|
|
41
|
+
if (!transport) {
|
|
42
|
+
if (!isInitializeRequest(body)) {
|
|
43
|
+
// The session id is unknown (e.g. wiped by a `tsx watch` restart).
|
|
44
|
+
// Per the Streamable HTTP spec a 404 tells the client to drop the
|
|
45
|
+
// dead session and re-initialize — the hook for auto-reconnect.
|
|
46
|
+
res.writeHead(404, { "content-type": "application/json" }).end(JSON.stringify({
|
|
47
|
+
jsonrpc: "2.0",
|
|
48
|
+
error: { code: -32001, message: "Session not found — reinitialize." },
|
|
49
|
+
id: null,
|
|
50
|
+
}));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
transport = newSession(session, transports);
|
|
54
|
+
}
|
|
55
|
+
await transport.handleRequest(req, res, body);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// GET (server SSE stream) and DELETE (session teardown) need an existing session.
|
|
59
|
+
if (req.method === "GET" || req.method === "DELETE") {
|
|
60
|
+
const transport = sessionId ? transports.get(sessionId) : undefined;
|
|
61
|
+
if (!transport) {
|
|
62
|
+
// 404 (not 400) so a client whose session was wiped re-initializes.
|
|
63
|
+
res.writeHead(404).end();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await transport.handleRequest(req, res);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
res.writeHead(405).end();
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
console.error("[ama] HTTP request failed:", err);
|
|
73
|
+
if (!res.headersSent)
|
|
74
|
+
res.writeHead(500).end();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Spin up a transport + MCP server for a new client session over `session`. */
|
|
79
|
+
function newSession(session, transports) {
|
|
80
|
+
// Annotated so the callbacks can reference `transport` within its own
|
|
81
|
+
// initializer; block bodies so they return void, not the Map.
|
|
82
|
+
const transport = new StreamableHTTPServerTransport({
|
|
83
|
+
sessionIdGenerator: () => randomUUID(),
|
|
84
|
+
enableJsonResponse: true,
|
|
85
|
+
onsessioninitialized: (id) => {
|
|
86
|
+
transports.set(id, transport);
|
|
87
|
+
},
|
|
88
|
+
onsessionclosed: (id) => {
|
|
89
|
+
transports.delete(id);
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
void createMcpServer(session).connect(transport);
|
|
93
|
+
return transport;
|
|
94
|
+
}
|
|
95
|
+
async function readJson(req) {
|
|
96
|
+
const chunks = [];
|
|
97
|
+
for await (const chunk of req)
|
|
98
|
+
chunks.push(chunk);
|
|
99
|
+
const raw = Buffer.concat(chunks).toString("utf8");
|
|
100
|
+
return raw ? JSON.parse(raw) : undefined;
|
|
101
|
+
}
|
|
102
|
+
/** Entry point: serve MCP over Streamable HTTP. Logs to stderr (stdout is free
|
|
103
|
+
* here, unlike stdio, but stderr keeps logging uniform across transports). */
|
|
104
|
+
export async function main() {
|
|
105
|
+
const port = Number(process.env.AMA_HTTP_PORT ?? 7077);
|
|
106
|
+
// With AMA_DB set, persist to (and reopen from) a file-backed store; with
|
|
107
|
+
// AMA_ROOT too, reopen that project's index at startup so a restart skips the
|
|
108
|
+
// full re-index and connect-time catch-up reconciles any drift.
|
|
109
|
+
const dbPath = process.env.AMA_DB;
|
|
110
|
+
const root = process.env.AMA_ROOT;
|
|
111
|
+
// Persist exactly one project to AMA_DB — the configured AMA_ROOT, or the first one
|
|
112
|
+
// indexed — and give every *other* project its own in-memory store, so a multi-project
|
|
113
|
+
// session never aliases several projects onto one shared db. (ama-mnj)
|
|
114
|
+
let createStore;
|
|
115
|
+
if (dbPath) {
|
|
116
|
+
fs.mkdirSync(path.dirname(path.resolve(dbPath)), { recursive: true });
|
|
117
|
+
const db = dbPath;
|
|
118
|
+
let persisted = root ? path.resolve(root) : undefined;
|
|
119
|
+
createStore = (projectRoot) => {
|
|
120
|
+
persisted ??= projectRoot; // the first project indexed claims the persistent db
|
|
121
|
+
return projectRoot === persisted ? new SqliteStore(db) : new InMemoryStore();
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
const session = createStore
|
|
125
|
+
? new AmaSession(createDefaultIndexer(createStore))
|
|
126
|
+
: new AmaSession();
|
|
127
|
+
if (dbPath && root) {
|
|
128
|
+
const stats = await session.open(root);
|
|
129
|
+
console.error(`ama: index ready — ${stats.nodeCount} nodes / ${stats.fileCount} files (${root})`);
|
|
130
|
+
}
|
|
131
|
+
const server = createHttpServer(session);
|
|
132
|
+
await new Promise((resolve) => server.listen(port, resolve));
|
|
133
|
+
console.error(`ama MCP server (HTTP) on http://localhost:${port}${MCP_PATH}`);
|
|
134
|
+
}
|
|
135
|
+
if (isEntrypoint(import.meta.url)) {
|
|
136
|
+
// Pin grammar WASM to the baseline compiler before anything loads it, or the
|
|
137
|
+
// long-running index OOMs (ama-rgx). Re-execs once; the supervisor skips main.
|
|
138
|
+
if (!ensureBaselineWasmTier()) {
|
|
139
|
+
main().catch((error) => {
|
|
140
|
+
console.error(error);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { AmaSession } from "./session.js";
|
|
3
|
+
/** Slice search results to `limit` and, when the search returned more than that
|
|
4
|
+
* (the handler requests `limit + 1`), append an advisory so a capped list isn't
|
|
5
|
+
* mistaken for the whole answer — search_symbol/search_code otherwise truncate
|
|
6
|
+
* silently. Composes with an existing hint (e.g. low-confidence). (ama-b4q) */
|
|
7
|
+
export declare function capped<T>(results: T[], limit: number, baseHint?: string): {
|
|
8
|
+
shown: T[];
|
|
9
|
+
hint?: string;
|
|
10
|
+
};
|
|
11
|
+
/** A one-glance summary of a tool result — list length, index counts, etc.
|
|
12
|
+
* Exported for unit testing of its banner/hint handling. */
|
|
13
|
+
export declare function resultHint(result: unknown): string;
|
|
14
|
+
/**
|
|
15
|
+
* Build the MCP server exposing Ama's tools over one {@link AmaSession}. Pure
|
|
16
|
+
* construction — no transport — so it can be driven by an in-memory client in
|
|
17
|
+
* tests or by stdio in production.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createServer(session?: AmaSession): McpServer;
|
|
20
|
+
/** Entry point: serve over stdio. stdout carries JSON-RPC only — log to stderr. */
|
|
21
|
+
export declare function main(): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAyB1C;;;gFAGgF;AAChF,wBAAgB,MAAM,CAAC,CAAC,EACtB,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ/B;AAkCD;6DAC6D;AAC7D,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAmClD;AAoBD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,UAA6B,GAAG,SAAS,CAyiB9E;AAED,mFAAmF;AACnF,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAI1C"}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { NODE_KINDS } from "../graph/index.js";
|
|
5
|
+
import { DEFAULT_SEARCH_LIMIT } from "../query/service.js";
|
|
6
|
+
import { isEntrypoint } from "../runtime/entrypoint.js";
|
|
7
|
+
import { ensureBaselineWasmTier } from "../runtime/wasm-tier.js";
|
|
8
|
+
import { serverStamp } from "./build-info.js";
|
|
9
|
+
import { AmaSession } from "./session.js";
|
|
10
|
+
/** JSON tool result helper. `value ?? null` so an `undefined` result (e.g. a
|
|
11
|
+
* snippet/node for an unresolved symbol) serializes to `"null"` rather than the
|
|
12
|
+
* JS value `undefined`, which would make the MCP content invalid. */
|
|
13
|
+
function json(value) {
|
|
14
|
+
return { content: [{ type: "text", text: JSON.stringify(value ?? null, null, 2) }] };
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A query result, with a staleness warning prepended when the auto-syncer has
|
|
18
|
+
* edits still in its debounce window — so a caller sees the caveat before the
|
|
19
|
+
* (possibly stale) data. No banner ⇒ identical to {@link json}.
|
|
20
|
+
*/
|
|
21
|
+
function reply(session, value, hint) {
|
|
22
|
+
const banner = session.stalenessBanner();
|
|
23
|
+
const text = (t) => ({ type: "text", text: t });
|
|
24
|
+
const content = [text(JSON.stringify(value ?? null, null, 2))];
|
|
25
|
+
// Banner first (most urgent: results may be stale); hint last (advisory). The
|
|
26
|
+
// data block stays at a fixed position so a consumer reading the JSON is robust.
|
|
27
|
+
if (banner)
|
|
28
|
+
content.unshift(text(banner));
|
|
29
|
+
if (hint)
|
|
30
|
+
content.push(text(hint));
|
|
31
|
+
return { content };
|
|
32
|
+
}
|
|
33
|
+
/** Slice search results to `limit` and, when the search returned more than that
|
|
34
|
+
* (the handler requests `limit + 1`), append an advisory so a capped list isn't
|
|
35
|
+
* mistaken for the whole answer — search_symbol/search_code otherwise truncate
|
|
36
|
+
* silently. Composes with an existing hint (e.g. low-confidence). (ama-b4q) */
|
|
37
|
+
export function capped(results, limit, baseHint) {
|
|
38
|
+
const truncated = results.length > limit;
|
|
39
|
+
const shown = truncated ? results.slice(0, limit) : results;
|
|
40
|
+
const truncHint = truncated
|
|
41
|
+
? `⚠️ Ama: showing the first ${limit} matches — more exist. Refine with a more specific query or path:/kind:/lang:/name: filters, or raise \`limit\`.`
|
|
42
|
+
: undefined;
|
|
43
|
+
const hint = [baseHint, truncHint].filter(Boolean).join("\n") || undefined;
|
|
44
|
+
return { shown, hint };
|
|
45
|
+
}
|
|
46
|
+
/** Optional `projectPath` for the cross-project query tools: target another indexed
|
|
47
|
+
* project by its root (or a path inside it); omit for the primary. (ama-ont) */
|
|
48
|
+
const projectPathSchema = z
|
|
49
|
+
.string()
|
|
50
|
+
.optional()
|
|
51
|
+
.describe("Query another indexed project by its root path (or a path inside it); omit for the " +
|
|
52
|
+
"primary (last-indexed) project. index_status lists the indexed projects.");
|
|
53
|
+
/**
|
|
54
|
+
* Wrap a read handler so it first runs a connect-time catch-up (reconciling any
|
|
55
|
+
* edits made while disconnected) and then replies with a staleness banner if
|
|
56
|
+
* the auto-syncer is mid-window. Keeps that policy in one place across the
|
|
57
|
+
* query tools.
|
|
58
|
+
*/
|
|
59
|
+
function queryTool(session, run) {
|
|
60
|
+
return async (args) => {
|
|
61
|
+
await session.catchUpIfNeeded();
|
|
62
|
+
return reply(session, run(args));
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Compact `key=value` rendering of a tool's arguments for a log line. */
|
|
66
|
+
function argsHint(args) {
|
|
67
|
+
if (!args || typeof args !== "object")
|
|
68
|
+
return "";
|
|
69
|
+
const pairs = Object.entries(args)
|
|
70
|
+
.filter(([, v]) => v !== undefined)
|
|
71
|
+
.map(([k, v]) => `${k}=${String(v)}`);
|
|
72
|
+
return pairs.length ? ` ${pairs.join(", ")}` : "";
|
|
73
|
+
}
|
|
74
|
+
/** A one-glance summary of a tool result — list length, index counts, etc.
|
|
75
|
+
* Exported for unit testing of its banner/hint handling. */
|
|
76
|
+
export function resultHint(result) {
|
|
77
|
+
const content = result?.content;
|
|
78
|
+
if (!content?.length)
|
|
79
|
+
return "ok";
|
|
80
|
+
// reply() prepends a staleness banner and/or appends an advisory hint around
|
|
81
|
+
// the JSON data block. Locate the data by which block parses as JSON, and read
|
|
82
|
+
// staleness from a banner *before* it (dataIdx > 0) — not the block count,
|
|
83
|
+
// which a trailing low-confidence hint also inflates. (ama-zk6)
|
|
84
|
+
let data;
|
|
85
|
+
let dataIdx = -1;
|
|
86
|
+
for (let i = 0; i < content.length; i++) {
|
|
87
|
+
try {
|
|
88
|
+
data = JSON.parse(content[i]?.text ?? "");
|
|
89
|
+
dataIdx = i;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
catch { }
|
|
93
|
+
}
|
|
94
|
+
const stale = dataIdx > 0 ? "stale, " : "";
|
|
95
|
+
if (dataIdx === -1) {
|
|
96
|
+
return content[0]?.text?.slice(0, 60) || "none";
|
|
97
|
+
}
|
|
98
|
+
if (Array.isArray(data)) {
|
|
99
|
+
return `${stale}${data.length} result${data.length === 1 ? "" : "s"}`;
|
|
100
|
+
}
|
|
101
|
+
if (data && typeof data === "object") {
|
|
102
|
+
const o = data;
|
|
103
|
+
if ("nodeCount" in o)
|
|
104
|
+
return `${stale}${o.nodeCount} nodes, ${o.edgeCount} edges`;
|
|
105
|
+
if ("changed" in o) {
|
|
106
|
+
const changed = o.changed?.length ?? 0;
|
|
107
|
+
const removed = o.removed?.length ?? 0;
|
|
108
|
+
return `${stale}${changed} changed, ${removed} removed`;
|
|
109
|
+
}
|
|
110
|
+
if ("startLine" in o)
|
|
111
|
+
return `${stale}${o.file}:${o.startLine}-${o.endLine}`;
|
|
112
|
+
return `${stale}ok`;
|
|
113
|
+
}
|
|
114
|
+
return `${stale}none`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Wrap a tool handler so each invocation prints one stderr line when
|
|
118
|
+
* AMA_LOG_TOOLS is set — the tool name, its arguments, and a short summary of
|
|
119
|
+
* the reply — purely so the dev loop can see a tool was really called. Logging
|
|
120
|
+
* goes to stderr only, leaving the stdout JSON-RPC stream untouched; the
|
|
121
|
+
* `serve:dev` script turns it on. Reads the env per call so it can be toggled
|
|
122
|
+
* without rebuilding the wrapper.
|
|
123
|
+
*/
|
|
124
|
+
function tap(name, run) {
|
|
125
|
+
return async (args) => {
|
|
126
|
+
const result = await run(args);
|
|
127
|
+
if (process.env.AMA_LOG_TOOLS) {
|
|
128
|
+
console.error(`[ama] ${name}${argsHint(args)} → ${resultHint(result)}`);
|
|
129
|
+
}
|
|
130
|
+
return result;
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Build the MCP server exposing Ama's tools over one {@link AmaSession}. Pure
|
|
135
|
+
* construction — no transport — so it can be driven by an in-memory client in
|
|
136
|
+
* tests or by stdio in production.
|
|
137
|
+
*/
|
|
138
|
+
export function createServer(session = new AmaSession()) {
|
|
139
|
+
const server = new McpServer({ name: "ama", version: serverStamp.version });
|
|
140
|
+
// Fires on each connection's initialize handshake — i.e. on reconnect. Arm a
|
|
141
|
+
// catch-up so the first query reconciles edits made while disconnected.
|
|
142
|
+
server.server.oninitialized = () => session.markForCatchUp();
|
|
143
|
+
server.registerTool("index_repository", {
|
|
144
|
+
description: "Build the code graph for a directory or project. Run this first.",
|
|
145
|
+
inputSchema: {
|
|
146
|
+
path: z.string().describe("Directory to index (absolute or relative)."),
|
|
147
|
+
},
|
|
148
|
+
}, tap("index_repository", async ({ path }) => json(await session.indexRepository(path))));
|
|
149
|
+
server.registerTool("index_status", {
|
|
150
|
+
description: "Whether anything is indexed, with node/edge counts, per-language coverage + tier, " +
|
|
151
|
+
"and how many edits are pending auto-sync.",
|
|
152
|
+
inputSchema: {},
|
|
153
|
+
}, tap("index_status", async () => {
|
|
154
|
+
await session.catchUpIfNeeded();
|
|
155
|
+
return json(session.indexStatus());
|
|
156
|
+
}));
|
|
157
|
+
server.registerTool("sync_index", {
|
|
158
|
+
description: "Reconcile files that changed on disk since indexing (a manual catch-up). " +
|
|
159
|
+
"Returns the repo-relative paths re-indexed and removed.",
|
|
160
|
+
inputSchema: {},
|
|
161
|
+
}, tap("sync_index", async () => json(await session.sync())));
|
|
162
|
+
server.registerTool("search_symbol", {
|
|
163
|
+
description: "Find symbols by name (case-insensitive substring). The query also accepts " +
|
|
164
|
+
"inline filters to scope a search: path:<file-substring>, kind:<NodeKind>, " +
|
|
165
|
+
"lang:<typescript|python|…>, name:<substring> (quote values with spaces). " +
|
|
166
|
+
"E.g. `handler path:src/api kind:Function` or, filters-only, `path:src/store kind:Class`.",
|
|
167
|
+
inputSchema: {
|
|
168
|
+
query: z
|
|
169
|
+
.string()
|
|
170
|
+
.describe("Name or partial name, optionally with path:/kind:/lang:/name: filters."),
|
|
171
|
+
limit: z.number().int().positive().optional().describe("Max results."),
|
|
172
|
+
kind: z.enum(NODE_KINDS).optional().describe("Restrict to a single node kind."),
|
|
173
|
+
projectPath: projectPathSchema,
|
|
174
|
+
},
|
|
175
|
+
}, tap("search_symbol", async ({ query, limit, kind, projectPath, }) => {
|
|
176
|
+
await session.catchUpIfNeeded();
|
|
177
|
+
const max = limit ?? DEFAULT_SEARCH_LIMIT;
|
|
178
|
+
const { results, lowConfidence } = session.searchSymbolWithConfidence(query, { limit: max + 1, kind }, projectPath);
|
|
179
|
+
const lowHint = lowConfidence
|
|
180
|
+
? `⚠️ Ama: no exact or name-prefix match for "${query}" — these are loose substring hits, so they may not be what you meant. Double-check the name or refine the query.`
|
|
181
|
+
: undefined;
|
|
182
|
+
const { shown, hint } = capped(results, max, lowHint);
|
|
183
|
+
return reply(session, shown, hint);
|
|
184
|
+
}));
|
|
185
|
+
server.registerTool("find_callers", {
|
|
186
|
+
description: "Every place that calls a function or method — each result is " +
|
|
187
|
+
"{ symbol, at: { line, column } } so you see who calls it and where.",
|
|
188
|
+
inputSchema: {
|
|
189
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
190
|
+
projectPath: projectPathSchema,
|
|
191
|
+
},
|
|
192
|
+
}, tap("find_callers", queryTool(session, ({ symbol, projectPath }) => session.findCallers(symbol, projectPath))));
|
|
193
|
+
server.registerTool("find_callees", {
|
|
194
|
+
description: "What a function or method calls — each result is { symbol, at: { line, column } }, " +
|
|
195
|
+
"the callee and the call site.",
|
|
196
|
+
inputSchema: {
|
|
197
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
198
|
+
projectPath: projectPathSchema,
|
|
199
|
+
},
|
|
200
|
+
}, tap("find_callees", queryTool(session, ({ symbol, projectPath }) => session.findCallees(symbol, projectPath))));
|
|
201
|
+
server.registerTool("find_handlers", {
|
|
202
|
+
description: "The handler symbols a framework route maps to.",
|
|
203
|
+
inputSchema: {
|
|
204
|
+
route: z.string().describe('Route id or name, e.g. "GET /users".'),
|
|
205
|
+
projectPath: projectPathSchema,
|
|
206
|
+
},
|
|
207
|
+
}, tap("find_handlers", queryTool(session, ({ route, projectPath }) => session.findHandlers(route, projectPath))));
|
|
208
|
+
server.registerTool("find_routes", {
|
|
209
|
+
description: "Every framework route that maps to a symbol (handler).",
|
|
210
|
+
inputSchema: {
|
|
211
|
+
symbol: z.string().describe("Handler symbol id, simple name, or dotted qualified name."),
|
|
212
|
+
projectPath: projectPathSchema,
|
|
213
|
+
},
|
|
214
|
+
}, tap("find_routes", queryTool(session, ({ symbol, projectPath }) => session.findRoutes(symbol, projectPath))));
|
|
215
|
+
server.registerTool("find_overrides", {
|
|
216
|
+
description: "The supertype methods a method overrides or implements (method → the " +
|
|
217
|
+
"interface/base method of the same name).",
|
|
218
|
+
inputSchema: {
|
|
219
|
+
symbol: z.string().describe("Method id, simple name, or dotted qualified name."),
|
|
220
|
+
projectPath: projectPathSchema,
|
|
221
|
+
},
|
|
222
|
+
}, tap("find_overrides", queryTool(session, ({ symbol, projectPath }) => session.findOverrides(symbol, projectPath))));
|
|
223
|
+
server.registerTool("find_overridden_by", {
|
|
224
|
+
description: "The subtype methods that override a method — what breaks if you change this " +
|
|
225
|
+
"interface/base method.",
|
|
226
|
+
inputSchema: {
|
|
227
|
+
symbol: z.string().describe("Method id, simple name, or dotted qualified name."),
|
|
228
|
+
projectPath: projectPathSchema,
|
|
229
|
+
},
|
|
230
|
+
}, tap("find_overridden_by", queryTool(session, ({ symbol, projectPath }) => session.findOverriddenBy(symbol, projectPath))));
|
|
231
|
+
server.registerTool("find_referrers", {
|
|
232
|
+
description: "Everything that references a symbol via a References edge: who reads a module-level " +
|
|
233
|
+
"constant/variable, the routes that map to a handler, and other dispatch references. " +
|
|
234
|
+
"Use this for 'who uses X' when X isn't called (reads aren't calls, so find_callers " +
|
|
235
|
+
"won't see them).",
|
|
236
|
+
inputSchema: {
|
|
237
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
238
|
+
projectPath: projectPathSchema,
|
|
239
|
+
},
|
|
240
|
+
}, tap("find_referrers", queryTool(session, ({ symbol, projectPath }) => session.findReferrers(symbol, projectPath))));
|
|
241
|
+
server.registerTool("find_implementations", {
|
|
242
|
+
description: "Every class that implements an interface.",
|
|
243
|
+
inputSchema: {
|
|
244
|
+
symbol: z.string().describe("Interface id, simple name, or dotted qualified name."),
|
|
245
|
+
projectPath: projectPathSchema,
|
|
246
|
+
},
|
|
247
|
+
}, tap("find_implementations", queryTool(session, ({ symbol, projectPath }) => session.findImplementations(symbol, projectPath))));
|
|
248
|
+
server.registerTool("find_interfaces", {
|
|
249
|
+
description: "The interfaces a class implements.",
|
|
250
|
+
inputSchema: {
|
|
251
|
+
symbol: z.string().describe("Class id, simple name, or dotted qualified name."),
|
|
252
|
+
projectPath: projectPathSchema,
|
|
253
|
+
},
|
|
254
|
+
}, tap("find_interfaces", queryTool(session, ({ symbol, projectPath }) => session.findInterfaces(symbol, projectPath))));
|
|
255
|
+
server.registerTool("find_importers", {
|
|
256
|
+
description: "Every file that imports (or re-exports) a symbol.",
|
|
257
|
+
inputSchema: {
|
|
258
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
259
|
+
projectPath: projectPathSchema,
|
|
260
|
+
},
|
|
261
|
+
}, tap("find_importers", queryTool(session, ({ symbol, projectPath }) => session.findImporters(symbol, projectPath))));
|
|
262
|
+
server.registerTool("find_imports", {
|
|
263
|
+
description: "The symbols a file imports (or re-exports).",
|
|
264
|
+
inputSchema: {
|
|
265
|
+
file: z.string().describe("File node id (repo-relative path) or basename."),
|
|
266
|
+
projectPath: projectPathSchema,
|
|
267
|
+
},
|
|
268
|
+
}, tap("find_imports", queryTool(session, ({ file, projectPath }) => session.findImports(file, projectPath))));
|
|
269
|
+
server.registerTool("find_type_users", {
|
|
270
|
+
description: "Every symbol that uses a type in a parameter, return, or property.",
|
|
271
|
+
inputSchema: {
|
|
272
|
+
type: z.string().describe("Type id, simple name, or dotted qualified name."),
|
|
273
|
+
projectPath: projectPathSchema,
|
|
274
|
+
},
|
|
275
|
+
}, tap("find_type_users", queryTool(session, ({ type, projectPath }) => session.findTypeUsers(type, projectPath))));
|
|
276
|
+
server.registerTool("find_types_used", {
|
|
277
|
+
description: "The named types a symbol uses in its parameters, return, or properties.",
|
|
278
|
+
inputSchema: {
|
|
279
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
280
|
+
projectPath: projectPathSchema,
|
|
281
|
+
},
|
|
282
|
+
}, tap("find_types_used", queryTool(session, ({ symbol, projectPath }) => session.findTypesUsed(symbol, projectPath))));
|
|
283
|
+
server.registerTool("find_returns", {
|
|
284
|
+
description: "The named type(s) a function or method returns — the return half of find_types_used.",
|
|
285
|
+
inputSchema: {
|
|
286
|
+
symbol: z.string().describe("Function/method id, simple name, or dotted qualified name."),
|
|
287
|
+
projectPath: projectPathSchema,
|
|
288
|
+
},
|
|
289
|
+
}, tap("find_returns", queryTool(session, ({ symbol, projectPath }) => session.findReturns(symbol, projectPath))));
|
|
290
|
+
server.registerTool("get_code_snippet", {
|
|
291
|
+
description: "A symbol's verbatim source.",
|
|
292
|
+
inputSchema: {
|
|
293
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
294
|
+
projectPath: projectPathSchema,
|
|
295
|
+
},
|
|
296
|
+
}, tap("get_code_snippet", queryTool(session, ({ symbol, projectPath }) => session.getCodeSnippet(symbol, projectPath))));
|
|
297
|
+
server.registerTool("node", {
|
|
298
|
+
description: "Everything about one symbol or file at once: definition, source, callers, callees, " +
|
|
299
|
+
"and dependents.",
|
|
300
|
+
inputSchema: {
|
|
301
|
+
ref: z.string().describe("Symbol or file id, simple name, or dotted/path reference."),
|
|
302
|
+
projectPath: projectPathSchema,
|
|
303
|
+
},
|
|
304
|
+
}, tap("node", queryTool(session, ({ ref, projectPath }) => session.node(ref, projectPath))));
|
|
305
|
+
server.registerTool("file_skeleton", {
|
|
306
|
+
description: "A file's outline in one call: the symbols it defines (kind, name, line range) " +
|
|
307
|
+
"plus the files that depend on it — a structured, cheaper alternative to reading " +
|
|
308
|
+
"the whole file.",
|
|
309
|
+
inputSchema: {
|
|
310
|
+
file: z.string().describe("File node id (repo-relative path) or basename."),
|
|
311
|
+
projectPath: projectPathSchema,
|
|
312
|
+
},
|
|
313
|
+
}, tap("file_skeleton", queryTool(session, ({ file, projectPath }) => session.fileSkeleton(file, projectPath))));
|
|
314
|
+
server.registerTool("impact_analysis", {
|
|
315
|
+
description: "The transitive blast radius of a symbol: everything that could break if you change it " +
|
|
316
|
+
"(callers, callers of callers, …), optionally bounded by depth.",
|
|
317
|
+
inputSchema: {
|
|
318
|
+
symbol: z.string().describe("Symbol id, simple name, or dotted qualified name."),
|
|
319
|
+
maxDepth: z
|
|
320
|
+
.number()
|
|
321
|
+
.int()
|
|
322
|
+
.positive()
|
|
323
|
+
.optional()
|
|
324
|
+
.describe("Max levels of callers to traverse (default: unbounded)."),
|
|
325
|
+
projectPath: projectPathSchema,
|
|
326
|
+
},
|
|
327
|
+
}, tap("impact_analysis", queryTool(session, ({ symbol, maxDepth, projectPath, }) => session.impactAnalysis(symbol, maxDepth, projectPath))));
|
|
328
|
+
server.registerTool("get_graph_schema", {
|
|
329
|
+
description: "A census of the index: how many nodes of each kind and edges of each kind it holds.",
|
|
330
|
+
inputSchema: { projectPath: projectPathSchema },
|
|
331
|
+
}, tap("get_graph_schema", queryTool(session, ({ projectPath }) => session.getGraphSchema(projectPath))));
|
|
332
|
+
server.registerTool("circular_imports", {
|
|
333
|
+
description: "File-level import cycles: groups of two or more files that (transitively) import " +
|
|
334
|
+
"each other. Each group is a strongly-connected component — high-signal for refactoring " +
|
|
335
|
+
"and untangling module graphs. Empty when the import graph is acyclic.",
|
|
336
|
+
inputSchema: { projectPath: projectPathSchema },
|
|
337
|
+
}, tap("circular_imports", queryTool(session, ({ projectPath }) => session.circularImports(projectPath))));
|
|
338
|
+
server.registerTool("affected", {
|
|
339
|
+
description: "Files affected by changing the given files: the transitive set that imports from them " +
|
|
340
|
+
"(directly or via a defined symbol) — which files/tests to recheck. Pass testsOnly to " +
|
|
341
|
+
"get just the affected test files (which tests to run for a change).",
|
|
342
|
+
inputSchema: {
|
|
343
|
+
files: z.array(z.string()).describe("File node ids (repo-relative paths) or basenames."),
|
|
344
|
+
testsOnly: z
|
|
345
|
+
.boolean()
|
|
346
|
+
.optional()
|
|
347
|
+
.describe("Return only the affected test files (test-impact mode)."),
|
|
348
|
+
projectPath: projectPathSchema,
|
|
349
|
+
},
|
|
350
|
+
}, tap("affected", queryTool(session, ({ files, testsOnly, projectPath, }) => session.affected(files, { testsOnly }, projectPath))));
|
|
351
|
+
server.registerTool("search_code", {
|
|
352
|
+
description: "Full-text search over symbol bodies — find code containing a string, not just by name.",
|
|
353
|
+
inputSchema: {
|
|
354
|
+
query: z.string().describe("Text to find inside symbol source (case-insensitive)."),
|
|
355
|
+
limit: z.number().int().positive().optional().describe("Max results."),
|
|
356
|
+
projectPath: projectPathSchema,
|
|
357
|
+
},
|
|
358
|
+
}, tap("search_code", async ({ query, limit, projectPath, }) => {
|
|
359
|
+
await session.catchUpIfNeeded();
|
|
360
|
+
const max = limit ?? DEFAULT_SEARCH_LIMIT;
|
|
361
|
+
const { results, viaTerms } = session.searchCodeWithConfidence(query, { limit: max + 1 }, projectPath);
|
|
362
|
+
const termHint = viaTerms
|
|
363
|
+
? `⚠️ Ama: no symbol body contains the exact phrase "${query}" — these match its words separately and may be unrelated. Search a shorter exact phrase to narrow.`
|
|
364
|
+
: undefined;
|
|
365
|
+
const { shown, hint } = capped(results, max, termHint);
|
|
366
|
+
return reply(session, shown, hint);
|
|
367
|
+
}));
|
|
368
|
+
server.registerTool("explore", {
|
|
369
|
+
description: "A one-call overview of a question: matching symbols grouped by file, their " +
|
|
370
|
+
"caller/callee relationships, and the combined blast radius. Deep-dives only the " +
|
|
371
|
+
"top matches (see totalMatches); pass limit to widen or narrow.",
|
|
372
|
+
inputSchema: {
|
|
373
|
+
question: z.string().describe("A name or term to explore around."),
|
|
374
|
+
limit: z
|
|
375
|
+
.number()
|
|
376
|
+
.int()
|
|
377
|
+
.positive()
|
|
378
|
+
.optional()
|
|
379
|
+
.describe("How many top matches to deep-dive (default 15)."),
|
|
380
|
+
projectPath: projectPathSchema,
|
|
381
|
+
},
|
|
382
|
+
}, tap("explore", queryTool(session, ({ question, limit, projectPath, }) => session.explore(question, { limit }, projectPath))));
|
|
383
|
+
return server;
|
|
384
|
+
}
|
|
385
|
+
/** Entry point: serve over stdio. stdout carries JSON-RPC only — log to stderr. */
|
|
386
|
+
export async function main() {
|
|
387
|
+
const server = createServer();
|
|
388
|
+
await server.connect(new StdioServerTransport());
|
|
389
|
+
console.error("ama MCP server running on stdio");
|
|
390
|
+
}
|
|
391
|
+
if (isEntrypoint(import.meta.url)) {
|
|
392
|
+
// Pin grammar WASM to the baseline compiler before anything loads it, or a
|
|
393
|
+
// long-running index OOMs (ama-rgx). Re-execs once; the supervisor skips main.
|
|
394
|
+
if (!ensureBaselineWasmTier()) {
|
|
395
|
+
main().catch((error) => {
|
|
396
|
+
console.error(error);
|
|
397
|
+
process.exit(1);
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
|