@ontrails/mcp 1.0.0-beta.10 → 1.0.0-beta.12
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/.turbo/turbo-lint.log +1 -1
- package/CHANGELOG.md +39 -0
- package/README.md +4 -0
- package/dist/blaze.d.ts +5 -2
- package/dist/blaze.d.ts.map +1 -1
- package/dist/blaze.js +2 -0
- package/dist/blaze.js.map +1 -1
- package/dist/build.d.ts +5 -2
- package/dist/build.d.ts.map +1 -1
- package/dist/build.js +11 -2
- package/dist/build.js.map +1 -1
- package/package.json +2 -2
- package/src/__tests__/blaze.test.ts +8 -0
- package/src/__tests__/build.test.ts +40 -1
- package/src/blaze.ts +14 -2
- package/src/build.ts +28 -3
package/.turbo/turbo-lint.log
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# @ontrails/mcp
|
|
2
2
|
|
|
3
|
+
## 1.0.0-beta.12
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Complete trifecta for config, permits, and crumbs (formerly tracks)
|
|
8
|
+
|
|
9
|
+
- **config**: Add `configService`, `config.layer`, `config.trail`, and `config.workspace` trails with full `defineConfig`, `resolve`, `describe`, `explain`, `doctor`, and code generation support
|
|
10
|
+
- **permits**: Add `authService` and `auth.verify` trail for runtime authorization checks
|
|
11
|
+
- **crumbs**: Rename tracks to crumbs; add `crumbsService` and `crumbs.status` trail for structured event tracking
|
|
12
|
+
- **cli**: Fix build flag handling and improve bootstrap scaffolding
|
|
13
|
+
- **testing**: Expand test context helpers and example-based testing utilities
|
|
14
|
+
- **core/mcp/http**: Internal alignment for service and composition updates
|
|
15
|
+
|
|
16
|
+
- Updated dependencies
|
|
17
|
+
- @ontrails/core@1.0.0-beta.12
|
|
18
|
+
|
|
19
|
+
## 1.0.0-beta.11
|
|
20
|
+
|
|
21
|
+
### Patch Changes
|
|
22
|
+
|
|
23
|
+
- Add services as a first-class primitive.
|
|
24
|
+
|
|
25
|
+
Services make infrastructure dependencies declarative, injectable, and governable. Define a service with `service()`, declare it on a trail with `services: [db]`, and access it with `db.from(ctx)` or `ctx.service()`.
|
|
26
|
+
|
|
27
|
+
**Core:** `service()` factory, `ServiceSpec<T>`, `ServiceContext`, singleton resolution in `executeTrail`, in-flight creation dedup, `isService` guard, `findDuplicateServiceId`, topo service discovery and validation, `services` field on trail specs.
|
|
28
|
+
|
|
29
|
+
**Testing:** Auto-resolution of `mock` factories in `testAll`, `testExamples`, `testContracts`, and `testFollows`. Explicit `services` overrides with correct precedence (`explicit > ctx.extensions > auto-mock`). Service mock propagation through follow graphs.
|
|
30
|
+
|
|
31
|
+
**Warden:** `service-declarations` rule validates `db.from(ctx)` and `ctx.service()` usage matches declared `services: [...]`. `service-exists` rule validates declared service IDs resolve in project context. Scope-aware AST walking skips nested function boundaries.
|
|
32
|
+
|
|
33
|
+
**Surfaces:** Service overrides thread through `dispatch` and `blaze` on CLI, MCP, and HTTP.
|
|
34
|
+
|
|
35
|
+
**Introspection:** Survey and surface map outputs include service graph. Topo exposes `.services`, `.getService()`, `.hasService()`, `.listServices()`, `.serviceIds()`, `.serviceCount`.
|
|
36
|
+
|
|
37
|
+
**Docs:** ADR-009 accepted. Unified services guide, updated vocabulary, getting-started, architecture, and package READMEs.
|
|
38
|
+
|
|
39
|
+
- Updated dependencies
|
|
40
|
+
- @ontrails/core@1.0.0-beta.11
|
|
41
|
+
|
|
3
42
|
## 1.0.0-beta.10
|
|
4
43
|
|
|
5
44
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -67,6 +67,10 @@ No manual annotation definitions. The contract is the source of truth.
|
|
|
67
67
|
|
|
68
68
|
Trail IDs become MCP tool names with the app prefix: `entity.show` in app `myapp` becomes `myapp_entity_show`. Dots and hyphens become underscores, everything lowercase.
|
|
69
69
|
|
|
70
|
+
## Service resolution
|
|
71
|
+
|
|
72
|
+
Declared services on each trail are resolved into the context before the implementation runs.
|
|
73
|
+
|
|
70
74
|
## Progress bridge
|
|
71
75
|
|
|
72
76
|
Implementations report progress through `ctx.progress`. On MCP, these bridge to `notifications/progress` when the client sends a `progressToken`:
|
package/dist/blaze.d.ts
CHANGED
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
* ```
|
|
10
10
|
*/
|
|
11
11
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
12
|
-
import type { Layer, Topo,
|
|
12
|
+
import type { Layer, ServiceOverrideMap, Topo, TrailContextInit } from '@ontrails/core';
|
|
13
13
|
import type { McpToolDefinition } from './build.js';
|
|
14
14
|
export interface BlazeMcpOptions {
|
|
15
|
-
|
|
15
|
+
/** Config values for services that declare a `config` schema, keyed by service ID. */
|
|
16
|
+
readonly configValues?: Readonly<Record<string, Record<string, unknown>>> | undefined;
|
|
17
|
+
readonly createContext?: (() => TrailContextInit | Promise<TrailContextInit>) | undefined;
|
|
16
18
|
readonly excludeTrails?: readonly string[] | undefined;
|
|
17
19
|
readonly includeTrails?: readonly string[] | undefined;
|
|
18
20
|
readonly layers?: readonly Layer[] | undefined;
|
|
@@ -21,6 +23,7 @@ export interface BlazeMcpOptions {
|
|
|
21
23
|
readonly version?: string | undefined;
|
|
22
24
|
} | undefined;
|
|
23
25
|
readonly transport?: 'stdio' | undefined;
|
|
26
|
+
readonly services?: ServiceOverrideMap | undefined;
|
|
24
27
|
/** Set to `false` to skip topo validation at startup. Defaults to `true`. */
|
|
25
28
|
readonly validate?: boolean | undefined;
|
|
26
29
|
}
|
package/dist/blaze.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,EACV,KAAK,EACL,kBAAkB,EAClB,IAAI,EACJ,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQpD,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjD,SAAS,CAAC;IACd,QAAQ,CAAC,aAAa,CAAC,EACnB,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,GACpD,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;IACzC,QAAQ,CAAC,QAAQ,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACnD,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACzC;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,CA2Bd,CAAC"}
|
package/dist/blaze.js
CHANGED
|
@@ -89,10 +89,12 @@ export const blaze = async (app, options = {}) => {
|
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
91
|
const toolsResult = buildMcpTools(app, {
|
|
92
|
+
configValues: options.configValues,
|
|
92
93
|
createContext: options.createContext,
|
|
93
94
|
excludeTrails: options.excludeTrails,
|
|
94
95
|
includeTrails: options.includeTrails,
|
|
95
96
|
layers: options.layers,
|
|
97
|
+
services: options.services,
|
|
96
98
|
});
|
|
97
99
|
if (toolsResult.isErr()) {
|
|
98
100
|
throw toolsResult.error;
|
package/dist/blaze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blaze.js","sourceRoot":"","sources":["../src/blaze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"blaze.js","sourceRoot":"","sources":["../src/blaze.ts"],"names":[],"mappings":"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"}
|
package/dist/build.d.ts
CHANGED
|
@@ -6,13 +6,16 @@
|
|
|
6
6
|
* Results to MCP responses.
|
|
7
7
|
*/
|
|
8
8
|
import { Result } from '@ontrails/core';
|
|
9
|
-
import type { Layer, Topo,
|
|
9
|
+
import type { Layer, ServiceOverrideMap, Topo, TrailContextInit } from '@ontrails/core';
|
|
10
10
|
import type { McpAnnotations } from './annotations.js';
|
|
11
11
|
export interface BuildMcpToolsOptions {
|
|
12
|
-
|
|
12
|
+
/** Config values for services that declare a `config` schema, keyed by service ID. */
|
|
13
|
+
readonly configValues?: Readonly<Record<string, Record<string, unknown>>> | undefined;
|
|
14
|
+
readonly createContext?: (() => TrailContextInit | Promise<TrailContextInit>) | undefined;
|
|
13
15
|
readonly excludeTrails?: readonly string[] | undefined;
|
|
14
16
|
readonly includeTrails?: readonly string[] | undefined;
|
|
15
17
|
readonly layers?: readonly Layer[] | undefined;
|
|
18
|
+
readonly services?: ServiceOverrideMap | undefined;
|
|
16
19
|
}
|
|
17
20
|
export interface McpToolDefinition {
|
|
18
21
|
readonly annotations: McpAnnotations | undefined;
|
package/dist/build.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EAMP,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAEV,KAAK,EACL,kBAAkB,EAClB,IAAI,EAEJ,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AASvD,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,QAAQ,CAAC,YAAY,CAAC,EAClB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjD,SAAS,CAAC;IACd,QAAQ,CAAC,aAAa,CAAC,EACnB,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,GACpD,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,QAAQ,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;CACpD;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;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;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;AA8QD,eAAO,MAAM,aAAa,GACxB,KAAK,IAAI,EACT,UAAS,oBAAyB,KACjC,MAAM,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAoBnC,CAAC"}
|
package/dist/build.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* validate input, compose layers, execute the implementation, and map
|
|
6
6
|
* Results to MCP responses.
|
|
7
7
|
*/
|
|
8
|
-
import { Result, ValidationError, executeTrail, isBlobRef, zodToJsonSchema, } from '@ontrails/core';
|
|
8
|
+
import { Result, SURFACE_KEY, ValidationError, executeTrail, isBlobRef, zodToJsonSchema, } from '@ontrails/core';
|
|
9
9
|
import { deriveAnnotations } from './annotations.js';
|
|
10
10
|
import { createMcpProgressCallback } from './progress.js';
|
|
11
11
|
import { deriveToolName } from './tool-name.js';
|
|
@@ -114,12 +114,21 @@ const mcpError = (message) => ({
|
|
|
114
114
|
content: [{ text: message, type: 'text' }],
|
|
115
115
|
isError: true,
|
|
116
116
|
});
|
|
117
|
+
/** Add the MCP surface marker while preserving any existing context extras. */
|
|
118
|
+
const withMcpSurface = (progressCb) => ({
|
|
119
|
+
...(progressCb === undefined ? {} : { progress: progressCb }),
|
|
120
|
+
extensions: {
|
|
121
|
+
[SURFACE_KEY]: 'mcp',
|
|
122
|
+
},
|
|
123
|
+
});
|
|
117
124
|
const createHandler = (t, layers, options) => async (args, extra) => {
|
|
118
125
|
const progressCb = createMcpProgressCallback(extra);
|
|
119
126
|
const result = await executeTrail(t, args, {
|
|
127
|
+
configValues: options.configValues,
|
|
120
128
|
createContext: options.createContext,
|
|
121
|
-
ctx: progressCb
|
|
129
|
+
ctx: withMcpSurface(progressCb),
|
|
122
130
|
layers,
|
|
131
|
+
services: options.services,
|
|
123
132
|
signal: extra.signal,
|
|
124
133
|
});
|
|
125
134
|
if (result.isOk()) {
|
package/dist/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,MAAM,EACN,eAAe,EACf,YAAY,EACZ,SAAS,EACT,eAAe,GAChB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ontrails/mcp",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.12",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./src/index.ts",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"clean": "rm -rf dist *.tsbuildinfo"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@ontrails/core": "^1.0.0-beta.
|
|
17
|
+
"@ontrails/core": "^1.0.0-beta.12"
|
|
18
18
|
},
|
|
19
19
|
"peerDependencies": {
|
|
20
20
|
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
@@ -83,6 +83,14 @@ describe('blaze', () => {
|
|
|
83
83
|
expect(['resolved', 'timeout']).toContain(result);
|
|
84
84
|
});
|
|
85
85
|
|
|
86
|
+
test('BlazeMcpOptions accepts service overrides', () => {
|
|
87
|
+
const opts: Parameters<typeof blaze>[1] = {
|
|
88
|
+
services: {},
|
|
89
|
+
validate: false,
|
|
90
|
+
};
|
|
91
|
+
expect(opts.services).toEqual({});
|
|
92
|
+
});
|
|
93
|
+
|
|
86
94
|
test('createMcpServer registers tools that can be listed', () => {
|
|
87
95
|
const echoTrail = trail('echo', {
|
|
88
96
|
description: 'Echo',
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { describe, expect, test } from 'bun:test';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
Result,
|
|
5
|
+
SURFACE_KEY,
|
|
6
|
+
createBlobRef,
|
|
7
|
+
service,
|
|
8
|
+
trail,
|
|
9
|
+
topo,
|
|
10
|
+
} from '@ontrails/core';
|
|
4
11
|
import type { Layer } from '@ontrails/core';
|
|
5
12
|
import { z } from 'zod';
|
|
6
13
|
|
|
@@ -45,6 +52,13 @@ const exampleTrail = trail('with.examples', {
|
|
|
45
52
|
run: (input) => Result.ok({ greeting: `hello ${input.name}` }),
|
|
46
53
|
});
|
|
47
54
|
|
|
55
|
+
const dbService = service('db.main', {
|
|
56
|
+
create: () =>
|
|
57
|
+
Result.ok({
|
|
58
|
+
source: 'factory',
|
|
59
|
+
}),
|
|
60
|
+
});
|
|
61
|
+
|
|
48
62
|
const noExtra: McpExtra = {};
|
|
49
63
|
|
|
50
64
|
const requireTool = (tools: McpToolDefinition[], name: string) => {
|
|
@@ -290,11 +304,13 @@ describe('buildMcpTools', () => {
|
|
|
290
304
|
|
|
291
305
|
test('custom createContext is used when provided', async () => {
|
|
292
306
|
let contextUsed = false;
|
|
307
|
+
let surfaceUsed = false;
|
|
293
308
|
|
|
294
309
|
const ctxTrail = trail('ctx.check', {
|
|
295
310
|
input: z.object({}),
|
|
296
311
|
run: (_input, ctx) => {
|
|
297
312
|
contextUsed = ctx.extensions?.['custom'] === true;
|
|
313
|
+
surfaceUsed = ctx.extensions?.[SURFACE_KEY] === 'mcp';
|
|
298
314
|
return Result.ok({ ok: true });
|
|
299
315
|
},
|
|
300
316
|
});
|
|
@@ -312,6 +328,29 @@ describe('buildMcpTools', () => {
|
|
|
312
328
|
|
|
313
329
|
await tool.handler({}, noExtra);
|
|
314
330
|
expect(contextUsed).toBe(true);
|
|
331
|
+
expect(surfaceUsed).toBe(true);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
test('service overrides are forwarded to executeTrail', async () => {
|
|
335
|
+
const serviceTrail = trail('service.check', {
|
|
336
|
+
input: z.object({}),
|
|
337
|
+
output: z.object({ source: z.string() }),
|
|
338
|
+
run: (_input, ctx) =>
|
|
339
|
+
Result.ok({ source: dbService.from(ctx).source as string }),
|
|
340
|
+
services: [dbService],
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
const tool = requireOnlyTool(
|
|
344
|
+
buildTools(topo('myapp', { serviceTrail }), {
|
|
345
|
+
services: { 'db.main': { source: 'override' } },
|
|
346
|
+
})
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const result = await tool.handler({}, noExtra);
|
|
350
|
+
expect(result?.isError).toBeUndefined();
|
|
351
|
+
expect(parseJsonContent(result?.content[0])).toEqual({
|
|
352
|
+
source: 'override',
|
|
353
|
+
});
|
|
315
354
|
});
|
|
316
355
|
});
|
|
317
356
|
|
package/src/blaze.ts
CHANGED
|
@@ -14,7 +14,12 @@ import {
|
|
|
14
14
|
CallToolRequestSchema,
|
|
15
15
|
ListToolsRequestSchema,
|
|
16
16
|
} from '@modelcontextprotocol/sdk/types.js';
|
|
17
|
-
import type {
|
|
17
|
+
import type {
|
|
18
|
+
Layer,
|
|
19
|
+
ServiceOverrideMap,
|
|
20
|
+
Topo,
|
|
21
|
+
TrailContextInit,
|
|
22
|
+
} from '@ontrails/core';
|
|
18
23
|
import { validateTopo } from '@ontrails/core';
|
|
19
24
|
|
|
20
25
|
import type { McpToolDefinition } from './build.js';
|
|
@@ -26,8 +31,12 @@ import { connectStdio } from './stdio.js';
|
|
|
26
31
|
// ---------------------------------------------------------------------------
|
|
27
32
|
|
|
28
33
|
export interface BlazeMcpOptions {
|
|
34
|
+
/** Config values for services that declare a `config` schema, keyed by service ID. */
|
|
35
|
+
readonly configValues?:
|
|
36
|
+
| Readonly<Record<string, Record<string, unknown>>>
|
|
37
|
+
| undefined;
|
|
29
38
|
readonly createContext?:
|
|
30
|
-
| (() =>
|
|
39
|
+
| (() => TrailContextInit | Promise<TrailContextInit>)
|
|
31
40
|
| undefined;
|
|
32
41
|
readonly excludeTrails?: readonly string[] | undefined;
|
|
33
42
|
readonly includeTrails?: readonly string[] | undefined;
|
|
@@ -39,6 +48,7 @@ export interface BlazeMcpOptions {
|
|
|
39
48
|
}
|
|
40
49
|
| undefined;
|
|
41
50
|
readonly transport?: 'stdio' | undefined;
|
|
51
|
+
readonly services?: ServiceOverrideMap | undefined;
|
|
42
52
|
/** Set to `false` to skip topo validation at startup. Defaults to `true`. */
|
|
43
53
|
readonly validate?: boolean | undefined;
|
|
44
54
|
}
|
|
@@ -141,10 +151,12 @@ export const blaze = async (
|
|
|
141
151
|
}
|
|
142
152
|
|
|
143
153
|
const toolsResult = buildMcpTools(app, {
|
|
154
|
+
configValues: options.configValues,
|
|
144
155
|
createContext: options.createContext,
|
|
145
156
|
excludeTrails: options.excludeTrails,
|
|
146
157
|
includeTrails: options.includeTrails,
|
|
147
158
|
layers: options.layers,
|
|
159
|
+
services: options.services,
|
|
148
160
|
});
|
|
149
161
|
|
|
150
162
|
if (toolsResult.isErr()) {
|
package/src/build.ts
CHANGED
|
@@ -8,12 +8,20 @@
|
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
Result,
|
|
11
|
+
SURFACE_KEY,
|
|
11
12
|
ValidationError,
|
|
12
13
|
executeTrail,
|
|
13
14
|
isBlobRef,
|
|
14
15
|
zodToJsonSchema,
|
|
15
16
|
} from '@ontrails/core';
|
|
16
|
-
import type {
|
|
17
|
+
import type {
|
|
18
|
+
BlobRef,
|
|
19
|
+
Layer,
|
|
20
|
+
ServiceOverrideMap,
|
|
21
|
+
Topo,
|
|
22
|
+
Trail,
|
|
23
|
+
TrailContextInit,
|
|
24
|
+
} from '@ontrails/core';
|
|
17
25
|
|
|
18
26
|
import type { McpAnnotations } from './annotations.js';
|
|
19
27
|
import { deriveAnnotations } from './annotations.js';
|
|
@@ -25,12 +33,17 @@ import { deriveToolName } from './tool-name.js';
|
|
|
25
33
|
// ---------------------------------------------------------------------------
|
|
26
34
|
|
|
27
35
|
export interface BuildMcpToolsOptions {
|
|
36
|
+
/** Config values for services that declare a `config` schema, keyed by service ID. */
|
|
37
|
+
readonly configValues?:
|
|
38
|
+
| Readonly<Record<string, Record<string, unknown>>>
|
|
39
|
+
| undefined;
|
|
28
40
|
readonly createContext?:
|
|
29
|
-
| (() =>
|
|
41
|
+
| (() => TrailContextInit | Promise<TrailContextInit>)
|
|
30
42
|
| undefined;
|
|
31
43
|
readonly excludeTrails?: readonly string[] | undefined;
|
|
32
44
|
readonly includeTrails?: readonly string[] | undefined;
|
|
33
45
|
readonly layers?: readonly Layer[] | undefined;
|
|
46
|
+
readonly services?: ServiceOverrideMap | undefined;
|
|
34
47
|
}
|
|
35
48
|
|
|
36
49
|
export interface McpToolDefinition {
|
|
@@ -199,6 +212,16 @@ const mcpError = (message: string): McpToolResult => ({
|
|
|
199
212
|
isError: true,
|
|
200
213
|
});
|
|
201
214
|
|
|
215
|
+
/** Add the MCP surface marker while preserving any existing context extras. */
|
|
216
|
+
const withMcpSurface = (
|
|
217
|
+
progressCb: TrailContextInit['progress']
|
|
218
|
+
): Partial<TrailContextInit> => ({
|
|
219
|
+
...(progressCb === undefined ? {} : { progress: progressCb }),
|
|
220
|
+
extensions: {
|
|
221
|
+
[SURFACE_KEY]: 'mcp' as const,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
202
225
|
const createHandler =
|
|
203
226
|
(
|
|
204
227
|
t: Trail<unknown, unknown>,
|
|
@@ -211,9 +234,11 @@ const createHandler =
|
|
|
211
234
|
async (args, extra): Promise<McpToolResult> => {
|
|
212
235
|
const progressCb = createMcpProgressCallback(extra);
|
|
213
236
|
const result = await executeTrail(t, args, {
|
|
237
|
+
configValues: options.configValues,
|
|
214
238
|
createContext: options.createContext,
|
|
215
|
-
ctx: progressCb
|
|
239
|
+
ctx: withMcpSurface(progressCb),
|
|
216
240
|
layers,
|
|
241
|
+
services: options.services,
|
|
217
242
|
signal: extra.signal,
|
|
218
243
|
});
|
|
219
244
|
if (result.isOk()) {
|