@botiverse/oar 0.59.1 → 0.61.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/README.md +32 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/http.d.ts +12 -0
- package/dist/mcp/http.d.ts.map +1 -0
- package/dist/mcp/http.js +66 -0
- package/dist/mcp/http.js.map +1 -0
- package/dist/mcp/serve-tools.d.ts +60 -0
- package/dist/mcp/serve-tools.d.ts.map +1 -0
- package/dist/mcp/serve-tools.js +196 -0
- package/dist/mcp/serve-tools.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -212,6 +212,38 @@ conversation database, refuses an entry carrying them. See the
|
|
|
212
212
|
[channels](https://github.com/botiverse/oar/blob/main/docs/spec/runtime-matrix.md#refused-session-options)
|
|
213
213
|
and each runtime page's "Session MCP servers".
|
|
214
214
|
|
|
215
|
+
Tools the host implements itself go through the same option. `serveMcpTools`
|
|
216
|
+
serves them from an MCP server inside the host process and returns the
|
|
217
|
+
`mcpServers` entry to pass, so one implementation reaches every runtime that
|
|
218
|
+
takes an http entry with `headers` (all but cursor, pi-durable and antigravity):
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
import { serveMcpTools } from "@botiverse/oar";
|
|
222
|
+
|
|
223
|
+
const served = await serveMcpTools({
|
|
224
|
+
name: "workspace",
|
|
225
|
+
tools: [{
|
|
226
|
+
name: "read_note",
|
|
227
|
+
description: "Read a note from the host's store",
|
|
228
|
+
inputSchema: { type: "object", properties: { id: { type: "string" } }, required: ["id"] },
|
|
229
|
+
handler: async ({ id }, { signal }) => await notes.read(String(id), { signal }),
|
|
230
|
+
}],
|
|
231
|
+
});
|
|
232
|
+
const session = await runtime.session(installation, { cwd, mcpServers: [served.server] });
|
|
233
|
+
// ... later, after the sessions that use it are disposed:
|
|
234
|
+
await served.close();
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
It listens on 127.0.0.1 behind a random bearer token (in the entry's
|
|
238
|
+
`headers`, so it never appears in a record), so the runtime must run on this
|
|
239
|
+
machine, as OAR's runtimes do. A handler returns text, or MCP content with
|
|
240
|
+
`isError` for a failed call; a thrown error becomes an `isError` result with
|
|
241
|
+
its message. Its `signal` aborts when the runtime cancels the call or the
|
|
242
|
+
server closes. One served set can back several sessions. `instructions` (guidance
|
|
243
|
+
across the tools) goes out as the MCP server instructions; claude, codex,
|
|
244
|
+
opencode and grok show them to the model, pi and kimi do not. See
|
|
245
|
+
[host-served tools](https://github.com/botiverse/oar/blob/main/docs/spec/runtime-matrix.md#host-served-tools).
|
|
246
|
+
|
|
215
247
|
`runtime.listModels(installation, options?)` lists the models an installation
|
|
216
248
|
can run now (`ok`, `unauthenticated` or `unsupported`); every built-in runtime
|
|
217
249
|
has it. Entries include native `effortLevels` and `serviceTiers` where supported.
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ export { utcInstantFromDate } from "./shared/instant.js";
|
|
|
4
4
|
export { RuntimeRegistry, createRuntimeRegistry } from "./registry.js";
|
|
5
5
|
export { VOYAGE_FORMAT, endLine, headerLine, openVoyage, recordLine, } from "./voyage.js";
|
|
6
6
|
export type { VoyageHeader, VoyageRecorder } from "./voyage.js";
|
|
7
|
+
export { serveMcpTools } from "./mcp/serve-tools.js";
|
|
8
|
+
export type { HostTool, HostToolContent, HostToolResult, ServeMcpToolsOptions, ServedMcpTools } from "./mcp/serve-tools.js";
|
|
7
9
|
export * from "./observe/index.js";
|
|
8
10
|
export { claudeRuntime } from "./runtimes/claude/index.js";
|
|
9
11
|
export { claudeListModels, projectClaudeModels } from "./runtimes/claude/list-models.js";
|
|
@@ -23,7 +25,7 @@ export { antigravityInstallation } from "./runtimes/antigravity/installation.js"
|
|
|
23
25
|
export { antigravityListModels, projectAntigravityModels } from "./runtimes/antigravity/list-models.js";
|
|
24
26
|
export { createCursorRuntime, projectCursorModels } from "./runtimes/cursor/index.js";
|
|
25
27
|
export type { CursorRuntime, CursorRuntimeOptions } from "./runtimes/cursor/index.js";
|
|
26
|
-
export type { CursorSdk } from "./runtimes/cursor/sdk.js";
|
|
28
|
+
export type { CursorSdk, ModelListItem as CursorModelListItem } from "./runtimes/cursor/sdk.js";
|
|
27
29
|
export { cursorInstallation } from "./runtimes/cursor/installation.js";
|
|
28
30
|
export { grokRuntime } from "./runtimes/grok/index.js";
|
|
29
31
|
export { grokListModels, projectGrokModels } from "./runtimes/grok/list-models.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAShD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EACL,aAAa,EACb,OAAO,EACP,UAAU,EACV,UAAU,EACV,UAAU,GACX,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ export * from "./contracts/index.js";
|
|
|
10
10
|
export { utcInstantFromDate } from "./shared/instant.js";
|
|
11
11
|
export { RuntimeRegistry, createRuntimeRegistry } from "./registry.js";
|
|
12
12
|
export { VOYAGE_FORMAT, endLine, headerLine, openVoyage, recordLine, } from "./voyage.js";
|
|
13
|
+
export { serveMcpTools } from "./mcp/serve-tools.js";
|
|
13
14
|
// Everything the browser-safe observe subpath exports, so the root is the full surface.
|
|
14
15
|
export * from "./observe/index.js";
|
|
15
16
|
export { claudeRuntime } from "./runtimes/claude/index.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IncomingMessage, Server, ServerResponse } from "node:http";
|
|
2
|
+
import { type JsonRecord } from "../shared/json.js";
|
|
3
|
+
export declare function authorized(request: IncomingMessage, expected: Buffer): boolean;
|
|
4
|
+
/** No Origin (a runtime's MCP client), or a loopback page's: MCP asks servers to refuse other origins (DNS rebinding). */
|
|
5
|
+
export declare function localOrigin(request: IncomingMessage): boolean;
|
|
6
|
+
/** The request body, or null past MAX_BODY_BYTES. The rest is still read: answering before the client finished sending resets its connection (seen on Windows). */
|
|
7
|
+
export declare function body(request: IncomingMessage): Promise<string | null>;
|
|
8
|
+
export declare function rpcError(response: ServerResponse, code: number, message: string): void;
|
|
9
|
+
/** The request's messages: one, or a batch (2025-03-26). */
|
|
10
|
+
export declare function messagesOf(parsed: unknown): JsonRecord[] | null;
|
|
11
|
+
export declare function listen(server: Server): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/mcp/http.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAM9D,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAG9E;AAED,0HAA0H;AAC1H,wBAAgB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAU7D;AAED,mKAAmK;AACnK,wBAAsB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAS3E;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAEtF;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,EAAE,GAAG,IAAI,CAS/D;AAED,wBAAsB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5D"}
|
package/dist/mcp/http.js
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { asRecord } from "../shared/json.js";
|
|
3
|
+
/* The HTTP side of serve-tools.ts: authorization, origin, bodies and replies. */
|
|
4
|
+
const MAX_BODY_BYTES = 4 * 1024 * 1024;
|
|
5
|
+
export function authorized(request, expected) {
|
|
6
|
+
const given = Buffer.from(request.headers.authorization ?? "");
|
|
7
|
+
return given.length === expected.length && timingSafeEqual(given, expected);
|
|
8
|
+
}
|
|
9
|
+
/** No Origin (a runtime's MCP client), or a loopback page's: MCP asks servers to refuse other origins (DNS rebinding). */
|
|
10
|
+
export function localOrigin(request) {
|
|
11
|
+
const { origin } = request.headers;
|
|
12
|
+
if (origin === undefined) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
return ["127.0.0.1", "localhost", "[::1]"].includes(new URL(origin).hostname);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** The request body, or null past MAX_BODY_BYTES. The rest is still read: answering before the client finished sending resets its connection (seen on Windows). */
|
|
23
|
+
export async function body(request) {
|
|
24
|
+
const chunks = [];
|
|
25
|
+
let size = 0;
|
|
26
|
+
for await (const chunk of request) {
|
|
27
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
28
|
+
size += buffer.length;
|
|
29
|
+
if (size <= MAX_BODY_BYTES) {
|
|
30
|
+
chunks.push(buffer);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return size > MAX_BODY_BYTES ? null : Buffer.concat(chunks).toString("utf8");
|
|
34
|
+
}
|
|
35
|
+
export function rpcError(response, code, message) {
|
|
36
|
+
response.writeHead(400, { "content-type": "application/json" }).end(JSON.stringify({ jsonrpc: "2.0", id: null, error: { code, message } }));
|
|
37
|
+
}
|
|
38
|
+
/** The request's messages: one, or a batch (2025-03-26). */
|
|
39
|
+
export function messagesOf(parsed) {
|
|
40
|
+
const list = Array.isArray(parsed) ? parsed : [parsed];
|
|
41
|
+
const messages = [];
|
|
42
|
+
for (const entry of list) {
|
|
43
|
+
const message = asRecord(entry);
|
|
44
|
+
if (message === null) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
messages.push(message);
|
|
48
|
+
}
|
|
49
|
+
return messages.length > 0 ? messages : null;
|
|
50
|
+
}
|
|
51
|
+
export async function listen(server) {
|
|
52
|
+
const { promise, resolve, reject } = Promise.withResolvers();
|
|
53
|
+
server.once("error", reject);
|
|
54
|
+
server.listen(0, "127.0.0.1", () => {
|
|
55
|
+
const address = server.address();
|
|
56
|
+
if (address !== null && typeof address === "object") {
|
|
57
|
+
resolve(address.port);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
reject(new Error("serveMcpTools: no TCP port"));
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const port = await promise;
|
|
64
|
+
return port;
|
|
65
|
+
}
|
|
66
|
+
//# 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,60 @@
|
|
|
1
|
+
import type { McpServer } from "../contracts/session-options.js";
|
|
2
|
+
/** Content a host tool returns, in MCP's own shapes. */
|
|
3
|
+
export type HostToolContent = {
|
|
4
|
+
readonly type: "text";
|
|
5
|
+
readonly text: string;
|
|
6
|
+
} | {
|
|
7
|
+
readonly type: "image";
|
|
8
|
+
readonly data: string;
|
|
9
|
+
readonly mimeType: string;
|
|
10
|
+
};
|
|
11
|
+
/** A tool's answer: plain text, or MCP content with `isError` for a failed call the model should see. */
|
|
12
|
+
export type HostToolResult = string | {
|
|
13
|
+
readonly content: readonly HostToolContent[];
|
|
14
|
+
readonly isError?: boolean;
|
|
15
|
+
};
|
|
16
|
+
export interface HostTool {
|
|
17
|
+
/** The tool name the model sees (`^[\w-]{1,64}$`); runtimes may prefix it with the server name. */
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly description?: string;
|
|
20
|
+
/** JSON Schema of the input, an object schema, given to the runtime unchanged. OAR does not validate calls against it. */
|
|
21
|
+
readonly inputSchema: Readonly<Record<string, unknown>>;
|
|
22
|
+
/**
|
|
23
|
+
* Runs one call. `signal` aborts when the runtime cancels the call, drops
|
|
24
|
+
* the request, or the server closes. A thrown error becomes an `isError`
|
|
25
|
+
* result carrying the error's message.
|
|
26
|
+
*/
|
|
27
|
+
readonly handler: (input: Readonly<Record<string, unknown>>, context: {
|
|
28
|
+
readonly signal: AbortSignal;
|
|
29
|
+
}) => HostToolResult | Promise<HostToolResult>;
|
|
30
|
+
}
|
|
31
|
+
export interface ServeMcpToolsOptions {
|
|
32
|
+
/** The server name runtimes show and prefix tools with (`^[\w-]+$`, the strictest runtime's rule). */
|
|
33
|
+
readonly name: string;
|
|
34
|
+
readonly tools: readonly HostTool[];
|
|
35
|
+
/**
|
|
36
|
+
* Guidance across the tools (what the group is for, how they work
|
|
37
|
+
* together), returned as the MCP `initialize` result's `instructions`.
|
|
38
|
+
* Whether the model sees it is the runtime's own choice: see
|
|
39
|
+
* docs/spec/runtime-matrix.md#host-served-tools.
|
|
40
|
+
*/
|
|
41
|
+
readonly instructions?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface ServedMcpTools {
|
|
44
|
+
/** The `SessionOptions.mcpServers` entry: http on 127.0.0.1 with the bearer token in `headers`. */
|
|
45
|
+
readonly server: Extract<McpServer, {
|
|
46
|
+
readonly type: "http";
|
|
47
|
+
}>;
|
|
48
|
+
/** Stops serving and aborts calls still running. */
|
|
49
|
+
close(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Serve host-implemented tools over MCP for `SessionOptions.mcpServers`.
|
|
53
|
+
* Pass `served.server` in a session's `mcpServers`; one served set can back
|
|
54
|
+
* several sessions. The runtime must reach the host's 127.0.0.1 (it does when
|
|
55
|
+
* OAR starts it on this machine or runs it in this process). Runtimes that
|
|
56
|
+
* refuse an http entry or its `headers` refuse this one too (cursor,
|
|
57
|
+
* pi-durable, antigravity): see docs/spec/runtime-matrix.md#host-served-tools.
|
|
58
|
+
*/
|
|
59
|
+
export declare function serveMcpTools(options: ServeMcpToolsOptions): Promise<ServedMcpTools>;
|
|
60
|
+
//# sourceMappingURL=serve-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-tools.d.ts","sourceRoot":"","sources":["../../src/mcp/serve-tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAkBjE,wDAAwD;AACxD,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjF,yGAAyG;AACzG,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEnH,MAAM,WAAW,QAAQ;IACvB,mGAAmG;IACnG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,0HAA0H;IAC1H,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACrJ;AAED,MAAM,WAAW,oBAAoB;IACnC,sGAAsG;IACtG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,oDAAoD;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAgKD;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqB1F"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { asRecord, parseJson } from "../shared/json.js";
|
|
4
|
+
import { authorized, body, listen, localOrigin, messagesOf, rpcError } from "./http.js";
|
|
5
|
+
const SERVER_NAME = /^[\w-]+$/u;
|
|
6
|
+
const TOOL_NAME = /^[\w-]{1,64}$/u;
|
|
7
|
+
function checkTools(options) {
|
|
8
|
+
if (!SERVER_NAME.test(options.name)) {
|
|
9
|
+
throw new Error(`serveMcpTools name ${JSON.stringify(options.name)} must match ${String(SERVER_NAME)}`);
|
|
10
|
+
}
|
|
11
|
+
const tools = new Map();
|
|
12
|
+
for (const tool of options.tools) {
|
|
13
|
+
if (!TOOL_NAME.test(tool.name) || tools.has(tool.name)) {
|
|
14
|
+
throw new Error(`serveMcpTools tool name ${JSON.stringify(tool.name)} must match ${String(TOOL_NAME)} and be unique`);
|
|
15
|
+
}
|
|
16
|
+
tools.set(tool.name, tool);
|
|
17
|
+
}
|
|
18
|
+
return tools;
|
|
19
|
+
}
|
|
20
|
+
function listed(tool) {
|
|
21
|
+
const entry = { name: tool.name, inputSchema: tool.inputSchema };
|
|
22
|
+
if (tool.description !== undefined) {
|
|
23
|
+
entry.description = tool.description;
|
|
24
|
+
}
|
|
25
|
+
return entry;
|
|
26
|
+
}
|
|
27
|
+
function toolResult(result) {
|
|
28
|
+
if (typeof result === "string") {
|
|
29
|
+
return { content: [{ type: "text", text: result }] };
|
|
30
|
+
}
|
|
31
|
+
return { content: [...result.content], ...(result.isError === true ? { isError: true } : {}) };
|
|
32
|
+
}
|
|
33
|
+
/** The protocol versions this server speaks; a client asking for another gets the latest. */
|
|
34
|
+
const PROTOCOL_VERSIONS = ["2025-06-18", "2025-03-26", "2024-11-05"];
|
|
35
|
+
class ToolServer {
|
|
36
|
+
#name;
|
|
37
|
+
#instructions;
|
|
38
|
+
#tools;
|
|
39
|
+
/** Running calls by MCP session and request id: clients number requests alike, so an id alone is not one call. */
|
|
40
|
+
#calls = new Map();
|
|
41
|
+
constructor(options, tools) {
|
|
42
|
+
this.#name = options.name;
|
|
43
|
+
this.#instructions = options.instructions;
|
|
44
|
+
this.#tools = tools;
|
|
45
|
+
}
|
|
46
|
+
/** The JSON-RPC answer to one message, or null for a notification or a client's response. */
|
|
47
|
+
async answer(message, origin) {
|
|
48
|
+
const { id, method } = message;
|
|
49
|
+
const params = asRecord(message.params) ?? {};
|
|
50
|
+
if (typeof method !== "string") {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
if (typeof id !== "string" && typeof id !== "number") {
|
|
54
|
+
const cancelled = params.requestId;
|
|
55
|
+
if (method === "notifications/cancelled" && (typeof cancelled === "string" || typeof cancelled === "number")) {
|
|
56
|
+
this.#calls.get(callKey(origin.session, cancelled))?.abort();
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
const reply = await this.#result(id, method, params, origin);
|
|
61
|
+
return { jsonrpc: "2.0", id, ...reply };
|
|
62
|
+
}
|
|
63
|
+
abortAll() {
|
|
64
|
+
for (const controller of this.#calls.values()) {
|
|
65
|
+
controller.abort();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async #result(id, method, params, origin) {
|
|
69
|
+
switch (method) {
|
|
70
|
+
case "initialize":
|
|
71
|
+
return { result: {
|
|
72
|
+
protocolVersion: typeof params.protocolVersion === "string" && PROTOCOL_VERSIONS.includes(params.protocolVersion) ? params.protocolVersion : PROTOCOL_VERSIONS[0],
|
|
73
|
+
capabilities: { tools: {} },
|
|
74
|
+
serverInfo: { name: this.#name, version: "1.0.0" },
|
|
75
|
+
...(this.#instructions === undefined ? {} : { instructions: this.#instructions }),
|
|
76
|
+
} };
|
|
77
|
+
case "ping":
|
|
78
|
+
return { result: {} };
|
|
79
|
+
case "tools/list":
|
|
80
|
+
return { result: { tools: [...this.#tools.values()].map((tool) => listed(tool)) } };
|
|
81
|
+
case "tools/call": {
|
|
82
|
+
const reply = await this.#call(callKey(origin.session, id), params, origin.dropped);
|
|
83
|
+
return reply;
|
|
84
|
+
}
|
|
85
|
+
default:
|
|
86
|
+
return { error: { code: -32_601, message: `method not found: ${method}` } };
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async #call(key, params, dropped) {
|
|
90
|
+
const tool = typeof params.name === "string" ? this.#tools.get(params.name) : undefined;
|
|
91
|
+
if (tool === undefined) {
|
|
92
|
+
return { error: { code: -32_602, message: `unknown tool: ${String(params.name)}` } };
|
|
93
|
+
}
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const abort = () => { controller.abort(); };
|
|
96
|
+
dropped.addEventListener("abort", abort, { once: true });
|
|
97
|
+
this.#calls.set(key, controller);
|
|
98
|
+
try {
|
|
99
|
+
return { result: toolResult(await tool.handler(asRecord(params.arguments) ?? {}, { signal: controller.signal })) };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return { result: { content: [{ type: "text", text: error instanceof Error ? error.message : String(error) }], isError: true } };
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
if (this.#calls.get(key) === controller) {
|
|
106
|
+
this.#calls.delete(key);
|
|
107
|
+
}
|
|
108
|
+
dropped.removeEventListener("abort", abort);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function callKey(session, id) {
|
|
113
|
+
return JSON.stringify([session, id]);
|
|
114
|
+
}
|
|
115
|
+
async function respond(tools, request, response) {
|
|
116
|
+
const text = await body(request);
|
|
117
|
+
if (text === null) {
|
|
118
|
+
response.writeHead(413, { connection: "close" }).end();
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const parsed = parseJson(text);
|
|
122
|
+
const messages = messagesOf(parsed);
|
|
123
|
+
if (messages === null) {
|
|
124
|
+
rpcError(response, parsed === undefined ? -32_700 : -32_600, parsed === undefined ? "parse error" : "invalid request");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// A new MCP session per initialize, so each client's request ids are its own.
|
|
128
|
+
const opened = messages.some((message) => message.method === "initialize") ? `oar-host-tools-${randomBytes(12).toString("hex")}` : undefined;
|
|
129
|
+
const header = request.headers["mcp-session-id"];
|
|
130
|
+
const session = opened ?? (typeof header === "string" ? header : "");
|
|
131
|
+
const dropped = new AbortController();
|
|
132
|
+
response.once("close", () => { if (!response.writableEnded) {
|
|
133
|
+
dropped.abort();
|
|
134
|
+
} });
|
|
135
|
+
const answered = await Promise.all(messages.map(async (message) => {
|
|
136
|
+
const reply = await tools.answer(message, { session, dropped: dropped.signal });
|
|
137
|
+
return reply;
|
|
138
|
+
}));
|
|
139
|
+
const replies = answered.filter((reply) => reply !== null);
|
|
140
|
+
if (replies.length === 0) {
|
|
141
|
+
response.writeHead(202).end();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
response.writeHead(200, { "content-type": "application/json", ...(session === "" ? {} : { "mcp-session-id": session }) }).end(JSON.stringify(Array.isArray(parsed) ? replies : replies[0]));
|
|
145
|
+
}
|
|
146
|
+
/** One authorized POST, never rejecting: a failure the reply did not cover becomes a 500. */
|
|
147
|
+
async function serve(tools, request, response) {
|
|
148
|
+
try {
|
|
149
|
+
await respond(tools, request, response);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
if (!response.headersSent) {
|
|
153
|
+
response.writeHead(500).end();
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Serve host-implemented tools over MCP for `SessionOptions.mcpServers`.
|
|
159
|
+
* Pass `served.server` in a session's `mcpServers`; one served set can back
|
|
160
|
+
* several sessions. The runtime must reach the host's 127.0.0.1 (it does when
|
|
161
|
+
* OAR starts it on this machine or runs it in this process). Runtimes that
|
|
162
|
+
* refuse an http entry or its `headers` refuse this one too (cursor,
|
|
163
|
+
* pi-durable, antigravity): see docs/spec/runtime-matrix.md#host-served-tools.
|
|
164
|
+
*/
|
|
165
|
+
export async function serveMcpTools(options) {
|
|
166
|
+
const tools = new ToolServer(options, checkTools(options));
|
|
167
|
+
const token = randomBytes(32).toString("base64url");
|
|
168
|
+
const expected = Buffer.from(`Bearer ${token}`);
|
|
169
|
+
const server = createServer((request, response) => {
|
|
170
|
+
if (!localOrigin(request)) {
|
|
171
|
+
response.writeHead(403).end();
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (!authorized(request, expected)) {
|
|
175
|
+
response.writeHead(401).end();
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (request.method !== "POST") {
|
|
179
|
+
response.writeHead(405, { allow: "POST" }).end();
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
void serve(tools, request, response);
|
|
183
|
+
});
|
|
184
|
+
const port = await listen(server);
|
|
185
|
+
return {
|
|
186
|
+
server: { name: options.name, type: "http", url: `http://127.0.0.1:${String(port)}/mcp`, headers: { Authorization: `Bearer ${token}` } },
|
|
187
|
+
async close() {
|
|
188
|
+
tools.abortAll();
|
|
189
|
+
const { promise, resolve } = Promise.withResolvers();
|
|
190
|
+
server.close(() => { resolve(); });
|
|
191
|
+
server.closeAllConnections();
|
|
192
|
+
await promise;
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=serve-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-tools.js","sourceRoot":"","sources":["../../src/mcp/serve-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@botiverse/oar",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.61.0",
|
|
4
4
|
"description": "A programming interface for all agent harnesses: provider-independent contracts for controlling and observing agent runtimes",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|