@ontrails/mcp 1.0.0-beta.2 → 1.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +300 -5
  2. package/README.md +70 -21
  3. package/package.json +11 -3
  4. package/src/annotations.ts +32 -9
  5. package/src/build.ts +1236 -137
  6. package/src/index.ts +31 -4
  7. package/src/progress.ts +22 -0
  8. package/src/resources.ts +228 -0
  9. package/src/stdio.ts +9 -1
  10. package/src/surface.ts +279 -0
  11. package/.turbo/turbo-build.log +0 -1
  12. package/.turbo/turbo-lint.log +0 -3
  13. package/.turbo/turbo-typecheck.log +0 -1
  14. package/dist/annotations.d.ts +0 -19
  15. package/dist/annotations.d.ts.map +0 -1
  16. package/dist/annotations.js +0 -29
  17. package/dist/annotations.js.map +0 -1
  18. package/dist/blaze.d.ts +0 -36
  19. package/dist/blaze.d.ts.map +0 -1
  20. package/dist/blaze.js +0 -96
  21. package/dist/blaze.js.map +0 -1
  22. package/dist/build.d.ts +0 -40
  23. package/dist/build.d.ts.map +0 -1
  24. package/dist/build.js +0 -190
  25. package/dist/build.js.map +0 -1
  26. package/dist/index.d.ts +0 -7
  27. package/dist/index.d.ts.map +0 -1
  28. package/dist/index.js +0 -13
  29. package/dist/index.js.map +0 -1
  30. package/dist/progress.d.ts +0 -13
  31. package/dist/progress.d.ts.map +0 -1
  32. package/dist/progress.js +0 -51
  33. package/dist/progress.js.map +0 -1
  34. package/dist/stdio.d.ts +0 -12
  35. package/dist/stdio.d.ts.map +0 -1
  36. package/dist/stdio.js +0 -15
  37. package/dist/stdio.js.map +0 -1
  38. package/dist/tool-name.d.ts +0 -15
  39. package/dist/tool-name.d.ts.map +0 -1
  40. package/dist/tool-name.js +0 -19
  41. package/dist/tool-name.js.map +0 -1
  42. package/src/__tests__/annotations.test.ts +0 -70
  43. package/src/__tests__/blaze.test.ts +0 -105
  44. package/src/__tests__/build.test.ts +0 -377
  45. package/src/__tests__/progress.test.ts +0 -136
  46. package/src/__tests__/tool-name.test.ts +0 -46
  47. package/src/blaze.ts +0 -146
  48. package/tsconfig.json +0 -9
  49. package/tsconfig.tsbuildinfo +0 -1
