incur 0.3.21 → 0.3.23
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/dist/Cli.d.ts +1 -1
- package/dist/Cli.d.ts.map +1 -1
- package/dist/Cli.js +3 -3
- package/dist/Cli.js.map +1 -1
- package/dist/Mcp.d.ts +16 -4
- package/dist/Mcp.d.ts.map +1 -1
- package/dist/Mcp.js +7 -6
- package/dist/Mcp.js.map +1 -1
- package/dist/Openapi.d.ts.map +1 -1
- package/dist/Openapi.js +2 -2
- package/dist/Openapi.js.map +1 -1
- package/dist/internal/dereference.d.ts +12 -0
- package/dist/internal/dereference.d.ts.map +1 -0
- package/dist/internal/dereference.js +71 -0
- package/dist/internal/dereference.js.map +1 -0
- package/package.json +3 -3
- package/src/Cli.ts +4 -5
- package/src/Mcp.test.ts +16 -0
- package/src/Mcp.ts +15 -9
- package/src/Openapi.ts +2 -2
- package/src/e2e.test.ts +41 -0
- package/src/internal/dereference.test.ts +695 -0
- package/src/internal/dereference.ts +75 -0
package/dist/Mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../src/Mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../src/Mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/Openapi.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Openapi.d.ts","sourceRoot":"","sources":["../src/Openapi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Openapi.d.ts","sourceRoot":"","sources":["../src/Openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,4HAA4H;AAC5H,MAAM,MAAM,WAAW,GAAG;IAAE,KAAK,CAAC,EAAE,EAAE,GAAG,SAAS,CAAA;CAAE,CAAA;AAyBpD,uBAAuB;AACvB,KAAK,YAAY,GAAG,CAAC,GAAG,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElE,+EAA+E;AAC/E,KAAK,gBAAgB,GAAG;IACtB,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAChC,OAAO,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;IACtC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,GAAG,CAAA;CAC3B,CAAA;AAED,0FAA0F;AAC1F,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,WAAW,EACjB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAO,GAC9C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAiExC"}
|
package/dist/Openapi.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { dereference } from '@readme/openapi-parser';
|
|
2
1
|
import { z } from 'zod';
|
|
3
2
|
import * as Fetch from './Fetch.js';
|
|
3
|
+
import { dereference } from './internal/dereference.js';
|
|
4
4
|
/** Generates incur command entries from an OpenAPI spec. Resolves all `$ref` pointers. */
|
|
5
5
|
export async function generateCommands(spec, fetch, options = {}) {
|
|
6
|
-
const resolved =
|
|
6
|
+
const resolved = dereference(structuredClone(spec));
|
|
7
7
|
const commands = new Map();
|
|
8
8
|
const paths = (resolved.paths ?? {});
|
|
9
9
|
for (const [path, methods] of Object.entries(paths)) {
|
package/dist/Openapi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Openapi.js","sourceRoot":"","sources":["../src/Openapi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Openapi.js","sourceRoot":"","sources":["../src/Openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dereferences all local `$ref` pointers in a JSON object (e.g. `{"$ref": "#/components/schemas/User"}`),
|
|
3
|
+
* replacing them inline with the resolved values. Only handles local (`#/...`) references.
|
|
4
|
+
*
|
|
5
|
+
* Handles circular references by caching a mutable placeholder before recursing.
|
|
6
|
+
*
|
|
7
|
+
* Minimal reimplementation of the dereferencing behavior from `@apidevtools/json-schema-ref-parser`
|
|
8
|
+
* (https://github.com/APIDevTools/json-schema-ref-parser). Only supports in-memory, local-pointer
|
|
9
|
+
* resolution — no file/URL resolution, no `$id` scoping.
|
|
10
|
+
*/
|
|
11
|
+
export declare function dereference<value>(root: value): value;
|
|
12
|
+
//# sourceMappingURL=dereference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dereference.d.ts","sourceRoot":"","sources":["../../src/internal/dereference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,CAGrD"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dereferences all local `$ref` pointers in a JSON object (e.g. `{"$ref": "#/components/schemas/User"}`),
|
|
3
|
+
* replacing them inline with the resolved values. Only handles local (`#/...`) references.
|
|
4
|
+
*
|
|
5
|
+
* Handles circular references by caching a mutable placeholder before recursing.
|
|
6
|
+
*
|
|
7
|
+
* Minimal reimplementation of the dereferencing behavior from `@apidevtools/json-schema-ref-parser`
|
|
8
|
+
* (https://github.com/APIDevTools/json-schema-ref-parser). Only supports in-memory, local-pointer
|
|
9
|
+
* resolution — no file/URL resolution, no `$id` scoping.
|
|
10
|
+
*/
|
|
11
|
+
export function dereference(root) {
|
|
12
|
+
const cache = new Map();
|
|
13
|
+
return walk(root, root, cache);
|
|
14
|
+
}
|
|
15
|
+
function walk(node, root, cache) {
|
|
16
|
+
if (Array.isArray(node))
|
|
17
|
+
return node.map((item) => walk(item, root, cache));
|
|
18
|
+
if (typeof node !== 'object' || node === null)
|
|
19
|
+
return node;
|
|
20
|
+
const obj = node;
|
|
21
|
+
// Resolve $ref pointer
|
|
22
|
+
if (typeof obj.$ref === 'string' && obj.$ref.startsWith('#')) {
|
|
23
|
+
const ref = obj.$ref;
|
|
24
|
+
if (cache.has(ref))
|
|
25
|
+
return cache.get(ref);
|
|
26
|
+
const resolved = resolvePointer(root, ref);
|
|
27
|
+
// Non-object targets (primitives, arrays) can't be circular — resolve directly
|
|
28
|
+
if (typeof resolved !== 'object' || resolved === null || Array.isArray(resolved)) {
|
|
29
|
+
const dereferenced = walk(resolved, root, cache);
|
|
30
|
+
cache.set(ref, dereferenced);
|
|
31
|
+
return dereferenced;
|
|
32
|
+
}
|
|
33
|
+
// Use a mutable placeholder so circular refs resolve to the same object.
|
|
34
|
+
// If the walked result is not a plain object (e.g. chained ref to primitive/array),
|
|
35
|
+
// skip the placeholder and cache directly.
|
|
36
|
+
const placeholder = {};
|
|
37
|
+
cache.set(ref, placeholder);
|
|
38
|
+
const dereferenced = walk(resolved, root, cache);
|
|
39
|
+
if (typeof dereferenced !== 'object' || dereferenced === null || Array.isArray(dereferenced)) {
|
|
40
|
+
cache.set(ref, dereferenced);
|
|
41
|
+
return dereferenced;
|
|
42
|
+
}
|
|
43
|
+
Object.assign(placeholder, dereferenced);
|
|
44
|
+
return placeholder;
|
|
45
|
+
}
|
|
46
|
+
const result = {};
|
|
47
|
+
for (const key of Object.keys(obj))
|
|
48
|
+
result[key] = walk(obj[key], root, cache);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
/** Resolves a JSON Pointer (e.g. `#/components/schemas/User`) against a root object. */
|
|
52
|
+
function resolvePointer(root, pointer) {
|
|
53
|
+
// "#" or "#/" → root
|
|
54
|
+
const fragment = pointer.slice(1);
|
|
55
|
+
if (fragment === '' || fragment === '/')
|
|
56
|
+
return root;
|
|
57
|
+
const parts = fragment
|
|
58
|
+
.slice(1)
|
|
59
|
+
.split('/')
|
|
60
|
+
.map((p) => p.replace(/~1/g, '/').replace(/~0/g, '~'));
|
|
61
|
+
let current = root;
|
|
62
|
+
for (const part of parts) {
|
|
63
|
+
if (typeof current !== 'object' || current === null)
|
|
64
|
+
throw new Error(`Cannot resolve $ref "${pointer}": path segment "${part}" not found`);
|
|
65
|
+
current = current[part];
|
|
66
|
+
if (current === undefined)
|
|
67
|
+
throw new Error(`Cannot resolve $ref "${pointer}": "${part}" not found`);
|
|
68
|
+
}
|
|
69
|
+
return current;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=dereference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dereference.js","sourceRoot":"","sources":["../../src/internal/dereference.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "incur",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.3.
|
|
4
|
+
"version": "0.3.23",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"SKILL.md"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@
|
|
18
|
-
"@
|
|
17
|
+
"@cfworker/json-schema": "^4.1.1",
|
|
18
|
+
"@modelcontextprotocol/server": "^2.0.0-alpha.2",
|
|
19
19
|
"@toon-format/toon": "^2.1.0",
|
|
20
20
|
"tokenx": "^1.3.0",
|
|
21
21
|
"yaml": "^2.8.2",
|
package/src/Cli.ts
CHANGED
|
@@ -2,7 +2,7 @@ import * as fs from 'node:fs/promises'
|
|
|
2
2
|
import * as os from 'node:os'
|
|
3
3
|
import * as path from 'node:path'
|
|
4
4
|
import { estimateTokenCount, sliceByTokens } from 'tokenx'
|
|
5
|
-
import
|
|
5
|
+
import { z } from 'zod'
|
|
6
6
|
|
|
7
7
|
import * as Completions from './Completions.js'
|
|
8
8
|
import type { FieldError } from './Errors.js'
|
|
@@ -1539,9 +1539,8 @@ function createMcpHttpHandler(name: string, version: string) {
|
|
|
1539
1539
|
},
|
|
1540
1540
|
): Promise<Response> => {
|
|
1541
1541
|
if (!transport) {
|
|
1542
|
-
const { McpServer } =
|
|
1543
|
-
|
|
1544
|
-
await import('@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js')
|
|
1542
|
+
const { McpServer, WebStandardStreamableHTTPServerTransport } =
|
|
1543
|
+
await import('@modelcontextprotocol/server')
|
|
1545
1544
|
|
|
1546
1545
|
const server = new McpServer({ name, version })
|
|
1547
1546
|
|
|
@@ -1556,7 +1555,7 @@ function createMcpHttpHandler(name: string, version: string) {
|
|
|
1556
1555
|
tool.name,
|
|
1557
1556
|
{
|
|
1558
1557
|
...(tool.description ? { description: tool.description } : undefined),
|
|
1559
|
-
...(hasInput ? { inputSchema: mergedShape } : undefined),
|
|
1558
|
+
...(hasInput ? { inputSchema: z.object(mergedShape) } : undefined),
|
|
1560
1559
|
},
|
|
1561
1560
|
async (...callArgs: any[]) => {
|
|
1562
1561
|
const params = hasInput ? (callArgs[0] as Record<string, unknown>) : {}
|
package/src/Mcp.test.ts
CHANGED
|
@@ -103,6 +103,22 @@ describe('Mcp', () => {
|
|
|
103
103
|
expect(res.result.capabilities.tools).toBeDefined()
|
|
104
104
|
})
|
|
105
105
|
|
|
106
|
+
test('initialize with 2025-03-26 protocol version', async () => {
|
|
107
|
+
const [res] = await mcpSession(createTestCommands(), [
|
|
108
|
+
{
|
|
109
|
+
id: 1,
|
|
110
|
+
method: 'initialize',
|
|
111
|
+
params: {
|
|
112
|
+
protocolVersion: '2025-03-26',
|
|
113
|
+
capabilities: {},
|
|
114
|
+
clientInfo: { name: 'test-client', version: '1.0.0' },
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
])
|
|
118
|
+
expect(res.result.serverInfo).toEqual({ name: 'test-cli', version: '1.0.0' })
|
|
119
|
+
expect(res.result.capabilities.tools).toBeDefined()
|
|
120
|
+
})
|
|
121
|
+
|
|
106
122
|
test('tools/list returns all leaf commands as tools', async () => {
|
|
107
123
|
const [, res] = await mcpSession(createTestCommands(), [
|
|
108
124
|
{ id: 1, method: 'initialize', params: initParams },
|
package/src/Mcp.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { McpServer } from '@modelcontextprotocol/
|
|
2
|
-
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
|
|
1
|
+
import { McpServer, StdioServerTransport } from '@modelcontextprotocol/server'
|
|
3
2
|
import type { Readable, Writable } from 'node:stream'
|
|
4
|
-
import
|
|
3
|
+
import { z } from 'zod'
|
|
5
4
|
|
|
6
5
|
import * as Command from './internal/command.js'
|
|
7
6
|
import type { Handler as MiddlewareHandler } from './middleware.js'
|
|
@@ -27,7 +26,7 @@ export async function serve(
|
|
|
27
26
|
tool.name,
|
|
28
27
|
{
|
|
29
28
|
...(tool.description ? { description: tool.description } : undefined),
|
|
30
|
-
...(hasInput ? { inputSchema: mergedShape } : undefined),
|
|
29
|
+
...(hasInput ? { inputSchema: z.object(mergedShape) } : undefined),
|
|
31
30
|
...(tool.outputSchema ? { outputSchema: tool.outputSchema } : undefined),
|
|
32
31
|
} as never,
|
|
33
32
|
async (...callArgs: any[]) => {
|
|
@@ -36,6 +35,7 @@ export async function serve(
|
|
|
36
35
|
const extra = hasInput ? callArgs[1] : callArgs[0]
|
|
37
36
|
return callTool(tool, params, {
|
|
38
37
|
extra,
|
|
38
|
+
sendNotification: (n) => server.server.notification(n),
|
|
39
39
|
name,
|
|
40
40
|
version,
|
|
41
41
|
middlewares: options.middlewares,
|
|
@@ -76,9 +76,9 @@ export async function callTool(
|
|
|
76
76
|
params: Record<string, unknown>,
|
|
77
77
|
options: {
|
|
78
78
|
extra?: {
|
|
79
|
-
_meta?: { progressToken?: string | number }
|
|
80
|
-
sendNotification?: (n: any) => Promise<void>
|
|
79
|
+
mcpReq?: { _meta?: { progressToken?: string | number } }
|
|
81
80
|
}
|
|
81
|
+
sendNotification?: (n: ProgressNotification) => Promise<void>
|
|
82
82
|
name?: string | undefined
|
|
83
83
|
version?: string | undefined
|
|
84
84
|
middlewares?: MiddlewareHandler[] | undefined
|
|
@@ -114,13 +114,13 @@ export async function callTool(
|
|
|
114
114
|
if ('stream' in result) {
|
|
115
115
|
// Streaming: send progress notifications per chunk, then return buffered result
|
|
116
116
|
const chunks: unknown[] = []
|
|
117
|
-
const progressToken = options.extra?._meta?.progressToken
|
|
117
|
+
const progressToken = options.extra?.mcpReq?._meta?.progressToken
|
|
118
118
|
let i = 0
|
|
119
119
|
try {
|
|
120
120
|
for await (const chunk of result.stream) {
|
|
121
121
|
chunks.push(chunk)
|
|
122
|
-
if (progressToken !== undefined && options.
|
|
123
|
-
await options.
|
|
122
|
+
if (progressToken !== undefined && options.sendNotification)
|
|
123
|
+
await options.sendNotification({
|
|
124
124
|
method: 'notifications/progress' as const,
|
|
125
125
|
params: { progressToken, progress: ++i, message: JSON.stringify(chunk) },
|
|
126
126
|
})
|
|
@@ -149,6 +149,12 @@ export async function callTool(
|
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
+
/** @internal A progress notification sent during streaming tool calls. */
|
|
153
|
+
type ProgressNotification = {
|
|
154
|
+
method: 'notifications/progress'
|
|
155
|
+
params: { progressToken: string | number; progress: number; message: string }
|
|
156
|
+
}
|
|
157
|
+
|
|
152
158
|
/** @internal A resolved tool entry from the command tree. */
|
|
153
159
|
export type ToolEntry = {
|
|
154
160
|
name: string
|
package/src/Openapi.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { dereference } from '@readme/openapi-parser'
|
|
2
1
|
import { z } from 'zod'
|
|
3
2
|
|
|
4
3
|
import * as Fetch from './Fetch.js'
|
|
4
|
+
import { dereference } from './internal/dereference.js'
|
|
5
5
|
|
|
6
6
|
/** A minimal OpenAPI 3.x spec shape. Accepts both hand-written specs and generated ones (e.g. from `@hono/zod-openapi`). */
|
|
7
7
|
export type OpenAPISpec = { paths?: {} | undefined }
|
|
@@ -46,7 +46,7 @@ export async function generateCommands(
|
|
|
46
46
|
fetch: FetchHandler,
|
|
47
47
|
options: { basePath?: string | undefined } = {},
|
|
48
48
|
): Promise<Map<string, GeneratedCommand>> {
|
|
49
|
-
const resolved =
|
|
49
|
+
const resolved = dereference(structuredClone(spec)) as OpenAPISpec
|
|
50
50
|
const commands = new Map<string, GeneratedCommand>()
|
|
51
51
|
const paths = (resolved.paths ?? {}) as Record<string, Record<string, unknown>>
|
|
52
52
|
|
package/src/e2e.test.ts
CHANGED
|
@@ -2848,6 +2848,47 @@ describe('fetch api', () => {
|
|
|
2848
2848
|
`)
|
|
2849
2849
|
})
|
|
2850
2850
|
|
|
2851
|
+
test('tools/call with no-args command', async () => {
|
|
2852
|
+
const cli = createApp()
|
|
2853
|
+
const sessionId = await initSession(cli)
|
|
2854
|
+
const res = await mcpRequest(
|
|
2855
|
+
cli,
|
|
2856
|
+
{
|
|
2857
|
+
jsonrpc: '2.0',
|
|
2858
|
+
id: 6,
|
|
2859
|
+
method: 'tools/call',
|
|
2860
|
+
params: { name: 'ping', arguments: {} },
|
|
2861
|
+
},
|
|
2862
|
+
sessionId,
|
|
2863
|
+
)
|
|
2864
|
+
expect(res.status).toBe(200)
|
|
2865
|
+
const body = await res.json()
|
|
2866
|
+
expect(JSON.parse(body.result.content[0].text)).toMatchInlineSnapshot(`
|
|
2867
|
+
{
|
|
2868
|
+
"pong": true,
|
|
2869
|
+
}
|
|
2870
|
+
`)
|
|
2871
|
+
})
|
|
2872
|
+
|
|
2873
|
+
test('tools/call with streaming command', async () => {
|
|
2874
|
+
const cli = createApp()
|
|
2875
|
+
const sessionId = await initSession(cli)
|
|
2876
|
+
const res = await mcpRequest(
|
|
2877
|
+
cli,
|
|
2878
|
+
{
|
|
2879
|
+
jsonrpc: '2.0',
|
|
2880
|
+
id: 7,
|
|
2881
|
+
method: 'tools/call',
|
|
2882
|
+
params: { name: 'stream', arguments: {} },
|
|
2883
|
+
},
|
|
2884
|
+
sessionId,
|
|
2885
|
+
)
|
|
2886
|
+
expect(res.status).toBe(200)
|
|
2887
|
+
const body = await res.json()
|
|
2888
|
+
const chunks = JSON.parse(body.result.content[0].text)
|
|
2889
|
+
expect(chunks).toEqual([{ content: 'hello' }, { content: 'world' }])
|
|
2890
|
+
})
|
|
2891
|
+
|
|
2851
2892
|
test('non-/mcp paths still work alongside MCP', async () => {
|
|
2852
2893
|
const cli = createApp()
|
|
2853
2894
|
// Initialize MCP first
|