langfx.js 0.1.0-alpha.0 → 0.1.0-alpha.2
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 +12 -3
- package/dist/agentic.d.ts +3 -3
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mapping.d.ts +14 -6
- package/dist/mapping.js +1 -0
- package/dist/mapping.js.map +1 -1
- package/dist/mcp/index.d.ts +75 -0
- package/dist/mcp/index.js +257 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/node.d.ts +14 -0
- package/dist/mcp/node.js +20 -0
- package/dist/mcp/node.js.map +1 -0
- package/dist/python.d.ts +34 -19
- package/dist/python.js +22 -6
- package/dist/python.js.map +1 -1
- package/dist/query.d.ts +3 -3
- package/dist/schema.d.ts +20 -1
- package/dist/schema.js +22 -2
- package/dist/schema.js.map +1 -1
- package/dist/typed-class.d.ts +29 -0
- package/dist/typed-class.js +39 -0
- package/dist/typed-class.js.map +1 -0
- package/dist/typed.d.ts +3 -0
- package/dist/typed.js +4 -0
- package/dist/typed.js.map +1 -0
- package/docs/CLASS_SCHEMAS.md +332 -0
- package/docs/IMPLEMENTATION_STATUS.md +10 -2
- package/docs/MCP.md +117 -0
- package/docs/PORTING_PLAN.md +1 -1
- package/docs/PYTHON_PROTOCOL.md +26 -24
- package/docs/RELEASING.md +23 -5
- package/docs/STREAMING.md +1 -1
- package/package.json +19 -2
package/README.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
Language as functions, in TypeScript. Build agents in browsers, workers, and apps without a Python agent backend.
|
|
4
4
|
|
|
5
|
-
**Status:
|
|
5
|
+
**Status: alpha (`0.1.0-alpha.1`).** OpenAI, Anthropic, and Gemini support text/image inputs, client tools, and streaming tool events through fixture-tested transports. The runtime includes prompt composition, structured JSON streaming, bounded agents, invocation traces/logs/progress, retries, and local response caching. Gemini has passed the live smoke suite; live OpenAI/Anthropic behavior and provider browser CORS remain unverified. APIs may change during alpha. See [implementation status](docs/IMPLEMENTATION_STATUS.md) and the [opt-in live smoke runner](docs/LIVE_TESTING.md).
|
|
6
6
|
|
|
7
7
|
The proposal is based on [`free-solo/langfx`](https://github.com/free-solo/langfx) at commit `2a1ea4e8dcd7075bf745ad707f901ece8546f47d`, examined on September 16, 2026.
|
|
8
8
|
|
|
9
9
|
## Install the alpha
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
Install with `npm install langfx.js@alpha`. Zod users also install `zod`; the core has no runtime dependencies. See [release notes and publishing procedure](docs/RELEASING.md).
|
|
12
12
|
|
|
13
13
|
## Run the core
|
|
14
14
|
|
|
@@ -22,7 +22,9 @@ npm run example:agent
|
|
|
22
22
|
npm run serve:example
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
For a complete browser app with live web search over MCP, streamed answers, cancellation, and simulated failures, run `npm run example:app`. See [Search agent](examples/app/README.md) for setup and live-model integration.
|
|
26
|
+
|
|
27
|
+
`npm run serve:example` serves the browser/worker example at `http://127.0.0.1:8765`. No credentials or Python runtime are needed. Fake models are imported separately from the core:
|
|
26
28
|
|
|
27
29
|
```ts
|
|
28
30
|
import * as lf from 'langfx.js';
|
|
@@ -93,6 +95,7 @@ Local operations such as `Template.render()`, schema validation, and message con
|
|
|
93
95
|
- [Source audit](docs/SOURCE_AUDIT.md): implementation findings and test cases to carry forward, with pinned source links.
|
|
94
96
|
- [OpenAI adapter](docs/OPENAI.md): Responses API, strict JSON output, tools, and streaming.
|
|
95
97
|
- [Anthropic adapter](docs/ANTHROPIC.md): Messages API text, tools, streaming, and current limits.
|
|
98
|
+
- [Structured query classes and schemas](docs/CLASS_SCHEMAS.md): runtime fields, defaults, unions, nested classes, and action dependencies.
|
|
96
99
|
- [Mapping classes](docs/MAPPING.md): subclassable structured queries, examples, and postprocessing.
|
|
97
100
|
- [Retries and cache](docs/RETRIES_AND_CACHE.md): retry policy, cache isolation, TTL, and usage accounting.
|
|
98
101
|
- [Structured streaming](docs/STREAMING.md): incremental fields, validated results, limits, and terminal outcomes.
|
|
@@ -104,4 +107,10 @@ Local operations such as `Template.render()`, schema validation, and message con
|
|
|
104
107
|
|
|
105
108
|
Apache-2.0. See [LICENSE](LICENSE) and [NOTICE](NOTICE) for upstream attribution.
|
|
106
109
|
|
|
110
|
+
Pass classes with static field metadata directly to queries and nested fields; validation, construction, and serialization are derived automatically. Use [`typed.schemaFrom(Class, ...dependencies)`](docs/CLASS_SCHEMAS.md) when binding runtime constructor dependencies.
|
|
111
|
+
|
|
107
112
|
For named class unions and constructor-style responses, see the default [Python-style protocol](docs/PYTHON_PROTOCOL.md).
|
|
113
|
+
|
|
114
|
+
## MCP
|
|
115
|
+
|
|
116
|
+
The optional `langfx.js/mcp` module follows Python Langfx’s client/session/tool APIs for remote Streamable HTTP servers, validated discovery and calls, cancellation, and explicit agent tool selection. Node/desktop hosts can use `StdioMcpClient.fromCommand` from `langfx.js/mcp/node` for local servers, including Python FastMCP. Install its optional `@modelcontextprotocol/client` 2.x peer. See [MCP usage and compatibility](docs/MCP.md). MCP support is included starting with `0.1.0-alpha.1`.
|
package/dist/agentic.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { QueryOptions, QueryValue } from './query.js';
|
|
2
|
-
import type { SchemaLike } from './schema.js';
|
|
2
|
+
import type { SchemaLike, SchemaValue, CheckedSchema } from './schema.js';
|
|
3
3
|
import type { Prompt } from './template.js';
|
|
4
4
|
import type { LanguageModel, SamplingUsage } from './language-model.js';
|
|
5
5
|
export interface RunOptions {
|
|
@@ -106,8 +106,8 @@ export declare class Session {
|
|
|
106
106
|
fatal(message: string, options?: LogOptions): void;
|
|
107
107
|
updateProgress(title: string, metadata?: Readonly<Record<string, unknown>>): void;
|
|
108
108
|
private log;
|
|
109
|
-
query<
|
|
110
|
-
query<
|
|
109
|
+
query<S extends SchemaLike<unknown>, O extends SessionQueryOptions>(prompt: Prompt, schema: S & CheckedSchema<NoInfer<S>>, options: O): Promise<QueryValue<SchemaValue<S>, O>>;
|
|
110
|
+
query<S extends SchemaLike<unknown>>(prompt: Prompt, schema: S & CheckedSchema<NoInfer<S>>): Promise<SchemaValue<S>>;
|
|
111
111
|
query<O extends SessionQueryOptions = {}>(prompt: Prompt, options?: O): Promise<QueryValue<string, O>>;
|
|
112
112
|
concurrentMap<I, O>(inputs: readonly I[], fn: (input: I, branch: Session) => Promise<O>, options?: {
|
|
113
113
|
readonly maxConcurrency?: number;
|
package/dist/index.d.ts
CHANGED
|
@@ -15,4 +15,4 @@ export type { InMemoryCacheOptions } from './cache.js';
|
|
|
15
15
|
export type { RetryOptions } from './retry.js';
|
|
16
16
|
export { Mapping, LfQuery, MappingExample, MappingError } from './mapping.js';
|
|
17
17
|
export type { MappingOptions, MappingExampleOptions } from './mapping.js';
|
|
18
|
-
export * as
|
|
18
|
+
export * as typed from './typed.js';
|
package/dist/index.js
CHANGED
|
@@ -11,5 +11,5 @@ export * from './tools.js';
|
|
|
11
11
|
export * as llms from './llms/index.js';
|
|
12
12
|
export { Cache, InMemoryCache } from './cache.js';
|
|
13
13
|
export { Mapping, LfQuery, MappingExample, MappingError } from './mapping.js';
|
|
14
|
-
export * as
|
|
14
|
+
export * as typed from './typed.js';
|
|
15
15
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG9E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG9E,OAAO,KAAK,KAAK,MAAM,YAAY,CAAC"}
|
package/dist/mapping.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { LangFunc } from './langfunc.js';
|
|
|
3
3
|
import type { LangFuncCallOptions, LangFuncOptions } from './langfunc.js';
|
|
4
4
|
import type { LanguageModel } from './language-model.js';
|
|
5
5
|
import { Message } from './message.js';
|
|
6
|
-
import type { Schema, SchemaLike } from './schema.js';
|
|
6
|
+
import type { Schema, SchemaLike, CheckedSchema } from './schema.js';
|
|
7
7
|
import { Template } from './template.js';
|
|
8
8
|
import type { Prompt, Variables } from './template.js';
|
|
9
9
|
export declare class MappingError extends OutputValidationError {
|
|
@@ -20,14 +20,16 @@ export interface MappingExampleOptions {
|
|
|
20
20
|
readonly context?: string;
|
|
21
21
|
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
22
22
|
}
|
|
23
|
-
export declare class MappingExample {
|
|
23
|
+
export declare class MappingExample<S extends SchemaLike<unknown> = SchemaLike<unknown>> {
|
|
24
24
|
readonly input: Prompt;
|
|
25
25
|
readonly output: unknown;
|
|
26
26
|
readonly schema: SchemaLike<unknown> | undefined;
|
|
27
27
|
readonly context: string | undefined;
|
|
28
28
|
readonly metadata: Readonly<Record<string, unknown>>;
|
|
29
29
|
readonly hasOutput: boolean;
|
|
30
|
-
constructor(options: MappingExampleOptions
|
|
30
|
+
constructor(options: MappingExampleOptions & {
|
|
31
|
+
schema?: S & CheckedSchema<NoInfer<S>>;
|
|
32
|
+
});
|
|
31
33
|
}
|
|
32
34
|
export interface MappingOptions<T> extends LangFuncOptions {
|
|
33
35
|
readonly input: Prompt;
|
|
@@ -39,7 +41,9 @@ export interface MappingOptions<T> extends LangFuncOptions {
|
|
|
39
41
|
readonly systemMessage?: Prompt;
|
|
40
42
|
}
|
|
41
43
|
/** Reusable JSON mapping pipeline. Local rendering/parsing hooks stay synchronous. */
|
|
42
|
-
export declare class Mapping<T
|
|
44
|
+
export declare class Mapping<T, S extends SchemaLike<T> = Schema<T> | {
|
|
45
|
+
readonly schema: Schema<T>;
|
|
46
|
+
}> extends LangFunc {
|
|
43
47
|
static templateStr: string;
|
|
44
48
|
protected readonly preambleOverride: Template | undefined;
|
|
45
49
|
readonly input: Prompt;
|
|
@@ -47,7 +51,9 @@ export declare class Mapping<T> extends LangFunc {
|
|
|
47
51
|
readonly schema: Schema<T>;
|
|
48
52
|
readonly examples: readonly MappingExample[];
|
|
49
53
|
readonly systemMessage: Prompt | undefined;
|
|
50
|
-
constructor(options: MappingOptions<T>
|
|
54
|
+
constructor(options: MappingOptions<T> & {
|
|
55
|
+
schema: S & CheckedSchema<NoInfer<S>>;
|
|
56
|
+
});
|
|
51
57
|
get mappingRequest(): MappingExample;
|
|
52
58
|
get preamble(): Template;
|
|
53
59
|
get inputTitle(): string;
|
|
@@ -62,7 +68,9 @@ export declare class Mapping<T> extends LangFunc {
|
|
|
62
68
|
call(options?: LangFuncCallOptions): Promise<Message<T>>;
|
|
63
69
|
}
|
|
64
70
|
/** Query specialization for JSON and restricted Python constructor protocols. */
|
|
65
|
-
export declare class LfQuery<T
|
|
71
|
+
export declare class LfQuery<T, S extends SchemaLike<T> = Schema<T> | {
|
|
72
|
+
readonly schema: Schema<T>;
|
|
73
|
+
}> extends Mapping<T, S> {
|
|
66
74
|
get inputTitle(): string;
|
|
67
75
|
get outputTitle(): string;
|
|
68
76
|
get schemaTitle(): string;
|
package/dist/mapping.js
CHANGED
|
@@ -45,6 +45,7 @@ export class Mapping extends LangFunc {
|
|
|
45
45
|
throw new TypeError('Unsupported mapping protocol.');
|
|
46
46
|
this.preambleOverride = options.preamble;
|
|
47
47
|
this.input = options.input;
|
|
48
|
+
// The constructor boundary has already checked the concrete schema type.
|
|
48
49
|
this.schema = resolveSchema(options.schema);
|
|
49
50
|
if (this.protocol === 'python')
|
|
50
51
|
python.schemaText(this.schema);
|
package/dist/mapping.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExG,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGvD,MAAM,OAAO,YAAa,SAAQ,qBAAqB;IAGhC,UAAU;IAF/B,oEAAoE;IACpE,sBAAsB,CAAW;IACjC,YAAqB,UAAmB,EAAE,KAAc;QACtD,KAAK,CAAC,oDAAoD,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;0BADpD,UAAU;IAE/B,CAAC;CACF;AASD,MAAM,OAAO,cAAc;IAChB,KAAK,CAAS;IACd,MAAM,CAAU;IAChB,MAAM,CAAkC;IACxC,OAAO,CAAqB;IAC5B,QAAQ,CAAoC;IAC5C,SAAS,CAAU;IAC5B,YAAY,
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../src/mapping.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { CallToolResult, Tool as ToolDefinition, Transport, StreamableHTTPClientTransportOptions } from '@modelcontextprotocol/client';
|
|
2
|
+
import { ToolExecutionError } from '../errors.js';
|
|
3
|
+
import { ToolMessage } from '../message.js';
|
|
4
|
+
import type { RegisteredTool } from '../tools.js';
|
|
5
|
+
export interface McpRequestOptions {
|
|
6
|
+
readonly signal?: AbortSignal;
|
|
7
|
+
readonly timeout?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface McpCallOptions extends McpRequestOptions {
|
|
10
|
+
readonly returnsMessage?: boolean;
|
|
11
|
+
readonly toolCallId?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface McpClientOptions {
|
|
14
|
+
/** Fresh, owned SDK transport for each session. Enables host-specific bridges. */
|
|
15
|
+
readonly transport: () => Transport;
|
|
16
|
+
readonly name?: string;
|
|
17
|
+
readonly version?: string;
|
|
18
|
+
}
|
|
19
|
+
export type McpHttpOptions = Pick<StreamableHTTPClientTransportOptions, 'fetch' | 'authProvider' | 'requestInit'>;
|
|
20
|
+
export type McpTools = Readonly<Record<string, McpTool>>;
|
|
21
|
+
/** Async equivalent of Python's client; importing core never loads the SDK. */
|
|
22
|
+
export declare class McpClient {
|
|
23
|
+
private readonly options;
|
|
24
|
+
private tools;
|
|
25
|
+
constructor(options: McpClientOptions);
|
|
26
|
+
static fromUrl(url: string | URL, options?: McpHttpOptions): McpClient;
|
|
27
|
+
session(): McpSession;
|
|
28
|
+
knownTools(): McpTools | undefined;
|
|
29
|
+
listTools(options?: McpRequestOptions & {
|
|
30
|
+
readonly refresh?: boolean;
|
|
31
|
+
}): Promise<McpTools>;
|
|
32
|
+
withSession<T>(fn: (session: McpSession) => Promise<T>, options?: McpRequestOptions): Promise<T>;
|
|
33
|
+
}
|
|
34
|
+
/** One owned connection. Closed/failed sessions cannot be reopened; create a new session. */
|
|
35
|
+
export declare class McpSession {
|
|
36
|
+
private readonly options;
|
|
37
|
+
private readonly sdk;
|
|
38
|
+
private transport;
|
|
39
|
+
private state;
|
|
40
|
+
private readonly lifetime;
|
|
41
|
+
private closing;
|
|
42
|
+
private tools;
|
|
43
|
+
constructor(options: McpClientOptions);
|
|
44
|
+
connect(options?: McpRequestOptions): Promise<this>;
|
|
45
|
+
close(): Promise<void>;
|
|
46
|
+
private request;
|
|
47
|
+
listTools(options?: McpRequestOptions): Promise<McpTools>;
|
|
48
|
+
callTool(name: string, args: Record<string, unknown>, options: McpCallOptions & {
|
|
49
|
+
returnsMessage: true;
|
|
50
|
+
}): Promise<ToolMessage>;
|
|
51
|
+
callTool(name: string, args?: Record<string, unknown>, options?: McpCallOptions): Promise<unknown>;
|
|
52
|
+
/** Explicit selection is required before remote tools are exposed to an agent. */
|
|
53
|
+
agentTools(names: readonly string[], options?: McpRequestOptions): Promise<readonly RegisteredTool[]>;
|
|
54
|
+
}
|
|
55
|
+
export declare class McpToolError extends ToolExecutionError {
|
|
56
|
+
readonly toolName: string;
|
|
57
|
+
readonly response: CallToolResult;
|
|
58
|
+
constructor(toolName: string, response: CallToolResult);
|
|
59
|
+
}
|
|
60
|
+
/** Runtime tool descriptor replaces Python's dynamically generated symbolic class. */
|
|
61
|
+
export declare class McpTool {
|
|
62
|
+
readonly definition: Readonly<ToolDefinition>;
|
|
63
|
+
private readonly inputValidator;
|
|
64
|
+
private readonly outputValidator;
|
|
65
|
+
constructor(definition: ToolDefinition);
|
|
66
|
+
get name(): string;
|
|
67
|
+
inputParameters(args: unknown): Record<string, unknown>;
|
|
68
|
+
validateOutput(result: CallToolResult): void;
|
|
69
|
+
call(args: Record<string, unknown>, session: McpSession, options: McpCallOptions & {
|
|
70
|
+
returnsMessage: true;
|
|
71
|
+
}): Promise<ToolMessage>;
|
|
72
|
+
call(args: Record<string, unknown>, session: McpSession, options?: McpCallOptions): Promise<unknown>;
|
|
73
|
+
asTool(session: McpSession): RegisteredTool;
|
|
74
|
+
static resultToMessage(result: CallToolResult, toolCallId?: string): ToolMessage;
|
|
75
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
|
|
2
|
+
import { CfWorkerJsonSchemaValidator } from '@modelcontextprotocol/client/validators/cf-worker';
|
|
3
|
+
import { abortable, cancellationScope, checkCancelled } from '../cancellation.js';
|
|
4
|
+
import { ToolExecutionError, UnsupportedCapabilityError } from '../errors.js';
|
|
5
|
+
import { Image, Modality, ToolMessage } from '../message.js';
|
|
6
|
+
const validator = new CfWorkerJsonSchemaValidator();
|
|
7
|
+
/** Async equivalent of Python's client; importing core never loads the SDK. */
|
|
8
|
+
export class McpClient {
|
|
9
|
+
options;
|
|
10
|
+
tools;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.options = options;
|
|
13
|
+
}
|
|
14
|
+
static fromUrl(url, options = {}) {
|
|
15
|
+
const endpoint = new URL(url);
|
|
16
|
+
if (!['http:', 'https:'].includes(endpoint.protocol) || endpoint.username || endpoint.password)
|
|
17
|
+
throw new TypeError('Expected an HTTP(S) MCP endpoint without URL credentials.');
|
|
18
|
+
return new McpClient({ transport: () => new StreamableHTTPClientTransport(endpoint, options) });
|
|
19
|
+
}
|
|
20
|
+
session() { return new McpSession(this.options); }
|
|
21
|
+
knownTools() { return this.tools; }
|
|
22
|
+
async listTools(options = {}) {
|
|
23
|
+
checkCancelled(options.signal);
|
|
24
|
+
if (this.tools && !options.refresh)
|
|
25
|
+
return this.tools;
|
|
26
|
+
return this.withSession(async (session) => this.tools = await session.listTools(options), options);
|
|
27
|
+
}
|
|
28
|
+
async withSession(fn, options = {}) {
|
|
29
|
+
const session = this.session();
|
|
30
|
+
await session.connect(options);
|
|
31
|
+
let failed = false;
|
|
32
|
+
try {
|
|
33
|
+
return await fn(session);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
failed = true;
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
if (failed)
|
|
41
|
+
await session.close().catch(() => { });
|
|
42
|
+
else
|
|
43
|
+
await session.close();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** One owned connection. Closed/failed sessions cannot be reopened; create a new session. */
|
|
48
|
+
export class McpSession {
|
|
49
|
+
options;
|
|
50
|
+
sdk;
|
|
51
|
+
transport;
|
|
52
|
+
state = 'new';
|
|
53
|
+
lifetime = new AbortController();
|
|
54
|
+
closing;
|
|
55
|
+
tools;
|
|
56
|
+
constructor(options) {
|
|
57
|
+
this.options = options;
|
|
58
|
+
this.sdk = new Client({ name: options.name ?? 'langfx.js', version: options.version ?? '0.1.0' }, { jsonSchemaValidator: validator });
|
|
59
|
+
// Unexpected closure must preserve SDK errors (including handshake failures).
|
|
60
|
+
// Only explicit close() cancels the lifetime; the SDK rejects pending requests.
|
|
61
|
+
this.sdk.onclose = () => { this.state = 'closed'; };
|
|
62
|
+
}
|
|
63
|
+
async connect(options = {}) {
|
|
64
|
+
if (this.state !== 'new')
|
|
65
|
+
throw new Error('MCP session cannot be re-entered.');
|
|
66
|
+
checkCancelled(options.signal);
|
|
67
|
+
this.state = 'connecting';
|
|
68
|
+
const scope = cancellationScope([options.signal, this.lifetime.signal]);
|
|
69
|
+
try {
|
|
70
|
+
this.transport = this.options.transport();
|
|
71
|
+
await abortable(this.sdk.connect(this.transport, { ...options, signal: scope.signal }), scope.signal);
|
|
72
|
+
checkCancelled(scope.signal);
|
|
73
|
+
this.state = 'open';
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
await this.close().catch(() => { });
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
scope.dispose();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
close() {
|
|
85
|
+
if (this.closing)
|
|
86
|
+
return this.closing;
|
|
87
|
+
this.state = 'closed';
|
|
88
|
+
this.lifetime.abort();
|
|
89
|
+
this.closing = (async () => {
|
|
90
|
+
try {
|
|
91
|
+
if (this.transport instanceof StreamableHTTPClientTransport && this.transport.sessionId)
|
|
92
|
+
await abortable(this.transport.terminateSession(), AbortSignal.timeout(5_000));
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
await this.sdk.close();
|
|
96
|
+
}
|
|
97
|
+
})();
|
|
98
|
+
return this.closing;
|
|
99
|
+
}
|
|
100
|
+
async request(options, fn) {
|
|
101
|
+
if (this.state !== 'open')
|
|
102
|
+
throw new Error('MCP session is not connected.');
|
|
103
|
+
const scope = cancellationScope([options.signal, this.lifetime.signal]);
|
|
104
|
+
try {
|
|
105
|
+
checkCancelled(scope.signal);
|
|
106
|
+
return await abortable(fn({ ...options, signal: scope.signal }), scope.signal);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
checkCancelled(scope.signal);
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
finally {
|
|
113
|
+
scope.dispose();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async listTools(options = {}) {
|
|
117
|
+
return this.request(options, async (request) => {
|
|
118
|
+
const tools = Object.create(null);
|
|
119
|
+
// SDK 2 aggregates pages and enforces its pagination limits internally.
|
|
120
|
+
const result = await this.sdk.listTools({}, { ...request, cacheMode: 'refresh' });
|
|
121
|
+
for (const definition of result.tools) {
|
|
122
|
+
if (Object.hasOwn(tools, definition.name))
|
|
123
|
+
throw new Error(`Duplicate MCP tool: ${definition.name}`);
|
|
124
|
+
tools[definition.name] = new McpTool(definition);
|
|
125
|
+
}
|
|
126
|
+
this.tools = Object.freeze(tools);
|
|
127
|
+
return this.tools;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
async callTool(name, args = {}, options = {}) {
|
|
131
|
+
if (!this.tools)
|
|
132
|
+
await this.listTools(options);
|
|
133
|
+
const tool = this.tools[name];
|
|
134
|
+
if (!tool)
|
|
135
|
+
throw new ToolExecutionError(`Unknown MCP tool: ${name}`);
|
|
136
|
+
const input = tool.inputParameters(args);
|
|
137
|
+
return this.request(options, async (request) => {
|
|
138
|
+
const result = await this.sdk.callTool({ name, arguments: input }, request);
|
|
139
|
+
if (result.isError)
|
|
140
|
+
throw new McpToolError(name, result);
|
|
141
|
+
tool.validateOutput(result);
|
|
142
|
+
const message = McpTool.resultToMessage(result, options.toolCallId ?? name);
|
|
143
|
+
if (options.returnsMessage)
|
|
144
|
+
return message;
|
|
145
|
+
if (hasResult(result.structuredContent))
|
|
146
|
+
return result.structuredContent.result;
|
|
147
|
+
if (message.parts.some(part => part instanceof Modality))
|
|
148
|
+
return message;
|
|
149
|
+
return message.text;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/** Explicit selection is required before remote tools are exposed to an agent. */
|
|
153
|
+
async agentTools(names, options = {}) {
|
|
154
|
+
const tools = await this.listTools(options);
|
|
155
|
+
if (new Set(names).size !== names.length)
|
|
156
|
+
throw new TypeError('Duplicate MCP tool selection.');
|
|
157
|
+
return names.map(name => {
|
|
158
|
+
const tool = tools[name];
|
|
159
|
+
if (!tool)
|
|
160
|
+
throw new ToolExecutionError(`Unknown MCP tool: ${name}`);
|
|
161
|
+
return tool.asTool(this);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
export class McpToolError extends ToolExecutionError {
|
|
166
|
+
toolName;
|
|
167
|
+
response;
|
|
168
|
+
constructor(toolName, response) {
|
|
169
|
+
super(`MCP tool ${toolName} returned an error.`);
|
|
170
|
+
this.toolName = toolName;
|
|
171
|
+
this.response = response;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/** Runtime tool descriptor replaces Python's dynamically generated symbolic class. */
|
|
175
|
+
export class McpTool {
|
|
176
|
+
definition;
|
|
177
|
+
inputValidator;
|
|
178
|
+
outputValidator;
|
|
179
|
+
constructor(definition) {
|
|
180
|
+
this.definition = freezeData(structuredClone(definition));
|
|
181
|
+
this.inputValidator = validator.getValidator(structuredClone(this.definition.inputSchema));
|
|
182
|
+
this.outputValidator = this.definition.outputSchema ? validator.getValidator(structuredClone(this.definition.outputSchema)) : undefined;
|
|
183
|
+
}
|
|
184
|
+
get name() { return this.definition.name; }
|
|
185
|
+
inputParameters(args) {
|
|
186
|
+
assertJson(args);
|
|
187
|
+
const input = structuredClone(args);
|
|
188
|
+
const result = this.inputValidator(input);
|
|
189
|
+
if (!result.valid)
|
|
190
|
+
throw new ToolExecutionError(`Invalid arguments for MCP tool ${this.name}: ${result.errorMessage}`);
|
|
191
|
+
return result.data;
|
|
192
|
+
}
|
|
193
|
+
validateOutput(result) {
|
|
194
|
+
if (!this.outputValidator)
|
|
195
|
+
return;
|
|
196
|
+
if (result.structuredContent === undefined || !this.outputValidator(result.structuredContent).valid)
|
|
197
|
+
throw new ToolExecutionError(`Invalid structured output from MCP tool ${this.name}.`);
|
|
198
|
+
}
|
|
199
|
+
call(args, session, options = {}) { return session.callTool(this.name, args, options); }
|
|
200
|
+
asTool(session) {
|
|
201
|
+
if (!/^[A-Za-z_][A-Za-z0-9_-]{0,63}$/.test(this.name))
|
|
202
|
+
throw new TypeError('MCP tool name is not compatible with provider tool names.');
|
|
203
|
+
return {
|
|
204
|
+
declaration: Object.freeze({ name: this.name, description: this.definition.description ?? '', inputSchema: this.definition.inputSchema }),
|
|
205
|
+
prepare: args => {
|
|
206
|
+
const input = this.inputParameters(args);
|
|
207
|
+
return async (invocation) => {
|
|
208
|
+
const message = await session.callTool(this.name, input, { signal: invocation.signal, returnsMessage: true });
|
|
209
|
+
if (message.parts.some(part => typeof part !== 'string'))
|
|
210
|
+
throw new UnsupportedCapabilityError('Agent MCP tools currently require text/structured output; direct calls preserve media.');
|
|
211
|
+
return message.metadata['structuredContent'] ?? message.text;
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
static resultToMessage(result, toolCallId = '') {
|
|
217
|
+
const parts = [];
|
|
218
|
+
for (const item of result.content) {
|
|
219
|
+
if (parts.length)
|
|
220
|
+
parts.push(' ');
|
|
221
|
+
if (item.type === 'text')
|
|
222
|
+
parts.push(item.text);
|
|
223
|
+
else if (item.type === 'image' || item.type === 'audio') {
|
|
224
|
+
const bytes = Uint8Array.from(atob(item.data), c => c.charCodeAt(0));
|
|
225
|
+
parts.push(item.type === 'image' ? Image.fromBytes(bytes, item.mimeType) : new Modality(item.mimeType, { kind: 'bytes', bytes }));
|
|
226
|
+
}
|
|
227
|
+
else
|
|
228
|
+
throw new UnsupportedCapabilityError(`Unsupported MCP result content: ${item.type}`);
|
|
229
|
+
}
|
|
230
|
+
return new ToolMessage(parts, toolCallId, { result: hasResult(result.structuredContent) ? result.structuredContent.result : undefined, metadata: { structuredContent: result.structuredContent, isError: result.isError ?? false } });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function freezeData(value) {
|
|
234
|
+
if (value && typeof value === 'object') {
|
|
235
|
+
for (const child of Object.values(value))
|
|
236
|
+
freezeData(child);
|
|
237
|
+
Object.freeze(value);
|
|
238
|
+
}
|
|
239
|
+
return value;
|
|
240
|
+
}
|
|
241
|
+
function hasResult(value) {
|
|
242
|
+
return value !== null && typeof value === 'object' && Object.hasOwn(value, 'result');
|
|
243
|
+
}
|
|
244
|
+
function assertJson(value, ancestors = new Set()) {
|
|
245
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean'
|
|
246
|
+
|| typeof value === 'number' && Number.isFinite(value))
|
|
247
|
+
return;
|
|
248
|
+
if (typeof value !== 'object' || ancestors.has(value)
|
|
249
|
+
|| !Array.isArray(value) && ![Object.prototype, null].includes(Object.getPrototypeOf(value))
|
|
250
|
+
|| Object.getOwnPropertySymbols(value).length)
|
|
251
|
+
throw new ToolExecutionError('MCP arguments must be acyclic JSON data.');
|
|
252
|
+
ancestors.add(value);
|
|
253
|
+
for (const child of Array.isArray(value) ? value : Object.values(value))
|
|
254
|
+
assertJson(child, ancestors);
|
|
255
|
+
ancestors.delete(value);
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { McpClient } from './index.js';
|
|
2
|
+
export interface StdioMcpClientOptions {
|
|
3
|
+
readonly cwd?: string;
|
|
4
|
+
/** Explicit additions/overrides to the SDK's minimal inherited environment. */
|
|
5
|
+
readonly env?: Readonly<Record<string, string>>;
|
|
6
|
+
/** stdout is reserved for MCP; server diagnostics inherit stderr by default. */
|
|
7
|
+
readonly stderr?: 'inherit' | 'ignore';
|
|
8
|
+
readonly maxBufferSize?: number;
|
|
9
|
+
}
|
|
10
|
+
/** Node-only MCP client. Each session owns a fresh subprocess; no shell is used. */
|
|
11
|
+
export declare class StdioMcpClient extends McpClient {
|
|
12
|
+
constructor(command: string, args?: readonly string[], options?: StdioMcpClientOptions);
|
|
13
|
+
static fromCommand(command: string, args?: readonly string[], options?: StdioMcpClientOptions): StdioMcpClient;
|
|
14
|
+
}
|
package/dist/mcp/node.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { StdioClientTransport } from '@modelcontextprotocol/client/stdio';
|
|
2
|
+
import { McpClient } from './index.js';
|
|
3
|
+
/** Node-only MCP client. Each session owns a fresh subprocess; no shell is used. */
|
|
4
|
+
export class StdioMcpClient extends McpClient {
|
|
5
|
+
constructor(command, args = [], options = {}) {
|
|
6
|
+
if (!command || command.includes('\0'))
|
|
7
|
+
throw new TypeError('Expected an executable command.');
|
|
8
|
+
if (options.maxBufferSize !== undefined && (!Number.isSafeInteger(options.maxBufferSize) || options.maxBufferSize <= 0)) {
|
|
9
|
+
throw new RangeError('maxBufferSize must be a positive safe integer.');
|
|
10
|
+
}
|
|
11
|
+
if (options.stderr !== undefined && !['inherit', 'ignore'].includes(options.stderr))
|
|
12
|
+
throw new TypeError('stderr must be inherit or ignore.');
|
|
13
|
+
const parameters = { ...options, command, args: [...args], ...(options.env ? { env: { ...options.env } } : {}) };
|
|
14
|
+
super({ transport: () => new StdioClientTransport({ ...parameters, args: [...parameters.args], ...(parameters.env ? { env: { ...parameters.env } } : {}) }) });
|
|
15
|
+
}
|
|
16
|
+
static fromCommand(command, args = [], options = {}) {
|
|
17
|
+
return new StdioMcpClient(command, args, options);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/mcp/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAWvC,oFAAoF;AACpF,MAAM,OAAO,cAAe,SAAQ,SAAS;IAC3C,YAAY,OAAe,EAAE,IAAI,GAAsB,EAAE,EAAE,OAAO,GAA0B,EAAE;QAC5F,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC/F,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,aAAa,IAAI,CAAC,CAAC,EAAE,CAAC;YACxH,MAAM,IAAI,UAAU,CAAC,gDAAgD,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC9I,MAAM,UAAU,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QACjH,KAAK,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACjK,CAAC;IACD,MAAM,CAAC,WAAW,CAAC,OAAe,EAAE,IAAI,GAAsB,EAAE,EAAE,OAAO,GAA0B,EAAE;QACnG,OAAO,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACF"}
|