package/dist/blaze.d.ts DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * blaze() -- the one-liner MCP server launcher.
3
- *
4
- * Three lines to expose trails as MCP tools:
5
- *
6
- * ```ts
7
- * const app = topo("myapp", entity);
8
- * await blaze(app);
9
- * ```
10
- */
11
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
12
- import type { Layer, Topo, TrailContext } from '@ontrails/core';
13
- import type { McpToolDefinition } from './build.js';
14
- export interface BlazeMcpOptions {
15
- readonly createContext?: (() => TrailContext | Promise<TrailContext>) | undefined;
16
- readonly excludeTrails?: readonly string[] | undefined;
17
- readonly includeTrails?: readonly string[] | undefined;
18
- readonly layers?: readonly Layer[] | undefined;
19
- readonly serverInfo?: {
20
- readonly name?: string | undefined;
21
- readonly version?: string | undefined;
22
- } | undefined;
23
- readonly transport?: 'stdio' | undefined;
24
- }
25
- /**
26
- * Create an MCP Server instance and register all tools.
27
- */
28
- export declare const createMcpServer: (tools: McpToolDefinition[], info: {
29
- readonly name: string;
30
- readonly version: string;
31
- }) => Server;
32
- /**
33
- * Build MCP tools from an App, create a server, and connect via stdio.
34
- */
35
- export declare const blaze: (app: Topo, options?: BlazeMcpOptions) => Promise<void>;
36
- //# sourceMappingURL=blaze.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"blaze.d.ts","sourceRoot":"","sources":["../src/blaze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAKnE,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,CAAC,EACnB,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,GAC5C,SAAS,CAAC;IACd,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,UAAU,CAAC,EAChB;QACE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACvC,GACD,SAAS,CAAC;IACd,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC1C;AAMD;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,OAAO,iBAAiB,EAAE,EAC1B,MAAM;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,KACxD,MAmEF,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,KAAK,GAChB,KAAK,IAAI,EACT,UAAS,eAAoB,KAC5B,OAAO,CAAC,IAAI,CAcd,CAAC"}
package/dist/blaze.js DELETED
@@ -1,96 +0,0 @@
1
- /**
2
- * blaze() -- the one-liner MCP server launcher.
3
- *
4
- * Three lines to expose trails as MCP tools:
5
- *
6
- * ```ts
7
- * const app = topo("myapp", entity);
8
- * await blaze(app);
9
- * ```
10
- */
11
- import { Server } from '@modelcontextprotocol/sdk/server/index.js';
12
- import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
13
- import { buildMcpTools } from './build.js';
14
- import { connectStdio } from './stdio.js';
15
- // ---------------------------------------------------------------------------
16
- // Internal: create MCP server with tool handlers
17
- // ---------------------------------------------------------------------------
18
- /**
19
- * Create an MCP Server instance and register all tools.
20
- */
21
- export const createMcpServer = (tools, info) => {
22
- const server = new Server({ name: info.name, version: info.version }, { capabilities: { tools: {} } });
23
- // Build a lookup map for tool dispatch
24
- const toolMap = new Map();
25
- for (const tool of tools) {
26
- toolMap.set(tool.name, tool);
27
- }
28
- // Register tools/list handler
29
- // oxlint-disable-next-line require-await -- MCP SDK requires async handler
30
- server.setRequestHandler(ListToolsRequestSchema, async () => ({
31
- tools: tools.map((t) => ({
32
- annotations: t.annotations,
33
- description: t.description,
34
- inputSchema: t.inputSchema,
35
- name: t.name,
36
- })),
37
- }));
38
- // Register tools/call handler
39
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
40
- const tool = toolMap.get(request.params.name);
41
- if (tool === undefined) {
42
- return {
43
- content: [
44
- {
45
- text: `Unknown tool: ${request.params.name}`,
46
- type: 'text',
47
- },
48
- ],
49
- isError: true,
50
- };
51
- }
52
- const args = (request.params.arguments ?? {});
53
- const progressToken = request.params._meta?.progressToken;
54
- const sendProgress = progressToken === undefined
55
- ? undefined
56
- : async (current, total) => {
57
- await server.notification({
58
- method: 'notifications/progress',
59
- params: {
60
- progress: current,
61
- progressToken: progressToken,
62
- total,
63
- },
64
- });
65
- };
66
- const extra = {
67
- progressToken,
68
- sendProgress,
69
- signal: undefined,
70
- };
71
- const result = await tool.handler(args, extra);
72
- // Spread to satisfy MCP SDK's index-signature requirement
73
- return { ...result };
74
- });
75
- return server;
76
- };
77
- // ---------------------------------------------------------------------------
78
- // blaze
79
- // ---------------------------------------------------------------------------
80
- /**
81
- * Build MCP tools from an App, create a server, and connect via stdio.
82
- */
83
- export const blaze = async (app, options = {}) => {
84
- const tools = buildMcpTools(app, {
85
- createContext: options.createContext,
86
- excludeTrails: options.excludeTrails,
87
- includeTrails: options.includeTrails,
88
- layers: options.layers,
89
- });
90
- const server = createMcpServer(tools, {
91
- name: options.serverInfo?.name ?? app.name,
92
- version: options.serverInfo?.version ?? '0.1.0',
93
- });
94
- await connectStdio(server);
95
- };
96
- //# sourceMappingURL=blaze.js.map
package/dist/blaze.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"blaze.js","sourceRoot":"","sources":["../src/blaze.ts"],"names":[],"mappings":"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"}
package/dist/build.d.ts DELETED
@@ -1,40 +0,0 @@
1
- /**
2
- * Build MCP tool definitions from a Trails App.
3
- *
4
- * Iterates the topo, generates McpToolDefinition[] with handlers that
5
- * validate input, compose layers, execute the implementation, and map
6
- * Results to MCP responses.
7
- */
8
- import type { Layer, Topo, TrailContext } from '@ontrails/core';
9
- import type { McpAnnotations } from './annotations.js';
10
- export interface BuildMcpToolsOptions {
11
- readonly createContext?: (() => TrailContext | Promise<TrailContext>) | undefined;
12
- readonly excludeTrails?: readonly string[] | undefined;
13
- readonly includeTrails?: readonly string[] | undefined;
14
- readonly layers?: readonly Layer[] | undefined;
15
- }
16
- export interface McpToolDefinition {
17
- readonly annotations: McpAnnotations | undefined;
18
- readonly description: string | undefined;
19
- readonly handler: (args: Record<string, unknown>, extra: McpExtra) => Promise<McpToolResult>;
20
- readonly inputSchema: Record<string, unknown>;
21
- readonly name: string;
22
- }
23
- export interface McpExtra {
24
- readonly progressToken?: string | number | undefined;
25
- readonly sendProgress?: ((current: number, total: number) => Promise<void>) | undefined;
26
- readonly signal?: AbortSignal | undefined;
27
- }
28
- export interface McpToolResult {
29
- readonly content: readonly McpContent[];
30
- readonly isError?: boolean | undefined;
31
- }
32
- export interface McpContent {
33
- readonly data?: string | undefined;
34
- readonly mimeType?: string | undefined;
35
- readonly text?: string | undefined;
36
- readonly type: 'text' | 'image' | 'resource';
37
- readonly uri?: string | undefined;
38
- }
39
- export declare const buildMcpTools: (app: Topo, options?: BuildMcpToolsOptions) => McpToolDefinition[];
40
- //# sourceMappingURL=build.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAS,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EACnB,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,GAC5C,SAAS,CAAC;IACd,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,cAAc,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,CAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,EAAE,QAAQ,KACZ,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,YAAY,CAAC,EAClB,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GACnD,SAAS,CAAC;IACd,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC7C,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AA4OD,eAAO,MAAM,aAAa,GACxB,KAAK,IAAI,EACT,UAAS,oBAAyB,KACjC,iBAAiB,EAiBnB,CAAC"}
package/dist/build.js DELETED
@@ -1,190 +0,0 @@
1
- /**
2
- * Build MCP tool definitions from a Trails App.
3
- *
4
- * Iterates the topo, generates McpToolDefinition[] with handlers that
5
- * validate input, compose layers, execute the implementation, and map
6
- * Results to MCP responses.
7
- */
8
- import { composeLayers, createTrailContext, validateInput, zodToJsonSchema, } from '@ontrails/core';
9
- import { deriveAnnotations } from './annotations.js';
10
- import { createMcpProgressCallback } from './progress.js';
11
- import { deriveToolName } from './tool-name.js';
12
- const isBlobRef = (value) => {
13
- if (typeof value !== 'object' || value === null) {
14
- return false;
15
- }
16
- const obj = value;
17
- return (obj['kind'] === 'blob' &&
18
- obj['data'] instanceof Uint8Array &&
19
- typeof obj['mimeType'] === 'string');
20
- };
21
- const uint8ArrayToBase64 = (bytes) => {
22
- // Use btoa with manual conversion for runtime-agnostic base64
23
- let binary = '';
24
- for (const byte of bytes) {
25
- binary += String.fromCodePoint(byte);
26
- }
27
- return btoa(binary);
28
- };
29
- const blobToContent = (blob) => {
30
- if (blob.mimeType.startsWith('image/')) {
31
- return {
32
- data: uint8ArrayToBase64(blob.data),
33
- mimeType: blob.mimeType,
34
- type: 'image',
35
- };
36
- }
37
- return {
38
- mimeType: blob.mimeType,
39
- type: 'resource',
40
- uri: `blob://${blob.name ?? 'unnamed'}`,
41
- };
42
- };
43
- /** Separate blob fields from non-blob fields in an object. */
44
- const separateBlobFields = (obj) => {
45
- const blobContents = [];
46
- const textFields = {};
47
- let hasBlobFields = false;
48
- for (const [key, val] of Object.entries(obj)) {
49
- if (isBlobRef(val)) {
50
- hasBlobFields = true;
51
- blobContents.push(blobToContent(val));
52
- }
53
- else {
54
- textFields[key] = val;
55
- }
56
- }
57
- return { blobContents, hasBlobFields, textFields };
58
- };
59
- /** Serialize a mixed blob/text object to MCP content. */
60
- const serializeMixedObject = (obj) => {
61
- const { blobContents, hasBlobFields, textFields } = separateBlobFields(obj);
62
- if (!hasBlobFields) {
63
- return undefined;
64
- }
65
- if (Object.keys(textFields).length > 0) {
66
- blobContents.unshift({ text: JSON.stringify(textFields), type: 'text' });
67
- }
68
- return blobContents;
69
- };
70
- const serializeOutput = (value) => {
71
- if (isBlobRef(value)) {
72
- return [blobToContent(value)];
73
- }
74
- if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
75
- const mixed = serializeMixedObject(value);
76
- if (mixed) {
77
- return mixed;
78
- }
79
- }
80
- return [{ text: JSON.stringify(value), type: 'text' }];
81
- };
82
- // ---------------------------------------------------------------------------
83
- // Handler factory
84
- // ---------------------------------------------------------------------------
85
- /** Create an error result for MCP responses. */
86
- const mcpError = (message) => ({
87
- content: [{ text: message, type: 'text' }],
88
- isError: true,
89
- });
90
- /** Build a TrailContext from options and MCP extra. */
91
- const buildTrailContext = async (options, extra) => {
92
- const baseContext = options.createContext !== undefined && options.createContext !== null
93
- ? await options.createContext()
94
- : createTrailContext();
95
- const signal = extra.signal ?? baseContext.signal;
96
- const progressCb = createMcpProgressCallback(extra);
97
- return {
98
- ...baseContext,
99
- signal,
100
- ...(progressCb === undefined ? {} : { progress: progressCb }),
101
- };
102
- };
103
- /** Execute a trail and map the result to an MCP response. */
104
- const executeAndMap = async (trail, validatedInput, ctx, layers) => {
105
- const impl = composeLayers([...layers], trail, trail.implementation);
106
- try {
107
- const result = await impl(validatedInput, ctx);
108
- if (result.isOk()) {
109
- return { content: serializeOutput(result.value) };
110
- }
111
- return mcpError(result.error.message);
112
- }
113
- catch (error) {
114
- return mcpError(error instanceof Error ? error.message : String(error));
115
- }
116
- };
117
- const createHandler = (trail, layers, options) => async (args, extra) => {
118
- const validated = validateInput(trail.input, args);
119
- if (validated.isErr()) {
120
- return mcpError(validated.error.message);
121
- }
122
- const ctx = await buildTrailContext(options, extra);
123
- return executeAndMap(trail, validated.value, ctx, layers);
124
- };
125
- // ---------------------------------------------------------------------------
126
- // Builder
127
- // ---------------------------------------------------------------------------
128
- /**
129
- * Build MCP tool definitions from an App's topology.
130
- *
131
- * Each trail in the topo becomes an McpToolDefinition with:
132
- * - A derived tool name (app-prefixed, underscore-delimited)
133
- * - JSON Schema input from zodToJsonSchema
134
- * - MCP annotations from trail markers
135
- * - A handler that validates, composes layers, executes, and maps results
136
- */
137
- /** Check if a trail should be included based on markers and filters. */
138
- const shouldInclude = (trail, options) => {
139
- if (trail.markers?.['internal'] === true) {
140
- return false;
141
- }
142
- if (options.includeTrails !== undefined && options.includeTrails.length > 0) {
143
- return options.includeTrails.includes(trail.id);
144
- }
145
- if (options.excludeTrails !== undefined &&
146
- options.excludeTrails.includes(trail.id)) {
147
- return false;
148
- }
149
- return true;
150
- };
151
- /** Build a description with optional example input appended. */
152
- const buildDescription = (trail) => {
153
- let { description } = trail;
154
- if (description !== undefined &&
155
- trail.examples !== undefined &&
156
- trail.examples.length > 0) {
157
- const [firstExample] = trail.examples;
158
- if (firstExample !== undefined) {
159
- description = `${description}\n\nExample input: ${JSON.stringify(firstExample.input)}`;
160
- }
161
- }
162
- return description;
163
- };
164
- /** Build a single MCP tool definition from a trail. */
165
- const buildToolDefinition = (app, trail, layers, options) => {
166
- const rawAnnotations = deriveAnnotations(trail);
167
- const annotations = Object.keys(rawAnnotations).length > 0 ? rawAnnotations : undefined;
168
- return {
169
- annotations,
170
- description: buildDescription(trail),
171
- handler: createHandler(trail, layers, options),
172
- inputSchema: zodToJsonSchema(trail.input),
173
- name: deriveToolName(app.name, trail.id),
174
- };
175
- };
176
- export const buildMcpTools = (app, options = {}) => {
177
- const layers = options.layers ?? [];
178
- const tools = [];
179
- for (const item of app.list()) {
180
- if (item.kind !== 'trail' && item.kind !== 'hike') {
181
- continue;
182
- }
183
- if (!shouldInclude(item, options)) {
184
- continue;
185
- }
186
- tools.push(buildToolDefinition(app, item, layers, options));
187
- }
188
- return tools;
189
- };
190
- //# sourceMappingURL=build.js.map
package/dist/build.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AA0DhD,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,OAAO,CACL,GAAG,CAAC,MAAM,CAAC,KAAK,MAAM;QACtB,GAAG,CAAC,MAAM,CAAC,YAAY,UAAU;QACjC,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,QAAQ,CACpC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAU,EAAE;IACvD,8DAA8D;IAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAa,EAAc,EAAE;IAClD,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,IAAI,EAAE,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,OAAO;SACd,CAAC;IACJ,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,UAAU,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE;KACxC,CAAC;AACJ,CAAC,CAAC;AAEF,8DAA8D;AAC9D,MAAM,kBAAkB,GAAG,CACzB,GAA4B,EAK5B,EAAE;IACF,MAAM,YAAY,GAAiB,EAAE,CAAC;IACtC,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACnB,aAAa,GAAG,IAAI,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,yDAAyD;AACzD,MAAM,oBAAoB,GAAG,CAC3B,GAA4B,EACO,EAAE;IACrC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,YAAY,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,KAAc,EAAyB,EAAE;IAChE,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAgC,CAAC,CAAC;QACrE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,gDAAgD;AAChD,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAiB,EAAE,CAAC,CAAC;IACpD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI;CACd,CAAC,CAAC;AAEH,uDAAuD;AACvD,MAAM,iBAAiB,GAAG,KAAK,EAC7B,OAA6B,EAC7B,KAAe,EACQ,EAAE;IACzB,MAAM,WAAW,GACf,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,KAAK,IAAI;QACnE,CAAC,CAAC,MAAM,OAAO,CAAC,aAAa,EAAE;QAC/B,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAE3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC;IAClD,MAAM,UAAU,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAEpD,OAAO;QACL,GAAG,WAAW;QACd,MAAM;QACN,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;KAC9D,CAAC;AACJ,CAAC,CAAC;AAEF,6DAA6D;AAC7D,MAAM,aAAa,GAAG,KAAK,EACzB,KAA8B,EAC9B,cAAuB,EACvB,GAAiB,EACjB,MAAwB,EACA,EAAE;IAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,OAAO,EAAE,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,aAAa,GACjB,CACE,KAA8B,EAC9B,MAAwB,EACxB,OAA6B,EAIF,EAAE,CAC/B,KAAK,EAAE,IAAI,EAAE,KAAK,EAA0B,EAAE;IAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEJ,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,wEAAwE;AACxE,MAAM,aAAa,GAAG,CACpB,KAA8B,EAC9B,OAA6B,EACpB,EAAE;IACX,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5E,OAAO,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,IACE,OAAO,CAAC,aAAa,KAAK,SAAS;QACnC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,EACxC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,gEAAgE;AAChE,MAAM,gBAAgB,GAAG,CACvB,KAA8B,EACV,EAAE;IACtB,IAAI,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;IAC5B,IACE,WAAW,KAAK,SAAS;QACzB,KAAK,CAAC,QAAQ,KAAK,SAAS;QAC5B,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EACzB,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;QACtC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,WAAW,GAAG,GAAG,WAAW,sBAAsB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,CAC1B,GAAS,EACT,KAA8B,EAC9B,MAAwB,EACxB,OAA6B,EACV,EAAE;IACrB,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,WAAW,GACf,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO;QACL,WAAW;QACX,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACpC,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC;QAC9C,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC;QACzC,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;KACzC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAS,EACT,UAAgC,EAAE,EACb,EAAE;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAA+B,EAAE,OAAO,CAAC,EAAE,CAAC;YAC7D,SAAS;QACX,CAAC;QACD,KAAK,CAAC,IAAI,CACR,mBAAmB,CAAC,GAAG,EAAE,IAA+B,EAAE,MAAM,EAAE,OAAO,CAAC,CAC3E,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export { buildMcpTools, type BuildMcpToolsOptions, type McpToolDefinition, type McpToolResult, type McpContent, type McpExtra, } from './build.js';
2
- export { deriveToolName } from './tool-name.js';
3
- export { deriveAnnotations, type McpAnnotations } from './annotations.js';
4
- export { createMcpProgressCallback } from './progress.js';
5
- export { blaze, type BlazeMcpOptions } from './blaze.js';
6
- export { connectStdio } from './stdio.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAG1D,OAAO,EAAE,KAAK,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAGzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js DELETED
@@ -1,13 +0,0 @@
1
- // Build
2
- export { buildMcpTools, } from './build.js';
3
- // Tool naming
4
- export { deriveToolName } from './tool-name.js';
5
- // Annotations
6
- export { deriveAnnotations } from './annotations.js';
7
- // Progress
8
- export { createMcpProgressCallback } from './progress.js';
9
- // Blaze
10
- export { blaze } from './blaze.js';
11
- // Transport
12
- export { connectStdio } from './stdio.js';
13
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,OAAO,EACL,aAAa,GAMd,MAAM,YAAY,CAAC;AAEpB,cAAc;AACd,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAuB,MAAM,kBAAkB,CAAC;AAE1E,WAAW;AACX,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,QAAQ;AACR,OAAO,EAAE,KAAK,EAAwB,MAAM,YAAY,CAAC;AAEzD,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Bridge Trails ProgressCallback to MCP sendProgress notifications.
3
- */
4
- import type { ProgressCallback } from '@ontrails/core';
5
- import type { McpExtra } from './build.js';
6
- /**
7
- * Create a ProgressCallback that bridges to MCP's sendProgress.
8
- *
9
- * Returns `undefined` if the MCP client did not provide a progressToken
10
- * (meaning no progress reporting was requested).
11
- */
12
- export declare const createMcpProgressCallback: (extra: McpExtra) => ProgressCallback | undefined;
13
- //# sourceMappingURL=progress.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AA6C3C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,GACpC,OAAO,QAAQ,KACd,gBAAgB,GAAG,SAarB,CAAC"}
package/dist/progress.js DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * Bridge Trails ProgressCallback to MCP sendProgress notifications.
3
- */
4
- /** Fire-and-forget a progress send, swallowing transport errors. */
5
- const fireSend = async (send, current, total) => {
6
- try {
7
- await send(current, total);
8
- }
9
- catch {
10
- /* Transport errors are expected and safe to ignore */
11
- }
12
- };
13
- const handleProgress = (event, send) => {
14
- if (event.current !== undefined && event.total !== undefined) {
15
- fireSend(send, event.current, event.total);
16
- }
17
- else if (event.current !== undefined) {
18
- fireSend(send, event.current, 0);
19
- }
20
- };
21
- const progressHandlers = {
22
- complete: (_event, send) => fireSend(send, 1, 1),
23
- error: () => {
24
- /* No progress notification for errors */
25
- },
26
- progress: handleProgress,
27
- start: (_event, send) => fireSend(send, 0, 1),
28
- };
29
- // ---------------------------------------------------------------------------
30
- // Factory
31
- // ---------------------------------------------------------------------------
32
- /**
33
- * Create a ProgressCallback that bridges to MCP's sendProgress.
34
- *
35
- * Returns `undefined` if the MCP client did not provide a progressToken
36
- * (meaning no progress reporting was requested).
37
- */
38
- export const createMcpProgressCallback = (extra) => {
39
- if (extra.progressToken === undefined || extra.progressToken === null) {
40
- return undefined;
41
- }
42
- if (typeof extra.sendProgress !== 'function') {
43
- return undefined;
44
- }
45
- const send = extra.sendProgress;
46
- return (event) => {
47
- const handler = progressHandlers[event.type];
48
- handler?.(event, send);
49
- };
50
- };
51
- //# sourceMappingURL=progress.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,oEAAoE;AACpE,MAAM,QAAQ,GAAG,KAAK,EACpB,IAAY,EACZ,OAAe,EACf,KAAa,EACE,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAE,IAAY,EAAQ,EAAE;IAClE,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7D,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAGlB;IACF,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAChD,KAAK,EAAE,GAAG,EAAE;QACV,yCAAyC;IAC3C,CAAC;IACD,QAAQ,EAAE,cAAc;IACxB,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;CAC9C,CAAC;AAEF,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,KAAe,EACe,EAAE;IAChC,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,KAAK,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,YAAY,CAAC;IAChC,OAAO,CAAC,KAAoB,EAAQ,EAAE;QACpC,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/dist/stdio.d.ts DELETED
@@ -1,12 +0,0 @@
1
- /**
2
- * Thin wrapper around MCP SDK's StdioServerTransport.
3
- *
4
- * Exists as a separate function so it can be swapped for other transports
5
- * (SSE, streamable HTTP) without changing blaze().
6
- */
7
- import type { Server } from '@modelcontextprotocol/sdk/server/index.js';
8
- /**
9
- * Connect an MCP server to stdio transport.
10
- */
11
- export declare const connectStdio: (server: Server) => Promise<void>;
12
- //# sourceMappingURL=stdio.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGxE;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAG/D,CAAC"}
package/dist/stdio.js DELETED
@@ -1,15 +0,0 @@
1
- /**
2
- * Thin wrapper around MCP SDK's StdioServerTransport.
3
- *
4
- * Exists as a separate function so it can be swapped for other transports
5
- * (SSE, streamable HTTP) without changing blaze().
6
- */
7
- import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
8
- /**
9
- * Connect an MCP server to stdio transport.
10
- */
11
- export const connectStdio = async (server) => {
12
- const transport = new StdioServerTransport();
13
- await server.connect(transport);
14
- };
15
- //# sourceMappingURL=stdio.js.map
package/dist/stdio.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,MAAc,EAAiB,EAAE;IAClE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Derive MCP-safe tool names from app name + trail ID.
3
- *
4
- * MCP tool names must be [a-z0-9_]+. We prefix with the app name,
5
- * replace dots and hyphens with underscores, and lowercase everything.
6
- */
7
- /**
8
- * Convert app name + trail ID to an MCP-safe tool name.
9
- *
10
- * @example
11
- * deriveToolName("myapp", "entity.show") // "myapp_entity_show"
12
- * deriveToolName("dispatch", "patch.search") // "dispatch_patch_search"
13
- */
14
- export declare const deriveToolName: (appName: string, trailId: string) => string;
15
- //# sourceMappingURL=tool-name.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-name.d.ts","sourceRoot":"","sources":["../src/tool-name.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,EAAE,SAAS,MAAM,KAAG,MAIjE,CAAC"}
package/dist/tool-name.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Derive MCP-safe tool names from app name + trail ID.
3
- *
4
- * MCP tool names must be [a-z0-9_]+. We prefix with the app name,
5
- * replace dots and hyphens with underscores, and lowercase everything.
6
- */
7
- /**
8
- * Convert app name + trail ID to an MCP-safe tool name.
9
- *
10
- * @example
11
- * deriveToolName("myapp", "entity.show") // "myapp_entity_show"
12
- * deriveToolName("dispatch", "patch.search") // "dispatch_patch_search"
13
- */
14
- export const deriveToolName = (appName, trailId) => {
15
- const prefix = appName.toLowerCase().replaceAll(/[.-]/g, '_');
16
- const suffix = trailId.toLowerCase().replaceAll(/[.-]/g, '_');
17
- return `${prefix}_${suffix}`;
18
- };
19
- //# sourceMappingURL=tool-name.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-name.js","sourceRoot":"","sources":["../src/tool-name.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAe,EAAE,OAAe,EAAU,EAAE;IACzE,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO,GAAG,MAAM,IAAI,MAAM,EAAE,CAAC;AAC/B,CAAC,CAAC"}
@@ -1,70 +0,0 @@
1
- import { describe, expect, test } from 'bun:test';
2
-
3
- import { deriveAnnotations } from '../annotations.js';
4
-
5
- describe('deriveAnnotations', () => {
6
- test('readOnly trail produces readOnlyHint', () => {
7
- const annotations = deriveAnnotations({ readOnly: true });
8
- expect(annotations.readOnlyHint).toBe(true);
9
- expect(annotations.destructiveHint).toBeUndefined();
10
- expect(annotations.idempotentHint).toBeUndefined();
11
- });
12
-
13
- test('destructive trail produces destructiveHint', () => {
14
- const annotations = deriveAnnotations({ destructive: true });
15
- expect(annotations.destructiveHint).toBe(true);
16
- expect(annotations.readOnlyHint).toBeUndefined();
17
- });
18
-
19
- test('idempotent trail produces idempotentHint', () => {
20
- const annotations = deriveAnnotations({ idempotent: true });
21
- expect(annotations.idempotentHint).toBe(true);
22
- });
23
-
24
- test('multiple markers combine correctly', () => {
25
- const annotations = deriveAnnotations({
26
- idempotent: true,
27
- readOnly: true,
28
- });
29
- expect(annotations.readOnlyHint).toBe(true);
30
- expect(annotations.idempotentHint).toBe(true);
31
- expect(annotations.destructiveHint).toBeUndefined();
32
- });
33
-
34
- test('no markers produces empty annotations', () => {
35
- const annotations = deriveAnnotations({});
36
- expect(annotations.readOnlyHint).toBeUndefined();
37
- expect(annotations.destructiveHint).toBeUndefined();
38
- expect(annotations.idempotentHint).toBeUndefined();
39
- expect(annotations.title).toBeUndefined();
40
- });
41
-
42
- test('description maps to title', () => {
43
- const annotations = deriveAnnotations({
44
- description: 'Show entity details',
45
- });
46
- expect(annotations.title).toBe('Show entity details');
47
- });
48
-
49
- test('all markers plus description', () => {
50
- const annotations = deriveAnnotations({
51
- description: 'A trail',
52
- destructive: true,
53
- idempotent: true,
54
- readOnly: true,
55
- });
56
- expect(annotations.readOnlyHint).toBe(true);
57
- expect(annotations.destructiveHint).toBe(true);
58
- expect(annotations.idempotentHint).toBe(true);
59
- expect(annotations.title).toBe('A trail');
60
- });
61
-
62
- test('false values are not included', () => {
63
- const annotations = deriveAnnotations({
64
- destructive: false,
65
- readOnly: false,
66
- });
67
- expect(annotations.readOnlyHint).toBeUndefined();
68
- expect(annotations.destructiveHint).toBeUndefined();
69
- });
70
- });