@henrylabs/mcp 0.26.0 → 1.1.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 +1 -3
- package/code-tool-paths.cjs +4 -2
- package/code-tool-paths.cjs.map +1 -1
- package/code-tool-paths.d.cts +1 -1
- package/code-tool-paths.d.cts.map +1 -1
- package/code-tool-worker.d.mts.map +1 -1
- package/code-tool-worker.d.ts.map +1 -1
- package/code-tool-worker.js +14 -25
- package/code-tool-worker.js.map +1 -1
- package/code-tool-worker.mjs +14 -25
- package/code-tool-worker.mjs.map +1 -1
- package/code-tool.d.mts.map +1 -1
- package/code-tool.d.ts.map +1 -1
- package/code-tool.js +32 -28
- package/code-tool.js.map +1 -1
- package/code-tool.mjs +23 -16
- package/code-tool.mjs.map +1 -1
- package/docs-search-tool.d.mts +2 -0
- package/docs-search-tool.d.mts.map +1 -1
- package/docs-search-tool.d.ts +2 -0
- package/docs-search-tool.d.ts.map +1 -1
- package/docs-search-tool.js +36 -5
- package/docs-search-tool.js.map +1 -1
- package/docs-search-tool.mjs +35 -5
- package/docs-search-tool.mjs.map +1 -1
- package/http.d.mts.map +1 -1
- package/http.d.ts.map +1 -1
- package/http.js +43 -3
- package/http.js.map +1 -1
- package/http.mjs +43 -3
- package/http.mjs.map +1 -1
- package/instructions.d.mts +4 -1
- package/instructions.d.mts.map +1 -1
- package/instructions.d.ts +4 -1
- package/instructions.d.ts.map +1 -1
- package/instructions.js +30 -25
- package/instructions.js.map +1 -1
- package/instructions.mjs +27 -25
- package/instructions.mjs.map +1 -1
- package/local-docs-search.d.mts +28 -0
- package/local-docs-search.d.mts.map +1 -0
- package/local-docs-search.d.ts +28 -0
- package/local-docs-search.d.ts.map +1 -0
- package/local-docs-search.js +493 -0
- package/local-docs-search.js.map +1 -0
- package/local-docs-search.mjs +453 -0
- package/local-docs-search.mjs.map +1 -0
- package/methods.d.mts.map +1 -1
- package/methods.d.ts.map +1 -1
- package/methods.js +51 -117
- package/methods.js.map +1 -1
- package/methods.mjs +51 -117
- package/methods.mjs.map +1 -1
- package/options.d.mts +3 -0
- package/options.d.mts.map +1 -1
- package/options.d.ts +3 -0
- package/options.d.ts.map +1 -1
- package/options.js +19 -0
- package/options.js.map +1 -1
- package/options.mjs +19 -0
- package/options.mjs.map +1 -1
- package/package.json +20 -6
- package/server.d.mts +5 -1
- package/server.d.mts.map +1 -1
- package/server.d.ts +5 -1
- package/server.d.ts.map +1 -1
- package/server.js +11 -5
- package/server.js.map +1 -1
- package/server.mjs +11 -5
- package/server.mjs.map +1 -1
- package/src/code-tool-paths.cts +3 -1
- package/src/code-tool-worker.ts +14 -25
- package/src/code-tool.ts +30 -22
- package/src/docs-search-tool.ts +58 -11
- package/src/http.ts +46 -3
- package/src/instructions.ts +34 -26
- package/src/local-docs-search.ts +544 -0
- package/src/methods.ts +51 -117
- package/src/options.ts +24 -0
- package/src/server.ts +19 -5
- package/src/stdio.ts +4 -1
- package/src/types.ts +1 -0
- package/stdio.d.mts.map +1 -1
- package/stdio.d.ts.map +1 -1
- package/stdio.js +4 -1
- package/stdio.js.map +1 -1
- package/stdio.mjs +4 -1
- package/stdio.mjs.map +1 -1
- package/types.d.mts +1 -0
- package/types.d.mts.map +1 -1
- package/types.d.ts +1 -0
- package/types.d.ts.map +1 -1
- package/types.js.map +1 -1
- package/types.mjs.map +1 -1
package/options.mjs
CHANGED
|
@@ -25,8 +25,22 @@ export function parseCLIOptions() {
|
|
|
25
25
|
choices: ['stainless-sandbox', 'local'],
|
|
26
26
|
default: 'stainless-sandbox',
|
|
27
27
|
description: "Where to run code execution in code tool; 'stainless-sandbox' will execute code in Stainless-hosted sandboxes whereas 'local' will execute code locally on the MCP server machine.",
|
|
28
|
+
})
|
|
29
|
+
.option('custom-instructions-path', {
|
|
30
|
+
type: 'string',
|
|
31
|
+
description: 'Path to custom instructions for the MCP server',
|
|
28
32
|
})
|
|
29
33
|
.option('debug', { type: 'boolean', description: 'Enable debug logging' })
|
|
34
|
+
.option('docs-dir', {
|
|
35
|
+
type: 'string',
|
|
36
|
+
description: 'Path to a directory of local documentation files (markdown/JSON) to include in local docs search.',
|
|
37
|
+
})
|
|
38
|
+
.option('docs-search-mode', {
|
|
39
|
+
type: 'string',
|
|
40
|
+
choices: ['stainless-api', 'local'],
|
|
41
|
+
default: 'stainless-api',
|
|
42
|
+
description: "Where to search documentation; 'stainless-api' uses the Stainless-hosted search API whereas 'local' uses an in-memory search index built from embedded SDK method data and optional local docs files.",
|
|
43
|
+
})
|
|
30
44
|
.option('log-format', {
|
|
31
45
|
type: 'string',
|
|
32
46
|
choices: ['json', 'pretty'],
|
|
@@ -79,10 +93,13 @@ export function parseCLIOptions() {
|
|
|
79
93
|
...(includeDocsTools !== undefined && { includeDocsTools }),
|
|
80
94
|
debug: !!argv.debug,
|
|
81
95
|
stainlessApiKey: argv.stainlessApiKey,
|
|
96
|
+
docsSearchMode: argv.docsSearchMode,
|
|
97
|
+
docsDir: argv.docsDir,
|
|
82
98
|
codeAllowHttpGets: argv.codeAllowHttpGets,
|
|
83
99
|
codeAllowedMethods: argv.codeAllowedMethods,
|
|
84
100
|
codeBlockedMethods: argv.codeBlockedMethods,
|
|
85
101
|
codeExecutionMode: argv.codeExecutionMode,
|
|
102
|
+
customInstructionsPath: argv.customInstructionsPath,
|
|
86
103
|
transport,
|
|
87
104
|
logFormat,
|
|
88
105
|
port: argv.port,
|
|
@@ -110,6 +127,8 @@ export function parseQueryOptions(defaultOptions, query) {
|
|
|
110
127
|
...(codeTool !== undefined && { includeCodeTool: codeTool }),
|
|
111
128
|
...(docsTools !== undefined && { includeDocsTools: docsTools }),
|
|
112
129
|
codeExecutionMode: defaultOptions.codeExecutionMode,
|
|
130
|
+
docsSearchMode: defaultOptions.docsSearchMode,
|
|
131
|
+
docsDir: defaultOptions.docsDir,
|
|
113
132
|
};
|
|
114
133
|
}
|
|
115
134
|
//# sourceMappingURL=options.mjs.map
|
package/options.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["src/options.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,MAAM,IAAI;OACZ,KAAK,MAAM,OAAO;OAClB,EAAE,OAAO,EAAE,MAAM,eAAe;OAChC,CAAC,MAAM,KAAK;OACZ,EAAE,OAAO,EAAE;
|
|
1
|
+
{"version":3,"file":"options.mjs","sourceRoot":"","sources":["src/options.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@henrylabs/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "The official MCP Server for the Henry SDK API",
|
|
5
|
-
"author": "Henry SDK <
|
|
5
|
+
"author": "Henry SDK <support@henrylabs.ai>",
|
|
6
6
|
"types": "./index.d.ts",
|
|
7
7
|
"main": "./index.js",
|
|
8
8
|
"type": "commonjs",
|
|
@@ -23,18 +23,22 @@
|
|
|
23
23
|
"build": "bash ./build",
|
|
24
24
|
"format": "prettier --write --cache --cache-strategy metadata . !dist",
|
|
25
25
|
"tsn": "ts-node -r tsconfig-paths/register",
|
|
26
|
-
"lint": "eslint
|
|
27
|
-
"fix": "eslint --fix
|
|
26
|
+
"lint": "eslint .",
|
|
27
|
+
"fix": "eslint --fix ."
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@henrylabs/sdk": "^
|
|
30
|
+
"@henrylabs/sdk": "^1.1.2",
|
|
31
|
+
"ajv": "^8.18.0",
|
|
31
32
|
"@cloudflare/cabidela": "^0.2.4",
|
|
32
|
-
"@
|
|
33
|
+
"@hono/node-server": "^1.19.10",
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
35
|
+
"hono": "^4.12.4",
|
|
33
36
|
"@valtown/deno-http-worker": "^0.0.21",
|
|
34
37
|
"cookie-parser": "^1.4.6",
|
|
35
38
|
"cors": "^2.8.5",
|
|
36
39
|
"express": "^5.1.0",
|
|
37
40
|
"fuse.js": "^7.1.0",
|
|
41
|
+
"minisearch": "^7.2.0",
|
|
38
42
|
"jq-web": "https://github.com/stainless-api/jq-web/releases/download/v0.8.8/jq-web.tar.gz",
|
|
39
43
|
"pino": "^10.3.1",
|
|
40
44
|
"pino-http": "^11.0.0",
|
|
@@ -148,6 +152,16 @@
|
|
|
148
152
|
"./instructions.mjs": {
|
|
149
153
|
"default": "./instructions.mjs"
|
|
150
154
|
},
|
|
155
|
+
"./local-docs-search": {
|
|
156
|
+
"import": "./local-docs-search.mjs",
|
|
157
|
+
"require": "./local-docs-search.js"
|
|
158
|
+
},
|
|
159
|
+
"./local-docs-search.js": {
|
|
160
|
+
"default": "./local-docs-search.js"
|
|
161
|
+
},
|
|
162
|
+
"./local-docs-search.mjs": {
|
|
163
|
+
"default": "./local-docs-search.mjs"
|
|
164
|
+
},
|
|
151
165
|
"./logger": {
|
|
152
166
|
"import": "./logger.mjs",
|
|
153
167
|
"require": "./logger.js"
|
package/server.d.mts
CHANGED
|
@@ -3,7 +3,10 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
3
3
|
import { ClientOptions } from '@henrylabs/sdk';
|
|
4
4
|
import { McpOptions } from "./options.mjs";
|
|
5
5
|
import { HandlerFunction, McpRequestContext, ToolCallResult, McpTool } from "./types.mjs";
|
|
6
|
-
export declare const newMcpServer: (stainlessApiKey
|
|
6
|
+
export declare const newMcpServer: ({ stainlessApiKey, customInstructionsPath, }: {
|
|
7
|
+
stainlessApiKey?: string | undefined;
|
|
8
|
+
customInstructionsPath?: string | undefined;
|
|
9
|
+
}) => Promise<McpServer>;
|
|
7
10
|
/**
|
|
8
11
|
* Initializes the provided MCP Server with the given tools and handlers.
|
|
9
12
|
* If not provided, the default client, tools and handlers will be used.
|
|
@@ -13,6 +16,7 @@ export declare function initMcpServer(params: {
|
|
|
13
16
|
clientOptions?: ClientOptions;
|
|
14
17
|
mcpOptions?: McpOptions;
|
|
15
18
|
stainlessApiKey?: string | undefined;
|
|
19
|
+
upstreamClientEnvs?: Record<string, string> | undefined;
|
|
16
20
|
}): Promise<void>;
|
|
17
21
|
/**
|
|
18
22
|
* Selects the tools to include in the MCP Server based on the provided options.
|
package/server.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"OAEO,EAAE,MAAM,EAAE,MAAM,2CAA2C;OAC3D,EAAE,SAAS,EAAE,MAAM,yCAAyC;OAM5D,EAAE,aAAa,EAAE,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"server.d.mts","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"OAEO,EAAE,MAAM,EAAE,MAAM,2CAA2C;OAC3D,EAAE,SAAS,EAAE,MAAM,yCAAyC;OAM5D,EAAE,aAAa,EAAE,MAAM,gBAAgB;OAOvC,EAAE,UAAU,EAAE;OAEd,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE;AAEtE,eAAO,MAAM,YAAY,GAAU,8CAGhC;IACD,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C,uBAUE,CAAC;AAEJ;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACzD,iBAwHA;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE,CAe3D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,UAAU,EACV,IAAI,GACL,EAAE;IACD,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC3C,GAAG,OAAO,CAAC,cAAc,CAAC,CAE1B"}
|
package/server.d.ts
CHANGED
|
@@ -3,7 +3,10 @@ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
|
3
3
|
import { ClientOptions } from '@henrylabs/sdk';
|
|
4
4
|
import { McpOptions } from "./options.js";
|
|
5
5
|
import { HandlerFunction, McpRequestContext, ToolCallResult, McpTool } from "./types.js";
|
|
6
|
-
export declare const newMcpServer: (stainlessApiKey
|
|
6
|
+
export declare const newMcpServer: ({ stainlessApiKey, customInstructionsPath, }: {
|
|
7
|
+
stainlessApiKey?: string | undefined;
|
|
8
|
+
customInstructionsPath?: string | undefined;
|
|
9
|
+
}) => Promise<McpServer>;
|
|
7
10
|
/**
|
|
8
11
|
* Initializes the provided MCP Server with the given tools and handlers.
|
|
9
12
|
* If not provided, the default client, tools and handlers will be used.
|
|
@@ -13,6 +16,7 @@ export declare function initMcpServer(params: {
|
|
|
13
16
|
clientOptions?: ClientOptions;
|
|
14
17
|
mcpOptions?: McpOptions;
|
|
15
18
|
stainlessApiKey?: string | undefined;
|
|
19
|
+
upstreamClientEnvs?: Record<string, string> | undefined;
|
|
16
20
|
}): Promise<void>;
|
|
17
21
|
/**
|
|
18
22
|
* Selects the tools to include in the MCP Server based on the provided options.
|
package/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"OAEO,EAAE,MAAM,EAAE,MAAM,2CAA2C;OAC3D,EAAE,SAAS,EAAE,MAAM,yCAAyC;OAM5D,EAAE,aAAa,EAAE,MAAM,gBAAgB;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"OAEO,EAAE,MAAM,EAAE,MAAM,2CAA2C;OAC3D,EAAE,SAAS,EAAE,MAAM,yCAAyC;OAM5D,EAAE,aAAa,EAAE,MAAM,gBAAgB;OAOvC,EAAE,UAAU,EAAE;OAEd,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,OAAO,EAAE;AAEtE,eAAO,MAAM,YAAY,GAAU,8CAGhC;IACD,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C,uBAUE,CAAC;AAEJ;;;GAGG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACzD,iBAwHA;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,EAAE,CAe3D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,EACnC,OAAO,EACP,UAAU,EACV,IAAI,GACL,EAAE;IACD,OAAO,EAAE,eAAe,CAAC;IACzB,UAAU,EAAE,iBAAiB,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;CAC3C,GAAG,OAAO,CAAC,cAAc,CAAC,CAE1B"}
|
package/server.js
CHANGED
|
@@ -13,14 +13,15 @@ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
|
13
13
|
const sdk_1 = __importDefault(require("@henrylabs/sdk"));
|
|
14
14
|
const code_tool_1 = require("./code-tool.js");
|
|
15
15
|
const docs_search_tool_1 = __importDefault(require("./docs-search-tool.js"));
|
|
16
|
+
const docs_search_tool_2 = require("./docs-search-tool.js");
|
|
17
|
+
const local_docs_search_1 = require("./local-docs-search.js");
|
|
16
18
|
const instructions_1 = require("./instructions.js");
|
|
17
19
|
const methods_1 = require("./methods.js");
|
|
18
|
-
const
|
|
19
|
-
const newMcpServer = async (stainlessApiKey) => new mcp_js_1.McpServer({
|
|
20
|
+
const newMcpServer = async ({ stainlessApiKey, customInstructionsPath, }) => new mcp_js_1.McpServer({
|
|
20
21
|
name: 'henrylabs_sdk_api',
|
|
21
|
-
version: '
|
|
22
|
+
version: '1.1.2',
|
|
22
23
|
}, {
|
|
23
|
-
instructions: await (0, instructions_1.getInstructions)(stainlessApiKey),
|
|
24
|
+
instructions: await (0, instructions_1.getInstructions)({ stainlessApiKey, customInstructionsPath }),
|
|
24
25
|
capabilities: { tools: {}, logging: {} },
|
|
25
26
|
});
|
|
26
27
|
exports.newMcpServer = newMcpServer;
|
|
@@ -42,6 +43,11 @@ async function initMcpServer(params) {
|
|
|
42
43
|
warn: logAtLevel('warning'),
|
|
43
44
|
error: logAtLevel('error'),
|
|
44
45
|
};
|
|
46
|
+
if (params.mcpOptions?.docsSearchMode === 'local') {
|
|
47
|
+
const docsDir = params.mcpOptions?.docsDir;
|
|
48
|
+
const localSearch = await local_docs_search_1.LocalDocsSearch.create(docsDir ? { docsDir } : undefined);
|
|
49
|
+
(0, docs_search_tool_2.setLocalSearch)(localSearch);
|
|
50
|
+
}
|
|
45
51
|
let _client;
|
|
46
52
|
let _clientError;
|
|
47
53
|
let _logLevel;
|
|
@@ -51,7 +57,6 @@ async function initMcpServer(params) {
|
|
|
51
57
|
if (!_client) {
|
|
52
58
|
try {
|
|
53
59
|
_client = new sdk_1.default({
|
|
54
|
-
...{ environment: ((0, util_1.readEnv)('HENRY_SDK_ENVIRONMENT') || undefined) },
|
|
55
60
|
logger,
|
|
56
61
|
...params.clientOptions,
|
|
57
62
|
defaultHeaders: {
|
|
@@ -103,6 +108,7 @@ async function initMcpServer(params) {
|
|
|
103
108
|
reqContext: {
|
|
104
109
|
client,
|
|
105
110
|
stainlessApiKey: params.stainlessApiKey ?? params.mcpOptions?.stainlessApiKey,
|
|
111
|
+
upstreamClientEnvs: params.upstreamClientEnvs,
|
|
106
112
|
},
|
|
107
113
|
args,
|
|
108
114
|
});
|
package/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;;;;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"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"}
|
package/server.mjs
CHANGED
|
@@ -4,14 +4,15 @@ import { CallToolRequestSchema, ListToolsRequestSchema, SetLevelRequestSchema, }
|
|
|
4
4
|
import HenrySDK from '@henrylabs/sdk';
|
|
5
5
|
import { codeTool } from "./code-tool.mjs";
|
|
6
6
|
import docsSearchTool from "./docs-search-tool.mjs";
|
|
7
|
+
import { setLocalSearch } from "./docs-search-tool.mjs";
|
|
8
|
+
import { LocalDocsSearch } from "./local-docs-search.mjs";
|
|
7
9
|
import { getInstructions } from "./instructions.mjs";
|
|
8
10
|
import { blockedMethodsForCodeTool } from "./methods.mjs";
|
|
9
|
-
|
|
10
|
-
export const newMcpServer = async (stainlessApiKey) => new McpServer({
|
|
11
|
+
export const newMcpServer = async ({ stainlessApiKey, customInstructionsPath, }) => new McpServer({
|
|
11
12
|
name: 'henrylabs_sdk_api',
|
|
12
|
-
version: '
|
|
13
|
+
version: '1.1.2',
|
|
13
14
|
}, {
|
|
14
|
-
instructions: await getInstructions(stainlessApiKey),
|
|
15
|
+
instructions: await getInstructions({ stainlessApiKey, customInstructionsPath }),
|
|
15
16
|
capabilities: { tools: {}, logging: {} },
|
|
16
17
|
});
|
|
17
18
|
/**
|
|
@@ -32,6 +33,11 @@ export async function initMcpServer(params) {
|
|
|
32
33
|
warn: logAtLevel('warning'),
|
|
33
34
|
error: logAtLevel('error'),
|
|
34
35
|
};
|
|
36
|
+
if (params.mcpOptions?.docsSearchMode === 'local') {
|
|
37
|
+
const docsDir = params.mcpOptions?.docsDir;
|
|
38
|
+
const localSearch = await LocalDocsSearch.create(docsDir ? { docsDir } : undefined);
|
|
39
|
+
setLocalSearch(localSearch);
|
|
40
|
+
}
|
|
35
41
|
let _client;
|
|
36
42
|
let _clientError;
|
|
37
43
|
let _logLevel;
|
|
@@ -41,7 +47,6 @@ export async function initMcpServer(params) {
|
|
|
41
47
|
if (!_client) {
|
|
42
48
|
try {
|
|
43
49
|
_client = new HenrySDK({
|
|
44
|
-
...{ environment: (readEnv('HENRY_SDK_ENVIRONMENT') || undefined) },
|
|
45
50
|
logger,
|
|
46
51
|
...params.clientOptions,
|
|
47
52
|
defaultHeaders: {
|
|
@@ -93,6 +98,7 @@ export async function initMcpServer(params) {
|
|
|
93
98
|
reqContext: {
|
|
94
99
|
client,
|
|
95
100
|
stainlessApiKey: params.stainlessApiKey ?? params.mcpOptions?.stainlessApiKey,
|
|
101
|
+
upstreamClientEnvs: params.upstreamClientEnvs,
|
|
96
102
|
},
|
|
97
103
|
args,
|
|
98
104
|
});
|
package/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAG/E,EAAE,SAAS,EAAE,MAAM,yCAAyC;OAC5D,EACL,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,oCAAoC;OAEpC,QAAQ,MAAM,gBAAgB;OAC9B,EAAE,QAAQ,EAAE;OACZ,cAAc;OACd,EAAE,eAAe,EAAE;
|
|
1
|
+
{"version":3,"file":"server.mjs","sourceRoot":"","sources":["src/server.ts"],"names":[],"mappings":"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"}
|
package/src/code-tool-paths.cts
CHANGED
package/src/code-tool-worker.ts
CHANGED
|
@@ -104,33 +104,22 @@ function getTSDiagnostics(code: string): string[] {
|
|
|
104
104
|
|
|
105
105
|
const fuse = new Fuse(
|
|
106
106
|
[
|
|
107
|
-
'client.products.
|
|
108
|
-
'client.products.
|
|
107
|
+
'client.products.details',
|
|
108
|
+
'client.products.pollDetails',
|
|
109
|
+
'client.products.pollSearch',
|
|
109
110
|
'client.products.search',
|
|
110
|
-
'client.
|
|
111
|
-
'client.
|
|
112
|
-
'client.
|
|
113
|
-
'client.
|
|
114
|
-
'client.cart.
|
|
115
|
-
'client.cart.
|
|
116
|
-
'client.cart.
|
|
117
|
-
'client.cart.
|
|
118
|
-
'client.cart.
|
|
111
|
+
'client.cart.create',
|
|
112
|
+
'client.cart.delete',
|
|
113
|
+
'client.cart.list',
|
|
114
|
+
'client.cart.item.add',
|
|
115
|
+
'client.cart.item.remove',
|
|
116
|
+
'client.cart.item.update',
|
|
117
|
+
'client.cart.checkout.details',
|
|
118
|
+
'client.cart.checkout.pollDetails',
|
|
119
|
+
'client.cart.checkout.pollPurchase',
|
|
120
|
+
'client.cart.checkout.purchase',
|
|
119
121
|
'client.orders.list',
|
|
120
|
-
'client.
|
|
121
|
-
'client.wallet.createCardCollection',
|
|
122
|
-
'client.merchants.checkStatus',
|
|
123
|
-
'client.merchants.listSupported',
|
|
124
|
-
'client.checkout.createSingleProductToken',
|
|
125
|
-
'client.checkout.session.confirmCheckout',
|
|
126
|
-
'client.checkout.session.createQuote',
|
|
127
|
-
'client.checkout.session.listProducts',
|
|
128
|
-
'client.checkout.session.retrieveShippingInfo',
|
|
129
|
-
'client.checkout.guest.addresses.create',
|
|
130
|
-
'client.checkout.guest.addresses.delete',
|
|
131
|
-
'client.checkout.guest.addresses.list',
|
|
132
|
-
'client.checkout.guest.addresses.setDefault',
|
|
133
|
-
'client.checkout.guest.addresses.update',
|
|
122
|
+
'client.merchants.list',
|
|
134
123
|
],
|
|
135
124
|
{ threshold: 1, shouldSort: true },
|
|
136
125
|
);
|
package/src/code-tool.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
2
2
|
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import url from 'node:url';
|
|
6
|
-
import { newDenoHTTPWorker } from '@valtown/deno-http-worker';
|
|
7
|
-
import { workerPath } from './code-tool-paths.cjs';
|
|
8
3
|
import {
|
|
9
4
|
ContentBlock,
|
|
10
5
|
McpRequestContext,
|
|
@@ -30,9 +25,9 @@ For example:
|
|
|
30
25
|
|
|
31
26
|
\`\`\`
|
|
32
27
|
async function run(client) {
|
|
33
|
-
const response = await client.products.search({ query: '
|
|
28
|
+
const response = await client.products.search({ query: 'Nike Air Max', merchant: 'Nike' });
|
|
34
29
|
|
|
35
|
-
console.log(response.
|
|
30
|
+
console.log(response.refId);
|
|
36
31
|
}
|
|
37
32
|
\`\`\`
|
|
38
33
|
|
|
@@ -149,28 +144,29 @@ const remoteStainlessHandler = async ({
|
|
|
149
144
|
|
|
150
145
|
const codeModeEndpoint = readEnv('CODE_MODE_ENDPOINT_URL') ?? 'https://api.stainless.com/api/ai/code-tool';
|
|
151
146
|
|
|
147
|
+
const localClientEnvs = {
|
|
148
|
+
HENRY_SDK_API_KEY: requireValue(
|
|
149
|
+
readEnv('HENRY_SDK_API_KEY') ?? client.apiKey,
|
|
150
|
+
'set HENRY_SDK_API_KEY environment variable or provide apiKey client option',
|
|
151
|
+
),
|
|
152
|
+
HENRY_SDK_BASE_URL: readEnv('HENRY_SDK_BASE_URL') ?? client.baseURL ?? undefined,
|
|
153
|
+
};
|
|
154
|
+
// Merge any upstream client envs from the request header, with upstream values taking precedence.
|
|
155
|
+
const mergedClientEnvs = { ...localClientEnvs, ...reqContext.upstreamClientEnvs };
|
|
156
|
+
|
|
152
157
|
// Setting a Stainless API key authenticates requests to the code tool endpoint.
|
|
153
158
|
const res = await fetch(codeModeEndpoint, {
|
|
154
159
|
method: 'POST',
|
|
155
160
|
headers: {
|
|
156
161
|
...(reqContext.stainlessApiKey && { Authorization: reqContext.stainlessApiKey }),
|
|
157
162
|
'Content-Type': 'application/json',
|
|
158
|
-
'x-stainless-mcp-client-envs': JSON.stringify(
|
|
159
|
-
HENRY_SDK_API_KEY: requireValue(
|
|
160
|
-
readEnv('HENRY_SDK_API_KEY') ?? client.apiKey,
|
|
161
|
-
'set HENRY_SDK_API_KEY environment variable or provide apiKey client option',
|
|
162
|
-
),
|
|
163
|
-
HENRY_SDK_BASE_URL:
|
|
164
|
-
readEnv('HENRY_SDK_BASE_URL') ?? readEnv('HENRY_SDK_ENVIRONMENT') ?
|
|
165
|
-
undefined
|
|
166
|
-
: client.baseURL ?? undefined,
|
|
167
|
-
}),
|
|
163
|
+
'x-stainless-mcp-client-envs': JSON.stringify(mergedClientEnvs),
|
|
168
164
|
},
|
|
169
165
|
body: JSON.stringify({
|
|
170
166
|
project_name: 'henry-sdk',
|
|
171
167
|
code,
|
|
172
168
|
intent,
|
|
173
|
-
client_opts: {
|
|
169
|
+
client_opts: {},
|
|
174
170
|
} satisfies WorkerInput),
|
|
175
171
|
});
|
|
176
172
|
|
|
@@ -207,6 +203,13 @@ const localDenoHandler = async ({
|
|
|
207
203
|
reqContext: McpRequestContext;
|
|
208
204
|
args: unknown;
|
|
209
205
|
}): Promise<ToolCallResult> => {
|
|
206
|
+
const fs = await import('node:fs');
|
|
207
|
+
const path = await import('node:path');
|
|
208
|
+
const url = await import('node:url');
|
|
209
|
+
const { newDenoHTTPWorker } = await import('@valtown/deno-http-worker');
|
|
210
|
+
const { getWorkerPath } = await import('./code-tool-paths.cjs');
|
|
211
|
+
const workerPath = getWorkerPath();
|
|
212
|
+
|
|
210
213
|
const client = reqContext.client;
|
|
211
214
|
const baseURLHostname = new URL(client.baseURL).hostname;
|
|
212
215
|
const { code } = args as { code: string };
|
|
@@ -268,6 +271,9 @@ const localDenoHandler = async ({
|
|
|
268
271
|
printOutput: true,
|
|
269
272
|
spawnOptions: {
|
|
270
273
|
cwd: path.dirname(workerPath),
|
|
274
|
+
// Merge any upstream client envs into the Deno subprocess environment,
|
|
275
|
+
// with the upstream env vars taking precedence.
|
|
276
|
+
env: { ...process.env, ...reqContext.upstreamClientEnvs },
|
|
271
277
|
},
|
|
272
278
|
});
|
|
273
279
|
|
|
@@ -277,13 +283,15 @@ const localDenoHandler = async ({
|
|
|
277
283
|
reject(new Error(`Worker exited with code ${exitCode}`));
|
|
278
284
|
});
|
|
279
285
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
286
|
+
// Strip null/undefined values so that the worker SDK client can fall back to
|
|
287
|
+
// reading from environment variables (including any upstreamClientEnvs).
|
|
288
|
+
const opts = {
|
|
289
|
+
...(client.baseURL != null ? { baseURL: client.baseURL } : undefined),
|
|
290
|
+
...(client.apiKey != null ? { apiKey: client.apiKey } : undefined),
|
|
283
291
|
defaultHeaders: {
|
|
284
292
|
'X-Stainless-MCP': 'true',
|
|
285
293
|
},
|
|
286
|
-
};
|
|
294
|
+
} satisfies Partial<ClientOptions> as ClientOptions;
|
|
287
295
|
|
|
288
296
|
const req = worker.request(
|
|
289
297
|
'http://localhost',
|
package/src/docs-search-tool.ts
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
import { Metadata, McpRequestContext, asTextContentResult } from './types';
|
|
5
5
|
import { getLogger } from './logger';
|
|
6
|
+
import type { LocalDocsSearch } from './local-docs-search';
|
|
6
7
|
|
|
7
8
|
export const metadata: Metadata = {
|
|
8
9
|
resource: 'all',
|
|
@@ -13,7 +14,8 @@ export const metadata: Metadata = {
|
|
|
13
14
|
|
|
14
15
|
export const tool: Tool = {
|
|
15
16
|
name: 'search_docs',
|
|
16
|
-
description:
|
|
17
|
+
description:
|
|
18
|
+
'Search SDK documentation to find methods, parameters, and usage examples for interacting with the API. Use this before writing code when you need to discover the right approach.',
|
|
17
19
|
inputSchema: {
|
|
18
20
|
type: 'object',
|
|
19
21
|
properties: {
|
|
@@ -42,20 +44,49 @@ export const tool: Tool = {
|
|
|
42
44
|
const docsSearchURL =
|
|
43
45
|
process.env['DOCS_SEARCH_URL'] || 'https://api.stainless.com/api/projects/henry-sdk/docs/search';
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
47
|
+
let _localSearch: LocalDocsSearch | undefined;
|
|
48
|
+
|
|
49
|
+
export function setLocalSearch(search: LocalDocsSearch): void {
|
|
50
|
+
_localSearch = search;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const SUPPORTED_LANGUAGES = new Set(['http', 'typescript', 'javascript']);
|
|
54
|
+
|
|
55
|
+
async function searchLocal(args: Record<string, unknown>): Promise<unknown> {
|
|
56
|
+
if (!_localSearch) {
|
|
57
|
+
throw new Error('Local search not initialized');
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const query = (args['query'] as string) ?? '';
|
|
61
|
+
const language = (args['language'] as string) ?? 'typescript';
|
|
62
|
+
const detail = (args['detail'] as string) ?? 'verbose';
|
|
63
|
+
|
|
64
|
+
if (!SUPPORTED_LANGUAGES.has(language)) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`Local docs search only supports HTTP, TypeScript, and JavaScript. Got language="${language}". ` +
|
|
67
|
+
`Use --docs-search-mode stainless-api for other languages, or set language to "http", "typescript", or "javascript".`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return _localSearch.search({
|
|
72
|
+
query,
|
|
73
|
+
language,
|
|
74
|
+
detail,
|
|
75
|
+
maxResults: 10,
|
|
76
|
+
}).results;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function searchRemote(
|
|
80
|
+
args: Record<string, unknown>,
|
|
81
|
+
stainlessApiKey: string | undefined,
|
|
82
|
+
): Promise<unknown> {
|
|
52
83
|
const body = args as any;
|
|
53
84
|
const query = new URLSearchParams(body).toString();
|
|
54
85
|
|
|
55
86
|
const startTime = Date.now();
|
|
56
87
|
const result = await fetch(`${docsSearchURL}?${query}`, {
|
|
57
88
|
headers: {
|
|
58
|
-
...(
|
|
89
|
+
...(stainlessApiKey && { Authorization: stainlessApiKey }),
|
|
59
90
|
},
|
|
60
91
|
});
|
|
61
92
|
|
|
@@ -74,7 +105,7 @@ export const handler = async ({
|
|
|
74
105
|
'Got error response from docs search tool',
|
|
75
106
|
);
|
|
76
107
|
|
|
77
|
-
if (result.status === 404 && !
|
|
108
|
+
if (result.status === 404 && !stainlessApiKey) {
|
|
78
109
|
throw new Error(
|
|
79
110
|
'Could not find docs for this project. You may need to provide a Stainless API key via the STAINLESS_API_KEY environment variable, the --stainless-api-key flag, or the x-stainless-api-key HTTP header.',
|
|
80
111
|
);
|
|
@@ -93,7 +124,23 @@ export const handler = async ({
|
|
|
93
124
|
},
|
|
94
125
|
'Got docs search result',
|
|
95
126
|
);
|
|
96
|
-
return
|
|
127
|
+
return resultBody;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export const handler = async ({
|
|
131
|
+
reqContext,
|
|
132
|
+
args,
|
|
133
|
+
}: {
|
|
134
|
+
reqContext: McpRequestContext;
|
|
135
|
+
args: Record<string, unknown> | undefined;
|
|
136
|
+
}) => {
|
|
137
|
+
const body = args ?? {};
|
|
138
|
+
|
|
139
|
+
if (_localSearch) {
|
|
140
|
+
return asTextContentResult(await searchLocal(body));
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return asTextContentResult(await searchRemote(body, reqContext.stainlessApiKey));
|
|
97
144
|
};
|
|
98
145
|
|
|
99
146
|
export default { metadata, tool, handler };
|